ETH Price: $3,389.23 (+1.63%)

Token

Steak (STEAKS)
 

Overview

Max Total Supply

1,337 STEAKS

Holders

868

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 STEAKS
0xcac2eef1ba23fd22f8b00e02736d8ed16b5feb6b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Somethings always cooking in the steakhouse, join & verify on our discord to find out what! 1337 Premium generative cuts of delicious steak made by an experimental attempt at combining Generative Algorithms with Deep Learning. Just steak is a series of 3 projects that build upon each other in experimental ways: cook, prepare, and enjoy your steak exactly the way you love! The contract is optimized for OpenSea, as such, items are free to list on here! With love by 0x1337Beef https://steak.wtf/ https://steak.wtf/discord/ https://twitter.com/0x1337_BEEF

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Steak

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 1200 runs

Other Settings:
istanbul EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-14
*/

// 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/utils/Counters.sol



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// 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/Context.sol



pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/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: @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);
            }
        }
    }
}

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



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

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



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/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/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/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/ERC721Burnable.sol



pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

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



pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: 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));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// 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: contracts/JustSteak.sol


// @author: @0x1337_BEEF

//          B E E F J U S T B E E F J U S T S O M E 1 3 3 7 B E E F
// <pls accept this as my attempt for cool & very hip minmalistic pixel art>

// Feel free to use this project or build upon it - Just mention us if you can!
// The contract has getSteak(), isCooked(), isPrepared(), isEaten() to interface with your future project!
// We'd love to work with you, we're looking for someone to eat us and you're looking for something fun to do
// Should be gas less to list on OpenSea, happy collecting! :D

pragma solidity ^0.8.4;








abstract contract ContextMixin {
    function msgSender() internal view returns (address payable sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
            assembly { sender := and(mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff) }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

contract Initializable {
    bool inited = false;
    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

abstract contract ERC721Tradable is ContextMixin, ERC721Enumerable, NativeMetaTransaction, ERC721URIStorage, Ownable, ERC721Burnable {
    using SafeMath for uint;
    using Counters for Counters.Counter;
    //Has to be the first variable to recieve address
    address proxyRegistryAddress;

    Counters.Counter private _tokenIdCounter;

    //Trying something new, please no DMCA or crap, reachout first thanks!
    string constant ArtLicense = "All rights reserved to token owner";
    address constant publicKey = 0x045BF88F67846F6C06DF5cf4895de431522d2189;

    //Steakonomics 101
    uint public constant maxSteaks = 1337; //Minimum expected owner count = 430
    uint public constant maxReserve = 13; //Dev, Marketing & Community Reserve
    uint public constant steakPrice = 0.15 ether; //Age like milk or silk, time shall tell, oki i kno that no make no sense
    
    //Steakology 200
    uint public cookingEnabled = 0;
    uint public preparingEnabled = 0;
    uint public eatingEnabled = 0;
    uint public burnEnabled = 0;

    //Set after minting is complete so other projects can interface with it
    mapping (uint => string) public steak;

    //Roadmap enablers
    mapping (uint => uint) public cooked;
    mapping (uint => uint) public prepared;
    mapping (uint => uint) public eaten;   

    //Track how many Steaks a Steakling has couped up
    mapping (address => uint) public userMinted;  
    uint public maxMintsPerWallet = 0;

    constructor(string memory _name, string memory _symbol, address _proxyRegistryAddress) ERC721(_name, _symbol) {
        proxyRegistryAddress = _proxyRegistryAddress;
        _initializeEIP712(_name);
    }

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

    function tokenURI(uint256 _tokenId) override(ERC721, ERC721URIStorage) public view returns (string memory) {
        return string(abi.encodePacked(baseTokenURI(), Strings.toString(_tokenId)));
    }

    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator) override public view returns (bool) {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }
        return super.isApprovedForAll(owner, operator);
    }

    /**
     * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
     */
    function _msgSender() internal override view returns (address sender) {
        return ContextMixin.msgSender();
    }

    function mintX(address to, uint amount) private {
        for(uint i = 0; i < amount; i++){
            _tokenIdCounter.increment();
            _safeMint(to, _tokenIdCounter.current());
            userMinted[to] += 1;
        }
    }

    //To ensure only proper Steak.wtf transactions get through for whitelisting purposes
    function mint(uint amount, uint8 v, bytes32 r, bytes32 s, bytes32 salt) public payable {
        uint total = totalSupply();
        address dearestSteakOwner = _msgSender();
        require(maxMintsPerWallet != 0, "Shops closed!");
        require(total + amount <= maxSteaks, "Not that many steaks left!");
        require(userMinted[dearestSteakOwner] + amount <= maxMintsPerWallet, "Leave some for the rest!");
        require(msg.value >= steakPrice.mul(amount), "Not enuf moulah! NGMI");
        require(publicKey == ecrecover(salt, v, r, s), "Unverified");
        mintX(dearestSteakOwner, amount);
    }

    function reserve(address to, uint amount) public onlyOwner {
        require(userMinted[to] + amount <= maxReserve, "Exceeding reserve max!");
        uint total = totalSupply();
        require(total + amount <= maxSteaks, "Not that many steaks left!");
        mintX(to, amount);
    }

    //Token Sale
    function setSaleState(uint stateValue) public onlyOwner {
        require(stateValue < 5, "Capped to 4!");
        maxMintsPerWallet = stateValue;
    }

    function cook(uint tokenId) public {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "Can't cook what's not yours!");
        require(cooked[tokenId] == 0, "Already cooked!");
        require(cookingEnabled == 1, "Cooking expansion not enabled!");
        cooked[tokenId] = 1;
    }
    
    function prepare(uint tokenId)  public {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "Can't prepare what's not yours!");
        require(prepared[tokenId] == 0, "Already prepared!");
        require(preparingEnabled == 1, "Preparing expansion not enabled!");
        prepared[tokenId] = 1;
    }

    function eat(uint tokenId)  public {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "Can't eat what's not yours!");
        require(eaten[tokenId] == 0, "Already eaten!");
        require(eatingEnabled == 1, "Eating expansion not enabled!");
        eaten[tokenId] = 1;
        if (burnEnabled == 1) {
            super._burn(tokenId);
        }
    } 

    //Enable cooking for all, be careful to not burn stuff
    function toggleCooking() public onlyOwner {
        cookingEnabled = flip(cookingEnabled);
    }

    function togglePreparing() public onlyOwner {
        preparingEnabled = flip(preparingEnabled);
    }

    function toggleEating() public onlyOwner {
        eatingEnabled = flip(eatingEnabled);
    }

    function toggleBurning() public onlyOwner {
        burnEnabled = flip(burnEnabled);
    }

    function flip(uint varToFlip) internal pure returns (uint) {
        if (varToFlip == 1) {
            return 0;
        }
        return 1;
    }

    function setSteakDetails (uint[] memory steakIDs, string[] memory steakDeets) public onlyOwner {
        for (uint i = 0; i < steakIDs.length; i++) {
            steak[steakIDs[i]] = steakDeets[i];
        }
    }
    
    function withdrawAll() public onlyOwner {
        uint balance = address(this).balance;
        require(balance > 0, "Address: Zero balance");
        address safetyAddress = 0x86068B3973644D44eFFBd82a098875349610FB21;
        //Hack me once, shame on you!
        (bool success1, ) = safetyAddress.call{value: balance.mul(20).div(100)}("");
        require(success1, "Transfer 1 failiure!");
        //Hack me twice, shame on me!
        (bool success2, ) = msg.sender.call{value: address(this).balance}("");
        require(success2, "Transfer 2 failiure!");
    }

    function _beforeTokenTransfer(address from, address to, uint tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint tokenId) internal override(ERC721, ERC721URIStorage) onlyOwner {
        super._burn(tokenId);
    }

    //VIEWS:

    //This is here for your project to use! Returns name of steak cut
    function getSteak(uint tokenId) public view returns (string memory) {
        return steak[tokenId];
    }
    
    //Same thing with this one! Returns whether or not the steak is cooked
    function isCooked(uint tokenId) public view returns (uint) {
        return cooked[tokenId];
    }
    
    //Also this one! Returns whether the steak has been prepared or not
    function isPrepared(uint tokenId) public view returns (uint) {
        return prepared[tokenId];
    }

    //Your project could have eaten this one! Don't be shy reach out! PFPs enjoying delicious steaks sounds fun!
    function isEaten(uint tokenId) public view returns (uint) {
        return eaten[tokenId];
    }

    //Get all steaks owned by address
    function steaksByOwner(address _owner) public view returns (uint[] memory) {
        uint tokenCount = balanceOf(_owner);
        uint[] memory steakIds = new uint[](tokenCount);
        for (uint i = 0; i < tokenCount; i++) {
            steakIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return steakIds;
    }

    //Get all steaks owned by your lovely address good ser!
    function showMeMyYummies() external view returns (uint[] memory) {
        return steaksByOwner(_msgSender());
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}


contract Steak is ERC721Tradable {
    //address constant OpenSeaProxy = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;


    constructor(address _proxyRegistryAddress) ERC721Tradable("Steak", "STEAKS", _proxyRegistryAddress) { }

    //API to be migrated after minting => IPFS/ARWEAVE
    string public baseTokenURIs = "https://www.steak.wtf/api/metadata/";

    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURIs = baseURI;
    }

    function baseTokenURI() override public view returns (string memory) {
        return baseTokenURIs;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURIs;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"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":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURIs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnEnabled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"cook","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cooked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cookingEnabled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"eat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"eaten","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eatingEnabled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSteak","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isCooked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isEaten","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isPrepared","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSteaks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"prepare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"prepared","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preparingEnabled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserve","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":"uint256","name":"stateValue","type":"uint256"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"steakIDs","type":"uint256[]"},{"internalType":"string[]","name":"steakDeets","type":"string[]"}],"name":"setSteakDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"showMeMyYummies","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"steak","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"steakPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"steaksByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleBurning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleCooking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleEating","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePreparing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600a805460ff1916905560006011819055601281905560138190556014819055601a5560e060405260236080818152906200455b60a03980516200004c91601b916020909101906200030b565b503480156200005a57600080fd5b506040516200457e3803806200457e8339810160408190526200007d91620003b1565b60405180604001604052806005815260200164537465616b60d81b81525060405180604001604052806006815260200165535445414b5360d01b8152508282828160009080519060200190620000d59291906200030b565b508051620000eb9060019060208401906200030b565b50505062000108620001026200013860201b60201c565b62000154565b600f80546001600160a01b0319166001600160a01b0383161790556200012e83620001a6565b5050505062000420565b60006200014f6200020a60201b620027421760201c565b905090565b600e80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a5460ff1615620001ef5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640160405180910390fd5b620001fa8162000269565b50600a805460ff19166001179055565b6000333014156200026357600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620002669050565b50335b90565b6040518060800160405280604f81526020016200450c604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600b55565b8280546200031990620003e3565b90600052602060002090601f0160209004810192826200033d576000855562000388565b82601f106200035857805160ff191683800117855562000388565b8280016001018555821562000388579182015b82811115620003885782518255916020019190600101906200036b565b50620003969291506200039a565b5090565b5b808211156200039657600081556001016200039b565b600060208284031215620003c457600080fd5b81516001600160a01b0381168114620003dc57600080fd5b9392505050565b600181811c90821680620003f857607f821691505b602082108114156200041a57634e487b7160e01b600052602260045260246000fd5b50919050565b6140dc80620004306000396000f3fe60806040526004361061038c5760003560e01c80635b16c4d7116101dc578063c1f5802511610102578063dc908913116100a0578063ebebfc8b1161006f578063ebebfc8b14610a74578063f2fde38b14610a94578063f3b3a9fa14610ab4578063f516a2e614610ac957600080fd5b8063dc908913146109fc578063dea43ab814610a29578063e4b52ef914610a3e578063e985e9c514610a5457600080fd5b8063cc148a6a116100dc578063cc148a6a14610991578063cc47a40b146109a7578063d547cfb7146109c7578063daefd9c8146109dc57600080fd5b8063c1f5802514610931578063c87b56dd14610951578063cb5774801461097157600080fd5b806385e0ebaf1161017a578063b147f53a11610149578063b147f53a146108bb578063b88d4fde146108d1578063b9fd3d1f146108f1578063baba12a31461091e57600080fd5b806385e0ebaf146108485780638da5cb5b1461086857806395d89b4114610886578063a22cb4651461089b57600080fd5b806370a08231116101b657806370a08231146107d1578063715018a6146107f157806373b4bc2914610806578063853828b61461083357600080fd5b80635b16c4d7146107865780635dc96d161461079b5780636352211e146107b157600080fd5b806322dcb0a7116102c1578063397f63201161025f57806343680d5c1161022e57806343680d5c146107115780634895622c146107265780634f6ccce71461074657806355f804b31461076657600080fd5b8063397f6320146106775780633bbbf88f146106a457806342842e0e146106d157806342966c68146106f157600080fd5b80632d0335ab1161029b5780632d0335ab146105e15780632f745c59146106175780633408e470146106375780633424e8041461064a57600080fd5b806322dcb0a71461057f5780632385763f1461059457806323b872dd146105c157600080fd5b80630a27b52b1161032e57806310bc661e1161030857806310bc661e1461051257806318160ddd146105285780631aa5e8721461053d57806320379ee51461056a57600080fd5b80630a27b52b146104a15780630c53c51c146104b65780630f7e5970146104c957600080fd5b8063081812fc1161036a578063081812fc14610412578063082fdc901461044a578063084c408814610461578063095ea7b31461048157600080fd5b806301ffc9a714610391578063031a9f25146103c657806306fdde03146103f0575b600080fd5b34801561039d57600080fd5b506103b16103ac36600461388d565b610adf565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103e2670214e8348c4f000081565b6040519081526020016103bd565b3480156103fc57600080fd5b50610405610af0565b6040516103bd9190613902565b34801561041e57600080fd5b5061043261042d366004613915565b610b82565b6040516001600160a01b0390911681526020016103bd565b34801561045657600080fd5b5061045f610c2d565b005b34801561046d57600080fd5b5061045f61047c366004613915565b610cb6565b34801561048d57600080fd5b5061045f61049c366004613943565b610d84565b3480156104ad57600080fd5b50610405610ec8565b6104056104c4366004613a3c565b610f56565b3480156104d557600080fd5b506104056040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b34801561051e57600080fd5b506103e261053981565b34801561053457600080fd5b506008546103e2565b34801561054957600080fd5b506103e2610558366004613ab0565b60196020526000908152604090205481565b34801561057657600080fd5b50600b546103e2565b34801561058b57600080fd5b5061045f61115c565b3480156105a057600080fd5b506103e26105af366004613915565b60186020526000908152604090205481565b3480156105cd57600080fd5b5061045f6105dc366004613acd565b6111e5565b3480156105ed57600080fd5b506103e26105fc366004613ab0565b6001600160a01b03166000908152600c602052604090205490565b34801561062357600080fd5b506103e2610632366004613943565b611273565b34801561064357600080fd5b50466103e2565b34801561065657600080fd5b506103e2610665366004613915565b60009081526018602052604090205490565b34801561068357600080fd5b506103e2610692366004613915565b60009081526016602052604090205490565b3480156106b057600080fd5b506106c46106bf366004613ab0565b61131b565b6040516103bd9190613b0e565b3480156106dd57600080fd5b5061045f6106ec366004613acd565b6113bd565b3480156106fd57600080fd5b5061045f61070c366004613915565b6113d8565b34801561071d57600080fd5b5061045f611461565b34801561073257600080fd5b5061045f610741366004613915565b6114ea565b34801561075257600080fd5b506103e2610761366004613915565b611603565b34801561077257600080fd5b5061045f610781366004613b52565b6116a7565b34801561079257600080fd5b506106c4611737565b3480156107a757600080fd5b506103e260145481565b3480156107bd57600080fd5b506104326107cc366004613915565b611749565b3480156107dd57600080fd5b506103e26107ec366004613ab0565b6117d4565b3480156107fd57600080fd5b5061045f61186e565b34801561081257600080fd5b506103e2610821366004613915565b60009081526017602052604090205490565b34801561083f57600080fd5b5061045f6118f3565b34801561085457600080fd5b5061045f610863366004613915565b611b18565b34801561087457600080fd5b50600e546001600160a01b0316610432565b34801561089257600080fd5b50610405611c43565b3480156108a757600080fd5b5061045f6108b6366004613b87565b611c52565b3480156108c757600080fd5b506103e260135481565b3480156108dd57600080fd5b5061045f6108ec366004613bc5565b611d54565b3480156108fd57600080fd5b506103e261090c366004613915565b60176020526000908152604090205481565b61045f61092c366004613c31565b611de3565b34801561093d57600080fd5b5061045f61094c366004613d2b565b612064565b34801561095d57600080fd5b5061040561096c366004613915565b612155565b34801561097d57600080fd5b5061045f61098c366004613915565b61218f565b34801561099d57600080fd5b506103e260125481565b3480156109b357600080fd5b5061045f6109c2366004613943565b6122a8565b3480156109d357600080fd5b50610405612408565b3480156109e857600080fd5b506104056109f7366004613915565b612417565b348015610a0857600080fd5b506103e2610a17366004613915565b60166020526000908152604090205481565b348015610a3557600080fd5b5061045f612430565b348015610a4a57600080fd5b506103e260115481565b348015610a6057600080fd5b506103b1610a6f366004613de4565b6124b9565b348015610a8057600080fd5b50610405610a8f366004613915565b6125a2565b348015610aa057600080fd5b5061045f610aaf366004613ab0565b612644565b348015610ac057600080fd5b506103e2600d81565b348015610ad557600080fd5b506103e2601a5481565b6000610aea8261279f565b92915050565b606060008054610aff90613e12565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2b90613e12565b8015610b785780601f10610b4d57610100808354040283529160200191610b78565b820191906000526020600020905b815481529060010190602001808311610b5b57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c115760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b610c356127dd565b6001600160a01b0316610c50600e546001600160a01b031690565b6001600160a01b031614610ca65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b610cb16013546127e7565b601355565b610cbe6127dd565b6001600160a01b0316610cd9600e546001600160a01b031690565b6001600160a01b031614610d2f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b60058110610d7f5760405162461bcd60e51b815260206004820152600c60248201527f43617070656420746f20342100000000000000000000000000000000000000006044820152606401610c08565b601a55565b6000610d8f82611749565b9050806001600160a01b0316836001600160a01b03161415610e195760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c08565b806001600160a01b0316610e2b6127dd565b6001600160a01b03161480610e475750610e4781610a6f6127dd565b610eb95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c08565b610ec38383612802565b505050565b601b8054610ed590613e12565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0190613e12565b8015610f4e5780601f10610f2357610100808354040283529160200191610f4e565b820191906000526020600020905b815481529060010190602001808311610f3157829003601f168201915b505050505081565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610f94878287878761287d565b6110065760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610c08565b6001600160a01b0387166000908152600c602052604090205461102a906001612985565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b9061107a90899033908a90613e4d565b60405180910390a1600080306001600160a01b0316888a6040516020016110a2929190613e82565b60408051601f19818403018152908290526110bc91613eb9565b6000604051808303816000865af19150503d80600081146110f9576040519150601f19603f3d011682016040523d82523d6000602084013e6110fe565b606091505b5091509150816111505760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610c08565b98975050505050505050565b6111646127dd565b6001600160a01b031661117f600e546001600160a01b031690565b6001600160a01b0316146111d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b6111e06014546127e7565b601455565b6111f66111f06127dd565b82612998565b6112685760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c08565b610ec3838383612a78565b600061127e836117d4565b82106112f25760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610c08565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60606000611328836117d4565b905060008167ffffffffffffffff8111156113455761134561396f565b60405190808252806020026020018201604052801561136e578160200160208202803683370190505b50905060005b828110156113b5576113868582611273565b82828151811061139857611398613ed5565b6020908102919091010152806113ad81613f01565b915050611374565b509392505050565b610ec383838360405180602001604052806000815250611d54565b6113e36111f06127dd565b6114555760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f766564000000000000000000000000000000006064820152608401610c08565b61145e81612c5d565b50565b6114696127dd565b6001600160a01b0316611484600e546001600160a01b031690565b6001600160a01b0316146114da5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b6114e56012546127e7565b601255565b6114f56111f06127dd565b6115415760405162461bcd60e51b815260206004820152601c60248201527f43616e277420636f6f6b20776861742773206e6f7420796f75727321000000006044820152606401610c08565b6000818152601660205260409020541561159d5760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920636f6f6b65642100000000000000000000000000000000006044820152606401610c08565b6011546001146115ef5760405162461bcd60e51b815260206004820152601e60248201527f436f6f6b696e6720657870616e73696f6e206e6f7420656e61626c65642100006044820152606401610c08565b600090815260166020526040902060019055565b600061160e60085490565b82106116825760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610c08565b6008828154811061169557611695613ed5565b90600052602060002001549050919050565b6116af6127dd565b6001600160a01b03166116ca600e546001600160a01b031690565b6001600160a01b0316146117205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b805161173390601b9060208401906137a8565b5050565b60606117446106bf6127dd565b905090565b6000818152600260205260408120546001600160a01b031680610aea5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c08565b60006001600160a01b0382166118525760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c08565b506001600160a01b031660009081526003602052604090205490565b6118766127dd565b6001600160a01b0316611891600e546001600160a01b031690565b6001600160a01b0316146118e75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b6118f16000612cdf565b565b6118fb6127dd565b6001600160a01b0316611916600e546001600160a01b031690565b6001600160a01b03161461196c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b47806119ba5760405162461bcd60e51b815260206004820152601560248201527f416464726573733a205a65726f2062616c616e636500000000000000000000006044820152606401610c08565b7386068b3973644d44effbd82a098875349610fb216000816119e860646119e2866014612d3e565b90612d4a565b604051600081818185875af1925050503d8060008114611a24576040519150601f19603f3d011682016040523d82523d6000602084013e611a29565b606091505b5050905080611a7a5760405162461bcd60e51b815260206004820152601460248201527f5472616e736665722031206661696c69757265210000000000000000000000006044820152606401610c08565b604051600090339047908381818185875af1925050503d8060008114611abc576040519150601f19603f3d011682016040523d82523d6000602084013e611ac1565b606091505b5050905080611b125760405162461bcd60e51b815260206004820152601460248201527f5472616e736665722032206661696c69757265210000000000000000000000006044820152606401610c08565b50505050565b611b236111f06127dd565b611b6f5760405162461bcd60e51b815260206004820152601b60248201527f43616e27742065617420776861742773206e6f7420796f7572732100000000006044820152606401610c08565b60008181526018602052604090205415611bcb5760405162461bcd60e51b815260206004820152600e60248201527f416c726561647920656174656e210000000000000000000000000000000000006044820152606401610c08565b601354600114611c1d5760405162461bcd60e51b815260206004820152601d60248201527f456174696e6720657870616e73696f6e206e6f7420656e61626c6564210000006044820152606401610c08565b6000818152601860205260409020600190819055601454141561145e5761145e81612d56565b606060018054610aff90613e12565b611c5a6127dd565b6001600160a01b0316826001600160a01b03161415611cbb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c08565b8060056000611cc86127dd565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611d0c6127dd565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d48911515815260200190565b60405180910390a35050565b611d65611d5f6127dd565b83612998565b611dd75760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c08565b611b1284848484612d96565b6000611dee60085490565b90506000611dfa6127dd565b9050601a5460001415611e4f5760405162461bcd60e51b815260206004820152600d60248201527f53686f707320636c6f73656421000000000000000000000000000000000000006044820152606401610c08565b610539611e5c8884613f1c565b1115611eaa5760405162461bcd60e51b815260206004820152601a60248201527f4e6f742074686174206d616e7920737465616b73206c656674210000000000006044820152606401610c08565b601a546001600160a01b038216600090815260196020526040902054611ed1908990613f1c565b1115611f1f5760405162461bcd60e51b815260206004820152601860248201527f4c6561766520736f6d6520666f722074686520726573742100000000000000006044820152606401610c08565b611f31670214e8348c4f000088612d3e565b341015611f805760405162461bcd60e51b815260206004820152601560248201527f4e6f7420656e7566206d6f756c616821204e474d4900000000000000000000006044820152606401610c08565b60408051600081526020810180835285905260ff881691810191909152606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611fd3573d6000803e3d6000fd5b505050602060405103516001600160a01b031673045bf88f67846f6c06df5cf4895de431522d21896001600160a01b0316146120515760405162461bcd60e51b815260206004820152600a60248201527f556e7665726966696564000000000000000000000000000000000000000000006044820152606401610c08565b61205b8188612e1f565b50505050505050565b61206c6127dd565b6001600160a01b0316612087600e546001600160a01b031690565b6001600160a01b0316146120dd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b60005b8251811015610ec3578181815181106120fb576120fb613ed5565b60200260200101516015600085848151811061211957612119613ed5565b6020026020010151815260200190815260200160002090805190602001906121429291906137a8565b508061214d81613f01565b9150506120e0565b606061215f612408565b61216883612e8b565b604051602001612179929190613f34565b6040516020818303038152906040529050919050565b61219a6111f06127dd565b6121e65760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207072657061726520776861742773206e6f7420796f75727321006044820152606401610c08565b600081815260176020526040902054156122425760405162461bcd60e51b815260206004820152601160248201527f416c7265616479207072657061726564210000000000000000000000000000006044820152606401610c08565b6012546001146122945760405162461bcd60e51b815260206004820181905260248201527f507265706172696e6720657870616e73696f6e206e6f7420656e61626c6564216044820152606401610c08565b600090815260176020526040902060019055565b6122b06127dd565b6001600160a01b03166122cb600e546001600160a01b031690565b6001600160a01b0316146123215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b6001600160a01b038216600090815260196020526040902054600d90612348908390613f1c565b11156123965760405162461bcd60e51b815260206004820152601660248201527f457863656564696e672072657365727665206d617821000000000000000000006044820152606401610c08565b60006123a160085490565b90506105396123b08383613f1c565b11156123fe5760405162461bcd60e51b815260206004820152601a60248201527f4e6f742074686174206d616e7920737465616b73206c656674210000000000006044820152606401610c08565b610ec38383612e1f565b6060601b8054610aff90613e12565b60156020526000908152604090208054610ed590613e12565b6124386127dd565b6001600160a01b0316612453600e546001600160a01b031690565b6001600160a01b0316146124a95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b6124b46011546127e7565b601155565b600f546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b15801561251f57600080fd5b505afa158015612533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125579190613f63565b6001600160a01b03161415612570576001915050610aea565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b60008181526015602052604090208054606091906125bf90613e12565b80601f01602080910402602001604051908101604052809291908181526020018280546125eb90613e12565b80156126385780601f1061260d57610100808354040283529160200191612638565b820191906000526020600020905b81548152906001019060200180831161261b57829003601f168201915b50505050509050919050565b61264c6127dd565b6001600160a01b0316612667600e546001600160a01b031690565b6001600160a01b0316146126bd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b6001600160a01b0381166127395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c08565b61145e81612cdf565b60003330141561279957600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b0316915061279c9050565b50335b90565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610aea5750610aea82612fbd565b6000611744612742565b600081600114156127fa57506000919050565b506001919050565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155819061284482611749565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166128fb5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201527f49474e45520000000000000000000000000000000000000000000000000000006064820152608401610c08565b600161290e61290987613058565b6130d5565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa15801561295c573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006129918284613f1c565b9392505050565b6000818152600260205260408120546001600160a01b0316612a225760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c08565b6000612a2d83611749565b9050806001600160a01b0316846001600160a01b03161480612a685750836001600160a01b0316612a5d84610b82565b6001600160a01b0316145b8061259a575061259a81856124b9565b826001600160a01b0316612a8b82611749565b6001600160a01b031614612b075760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610c08565b6001600160a01b038216612b825760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c08565b612b8d838383613120565b612b98600082612802565b6001600160a01b0383166000908152600360205260408120805460019290612bc1908490613f80565b90915550506001600160a01b0382166000908152600360205260408120805460019290612bef908490613f1c565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b612c656127dd565b6001600160a01b0316612c80600e546001600160a01b031690565b6001600160a01b031614612cd65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b61145e81612d56565b600e80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006129918284613f97565b60006129918284613fcc565b612d5f8161312b565b6000818152600d602052604090208054612d7890613e12565b15905061145e576000818152600d6020526040812061145e9161382c565b612da1848484612a78565b612dad848484846131df565b611b125760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c08565b60005b81811015610ec357612e38601080546001019055565b612e4a83612e4560105490565b613362565b6001600160a01b0383166000908152601960205260408120805460019290612e73908490613f1c565b90915550819050612e8381613f01565b915050612e22565b606081612ecb57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612ef55780612edf81613f01565b9150612eee9050600a83613fcc565b9150612ecf565b60008167ffffffffffffffff811115612f1057612f1061396f565b6040519080825280601f01601f191660200182016040528015612f3a576020820181803683370190505b5090505b841561259a57612f4f600183613f80565b9150612f5c600a86613fe0565b612f67906030613f1c565b60f81b818381518110612f7c57612f7c613ed5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612fb6600a86613fcc565b9450612f3e565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061302057506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610aea57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610aea565b600060405180608001604052806043815260200161406460439139805160209182012083518483015160408087015180519086012090516130b8950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006130e0600b5490565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810191909152604281018390526062016130b8565b610ec383838361337c565b600061313682611749565b905061314481600084613120565b61314f600083612802565b6001600160a01b0381166000908152600360205260408120805460019290613178908490613f80565b9091555050600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160a01b0384163b1561335757836001600160a01b031663150b7a026132086127dd565b8786866040518563ffffffff1660e01b815260040161322a9493929190613ff4565b602060405180830381600087803b15801561324457600080fd5b505af1925050508015613274575060408051601f3d908101601f1916820190925261327191810190614030565b60015b613324573d8080156132a2576040519150601f19603f3d011682016040523d82523d6000602084013e6132a7565b606091505b50805161331c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c08565b805181602001fd5b6001600160e01b0319167f150b7a020000000000000000000000000000000000000000000000000000000014905061259a565b506001949350505050565b611733828260405180602001604052806000815250613434565b6001600160a01b0383166133d7576133d281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6133fa565b816001600160a01b0316836001600160a01b0316146133fa576133fa83826134bd565b6001600160a01b03821661341157610ec38161355a565b826001600160a01b0316826001600160a01b031614610ec357610ec38282613609565b61343e838361364d565b61344b60008484846131df565b610ec35760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c08565b600060016134ca846117d4565b6134d49190613f80565b600083815260076020526040902054909150808214613527576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061356c90600190613f80565b6000838152600960205260408120546008805493945090928490811061359457613594613ed5565b9060005260206000200154905080600883815481106135b5576135b5613ed5565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806135ed576135ed61404d565b6001900381819060005260206000200160009055905550505050565b6000613614836117d4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166136a35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c08565b6000818152600260205260409020546001600160a01b0316156137085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c08565b61371460008383613120565b6001600160a01b038216600090815260036020526040812080546001929061373d908490613f1c565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546137b490613e12565b90600052602060002090601f0160209004810192826137d6576000855561381c565b82601f106137ef57805160ff191683800117855561381c565b8280016001018555821561381c579182015b8281111561381c578251825591602001919060010190613801565b50613828929150613862565b5090565b50805461383890613e12565b6000825580601f10613848575050565b601f01602090049060005260206000209081019061145e91905b5b808211156138285760008155600101613863565b6001600160e01b03198116811461145e57600080fd5b60006020828403121561389f57600080fd5b813561299181613877565b60005b838110156138c55781810151838201526020016138ad565b83811115611b125750506000910152565b600081518084526138ee8160208601602086016138aa565b601f01601f19169290920160200192915050565b60208152600061299160208301846138d6565b60006020828403121561392757600080fd5b5035919050565b6001600160a01b038116811461145e57600080fd5b6000806040838503121561395657600080fd5b82356139618161392e565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156139ae576139ae61396f565b604052919050565b600082601f8301126139c757600080fd5b813567ffffffffffffffff8111156139e1576139e161396f565b6139f4601f8201601f1916602001613985565b818152846020838601011115613a0957600080fd5b816020850160208301376000918101602001919091529392505050565b803560ff81168114613a3757600080fd5b919050565b600080600080600060a08688031215613a5457600080fd5b8535613a5f8161392e565b9450602086013567ffffffffffffffff811115613a7b57600080fd5b613a87888289016139b6565b9450506040860135925060608601359150613aa460808701613a26565b90509295509295909350565b600060208284031215613ac257600080fd5b81356129918161392e565b600080600060608486031215613ae257600080fd5b8335613aed8161392e565b92506020840135613afd8161392e565b929592945050506040919091013590565b6020808252825182820181905260009190848201906040850190845b81811015613b4657835183529284019291840191600101613b2a565b50909695505050505050565b600060208284031215613b6457600080fd5b813567ffffffffffffffff811115613b7b57600080fd5b61259a848285016139b6565b60008060408385031215613b9a57600080fd5b8235613ba58161392e565b915060208301358015158114613bba57600080fd5b809150509250929050565b60008060008060808587031215613bdb57600080fd5b8435613be68161392e565b93506020850135613bf68161392e565b925060408501359150606085013567ffffffffffffffff811115613c1957600080fd5b613c25878288016139b6565b91505092959194509250565b600080600080600060a08688031215613c4957600080fd5b85359450613c5960208701613a26565b94979496505050506040830135926060810135926080909101359150565b600067ffffffffffffffff821115613c9157613c9161396f565b5060051b60200190565b600082601f830112613cac57600080fd5b81356020613cc1613cbc83613c77565b613985565b82815260059290921b84018101918181019086841115613ce057600080fd5b8286015b84811015613d2057803567ffffffffffffffff811115613d045760008081fd5b613d128986838b01016139b6565b845250918301918301613ce4565b509695505050505050565b60008060408385031215613d3e57600080fd5b823567ffffffffffffffff80821115613d5657600080fd5b818501915085601f830112613d6a57600080fd5b81356020613d7a613cbc83613c77565b82815260059290921b84018101918181019089841115613d9957600080fd5b948201945b83861015613db757853582529482019490820190613d9e565b96505086013592505080821115613dcd57600080fd5b50613dda85828601613c9b565b9150509250929050565b60008060408385031215613df757600080fd5b8235613e028161392e565b91506020830135613bba8161392e565b600181811c90821680613e2657607f821691505b60208210811415613e4757634e487b7160e01b600052602260045260246000fd5b50919050565b60006001600160a01b03808616835280851660208401525060606040830152613e7960608301846138d6565b95945050505050565b60008351613e948184602088016138aa565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b60008251613ecb8184602087016138aa565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613f1557613f15613eeb565b5060010190565b60008219821115613f2f57613f2f613eeb565b500190565b60008351613f468184602088016138aa565b835190830190613f5a8183602088016138aa565b01949350505050565b600060208284031215613f7557600080fd5b81516129918161392e565b600082821015613f9257613f92613eeb565b500390565b6000816000190483118215151615613fb157613fb1613eeb565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613fdb57613fdb613fb6565b500490565b600082613fef57613fef613fb6565b500690565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261402660808301846138d6565b9695505050505050565b60006020828403121561404257600080fd5b815161299181613877565b634e487b7160e01b600052603160045260246000fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a264697066735822122003f8bc113536b5ed57653fba9aec7f12d8e05b758420064b075a21aa298b96c564736f6c63430008090033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c742968747470733a2f2f7777772e737465616b2e7774662f6170692f6d657461646174612f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

Deployed Bytecode

0x60806040526004361061038c5760003560e01c80635b16c4d7116101dc578063c1f5802511610102578063dc908913116100a0578063ebebfc8b1161006f578063ebebfc8b14610a74578063f2fde38b14610a94578063f3b3a9fa14610ab4578063f516a2e614610ac957600080fd5b8063dc908913146109fc578063dea43ab814610a29578063e4b52ef914610a3e578063e985e9c514610a5457600080fd5b8063cc148a6a116100dc578063cc148a6a14610991578063cc47a40b146109a7578063d547cfb7146109c7578063daefd9c8146109dc57600080fd5b8063c1f5802514610931578063c87b56dd14610951578063cb5774801461097157600080fd5b806385e0ebaf1161017a578063b147f53a11610149578063b147f53a146108bb578063b88d4fde146108d1578063b9fd3d1f146108f1578063baba12a31461091e57600080fd5b806385e0ebaf146108485780638da5cb5b1461086857806395d89b4114610886578063a22cb4651461089b57600080fd5b806370a08231116101b657806370a08231146107d1578063715018a6146107f157806373b4bc2914610806578063853828b61461083357600080fd5b80635b16c4d7146107865780635dc96d161461079b5780636352211e146107b157600080fd5b806322dcb0a7116102c1578063397f63201161025f57806343680d5c1161022e57806343680d5c146107115780634895622c146107265780634f6ccce71461074657806355f804b31461076657600080fd5b8063397f6320146106775780633bbbf88f146106a457806342842e0e146106d157806342966c68146106f157600080fd5b80632d0335ab1161029b5780632d0335ab146105e15780632f745c59146106175780633408e470146106375780633424e8041461064a57600080fd5b806322dcb0a71461057f5780632385763f1461059457806323b872dd146105c157600080fd5b80630a27b52b1161032e57806310bc661e1161030857806310bc661e1461051257806318160ddd146105285780631aa5e8721461053d57806320379ee51461056a57600080fd5b80630a27b52b146104a15780630c53c51c146104b65780630f7e5970146104c957600080fd5b8063081812fc1161036a578063081812fc14610412578063082fdc901461044a578063084c408814610461578063095ea7b31461048157600080fd5b806301ffc9a714610391578063031a9f25146103c657806306fdde03146103f0575b600080fd5b34801561039d57600080fd5b506103b16103ac36600461388d565b610adf565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103e2670214e8348c4f000081565b6040519081526020016103bd565b3480156103fc57600080fd5b50610405610af0565b6040516103bd9190613902565b34801561041e57600080fd5b5061043261042d366004613915565b610b82565b6040516001600160a01b0390911681526020016103bd565b34801561045657600080fd5b5061045f610c2d565b005b34801561046d57600080fd5b5061045f61047c366004613915565b610cb6565b34801561048d57600080fd5b5061045f61049c366004613943565b610d84565b3480156104ad57600080fd5b50610405610ec8565b6104056104c4366004613a3c565b610f56565b3480156104d557600080fd5b506104056040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b34801561051e57600080fd5b506103e261053981565b34801561053457600080fd5b506008546103e2565b34801561054957600080fd5b506103e2610558366004613ab0565b60196020526000908152604090205481565b34801561057657600080fd5b50600b546103e2565b34801561058b57600080fd5b5061045f61115c565b3480156105a057600080fd5b506103e26105af366004613915565b60186020526000908152604090205481565b3480156105cd57600080fd5b5061045f6105dc366004613acd565b6111e5565b3480156105ed57600080fd5b506103e26105fc366004613ab0565b6001600160a01b03166000908152600c602052604090205490565b34801561062357600080fd5b506103e2610632366004613943565b611273565b34801561064357600080fd5b50466103e2565b34801561065657600080fd5b506103e2610665366004613915565b60009081526018602052604090205490565b34801561068357600080fd5b506103e2610692366004613915565b60009081526016602052604090205490565b3480156106b057600080fd5b506106c46106bf366004613ab0565b61131b565b6040516103bd9190613b0e565b3480156106dd57600080fd5b5061045f6106ec366004613acd565b6113bd565b3480156106fd57600080fd5b5061045f61070c366004613915565b6113d8565b34801561071d57600080fd5b5061045f611461565b34801561073257600080fd5b5061045f610741366004613915565b6114ea565b34801561075257600080fd5b506103e2610761366004613915565b611603565b34801561077257600080fd5b5061045f610781366004613b52565b6116a7565b34801561079257600080fd5b506106c4611737565b3480156107a757600080fd5b506103e260145481565b3480156107bd57600080fd5b506104326107cc366004613915565b611749565b3480156107dd57600080fd5b506103e26107ec366004613ab0565b6117d4565b3480156107fd57600080fd5b5061045f61186e565b34801561081257600080fd5b506103e2610821366004613915565b60009081526017602052604090205490565b34801561083f57600080fd5b5061045f6118f3565b34801561085457600080fd5b5061045f610863366004613915565b611b18565b34801561087457600080fd5b50600e546001600160a01b0316610432565b34801561089257600080fd5b50610405611c43565b3480156108a757600080fd5b5061045f6108b6366004613b87565b611c52565b3480156108c757600080fd5b506103e260135481565b3480156108dd57600080fd5b5061045f6108ec366004613bc5565b611d54565b3480156108fd57600080fd5b506103e261090c366004613915565b60176020526000908152604090205481565b61045f61092c366004613c31565b611de3565b34801561093d57600080fd5b5061045f61094c366004613d2b565b612064565b34801561095d57600080fd5b5061040561096c366004613915565b612155565b34801561097d57600080fd5b5061045f61098c366004613915565b61218f565b34801561099d57600080fd5b506103e260125481565b3480156109b357600080fd5b5061045f6109c2366004613943565b6122a8565b3480156109d357600080fd5b50610405612408565b3480156109e857600080fd5b506104056109f7366004613915565b612417565b348015610a0857600080fd5b506103e2610a17366004613915565b60166020526000908152604090205481565b348015610a3557600080fd5b5061045f612430565b348015610a4a57600080fd5b506103e260115481565b348015610a6057600080fd5b506103b1610a6f366004613de4565b6124b9565b348015610a8057600080fd5b50610405610a8f366004613915565b6125a2565b348015610aa057600080fd5b5061045f610aaf366004613ab0565b612644565b348015610ac057600080fd5b506103e2600d81565b348015610ad557600080fd5b506103e2601a5481565b6000610aea8261279f565b92915050565b606060008054610aff90613e12565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2b90613e12565b8015610b785780601f10610b4d57610100808354040283529160200191610b78565b820191906000526020600020905b815481529060010190602001808311610b5b57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c115760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b610c356127dd565b6001600160a01b0316610c50600e546001600160a01b031690565b6001600160a01b031614610ca65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b610cb16013546127e7565b601355565b610cbe6127dd565b6001600160a01b0316610cd9600e546001600160a01b031690565b6001600160a01b031614610d2f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b60058110610d7f5760405162461bcd60e51b815260206004820152600c60248201527f43617070656420746f20342100000000000000000000000000000000000000006044820152606401610c08565b601a55565b6000610d8f82611749565b9050806001600160a01b0316836001600160a01b03161415610e195760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c08565b806001600160a01b0316610e2b6127dd565b6001600160a01b03161480610e475750610e4781610a6f6127dd565b610eb95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c08565b610ec38383612802565b505050565b601b8054610ed590613e12565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0190613e12565b8015610f4e5780601f10610f2357610100808354040283529160200191610f4e565b820191906000526020600020905b815481529060010190602001808311610f3157829003601f168201915b505050505081565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610f94878287878761287d565b6110065760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610c08565b6001600160a01b0387166000908152600c602052604090205461102a906001612985565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b9061107a90899033908a90613e4d565b60405180910390a1600080306001600160a01b0316888a6040516020016110a2929190613e82565b60408051601f19818403018152908290526110bc91613eb9565b6000604051808303816000865af19150503d80600081146110f9576040519150601f19603f3d011682016040523d82523d6000602084013e6110fe565b606091505b5091509150816111505760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610c08565b98975050505050505050565b6111646127dd565b6001600160a01b031661117f600e546001600160a01b031690565b6001600160a01b0316146111d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b6111e06014546127e7565b601455565b6111f66111f06127dd565b82612998565b6112685760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c08565b610ec3838383612a78565b600061127e836117d4565b82106112f25760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610c08565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60606000611328836117d4565b905060008167ffffffffffffffff8111156113455761134561396f565b60405190808252806020026020018201604052801561136e578160200160208202803683370190505b50905060005b828110156113b5576113868582611273565b82828151811061139857611398613ed5565b6020908102919091010152806113ad81613f01565b915050611374565b509392505050565b610ec383838360405180602001604052806000815250611d54565b6113e36111f06127dd565b6114555760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f766564000000000000000000000000000000006064820152608401610c08565b61145e81612c5d565b50565b6114696127dd565b6001600160a01b0316611484600e546001600160a01b031690565b6001600160a01b0316146114da5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b6114e56012546127e7565b601255565b6114f56111f06127dd565b6115415760405162461bcd60e51b815260206004820152601c60248201527f43616e277420636f6f6b20776861742773206e6f7420796f75727321000000006044820152606401610c08565b6000818152601660205260409020541561159d5760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920636f6f6b65642100000000000000000000000000000000006044820152606401610c08565b6011546001146115ef5760405162461bcd60e51b815260206004820152601e60248201527f436f6f6b696e6720657870616e73696f6e206e6f7420656e61626c65642100006044820152606401610c08565b600090815260166020526040902060019055565b600061160e60085490565b82106116825760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610c08565b6008828154811061169557611695613ed5565b90600052602060002001549050919050565b6116af6127dd565b6001600160a01b03166116ca600e546001600160a01b031690565b6001600160a01b0316146117205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b805161173390601b9060208401906137a8565b5050565b60606117446106bf6127dd565b905090565b6000818152600260205260408120546001600160a01b031680610aea5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c08565b60006001600160a01b0382166118525760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c08565b506001600160a01b031660009081526003602052604090205490565b6118766127dd565b6001600160a01b0316611891600e546001600160a01b031690565b6001600160a01b0316146118e75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b6118f16000612cdf565b565b6118fb6127dd565b6001600160a01b0316611916600e546001600160a01b031690565b6001600160a01b03161461196c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b47806119ba5760405162461bcd60e51b815260206004820152601560248201527f416464726573733a205a65726f2062616c616e636500000000000000000000006044820152606401610c08565b7386068b3973644d44effbd82a098875349610fb216000816119e860646119e2866014612d3e565b90612d4a565b604051600081818185875af1925050503d8060008114611a24576040519150601f19603f3d011682016040523d82523d6000602084013e611a29565b606091505b5050905080611a7a5760405162461bcd60e51b815260206004820152601460248201527f5472616e736665722031206661696c69757265210000000000000000000000006044820152606401610c08565b604051600090339047908381818185875af1925050503d8060008114611abc576040519150601f19603f3d011682016040523d82523d6000602084013e611ac1565b606091505b5050905080611b125760405162461bcd60e51b815260206004820152601460248201527f5472616e736665722032206661696c69757265210000000000000000000000006044820152606401610c08565b50505050565b611b236111f06127dd565b611b6f5760405162461bcd60e51b815260206004820152601b60248201527f43616e27742065617420776861742773206e6f7420796f7572732100000000006044820152606401610c08565b60008181526018602052604090205415611bcb5760405162461bcd60e51b815260206004820152600e60248201527f416c726561647920656174656e210000000000000000000000000000000000006044820152606401610c08565b601354600114611c1d5760405162461bcd60e51b815260206004820152601d60248201527f456174696e6720657870616e73696f6e206e6f7420656e61626c6564210000006044820152606401610c08565b6000818152601860205260409020600190819055601454141561145e5761145e81612d56565b606060018054610aff90613e12565b611c5a6127dd565b6001600160a01b0316826001600160a01b03161415611cbb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c08565b8060056000611cc86127dd565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611d0c6127dd565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d48911515815260200190565b60405180910390a35050565b611d65611d5f6127dd565b83612998565b611dd75760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c08565b611b1284848484612d96565b6000611dee60085490565b90506000611dfa6127dd565b9050601a5460001415611e4f5760405162461bcd60e51b815260206004820152600d60248201527f53686f707320636c6f73656421000000000000000000000000000000000000006044820152606401610c08565b610539611e5c8884613f1c565b1115611eaa5760405162461bcd60e51b815260206004820152601a60248201527f4e6f742074686174206d616e7920737465616b73206c656674210000000000006044820152606401610c08565b601a546001600160a01b038216600090815260196020526040902054611ed1908990613f1c565b1115611f1f5760405162461bcd60e51b815260206004820152601860248201527f4c6561766520736f6d6520666f722074686520726573742100000000000000006044820152606401610c08565b611f31670214e8348c4f000088612d3e565b341015611f805760405162461bcd60e51b815260206004820152601560248201527f4e6f7420656e7566206d6f756c616821204e474d4900000000000000000000006044820152606401610c08565b60408051600081526020810180835285905260ff881691810191909152606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611fd3573d6000803e3d6000fd5b505050602060405103516001600160a01b031673045bf88f67846f6c06df5cf4895de431522d21896001600160a01b0316146120515760405162461bcd60e51b815260206004820152600a60248201527f556e7665726966696564000000000000000000000000000000000000000000006044820152606401610c08565b61205b8188612e1f565b50505050505050565b61206c6127dd565b6001600160a01b0316612087600e546001600160a01b031690565b6001600160a01b0316146120dd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b60005b8251811015610ec3578181815181106120fb576120fb613ed5565b60200260200101516015600085848151811061211957612119613ed5565b6020026020010151815260200190815260200160002090805190602001906121429291906137a8565b508061214d81613f01565b9150506120e0565b606061215f612408565b61216883612e8b565b604051602001612179929190613f34565b6040516020818303038152906040529050919050565b61219a6111f06127dd565b6121e65760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207072657061726520776861742773206e6f7420796f75727321006044820152606401610c08565b600081815260176020526040902054156122425760405162461bcd60e51b815260206004820152601160248201527f416c7265616479207072657061726564210000000000000000000000000000006044820152606401610c08565b6012546001146122945760405162461bcd60e51b815260206004820181905260248201527f507265706172696e6720657870616e73696f6e206e6f7420656e61626c6564216044820152606401610c08565b600090815260176020526040902060019055565b6122b06127dd565b6001600160a01b03166122cb600e546001600160a01b031690565b6001600160a01b0316146123215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b6001600160a01b038216600090815260196020526040902054600d90612348908390613f1c565b11156123965760405162461bcd60e51b815260206004820152601660248201527f457863656564696e672072657365727665206d617821000000000000000000006044820152606401610c08565b60006123a160085490565b90506105396123b08383613f1c565b11156123fe5760405162461bcd60e51b815260206004820152601a60248201527f4e6f742074686174206d616e7920737465616b73206c656674210000000000006044820152606401610c08565b610ec38383612e1f565b6060601b8054610aff90613e12565b60156020526000908152604090208054610ed590613e12565b6124386127dd565b6001600160a01b0316612453600e546001600160a01b031690565b6001600160a01b0316146124a95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b6124b46011546127e7565b601155565b600f546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b15801561251f57600080fd5b505afa158015612533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125579190613f63565b6001600160a01b03161415612570576001915050610aea565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b60008181526015602052604090208054606091906125bf90613e12565b80601f01602080910402602001604051908101604052809291908181526020018280546125eb90613e12565b80156126385780601f1061260d57610100808354040283529160200191612638565b820191906000526020600020905b81548152906001019060200180831161261b57829003601f168201915b50505050509050919050565b61264c6127dd565b6001600160a01b0316612667600e546001600160a01b031690565b6001600160a01b0316146126bd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b6001600160a01b0381166127395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c08565b61145e81612cdf565b60003330141561279957600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b0316915061279c9050565b50335b90565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610aea5750610aea82612fbd565b6000611744612742565b600081600114156127fa57506000919050565b506001919050565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416908117909155819061284482611749565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166128fb5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201527f49474e45520000000000000000000000000000000000000000000000000000006064820152608401610c08565b600161290e61290987613058565b6130d5565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa15801561295c573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006129918284613f1c565b9392505050565b6000818152600260205260408120546001600160a01b0316612a225760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c08565b6000612a2d83611749565b9050806001600160a01b0316846001600160a01b03161480612a685750836001600160a01b0316612a5d84610b82565b6001600160a01b0316145b8061259a575061259a81856124b9565b826001600160a01b0316612a8b82611749565b6001600160a01b031614612b075760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610c08565b6001600160a01b038216612b825760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c08565b612b8d838383613120565b612b98600082612802565b6001600160a01b0383166000908152600360205260408120805460019290612bc1908490613f80565b90915550506001600160a01b0382166000908152600360205260408120805460019290612bef908490613f1c565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b612c656127dd565b6001600160a01b0316612c80600e546001600160a01b031690565b6001600160a01b031614612cd65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c08565b61145e81612d56565b600e80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006129918284613f97565b60006129918284613fcc565b612d5f8161312b565b6000818152600d602052604090208054612d7890613e12565b15905061145e576000818152600d6020526040812061145e9161382c565b612da1848484612a78565b612dad848484846131df565b611b125760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c08565b60005b81811015610ec357612e38601080546001019055565b612e4a83612e4560105490565b613362565b6001600160a01b0383166000908152601960205260408120805460019290612e73908490613f1c565b90915550819050612e8381613f01565b915050612e22565b606081612ecb57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612ef55780612edf81613f01565b9150612eee9050600a83613fcc565b9150612ecf565b60008167ffffffffffffffff811115612f1057612f1061396f565b6040519080825280601f01601f191660200182016040528015612f3a576020820181803683370190505b5090505b841561259a57612f4f600183613f80565b9150612f5c600a86613fe0565b612f67906030613f1c565b60f81b818381518110612f7c57612f7c613ed5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612fb6600a86613fcc565b9450612f3e565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061302057506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610aea57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610aea565b600060405180608001604052806043815260200161406460439139805160209182012083518483015160408087015180519086012090516130b8950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006130e0600b5490565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810191909152604281018390526062016130b8565b610ec383838361337c565b600061313682611749565b905061314481600084613120565b61314f600083612802565b6001600160a01b0381166000908152600360205260408120805460019290613178908490613f80565b9091555050600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160a01b0384163b1561335757836001600160a01b031663150b7a026132086127dd565b8786866040518563ffffffff1660e01b815260040161322a9493929190613ff4565b602060405180830381600087803b15801561324457600080fd5b505af1925050508015613274575060408051601f3d908101601f1916820190925261327191810190614030565b60015b613324573d8080156132a2576040519150601f19603f3d011682016040523d82523d6000602084013e6132a7565b606091505b50805161331c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c08565b805181602001fd5b6001600160e01b0319167f150b7a020000000000000000000000000000000000000000000000000000000014905061259a565b506001949350505050565b611733828260405180602001604052806000815250613434565b6001600160a01b0383166133d7576133d281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6133fa565b816001600160a01b0316836001600160a01b0316146133fa576133fa83826134bd565b6001600160a01b03821661341157610ec38161355a565b826001600160a01b0316826001600160a01b031614610ec357610ec38282613609565b61343e838361364d565b61344b60008484846131df565b610ec35760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c08565b600060016134ca846117d4565b6134d49190613f80565b600083815260076020526040902054909150808214613527576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061356c90600190613f80565b6000838152600960205260408120546008805493945090928490811061359457613594613ed5565b9060005260206000200154905080600883815481106135b5576135b5613ed5565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806135ed576135ed61404d565b6001900381819060005260206000200160009055905550505050565b6000613614836117d4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166136a35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c08565b6000818152600260205260409020546001600160a01b0316156137085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c08565b61371460008383613120565b6001600160a01b038216600090815260036020526040812080546001929061373d908490613f1c565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546137b490613e12565b90600052602060002090601f0160209004810192826137d6576000855561381c565b82601f106137ef57805160ff191683800117855561381c565b8280016001018555821561381c579182015b8281111561381c578251825591602001919060010190613801565b50613828929150613862565b5090565b50805461383890613e12565b6000825580601f10613848575050565b601f01602090049060005260206000209081019061145e91905b5b808211156138285760008155600101613863565b6001600160e01b03198116811461145e57600080fd5b60006020828403121561389f57600080fd5b813561299181613877565b60005b838110156138c55781810151838201526020016138ad565b83811115611b125750506000910152565b600081518084526138ee8160208601602086016138aa565b601f01601f19169290920160200192915050565b60208152600061299160208301846138d6565b60006020828403121561392757600080fd5b5035919050565b6001600160a01b038116811461145e57600080fd5b6000806040838503121561395657600080fd5b82356139618161392e565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156139ae576139ae61396f565b604052919050565b600082601f8301126139c757600080fd5b813567ffffffffffffffff8111156139e1576139e161396f565b6139f4601f8201601f1916602001613985565b818152846020838601011115613a0957600080fd5b816020850160208301376000918101602001919091529392505050565b803560ff81168114613a3757600080fd5b919050565b600080600080600060a08688031215613a5457600080fd5b8535613a5f8161392e565b9450602086013567ffffffffffffffff811115613a7b57600080fd5b613a87888289016139b6565b9450506040860135925060608601359150613aa460808701613a26565b90509295509295909350565b600060208284031215613ac257600080fd5b81356129918161392e565b600080600060608486031215613ae257600080fd5b8335613aed8161392e565b92506020840135613afd8161392e565b929592945050506040919091013590565b6020808252825182820181905260009190848201906040850190845b81811015613b4657835183529284019291840191600101613b2a565b50909695505050505050565b600060208284031215613b6457600080fd5b813567ffffffffffffffff811115613b7b57600080fd5b61259a848285016139b6565b60008060408385031215613b9a57600080fd5b8235613ba58161392e565b915060208301358015158114613bba57600080fd5b809150509250929050565b60008060008060808587031215613bdb57600080fd5b8435613be68161392e565b93506020850135613bf68161392e565b925060408501359150606085013567ffffffffffffffff811115613c1957600080fd5b613c25878288016139b6565b91505092959194509250565b600080600080600060a08688031215613c4957600080fd5b85359450613c5960208701613a26565b94979496505050506040830135926060810135926080909101359150565b600067ffffffffffffffff821115613c9157613c9161396f565b5060051b60200190565b600082601f830112613cac57600080fd5b81356020613cc1613cbc83613c77565b613985565b82815260059290921b84018101918181019086841115613ce057600080fd5b8286015b84811015613d2057803567ffffffffffffffff811115613d045760008081fd5b613d128986838b01016139b6565b845250918301918301613ce4565b509695505050505050565b60008060408385031215613d3e57600080fd5b823567ffffffffffffffff80821115613d5657600080fd5b818501915085601f830112613d6a57600080fd5b81356020613d7a613cbc83613c77565b82815260059290921b84018101918181019089841115613d9957600080fd5b948201945b83861015613db757853582529482019490820190613d9e565b96505086013592505080821115613dcd57600080fd5b50613dda85828601613c9b565b9150509250929050565b60008060408385031215613df757600080fd5b8235613e028161392e565b91506020830135613bba8161392e565b600181811c90821680613e2657607f821691505b60208210811415613e4757634e487b7160e01b600052602260045260246000fd5b50919050565b60006001600160a01b03808616835280851660208401525060606040830152613e7960608301846138d6565b95945050505050565b60008351613e948184602088016138aa565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b60008251613ecb8184602087016138aa565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613f1557613f15613eeb565b5060010190565b60008219821115613f2f57613f2f613eeb565b500190565b60008351613f468184602088016138aa565b835190830190613f5a8183602088016138aa565b01949350505050565b600060208284031215613f7557600080fd5b81516129918161392e565b600082821015613f9257613f92613eeb565b500390565b6000816000190483118215151615613fb157613fb1613eeb565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613fdb57613fdb613fb6565b500490565b600082613fef57613fef613fb6565b500690565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261402660808301846138d6565b9695505050505050565b60006020828403121561404257600080fd5b815161299181613877565b634e487b7160e01b600052603160045260246000fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a264697066735822122003f8bc113536b5ed57653fba9aec7f12d8e05b758420064b075a21aa298b96c564736f6c63430008090033

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

000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1


Deployed Bytecode Sourcemap

69288:715:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69108:171;;;;;;;;;;-1:-1:-1;69108:171:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;69108:171:0;;;;;;;;61481:44;;;;;;;;;;;;61515:10;61481:44;;;;;784:25:1;;;772:2;757:18;61481:44:0;638:177:1;33226:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34785:221::-;;;;;;;;;;-1:-1:-1;34785:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1920:55:1;;;1902:74;;1890:2;1875:18;34785:221:0;1756:226:1;66251:95:0;;;;;;;;;;;;;:::i;:::-;;64797:155;;;;;;;;;;-1:-1:-1;64797:155:0;;;;;:::i;:::-;;:::i;34308:411::-;;;;;;;;;;-1:-1:-1;34308:411:0;;;;;:::i;:::-;;:::i;69582:67::-;;;;;;;;;;;;;:::i;58401:1151::-;;;;;;:::i;:::-;;:::i;55666:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61320:37;;;;;;;;;;;;61353:4;61320:37;;48607:113;;;;;;;;;;-1:-1:-1;48695:10:0;:17;48607:113;;62119:43;;;;;;;;;;-1:-1:-1;62119:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;56675:101;;;;;;;;;;-1:-1:-1;56753:15:0;;56675:101;;66354:92;;;;;;;;;;;;;:::i;62017:35::-;;;;;;;;;;-1:-1:-1;62017:35:0;;;;;:::i;:::-;;;;;;;;;;;;;;35675:339;;;;;;;;;;-1:-1:-1;35675:339:0;;;;;:::i;:::-;;:::i;59978:107::-;;;;;;;;;;-1:-1:-1;59978:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;60065:12:0;60031:13;60065:12;;;:6;:12;;;;;;;59978:107;48275:256;;;;;;;;;;-1:-1:-1;48275:256:0;;;;;:::i;:::-;;:::i;56784:161::-;;;;;;;;;;-1:-1:-1;56898:9:0;56784:161;;68436:98;;;;;;;;;;-1:-1:-1;68436:98:0;;;;;:::i;:::-;68488:4;68512:14;;;:5;:14;;;;;;;68436:98;68025:100;;;;;;;;;;-1:-1:-1;68025:100:0;;;;;:::i;:::-;68078:4;68102:15;;;:6;:15;;;;;;;68025:100;68581:332;;;;;;;;;;-1:-1:-1;68581:332:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36085:185::-;;;;;;;;;;-1:-1:-1;36085:185:0;;;;;:::i;:::-;;:::i;44861:245::-;;;;;;;;;;-1:-1:-1;44861:245:0;;;;;:::i;:::-;;:::i;66139:104::-;;;;;;;;;;;;;:::i;64960:298::-;;;;;;;;;;-1:-1:-1;64960:298:0;;;;;:::i;:::-;;:::i;48797:233::-;;;;;;;;;;-1:-1:-1;48797:233:0;;;;;:::i;:::-;;:::i;69658:102::-;;;;;;;;;;-1:-1:-1;69658:102:0;;;;;:::i;:::-;;:::i;68982:118::-;;;;;;;;;;;;;:::i;61746:27::-;;;;;;;;;;;;;;;;32920:239;;;;;;;;;;-1:-1:-1;32920:239:0;;;;;:::i;:::-;;:::i;32650:208::-;;;;;;;;;;-1:-1:-1;32650:208:0;;;;;:::i;:::-;;:::i;12925:94::-;;;;;;;;;;;;;:::i;68210:104::-;;;;;;;;;;-1:-1:-1;68210:104:0;;;;;:::i;:::-;68265:4;68289:17;;;:8;:17;;;;;;;68210:104;66842:576;;;;;;;;;;;;;:::i;65593:371::-;;;;;;;;;;-1:-1:-1;65593:371:0;;;;;:::i;:::-;;:::i;12274:87::-;;;;;;;;;;-1:-1:-1;12347:6:0;;-1:-1:-1;;;;;12347:6:0;12274:87;;33395:104;;;;;;;;;;;;;:::i;35078:295::-;;;;;;;;;;-1:-1:-1;35078:295:0;;;;;:::i;:::-;;:::i;61710:29::-;;;;;;;;;;;;;;;;36341:328;;;;;;;;;;-1:-1:-1;36341:328:0;;;;;:::i;:::-;;:::i;61972:38::-;;;;;;;;;;-1:-1:-1;61972:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;63851:620;;;;;;:::i;:::-;;:::i;66613:217::-;;;;;;;;;;-1:-1:-1;66613:217:0;;;;;:::i;:::-;;:::i;62505:201::-;;;;;;;;;;-1:-1:-1;62505:201:0;;;;;:::i;:::-;;:::i;65270:315::-;;;;;;;;;;-1:-1:-1;65270:315:0;;;;;:::i;:::-;;:::i;61671:32::-;;;;;;;;;;;;;;;;64479:292;;;;;;;;;;-1:-1:-1;64479:292:0;;;;;:::i;:::-;;:::i;69768:108::-;;;;;;;;;;;;;:::i;61859:37::-;;;;;;;;;;-1:-1:-1;61859:37:0;;;;;:::i;:::-;;:::i;61929:36::-;;;;;;;;;;-1:-1:-1;61929:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;66033:98;;;;;;;;;;;;;:::i;61634:30::-;;;;;;;;;;;;;;;;62838:402;;;;;;;;;;-1:-1:-1;62838:402:0;;;;;:::i;:::-;;:::i;67829:108::-;;;;;;;;;;-1:-1:-1;67829:108:0;;;;;:::i;:::-;;:::i;13174:192::-;;;;;;;;;;-1:-1:-1;13174:192:0;;;;;:::i;:::-;;:::i;61401:36::-;;;;;;;;;;;;61435:2;61401:36;;62171:33;;;;;;;;;;;;;;;;69108:171;69211:4;69235:36;69259:11;69235:23;:36::i;:::-;69228:43;69108:171;-1:-1:-1;;69108:171:0:o;33226:100::-;33280:13;33313:5;33306:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33226:100;:::o;34785:221::-;34861:7;38268:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38268:16:0;34881:73;;;;-1:-1:-1;;;34881:73:0;;11203:2:1;34881:73:0;;;11185:21:1;11242:2;11222:18;;;11215:30;11281:34;11261:18;;;11254:62;11352:14;11332:18;;;11325:42;11384:19;;34881:73:0;;;;;;;;;-1:-1:-1;34974:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34974:24:0;;34785:221::o;66251:95::-;12505:12;:10;:12::i;:::-;-1:-1:-1;;;;;12494:23:0;:7;12347:6;;-1:-1:-1;;;;;12347:6:0;;12274:87;12494:7;-1:-1:-1;;;;;12494:23:0;;12486:68;;;;-1:-1:-1;;;12486:68:0;;11616:2:1;12486:68:0;;;11598:21:1;;;11635:18;;;11628:30;11694:34;11674:18;;;11667:62;11746:18;;12486:68:0;11414:356:1;12486:68:0;66319:19:::1;66324:13;;66319:4;:19::i;:::-;66303:13;:35:::0;66251:95::o;64797:155::-;12505:12;:10;:12::i;:::-;-1:-1:-1;;;;;12494:23:0;:7;12347:6;;-1:-1:-1;;;;;12347:6:0;;12274:87;12494:7;-1:-1:-1;;;;;12494:23:0;;12486:68;;;;-1:-1:-1;;;12486:68:0;;11616:2:1;12486:68:0;;;11598:21:1;;;11635:18;;;11628:30;11694:34;11674:18;;;11667:62;11746:18;;12486:68:0;11414:356:1;12486:68:0;64885:1:::1;64872:10;:14;64864:39;;;::::0;-1:-1:-1;;;64864:39:0;;11977:2:1;64864:39:0::1;::::0;::::1;11959:21:1::0;12016:2;11996:18;;;11989:30;12055:14;12035:18;;;12028:42;12087:18;;64864:39:0::1;11775:336:1::0;64864:39:0::1;64914:17;:30:::0;64797:155::o;34308:411::-;34389:13;34405:23;34420:7;34405:14;:23::i;:::-;34389:39;;34453:5;-1:-1:-1;;;;;34447:11:0;:2;-1:-1:-1;;;;;34447:11:0;;;34439:57;;;;-1:-1:-1;;;34439:57:0;;12318:2:1;34439:57:0;;;12300:21:1;12357:2;12337:18;;;12330:30;12396:34;12376:18;;;12369:62;12467:3;12447:18;;;12440:31;12488:19;;34439:57:0;12116:397:1;34439:57:0;34547:5;-1:-1:-1;;;;;34531:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;34531:21:0;;:62;;;;34556:37;34573:5;34580:12;:10;:12::i;34556:37::-;34509:168;;;;-1:-1:-1;;;34509:168:0;;12720:2:1;34509:168:0;;;12702:21:1;12759:2;12739:18;;;12732:30;12798:34;12778:18;;;12771:62;12869:26;12849:18;;;12842:54;12913:19;;34509:168:0;12518:420:1;34509:168:0;34690:21;34699:2;34703:7;34690:8;:21::i;:::-;34378:341;34308:411;;:::o;69582:67::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58401:1151::-;58659:152;;;58602:12;58659:152;;;;;-1:-1:-1;;;;;58697:19:0;;58627:29;58697:19;;;:6;:19;;;;;;;;;58659:152;;;;;;;;;;;58846:45;58704:11;58659:152;58874:4;58880;58886;58846:6;:45::i;:::-;58824:128;;;;-1:-1:-1;;;58824:128:0;;13145:2:1;58824:128:0;;;13127:21:1;13184:2;13164:18;;;13157:30;13223:34;13203:18;;;13196:62;13294:3;13274:18;;;13267:31;13315:19;;58824:128:0;12943:397:1;58824:128:0;-1:-1:-1;;;;;59041:19:0;;;;;;:6;:19;;;;;;:26;;59065:1;59041:23;:26::i;:::-;-1:-1:-1;;;;;59019:19:0;;;;;;:6;:19;;;;;;;:48;;;;59085:126;;;;;59026:11;;59157:10;;59183:17;;59085:126;:::i;:::-;;;;;;;;59322:12;59336:23;59371:4;-1:-1:-1;;;;;59363:18:0;59413:17;59432:11;59396:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;59396:48:0;;;;;;;;;;59363:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59321:134;;;;59474:7;59466:48;;;;-1:-1:-1;;;59466:48:0;;14706:2:1;59466:48:0;;;14688:21:1;14745:2;14725:18;;;14718:30;14784;14764:18;;;14757:58;14832:18;;59466:48:0;14504:352:1;59466:48:0;59534:10;58401:1151;-1:-1:-1;;;;;;;;58401:1151:0:o;66354:92::-;12505:12;:10;:12::i;:::-;-1:-1:-1;;;;;12494:23:0;:7;12347:6;;-1:-1:-1;;;;;12347:6:0;;12274:87;12494:7;-1:-1:-1;;;;;12494:23:0;;12486:68;;;;-1:-1:-1;;;12486:68:0;;11616:2:1;12486:68:0;;;11598:21:1;;;11635:18;;;11628:30;11694:34;11674:18;;;11667:62;11746:18;;12486:68:0;11414:356:1;12486:68:0;66421:17:::1;66426:11;;66421:4;:17::i;:::-;66407:11;:31:::0;66354:92::o;35675:339::-;35870:41;35889:12;:10;:12::i;:::-;35903:7;35870:18;:41::i;:::-;35862:103;;;;-1:-1:-1;;;35862:103:0;;15063:2:1;35862:103:0;;;15045:21:1;15102:2;15082:18;;;15075:30;15141:34;15121:18;;;15114:62;15212:19;15192:18;;;15185:47;15249:19;;35862:103:0;14861:413:1;35862:103:0;35978:28;35988:4;35994:2;35998:7;35978:9;:28::i;48275:256::-;48372:7;48408:23;48425:5;48408:16;:23::i;:::-;48400:5;:31;48392:87;;;;-1:-1:-1;;;48392:87:0;;15481:2:1;48392:87:0;;;15463:21:1;15520:2;15500:18;;;15493:30;15559:34;15539:18;;;15532:62;15630:13;15610:18;;;15603:41;15661:19;;48392:87:0;15279:407:1;48392:87:0;-1:-1:-1;;;;;;48497:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;48275:256::o;68581:332::-;68641:13;68667:15;68685:17;68695:6;68685:9;:17::i;:::-;68667:35;;68713:22;68749:10;68738:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68738:22:0;;68713:47;;68776:6;68771:109;68792:10;68788:1;:14;68771:109;;;68838:30;68858:6;68866:1;68838:19;:30::i;:::-;68824:8;68833:1;68824:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;68804:3;;;;:::i;:::-;;;;68771:109;;;-1:-1:-1;68897:8:0;68581:332;-1:-1:-1;;;68581:332:0:o;36085:185::-;36223:39;36240:4;36246:2;36250:7;36223:39;;;;;;;;;;;;:16;:39::i;44861:245::-;44979:41;44998:12;:10;:12::i;44979:41::-;44971:102;;;;-1:-1:-1;;;44971:102:0;;16411:2:1;44971:102:0;;;16393:21:1;16450:2;16430:18;;;16423:30;16489:34;16469:18;;;16462:62;16560:18;16540;;;16533:46;16596:19;;44971:102:0;16209:412:1;44971:102:0;45084:14;45090:7;45084:5;:14::i;:::-;44861:245;:::o;66139:104::-;12505:12;:10;:12::i;:::-;-1:-1:-1;;;;;12494:23:0;:7;12347:6;;-1:-1:-1;;;;;12347:6:0;;12274:87;12494:7;-1:-1:-1;;;;;12494:23:0;;12486:68;;;;-1:-1:-1;;;12486:68:0;;11616:2:1;12486:68:0;;;11598:21:1;;;11635:18;;;11628:30;11694:34;11674:18;;;11667:62;11746:18;;12486:68:0;11414:356:1;12486:68:0;66213:22:::1;66218:16;;66213:4;:22::i;:::-;66194:16;:41:::0;66139:104::o;64960:298::-;65014:41;65033:12;:10;:12::i;65014:41::-;65006:82;;;;-1:-1:-1;;;65006:82:0;;16828:2:1;65006:82:0;;;16810:21:1;16867:2;16847:18;;;16840:30;16906;16886:18;;;16879:58;16954:18;;65006:82:0;16626:352:1;65006:82:0;65107:15;;;;:6;:15;;;;;;:20;65099:48;;;;-1:-1:-1;;;65099:48:0;;17185:2:1;65099:48:0;;;17167:21:1;17224:2;17204:18;;;17197:30;17263:17;17243:18;;;17236:45;17298:18;;65099:48:0;16983:339:1;65099:48:0;65166:14;;65184:1;65166:19;65158:62;;;;-1:-1:-1;;;65158:62:0;;17529:2:1;65158:62:0;;;17511:21:1;17568:2;17548:18;;;17541:30;17607:32;17587:18;;;17580:60;17657:18;;65158:62:0;17327:354:1;65158:62:0;65231:15;;;;:6;:15;;;;;65249:1;65231:19;;64960:298::o;48797:233::-;48872:7;48908:30;48695:10;:17;;48607:113;48908:30;48900:5;:38;48892:95;;;;-1:-1:-1;;;48892:95:0;;17888:2:1;48892:95:0;;;17870:21:1;17927:2;17907:18;;;17900:30;17966:34;17946:18;;;17939:62;18037:14;18017:18;;;18010:42;18069:19;;48892:95:0;17686:408:1;48892:95:0;49005:10;49016:5;49005:17;;;;;;;;:::i;:::-;;;;;;;;;48998:24;;48797:233;;;:::o;69658:102::-;12505:12;:10;:12::i;:::-;-1:-1:-1;;;;;12494:23:0;:7;12347:6;;-1:-1:-1;;;;;12347:6:0;;12274:87;12494:7;-1:-1:-1;;;;;12494:23:0;;12486:68;;;;-1:-1:-1;;;12486:68:0;;11616:2:1;12486:68:0;;;11598:21:1;;;11635:18;;;11628:30;11694:34;11674:18;;;11667:62;11746:18;;12486:68:0;11414:356:1;12486:68:0;69729:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;:::-;;69658:102:::0;:::o;68982:118::-;69032:13;69065:27;69079:12;:10;:12::i;69065:27::-;69058:34;;68982:118;:::o;32920:239::-;32992:7;33028:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33028:16:0;33063:19;33055:73;;;;-1:-1:-1;;;33055:73:0;;18301:2:1;33055:73:0;;;18283:21:1;18340:2;18320:18;;;18313:30;18379:34;18359:18;;;18352:62;18450:11;18430:18;;;18423:39;18479:19;;33055:73:0;18099:405:1;32650:208:0;32722:7;-1:-1:-1;;;;;32750:19:0;;32742:74;;;;-1:-1:-1;;;32742:74:0;;18711:2:1;32742:74:0;;;18693:21:1;18750:2;18730:18;;;18723:30;18789:34;18769:18;;;18762:62;18860:12;18840:18;;;18833:40;18890:19;;32742:74:0;18509:406:1;32742:74:0;-1:-1:-1;;;;;;32834:16:0;;;;;:9;:16;;;;;;;32650:208::o;12925:94::-;12505:12;:10;:12::i;:::-;-1:-1:-1;;;;;12494:23:0;:7;12347:6;;-1:-1:-1;;;;;12347:6:0;;12274:87;12494:7;-1:-1:-1;;;;;12494:23:0;;12486:68;;;;-1:-1:-1;;;12486:68:0;;11616:2:1;12486:68:0;;;11598:21:1;;;11635:18;;;11628:30;11694:34;11674:18;;;11667:62;11746:18;;12486:68:0;11414:356:1;12486:68:0;12990:21:::1;13008:1;12990:9;:21::i;:::-;12925:94::o:0;66842:576::-;12505:12;:10;:12::i;:::-;-1:-1:-1;;;;;12494:23:0;:7;12347:6;;-1:-1:-1;;;;;12347:6:0;;12274:87;12494:7;-1:-1:-1;;;;;12494:23:0;;12486:68;;;;-1:-1:-1;;;12486:68:0;;11616:2:1;12486:68:0;;;11598:21:1;;;11635:18;;;11628:30;11694:34;11674:18;;;11667:62;11746:18;;12486:68:0;11414:356:1;12486:68:0;66908:21:::1;66948:11:::0;66940:45:::1;;;::::0;-1:-1:-1;;;66940:45:0;;19122:2:1;66940:45:0::1;::::0;::::1;19104:21:1::0;19161:2;19141:18;;;19134:30;19200:23;19180:18;;;19173:51;19241:18;;66940:45:0::1;18920:345:1::0;66940:45:0::1;67020:42;66996:21;67020:42:::0;67158:24:::1;67178:3;67158:15;:7:::0;67170:2:::1;67158:11;:15::i;:::-;:19:::0;::::1;:24::i;:::-;67132:55;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67112:75;;;67206:8;67198:41;;;::::0;-1:-1:-1;;;67198:41:0;;19682:2:1;67198:41:0::1;::::0;::::1;19664:21:1::0;19721:2;19701:18;;;19694:30;19760:22;19740:18;;;19733:50;19800:18;;67198:41:0::1;19480:344:1::0;67198:41:0::1;67309:49;::::0;67290:13:::1;::::0;67309:10:::1;::::0;67332:21:::1;::::0;67290:13;67309:49;67290:13;67309:49;67332:21;67309:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67289:69;;;67377:8;67369:41;;;::::0;-1:-1:-1;;;67369:41:0;;20031:2:1;67369:41:0::1;::::0;::::1;20013:21:1::0;20070:2;20050:18;;;20043:30;20109:22;20089:18;;;20082:50;20149:18;;67369:41:0::1;19829:344:1::0;67369:41:0::1;66882:536;;;;66842:576::o:0;65593:371::-;65647:41;65666:12;:10;:12::i;65647:41::-;65639:81;;;;-1:-1:-1;;;65639:81:0;;20380:2:1;65639:81:0;;;20362:21:1;20419:2;20399:18;;;20392:30;20458:29;20438:18;;;20431:57;20505:18;;65639:81:0;20178:351:1;65639:81:0;65739:14;;;;:5;:14;;;;;;:19;65731:46;;;;-1:-1:-1;;;65731:46:0;;20736:2:1;65731:46:0;;;20718:21:1;20775:2;20755:18;;;20748:30;20814:16;20794:18;;;20787:44;20848:18;;65731:46:0;20534:338:1;65731:46:0;65796:13;;65813:1;65796:18;65788:60;;;;-1:-1:-1;;;65788:60:0;;21079:2:1;65788:60:0;;;21061:21:1;21118:2;21098:18;;;21091:30;21157:31;21137:18;;;21130:59;21206:18;;65788:60:0;20877:353:1;65788:60:0;65859:14;;;;:5;:14;;;;;65876:1;65859:18;;;;65892:11;;:16;65888:69;;;65925:20;65937:7;65925:11;:20::i;33395:104::-;33451:13;33484:7;33477:14;;;;;:::i;35078:295::-;35193:12;:10;:12::i;:::-;-1:-1:-1;;;;;35181:24:0;:8;-1:-1:-1;;;;;35181:24:0;;;35173:62;;;;-1:-1:-1;;;35173:62:0;;21437:2:1;35173:62:0;;;21419:21:1;21476:2;21456:18;;;21449:30;21515:27;21495:18;;;21488:55;21560:18;;35173:62:0;21235:349:1;35173:62:0;35293:8;35248:18;:32;35267:12;:10;:12::i;:::-;-1:-1:-1;;;;;35248:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;35248:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;35248:53:0;;;;;;;;;;;35332:12;:10;:12::i;:::-;-1:-1:-1;;;;;35317:48:0;;35356:8;35317:48;;;;611:14:1;604:22;586:41;;574:2;559:18;;446:187;35317:48:0;;;;;;;;35078:295;;:::o;36341:328::-;36516:41;36535:12;:10;:12::i;:::-;36549:7;36516:18;:41::i;:::-;36508:103;;;;-1:-1:-1;;;36508:103:0;;15063:2:1;36508:103:0;;;15045:21:1;15102:2;15082:18;;;15075:30;15141:34;15121:18;;;15114:62;15212:19;15192:18;;;15185:47;15249:19;;36508:103:0;14861:413:1;36508:103:0;36622:39;36636:4;36642:2;36646:7;36655:5;36622:13;:39::i;63851:620::-;63949:10;63962:13;48695:10;:17;;48607:113;63962:13;63949:26;;63986:25;64014:12;:10;:12::i;:::-;63986:40;;64045:17;;64066:1;64045:22;;64037:48;;;;-1:-1:-1;;;64037:48:0;;21791:2:1;64037:48:0;;;21773:21:1;21830:2;21810:18;;;21803:30;21869:15;21849:18;;;21842:43;21902:18;;64037:48:0;21589:337:1;64037:48:0;61353:4;64104:14;64112:6;64104:5;:14;:::i;:::-;:27;;64096:66;;;;-1:-1:-1;;;64096:66:0;;22266:2:1;64096:66:0;;;22248:21:1;22305:2;22285:18;;;22278:30;22344:28;22324:18;;;22317:56;22390:18;;64096:66:0;22064:350:1;64096:66:0;64223:17;;-1:-1:-1;;;;;64181:29:0;;;;;;:10;:29;;;;;;:38;;64213:6;;64181:38;:::i;:::-;:59;;64173:96;;;;-1:-1:-1;;;64173:96:0;;22621:2:1;64173:96:0;;;22603:21:1;22660:2;22640:18;;;22633:30;22699:26;22679:18;;;22672:54;22743:18;;64173:96:0;22419:348:1;64173:96:0;64301:22;61515:10;64316:6;64301:14;:22::i;:::-;64288:9;:35;;64280:69;;;;-1:-1:-1;;;64280:69:0;;22974:2:1;64280:69:0;;;22956:21:1;23013:2;22993:18;;;22986:30;23052:23;23032:18;;;23025:51;23093:18;;64280:69:0;22772:345:1;64280:69:0;64381:24;;;;;;;;;;;;23349:25:1;;;23422:4;23410:17;;23390:18;;;23383:45;;;;23444:18;;;23437:34;;;23487:18;;;23480:34;;;64381:24:0;;23321:19:1;;64381:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64368:37:0;61245:42;-1:-1:-1;;;;;64368:37:0;;64360:60;;;;-1:-1:-1;;;64360:60:0;;23727:2:1;64360:60:0;;;23709:21:1;23766:2;23746:18;;;23739:30;23805:12;23785:18;;;23778:40;23835:18;;64360:60:0;23525:334:1;64360:60:0;64431:32;64437:17;64456:6;64431:5;:32::i;:::-;63938:533;;63851:620;;;;;:::o;66613:217::-;12505:12;:10;:12::i;:::-;-1:-1:-1;;;;;12494:23:0;:7;12347:6;;-1:-1:-1;;;;;12347:6:0;;12274:87;12494:7;-1:-1:-1;;;;;12494:23:0;;12486:68;;;;-1:-1:-1;;;12486:68:0;;11616:2:1;12486:68:0;;;11598:21:1;;;11635:18;;;11628:30;11694:34;11674:18;;;11667:62;11746:18;;12486:68:0;11414:356:1;12486:68:0;66724:6:::1;66719:104;66740:8;:15;66736:1;:19;66719:104;;;66798:10;66809:1;66798:13;;;;;;;;:::i;:::-;;;;;;;66777:5;:18;66783:8;66792:1;66783:11;;;;;;;;:::i;:::-;;;;;;;66777:18;;;;;;;;;;;:34;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;66757:3:0;::::1;::::0;::::1;:::i;:::-;;;;66719:104;;62505:201:::0;62597:13;62654:14;:12;:14::i;:::-;62670:26;62687:8;62670:16;:26::i;:::-;62637:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62623:75;;62505:201;;;:::o;65270:315::-;65328:41;65347:12;:10;:12::i;65328:41::-;65320:85;;;;-1:-1:-1;;;65320:85:0;;24541:2:1;65320:85:0;;;24523:21:1;24580:2;24560:18;;;24553:30;24619:33;24599:18;;;24592:61;24670:18;;65320:85:0;24339:355:1;65320:85:0;65424:17;;;;:8;:17;;;;;;:22;65416:52;;;;-1:-1:-1;;;65416:52:0;;24901:2:1;65416:52:0;;;24883:21:1;24940:2;24920:18;;;24913:30;24979:19;24959:18;;;24952:47;25016:18;;65416:52:0;24699:341:1;65416:52:0;65487:16;;65507:1;65487:21;65479:66;;;;-1:-1:-1;;;65479:66:0;;25247:2:1;65479:66:0;;;25229:21:1;;;25266:18;;;25259:30;25325:34;25305:18;;;25298:62;25377:18;;65479:66:0;25045:356:1;65479:66:0;65556:17;;;;:8;:17;;;;;65576:1;65556:21;;65270:315::o;64479:292::-;12505:12;:10;:12::i;:::-;-1:-1:-1;;;;;12494:23:0;:7;12347:6;;-1:-1:-1;;;;;12347:6:0;;12274:87;12494:7;-1:-1:-1;;;;;12494:23:0;;12486:68;;;;-1:-1:-1;;;12486:68:0;;11616:2:1;12486:68:0;;;11598:21:1;;;11635:18;;;11628:30;11694:34;11674:18;;;11667:62;11746:18;;12486:68:0;11414:356:1;12486:68:0;-1:-1:-1;;;;;64557:14:0;::::1;;::::0;;;:10:::1;:14;::::0;;;;;61435:2:::1;::::0;64557:23:::1;::::0;64574:6;;64557:23:::1;:::i;:::-;:37;;64549:72;;;::::0;-1:-1:-1;;;64549:72:0;;25608:2:1;64549:72:0::1;::::0;::::1;25590:21:1::0;25647:2;25627:18;;;25620:30;25686:24;25666:18;;;25659:52;25728:18;;64549:72:0::1;25406:346:1::0;64549:72:0::1;64632:10;64645:13;48695:10:::0;:17;;48607:113;64645:13:::1;64632:26:::0;-1:-1:-1;61353:4:0::1;64677:14;64685:6:::0;64632:26;64677:14:::1;:::i;:::-;:27;;64669:66;;;::::0;-1:-1:-1;;;64669:66:0;;22266:2:1;64669:66:0::1;::::0;::::1;22248:21:1::0;22305:2;22285:18;;;22278:30;22344:28;22324:18;;;22317:56;22390:18;;64669:66:0::1;22064:350:1::0;64669:66:0::1;64746:17;64752:2;64756:6;64746:5;:17::i;69768:108::-:0;69822:13;69855;69848:20;;;;;:::i;61859:37::-;;;;;;;;;;;;;;;;:::i;66033:98::-;12505:12;:10;:12::i;:::-;-1:-1:-1;;;;;12494:23:0;:7;12347:6;;-1:-1:-1;;;;;12347:6:0;;12274:87;12494:7;-1:-1:-1;;;;;12494:23:0;;12486:68;;;;-1:-1:-1;;;12486:68:0;;11616:2:1;12486:68:0;;;11598:21:1;;;11635:18;;;11628:30;11694:34;11674:18;;;11667:62;11746:18;;12486:68:0;11414:356:1;12486:68:0;66103:20:::1;66108:14;;66103:4;:20::i;:::-;66086:14;:37:::0;66033:98::o;62838:402::-;63051:20;;63095:28;;;;;-1:-1:-1;;;;;1920:55:1;;;63095:28:0;;;1902:74:1;62927:4:0;;63051:20;;;63087:49;;;;63051:20;;63095:21;;1875:18:1;;63095:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;63087:49:0;;63083:93;;;63160:4;63153:11;;;;;63083:93;-1:-1:-1;;;;;35565:25:0;;;35541:4;35565:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;63193:39;63186:46;62838:402;-1:-1:-1;;;;62838:402:0:o;67829:108::-;67915:14;;;;:5;:14;;;;;67908:21;;67882:13;;67915:14;67908:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67829:108;;;:::o;13174:192::-;12505:12;:10;:12::i;:::-;-1:-1:-1;;;;;12494:23:0;:7;12347:6;;-1:-1:-1;;;;;12347:6:0;;12274:87;12494:7;-1:-1:-1;;;;;12494:23:0;;12486:68;;;;-1:-1:-1;;;12486:68:0;;11616:2:1;12486:68:0;;;11598:21:1;;;11635:18;;;11628:30;11694:34;11674:18;;;11667:62;11746:18;;12486:68:0;11414:356:1;12486:68:0;-1:-1:-1;;;;;13263:22:0;::::1;13255:73;;;::::0;-1:-1:-1;;;13255:73:0;;26244:2:1;13255:73:0::1;::::0;::::1;26226:21:1::0;26283:2;26263:18;;;26256:30;26322:34;26302:18;;;26295:62;26393:8;26373:18;;;26366:36;26419:19;;13255:73:0::1;26042:402:1::0;13255:73:0::1;13339:19;13349:8;13339:9;:19::i;54775:523::-:0;54819:22;54858:10;54880:4;54858:27;54854:413;;;54902:18;54923:8;;54902:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;54962:8:0;55130:17;55124:24;-1:-1:-1;;;;;55120:73:0;;-1:-1:-1;54854:413:0;;-1:-1:-1;54854:413:0;;-1:-1:-1;55244:10:0;54854:413;54775:523;:::o;47967:224::-;48069:4;-1:-1:-1;;;;;;48093:50:0;;48108:35;48093:50;;:90;;;48147:36;48171:11;48147:23;:36::i;63384:120::-;63438:14;63472:24;:22;:24::i;66454:151::-;66507:4;66528:9;66541:1;66528:14;66524:55;;;-1:-1:-1;66566:1:0;;66454:151;-1:-1:-1;66454:151:0:o;66524:55::-;-1:-1:-1;66596:1:0;;66454:151;-1:-1:-1;66454:151:0:o;42161:174::-;42236:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;42236:29:0;-1:-1:-1;;;;;42236:29:0;;;;;;;;:24;;42290:23;42236:24;42290:14;:23::i;:::-;-1:-1:-1;;;;;42281:46:0;;;;;;;;;;;42161:174;;:::o;60093:486::-;60271:4;-1:-1:-1;;;;;60296:20:0;;60288:70;;;;-1:-1:-1;;;60288:70:0;;26651:2:1;60288:70:0;;;26633:21:1;26690:2;26670:18;;;26663:30;26729:34;26709:18;;;26702:62;26800:7;26780:18;;;26773:35;26825:19;;60288:70:0;26449:401:1;60288:70:0;60412:159;60440:47;60459:27;60479:6;60459:19;:27::i;:::-;60440:18;:47::i;:::-;60412:159;;;;;;;;;;;;23349:25:1;;;;23422:4;23410:17;;23390:18;;;23383:45;23444:18;;;23437:34;;;23487:18;;;23480:34;;;23321:19;;60412:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60389:182:0;:6;-1:-1:-1;;;;;60389:182:0;;60369:202;;60093:486;;;;;;;:::o;2792:98::-;2850:7;2877:5;2881:1;2877;:5;:::i;:::-;2870:12;2792:98;-1:-1:-1;;;2792:98:0:o;38473:348::-;38566:4;38268:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38268:16:0;38583:73;;;;-1:-1:-1;;;38583:73:0;;27057:2:1;38583:73:0;;;27039:21:1;27096:2;27076:18;;;27069:30;27135:34;27115:18;;;27108:62;27206:14;27186:18;;;27179:42;27238:19;;38583:73:0;26855:408:1;38583:73:0;38667:13;38683:23;38698:7;38683:14;:23::i;:::-;38667:39;;38736:5;-1:-1:-1;;;;;38725:16:0;:7;-1:-1:-1;;;;;38725:16:0;;:51;;;;38769:7;-1:-1:-1;;;;;38745:31:0;:20;38757:7;38745:11;:20::i;:::-;-1:-1:-1;;;;;38745:31:0;;38725:51;:87;;;;38780:32;38797:5;38804:7;38780:16;:32::i;41465:578::-;41624:4;-1:-1:-1;;;;;41597:31:0;:23;41612:7;41597:14;:23::i;:::-;-1:-1:-1;;;;;41597:31:0;;41589:85;;;;-1:-1:-1;;;41589:85:0;;27470:2:1;41589:85:0;;;27452:21:1;27509:2;27489:18;;;27482:30;27548:34;27528:18;;;27521:62;27619:11;27599:18;;;27592:39;27648:19;;41589:85:0;27268:405:1;41589:85:0;-1:-1:-1;;;;;41693:16:0;;41685:65;;;;-1:-1:-1;;;41685:65:0;;27880:2:1;41685:65:0;;;27862:21:1;27919:2;27899:18;;;27892:30;27958:34;27938:18;;;27931:62;28029:6;28009:18;;;28002:34;28053:19;;41685:65:0;27678:400:1;41685:65:0;41763:39;41784:4;41790:2;41794:7;41763:20;:39::i;:::-;41867:29;41884:1;41888:7;41867:8;:29::i;:::-;-1:-1:-1;;;;;41909:15:0;;;;;;:9;:15;;;;;:20;;41928:1;;41909:15;:20;;41928:1;;41909:20;:::i;:::-;;;;-1:-1:-1;;;;;;;41940:13:0;;;;;;:9;:13;;;;;:18;;41957:1;;41940:13;:18;;41957:1;;41940:18;:::i;:::-;;;;-1:-1:-1;;41969:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;41969:21:0;-1:-1:-1;;;;;41969:21:0;;;;;;;;;42008:27;;41969:16;;42008:27;;;;;;;41465:578;;;:::o;67612:122::-;12505:12;:10;:12::i;:::-;-1:-1:-1;;;;;12494:23:0;:7;12347:6;;-1:-1:-1;;;;;12347:6:0;;12274:87;12494:7;-1:-1:-1;;;;;12494:23:0;;12486:68;;;;-1:-1:-1;;;12486:68:0;;11616:2:1;12486:68:0;;;11598:21:1;;;11635:18;;;11628:30;11694:34;11674:18;;;11667:62;11746:18;;12486:68:0;11414:356:1;12486:68:0;67706:20:::1;67718:7;67706:11;:20::i;13374:173::-:0;13449:6;;;-1:-1:-1;;;;;13466:17:0;;;-1:-1:-1;;13466:17:0;;;;;;;13499:40;;13449:6;;;13466:17;13449:6;;13499:40;;13430:16;;13499:40;13419:128;13374:173;:::o;3530:98::-;3588:7;3615:5;3619:1;3615;:5;:::i;3929:98::-;3987:7;4014:5;4018:1;4014;:5;:::i;46824:206::-;46893:20;46905:7;46893:11;:20::i;:::-;46936:19;;;;:10;:19;;;;;46930:33;;;;;:::i;:::-;:38;;-1:-1:-1;46926:97:0;;46992:19;;;;:10;:19;;;;;46985:26;;;:::i;37551:315::-;37708:28;37718:4;37724:2;37728:7;37708:9;:28::i;:::-;37755:48;37778:4;37784:2;37788:7;37797:5;37755:22;:48::i;:::-;37747:111;;;;-1:-1:-1;;;37747:111:0;;28902:2:1;37747:111:0;;;28884:21:1;28941:2;28921:18;;;28914:30;28980:34;28960:18;;;28953:62;29051:20;29031:18;;;29024:48;29089:19;;37747:111:0;28700:414:1;63512:241:0;63575:6;63571:175;63591:6;63587:1;:10;63571:175;;;63618:27;:15;7985:19;;8003:1;7985:19;;;7896:127;63618:27;63660:40;63670:2;63674:25;:15;7866:14;;7774:114;63674:25;63660:9;:40::i;:::-;-1:-1:-1;;;;;63715:14:0;;;;;;:10;:14;;;;;:19;;63733:1;;63715:14;:19;;63733:1;;63715:19;:::i;:::-;;;;-1:-1:-1;63599:3:0;;-1:-1:-1;63599:3:0;;;:::i;:::-;;;;63571:175;;8678:723;8734:13;8955:10;8951:53;;-1:-1:-1;;8982:10:0;;;;;;;;;;;;;;;;;;8678:723::o;8951:53::-;9029:5;9014:12;9070:78;9077:9;;9070:78;;9103:8;;;;:::i;:::-;;-1:-1:-1;9126:10:0;;-1:-1:-1;9134:2:0;9126:10;;:::i;:::-;;;9070:78;;;9158:19;9190:6;9180:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9180:17:0;;9158:39;;9208:154;9215:10;;9208:154;;9242:11;9252:1;9242:11;;:::i;:::-;;-1:-1:-1;9311:10:0;9319:2;9311:5;:10;:::i;:::-;9298:24;;:2;:24;:::i;:::-;9285:39;;9268:6;9275;9268:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;9339:11:0;9348:2;9339:11;;:::i;:::-;;;9208:154;;32281:305;32383:4;-1:-1:-1;;;;;;32420:40:0;;32435:25;32420:40;;:105;;-1:-1:-1;;;;;;;32477:48:0;;32492:33;32477:48;32420:105;:158;;;-1:-1:-1;24384:25:0;-1:-1:-1;;;;;;24369:40:0;;;32542:36;24260:157;59560:410;59670:7;57737:100;;;;;;;;;;;;;;;;;57717:127;;;;;;;59824:12;;59859:11;;;;59903:24;;;;;59893:35;;;;;;59743:204;;;;;29467:25:1;;;29523:2;29508:18;;29501:34;;;;-1:-1:-1;;;;;29571:55:1;29566:2;29551:18;;29544:83;29658:2;29643:18;;29636:34;29454:3;29439:19;;29236:440;59743:204:0;;;;;;;;;;;;;59715:247;;;;;;59695:267;;59560:410;;;:::o;57314:258::-;57413:7;57515:20;56753:15;;;56675:101;57515:20;57486:63;;29951:66:1;57486:63:0;;;29939:79:1;30034:11;;;30027:27;;;;30070:12;;;30063:28;;;30107:12;;57486:63:0;29681:444:1;67426:178:0;67551:45;67578:4;67584:2;67588:7;67551:26;:45::i;40768:360::-;40828:13;40844:23;40859:7;40844:14;:23::i;:::-;40828:39;;40880:48;40901:5;40916:1;40920:7;40880:20;:48::i;:::-;40969:29;40986:1;40990:7;40969:8;:29::i;:::-;-1:-1:-1;;;;;41011:16:0;;;;;;:9;:16;;;;;:21;;41031:1;;41011:16;:21;;41031:1;;41011:21;:::i;:::-;;;;-1:-1:-1;;41050:16:0;;;;:7;:16;;;;;;41043:23;;-1:-1:-1;;41043:23:0;;;41084:36;41058:7;;41050:16;-1:-1:-1;;;;;41084:36:0;;;;;41050:16;;41084:36;40817:311;40768:360;:::o;42900:799::-;43055:4;-1:-1:-1;;;;;43076:13:0;;14643:20;14691:8;43072:620;;43128:2;-1:-1:-1;;;;;43112:36:0;;43149:12;:10;:12::i;:::-;43163:4;43169:7;43178:5;43112:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43112:72:0;;;;;;;;-1:-1:-1;;43112:72:0;;;;;;;;;;;;:::i;:::-;;;43108:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43354:13:0;;43350:272;;43397:60;;-1:-1:-1;;;43397:60:0;;28902:2:1;43397:60:0;;;28884:21:1;28941:2;28921:18;;;28914:30;28980:34;28960:18;;;28953:62;29051:20;29031:18;;;29024:48;29089:19;;43397:60:0;28700:414:1;43350:272:0;43572:6;43566:13;43557:6;43553:2;43549:15;43542:38;43108:529;-1:-1:-1;;;;;;43235:51:0;43245:41;43235:51;;-1:-1:-1;43228:58:0;;43072:620;-1:-1:-1;43676:4:0;42900:799;;;;;;:::o;39163:110::-;39239:26;39249:2;39253:7;39239:26;;;;;;;;;;;;:9;:26::i;49643:589::-;-1:-1:-1;;;;;49849:18:0;;49845:187;;49884:40;49916:7;51059:10;:17;;51032:24;;;;:15;:24;;;;;:44;;;51087:24;;;;;;;;;;;;50955:164;49884:40;49845:187;;;49954:2;-1:-1:-1;;;;;49946:10:0;:4;-1:-1:-1;;;;;49946:10:0;;49942:90;;49973:47;50006:4;50012:7;49973:32;:47::i;:::-;-1:-1:-1;;;;;50046:16:0;;50042:183;;50079:45;50116:7;50079:36;:45::i;50042:183::-;50152:4;-1:-1:-1;;;;;50146:10:0;:2;-1:-1:-1;;;;;50146:10:0;;50142:83;;50173:40;50201:2;50205:7;50173:27;:40::i;39500:321::-;39630:18;39636:2;39640:7;39630:5;:18::i;:::-;39681:54;39712:1;39716:2;39720:7;39729:5;39681:22;:54::i;:::-;39659:154;;;;-1:-1:-1;;;39659:154:0;;28902:2:1;39659:154:0;;;28884:21:1;28941:2;28921:18;;;28914:30;28980:34;28960:18;;;28953:62;29051:20;29031:18;;;29024:48;29089:19;;39659:154:0;28700:414:1;51746:988:0;52012:22;52062:1;52037:22;52054:4;52037:16;:22::i;:::-;:26;;;;:::i;:::-;52074:18;52095:26;;;:17;:26;;;;;;52012:51;;-1:-1:-1;52228:28:0;;;52224:328;;-1:-1:-1;;;;;52295:18:0;;52273:19;52295:18;;;:12;:18;;;;;;;;:34;;;;;;;;;52346:30;;;;;;:44;;;52463:30;;:17;:30;;;;;:43;;;52224:328;-1:-1:-1;52648:26:0;;;;:17;:26;;;;;;;;52641:33;;;-1:-1:-1;;;;;52692:18:0;;;;;:12;:18;;;;;:34;;;;;;;52685:41;51746:988::o;53029:1079::-;53307:10;:17;53282:22;;53307:21;;53327:1;;53307:21;:::i;:::-;53339:18;53360:24;;;:15;:24;;;;;;53733:10;:26;;53282:46;;-1:-1:-1;53360:24:0;;53282:46;;53733:26;;;;;;:::i;:::-;;;;;;;;;53711:48;;53797:11;53772:10;53783;53772:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;53877:28;;;:15;:28;;;;;;;:41;;;54049:24;;;;;54042:31;54084:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;53100:1008;;;53029:1079;:::o;50533:221::-;50618:14;50635:20;50652:2;50635:16;:20::i;:::-;-1:-1:-1;;;;;50666:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;50711:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;50533:221:0:o;40157:382::-;-1:-1:-1;;;;;40237:16:0;;40229:61;;;;-1:-1:-1;;;40229:61:0;;31292:2:1;40229:61:0;;;31274:21:1;;;31311:18;;;31304:30;31370:34;31350:18;;;31343:62;31422:18;;40229:61:0;31090:356:1;40229:61:0;38244:4;38268:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38268:16:0;:30;40301:58;;;;-1:-1:-1;;;40301:58:0;;31653:2:1;40301:58:0;;;31635:21:1;31692:2;31672:18;;;31665:30;31731;31711:18;;;31704:58;31779:18;;40301:58:0;31451:352:1;40301:58:0;40372:45;40401:1;40405:2;40409:7;40372:20;:45::i;:::-;-1:-1:-1;;;;;40430:13:0;;;;;;:9;:13;;;;;:18;;40447:1;;40430:13;:18;;40447:1;;40430:18;:::i;:::-;;;;-1:-1:-1;;40459:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;40459:21:0;-1:-1:-1;;;;;40459:21:0;;;;;;;;40498:33;;40459:16;;;40498:33;;40459:16;;40498:33;40157:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:1;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;820:258::-;892:1;902:113;916:6;913:1;910:13;902:113;;;992:11;;;986:18;973:11;;;966:39;938:2;931:10;902:113;;;1033:6;1030:1;1027:13;1024:48;;;-1:-1:-1;;1068:1:1;1050:16;;1043:27;820:258::o;1083:::-;1125:3;1163:5;1157:12;1190:6;1185:3;1178:19;1206:63;1262:6;1255:4;1250:3;1246:14;1239:4;1232:5;1228:16;1206:63;:::i;:::-;1323:2;1302:15;-1:-1:-1;;1298:29:1;1289:39;;;;1330:4;1285:50;;1083:258;-1:-1:-1;;1083:258:1:o;1346:220::-;1495:2;1484:9;1477:21;1458:4;1515:45;1556:2;1545:9;1541:18;1533:6;1515:45;:::i;1571:180::-;1630:6;1683:2;1671:9;1662:7;1658:23;1654:32;1651:52;;;1699:1;1696;1689:12;1651:52;-1:-1:-1;1722:23:1;;1571:180;-1:-1:-1;1571:180:1:o;1987:154::-;-1:-1:-1;;;;;2066:5:1;2062:54;2055:5;2052:65;2042:93;;2131:1;2128;2121:12;2146:315;2214:6;2222;2275:2;2263:9;2254:7;2250:23;2246:32;2243:52;;;2291:1;2288;2281:12;2243:52;2330:9;2317:23;2349:31;2374:5;2349:31;:::i;:::-;2399:5;2451:2;2436:18;;;;2423:32;;-1:-1:-1;;;2146:315:1:o;2466:184::-;-1:-1:-1;;;2515:1:1;2508:88;2615:4;2612:1;2605:15;2639:4;2636:1;2629:15;2655:275;2726:2;2720:9;2791:2;2772:13;;-1:-1:-1;;2768:27:1;2756:40;;2826:18;2811:34;;2847:22;;;2808:62;2805:88;;;2873:18;;:::i;:::-;2909:2;2902:22;2655:275;;-1:-1:-1;2655:275:1:o;2935:530::-;2977:5;3030:3;3023:4;3015:6;3011:17;3007:27;2997:55;;3048:1;3045;3038:12;2997:55;3084:6;3071:20;3110:18;3106:2;3103:26;3100:52;;;3132:18;;:::i;:::-;3176:55;3219:2;3200:13;;-1:-1:-1;;3196:27:1;3225:4;3192:38;3176:55;:::i;:::-;3256:2;3247:7;3240:19;3302:3;3295:4;3290:2;3282:6;3278:15;3274:26;3271:35;3268:55;;;3319:1;3316;3309:12;3268:55;3384:2;3377:4;3369:6;3365:17;3358:4;3349:7;3345:18;3332:55;3432:1;3407:16;;;3425:4;3403:27;3396:38;;;;3411:7;2935:530;-1:-1:-1;;;2935:530:1:o;3470:156::-;3536:20;;3596:4;3585:16;;3575:27;;3565:55;;3616:1;3613;3606:12;3565:55;3470:156;;;:::o;3631:663::-;3733:6;3741;3749;3757;3765;3818:3;3806:9;3797:7;3793:23;3789:33;3786:53;;;3835:1;3832;3825:12;3786:53;3874:9;3861:23;3893:31;3918:5;3893:31;:::i;:::-;3943:5;-1:-1:-1;3999:2:1;3984:18;;3971:32;4026:18;4015:30;;4012:50;;;4058:1;4055;4048:12;4012:50;4081:49;4122:7;4113:6;4102:9;4098:22;4081:49;:::i;:::-;4071:59;;;4177:2;4166:9;4162:18;4149:32;4139:42;;4228:2;4217:9;4213:18;4200:32;4190:42;;4251:37;4283:3;4272:9;4268:19;4251:37;:::i;:::-;4241:47;;3631:663;;;;;;;;:::o;4522:247::-;4581:6;4634:2;4622:9;4613:7;4609:23;4605:32;4602:52;;;4650:1;4647;4640:12;4602:52;4689:9;4676:23;4708:31;4733:5;4708:31;:::i;4956:456::-;5033:6;5041;5049;5102:2;5090:9;5081:7;5077:23;5073:32;5070:52;;;5118:1;5115;5108:12;5070:52;5157:9;5144:23;5176:31;5201:5;5176:31;:::i;:::-;5226:5;-1:-1:-1;5283:2:1;5268:18;;5255:32;5296:33;5255:32;5296:33;:::i;:::-;4956:456;;5348:7;;-1:-1:-1;;;5402:2:1;5387:18;;;;5374:32;;4956:456::o;5417:632::-;5588:2;5640:21;;;5710:13;;5613:18;;;5732:22;;;5559:4;;5588:2;5811:15;;;;5785:2;5770:18;;;5559:4;5854:169;5868:6;5865:1;5862:13;5854:169;;;5929:13;;5917:26;;5998:15;;;;5963:12;;;;5890:1;5883:9;5854:169;;;-1:-1:-1;6040:3:1;;5417:632;-1:-1:-1;;;;;;5417:632:1:o;6054:321::-;6123:6;6176:2;6164:9;6155:7;6151:23;6147:32;6144:52;;;6192:1;6189;6182:12;6144:52;6232:9;6219:23;6265:18;6257:6;6254:30;6251:50;;;6297:1;6294;6287:12;6251:50;6320:49;6361:7;6352:6;6341:9;6337:22;6320:49;:::i;6380:416::-;6445:6;6453;6506:2;6494:9;6485:7;6481:23;6477:32;6474:52;;;6522:1;6519;6512:12;6474:52;6561:9;6548:23;6580:31;6605:5;6580:31;:::i;:::-;6630:5;-1:-1:-1;6687:2:1;6672:18;;6659:32;6729:15;;6722:23;6710:36;;6700:64;;6760:1;6757;6750:12;6700:64;6783:7;6773:17;;;6380:416;;;;;:::o;6801:665::-;6896:6;6904;6912;6920;6973:3;6961:9;6952:7;6948:23;6944:33;6941:53;;;6990:1;6987;6980:12;6941:53;7029:9;7016:23;7048:31;7073:5;7048:31;:::i;:::-;7098:5;-1:-1:-1;7155:2:1;7140:18;;7127:32;7168:33;7127:32;7168:33;:::i;:::-;7220:7;-1:-1:-1;7274:2:1;7259:18;;7246:32;;-1:-1:-1;7329:2:1;7314:18;;7301:32;7356:18;7345:30;;7342:50;;;7388:1;7385;7378:12;7342:50;7411:49;7452:7;7443:6;7432:9;7428:22;7411:49;:::i;:::-;7401:59;;;6801:665;;;;;;;:::o;7471:456::-;7564:6;7572;7580;7588;7596;7649:3;7637:9;7628:7;7624:23;7620:33;7617:53;;;7666:1;7663;7656:12;7617:53;7702:9;7689:23;7679:33;;7731:36;7763:2;7752:9;7748:18;7731:36;:::i;:::-;7471:456;;7721:46;;-1:-1:-1;;;;7814:2:1;7799:18;;7786:32;;7865:2;7850:18;;7837:32;;7916:3;7901:19;;;7888:33;;-1:-1:-1;7471:456:1:o;7932:183::-;7992:4;8025:18;8017:6;8014:30;8011:56;;;8047:18;;:::i;:::-;-1:-1:-1;8092:1:1;8088:14;8104:4;8084:25;;7932:183::o;8120:887::-;8173:5;8226:3;8219:4;8211:6;8207:17;8203:27;8193:55;;8244:1;8241;8234:12;8193:55;8280:6;8267:20;8306:4;8330:60;8346:43;8386:2;8346:43;:::i;:::-;8330:60;:::i;:::-;8424:15;;;8510:1;8506:10;;;;8494:23;;8490:32;;;8455:12;;;;8534:15;;;8531:35;;;8562:1;8559;8552:12;8531:35;8598:2;8590:6;8586:15;8610:368;8626:6;8621:3;8618:15;8610:368;;;8712:3;8699:17;8748:18;8735:11;8732:35;8729:125;;;8808:1;8837:2;8833;8826:14;8729:125;8879:56;8931:3;8926:2;8912:11;8904:6;8900:24;8896:33;8879:56;:::i;:::-;8867:69;;-1:-1:-1;8956:12:1;;;;8643;;8610:368;;;-1:-1:-1;8996:5:1;8120:887;-1:-1:-1;;;;;;8120:887:1:o;9012:1149::-;9140:6;9148;9201:2;9189:9;9180:7;9176:23;9172:32;9169:52;;;9217:1;9214;9207:12;9169:52;9257:9;9244:23;9286:18;9327:2;9319:6;9316:14;9313:34;;;9343:1;9340;9333:12;9313:34;9381:6;9370:9;9366:22;9356:32;;9426:7;9419:4;9415:2;9411:13;9407:27;9397:55;;9448:1;9445;9438:12;9397:55;9484:2;9471:16;9506:4;9530:60;9546:43;9586:2;9546:43;:::i;9530:60::-;9624:15;;;9706:1;9702:10;;;;9694:19;;9690:28;;;9655:12;;;;9730:19;;;9727:39;;;9762:1;9759;9752:12;9727:39;9786:11;;;;9806:142;9822:6;9817:3;9814:15;9806:142;;;9888:17;;9876:30;;9839:12;;;;9926;;;;9806:142;;;9967:5;-1:-1:-1;;10010:18:1;;9997:32;;-1:-1:-1;;10041:16:1;;;10038:36;;;10070:1;10067;10060:12;10038:36;;10093:62;10147:7;10136:8;10125:9;10121:24;10093:62;:::i;:::-;10083:72;;;9012:1149;;;;;:::o;10166:388::-;10234:6;10242;10295:2;10283:9;10274:7;10270:23;10266:32;10263:52;;;10311:1;10308;10301:12;10263:52;10350:9;10337:23;10369:31;10394:5;10369:31;:::i;:::-;10419:5;-1:-1:-1;10476:2:1;10461:18;;10448:32;10489:33;10448:32;10489:33;:::i;10559:437::-;10638:1;10634:12;;;;10681;;;10702:61;;10756:4;10748:6;10744:17;10734:27;;10702:61;10809:2;10801:6;10798:14;10778:18;10775:38;10772:218;;;-1:-1:-1;;;10843:1:1;10836:88;10947:4;10944:1;10937:15;10975:4;10972:1;10965:15;10772:218;;10559:437;;;:::o;13345:455::-;13527:4;-1:-1:-1;;;;;13637:2:1;13629:6;13625:15;13614:9;13607:34;13689:2;13681:6;13677:15;13672:2;13661:9;13657:18;13650:43;;13729:2;13724;13713:9;13709:18;13702:30;13749:45;13790:2;13779:9;13775:18;13767:6;13749:45;:::i;:::-;13741:53;13345:455;-1:-1:-1;;;;;13345:455:1:o;13805:415::-;13962:3;14000:6;13994:13;14016:53;14062:6;14057:3;14050:4;14042:6;14038:17;14016:53;:::i;:::-;14138:2;14134:15;;;;-1:-1:-1;;14130:53:1;14091:16;;;;14116:68;;;14211:2;14200:14;;13805:415;-1:-1:-1;;13805:415:1:o;14225:274::-;14354:3;14392:6;14386:13;14408:53;14454:6;14449:3;14442:4;14434:6;14430:17;14408:53;:::i;:::-;14477:16;;;;;14225:274;-1:-1:-1;;14225:274:1:o;15691:184::-;-1:-1:-1;;;15740:1:1;15733:88;15840:4;15837:1;15830:15;15864:4;15861:1;15854:15;15880:184;-1:-1:-1;;;15929:1:1;15922:88;16029:4;16026:1;16019:15;16053:4;16050:1;16043:15;16069:135;16108:3;-1:-1:-1;;16129:17:1;;16126:43;;;16149:18;;:::i;:::-;-1:-1:-1;16196:1:1;16185:13;;16069:135::o;21931:128::-;21971:3;22002:1;21998:6;21995:1;21992:13;21989:39;;;22008:18;;:::i;:::-;-1:-1:-1;22044:9:1;;21931:128::o;23864:470::-;24043:3;24081:6;24075:13;24097:53;24143:6;24138:3;24131:4;24123:6;24119:17;24097:53;:::i;:::-;24213:13;;24172:16;;;;24235:57;24213:13;24172:16;24269:4;24257:17;;24235:57;:::i;:::-;24308:20;;23864:470;-1:-1:-1;;;;23864:470:1:o;25757:280::-;25856:6;25909:2;25897:9;25888:7;25884:23;25880:32;25877:52;;;25925:1;25922;25915:12;25877:52;25957:9;25951:16;25976:31;26001:5;25976:31;:::i;28083:125::-;28123:4;28151:1;28148;28145:8;28142:34;;;28156:18;;:::i;:::-;-1:-1:-1;28193:9:1;;28083:125::o;28213:168::-;28253:7;28319:1;28315;28311:6;28307:14;28304:1;28301:21;28296:1;28289:9;28282:17;28278:45;28275:71;;;28326:18;;:::i;:::-;-1:-1:-1;28366:9:1;;28213:168::o;28386:184::-;-1:-1:-1;;;28435:1:1;28428:88;28535:4;28532:1;28525:15;28559:4;28556:1;28549:15;28575:120;28615:1;28641;28631:35;;28646:18;;:::i;:::-;-1:-1:-1;28680:9:1;;28575:120::o;29119:112::-;29151:1;29177;29167:35;;29182:18;;:::i;:::-;-1:-1:-1;29216:9:1;;29119:112::o;30130:512::-;30324:4;-1:-1:-1;;;;;30434:2:1;30426:6;30422:15;30411:9;30404:34;30486:2;30478:6;30474:15;30469:2;30458:9;30454:18;30447:43;;30526:6;30521:2;30510:9;30506:18;30499:34;30569:3;30564:2;30553:9;30549:18;30542:31;30590:46;30631:3;30620:9;30616:19;30608:6;30590:46;:::i;:::-;30582:54;30130:512;-1:-1:-1;;;;;;30130:512:1:o;30647:249::-;30716:6;30769:2;30757:9;30748:7;30744:23;30740:32;30737:52;;;30785:1;30782;30775:12;30737:52;30817:9;30811:16;30836:30;30860:5;30836:30;:::i;30901:184::-;-1:-1:-1;;;30950:1:1;30943:88;31050:4;31047:1;31040:15;31074:4;31071:1;31064:15

Swarm Source

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