ETH Price: $2,423.78 (+3.03%)
Gas: 1.58 Gwei

Token

Bodega Blocks (BODEGA)
 

Overview

Max Total Supply

945 BODEGA

Holders

79

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
ruskibrat.eth
Balance
1 BODEGA
0x88135b385274c8ca3aa1322bf0afa15ea6fdec5c
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Bodega

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-28
*/

/**
 *Submitted for verification at Etherscan.io on 2022-11-27
*/

//SPDX-License-Identifier: MIT
pragma solidity 0.8.14;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function symbol() external view returns (string memory);

    function name() external view returns (string memory);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Returns the number of decimal places
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

/**
 * @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);
}

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

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

/**
 * @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);
}

/**
 * @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);
}

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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @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"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(
            data
        );
        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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

library SafeMath {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @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) {
        // 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 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

contract Ownable {
    address private owner;

    // event for EVM logging
    event OwnerSet(address indexed oldOwner, address indexed newOwner);

    // modifier to check if caller is owner
    modifier onlyOwner() {
        // If the first argument of 'require' evaluates to 'false', execution terminates and all
        // changes to the state and to Ether balances are reverted.
        // This used to consume all gas in old EVM versions, but not anymore.
        // It is often a good idea to use 'require' to check if functions are called correctly.
        // As a second argument, you can also provide an explanation about what went wrong.
        require(msg.sender == owner, "Caller is not owner");
        _;
    }

    /**
     * @dev Set contract deployer as owner
     */
    constructor() {
        owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor
        emit OwnerSet(address(0), owner);
    }

    /**
     * @dev Change owner
     * @param newOwner address of new owner
     */
    function changeOwner(address newOwner) public onlyOwner {
        emit OwnerSet(owner, newOwner);
        owner = newOwner;
    }

    /**
     * @dev Return owner address
     * @return address of owner
     */
    function getOwner() external view returns (address) {
        return owner;
    }
}

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

interface IClaimContract {
    function initRewards(uint256 tokenId) external;
}

interface ITetherSucks {
    function transfer(address recipient, uint256 amount) external;
    function transferFrom(address sender, address recipient, uint256 amount) external;
}

contract Bodega is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    ReentrancyGuard,
    Ownable
{
    using Address for address;
    using SafeMath for uint256;

    // Token name
    string private constant _name = "Bodega Blocks";

    // Token symbol
    string private constant _symbol = "BODEGA";

    // total number of NFTs Minted
    uint256 private _totalSupply;
    uint256 public currentSupplyIndex;

    // max supply cap
    uint256 public constant MAX_SUPPLY = 8_999;

    // USDT Contract 
    ITetherSucks public constant USDT = ITetherSucks(0xdAC17F958D2ee523a2206206994597C13D831ec7);

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

    // base URI
    string private baseURI = "temp_image";
    string private ending = ".json";

    // cost for minting NFT
    uint256 public costETH = 157 * 10**15;
    uint256 public costUSDT = 100 * 10**6;

    // total supply of each NFT
    uint256 public totalClass0;
    uint256 public totalClass1;
    uint256 public totalClass2;

    // constant break points
    uint256 public constant breakPoint0 = 111;
    uint256 public constant breakPoint1 = 1_222;

    // Enable Trading
    bool public tradingEnabled = false;
    bool public whitelistEnabled = true;

    // Merkle Root
    bytes32 public merkleRoot;

    // Claim Contract
    address public claimContract;

    // Whether or not to check allowed operator
    bool public checkAllowedOperator = true;

    // Toggle reveal
    bool public isRevealed = false;

    modifier canMint(uint256 numberOfMints) {
        require(tradingEnabled, "Trading Not Enabled");
        require(numberOfMints > 0, "Invalid Input");
        _;
    }

    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    constructor() {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        operatorFilterRegistry.registerAndSubscribe(address(this), 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);     
    }

    ////////////////////////////////////////////////
    ///////////     OWNER FUNCTIONS      ///////////
    ////////////////////////////////////////////////

    function setClaimContract(address newClaim) external onlyOwner {
        claimContract = newClaim;
    }

    function setCheckAllowedOperator(bool checkOperator) external onlyOwner {
        checkAllowedOperator = checkOperator;
    }

    function enableMinting() external onlyOwner {
        tradingEnabled = true;
    }

    function disableMinting() external onlyOwner {
        tradingEnabled = false;
    }

    function disableWhitelist() external onlyOwner {
        whitelistEnabled = false;
    }

    function enableWhitelist() external onlyOwner {
        whitelistEnabled = true;
    }

    function withdraw() external onlyOwner {
        (bool s, ) = payable(msg.sender).call{value: address(this).balance}("");
        require(s);
    }

    function withdrawToken(address token_) external onlyOwner {
        if (token_ == address(USDT)) {
            USDT.transfer(
                msg.sender, 
                IERC20(address(USDT)).balanceOf(address(this))
            );
        } else {
            IERC20(token_).transfer(
                msg.sender,
                IERC20(token_).balanceOf(address(this))
            );
        }
    }

    function setCostETH(uint256 newCostETH) external onlyOwner {
        costETH = newCostETH;
    }

    function setCostUSDT(uint256 newCostUSDT) external onlyOwner {
        costUSDT = newCostUSDT;
    }

    function setBaseURI(string calldata newURI) external onlyOwner {
        baseURI = newURI;
    }

    function setURIExtention(string calldata newExtention) external onlyOwner {
        ending = newExtention;
    }

    function setIsRevealed(bool isRevealed_) external onlyOwner {
        isRevealed = isRevealed_;
    }

    function setMerkleRoot(bytes32 merkleRoot_) external onlyOwner {
        merkleRoot = merkleRoot_;
    }

    function ownerMint(address[] calldata users, uint256[] calldata amounts)
        external
        onlyOwner
    {
        uint256 len = users.length;
        for (uint256 i = 0; i < len; ) {
            for (uint256 j = 0; j < amounts[i]; j++) {
                _safeMint(users[i], currentSupplyIndex);
            }
            unchecked {
                ++i;
            }
        }
    }

    ////////////////////////////////////////////////
    ///////////     PUBLIC FUNCTIONS     ///////////
    ////////////////////////////////////////////////

    /**
     * Mints `numberOfMints` NFTs To Caller
     */
    function mintFinalPortion(uint256 numberOfMints, bytes32[] calldata proof)
        external
        payable
        canMint(numberOfMints)
    {
        require(
            currentSupplyIndex >= breakPoint1, 
            "Mint Exceeds Breakpoint"
        );

        if (whitelistEnabled) {
            require(
                MerkleProof.verify(
                    proof,
                    merkleRoot,
                    keccak256(abi.encodePacked(_msgSender()))
                ),
                "User Is Not Whitelisted"
            );
        }

        _mintETH(numberOfMints);
    }

    /**
     * Mints `numberOfMints` NFTs To Caller
     */
    function mintFirstPortion(uint256 numberOfMints, bytes32[] calldata proof)
        external
        payable
        canMint(numberOfMints)
    {
        require(
            currentSupplyIndex + numberOfMints <= breakPoint1,
            "Mint Exceeds Breakpoint"
        );

        if (whitelistEnabled) {
            require(
                MerkleProof.verify(
                    proof,
                    merkleRoot,
                    keccak256(abi.encodePacked(_msgSender()))
                ),
                "User Is Not Whitelisted"
            );
        }

        _mintETH(numberOfMints);
    }

    /**
     * Mints `numberOfMints` NFTs To Caller
     */
    function mintUSDTFirstPortion(uint256 numberOfMints, bytes32[] calldata proof)
        external
        canMint(numberOfMints)
    {
        require(
            currentSupplyIndex + numberOfMints <= breakPoint1,
            "Mint Exceeds Breakpoint"
        );

        if (whitelistEnabled) {
            require(
                MerkleProof.verify(
                    proof,
                    merkleRoot,
                    keccak256(abi.encodePacked(_msgSender()))
                ),
                "User Is Not Whitelisted"
            );
        }

        _mintUSDT(numberOfMints);
    }

    /**
     * Mints `numberOfMints` NFTs To Caller
     */
    function mintUSDTFinalPortion(uint256 numberOfMints, bytes32[] calldata proof)
        external
        canMint(numberOfMints)
    {
        require(
            currentSupplyIndex >= breakPoint1, 
            "Mint Exceeds Breakpoint"
        );

        if (whitelistEnabled) {
            require(
                MerkleProof.verify(
                    proof,
                    merkleRoot,
                    keccak256(abi.encodePacked(_msgSender()))
                ),
                "User Is Not Whitelisted"
            );
        }

        _mintUSDT(numberOfMints);
    }

    function burn(uint256 tokenID) external {
        require(
            _isApprovedOrOwner(_msgSender(), tokenID),
            "caller not owner nor approved"
        );
        _burn(tokenID);
    }

    receive() external payable {}

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

        require(
            _msgSender() == wpowner || isApprovedForAll(wpowner, _msgSender()),
            "ERC721: not approved or owner"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address _operator, bool approved)
        public
        override
    {
        _setApprovalForAll(_msgSender(), _operator, approved);
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override onlyAllowedOperator(from) {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "caller not owner nor approved"
        );
        _transfer(from, to, tokenId);
    }

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

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

    ////////////////////////////////////////////////
    ///////////    INTERNAL FUNCTIONS    ///////////
    ////////////////////////////////////////////////

    function _mintETH(uint256 numberOfMints) internal {
        require(costETH * numberOfMints <= msg.value, "Incorrect Value Sent");
        for (uint256 i = 0; i < numberOfMints; ) {
            _safeMint(msg.sender, currentSupplyIndex);
            unchecked {
                ++i;
            }
        }
    }

    function _mintUSDT(uint256 numberOfMints) internal {
        uint val = costUSDT * numberOfMints;
        require(
            IERC20(address(USDT)).allowance(msg.sender, address(this)) >= val,
            'Insufficient Allowance'
        );
        require(
            IERC20(address(USDT)).balanceOf(msg.sender) >= val,
            'Insufficient Balance'
        );

        USDT.transferFrom(msg.sender, address(this), val);

        for (uint256 i = 0; i < numberOfMints; ) {
            _safeMint(msg.sender, currentSupplyIndex);
            unchecked {
                ++i;
            }
        }
    }

    /**
     * @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) internal {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, ""),
            "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 {
        require(!_exists(tokenId), "ERC721: token already minted");
        require(currentSupplyIndex < MAX_SUPPLY, "All NFTs Have Been Minted");

        // set owner of tokenId
        _owners[tokenId] = to;

        // Increment necessary values for tracking, no need to check for overflow
        unchecked {
            _balances[to]++;
            _totalSupply++;
            currentSupplyIndex++;
            if (tokenId < breakPoint0) {
                totalClass0++;
            } else if (tokenId < breakPoint1) {
                totalClass1++;
            } else {
                totalClass2++;
            }
        }

        // Cancel trading if breakpoint is exceeded
        if (currentSupplyIndex == breakPoint1) {
            tradingEnabled = false;
        }

        // init rewards
        IClaimContract(claimContract).initRewards(tokenId);

        // Emit initial ID transfer
        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 {
        require(_exists(tokenId), "Token Does Not Exist");

        // owner of token
        address _owner = ownerOf(tokenId);

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

        // decrement balance
        _balances[_owner] -= 1;
        delete _owners[tokenId];

        // decrement total supply
        _totalSupply -= 1;

        // decrement total class quantity
        if (tokenId < breakPoint0) {
            totalClass0--;
        } else if (tokenId < breakPoint1) {
            totalClass1--;
        } else {
            totalClass2--;
        }

        // emit transfer
        emit Transfer(_owner, address(0), tokenId);
    }

    /**
     * @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 {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: non ERC721Receiver implementer"
        );
    }

    /**
     * @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 nonReentrant {
        require(ownerOf(tokenId) == from, "Incorrect owner");
        require(to != address(0), "zero address");
        require(balanceOf(from) > 0, "Zero Balance");

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

        // Allocate balances
        _balances[from] = _balances[from].sub(1);
        _balances[to] += 1;
        _owners[tokenId] = to;

        // emit transfer
        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address wpowner,
        address _operator,
        bool approved
    ) internal {
        require(wpowner != _operator, "ERC721: approve to caller");
        _operatorApprovals[wpowner][_operator] = approved;
        emit ApprovalForAll(wpowner, _operator, approved);
    }

    ////////////////////////////////////////////////
    ///////////      READ FUNCTIONS      ///////////
    ////////////////////////////////////////////////

    function owner() external view returns (address) {
        return this.getOwner();
    }

    function totalSupply() external view returns (uint256) {
        return _totalSupply;
    }

    function getIDsByOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256[] memory ids = new uint256[](balanceOf(_owner));
        if (balanceOf(_owner) == 0) return ids;
        uint256 count = 0;
        for (uint256 i = 0; i < currentSupplyIndex; i++) {
            if (_owners[i] == _owner) {
                ids[count] = i;
                count++;
            }
        }
        return ids;
    }

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        
        if (isRevealed) {
            string memory idstr = uint2str(tokenId);
            string memory fHalf = string.concat(baseURI, idstr);
            return string.concat(fHalf, ending);
        } else {
            return string.concat(baseURI, ending);
        }
    }

    /**
        Converts A Uint Into a String
    */
    function uint2str(uint256 _i)
        internal
        pure
        returns (string memory _uintAsString)
    {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

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

        return _tokenApprovals[tokenId];
    }

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted
     */
    function _exists(uint256 tokenId) internal view 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
        returns (bool)
    {
        require(_exists(tokenId), "ERC721: nonexistent token");
        address wpowner = ownerOf(tokenId);
        return (spender == wpowner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(wpowner, spender));
    }

    function onReceivedRetval() public pure returns (bytes4) {
        return IERC721Receiver.onERC721Received.selector;
    }

    /**
     * @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: non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerSet","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":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDT","outputs":[{"internalType":"contract ITetherSucks","name":"","type":"address"}],"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":"wpowner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breakPoint0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breakPoint1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkAllowedOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costUSDT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupplyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getIDsByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wpowner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintFinalPortion","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintFirstPortion","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintUSDTFinalPortion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintUSDTFirstPortion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"onReceivedRetval","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"checkOperator","type":"bool"}],"name":"setCheckAllowedOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newClaim","type":"address"}],"name":"setClaimContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCostETH","type":"uint256"}],"name":"setCostETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCostUSDT","type":"uint256"}],"name":"setCostUSDT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isRevealed_","type":"bool"}],"name":"setIsRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newExtention","type":"string"}],"name":"setURIExtention","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClass0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClass1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClass2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"whitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600a60808190526974656d705f696d61676560b01b60a09081526200002d916008919062000164565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200005c9160099162000164565b5067022dc6ab0dbc8000600a556305f5e100600b55600f805461ffff19166101001790556011805461ffff60a01b1916600160a01b179055348015620000a157600080fd5b506001600081815581546001600160a01b031916339081179092556040517f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735908290a3604051633e9f1edf60e11b8152306004820152733cc6cdda760b79bafa08df41ecfa224f810dceb660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe90604401600060405180830381600087803b1580156200014557600080fd5b505af11580156200015a573d6000803e3d6000fd5b5050505062000246565b82805462000172906200020a565b90600052602060002090601f016020900481019282620001965760008555620001e1565b82601f10620001b157805160ff1916838001178555620001e1565b82800160010185558215620001e1579182015b82811115620001e1578251825591602001919060010190620001c4565b50620001ef929150620001f3565b5090565b5b80821115620001ef5760008155600101620001f4565b600181811c908216806200021f57607f821691505b6020821081036200024057634e487b7160e01b600052602260045260246000fd5b50919050565b6134fe80620002566000396000f3fe6080604052600436106103545760003560e01c806364e03b5c116101c657806395d89b41116100f7578063b88d4fde11610095578063cdfb2b4e1161006f578063cdfb2b4e1461098c578063d6b0f484146109a1578063e797ec1b146109b6578063e985e9c5146109cb57600080fd5b8063b88d4fde14610924578063c54e44eb14610944578063c87b56dd1461096c57600080fd5b8063a87b76d2116100d1578063a87b76d2146108b9578063ae589c91146108d9578063ae9843d6146108ec578063b36444c81461090e57600080fd5b806395d89b411461084a578063a22cb46514610879578063a6f9dae11461089957600080fd5b80637e5cd5c111610164578063894760691161013e57806389476069146107e95780638da5cb5b14610809578063903732231461081e57806391db3da51461083457600080fd5b80637e5cd5c1146107a0578063887c207a146107b5578063893d20e8146107cb57600080fd5b806367a594f6116101a057806367a594f61461072a57806369f7d2f21461074057806370a08231146107605780637cb647591461078057600080fd5b806364e03b5c146106d457806366345da4146106f457806367349ad81461071457600080fd5b806332cb6b0c116102a05780634ada218b1161023e57806355f804b31161021857806355f804b3146106525780635bf244be146106725780635ece6aa11461069f5780636352211e146106b457600080fd5b80634ada218b146105f857806351fb012d1461061257806354214f691461063157600080fd5b806342966c681161027a57806342966c68146105785780634408a0461461059857806349a5980a146105b85780634a30d3eb146105d857600080fd5b806332cb6b0c1461052d5780633ccfd60b1461054357806342842e0e1461055857600080fd5b80631cb97fe31161030d57806323b872dd116102e757806323b872dd146104b75780632a1e5315146104d75780632eb4a7ab146104f757806331ff37e91461050d57600080fd5b80631cb97fe3146104605780631d2c9bde146104805780631e263990146104a157600080fd5b806301ffc9a71461036057806306fdde0314610395578063081812fc146103d4578063095ea7b31461040c5780630f7772081461042e57806318160ddd1461044157600080fd5b3661035b57005b600080fd5b34801561036c57600080fd5b5061038061037b366004612c48565b610a14565b60405190151581526020015b60405180910390f35b3480156103a157600080fd5b5060408051808201909152600d81526c426f6465676120426c6f636b7360981b60208201525b60405161038c9190612cbd565b3480156103e057600080fd5b506103f46103ef366004612cd0565b610a66565b6040516001600160a01b03909116815260200161038c565b34801561041857600080fd5b5061042c610427366004612cfe565b610af7565b005b61042c61043c366004612d76565b610be6565b34801561044d57600080fd5b506002545b60405190815260200161038c565b34801561046c57600080fd5b5061042c61047b366004612d76565b610d33565b34801561048c57600080fd5b5060115461038090600160a01b900460ff1681565b3480156104ad57600080fd5b5061045260035481565b3480156104c357600080fd5b5061042c6104d2366004612dc2565b610e46565b3480156104e357600080fd5b5061042c6104f2366004612cd0565b610fe8565b34801561050357600080fd5b5061045260105481565b34801561051957600080fd5b5061042c610528366004612cd0565b611017565b34801561053957600080fd5b5061045261232781565b34801561054f57600080fd5b5061042c611046565b34801561056457600080fd5b5061042c610573366004612dc2565b6110c8565b34801561058457600080fd5b5061042c610593366004612cd0565b611239565b3480156105a457600080fd5b5061042c6105b3366004612e03565b611268565b3480156105c457600080fd5b5061042c6105d3366004612e83565b61129e565b3480156105e457600080fd5b5061042c6105f3366004612ea0565b6112e6565b34801561060457600080fd5b50600f546103809060ff1681565b34801561061e57600080fd5b50600f5461038090610100900460ff1681565b34801561063d57600080fd5b5060115461038090600160a81b900460ff1681565b34801561065e57600080fd5b5061042c61066d366004612e03565b611332565b34801561067e57600080fd5b5061069261068d366004612ea0565b611368565b60405161038c9190612ebd565b3480156106ab57600080fd5b50610452606f81565b3480156106c057600080fd5b506103f46106cf366004612cd0565b611445565b3480156106e057600080fd5b5061042c6106ef366004612d76565b6114aa565b34801561070057600080fd5b506011546103f4906001600160a01b031681565b34801561072057600080fd5b50610452600e5481565b34801561073657600080fd5b50610452600d5481565b34801561074c57600080fd5b5061042c61075b366004612f01565b611512565b34801561076c57600080fd5b5061045261077b366004612ea0565b6115c0565b34801561078c57600080fd5b5061042c61079b366004612cd0565b611634565b3480156107ac57600080fd5b5061042c611663565b3480156107c157600080fd5b506104526104c681565b3480156107d757600080fd5b506001546001600160a01b03166103f4565b3480156107f557600080fd5b5061042c610804366004612ea0565b611699565b34801561081557600080fd5b506103f46118ab565b34801561082a57600080fd5b50610452600b5481565b34801561084057600080fd5b50610452600a5481565b34801561085657600080fd5b50604080518082019091526006815265424f4445474160d01b60208201526103c7565b34801561088557600080fd5b5061042c610894366004612f6d565b611914565b3480156108a557600080fd5b5061042c6108b4366004612ea0565b61191f565b3480156108c557600080fd5b5061042c6108d4366004612e83565b6119a5565b61042c6108e7366004612d76565b6119ed565b3480156108f857600080fd5b50604051630a85bd0160e11b815260200161038c565b34801561091a57600080fd5b50610452600c5481565b34801561093057600080fd5b5061042c61093f366004612fbc565b611a60565b34801561095057600080fd5b506103f473dac17f958d2ee523a2206206994597c13d831ec781565b34801561097857600080fd5b506103c7610987366004612cd0565b611c04565b34801561099857600080fd5b5061042c611ca4565b3480156109ad57600080fd5b5061042c611cdf565b3480156109c257600080fd5b5061042c611d16565b3480156109d757600080fd5b506103806109e636600461309c565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b60006001600160e01b031982166380ac58cd60e01b1480610a4557506001600160e01b03198216635b5e139f60e01b145b80610a6057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000818152600460205260408120546001600160a01b0316610adb5760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b0282611445565b9050806001600160a01b0316836001600160a01b031603610b6f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ad2565b336001600160a01b0382161480610b8b5750610b8b81336109e6565b610bd75760405162461bcd60e51b815260206004820152601d60248201527f4552433732313a206e6f7420617070726f766564206f72206f776e65720000006044820152606401610ad2565b610be18383611d4f565b505050565b600f54839060ff16610c0a5760405162461bcd60e51b8152600401610ad2906130ca565b60008111610c2a5760405162461bcd60e51b8152600401610ad2906130f7565b6104c66003541015610c4e5760405162461bcd60e51b8152600401610ad29061311e565b600f54610100900460ff1615610d2457610cde8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060105491503390505b604051602001610cc3919060609190911b6bffffffffffffffffffffffff1916815260140190565b60405160208183030381529060405280519060200120611dbd565b610d245760405162461bcd60e51b8152602060048201526017602482015276155cd95c88125cc8139bdd0815da1a5d195b1a5cdd1959604a1b6044820152606401610ad2565b610d2d84611dd3565b50505050565b600f54839060ff16610d575760405162461bcd60e51b8152600401610ad2906130ca565b60008111610d775760405162461bcd60e51b8152600401610ad2906130f7565b6104c684600354610d88919061316b565b1115610da65760405162461bcd60e51b8152600401610ad29061311e565b600f54610100900460ff1615610e3d57610df7838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506010549150339050610c9b565b610e3d5760405162461bcd60e51b8152602060048201526017602482015276155cd95c88125cc8139bdd0815da1a5d195b1a5cdd1959604a1b6044820152606401610ad2565b610d2d84611e46565b826daaeb6d7670e522a718067333cd4e3b15610fb857336001600160a01b03821603610ea357610e77335b83612065565b610e935760405162461bcd60e51b8152600401610ad290613183565b610e9e848484612147565b610d2d565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1691906131ba565b8015610f995750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610f75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9991906131ba565b610fb857604051633b79c77360e21b8152336004820152602401610ad2565b610fc133610e71565b610fdd5760405162461bcd60e51b8152600401610ad290613183565b610d2d848484612147565b6001546001600160a01b031633146110125760405162461bcd60e51b8152600401610ad2906131d7565b600a55565b6001546001600160a01b031633146110415760405162461bcd60e51b8152600401610ad2906131d7565b600b55565b6001546001600160a01b031633146110705760405162461bcd60e51b8152600401610ad2906131d7565b604051600090339047908381818185875af1925050503d80600081146110b2576040519150601f19603f3d011682016040523d82523d6000602084013e6110b7565b606091505b50509050806110c557600080fd5b50565b826daaeb6d7670e522a718067333cd4e3b1561121e57336001600160a01b0382160361110957610e9e84848460405180602001604052806000815250611a60565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117c91906131ba565b80156111ff5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156111db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ff91906131ba565b61121e57604051633b79c77360e21b8152336004820152602401610ad2565b610d2d84848460405180602001604052806000815250611a60565b6112433382612065565b61125f5760405162461bcd60e51b8152600401610ad290613183565b6110c581612351565b6001546001600160a01b031633146112925760405162461bcd60e51b8152600401610ad2906131d7565b610be160098383612b99565b6001546001600160a01b031633146112c85760405162461bcd60e51b8152600401610ad2906131d7565b60118054911515600160a81b0260ff60a81b19909216919091179055565b6001546001600160a01b031633146113105760405162461bcd60e51b8152600401610ad2906131d7565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461135c5760405162461bcd60e51b8152600401610ad2906131d7565b610be160088383612b99565b60606000611375836115c0565b67ffffffffffffffff81111561138d5761138d612fa6565b6040519080825280602002602001820160405280156113b6578160200160208202803683370190505b5090506113c2836115c0565b6000036113cf5792915050565b6000805b60035481101561143c576000818152600460205260409020546001600160a01b0380871691160361142a578083838151811061141157611411613204565b6020908102919091010152816114268161321a565b9250505b806114348161321a565b9150506113d3565b50909392505050565b6000818152600460205260408120546001600160a01b031680610a605760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610ad2565b600f54839060ff166114ce5760405162461bcd60e51b8152600401610ad2906130ca565b600081116114ee5760405162461bcd60e51b8152600401610ad2906130f7565b6104c66003541015610da65760405162461bcd60e51b8152600401610ad29061311e565b6001546001600160a01b0316331461153c5760405162461bcd60e51b8152600401610ad2906131d7565b8260005b818110156115b85760005b84848381811061155d5761155d613204565b905060200201358110156115af5761159d87878481811061158057611580613204565b90506020020160208101906115959190612ea0565b6003546124b5565b806115a78161321a565b91505061154b565b50600101611540565b505050505050565b60006001600160a01b0382166116185760405162461bcd60e51b815260206004820152601a60248201527f717565727920666f7220746865207a65726f20616464726573730000000000006044820152606401610ad2565b506001600160a01b031660009081526005602052604090205490565b6001546001600160a01b0316331461165e5760405162461bcd60e51b8152600401610ad2906131d7565b601055565b6001546001600160a01b0316331461168d5760405162461bcd60e51b8152600401610ad2906131d7565b600f805460ff19169055565b6001546001600160a01b031633146116c35760405162461bcd60e51b8152600401610ad2906131d7565b73dac17f958d2ee523a2206206994597c13d831ec6196001600160a01b038216016117c6576040516370a0823160e01b815230600482015273dac17f958d2ee523a2206206994597c13d831ec79063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611741573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117659190613233565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156117ab57600080fd5b505af11580156117bf573d6000803e3d6000fd5b5050505050565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118389190613233565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a791906131ba565b5050565b6000306001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190f919061324c565b905090565b6118a7338383612542565b6001546001600160a01b031633146119495760405162461bcd60e51b8152600401610ad2906131d7565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146119cf5760405162461bcd60e51b8152600401610ad2906131d7565b60118054911515600160a01b0260ff60a01b19909216919091179055565b600f54839060ff16611a115760405162461bcd60e51b8152600401610ad2906130ca565b60008111611a315760405162461bcd60e51b8152600401610ad2906130f7565b6104c684600354611a42919061316b565b1115610c4e5760405162461bcd60e51b8152600401610ad29061311e565b836daaeb6d7670e522a718067333cd4e3b15611bd357336001600160a01b03821603611abe57611a91335b84612065565b611aad5760405162461bcd60e51b8152600401610ad290613183565b611ab985858585612610565b6117bf565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3191906131ba565b8015611bb45750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611b90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb491906131ba565b611bd357604051633b79c77360e21b8152336004820152602401610ad2565b611bdc33611a8b565b611bf85760405162461bcd60e51b8152600401610ad290613183565b6117bf85858585612610565b601154606090600160a81b900460ff1615611c79576000611c2483612643565b90506000600882604051602001611c3c92919061333c565b6040516020818303038152906040529050806009604051602001611c61929190613361565b60405160208183030381529060405292505050919050565b60086009604051602001611c8e92919061337f565b6040516020818303038152906040529050919050565b6001546001600160a01b03163314611cce5760405162461bcd60e51b8152600401610ad2906131d7565b600f805461ff001916610100179055565b6001546001600160a01b03163314611d095760405162461bcd60e51b8152600401610ad2906131d7565b600f805461ff0019169055565b6001546001600160a01b03163314611d405760405162461bcd60e51b8152600401610ad2906131d7565b600f805460ff19166001179055565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d8482611445565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600082611dca858461276f565b14949350505050565b3481600a54611de29190613394565b1115611e275760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0815985b1d594814d95b9d60621b6044820152606401610ad2565b60005b818110156118a757611e3e336003546124b5565b600101611e2a565b600081600b54611e569190613394565b604051636eb1769f60e11b8152336004820152306024820152909150819073dac17f958d2ee523a2206206994597c13d831ec79063dd62ed3e90604401602060405180830381865afa158015611eb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed49190613233565b1015611f1b5760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420416c6c6f77616e636560501b6044820152606401610ad2565b6040516370a0823160e01b8152336004820152819073dac17f958d2ee523a2206206994597c13d831ec7906370a0823190602401602060405180830381865afa158015611f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f909190613233565b1015611fd55760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b6044820152606401610ad2565b6040516323b872dd60e01b81523360048201523060248201526044810182905273dac17f958d2ee523a2206206994597c13d831ec7906323b872dd90606401600060405180830381600087803b15801561202e57600080fd5b505af1158015612042573d6000803e3d6000fd5b5050505060005b82811015610be15761205d336003546124b5565b600101612049565b6000818152600460205260408120546001600160a01b03166120c95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610ad2565b60006120d483611445565b9050806001600160a01b0316846001600160a01b0316148061210f5750836001600160a01b031661210484610a66565b6001600160a01b0316145b8061213f57506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b6002600054036121995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ad2565b60026000556001600160a01b0383166121b182611445565b6001600160a01b0316146121f95760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba1037bbb732b960891b6044820152606401610ad2565b6001600160a01b03821661223e5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610ad2565b6000612249846115c0565b116122855760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b6044820152606401610ad2565b612290600082611d4f565b6001600160a01b0383166000908152600560205260409020546122b49060016127e3565b6001600160a01b038085166000908152600560205260408082209390935590841681529081208054600192906122eb90849061316b565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050600160005550565b6000818152600460205260409020546001600160a01b03166123ac5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88111bd95cc8139bdd08115e1a5cdd60621b6044820152606401610ad2565b60006123b782611445565b90506123c4600083611d4f565b6001600160a01b03811660009081526005602052604081208054600192906123ed9084906133b3565b9091555050600082815260046020526040812080546001600160a01b031916905560028054600192906124219084906133b3565b9091555050606f82101561244957600c805490600061243f836133ca565b9190505550612479565b6104c682101561246357600d805490600061243f836133ca565b600e8054906000612473836133ca565b91905055505b60405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6124bf828261282c565b6124db6000838360405180602001604052806000815250612a1e565b6118a75760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610ad2565b816001600160a01b0316836001600160a01b0316036125a35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ad2565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61261b848484612147565b61262784848484612a1e565b610d2d5760405162461bcd60e51b8152600401610ad2906133e1565b60608160000361266a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612694578061267e8161321a565b915061268d9050600a83613427565b915061266e565b60008167ffffffffffffffff8111156126af576126af612fa6565b6040519080825280601f01601f1916602001820160405280156126d9576020820181803683370190505b509050815b8515612766576126ef6001826133b3565b905060006126fe600a88613427565b61270990600a613394565b61271390886133b3565b61271e906030613449565b905060008160f81b90508084848151811061273b5761273b613204565b60200101906001600160f81b031916908160001a90535061275d600a89613427565b975050506126de565b50949350505050565b600081815b84518110156127db57600085828151811061279157612791613204565b602002602001015190508083116127b757600083815260208290526040902092506127c8565b600081815260208490526040902092505b50806127d38161321a565b915050612774565b509392505050565b600061282583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b26565b9392505050565b6000818152600460205260409020546001600160a01b0316156128915760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ad2565b612327600354106128e45760405162461bcd60e51b815260206004820152601960248201527f416c6c204e4654732048617665204265656e204d696e746564000000000000006044820152606401610ad2565b600081815260046020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260059091529020805460019081019091556002805482019055600380549091019055606f81101561294c57600c8054600101905561296e565b6104c681101561296457600d8054600101905561296e565b600e805460010190555b6104c66003540361298457600f805460ff191690555b601154604051636c65b9ad60e11b8152600481018390526001600160a01b039091169063d8cb735a90602401600060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b50506040518392506001600160a01b03851691506000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612a32846001600160a01b0316612b60565b15612b1b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a6990339089908890889060040161346e565b6020604051808303816000875af1925050508015612aa4575060408051601f3d908101601f19168201909252612aa1918101906134ab565b60015b612b01573d808015612ad2576040519150601f19603f3d011682016040523d82523d6000602084013e612ad7565b606091505b508051600003612af95760405162461bcd60e51b8152600401610ad2906133e1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061213f565b506001949350505050565b60008184841115612b4a5760405162461bcd60e51b8152600401610ad29190612cbd565b506000612b5784866133b3565b95945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061213f575050151592915050565b828054612ba590613269565b90600052602060002090601f016020900481019282612bc75760008555612c0d565b82601f10612be05782800160ff19823516178555612c0d565b82800160010185558215612c0d579182015b82811115612c0d578235825591602001919060010190612bf2565b50612c19929150612c1d565b5090565b5b80821115612c195760008155600101612c1e565b6001600160e01b0319811681146110c557600080fd5b600060208284031215612c5a57600080fd5b813561282581612c32565b60005b83811015612c80578181015183820152602001612c68565b83811115610d2d5750506000910152565b60008151808452612ca9816020860160208601612c65565b601f01601f19169290920160200192915050565b6020815260006128256020830184612c91565b600060208284031215612ce257600080fd5b5035919050565b6001600160a01b03811681146110c557600080fd5b60008060408385031215612d1157600080fd5b8235612d1c81612ce9565b946020939093013593505050565b60008083601f840112612d3c57600080fd5b50813567ffffffffffffffff811115612d5457600080fd5b6020830191508360208260051b8501011115612d6f57600080fd5b9250929050565b600080600060408486031215612d8b57600080fd5b83359250602084013567ffffffffffffffff811115612da957600080fd5b612db586828701612d2a565b9497909650939450505050565b600080600060608486031215612dd757600080fd5b8335612de281612ce9565b92506020840135612df281612ce9565b929592945050506040919091013590565b60008060208385031215612e1657600080fd5b823567ffffffffffffffff80821115612e2e57600080fd5b818501915085601f830112612e4257600080fd5b813581811115612e5157600080fd5b866020828501011115612e6357600080fd5b60209290920196919550909350505050565b80151581146110c557600080fd5b600060208284031215612e9557600080fd5b813561282581612e75565b600060208284031215612eb257600080fd5b813561282581612ce9565b6020808252825182820181905260009190848201906040850190845b81811015612ef557835183529284019291840191600101612ed9565b50909695505050505050565b60008060008060408587031215612f1757600080fd5b843567ffffffffffffffff80821115612f2f57600080fd5b612f3b88838901612d2a565b90965094506020870135915080821115612f5457600080fd5b50612f6187828801612d2a565b95989497509550505050565b60008060408385031215612f8057600080fd5b8235612f8b81612ce9565b91506020830135612f9b81612e75565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612fd257600080fd5b8435612fdd81612ce9565b93506020850135612fed81612ce9565b925060408501359150606085013567ffffffffffffffff8082111561301157600080fd5b818701915087601f83011261302557600080fd5b81358181111561303757613037612fa6565b604051601f8201601f19908116603f0116810190838211818310171561305f5761305f612fa6565b816040528281528a602084870101111561307857600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156130af57600080fd5b82356130ba81612ce9565b91506020830135612f9b81612ce9565b602080825260139082015272151c98591a5b99c8139bdd08115b98589b1959606a1b604082015260600190565b6020808252600d908201526c125b9d985b1a5908125b9c1d5d609a1b604082015260600190565b60208082526017908201527f4d696e74204578636565647320427265616b706f696e74000000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561317e5761317e613155565b500190565b6020808252601d908201527f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000604082015260600190565b6000602082840312156131cc57600080fd5b815161282581612e75565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161322c5761322c613155565b5060010190565b60006020828403121561324557600080fd5b5051919050565b60006020828403121561325e57600080fd5b815161282581612ce9565b600181811c9082168061327d57607f821691505b60208210810361329d57634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c90808316806132bd57607f831692505b602080841082036132de57634e487b7160e01b600052602260045260246000fd5b8180156132f2576001811461330357613330565b60ff19861689528489019650613330565b60008881526020902060005b868110156133285781548b82015290850190830161330f565b505084890196505b50505050505092915050565b600061334882856132a3565b8351613358818360208801612c65565b01949350505050565b60008351613373818460208801612c65565b612b57818401856132a3565b600061213f61338e83866132a3565b846132a3565b60008160001904831182151516156133ae576133ae613155565b500290565b6000828210156133c5576133c5613155565b500390565b6000816133d9576133d9613155565b506000190190565b60208082526026908201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560408201526536b2b73a32b960d11b606082015260800190565b60008261344457634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff0382111561346657613466613155565b019392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134a190830184612c91565b9695505050505050565b6000602082840312156134bd57600080fd5b815161282581612c3256fea264697066735822122080cc6369d2ce74999ac86cf97803a0258f8c7a5524ce0c3a7d7574e58f8d519c64736f6c634300080e0033

Deployed Bytecode

0x6080604052600436106103545760003560e01c806364e03b5c116101c657806395d89b41116100f7578063b88d4fde11610095578063cdfb2b4e1161006f578063cdfb2b4e1461098c578063d6b0f484146109a1578063e797ec1b146109b6578063e985e9c5146109cb57600080fd5b8063b88d4fde14610924578063c54e44eb14610944578063c87b56dd1461096c57600080fd5b8063a87b76d2116100d1578063a87b76d2146108b9578063ae589c91146108d9578063ae9843d6146108ec578063b36444c81461090e57600080fd5b806395d89b411461084a578063a22cb46514610879578063a6f9dae11461089957600080fd5b80637e5cd5c111610164578063894760691161013e57806389476069146107e95780638da5cb5b14610809578063903732231461081e57806391db3da51461083457600080fd5b80637e5cd5c1146107a0578063887c207a146107b5578063893d20e8146107cb57600080fd5b806367a594f6116101a057806367a594f61461072a57806369f7d2f21461074057806370a08231146107605780637cb647591461078057600080fd5b806364e03b5c146106d457806366345da4146106f457806367349ad81461071457600080fd5b806332cb6b0c116102a05780634ada218b1161023e57806355f804b31161021857806355f804b3146106525780635bf244be146106725780635ece6aa11461069f5780636352211e146106b457600080fd5b80634ada218b146105f857806351fb012d1461061257806354214f691461063157600080fd5b806342966c681161027a57806342966c68146105785780634408a0461461059857806349a5980a146105b85780634a30d3eb146105d857600080fd5b806332cb6b0c1461052d5780633ccfd60b1461054357806342842e0e1461055857600080fd5b80631cb97fe31161030d57806323b872dd116102e757806323b872dd146104b75780632a1e5315146104d75780632eb4a7ab146104f757806331ff37e91461050d57600080fd5b80631cb97fe3146104605780631d2c9bde146104805780631e263990146104a157600080fd5b806301ffc9a71461036057806306fdde0314610395578063081812fc146103d4578063095ea7b31461040c5780630f7772081461042e57806318160ddd1461044157600080fd5b3661035b57005b600080fd5b34801561036c57600080fd5b5061038061037b366004612c48565b610a14565b60405190151581526020015b60405180910390f35b3480156103a157600080fd5b5060408051808201909152600d81526c426f6465676120426c6f636b7360981b60208201525b60405161038c9190612cbd565b3480156103e057600080fd5b506103f46103ef366004612cd0565b610a66565b6040516001600160a01b03909116815260200161038c565b34801561041857600080fd5b5061042c610427366004612cfe565b610af7565b005b61042c61043c366004612d76565b610be6565b34801561044d57600080fd5b506002545b60405190815260200161038c565b34801561046c57600080fd5b5061042c61047b366004612d76565b610d33565b34801561048c57600080fd5b5060115461038090600160a01b900460ff1681565b3480156104ad57600080fd5b5061045260035481565b3480156104c357600080fd5b5061042c6104d2366004612dc2565b610e46565b3480156104e357600080fd5b5061042c6104f2366004612cd0565b610fe8565b34801561050357600080fd5b5061045260105481565b34801561051957600080fd5b5061042c610528366004612cd0565b611017565b34801561053957600080fd5b5061045261232781565b34801561054f57600080fd5b5061042c611046565b34801561056457600080fd5b5061042c610573366004612dc2565b6110c8565b34801561058457600080fd5b5061042c610593366004612cd0565b611239565b3480156105a457600080fd5b5061042c6105b3366004612e03565b611268565b3480156105c457600080fd5b5061042c6105d3366004612e83565b61129e565b3480156105e457600080fd5b5061042c6105f3366004612ea0565b6112e6565b34801561060457600080fd5b50600f546103809060ff1681565b34801561061e57600080fd5b50600f5461038090610100900460ff1681565b34801561063d57600080fd5b5060115461038090600160a81b900460ff1681565b34801561065e57600080fd5b5061042c61066d366004612e03565b611332565b34801561067e57600080fd5b5061069261068d366004612ea0565b611368565b60405161038c9190612ebd565b3480156106ab57600080fd5b50610452606f81565b3480156106c057600080fd5b506103f46106cf366004612cd0565b611445565b3480156106e057600080fd5b5061042c6106ef366004612d76565b6114aa565b34801561070057600080fd5b506011546103f4906001600160a01b031681565b34801561072057600080fd5b50610452600e5481565b34801561073657600080fd5b50610452600d5481565b34801561074c57600080fd5b5061042c61075b366004612f01565b611512565b34801561076c57600080fd5b5061045261077b366004612ea0565b6115c0565b34801561078c57600080fd5b5061042c61079b366004612cd0565b611634565b3480156107ac57600080fd5b5061042c611663565b3480156107c157600080fd5b506104526104c681565b3480156107d757600080fd5b506001546001600160a01b03166103f4565b3480156107f557600080fd5b5061042c610804366004612ea0565b611699565b34801561081557600080fd5b506103f46118ab565b34801561082a57600080fd5b50610452600b5481565b34801561084057600080fd5b50610452600a5481565b34801561085657600080fd5b50604080518082019091526006815265424f4445474160d01b60208201526103c7565b34801561088557600080fd5b5061042c610894366004612f6d565b611914565b3480156108a557600080fd5b5061042c6108b4366004612ea0565b61191f565b3480156108c557600080fd5b5061042c6108d4366004612e83565b6119a5565b61042c6108e7366004612d76565b6119ed565b3480156108f857600080fd5b50604051630a85bd0160e11b815260200161038c565b34801561091a57600080fd5b50610452600c5481565b34801561093057600080fd5b5061042c61093f366004612fbc565b611a60565b34801561095057600080fd5b506103f473dac17f958d2ee523a2206206994597c13d831ec781565b34801561097857600080fd5b506103c7610987366004612cd0565b611c04565b34801561099857600080fd5b5061042c611ca4565b3480156109ad57600080fd5b5061042c611cdf565b3480156109c257600080fd5b5061042c611d16565b3480156109d757600080fd5b506103806109e636600461309c565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b60006001600160e01b031982166380ac58cd60e01b1480610a4557506001600160e01b03198216635b5e139f60e01b145b80610a6057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000818152600460205260408120546001600160a01b0316610adb5760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b0282611445565b9050806001600160a01b0316836001600160a01b031603610b6f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610ad2565b336001600160a01b0382161480610b8b5750610b8b81336109e6565b610bd75760405162461bcd60e51b815260206004820152601d60248201527f4552433732313a206e6f7420617070726f766564206f72206f776e65720000006044820152606401610ad2565b610be18383611d4f565b505050565b600f54839060ff16610c0a5760405162461bcd60e51b8152600401610ad2906130ca565b60008111610c2a5760405162461bcd60e51b8152600401610ad2906130f7565b6104c66003541015610c4e5760405162461bcd60e51b8152600401610ad29061311e565b600f54610100900460ff1615610d2457610cde8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060105491503390505b604051602001610cc3919060609190911b6bffffffffffffffffffffffff1916815260140190565b60405160208183030381529060405280519060200120611dbd565b610d245760405162461bcd60e51b8152602060048201526017602482015276155cd95c88125cc8139bdd0815da1a5d195b1a5cdd1959604a1b6044820152606401610ad2565b610d2d84611dd3565b50505050565b600f54839060ff16610d575760405162461bcd60e51b8152600401610ad2906130ca565b60008111610d775760405162461bcd60e51b8152600401610ad2906130f7565b6104c684600354610d88919061316b565b1115610da65760405162461bcd60e51b8152600401610ad29061311e565b600f54610100900460ff1615610e3d57610df7838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506010549150339050610c9b565b610e3d5760405162461bcd60e51b8152602060048201526017602482015276155cd95c88125cc8139bdd0815da1a5d195b1a5cdd1959604a1b6044820152606401610ad2565b610d2d84611e46565b826daaeb6d7670e522a718067333cd4e3b15610fb857336001600160a01b03821603610ea357610e77335b83612065565b610e935760405162461bcd60e51b8152600401610ad290613183565b610e9e848484612147565b610d2d565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1691906131ba565b8015610f995750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610f75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9991906131ba565b610fb857604051633b79c77360e21b8152336004820152602401610ad2565b610fc133610e71565b610fdd5760405162461bcd60e51b8152600401610ad290613183565b610d2d848484612147565b6001546001600160a01b031633146110125760405162461bcd60e51b8152600401610ad2906131d7565b600a55565b6001546001600160a01b031633146110415760405162461bcd60e51b8152600401610ad2906131d7565b600b55565b6001546001600160a01b031633146110705760405162461bcd60e51b8152600401610ad2906131d7565b604051600090339047908381818185875af1925050503d80600081146110b2576040519150601f19603f3d011682016040523d82523d6000602084013e6110b7565b606091505b50509050806110c557600080fd5b50565b826daaeb6d7670e522a718067333cd4e3b1561121e57336001600160a01b0382160361110957610e9e84848460405180602001604052806000815250611a60565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117c91906131ba565b80156111ff5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156111db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ff91906131ba565b61121e57604051633b79c77360e21b8152336004820152602401610ad2565b610d2d84848460405180602001604052806000815250611a60565b6112433382612065565b61125f5760405162461bcd60e51b8152600401610ad290613183565b6110c581612351565b6001546001600160a01b031633146112925760405162461bcd60e51b8152600401610ad2906131d7565b610be160098383612b99565b6001546001600160a01b031633146112c85760405162461bcd60e51b8152600401610ad2906131d7565b60118054911515600160a81b0260ff60a81b19909216919091179055565b6001546001600160a01b031633146113105760405162461bcd60e51b8152600401610ad2906131d7565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461135c5760405162461bcd60e51b8152600401610ad2906131d7565b610be160088383612b99565b60606000611375836115c0565b67ffffffffffffffff81111561138d5761138d612fa6565b6040519080825280602002602001820160405280156113b6578160200160208202803683370190505b5090506113c2836115c0565b6000036113cf5792915050565b6000805b60035481101561143c576000818152600460205260409020546001600160a01b0380871691160361142a578083838151811061141157611411613204565b6020908102919091010152816114268161321a565b9250505b806114348161321a565b9150506113d3565b50909392505050565b6000818152600460205260408120546001600160a01b031680610a605760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610ad2565b600f54839060ff166114ce5760405162461bcd60e51b8152600401610ad2906130ca565b600081116114ee5760405162461bcd60e51b8152600401610ad2906130f7565b6104c66003541015610da65760405162461bcd60e51b8152600401610ad29061311e565b6001546001600160a01b0316331461153c5760405162461bcd60e51b8152600401610ad2906131d7565b8260005b818110156115b85760005b84848381811061155d5761155d613204565b905060200201358110156115af5761159d87878481811061158057611580613204565b90506020020160208101906115959190612ea0565b6003546124b5565b806115a78161321a565b91505061154b565b50600101611540565b505050505050565b60006001600160a01b0382166116185760405162461bcd60e51b815260206004820152601a60248201527f717565727920666f7220746865207a65726f20616464726573730000000000006044820152606401610ad2565b506001600160a01b031660009081526005602052604090205490565b6001546001600160a01b0316331461165e5760405162461bcd60e51b8152600401610ad2906131d7565b601055565b6001546001600160a01b0316331461168d5760405162461bcd60e51b8152600401610ad2906131d7565b600f805460ff19169055565b6001546001600160a01b031633146116c35760405162461bcd60e51b8152600401610ad2906131d7565b73dac17f958d2ee523a2206206994597c13d831ec6196001600160a01b038216016117c6576040516370a0823160e01b815230600482015273dac17f958d2ee523a2206206994597c13d831ec79063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611741573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117659190613233565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156117ab57600080fd5b505af11580156117bf573d6000803e3d6000fd5b5050505050565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118389190613233565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a791906131ba565b5050565b6000306001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190f919061324c565b905090565b6118a7338383612542565b6001546001600160a01b031633146119495760405162461bcd60e51b8152600401610ad2906131d7565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146119cf5760405162461bcd60e51b8152600401610ad2906131d7565b60118054911515600160a01b0260ff60a01b19909216919091179055565b600f54839060ff16611a115760405162461bcd60e51b8152600401610ad2906130ca565b60008111611a315760405162461bcd60e51b8152600401610ad2906130f7565b6104c684600354611a42919061316b565b1115610c4e5760405162461bcd60e51b8152600401610ad29061311e565b836daaeb6d7670e522a718067333cd4e3b15611bd357336001600160a01b03821603611abe57611a91335b84612065565b611aad5760405162461bcd60e51b8152600401610ad290613183565b611ab985858585612610565b6117bf565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3191906131ba565b8015611bb45750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611b90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb491906131ba565b611bd357604051633b79c77360e21b8152336004820152602401610ad2565b611bdc33611a8b565b611bf85760405162461bcd60e51b8152600401610ad290613183565b6117bf85858585612610565b601154606090600160a81b900460ff1615611c79576000611c2483612643565b90506000600882604051602001611c3c92919061333c565b6040516020818303038152906040529050806009604051602001611c61929190613361565b60405160208183030381529060405292505050919050565b60086009604051602001611c8e92919061337f565b6040516020818303038152906040529050919050565b6001546001600160a01b03163314611cce5760405162461bcd60e51b8152600401610ad2906131d7565b600f805461ff001916610100179055565b6001546001600160a01b03163314611d095760405162461bcd60e51b8152600401610ad2906131d7565b600f805461ff0019169055565b6001546001600160a01b03163314611d405760405162461bcd60e51b8152600401610ad2906131d7565b600f805460ff19166001179055565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d8482611445565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600082611dca858461276f565b14949350505050565b3481600a54611de29190613394565b1115611e275760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0815985b1d594814d95b9d60621b6044820152606401610ad2565b60005b818110156118a757611e3e336003546124b5565b600101611e2a565b600081600b54611e569190613394565b604051636eb1769f60e11b8152336004820152306024820152909150819073dac17f958d2ee523a2206206994597c13d831ec79063dd62ed3e90604401602060405180830381865afa158015611eb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed49190613233565b1015611f1b5760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420416c6c6f77616e636560501b6044820152606401610ad2565b6040516370a0823160e01b8152336004820152819073dac17f958d2ee523a2206206994597c13d831ec7906370a0823190602401602060405180830381865afa158015611f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f909190613233565b1015611fd55760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b6044820152606401610ad2565b6040516323b872dd60e01b81523360048201523060248201526044810182905273dac17f958d2ee523a2206206994597c13d831ec7906323b872dd90606401600060405180830381600087803b15801561202e57600080fd5b505af1158015612042573d6000803e3d6000fd5b5050505060005b82811015610be15761205d336003546124b5565b600101612049565b6000818152600460205260408120546001600160a01b03166120c95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610ad2565b60006120d483611445565b9050806001600160a01b0316846001600160a01b0316148061210f5750836001600160a01b031661210484610a66565b6001600160a01b0316145b8061213f57506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b6002600054036121995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ad2565b60026000556001600160a01b0383166121b182611445565b6001600160a01b0316146121f95760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba1037bbb732b960891b6044820152606401610ad2565b6001600160a01b03821661223e5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610ad2565b6000612249846115c0565b116122855760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b6044820152606401610ad2565b612290600082611d4f565b6001600160a01b0383166000908152600560205260409020546122b49060016127e3565b6001600160a01b038085166000908152600560205260408082209390935590841681529081208054600192906122eb90849061316b565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050600160005550565b6000818152600460205260409020546001600160a01b03166123ac5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88111bd95cc8139bdd08115e1a5cdd60621b6044820152606401610ad2565b60006123b782611445565b90506123c4600083611d4f565b6001600160a01b03811660009081526005602052604081208054600192906123ed9084906133b3565b9091555050600082815260046020526040812080546001600160a01b031916905560028054600192906124219084906133b3565b9091555050606f82101561244957600c805490600061243f836133ca565b9190505550612479565b6104c682101561246357600d805490600061243f836133ca565b600e8054906000612473836133ca565b91905055505b60405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6124bf828261282c565b6124db6000838360405180602001604052806000815250612a1e565b6118a75760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610ad2565b816001600160a01b0316836001600160a01b0316036125a35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610ad2565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61261b848484612147565b61262784848484612a1e565b610d2d5760405162461bcd60e51b8152600401610ad2906133e1565b60608160000361266a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612694578061267e8161321a565b915061268d9050600a83613427565b915061266e565b60008167ffffffffffffffff8111156126af576126af612fa6565b6040519080825280601f01601f1916602001820160405280156126d9576020820181803683370190505b509050815b8515612766576126ef6001826133b3565b905060006126fe600a88613427565b61270990600a613394565b61271390886133b3565b61271e906030613449565b905060008160f81b90508084848151811061273b5761273b613204565b60200101906001600160f81b031916908160001a90535061275d600a89613427565b975050506126de565b50949350505050565b600081815b84518110156127db57600085828151811061279157612791613204565b602002602001015190508083116127b757600083815260208290526040902092506127c8565b600081815260208490526040902092505b50806127d38161321a565b915050612774565b509392505050565b600061282583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b26565b9392505050565b6000818152600460205260409020546001600160a01b0316156128915760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610ad2565b612327600354106128e45760405162461bcd60e51b815260206004820152601960248201527f416c6c204e4654732048617665204265656e204d696e746564000000000000006044820152606401610ad2565b600081815260046020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260059091529020805460019081019091556002805482019055600380549091019055606f81101561294c57600c8054600101905561296e565b6104c681101561296457600d8054600101905561296e565b600e805460010190555b6104c66003540361298457600f805460ff191690555b601154604051636c65b9ad60e11b8152600481018390526001600160a01b039091169063d8cb735a90602401600060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b50506040518392506001600160a01b03851691506000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612a32846001600160a01b0316612b60565b15612b1b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a6990339089908890889060040161346e565b6020604051808303816000875af1925050508015612aa4575060408051601f3d908101601f19168201909252612aa1918101906134ab565b60015b612b01573d808015612ad2576040519150601f19603f3d011682016040523d82523d6000602084013e612ad7565b606091505b508051600003612af95760405162461bcd60e51b8152600401610ad2906133e1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061213f565b506001949350505050565b60008184841115612b4a5760405162461bcd60e51b8152600401610ad29190612cbd565b506000612b5784866133b3565b95945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061213f575050151592915050565b828054612ba590613269565b90600052602060002090601f016020900481019282612bc75760008555612c0d565b82601f10612be05782800160ff19823516178555612c0d565b82800160010185558215612c0d579182015b82811115612c0d578235825591602001919060010190612bf2565b50612c19929150612c1d565b5090565b5b80821115612c195760008155600101612c1e565b6001600160e01b0319811681146110c557600080fd5b600060208284031215612c5a57600080fd5b813561282581612c32565b60005b83811015612c80578181015183820152602001612c68565b83811115610d2d5750506000910152565b60008151808452612ca9816020860160208601612c65565b601f01601f19169290920160200192915050565b6020815260006128256020830184612c91565b600060208284031215612ce257600080fd5b5035919050565b6001600160a01b03811681146110c557600080fd5b60008060408385031215612d1157600080fd5b8235612d1c81612ce9565b946020939093013593505050565b60008083601f840112612d3c57600080fd5b50813567ffffffffffffffff811115612d5457600080fd5b6020830191508360208260051b8501011115612d6f57600080fd5b9250929050565b600080600060408486031215612d8b57600080fd5b83359250602084013567ffffffffffffffff811115612da957600080fd5b612db586828701612d2a565b9497909650939450505050565b600080600060608486031215612dd757600080fd5b8335612de281612ce9565b92506020840135612df281612ce9565b929592945050506040919091013590565b60008060208385031215612e1657600080fd5b823567ffffffffffffffff80821115612e2e57600080fd5b818501915085601f830112612e4257600080fd5b813581811115612e5157600080fd5b866020828501011115612e6357600080fd5b60209290920196919550909350505050565b80151581146110c557600080fd5b600060208284031215612e9557600080fd5b813561282581612e75565b600060208284031215612eb257600080fd5b813561282581612ce9565b6020808252825182820181905260009190848201906040850190845b81811015612ef557835183529284019291840191600101612ed9565b50909695505050505050565b60008060008060408587031215612f1757600080fd5b843567ffffffffffffffff80821115612f2f57600080fd5b612f3b88838901612d2a565b90965094506020870135915080821115612f5457600080fd5b50612f6187828801612d2a565b95989497509550505050565b60008060408385031215612f8057600080fd5b8235612f8b81612ce9565b91506020830135612f9b81612e75565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612fd257600080fd5b8435612fdd81612ce9565b93506020850135612fed81612ce9565b925060408501359150606085013567ffffffffffffffff8082111561301157600080fd5b818701915087601f83011261302557600080fd5b81358181111561303757613037612fa6565b604051601f8201601f19908116603f0116810190838211818310171561305f5761305f612fa6565b816040528281528a602084870101111561307857600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156130af57600080fd5b82356130ba81612ce9565b91506020830135612f9b81612ce9565b602080825260139082015272151c98591a5b99c8139bdd08115b98589b1959606a1b604082015260600190565b6020808252600d908201526c125b9d985b1a5908125b9c1d5d609a1b604082015260600190565b60208082526017908201527f4d696e74204578636565647320427265616b706f696e74000000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561317e5761317e613155565b500190565b6020808252601d908201527f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000604082015260600190565b6000602082840312156131cc57600080fd5b815161282581612e75565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161322c5761322c613155565b5060010190565b60006020828403121561324557600080fd5b5051919050565b60006020828403121561325e57600080fd5b815161282581612ce9565b600181811c9082168061327d57607f821691505b60208210810361329d57634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c90808316806132bd57607f831692505b602080841082036132de57634e487b7160e01b600052602260045260246000fd5b8180156132f2576001811461330357613330565b60ff19861689528489019650613330565b60008881526020902060005b868110156133285781548b82015290850190830161330f565b505084890196505b50505050505092915050565b600061334882856132a3565b8351613358818360208801612c65565b01949350505050565b60008351613373818460208801612c65565b612b57818401856132a3565b600061213f61338e83866132a3565b846132a3565b60008160001904831182151516156133ae576133ae613155565b500290565b6000828210156133c5576133c5613155565b500390565b6000816133d9576133d9613155565b506000190190565b60208082526026908201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560408201526536b2b73a32b960d11b606082015260800190565b60008261344457634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff0382111561346657613466613155565b019392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134a190830184612c91565b9695505050505050565b6000602082840312156134bd57600080fd5b815161282581612c3256fea264697066735822122080cc6369d2ce74999ac86cf97803a0258f8c7a5524ce0c3a7d7574e58f8d519c64736f6c634300080e0033

Deployed Bytecode Sourcemap

31561:24289:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50363:338;;;;;;;;;;-1:-1:-1;50363:338:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;50363:338:0;;;;;;;;51307:92;;;;;;;;;;-1:-1:-1;51386:5:0;;;;;;;;;;;;-1:-1:-1;;;51386:5:0;;;;51307:92;;;;;;;:::i;52803:245::-;;;;;;;;;;-1:-1:-1;52803:245:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;52803:245:0;1528:203:1;40888:377:0;;;;;;;;;;-1:-1:-1;40888:377:0;;;;;:::i;:::-;;:::i;:::-;;37890:617;;;;;;:::i;:::-;;:::i;49722:93::-;;;;;;;;;;-1:-1:-1;49795:12:0;;49722:93;;;3220:25:1;;;3208:2;3193:18;49722:93:0;3074:177:1;39281:620:0;;;;;;;;;;-1:-1:-1;39281:620:0;;;;;:::i;:::-;;:::i;33403:39::-;;;;;;;;;;-1:-1:-1;33403:39:0;;;;-1:-1:-1;;;33403:39:0;;;;;;31971:33;;;;;;;;;;;;;;;;41576:319;;;;;;;;;;-1:-1:-1;41576:319:0;;;;;:::i;:::-;;:::i;36582:98::-;;;;;;;;;;-1:-1:-1;36582:98:0;;;;;:::i;:::-;;:::i;33260:25::-;;;;;;;;;;;;;;;;36688:102;;;;;;;;;;-1:-1:-1;36688:102:0;;;;;:::i;:::-;;:::i;32036:42::-;;;;;;;;;;;;32073:5;32036:42;;36003:150;;;;;;;;;;;;;:::i;41966:203::-;;;;;;;;;;-1:-1:-1;41966:203:0;;;;;:::i;:::-;;:::i;40585:204::-;;;;;;;;;;-1:-1:-1;40585:204:0;;;;;:::i;:::-;;:::i;36904:114::-;;;;;;;;;;-1:-1:-1;36904:114:0;;;;;:::i;:::-;;:::i;37026:103::-;;;;;;;;;;-1:-1:-1;37026:103:0;;;;;:::i;:::-;;:::i;35374:106::-;;;;;;;;;;-1:-1:-1;35374:106:0;;;;;:::i;:::-;;:::i;33155:34::-;;;;;;;;;;-1:-1:-1;33155:34:0;;;;;;;;33196:35;;;;;;;;;;-1:-1:-1;33196:35:0;;;;;;;;;;;33473:30;;;;;;;;;;-1:-1:-1;33473:30:0;;;;-1:-1:-1;;;33473:30:0;;;;;;36798:98;;;;;;;;;;-1:-1:-1;36798:98:0;;;;;:::i;:::-;;:::i;49823:468::-;;;;;;;;;;-1:-1:-1;49823:468:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33032:41::-;;;;;;;;;;;;33070:3;33032:41;;51017:223;;;;;;;;;;-1:-1:-1;51017:223:0;;;;;:::i;:::-;;:::i;39972:605::-;;;;;;;;;;-1:-1:-1;39972:605:0;;;;;:::i;:::-;;:::i;33317:28::-;;;;;;;;;;-1:-1:-1;33317:28:0;;;;-1:-1:-1;;;;;33317:28:0;;;32967:26;;;;;;;;;;;;;;;;32934;;;;;;;;;;;;;;;;37251:404;;;;;;;;;;-1:-1:-1;37251:404:0;;;;;:::i;:::-;;:::i;50765:190::-;;;;;;;;;;-1:-1:-1;50765:190:0;;;;;:::i;:::-;;:::i;37137:106::-;;;;;;;;;;-1:-1:-1;37137:106:0;;;;;:::i;:::-;;:::i;35715:86::-;;;;;;;;;;;;;:::i;33080:43::-;;;;;;;;;;;;33118:5;33080:43;;27086:83;;;;;;;;;;-1:-1:-1;27156:5:0;;-1:-1:-1;;;;;27156:5:0;27086:83;;36161:413;;;;;;;;;;-1:-1:-1;36161:413:0;;;;;:::i;:::-;;:::i;49624:90::-;;;;;;;;;;;;;:::i;32822:37::-;;;;;;;;;;;;;;;;32778;;;;;;;;;;;;;;;;51468:96;;;;;;;;;;-1:-1:-1;51549:7:0;;;;;;;;;;;;-1:-1:-1;;;51549:7:0;;;;51468:96;;41337:172;;;;;;;;;;-1:-1:-1;41337:172:0;;;;;:::i;:::-;;:::i;26861:132::-;;;;;;;;;;-1:-1:-1;26861:132:0;;;;;:::i;:::-;;:::i;35488:127::-;;;;;;;;;;-1:-1:-1;35488:127:0;;;;;:::i;:::-;;:::i;38578:632::-;;;;;;:::i;:::-;;:::i;54238:124::-;;;;;;;;;;-1:-1:-1;54238:124:0;;-1:-1:-1;;;7248:52:1;;7236:2;7221:18;54238:124:0;7104:202:1;32901:26:0;;;;;;;;;;;;;;;;42240:363;;;;;;;;;;-1:-1:-1;42240:363:0;;;;;:::i;:::-;;:::i;32110:92::-;;;;;;;;;;;;32159:42;32110:92;;51635:417;;;;;;;;;;-1:-1:-1;51635:417:0;;;;;:::i;:::-;;:::i;35907:88::-;;;;;;;;;;;;;:::i;35809:90::-;;;;;;;;;;;;;:::i;35623:84::-;;;;;;;;;;;;;:::i;53119:203::-;;;;;;;;;;-1:-1:-1;53119:203:0;;;;;:::i;:::-;-1:-1:-1;;;;;53276:27:0;;;53247:4;53276:27;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;;;;53119:203;50363:338;50493:4;-1:-1:-1;;;;;;50535:40:0;;-1:-1:-1;;;50535:40:0;;:105;;-1:-1:-1;;;;;;;50592:48:0;;-1:-1:-1;;;50592:48:0;50535:105;:158;;;-1:-1:-1;;;;;;;;;;6868:40:0;;;50657:36;50515:178;50363:338;-1:-1:-1;;50363:338:0:o;52803:245::-;52907:7;53647:16;;;:7;:16;;;;;;-1:-1:-1;;;;;53647:16:0;52932:64;;;;-1:-1:-1;;;52932:64:0;;9538:2:1;52932:64:0;;;9520:21:1;9577:2;9557:18;;;9550:30;9616:34;9596:18;;;9589:62;-1:-1:-1;;;9667:18:1;;;9660:33;9710:19;;52932:64:0;;;;;;;;;-1:-1:-1;53016:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;53016:24:0;;52803:245::o;40888:377::-;40961:15;40979:16;40987:7;40979;:16::i;:::-;40961:34;;41020:7;-1:-1:-1;;;;;41014:13:0;:2;-1:-1:-1;;;;;41014:13:0;;41006:59;;;;-1:-1:-1;;;41006:59:0;;9942:2:1;41006:59:0;;;9924:21:1;9981:2;9961:18;;;9954:30;10020:34;10000:18;;;9993:62;-1:-1:-1;;;10071:18:1;;;10064:31;10112:19;;41006:59:0;9740:397:1;41006:59:0;20404:10;-1:-1:-1;;;;;41100:23:0;;;;:66;;-1:-1:-1;41127:39:0;41144:7;20404:10;53119:203;:::i;41127:39::-;41078:145;;;;-1:-1:-1;;;41078:145:0;;10344:2:1;41078:145:0;;;10326:21:1;10383:2;10363:18;;;10356:30;10422:31;10402:18;;;10395:59;10471:18;;41078:145:0;10142:353:1;41078:145:0;41236:21;41245:2;41249:7;41236:8;:21::i;:::-;40950:315;40888:377;;:::o;37890:617::-;33571:14;;38017:13;;33571:14;;33563:46;;;;-1:-1:-1;;;33563:46:0;;;;;;;:::i;:::-;33644:1;33628:13;:17;33620:43;;;;-1:-1:-1;;;33620:43:0;;;;;;;:::i;:::-;33118:5:::1;38070:18;;:33;;38048:107;;;;-1:-1:-1::0;;;38048:107:0::1;;;;;;;:::i;:::-;38172:16;::::0;::::1;::::0;::::1;;;38168:296;;;38231:162;38272:5;;38231:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;38300:10:0::1;::::0;;-1:-1:-1;20404:10:0;;-1:-1:-1;38360:12:0::1;38343:30;;;;;;;11691:2:1::0;11687:15;;;;-1:-1:-1;;11683:53:1;11671:66;;11762:2;11753:12;;11542:229;38343:30:0::1;;;;;;;;;;;;;38333:41;;;;;;38231:18;:162::i;:::-;38205:247;;;::::0;-1:-1:-1;;;38205:247:0;;11978:2:1;38205:247:0::1;::::0;::::1;11960:21:1::0;12017:2;11997:18;;;11990:30;-1:-1:-1;;;12036:18:1;;;12029:53;12099:18;;38205:247:0::1;11776:347:1::0;38205:247:0::1;38476:23;38485:13;38476:8;:23::i;:::-;37890:617:::0;;;;:::o;39281:620::-;33571:14;;39395:13;;33571:14;;33563:46;;;;-1:-1:-1;;;33563:46:0;;;;;;;:::i;:::-;33644:1;33628:13;:17;33620:43;;;;-1:-1:-1;;;33620:43:0;;;;;;;:::i;:::-;33118:5:::1;39469:13;39448:18;;:34;;;;:::i;:::-;:49;;39426:122;;;;-1:-1:-1::0;;;39426:122:0::1;;;;;;;:::i;:::-;39565:16;::::0;::::1;::::0;::::1;;;39561:296;;;39624:162;39665:5;;39624:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;39693:10:0::1;::::0;;-1:-1:-1;20404:10:0;;-1:-1:-1;39753:12:0::1;20324:98:::0;39624:162:::1;39598:247;;;::::0;-1:-1:-1;;;39598:247:0;;11978:2:1;39598:247:0::1;::::0;::::1;11960:21:1::0;12017:2;11997:18;;;11990:30;-1:-1:-1;;;12036:18:1;;;12029:53;12099:18;;39598:247:0::1;11776:347:1::0;39598:247:0::1;39869:24;39879:13;39869:9;:24::i;41576:319::-:0;41711:4;33833:42;34057:43;:47;34053:699;;34344:10;-1:-1:-1;;;;;34336:18:0;;;34332:85;;41750:41:::1;20404:10:::0;41769:12:::1;41783:7;41750:18;:41::i;:::-;41728:120;;;;-1:-1:-1::0;;;41728:120:0::1;;;;;;;:::i;:::-;41859:28;41869:4;41875:2;41879:7;41859:9;:28::i;:::-;34395:7:::0;;34332:85;34477:67;;-1:-1:-1;;;34477:67:0;;34526:4;34477:67;;;12963:34:1;34533:10:0;13013:18:1;;;13006:43;33833:42:0;;34477:40;;12898:18:1;;34477:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;-1:-1:-1;34573:61:0;;-1:-1:-1;;;34573:61:0;;34622:4;34573:61;;;12963:34:1;-1:-1:-1;;;;;13033:15:1;;13013:18;;;13006:43;33833:42:0;;34573:40;;12898:18:1;;34573:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34431:310;;34695:30;;-1:-1:-1;;;34695:30:0;;34714:10;34695:30;;;1674:51:1;1647:18;;34695:30:0;1528:203:1;34431:310:0;41750:41:::1;20404:10:::0;41769:12:::1;20324:98:::0;41750:41:::1;41728:120;;;;-1:-1:-1::0;;;41728:120:0::1;;;;;;;:::i;:::-;41859:28;41869:4;41875:2;41879:7;41859:9;:28::i;36582:98::-:0;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;36652:7:::1;:20:::0;36582:98::o;36688:102::-;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;36760:8:::1;:22:::0;36688:102::o;36003:150::-;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;36066:58:::1;::::0;36054:6:::1;::::0;36074:10:::1;::::0;36098:21:::1;::::0;36054:6;36066:58;36054:6;36066:58;36098:21;36074:10;36066:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36053:71;;;36143:1;36135:10;;;::::0;::::1;;36042:111;36003:150::o:0;41966:203::-;42105:4;33833:42;34057:43;:47;34053:699;;34344:10;-1:-1:-1;;;;;34336:18:0;;;34332:85;;42122:39:::1;42139:4;42145:2;42149:7;42122:39;;;;;;;;;;;::::0;:16:::1;:39::i;34332:85::-:0;34477:67;;-1:-1:-1;;;34477:67:0;;34526:4;34477:67;;;12963:34:1;34533:10:0;13013:18:1;;;13006:43;33833:42:0;;34477:40;;12898:18:1;;34477:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;-1:-1:-1;34573:61:0;;-1:-1:-1;;;34573:61:0;;34622:4;34573:61;;;12963:34:1;-1:-1:-1;;;;;13033:15:1;;13013:18;;;13006:43;33833:42:0;;34573:40;;12898:18:1;;34573:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34431:310;;34695:30;;-1:-1:-1;;;34695:30:0;;34714:10;34695:30;;;1674:51:1;1647:18;;34695:30:0;1528:203:1;34431:310:0;42122:39:::1;42139:4;42145:2;42149:7;42122:39;;;;;;;;;;;::::0;:16:::1;:39::i;40585:204::-:0;40658:41;20404:10;40691:7;40658:18;:41::i;:::-;40636:120;;;;-1:-1:-1;;;40636:120:0;;;;;;;:::i;:::-;40767:14;40773:7;40767:5;:14::i;36904:114::-;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;36989:21:::1;:6;36998:12:::0;;36989:21:::1;:::i;37026:103::-:0;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;37097:10:::1;:24:::0;;;::::1;;-1:-1:-1::0;;;37097:24:0::1;-1:-1:-1::0;;;;37097:24:0;;::::1;::::0;;;::::1;::::0;;37026:103::o;35374:106::-;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;35448:13:::1;:24:::0;;-1:-1:-1;;;;;;35448:24:0::1;-1:-1:-1::0;;;;;35448:24:0;;;::::1;::::0;;;::::1;::::0;;35374:106::o;36798:98::-;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;36872:16:::1;:7;36882:6:::0;;36872:16:::1;:::i;49823:468::-:0;49910:16;49944:20;49981:17;49991:6;49981:9;:17::i;:::-;49967:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49967:32:0;;49944:55;;50014:17;50024:6;50014:9;:17::i;:::-;50035:1;50014:22;50010:38;;50045:3;49823:468;-1:-1:-1;;49823:468:0:o;50010:38::-;50059:13;50092:9;50087:176;50111:18;;50107:1;:22;50087:176;;;50155:10;;;;:7;:10;;;;;;-1:-1:-1;;;;;50155:20:0;;;:10;;:20;50151:101;;50209:1;50196:3;50200:5;50196:10;;;;;;;;:::i;:::-;;;;;;;;;;:14;50229:7;;;;:::i;:::-;;;;50151:101;50131:3;;;;:::i;:::-;;;;50087:176;;;-1:-1:-1;50280:3:0;;49823:468;-1:-1:-1;;;49823:468:0:o;51017:223::-;51081:7;51119:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51119:16:0;;51146:61;;;;-1:-1:-1;;;51146:61:0;;14342:2:1;51146:61:0;;;14324:21:1;14381:2;14361:18;;;14354:30;14420:29;14400:18;;;14393:57;14467:18;;51146:61:0;14140:351:1;39972:605:0;33571:14;;40086:13;;33571:14;;33563:46;;;;-1:-1:-1;;;33563:46:0;;;;;;;:::i;:::-;33644:1;33628:13;:17;33620:43;;;;-1:-1:-1;;;33620:43:0;;;;;;;:::i;:::-;33118:5:::1;40139:18;;:33;;40117:107;;;;-1:-1:-1::0;;;40117:107:0::1;;;;;;;:::i;37251:404::-:0;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;37391:5;37377:11:::1;37414:234;37438:3;37434:1;:7;37414:234;;;37465:9;37460:115;37484:7;;37492:1;37484:10;;;;;;;:::i;:::-;;;;;;;37480:1;:14;37460:115;;;37520:39;37530:5;;37536:1;37530:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;37540:18;;37520:9;:39::i;:::-;37496:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37460:115;;;-1:-1:-1::0;37618:3:0::1;;37414:234;;;;37366:289;37251:404:::0;;;;:::o;50765:190::-;50831:7;-1:-1:-1;;;;;50859:21:0;;50851:60;;;;-1:-1:-1;;;50851:60:0;;14698:2:1;50851:60:0;;;14680:21:1;14737:2;14717:18;;;14710:30;14776:28;14756:18;;;14749:56;14822:18;;50851:60:0;14496:350:1;50851:60:0;-1:-1:-1;;;;;;50929:18:0;;;;;:9;:18;;;;;;;50765:190::o;37137:106::-;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;37211:10:::1;:24:::0;37137:106::o;35715:86::-;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;35771:14:::1;:22:::0;;-1:-1:-1;;35771:22:0::1;::::0;;35715:86::o;36161:413::-;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;36234:23:0;::::1;::::0;36230:337:::1;;36336:46;::::0;-1:-1:-1;;;36336:46:0;;36376:4:::1;36336:46;::::0;::::1;1674:51:1::0;32159:42:0::1;::::0;36274:13:::1;::::0;36306:10:::1;::::0;32159:42;;36336:31:::1;::::0;1647:18:1;;36336:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36274:123;::::0;-1:-1:-1;;;;;;36274:123:0::1;::::0;;;;;;-1:-1:-1;;;;;15232:32:1;;;36274:123:0::1;::::0;::::1;15214:51:1::0;15281:18;;;15274:34;15187:18;;36274:123:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36042:111;36003:150::o:0;36230:337::-:1;36501:39;::::0;-1:-1:-1;;;36501:39:0;;36534:4:::1;36501:39;::::0;::::1;1674:51:1::0;-1:-1:-1;;;;;36430:23:0;::::1;::::0;::::1;::::0;36472:10:::1;::::0;36430:23;;36501:24:::1;::::0;1647:18:1;;36501:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36430:125;::::0;-1:-1:-1;;;;;;36430:125:0::1;::::0;;;;;;-1:-1:-1;;;;;15232:32:1;;;36430:125:0::1;::::0;::::1;15214:51:1::0;15281:18;;;15274:34;15187:18;;36430:125:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36161:413:::0;:::o;49624:90::-;49664:7;49691:4;-1:-1:-1;;;;;49691:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49684:22;;49624:90;:::o;41337:172::-;41448:53;20404:10;41481:9;41492:8;41448:18;:53::i;26861:132::-;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;26942:5:::1;::::0;26933:25:::1;::::0;-1:-1:-1;;;;;26933:25:0;;::::1;::::0;26942:5:::1;::::0;26933:25:::1;::::0;26942:5:::1;::::0;26933:25:::1;26969:5;:16:::0;;-1:-1:-1;;;;;;26969:16:0::1;-1:-1:-1::0;;;;;26969:16:0;;;::::1;::::0;;;::::1;::::0;;26861:132::o;35488:127::-;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;35571:20:::1;:36:::0;;;::::1;;-1:-1:-1::0;;;35571:36:0::1;-1:-1:-1::0;;;;35571:36:0;;::::1;::::0;;;::::1;::::0;;35488:127::o;38578:632::-;33571:14;;38705:13;;33571:14;;33563:46;;;;-1:-1:-1;;;33563:46:0;;;;;;;:::i;:::-;33644:1;33628:13;:17;33620:43;;;;-1:-1:-1;;;33620:43:0;;;;;;;:::i;:::-;33118:5:::1;38779:13;38758:18;;:34;;;;:::i;:::-;:49;;38736:122;;;;-1:-1:-1::0;;;38736:122:0::1;;;;;;;:::i;42240:363::-:0;42408:4;33833:42;34057:43;:47;34053:699;;34344:10;-1:-1:-1;;;;;34336:18:0;;;34332:85;;42447:41:::1;20404:10:::0;42466:12:::1;42480:7;42447:18;:41::i;:::-;42425:120;;;;-1:-1:-1::0;;;42425:120:0::1;;;;;;;:::i;:::-;42556:39;42570:4;42576:2;42580:7;42589:5;42556:13;:39::i;:::-;34395:7:::0;;34332:85;34477:67;;-1:-1:-1;;;34477:67:0;;34526:4;34477:67;;;12963:34:1;34533:10:0;13013:18:1;;;13006:43;33833:42:0;;34477:40;;12898:18:1;;34477:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;-1:-1:-1;34573:61:0;;-1:-1:-1;;;34573:61:0;;34622:4;34573:61;;;12963:34:1;-1:-1:-1;;;;;13033:15:1;;13013:18;;;13006:43;33833:42:0;;34573:40;;12898:18:1;;34573:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34431:310;;34695:30;;-1:-1:-1;;;34695:30:0;;34714:10;34695:30;;;1674:51:1;1647:18;;34695:30:0;1528:203:1;34431:310:0;42447:41:::1;20404:10:::0;42466:12:::1;20324:98:::0;42447:41:::1;42425:120;;;;-1:-1:-1::0;;;42425:120:0::1;;;;;;;:::i;:::-;42556:39;42570:4;42576:2;42580:7;42589:5;42556:13;:39::i;51635:417::-:0;51781:10;;51736:13;;-1:-1:-1;;;51781:10:0;;;;51777:268;;;51808:19;51830:17;51839:7;51830:8;:17::i;:::-;51808:39;;51862:19;51898:7;51907:5;51884:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51862:51;;51949:5;51956:6;51935:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51928:35;;;;51635:417;;;:::o;51777:268::-;52017:7;52026:6;52003:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51996:37;;51635:417;;;:::o;35907:88::-;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;35964:16:::1;:23:::0;;-1:-1:-1;;35964:23:0::1;;;::::0;;35907:88::o;35809:90::-;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;35867:16:::1;:24:::0;;-1:-1:-1;;35867:24:0::1;::::0;;35809:90::o;35623:84::-;26472:5;;-1:-1:-1;;;;;26472:5:0;26458:10;:19;26450:51;;;;-1:-1:-1;;;26450:51:0;;;;;;;:::i;:::-;35678:14:::1;:21:::0;;-1:-1:-1;;35678:21:0::1;35695:4;35678:21;::::0;;35623:84::o;48832:159::-;48899:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;48899:29:0;-1:-1:-1;;;;;48899:29:0;;;;;;;;:24;;48953:16;48899:24;48953:7;:16::i;:::-;-1:-1:-1;;;;;48944:39:0;;;;;;;;;;;48832:159;;:::o;865:190::-;990:4;1043;1014:25;1027:5;1034:4;1014:12;:25::i;:::-;:33;;865:190;-1:-1:-1;;;;865:190:0:o;42775:319::-;42871:9;42854:13;42844:7;;:23;;;;:::i;:::-;:36;;42836:69;;;;-1:-1:-1;;;42836:69:0;;18463:2:1;42836:69:0;;;18445:21:1;18502:2;18482:18;;;18475:30;-1:-1:-1;;;18521:18:1;;;18514:50;18581:18;;42836:69:0;18261:344:1;42836:69:0;42921:9;42916:171;42940:13;42936:1;:17;42916:171;;;42972:41;42982:10;42994:18;;42972:9;:41::i;:::-;43057:3;;42916:171;;43102:629;43164:8;43186:13;43175:8;;:24;;;;:::i;:::-;43232:58;;-1:-1:-1;;;43232:58:0;;43264:10;43232:58;;;12963:34:1;43284:4:0;13013:18:1;;;13006:43;43164:35:0;;-1:-1:-1;43164:35:0;;32159:42;;43232:31;;12898:18:1;;43232:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;43210:137;;;;-1:-1:-1;;;43210:137:0;;18812:2:1;43210:137:0;;;18794:21:1;18851:2;18831:18;;;18824:30;-1:-1:-1;;;18870:18:1;;;18863:52;18932:18;;43210:137:0;18610:346:1;43210:137:0;43380:43;;-1:-1:-1;;;43380:43:0;;43412:10;43380:43;;;1674:51:1;43427:3:0;;32159:42;;43380:31;;1647:18:1;;43380:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;43358:120;;;;-1:-1:-1;;;43358:120:0;;19163:2:1;43358:120:0;;;19145:21:1;19202:2;19182:18;;;19175:30;-1:-1:-1;;;19221:18:1;;;19214:50;19281:18;;43358:120:0;18961:344:1;43358:120:0;43491:49;;-1:-1:-1;;;43491:49:0;;43509:10;43491:49;;;19550:34:1;43529:4:0;19600:18:1;;;19593:43;19652:18;;;19645:34;;;32159:42:0;;43491:17;;19485:18:1;;43491:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43558:9;43553:171;43577:13;43573:1;:17;43553:171;;;43609:41;43619:10;43631:18;;43609:9;:41::i;:::-;43694:3;;43553:171;;53852:378;53964:4;53647:16;;;:7;:16;;;;;;-1:-1:-1;;;;;53647:16:0;53986:54;;;;-1:-1:-1;;;53986:54:0;;19892:2:1;53986:54:0;;;19874:21:1;19931:2;19911:18;;;19904:30;19970:27;19950:18;;;19943:55;20015:18;;53986:54:0;19690:349:1;53986:54:0;54051:15;54069:16;54077:7;54069;:16::i;:::-;54051:34;;54115:7;-1:-1:-1;;;;;54104:18:0;:7;-1:-1:-1;;;;;54104:18:0;;:66;;;;54163:7;-1:-1:-1;;;;;54139:31:0;:20;54151:7;54139:11;:20::i;:::-;-1:-1:-1;;;;;54139:31:0;;54104:66;:117;;;-1:-1:-1;;;;;;53276:27:0;;;53247:4;53276:27;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;54187:34;54096:126;53852:378;-1:-1:-1;;;;53852:378:0:o;48109:605::-;20663:1;20809:7;;:19;20801:63;;;;-1:-1:-1;;;20801:63:0;;20246:2:1;20801:63:0;;;20228:21:1;20285:2;20265:18;;;20258:30;20324:33;20304:18;;;20297:61;20375:18;;20801:63:0;20044:355:1;20801:63:0;20663:1;20875:7;:18;-1:-1:-1;;;;;48246:24:0;::::1;:16;48254:7:::0;48246::::1;:16::i;:::-;-1:-1:-1::0;;;;;48246:24:0::1;;48238:52;;;::::0;-1:-1:-1;;;48238:52:0;;20606:2:1;48238:52:0::1;::::0;::::1;20588:21:1::0;20645:2;20625:18;;;20618:30;-1:-1:-1;;;20664:18:1;;;20657:45;20719:18;;48238:52:0::1;20404:339:1::0;48238:52:0::1;-1:-1:-1::0;;;;;48309:16:0;::::1;48301:41;;;::::0;-1:-1:-1;;;48301:41:0;;20950:2:1;48301:41:0::1;::::0;::::1;20932:21:1::0;20989:2;20969:18;;;20962:30;-1:-1:-1;;;21008:18:1;;;21001:42;21060:18;;48301:41:0::1;20748:336:1::0;48301:41:0::1;48379:1;48361:15;48371:4;48361:9;:15::i;:::-;:19;48353:44;;;::::0;-1:-1:-1;;;48353:44:0;;21291:2:1;48353:44:0::1;::::0;::::1;21273:21:1::0;21330:2;21310:18;;;21303:30;-1:-1:-1;;;21349:18:1;;;21342:42;21401:18;;48353:44:0::1;21089:336:1::0;48353:44:0::1;48462:29;48479:1;48483:7;48462:8;:29::i;:::-;-1:-1:-1::0;;;;;48552:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:22:::1;::::0;48572:1:::1;48552:19;:22::i;:::-;-1:-1:-1::0;;;;;48534:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:40;;;;48585:13;;::::1;::::0;;;;;:18;;48602:1:::1;::::0;48534:15;48585:18:::1;::::0;48602:1;;48585:18:::1;:::i;:::-;::::0;;;-1:-1:-1;;48614:16:0::1;::::0;;;:7:::1;:16;::::0;;;;;:21;;-1:-1:-1;;;;;;48614:21:0::1;-1:-1:-1::0;;;;;48614:21:0;;::::1;::::0;;::::1;::::0;;;48679:27;;48614:16;;48679:27;;::::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;20619:1:0;20916:7;:22;-1:-1:-1;48109:605:0:o;45820:738::-;53623:4;53647:16;;;:7;:16;;;;;;-1:-1:-1;;;;;53647:16:0;45872:49;;;;-1:-1:-1;;;45872:49:0;;21632:2:1;45872:49:0;;;21614:21:1;21671:2;21651:18;;;21644:30;-1:-1:-1;;;21690:18:1;;;21683:50;21750:18;;45872:49:0;21430:344:1;45872:49:0;45961:14;45978:16;45986:7;45978;:16::i;:::-;45961:33;;46035:29;46052:1;46056:7;46035:8;:29::i;:::-;-1:-1:-1;;;;;46107:17:0;;;;;;:9;:17;;;;;:22;;46128:1;;46107:17;:22;;46128:1;;46107:22;:::i;:::-;;;;-1:-1:-1;;46147:16:0;;;;:7;:16;;;;;46140:23;;-1:-1:-1;;;;;;46140:23:0;;;46211:12;:17;;46140:23;;46147:16;46211:17;;46140:23;;46211:17;:::i;:::-;;;;-1:-1:-1;;33070:3:0;46288:21;;46284:186;;;46326:11;:13;;;:11;:13;;;:::i;:::-;;;;;;46284:186;;;33118:5;46361:7;:21;46357:113;;;46399:11;:13;;;:11;:13;;;:::i;46357:113::-;46445:11;:13;;;:11;:13;;;:::i;:::-;;;;;;46357:113;46513:37;;46542:7;;46538:1;;-1:-1:-1;;;;;46513:37:0;;;;;46538:1;;46513:37;45861:697;45820:738;:::o;43958:256::-;44026:18;44032:2;44036:7;44026:5;:18::i;:::-;44077:51;44108:1;44112:2;44116:7;44077:51;;;;;;;;;;;;:22;:51::i;:::-;44055:151;;;;-1:-1:-1;;;44055:151:0;;22252:2:1;44055:151:0;;;22234:21:1;22291:2;22271:18;;;22264:30;22330:34;22310:18;;;22303:62;-1:-1:-1;;;22381:18:1;;;22374:48;22439:19;;44055:151:0;22050:414:1;49133:319:0;49285:9;-1:-1:-1;;;;;49274:20:0;:7;-1:-1:-1;;;;;49274:20:0;;49266:58;;;;-1:-1:-1;;;49266:58:0;;22671:2:1;49266:58:0;;;22653:21:1;22710:2;22690:18;;;22683:30;22749:27;22729:18;;;22722:55;22794:18;;49266:58:0;22469:349:1;49266:58:0;-1:-1:-1;;;;;49335:27:0;;;;;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;;:49;;-1:-1:-1;;49335:49:0;;;;;;;;;;49400:44;;540:41:1;;;49400:44:0;;513:18:1;49400:44:0;;;;;;;49133:319;;;:::o;47440:332::-;47589:28;47599:4;47605:2;47609:7;47589:9;:28::i;:::-;47650:48;47673:4;47679:2;47683:7;47692:5;47650:22;:48::i;:::-;47628:136;;;;-1:-1:-1;;;47628:136:0;;;;;;;:::i;52116:621::-;52196:27;52245:2;52251:1;52245:7;52241:50;;-1:-1:-1;;52269:10:0;;;;;;;;;;;;-1:-1:-1;;;52269:10:0;;;;;52116:621::o;52241:50::-;52313:2;52301:9;52348:69;52355:6;;52348:69;;52378:5;;;;:::i;:::-;;-1:-1:-1;52398:7:0;;-1:-1:-1;52403:2:0;52398:7;;:::i;:::-;;;52348:69;;;52427:17;52457:3;52447:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52447:14:0;-1:-1:-1;52427:34:0;-1:-1:-1;52484:3:0;52498:202;52505:7;;52498:202;;52533:5;52537:1;52533;:5;:::i;:::-;52529:9;-1:-1:-1;52553:10:0;52584:7;52589:2;52584;:7;:::i;:::-;52583:14;;52595:2;52583:14;:::i;:::-;52578:19;;:2;:19;:::i;:::-;52567:31;;:2;:31;:::i;:::-;52553:46;;52614:9;52633:4;52626:12;;52614:24;;52663:2;52653:4;52658:1;52653:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;52653:12:0;;;;;;;;-1:-1:-1;52680:8:0;52686:2;52680:8;;:::i;:::-;;;52514:186;;52498:202;;;-1:-1:-1;52724:4:0;52116:621;-1:-1:-1;;;;52116:621:0:o;1417:675::-;1500:7;1543:4;1500:7;1558:497;1582:5;:12;1578:1;:16;1558:497;;;1616:20;1639:5;1645:1;1639:8;;;;;;;;:::i;:::-;;;;;;;1616:31;;1682:12;1666;:28;1662:382;;2168:13;2218:15;;;2254:4;2247:15;;;2301:4;2285:21;;1794:57;;1662:382;;;2168:13;2218:15;;;2254:4;2247:15;;;2301:4;2285:21;;1971:57;;1662:382;-1:-1:-1;1596:3:0;;;;:::i;:::-;;;;1558:497;;;-1:-1:-1;2072:12:0;1417:675;-1:-1:-1;;;1417:675:0:o;21680:136::-;21738:7;21765:43;21769:1;21772;21765:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;21758:50;21680:136;-1:-1:-1;;;21680:136:0:o;44550:1041::-;53623:4;53647:16;;;:7;:16;;;;;;-1:-1:-1;;;;;53647:16:0;:30;44614:58;;;;-1:-1:-1;;;44614:58:0;;23863:2:1;44614:58:0;;;23845:21:1;23902:2;23882:18;;;23875:30;23941;23921:18;;;23914:58;23989:18;;44614:58:0;23661:352:1;44614:58:0;32073:5;44691:18;;:31;44683:69;;;;-1:-1:-1;;;44683:69:0;;24220:2:1;44683:69:0;;;24202:21:1;24259:2;24239:18;;;24232:30;24298:27;24278:18;;;24271:55;24343:18;;44683:69:0;24018:349:1;44683:69:0;44798:16;;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;44798:21:0;-1:-1:-1;;;;;44798:21:0;;;;;;;;44940:13;;:9;:13;;;;;:15;;-1:-1:-1;44940:15:0;;;;;;44970:12;:14;;;;;;44999:18;:20;;;;;;;33070:3;45038:21;;45034:210;;;45080:11;:13;;;;;;45034:210;;;33118:5;45119:7;:21;45115:129;;;45161:11;:13;;;;;;45115:129;;;45215:11;:13;;;;;;45115:129;33118:5;45324:18;;:33;45320:88;;45374:14;:22;;-1:-1:-1;;45374:22:0;;;45320:88;45460:13;;45445:50;;-1:-1:-1;;;45445:50:0;;;;;3220:25:1;;;-1:-1:-1;;;;;45460:13:0;;;;45445:41;;3193:18:1;;45445:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45550:33:0;;45575:7;;-1:-1:-1;;;;;;45550:33:0;;;-1:-1:-1;45567:1:0;;45550:33;;45567:1;;45550:33;44550:1041;;:::o;54927:920::-;55082:4;55103:15;:2;-1:-1:-1;;;;;55103:13:0;;:15::i;:::-;55099:741;;;55156:175;;-1:-1:-1;;;55156:175:0;;-1:-1:-1;;;;;55156:36:0;;;;;:175;;20404:10;;55250:4;;55277:7;;55307:5;;55156:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55156:175:0;;;;;;;;-1:-1:-1;;55156:175:0;;;;;;;;;;;;:::i;:::-;;;55135:650;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55514:6;:13;55531:1;55514:18;55510:260;;55557:48;;-1:-1:-1;;;55557:48:0;;;;;;;:::i;55510:260::-;55720:6;55714:13;55705:6;55701:2;55697:15;55690:38;55135:650;-1:-1:-1;;;;;;55395:51:0;-1:-1:-1;;;55395:51:0;;-1:-1:-1;55388:58:0;;55099:741;-1:-1:-1;55824:4:0;54927:920;;;;;;:::o;22119:226::-;22239:7;22275:12;22267:6;;;;22259:29;;;;-1:-1:-1;;;22259:29:0;;;;;;;;:::i;:::-;-1:-1:-1;22299:9:0;22311:5;22315:1;22311;:5;:::i;:::-;22299:17;22119:226;-1:-1:-1;;;;;22119:226:0:o;13878:641::-;13938:4;14419:20;;14249:66;14468:23;;;;;;:42;;-1:-1:-1;;14495:15:0;;;14460:51;-1:-1:-1;;13878:641:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2192:367::-;2255:8;2265:6;2319:3;2312:4;2304:6;2300:17;2296:27;2286:55;;2337:1;2334;2327:12;2286:55;-1:-1:-1;2360:20:1;;2403:18;2392:30;;2389:50;;;2435:1;2432;2425:12;2389:50;2472:4;2464:6;2460:17;2448:29;;2532:3;2525:4;2515:6;2512:1;2508:14;2500:6;2496:27;2492:38;2489:47;2486:67;;;2549:1;2546;2539:12;2486:67;2192:367;;;;;:::o;2564:505::-;2659:6;2667;2675;2728:2;2716:9;2707:7;2703:23;2699:32;2696:52;;;2744:1;2741;2734:12;2696:52;2780:9;2767:23;2757:33;;2841:2;2830:9;2826:18;2813:32;2868:18;2860:6;2857:30;2854:50;;;2900:1;2897;2890:12;2854:50;2939:70;3001:7;2992:6;2981:9;2977:22;2939:70;:::i;:::-;2564:505;;3028:8;;-1:-1:-1;2913:96:1;;-1:-1:-1;;;;2564:505:1:o;3256:456::-;3333:6;3341;3349;3402:2;3390:9;3381:7;3377:23;3373:32;3370:52;;;3418:1;3415;3408:12;3370:52;3457:9;3444:23;3476:31;3501:5;3476:31;:::i;:::-;3526:5;-1:-1:-1;3583:2:1;3568:18;;3555:32;3596:33;3555:32;3596:33;:::i;:::-;3256:456;;3648:7;;-1:-1:-1;;;3702:2:1;3687:18;;;;3674:32;;3256:456::o;3899:592::-;3970:6;3978;4031:2;4019:9;4010:7;4006:23;4002:32;3999:52;;;4047:1;4044;4037:12;3999:52;4087:9;4074:23;4116:18;4157:2;4149:6;4146:14;4143:34;;;4173:1;4170;4163:12;4143:34;4211:6;4200:9;4196:22;4186:32;;4256:7;4249:4;4245:2;4241:13;4237:27;4227:55;;4278:1;4275;4268:12;4227:55;4318:2;4305:16;4344:2;4336:6;4333:14;4330:34;;;4360:1;4357;4350:12;4330:34;4405:7;4400:2;4391:6;4387:2;4383:15;4379:24;4376:37;4373:57;;;4426:1;4423;4416:12;4373:57;4457:2;4449:11;;;;;4479:6;;-1:-1:-1;3899:592:1;;-1:-1:-1;;;;3899:592:1:o;4496:118::-;4582:5;4575:13;4568:21;4561:5;4558:32;4548:60;;4604:1;4601;4594:12;4619:241;4675:6;4728:2;4716:9;4707:7;4703:23;4699:32;4696:52;;;4744:1;4741;4734:12;4696:52;4783:9;4770:23;4802:28;4824:5;4802:28;:::i;4865:247::-;4924:6;4977:2;4965:9;4956:7;4952:23;4948:32;4945:52;;;4993:1;4990;4983:12;4945:52;5032:9;5019:23;5051:31;5076:5;5051:31;:::i;5117:632::-;5288:2;5340:21;;;5410:13;;5313:18;;;5432:22;;;5259:4;;5288:2;5511:15;;;;5485:2;5470:18;;;5259:4;5554:169;5568:6;5565:1;5562:13;5554:169;;;5629:13;;5617:26;;5698:15;;;;5663:12;;;;5590:1;5583:9;5554:169;;;-1:-1:-1;5740:3:1;;5117:632;-1:-1:-1;;;;;;5117:632:1:o;5754:773::-;5876:6;5884;5892;5900;5953:2;5941:9;5932:7;5928:23;5924:32;5921:52;;;5969:1;5966;5959:12;5921:52;6009:9;5996:23;6038:18;6079:2;6071:6;6068:14;6065:34;;;6095:1;6092;6085:12;6065:34;6134:70;6196:7;6187:6;6176:9;6172:22;6134:70;:::i;:::-;6223:8;;-1:-1:-1;6108:96:1;-1:-1:-1;6311:2:1;6296:18;;6283:32;;-1:-1:-1;6327:16:1;;;6324:36;;;6356:1;6353;6346:12;6324:36;;6395:72;6459:7;6448:8;6437:9;6433:24;6395:72;:::i;:::-;5754:773;;;;-1:-1:-1;6486:8:1;-1:-1:-1;;;;5754:773:1:o;6717:382::-;6782:6;6790;6843:2;6831:9;6822:7;6818:23;6814:32;6811:52;;;6859:1;6856;6849:12;6811:52;6898:9;6885:23;6917:31;6942:5;6917:31;:::i;:::-;6967:5;-1:-1:-1;7024:2:1;7009:18;;6996:32;7037:30;6996:32;7037:30;:::i;:::-;7086:7;7076:17;;;6717:382;;;;;:::o;7311:127::-;7372:10;7367:3;7363:20;7360:1;7353:31;7403:4;7400:1;7393:15;7427:4;7424:1;7417:15;7443:1266;7538:6;7546;7554;7562;7615:3;7603:9;7594:7;7590:23;7586:33;7583:53;;;7632:1;7629;7622:12;7583:53;7671:9;7658:23;7690:31;7715:5;7690:31;:::i;:::-;7740:5;-1:-1:-1;7797:2:1;7782:18;;7769:32;7810:33;7769:32;7810:33;:::i;:::-;7862:7;-1:-1:-1;7916:2:1;7901:18;;7888:32;;-1:-1:-1;7971:2:1;7956:18;;7943:32;7994:18;8024:14;;;8021:34;;;8051:1;8048;8041:12;8021:34;8089:6;8078:9;8074:22;8064:32;;8134:7;8127:4;8123:2;8119:13;8115:27;8105:55;;8156:1;8153;8146:12;8105:55;8192:2;8179:16;8214:2;8210;8207:10;8204:36;;;8220:18;;:::i;:::-;8295:2;8289:9;8263:2;8349:13;;-1:-1:-1;;8345:22:1;;;8369:2;8341:31;8337:40;8325:53;;;8393:18;;;8413:22;;;8390:46;8387:72;;;8439:18;;:::i;:::-;8479:10;8475:2;8468:22;8514:2;8506:6;8499:18;8554:7;8549:2;8544;8540;8536:11;8532:20;8529:33;8526:53;;;8575:1;8572;8565:12;8526:53;8631:2;8626;8622;8618:11;8613:2;8605:6;8601:15;8588:46;8676:1;8671:2;8666;8658:6;8654:15;8650:24;8643:35;8697:6;8687:16;;;;;;;7443:1266;;;;;;;:::o;8943:388::-;9011:6;9019;9072:2;9060:9;9051:7;9047:23;9043:32;9040:52;;;9088:1;9085;9078:12;9040:52;9127:9;9114:23;9146:31;9171:5;9146:31;:::i;:::-;9196:5;-1:-1:-1;9253:2:1;9238:18;;9225:32;9266:33;9225:32;9266:33;:::i;10500:343::-;10702:2;10684:21;;;10741:2;10721:18;;;10714:30;-1:-1:-1;;;10775:2:1;10760:18;;10753:49;10834:2;10819:18;;10500:343::o;10848:337::-;11050:2;11032:21;;;11089:2;11069:18;;;11062:30;-1:-1:-1;;;11123:2:1;11108:18;;11101:43;11176:2;11161:18;;10848:337::o;11190:347::-;11392:2;11374:21;;;11431:2;11411:18;;;11404:30;11470:25;11465:2;11450:18;;11443:53;11528:2;11513:18;;11190:347::o;12128:127::-;12189:10;12184:3;12180:20;12177:1;12170:31;12220:4;12217:1;12210:15;12244:4;12241:1;12234:15;12260:128;12300:3;12331:1;12327:6;12324:1;12321:13;12318:39;;;12337:18;;:::i;:::-;-1:-1:-1;12373:9:1;;12260:128::o;12393:353::-;12595:2;12577:21;;;12634:2;12614:18;;;12607:30;12673:31;12668:2;12653:18;;12646:59;12737:2;12722:18;;12393:353::o;13060:245::-;13127:6;13180:2;13168:9;13159:7;13155:23;13151:32;13148:52;;;13196:1;13193;13186:12;13148:52;13228:9;13222:16;13247:28;13269:5;13247:28;:::i;13310:343::-;13512:2;13494:21;;;13551:2;13531:18;;;13524:30;-1:-1:-1;;;13585:2:1;13570:18;;13563:49;13644:2;13629:18;;13310:343::o;13868:127::-;13929:10;13924:3;13920:20;13917:1;13910:31;13960:4;13957:1;13950:15;13984:4;13981:1;13974:15;14000:135;14039:3;14060:17;;;14057:43;;14080:18;;:::i;:::-;-1:-1:-1;14127:1:1;14116:13;;14000:135::o;14851:184::-;14921:6;14974:2;14962:9;14953:7;14949:23;14945:32;14942:52;;;14990:1;14987;14980:12;14942:52;-1:-1:-1;15013:16:1;;14851:184;-1:-1:-1;14851:184:1:o;15319:251::-;15389:6;15442:2;15430:9;15421:7;15417:23;15413:32;15410:52;;;15458:1;15455;15448:12;15410:52;15490:9;15484:16;15509:31;15534:5;15509:31;:::i;15575:380::-;15654:1;15650:12;;;;15697;;;15718:61;;15772:4;15764:6;15760:17;15750:27;;15718:61;15825:2;15817:6;15814:14;15794:18;15791:38;15788:161;;15871:10;15866:3;15862:20;15859:1;15852:31;15906:4;15903:1;15896:15;15934:4;15931:1;15924:15;15788:161;;15575:380;;;:::o;16086:973::-;16171:12;;16136:3;;16226:1;16246:18;;;;16299;;;;16326:61;;16380:4;16372:6;16368:17;16358:27;;16326:61;16406:2;16454;16446:6;16443:14;16423:18;16420:38;16417:161;;16500:10;16495:3;16491:20;16488:1;16481:31;16535:4;16532:1;16525:15;16563:4;16560:1;16553:15;16417:161;16594:18;16621:104;;;;16739:1;16734:319;;;;16587:466;;16621:104;-1:-1:-1;;16654:24:1;;16642:37;;16699:16;;;;-1:-1:-1;16621:104:1;;16734:319;16033:1;16026:14;;;16070:4;16057:18;;16828:1;16842:165;16856:6;16853:1;16850:13;16842:165;;;16934:14;;16921:11;;;16914:35;16977:16;;;;16871:10;;16842:165;;;16846:3;;17036:6;17031:3;17027:16;17020:23;;16587:466;;;;;;;16086:973;;;;:::o;17064:376::-;17240:3;17268:38;17302:3;17294:6;17268:38;:::i;:::-;17335:6;17329:13;17351:52;17396:6;17392:2;17385:4;17377:6;17373:17;17351:52;:::i;:::-;17419:15;;17064:376;-1:-1:-1;;;;17064:376:1:o;17445:356::-;17621:3;17659:6;17653:13;17675:53;17721:6;17716:3;17709:4;17701:6;17697:17;17675:53;:::i;:::-;17744:51;17787:6;17782:3;17778:16;17770:6;17744:51;:::i;17806:277::-;17979:3;18004:73;18038:38;18072:3;18064:6;18038:38;:::i;:::-;18030:6;18004:73;:::i;18088:168::-;18128:7;18194:1;18190;18186:6;18182:14;18179:1;18176:21;18171:1;18164:9;18157:17;18153:45;18150:71;;;18201:18;;:::i;:::-;-1:-1:-1;18241:9:1;;18088:168::o;21779:125::-;21819:4;21847:1;21844;21841:8;21838:34;;;21852:18;;:::i;:::-;-1:-1:-1;21889:9:1;;21779:125::o;21909:136::-;21948:3;21976:5;21966:39;;21985:18;;:::i;:::-;-1:-1:-1;;;22021:18:1;;21909:136::o;22823:402::-;23025:2;23007:21;;;23064:2;23044:18;;;23037:30;23103:34;23098:2;23083:18;;23076:62;-1:-1:-1;;;23169:2:1;23154:18;;23147:36;23215:3;23200:19;;22823:402::o;23230:217::-;23270:1;23296;23286:132;;23340:10;23335:3;23331:20;23328:1;23321:31;23375:4;23372:1;23365:15;23403:4;23400:1;23393:15;23286:132;-1:-1:-1;23432:9:1;;23230:217::o;23452:204::-;23490:3;23526:4;23523:1;23519:12;23558:4;23555:1;23551:12;23593:3;23587:4;23583:14;23578:3;23575:23;23572:49;;;23601:18;;:::i;:::-;23637:13;;23452:204;-1:-1:-1;;;23452:204:1:o;24372:489::-;-1:-1:-1;;;;;24641:15:1;;;24623:34;;24693:15;;24688:2;24673:18;;24666:43;24740:2;24725:18;;24718:34;;;24788:3;24783:2;24768:18;;24761:31;;;24566:4;;24809:46;;24835:19;;24827:6;24809:46;:::i;:::-;24801:54;24372:489;-1:-1:-1;;;;;;24372:489:1:o;24866:249::-;24935:6;24988:2;24976:9;24967:7;24963:23;24959:32;24956:52;;;25004:1;25001;24994:12;24956:52;25036:9;25030:16;25055:30;25079:5;25055:30;:::i

Swarm Source

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