ETH Price: $2,428.06 (+3.39%)

Token

Bodega Blocks (BODEGA)
 

Overview

Max Total Supply

111 BODEGA

Holders

46

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
foundersfactorynetwork.eth
Balance
4 BODEGA
0x9026ba685ea3e0e35a5085072e292849935ce2a9
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-09-10
*/

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

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

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;

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

    // Mapping from owner to excluded rewards
    mapping(uint256 => uint256) totalExcluded;

    // total rewards received
    uint256 public totalRewards;

    // reward token
    IERC20 public constant rewardToken = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7);

    // precision factor
    uint256 private PRECISION = 10**18;

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

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

    // allocation points
    uint256 public allocationClass0 = 167;
    uint256 public allocationClass1 = 133;
    uint256 public allocationClass2 = 100;
    uint256 public totalAllocation = 400;

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

    // total dividends for tracking
    uint256 private dividendsPerNFTClass0;
    uint256 private dividendsPerNFTClass1;
    uint256 private dividendsPerNFTClass2;

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

    // Whitelisted Users
    mapping(address => bool) public isWhitelisted;


    modifier canMint(uint256 numberOfMints) {
        require(tradingEnabled, "Trading Not Enabled");
        if (whitelistEnabled) {
            require(isWhitelisted[msg.sender], "Sender Not Whitelisted");
        }
        require(numberOfMints > 0, "Invalid Input");
        _;
    }

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

    function setAllocations(
        uint256 first,
        uint256 second,
        uint256 third
    ) external onlyOwner {
        require(first > 0 && second > 0 && third > 0, "Zero Values");
        allocationClass0 = first;
        allocationClass1 = second;
        allocationClass2 = third;
        totalAllocation = first + second + third;
    }

    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 {
        require(token_ != address(0), "Zero Address");
        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 addWhitelist(address[] calldata users) external onlyOwner {
        uint256 length = users.length;
        for (uint256 i = 0; i < length; ) {
            isWhitelisted[users[i]] = true;
            unchecked {
                ++i;
            }
        }
    }

    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)
        external
        payable
        canMint(numberOfMints)
    {
        require(currentSupplyIndex >= breakPoint1, "Mint Exceeds Breakpoint");
        _mintETH(numberOfMints);
    }

    /**
     * Mints `numberOfMints` NFTs To Caller
     */
    function mintUSDTFinalPortion(uint256 numberOfMints)
        external
        canMint(numberOfMints)
    {
        require(currentSupplyIndex >= breakPoint1, "Mint Exceeds Breakpoint");
        _mintUSDT(numberOfMints);
    }

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

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

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

    function claimRewardsForUser(address user) public nonReentrant {
        _batchClaimRewardsMemory(user, getIDsByOwner(user));
    }

    function claimRewards(uint256[] calldata tokenIds) public nonReentrant {
        _batchClaimRewards(msg.sender, tokenIds);
    }

    function claimReward(uint256 tokenId) external nonReentrant {
        _claimReward(tokenId);
    }

    function depositRewards(uint256 amount) external nonReentrant {
        uint256 received = _transferIn(amount);
        _register(received);
    }

    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 {
        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 {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        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 {
        // cost to mint in USDT
        uint256 cost = costUSDT * numberOfMints;
        uint256 received = _transferIn(cost);
        require(cost <= received, "Incorrect Value Sent");

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

        // send out USDT
        _send(this.getOwner(), received);
    }

    function _register(uint256 amount) internal {
        totalRewards += amount;
        (uint256 c0, uint256 c1, uint256 c2) = divvyRewards(amount);
        if (totalClass0 > 0) {
            dividendsPerNFTClass0 += (c0 * PRECISION) / totalClass0;
        }
        if (totalClass1 > 0) {
            dividendsPerNFTClass1 += (c1 * PRECISION) / totalClass1;
        }
        if (totalClass2 > 0) {
            dividendsPerNFTClass2 += (c2 * PRECISION) / totalClass2;
        }
    }

    function _transferIn(uint256 amount) internal returns (uint256) {
        uint256 before = rewardToken.balanceOf(address(this));
        require(
            rewardToken.transferFrom(msg.sender, address(this), amount),
            "ERR Transfer From"
        );
        uint256 After = rewardToken.balanceOf(address(this));
        require(After > before, "Zero Received");
        return After - before;
    }

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

        _balances[to] += 1;
        _owners[tokenId] = to;
        _totalSupply++;
        currentSupplyIndex++;
        totalExcluded[tokenId] = getCumulativeDividends(tokenId);

        if (tokenId < breakPoint0) {
            totalClass0++;
        } else if (tokenId < breakPoint1) {
            totalClass1++;
        } else {
            totalClass2++;
        }

        if (currentSupplyIndex == breakPoint1) {
            tradingEnabled = false;
        }

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

        // Claim Rewards For tokenId
        _claimReward(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);

        // claim rewards for tokenId
        _claimReward(tokenId);

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

        // reset reward allocations
        totalExcluded[tokenId] = getCumulativeDividends(tokenId);

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

    /**
        Claims Reward For User
     */
    function _claimReward(uint256 tokenId) internal {
        // return if zero owner
        address user = _owners[tokenId];
        if (user == address(0)) {
            return;
        }

        // fetch pending rewards
        uint256 pending = pendingRewardsForID(tokenId);

        // reset total rewards
        totalExcluded[tokenId] = getCumulativeDividends(tokenId);

        // transfer reward to user
        _send(user, pending);
    }

    function _batchClaimRewards(address user, uint256[] calldata tokenIds)
        internal
    {
        uint256 total;
        uint256 len = tokenIds.length;

        for (uint256 i = 0; i < len; ) {
            uint256 ID = tokenIds[i];
            require(_owners[ID] == user, "Not Owner Of TokenID");
            total += pendingRewardsForID(ID);
            totalExcluded[ID] = getCumulativeDividends(ID);
            unchecked {
                ++i;
            }
        }

        // send rewards to user
        _send(user, total);
    }

    function _batchClaimRewardsMemory(address user, uint256[] memory tokenIds)
        internal
    {
        uint256 total;
        uint256 len = tokenIds.length;

        for (uint256 i = 0; i < len; ) {
            uint256 ID = tokenIds[i];
            require(_owners[ID] == user, "Not Owner Of TokenID");
            total += pendingRewardsForID(ID);
            totalExcluded[ID] = getCumulativeDividends(ID);
            unchecked {
                ++i;
            }
        }

        // send rewards to user
        _send(user, total);
    }

    function _send(address to, uint256 amount) internal {
        // reward token balance
        uint256 rBal = rewardToken.balanceOf(address(this));
        if (amount > rBal) {
            amount = rBal;
        }

        // return if no rewards
        if (amount == 0) {
            return;
        }

        // require success
        require(rewardToken.transfer(to, amount), "ERROR SENDING USDT");
    }

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

    function divvyRewards(uint256 amount)
        public
        view
        returns (
            uint256 class0,
            uint256 class1,
            uint256 class2
        )
    {
        class0 = (amount * allocationClass0) / totalAllocation;
        class1 = (amount * allocationClass1) / totalAllocation;
        class2 = amount - (class0 + class1);
    }

    /**
     * @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)
    {
        require(_exists(tokenId), "nonexistent token");

        string memory idstr = uint2str(tokenId);
        string memory fHalf = string.concat(baseURI, idstr);
        return string.concat(fHalf, 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];
    }

    /**
        Pending Rewards For `tokenId`
     */
    function pendingRewardsForUser(address user)
        public
        view
        returns (uint256 total)
    {
        uint256[] memory tokenIds = getIDsByOwner(user);

        uint256 len = tokenIds.length;
        for (uint256 i = 0; i < len; ) {
            total += pendingRewardsForID(tokenIds[i]);
            unchecked {
                ++i;
            }
        }
    }

    /**
        Pending Rewards For `tokenId`
     */
    function pendingRewards(uint256[] calldata tokenIds)
        public
        view
        returns (uint256 total)
    {
        uint256 len = tokenIds.length;
        for (uint256 i = 0; i < len; ) {
            total += pendingRewardsForID(tokenIds[i]);
            unchecked {
                ++i;
            }
        }
    }

    /**
        Pending Rewards For `tokenId`
     */
    function pendingRewardsForID(uint256 tokenId)
        public
        view
        returns (uint256)
    {
        if (_owners[tokenId] == address(0)) {
            return 0;
        }

        uint256 accountTotalDividends = getCumulativeDividends(tokenId);
        uint256 accountTotalExcluded = totalExcluded[tokenId];

        if (accountTotalDividends <= accountTotalExcluded) {
            return 0;
        }

        return accountTotalDividends.sub(accountTotalExcluded);
    }

    /**
        Cumulative Dividends For A Number Of Tokens
     */
    function getCumulativeDividends(uint256 tokenId)
        internal
        view
        returns (uint256)
    {
        if (tokenId < breakPoint0) {
            return dividendsPerNFTClass0 / PRECISION;
        } else if (tokenId < breakPoint1) {
            return dividendsPerNFTClass1 / PRECISION;
        } else {
            return dividendsPerNFTClass2 / PRECISION;
        }
    }

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

[{"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":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allocationClass0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allocationClass1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allocationClass2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"claimRewardsForUser","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"divvyRewards","outputs":[{"internalType":"uint256","name":"class0","type":"uint256"},{"internalType":"uint256","name":"class1","type":"uint256"},{"internalType":"uint256","name":"class2","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mintFinalPortion","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mintFirstPortion","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mintUSDTFinalPortion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"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":[{"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":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"pendingRewardsForID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"pendingRewardsForUser","outputs":[{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","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":"uint256","name":"first","type":"uint256"},{"internalType":"uint256","name":"second","type":"uint256"},{"internalType":"uint256","name":"third","type":"uint256"}],"name":"setAllocations","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":"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":"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":"totalAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"totalRewards","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"}]

670de0b6b3a7640000600a90815560c060405260808190526974656d705f696d61676560b01b60a09081526200003991600b9190620000f6565b50604080518082019091526004808252632e706e6760e01b60209092019182526200006791600c91620000f6565b5067022dc6ab0dbc8000600d55630ee6b280600e5560a7600f55608560105560646011556101906012556019805461ffff1916610100179055348015620000ad57600080fd5b506001600081815581546001600160a01b031916339081179092556040517f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735908290a3620001d8565b82805462000104906200019c565b90600052602060002090601f01602090048101928262000128576000855562000173565b82601f106200014357805160ff191683800117855562000173565b8280016001018555821562000173579182015b828111156200017357825182559160200191906001019062000156565b506200018192915062000185565b5090565b5b8082111562000181576000815560010162000186565b600181811c90821680620001b157607f821691505b602082108103620001d257634e487b7160e01b600052602260045260246000fd5b50919050565b61382980620001e86000396000f3fe6080604052600436106103b15760003560e01c806379203dc4116101e7578063a6f9dae11161010d578063cdfb2b4e116100a0578063e985e9c51161006f578063e985e9c514610ab0578063edac985b14610af9578063f7c618c114610b19578063fda2773614610b4157600080fd5b8063cdfb2b4e14610a5b578063d6b0f48414610a70578063deb8499714610a85578063e797ec1b14610a9b57600080fd5b8063b88d4fde116100dc578063b88d4fde146109e5578063bc6e82b314610a05578063c74e2f0c14610a1b578063c87b56dd14610a3b57600080fd5b8063a6f9dae11461096d578063ae169a501461098d578063ae9843d6146109ad578063b36444c8146109cf57600080fd5b80638ca5affd1161018557806395d89b411161015457806395d89b41146108de578063999f57301461090d578063a22cb4651461092d578063a3e08fd81461094d57600080fd5b80638ca5affd146108645780638d673c941461087757806390373223146108b257806391db3da5146108c857600080fd5b8063887c207a116101c1578063887c207a146107f0578063893d20e81461080657806389476069146108245780638bdf67f21461084457600080fd5b806379203dc4146107b25780637e20d0c1146107c85780637e5cd5c1146107db57600080fd5b80633af32abf116102d75780635bf244be1161026a57806367349ad81161023957806367349ad81461074657806367a594f61461075c57806369f7d2f21461077257806370a082311461079257600080fd5b80635bf244be146106c45780635eac6239146106f15780635ece6aa1146107115780636352211e1461072657600080fd5b80634408a046116102a65780634408a0461461064b5780634ada218b1461066b57806351fb012d1461068557806355f804b3146106a457600080fd5b80633af32abf146105c65780633ccfd60b146105f657806342842e0e1461060b57806342966c681461062b57600080fd5b806318160ddd1161034f5780632a1e53151161031e5780632a1e53151461055057806331ff37e91461057057806332cb6b0c1461059057806337619e76146105a657600080fd5b806318160ddd146104e55780631d0a6ff2146104fa5780631e2639901461051a57806323b872dd1461053057600080fd5b8063081812fc1161038b578063081812fc1461045f578063095ea7b3146104975780630e15561a146104b957806316505929146104cf57600080fd5b806301abbf73146103bd57806301ffc9a7146103f057806306fdde031461042057600080fd5b366103b857005b600080fd5b3480156103c957600080fd5b506103dd6103d8366004612f06565b610b61565b6040519081526020015b60405180910390f35b3480156103fc57600080fd5b5061041061040b366004612f35565b610bc5565b60405190151581526020016103e7565b34801561042c57600080fd5b5060408051808201909152600d81526c426f6465676120426c6f636b7360981b60208201525b6040516103e79190612faa565b34801561046b57600080fd5b5061047f61047a366004612f06565b610c17565b6040516001600160a01b0390911681526020016103e7565b3480156104a357600080fd5b506104b76104b2366004612fd2565b610ca8565b005b3480156104c557600080fd5b506103dd60095481565b3480156104db57600080fd5b506103dd60115481565b3480156104f157600080fd5b506002546103dd565b34801561050657600080fd5b506104b7610515366004612f06565b610d97565b34801561052657600080fd5b506103dd60035481565b34801561053c57600080fd5b506104b761054b366004612ffe565b610e56565b34801561055c57600080fd5b506104b761056b366004612f06565b610e88565b34801561057c57600080fd5b506104b761058b366004612f06565b610eb7565b34801561059c57600080fd5b506103dd61232781565b3480156105b257600080fd5b506104b76105c136600461303f565b610ee6565b3480156105d257600080fd5b506104106105e136600461303f565b601a6020526000908152604090205460ff1681565b34801561060257600080fd5b506104b7610f27565b34801561061757600080fd5b506104b7610626366004612ffe565b610fa9565b34801561063757600080fd5b506104b7610646366004612f06565b610fc4565b34801561065757600080fd5b506104b761066636600461305c565b610ff2565b34801561067757600080fd5b506019546104109060ff1681565b34801561069157600080fd5b5060195461041090610100900460ff1681565b3480156106b057600080fd5b506104b76106bf36600461305c565b611028565b3480156106d057600080fd5b506106e46106df36600461303f565b61105e565b6040516103e791906130ce565b3480156106fd57600080fd5b506104b761070c36600461315e565b61113b565b34801561071d57600080fd5b506103dd606f81565b34801561073257600080fd5b5061047f610741366004612f06565b611176565b34801561075257600080fd5b506103dd60155481565b34801561076857600080fd5b506103dd60145481565b34801561077e57600080fd5b506104b761078d3660046131a0565b6111db565b34801561079e57600080fd5b506103dd6107ad36600461303f565b611289565b3480156107be57600080fd5b506103dd60125481565b6104b76107d6366004612f06565b6112fd565b3480156107e757600080fd5b506104b76113ad565b3480156107fc57600080fd5b506103dd6104c681565b34801561081257600080fd5b506001546001600160a01b031661047f565b34801561083057600080fd5b506104b761083f36600461303f565b6113e3565b34801561085057600080fd5b506104b761085f366004612f06565b611533565b6104b7610872366004612f06565b611570565b34801561088357600080fd5b50610897610892366004612f06565b611622565b604080519384526020840192909252908201526060016103e7565b3480156108be57600080fd5b506103dd600e5481565b3480156108d457600080fd5b506103dd600d5481565b3480156108ea57600080fd5b50604080518082019091526006815265424f4445474160d01b6020820152610452565b34801561091957600080fd5b506104b7610928366004612f06565b61167d565b34801561093957600080fd5b506104b761094836600461321a565b611724565b34801561095957600080fd5b506103dd61096836600461303f565b61172f565b34801561097957600080fd5b506104b761098836600461303f565b611789565b34801561099957600080fd5b506104b76109a8366004612f06565b61180f565b3480156109b957600080fd5b50604051630a85bd0160e11b81526020016103e7565b3480156109db57600080fd5b506103dd60135481565b3480156109f157600080fd5b506104b7610a00366004613269565b61183f565b348015610a1157600080fd5b506103dd60105481565b348015610a2757600080fd5b506103dd610a3636600461315e565b611877565b348015610a4757600080fd5b50610452610a56366004612f06565b6118c1565b348015610a6757600080fd5b506104b761197c565b348015610a7c57600080fd5b506104b76119b7565b348015610a9157600080fd5b506103dd600f5481565b348015610aa757600080fd5b506104b76119ee565b348015610abc57600080fd5b50610410610acb366004613349565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b0557600080fd5b506104b7610b1436600461315e565b611a27565b348015610b2557600080fd5b5061047f73dac17f958d2ee523a2206206994597c13d831ec781565b348015610b4d57600080fd5b506104b7610b5c366004613377565b611aba565b6000818152600460205260408120546001600160a01b0316610b8557506000919050565b6000610b9083611b66565b600084815260086020526040902054909150808211610bb3575060009392505050565b610bbd8282611bab565b949350505050565b60006001600160e01b031982166380ac58cd60e01b1480610bf657506001600160e01b03198216635b5e139f60e01b145b80610c1157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000818152600460205260408120546001600160a01b0316610c8c5760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610cb382611176565b9050806001600160a01b0316836001600160a01b031603610d205760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c83565b336001600160a01b0382161480610d3c5750610d3c8133610acb565b610d885760405162461bcd60e51b815260206004820152601d60248201527f4552433732313a206e6f7420617070726f766564206f72206f776e65720000006044820152606401610c83565b610d928383611bf4565b505050565b601954819060ff16610dbb5760405162461bcd60e51b8152600401610c83906133a3565b601954610100900460ff1615610dfa57336000908152601a602052604090205460ff16610dfa5760405162461bcd60e51b8152600401610c83906133d0565b60008111610e1a5760405162461bcd60e51b8152600401610c8390613400565b6104c682600354610e2b919061343d565b1115610e495760405162461bcd60e51b8152600401610c8390613455565b610e5282611c62565b5050565b610e61335b82611d53565b610e7d5760405162461bcd60e51b8152600401610c839061348c565b610d92838383611e31565b6001546001600160a01b03163314610eb25760405162461bcd60e51b8152600401610c83906134c3565b600d55565b6001546001600160a01b03163314610ee15760405162461bcd60e51b8152600401610c83906134c3565b600e55565b600260005403610f085760405162461bcd60e51b8152600401610c83906134f0565b6002600055610f1f81610f1a8161105e565b612037565b506001600055565b6001546001600160a01b03163314610f515760405162461bcd60e51b8152600401610c83906134c3565b604051600090339047908381818185875af1925050503d8060008114610f93576040519150601f19603f3d011682016040523d82523d6000602084013e610f98565b606091505b5050905080610fa657600080fd5b50565b610d928383836040518060200160405280600081525061183f565b610fcd33610e5b565b610fe95760405162461bcd60e51b8152600401610c839061348c565b610fa68161210b565b6001546001600160a01b0316331461101c5760405162461bcd60e51b8152600401610c83906134c3565b610d92600c8383612e6d565b6001546001600160a01b031633146110525760405162461bcd60e51b8152600401610c83906134c3565b610d92600b8383612e6d565b6060600061106b83611289565b67ffffffffffffffff81111561108357611083613253565b6040519080825280602002602001820160405280156110ac578160200160208202803683370190505b5090506110b883611289565b6000036110c55792915050565b6000805b600354811015611132576000818152600460205260409020546001600160a01b03808716911603611120578083838151811061110757611107613527565b60209081029190910101528161111c8161353d565b9250505b8061112a8161353d565b9150506110c9565b50909392505050565b60026000540361115d5760405162461bcd60e51b8152600401610c83906134f0565b600260005561116d338383612278565b50506001600055565b6000818152600460205260408120546001600160a01b031680610c115760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610c83565b6001546001600160a01b031633146112055760405162461bcd60e51b8152600401610c83906134c3565b8260005b818110156112815760005b84848381811061122657611226613527565b905060200201358110156112785761126687878481811061124957611249613527565b905060200201602081019061125e919061303f565b600354612350565b806112708161353d565b915050611214565b50600101611209565b505050505050565b60006001600160a01b0382166112e15760405162461bcd60e51b815260206004820152601a60248201527f717565727920666f7220746865207a65726f20616464726573730000000000006044820152606401610c83565b506001600160a01b031660009081526005602052604090205490565b601954819060ff166113215760405162461bcd60e51b8152600401610c83906133a3565b601954610100900460ff161561136057336000908152601a602052604090205460ff166113605760405162461bcd60e51b8152600401610c83906133d0565b600081116113805760405162461bcd60e51b8152600401610c8390613400565b6104c660035410156113a45760405162461bcd60e51b8152600401610c8390613455565b610e52826123dd565b6001546001600160a01b031633146113d75760405162461bcd60e51b8152600401610c83906134c3565b6019805460ff19169055565b6001546001600160a01b0316331461140d5760405162461bcd60e51b8152600401610c83906134c3565b6001600160a01b0381166114525760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610c83565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156114a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c49190613556565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561150f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e52919061356f565b6002600054036115555760405162461bcd60e51b8152600401610c83906134f0565b6002600090815561156582612450565b905061116d8161264e565b601954819060ff166115945760405162461bcd60e51b8152600401610c83906133a3565b601954610100900460ff16156115d357336000908152601a602052604090205460ff166115d35760405162461bcd60e51b8152600401610c83906133d0565b600081116115f35760405162461bcd60e51b8152600401610c8390613400565b6104c682600354611604919061343d565b11156113a45760405162461bcd60e51b8152600401610c8390613455565b6000806000601254600f5485611638919061358c565b61164291906135ab565b925060125460105485611655919061358c565b61165f91906135ab565b915061166b828461343d565b61167590856135cd565b929491935050565b601954819060ff166116a15760405162461bcd60e51b8152600401610c83906133a3565b601954610100900460ff16156116e057336000908152601a602052604090205460ff166116e05760405162461bcd60e51b8152600401610c83906133d0565b600081116117005760405162461bcd60e51b8152600401610c8390613400565b6104c66003541015610e495760405162461bcd60e51b8152600401610c8390613455565b610e5233838361272c565b60008061173b8361105e565b805190915060005b818110156117815761176d83828151811061176057611760613527565b6020026020010151610b61565b611777908561343d565b9350600101611743565b505050919050565b6001546001600160a01b031633146117b35760405162461bcd60e51b8152600401610c83906134c3565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002600054036118315760405162461bcd60e51b8152600401610c83906134f0565b6002600055610f1f816127fa565b6118493383611d53565b6118655760405162461bcd60e51b8152600401610c839061348c565b6118718484848461284a565b50505050565b600081815b818110156118b9576118a585858381811061189957611899613527565b90506020020135610b61565b6118af908461343d565b925060010161187c565b505092915050565b6000818152600460205260409020546060906001600160a01b031661191c5760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610c83565b60006119278361287d565b90506000600b8260405160200161193f9291906136b7565b604051602081830303815290604052905080600c6040516020016119649291906136dc565b60405160208183030381529060405292505050919050565b6001546001600160a01b031633146119a65760405162461bcd60e51b8152600401610c83906134c3565b6019805461ff001916610100179055565b6001546001600160a01b031633146119e15760405162461bcd60e51b8152600401610c83906134c3565b6019805461ff0019169055565b6001546001600160a01b03163314611a185760405162461bcd60e51b8152600401610c83906134c3565b6019805460ff19166001179055565b6001546001600160a01b03163314611a515760405162461bcd60e51b8152600401610c83906134c3565b8060005b81811015611871576001601a6000868685818110611a7557611a75613527565b9050602002016020810190611a8a919061303f565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101611a55565b6001546001600160a01b03163314611ae45760405162461bcd60e51b8152600401610c83906134c3565b600083118015611af45750600082115b8015611b005750600081115b611b3a5760405162461bcd60e51b815260206004820152600b60248201526a5a65726f2056616c75657360a81b6044820152606401610c83565b600f8390556010829055601181905580611b54838561343d565b611b5e919061343d565b601255505050565b6000606f821015611b8157600a54601654610c1191906135ab565b6104c6821015611b9b57600a54601754610c1191906135ab565b600a54601854610c1191906135ab565b6000611bed83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506129a9565b9392505050565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c2982611176565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600e54611c72919061358c565b90506000611c7f82612450565b905080821115611cc85760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0815985b1d594814d95b9d60621b6044820152606401610c83565b60005b83811015611ce757611cdf33600354612350565b600101611ccb565b50610d92306001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4d91906136fa565b826129e3565b6000818152600460205260408120546001600160a01b0316611db75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610c83565b6000611dc283611176565b9050806001600160a01b0316846001600160a01b03161480611dfd5750836001600160a01b0316611df284610c17565b6001600160a01b0316145b80610bbd57506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff16610bbd565b600260005403611e535760405162461bcd60e51b8152600401610c83906134f0565b60026000556001600160a01b038316611e6b82611176565b6001600160a01b031614611eb35760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba1037bbb732b960891b6044820152606401610c83565b6001600160a01b038216611ef85760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610c83565b6000611f0384611289565b11611f3f5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b6044820152606401610c83565b611f4a600082611bf4565b611f53816127fa565b6001600160a01b038316600090815260056020526040902054611f77906001611bab565b6001600160a01b03808516600090815260056020526040808220939093559084168152908120805460019290611fae90849061343d565b9091555050600081815260046020526040902080546001600160a01b0319166001600160a01b038416179055611fe381611b66565b60008281526008602052604080822092909255905182916001600160a01b0380861692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050600160005550565b8051600090815b8181101561210057600084828151811061205a5761205a613527565b602090810291909101810151600081815260049092526040909120549091506001600160a01b038781169116146120ca5760405162461bcd60e51b8152602060048201526014602482015273139bdd0813dddb995c8813d988151bdad95b925160621b6044820152606401610c83565b6120d381610b61565b6120dd908561343d565b93506120e881611b66565b6000918252600860205260409091205560010161203e565b5061187184836129e3565b6000818152600460205260409020546001600160a01b03166121665760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88111bd95cc8139bdd08115e1a5cdd60621b6044820152606401610c83565b600061217182611176565b905061217e600083611bf4565b612187826127fa565b6001600160a01b03811660009081526005602052604081208054600192906121b09084906135cd565b9091555050600082815260046020526040812080546001600160a01b031916905560028054600192906121e49084906135cd565b9091555050606f82101561220c576013805490600061220283613717565b919050555061223c565b6104c6821015612226576014805490600061220283613717565b6015805490600061223683613717565b91905055505b60405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600081815b8181101561233e57600085858381811061229957612299613527565b6020908102929092013560008181526004909352604090922054919250506001600160a01b038881169116146123085760405162461bcd60e51b8152602060048201526014602482015273139bdd0813dddb995c8813d988151bdad95b925160621b6044820152606401610c83565b61231181610b61565b61231b908561343d565b935061232681611b66565b6000918252600860205260409091205560010161227d565b5061234985836129e3565b5050505050565b61235a8282612b3a565b6123766000838360405180602001604052806000815250612d2c565b610e525760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610c83565b3481600d546123ec919061358c565b11156124315760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0815985b1d594814d95b9d60621b6044820152606401610c83565b60005b81811015610e525761244833600354612350565b600101612434565b6040516370a0823160e01b8152306004820152600090819073dac17f958d2ee523a2206206994597c13d831ec7906370a0823190602401602060405180830381865afa1580156124a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c89190613556565b6040516323b872dd60e01b81523360048201523060248201526044810185905290915073dac17f958d2ee523a2206206994597c13d831ec7906323b872dd906064016020604051808303816000875af1158015612529573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254d919061356f565b61258d5760405162461bcd60e51b8152602060048201526011602482015270455252205472616e736665722046726f6d60781b6044820152606401610c83565b6040516370a0823160e01b815230600482015260009073dac17f958d2ee523a2206206994597c13d831ec7906370a0823190602401602060405180830381865afa1580156125df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126039190613556565b90508181116126445760405162461bcd60e51b815260206004820152600d60248201526c16995c9bc8149958d95a5d9959609a1b6044820152606401610c83565b610bbd82826135cd565b8060096000828254612660919061343d565b9091555060009050808061267384611622565b925092509250600060135411156126b557601354600a54612694908561358c565b61269e91906135ab565b601660008282546126af919061343d565b90915550505b601454156126ee57601454600a546126cd908461358c565b6126d791906135ab565b601760008282546126e8919061343d565b90915550505b6015541561187157601554600a54612706908361358c565b61271091906135ab565b60186000828254612721919061343d565b909155505050505050565b816001600160a01b0316836001600160a01b03160361278d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c83565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000818152600460205260409020546001600160a01b03168061281b575050565b600061282683610b61565b905061283183611b66565b600084815260086020526040902055610d9282826129e3565b612855848484611e31565b61286184848484612d2c565b6118715760405162461bcd60e51b8152600401610c839061372e565b6060816000036128a45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128ce57806128b88161353d565b91506128c79050600a836135ab565b91506128a8565b60008167ffffffffffffffff8111156128e9576128e9613253565b6040519080825280601f01601f191660200182016040528015612913576020820181803683370190505b509050815b85156129a0576129296001826135cd565b90506000612938600a886135ab565b61294390600a61358c565b61294d90886135cd565b612958906030613774565b905060008160f81b90508084848151811061297557612975613527565b60200101906001600160f81b031916908160001a905350612997600a896135ab565b97505050612918565b50949350505050565b600081848411156129cd5760405162461bcd60e51b8152600401610c839190612faa565b5060006129da84866135cd565b95945050505050565b6040516370a0823160e01b815230600482015260009073dac17f958d2ee523a2206206994597c13d831ec7906370a0823190602401602060405180830381865afa158015612a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a599190613556565b905080821115612a67578091505b81600003612a7457505050565b60405163a9059cbb60e01b81526001600160a01b03841660048201526024810183905273dac17f958d2ee523a2206206994597c13d831ec79063a9059cbb906044016020604051808303816000875af1158015612ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af9919061356f565b610d925760405162461bcd60e51b815260206004820152601260248201527111549493d48814d15391125391c81554d11560721b6044820152606401610c83565b6000818152600460205260409020546001600160a01b031615612b9f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c83565b61232760035410612bf25760405162461bcd60e51b815260206004820152601960248201527f416c6c204e4654732048617665204265656e204d696e746564000000000000006044820152606401610c83565b6001600160a01b0382166000908152600560205260408120805460019290612c1b90849061343d565b9091555050600081815260046020526040812080546001600160a01b0319166001600160a01b0385161790556002805491612c558361353d565b909155505060038054906000612c6a8361353d565b9190505550612c7881611b66565b600082815260086020526040902055606f811015612caa5760138054906000612ca08361353d565b9190505550612cda565b6104c6811015612cc45760148054906000612ca08361353d565b60158054906000612cd48361353d565b91905055505b6104c660035403612cf0576019805460ff191690555b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612d40846001600160a01b0316612e34565b15612e2957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d77903390899088908890600401613799565b6020604051808303816000875af1925050508015612db2575060408051601f3d908101601f19168201909252612daf918101906137d6565b60015b612e0f573d808015612de0576040519150601f19603f3d011682016040523d82523d6000602084013e612de5565b606091505b508051600003612e075760405162461bcd60e51b8152600401610c839061372e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610bbd565b506001949350505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610bbd575050151592915050565b828054612e79906135e4565b90600052602060002090601f016020900481019282612e9b5760008555612ee1565b82601f10612eb45782800160ff19823516178555612ee1565b82800160010185558215612ee1579182015b82811115612ee1578235825591602001919060010190612ec6565b50612eed929150612ef1565b5090565b5b80821115612eed5760008155600101612ef2565b600060208284031215612f1857600080fd5b5035919050565b6001600160e01b031981168114610fa657600080fd5b600060208284031215612f4757600080fd5b8135611bed81612f1f565b60005b83811015612f6d578181015183820152602001612f55565b838111156118715750506000910152565b60008151808452612f96816020860160208601612f52565b601f01601f19169290920160200192915050565b602081526000611bed6020830184612f7e565b6001600160a01b0381168114610fa657600080fd5b60008060408385031215612fe557600080fd5b8235612ff081612fbd565b946020939093013593505050565b60008060006060848603121561301357600080fd5b833561301e81612fbd565b9250602084013561302e81612fbd565b929592945050506040919091013590565b60006020828403121561305157600080fd5b8135611bed81612fbd565b6000806020838503121561306f57600080fd5b823567ffffffffffffffff8082111561308757600080fd5b818501915085601f83011261309b57600080fd5b8135818111156130aa57600080fd5b8660208285010111156130bc57600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b81811015613106578351835292840192918401916001016130ea565b50909695505050505050565b60008083601f84011261312457600080fd5b50813567ffffffffffffffff81111561313c57600080fd5b6020830191508360208260051b850101111561315757600080fd5b9250929050565b6000806020838503121561317157600080fd5b823567ffffffffffffffff81111561318857600080fd5b61319485828601613112565b90969095509350505050565b600080600080604085870312156131b657600080fd5b843567ffffffffffffffff808211156131ce57600080fd5b6131da88838901613112565b909650945060208701359150808211156131f357600080fd5b5061320087828801613112565b95989497509550505050565b8015158114610fa657600080fd5b6000806040838503121561322d57600080fd5b823561323881612fbd565b915060208301356132488161320c565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561327f57600080fd5b843561328a81612fbd565b9350602085013561329a81612fbd565b925060408501359150606085013567ffffffffffffffff808211156132be57600080fd5b818701915087601f8301126132d257600080fd5b8135818111156132e4576132e4613253565b604051601f8201601f19908116603f0116810190838211818310171561330c5761330c613253565b816040528281528a602084870101111561332557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561335c57600080fd5b823561336781612fbd565b9150602083013561324881612fbd565b60008060006060848603121561338c57600080fd5b505081359360208301359350604090920135919050565b602080825260139082015272151c98591a5b99c8139bdd08115b98589b1959606a1b604082015260600190565b60208082526016908201527514d95b99195c88139bdd0815da1a5d195b1a5cdd195960521b604082015260600190565b6020808252600d908201526c125b9d985b1a5908125b9c1d5d609a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561345057613450613427565b500190565b60208082526017908201527f4d696e74204578636565647320427265616b706f696e74000000000000000000604082015260600190565b6020808252601d908201527f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161354f5761354f613427565b5060010190565b60006020828403121561356857600080fd5b5051919050565b60006020828403121561358157600080fd5b8151611bed8161320c565b60008160001904831182151516156135a6576135a6613427565b500290565b6000826135c857634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156135df576135df613427565b500390565b600181811c908216806135f857607f821691505b60208210810361361857634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c908083168061363857607f831692505b6020808410820361365957634e487b7160e01b600052602260045260246000fd5b81801561366d576001811461367e576136ab565b60ff198616895284890196506136ab565b60008881526020902060005b868110156136a35781548b82015290850190830161368a565b505084890196505b50505050505092915050565b60006136c3828561361e565b83516136d3818360208801612f52565b01949350505050565b600083516136ee818460208801612f52565b6129da8184018561361e565b60006020828403121561370c57600080fd5b8151611bed81612fbd565b60008161372657613726613427565b506000190190565b60208082526026908201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560408201526536b2b73a32b960d11b606082015260800190565b600060ff821660ff84168060ff0382111561379157613791613427565b019392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137cc90830184612f7e565b9695505050505050565b6000602082840312156137e857600080fd5b8151611bed81612f1f56fea26469706673582212203e6f5162de0ded8e5cf014514cf03aa33849e1871eb3d6a8c2dfd1668f90c57f64736f6c634300080e0033

Deployed Bytecode

0x6080604052600436106103b15760003560e01c806379203dc4116101e7578063a6f9dae11161010d578063cdfb2b4e116100a0578063e985e9c51161006f578063e985e9c514610ab0578063edac985b14610af9578063f7c618c114610b19578063fda2773614610b4157600080fd5b8063cdfb2b4e14610a5b578063d6b0f48414610a70578063deb8499714610a85578063e797ec1b14610a9b57600080fd5b8063b88d4fde116100dc578063b88d4fde146109e5578063bc6e82b314610a05578063c74e2f0c14610a1b578063c87b56dd14610a3b57600080fd5b8063a6f9dae11461096d578063ae169a501461098d578063ae9843d6146109ad578063b36444c8146109cf57600080fd5b80638ca5affd1161018557806395d89b411161015457806395d89b41146108de578063999f57301461090d578063a22cb4651461092d578063a3e08fd81461094d57600080fd5b80638ca5affd146108645780638d673c941461087757806390373223146108b257806391db3da5146108c857600080fd5b8063887c207a116101c1578063887c207a146107f0578063893d20e81461080657806389476069146108245780638bdf67f21461084457600080fd5b806379203dc4146107b25780637e20d0c1146107c85780637e5cd5c1146107db57600080fd5b80633af32abf116102d75780635bf244be1161026a57806367349ad81161023957806367349ad81461074657806367a594f61461075c57806369f7d2f21461077257806370a082311461079257600080fd5b80635bf244be146106c45780635eac6239146106f15780635ece6aa1146107115780636352211e1461072657600080fd5b80634408a046116102a65780634408a0461461064b5780634ada218b1461066b57806351fb012d1461068557806355f804b3146106a457600080fd5b80633af32abf146105c65780633ccfd60b146105f657806342842e0e1461060b57806342966c681461062b57600080fd5b806318160ddd1161034f5780632a1e53151161031e5780632a1e53151461055057806331ff37e91461057057806332cb6b0c1461059057806337619e76146105a657600080fd5b806318160ddd146104e55780631d0a6ff2146104fa5780631e2639901461051a57806323b872dd1461053057600080fd5b8063081812fc1161038b578063081812fc1461045f578063095ea7b3146104975780630e15561a146104b957806316505929146104cf57600080fd5b806301abbf73146103bd57806301ffc9a7146103f057806306fdde031461042057600080fd5b366103b857005b600080fd5b3480156103c957600080fd5b506103dd6103d8366004612f06565b610b61565b6040519081526020015b60405180910390f35b3480156103fc57600080fd5b5061041061040b366004612f35565b610bc5565b60405190151581526020016103e7565b34801561042c57600080fd5b5060408051808201909152600d81526c426f6465676120426c6f636b7360981b60208201525b6040516103e79190612faa565b34801561046b57600080fd5b5061047f61047a366004612f06565b610c17565b6040516001600160a01b0390911681526020016103e7565b3480156104a357600080fd5b506104b76104b2366004612fd2565b610ca8565b005b3480156104c557600080fd5b506103dd60095481565b3480156104db57600080fd5b506103dd60115481565b3480156104f157600080fd5b506002546103dd565b34801561050657600080fd5b506104b7610515366004612f06565b610d97565b34801561052657600080fd5b506103dd60035481565b34801561053c57600080fd5b506104b761054b366004612ffe565b610e56565b34801561055c57600080fd5b506104b761056b366004612f06565b610e88565b34801561057c57600080fd5b506104b761058b366004612f06565b610eb7565b34801561059c57600080fd5b506103dd61232781565b3480156105b257600080fd5b506104b76105c136600461303f565b610ee6565b3480156105d257600080fd5b506104106105e136600461303f565b601a6020526000908152604090205460ff1681565b34801561060257600080fd5b506104b7610f27565b34801561061757600080fd5b506104b7610626366004612ffe565b610fa9565b34801561063757600080fd5b506104b7610646366004612f06565b610fc4565b34801561065757600080fd5b506104b761066636600461305c565b610ff2565b34801561067757600080fd5b506019546104109060ff1681565b34801561069157600080fd5b5060195461041090610100900460ff1681565b3480156106b057600080fd5b506104b76106bf36600461305c565b611028565b3480156106d057600080fd5b506106e46106df36600461303f565b61105e565b6040516103e791906130ce565b3480156106fd57600080fd5b506104b761070c36600461315e565b61113b565b34801561071d57600080fd5b506103dd606f81565b34801561073257600080fd5b5061047f610741366004612f06565b611176565b34801561075257600080fd5b506103dd60155481565b34801561076857600080fd5b506103dd60145481565b34801561077e57600080fd5b506104b761078d3660046131a0565b6111db565b34801561079e57600080fd5b506103dd6107ad36600461303f565b611289565b3480156107be57600080fd5b506103dd60125481565b6104b76107d6366004612f06565b6112fd565b3480156107e757600080fd5b506104b76113ad565b3480156107fc57600080fd5b506103dd6104c681565b34801561081257600080fd5b506001546001600160a01b031661047f565b34801561083057600080fd5b506104b761083f36600461303f565b6113e3565b34801561085057600080fd5b506104b761085f366004612f06565b611533565b6104b7610872366004612f06565b611570565b34801561088357600080fd5b50610897610892366004612f06565b611622565b604080519384526020840192909252908201526060016103e7565b3480156108be57600080fd5b506103dd600e5481565b3480156108d457600080fd5b506103dd600d5481565b3480156108ea57600080fd5b50604080518082019091526006815265424f4445474160d01b6020820152610452565b34801561091957600080fd5b506104b7610928366004612f06565b61167d565b34801561093957600080fd5b506104b761094836600461321a565b611724565b34801561095957600080fd5b506103dd61096836600461303f565b61172f565b34801561097957600080fd5b506104b761098836600461303f565b611789565b34801561099957600080fd5b506104b76109a8366004612f06565b61180f565b3480156109b957600080fd5b50604051630a85bd0160e11b81526020016103e7565b3480156109db57600080fd5b506103dd60135481565b3480156109f157600080fd5b506104b7610a00366004613269565b61183f565b348015610a1157600080fd5b506103dd60105481565b348015610a2757600080fd5b506103dd610a3636600461315e565b611877565b348015610a4757600080fd5b50610452610a56366004612f06565b6118c1565b348015610a6757600080fd5b506104b761197c565b348015610a7c57600080fd5b506104b76119b7565b348015610a9157600080fd5b506103dd600f5481565b348015610aa757600080fd5b506104b76119ee565b348015610abc57600080fd5b50610410610acb366004613349565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b0557600080fd5b506104b7610b1436600461315e565b611a27565b348015610b2557600080fd5b5061047f73dac17f958d2ee523a2206206994597c13d831ec781565b348015610b4d57600080fd5b506104b7610b5c366004613377565b611aba565b6000818152600460205260408120546001600160a01b0316610b8557506000919050565b6000610b9083611b66565b600084815260086020526040902054909150808211610bb3575060009392505050565b610bbd8282611bab565b949350505050565b60006001600160e01b031982166380ac58cd60e01b1480610bf657506001600160e01b03198216635b5e139f60e01b145b80610c1157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000818152600460205260408120546001600160a01b0316610c8c5760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610cb382611176565b9050806001600160a01b0316836001600160a01b031603610d205760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c83565b336001600160a01b0382161480610d3c5750610d3c8133610acb565b610d885760405162461bcd60e51b815260206004820152601d60248201527f4552433732313a206e6f7420617070726f766564206f72206f776e65720000006044820152606401610c83565b610d928383611bf4565b505050565b601954819060ff16610dbb5760405162461bcd60e51b8152600401610c83906133a3565b601954610100900460ff1615610dfa57336000908152601a602052604090205460ff16610dfa5760405162461bcd60e51b8152600401610c83906133d0565b60008111610e1a5760405162461bcd60e51b8152600401610c8390613400565b6104c682600354610e2b919061343d565b1115610e495760405162461bcd60e51b8152600401610c8390613455565b610e5282611c62565b5050565b610e61335b82611d53565b610e7d5760405162461bcd60e51b8152600401610c839061348c565b610d92838383611e31565b6001546001600160a01b03163314610eb25760405162461bcd60e51b8152600401610c83906134c3565b600d55565b6001546001600160a01b03163314610ee15760405162461bcd60e51b8152600401610c83906134c3565b600e55565b600260005403610f085760405162461bcd60e51b8152600401610c83906134f0565b6002600055610f1f81610f1a8161105e565b612037565b506001600055565b6001546001600160a01b03163314610f515760405162461bcd60e51b8152600401610c83906134c3565b604051600090339047908381818185875af1925050503d8060008114610f93576040519150601f19603f3d011682016040523d82523d6000602084013e610f98565b606091505b5050905080610fa657600080fd5b50565b610d928383836040518060200160405280600081525061183f565b610fcd33610e5b565b610fe95760405162461bcd60e51b8152600401610c839061348c565b610fa68161210b565b6001546001600160a01b0316331461101c5760405162461bcd60e51b8152600401610c83906134c3565b610d92600c8383612e6d565b6001546001600160a01b031633146110525760405162461bcd60e51b8152600401610c83906134c3565b610d92600b8383612e6d565b6060600061106b83611289565b67ffffffffffffffff81111561108357611083613253565b6040519080825280602002602001820160405280156110ac578160200160208202803683370190505b5090506110b883611289565b6000036110c55792915050565b6000805b600354811015611132576000818152600460205260409020546001600160a01b03808716911603611120578083838151811061110757611107613527565b60209081029190910101528161111c8161353d565b9250505b8061112a8161353d565b9150506110c9565b50909392505050565b60026000540361115d5760405162461bcd60e51b8152600401610c83906134f0565b600260005561116d338383612278565b50506001600055565b6000818152600460205260408120546001600160a01b031680610c115760405162461bcd60e51b815260206004820152601b60248201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610c83565b6001546001600160a01b031633146112055760405162461bcd60e51b8152600401610c83906134c3565b8260005b818110156112815760005b84848381811061122657611226613527565b905060200201358110156112785761126687878481811061124957611249613527565b905060200201602081019061125e919061303f565b600354612350565b806112708161353d565b915050611214565b50600101611209565b505050505050565b60006001600160a01b0382166112e15760405162461bcd60e51b815260206004820152601a60248201527f717565727920666f7220746865207a65726f20616464726573730000000000006044820152606401610c83565b506001600160a01b031660009081526005602052604090205490565b601954819060ff166113215760405162461bcd60e51b8152600401610c83906133a3565b601954610100900460ff161561136057336000908152601a602052604090205460ff166113605760405162461bcd60e51b8152600401610c83906133d0565b600081116113805760405162461bcd60e51b8152600401610c8390613400565b6104c660035410156113a45760405162461bcd60e51b8152600401610c8390613455565b610e52826123dd565b6001546001600160a01b031633146113d75760405162461bcd60e51b8152600401610c83906134c3565b6019805460ff19169055565b6001546001600160a01b0316331461140d5760405162461bcd60e51b8152600401610c83906134c3565b6001600160a01b0381166114525760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610c83565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156114a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c49190613556565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561150f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e52919061356f565b6002600054036115555760405162461bcd60e51b8152600401610c83906134f0565b6002600090815561156582612450565b905061116d8161264e565b601954819060ff166115945760405162461bcd60e51b8152600401610c83906133a3565b601954610100900460ff16156115d357336000908152601a602052604090205460ff166115d35760405162461bcd60e51b8152600401610c83906133d0565b600081116115f35760405162461bcd60e51b8152600401610c8390613400565b6104c682600354611604919061343d565b11156113a45760405162461bcd60e51b8152600401610c8390613455565b6000806000601254600f5485611638919061358c565b61164291906135ab565b925060125460105485611655919061358c565b61165f91906135ab565b915061166b828461343d565b61167590856135cd565b929491935050565b601954819060ff166116a15760405162461bcd60e51b8152600401610c83906133a3565b601954610100900460ff16156116e057336000908152601a602052604090205460ff166116e05760405162461bcd60e51b8152600401610c83906133d0565b600081116117005760405162461bcd60e51b8152600401610c8390613400565b6104c66003541015610e495760405162461bcd60e51b8152600401610c8390613455565b610e5233838361272c565b60008061173b8361105e565b805190915060005b818110156117815761176d83828151811061176057611760613527565b6020026020010151610b61565b611777908561343d565b9350600101611743565b505050919050565b6001546001600160a01b031633146117b35760405162461bcd60e51b8152600401610c83906134c3565b6001546040516001600160a01b038084169216907f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002600054036118315760405162461bcd60e51b8152600401610c83906134f0565b6002600055610f1f816127fa565b6118493383611d53565b6118655760405162461bcd60e51b8152600401610c839061348c565b6118718484848461284a565b50505050565b600081815b818110156118b9576118a585858381811061189957611899613527565b90506020020135610b61565b6118af908461343d565b925060010161187c565b505092915050565b6000818152600460205260409020546060906001600160a01b031661191c5760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610c83565b60006119278361287d565b90506000600b8260405160200161193f9291906136b7565b604051602081830303815290604052905080600c6040516020016119649291906136dc565b60405160208183030381529060405292505050919050565b6001546001600160a01b031633146119a65760405162461bcd60e51b8152600401610c83906134c3565b6019805461ff001916610100179055565b6001546001600160a01b031633146119e15760405162461bcd60e51b8152600401610c83906134c3565b6019805461ff0019169055565b6001546001600160a01b03163314611a185760405162461bcd60e51b8152600401610c83906134c3565b6019805460ff19166001179055565b6001546001600160a01b03163314611a515760405162461bcd60e51b8152600401610c83906134c3565b8060005b81811015611871576001601a6000868685818110611a7557611a75613527565b9050602002016020810190611a8a919061303f565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101611a55565b6001546001600160a01b03163314611ae45760405162461bcd60e51b8152600401610c83906134c3565b600083118015611af45750600082115b8015611b005750600081115b611b3a5760405162461bcd60e51b815260206004820152600b60248201526a5a65726f2056616c75657360a81b6044820152606401610c83565b600f8390556010829055601181905580611b54838561343d565b611b5e919061343d565b601255505050565b6000606f821015611b8157600a54601654610c1191906135ab565b6104c6821015611b9b57600a54601754610c1191906135ab565b600a54601854610c1191906135ab565b6000611bed83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506129a9565b9392505050565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c2982611176565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600e54611c72919061358c565b90506000611c7f82612450565b905080821115611cc85760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0815985b1d594814d95b9d60621b6044820152606401610c83565b60005b83811015611ce757611cdf33600354612350565b600101611ccb565b50610d92306001600160a01b031663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4d91906136fa565b826129e3565b6000818152600460205260408120546001600160a01b0316611db75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610c83565b6000611dc283611176565b9050806001600160a01b0316846001600160a01b03161480611dfd5750836001600160a01b0316611df284610c17565b6001600160a01b0316145b80610bbd57506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff16610bbd565b600260005403611e535760405162461bcd60e51b8152600401610c83906134f0565b60026000556001600160a01b038316611e6b82611176565b6001600160a01b031614611eb35760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba1037bbb732b960891b6044820152606401610c83565b6001600160a01b038216611ef85760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610c83565b6000611f0384611289565b11611f3f5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b6044820152606401610c83565b611f4a600082611bf4565b611f53816127fa565b6001600160a01b038316600090815260056020526040902054611f77906001611bab565b6001600160a01b03808516600090815260056020526040808220939093559084168152908120805460019290611fae90849061343d565b9091555050600081815260046020526040902080546001600160a01b0319166001600160a01b038416179055611fe381611b66565b60008281526008602052604080822092909255905182916001600160a01b0380861692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050600160005550565b8051600090815b8181101561210057600084828151811061205a5761205a613527565b602090810291909101810151600081815260049092526040909120549091506001600160a01b038781169116146120ca5760405162461bcd60e51b8152602060048201526014602482015273139bdd0813dddb995c8813d988151bdad95b925160621b6044820152606401610c83565b6120d381610b61565b6120dd908561343d565b93506120e881611b66565b6000918252600860205260409091205560010161203e565b5061187184836129e3565b6000818152600460205260409020546001600160a01b03166121665760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88111bd95cc8139bdd08115e1a5cdd60621b6044820152606401610c83565b600061217182611176565b905061217e600083611bf4565b612187826127fa565b6001600160a01b03811660009081526005602052604081208054600192906121b09084906135cd565b9091555050600082815260046020526040812080546001600160a01b031916905560028054600192906121e49084906135cd565b9091555050606f82101561220c576013805490600061220283613717565b919050555061223c565b6104c6821015612226576014805490600061220283613717565b6015805490600061223683613717565b91905055505b60405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600081815b8181101561233e57600085858381811061229957612299613527565b6020908102929092013560008181526004909352604090922054919250506001600160a01b038881169116146123085760405162461bcd60e51b8152602060048201526014602482015273139bdd0813dddb995c8813d988151bdad95b925160621b6044820152606401610c83565b61231181610b61565b61231b908561343d565b935061232681611b66565b6000918252600860205260409091205560010161227d565b5061234985836129e3565b5050505050565b61235a8282612b3a565b6123766000838360405180602001604052806000815250612d2c565b610e525760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610c83565b3481600d546123ec919061358c565b11156124315760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0815985b1d594814d95b9d60621b6044820152606401610c83565b60005b81811015610e525761244833600354612350565b600101612434565b6040516370a0823160e01b8152306004820152600090819073dac17f958d2ee523a2206206994597c13d831ec7906370a0823190602401602060405180830381865afa1580156124a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c89190613556565b6040516323b872dd60e01b81523360048201523060248201526044810185905290915073dac17f958d2ee523a2206206994597c13d831ec7906323b872dd906064016020604051808303816000875af1158015612529573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254d919061356f565b61258d5760405162461bcd60e51b8152602060048201526011602482015270455252205472616e736665722046726f6d60781b6044820152606401610c83565b6040516370a0823160e01b815230600482015260009073dac17f958d2ee523a2206206994597c13d831ec7906370a0823190602401602060405180830381865afa1580156125df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126039190613556565b90508181116126445760405162461bcd60e51b815260206004820152600d60248201526c16995c9bc8149958d95a5d9959609a1b6044820152606401610c83565b610bbd82826135cd565b8060096000828254612660919061343d565b9091555060009050808061267384611622565b925092509250600060135411156126b557601354600a54612694908561358c565b61269e91906135ab565b601660008282546126af919061343d565b90915550505b601454156126ee57601454600a546126cd908461358c565b6126d791906135ab565b601760008282546126e8919061343d565b90915550505b6015541561187157601554600a54612706908361358c565b61271091906135ab565b60186000828254612721919061343d565b909155505050505050565b816001600160a01b0316836001600160a01b03160361278d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c83565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000818152600460205260409020546001600160a01b03168061281b575050565b600061282683610b61565b905061283183611b66565b600084815260086020526040902055610d9282826129e3565b612855848484611e31565b61286184848484612d2c565b6118715760405162461bcd60e51b8152600401610c839061372e565b6060816000036128a45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156128ce57806128b88161353d565b91506128c79050600a836135ab565b91506128a8565b60008167ffffffffffffffff8111156128e9576128e9613253565b6040519080825280601f01601f191660200182016040528015612913576020820181803683370190505b509050815b85156129a0576129296001826135cd565b90506000612938600a886135ab565b61294390600a61358c565b61294d90886135cd565b612958906030613774565b905060008160f81b90508084848151811061297557612975613527565b60200101906001600160f81b031916908160001a905350612997600a896135ab565b97505050612918565b50949350505050565b600081848411156129cd5760405162461bcd60e51b8152600401610c839190612faa565b5060006129da84866135cd565b95945050505050565b6040516370a0823160e01b815230600482015260009073dac17f958d2ee523a2206206994597c13d831ec7906370a0823190602401602060405180830381865afa158015612a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a599190613556565b905080821115612a67578091505b81600003612a7457505050565b60405163a9059cbb60e01b81526001600160a01b03841660048201526024810183905273dac17f958d2ee523a2206206994597c13d831ec79063a9059cbb906044016020604051808303816000875af1158015612ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af9919061356f565b610d925760405162461bcd60e51b815260206004820152601260248201527111549493d48814d15391125391c81554d11560721b6044820152606401610c83565b6000818152600460205260409020546001600160a01b031615612b9f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c83565b61232760035410612bf25760405162461bcd60e51b815260206004820152601960248201527f416c6c204e4654732048617665204265656e204d696e746564000000000000006044820152606401610c83565b6001600160a01b0382166000908152600560205260408120805460019290612c1b90849061343d565b9091555050600081815260046020526040812080546001600160a01b0319166001600160a01b0385161790556002805491612c558361353d565b909155505060038054906000612c6a8361353d565b9190505550612c7881611b66565b600082815260086020526040902055606f811015612caa5760138054906000612ca08361353d565b9190505550612cda565b6104c6811015612cc45760148054906000612ca08361353d565b60158054906000612cd48361353d565b91905055505b6104c660035403612cf0576019805460ff191690555b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612d40846001600160a01b0316612e34565b15612e2957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612d77903390899088908890600401613799565b6020604051808303816000875af1925050508015612db2575060408051601f3d908101601f19168201909252612daf918101906137d6565b60015b612e0f573d808015612de0576040519150601f19603f3d011682016040523d82523d6000602084013e612de5565b606091505b508051600003612e075760405162461bcd60e51b8152600401610c839061372e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610bbd565b506001949350505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610bbd575050151592915050565b828054612e79906135e4565b90600052602060002090601f016020900481019282612e9b5760008555612ee1565b82601f10612eb45782800160ff19823516178555612ee1565b82800160010185558215612ee1579182015b82811115612ee1578235825591602001919060010190612ec6565b50612eed929150612ef1565b5090565b5b80821115612eed5760008155600101612ef2565b600060208284031215612f1857600080fd5b5035919050565b6001600160e01b031981168114610fa657600080fd5b600060208284031215612f4757600080fd5b8135611bed81612f1f565b60005b83811015612f6d578181015183820152602001612f55565b838111156118715750506000910152565b60008151808452612f96816020860160208601612f52565b601f01601f19169290920160200192915050565b602081526000611bed6020830184612f7e565b6001600160a01b0381168114610fa657600080fd5b60008060408385031215612fe557600080fd5b8235612ff081612fbd565b946020939093013593505050565b60008060006060848603121561301357600080fd5b833561301e81612fbd565b9250602084013561302e81612fbd565b929592945050506040919091013590565b60006020828403121561305157600080fd5b8135611bed81612fbd565b6000806020838503121561306f57600080fd5b823567ffffffffffffffff8082111561308757600080fd5b818501915085601f83011261309b57600080fd5b8135818111156130aa57600080fd5b8660208285010111156130bc57600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b81811015613106578351835292840192918401916001016130ea565b50909695505050505050565b60008083601f84011261312457600080fd5b50813567ffffffffffffffff81111561313c57600080fd5b6020830191508360208260051b850101111561315757600080fd5b9250929050565b6000806020838503121561317157600080fd5b823567ffffffffffffffff81111561318857600080fd5b61319485828601613112565b90969095509350505050565b600080600080604085870312156131b657600080fd5b843567ffffffffffffffff808211156131ce57600080fd5b6131da88838901613112565b909650945060208701359150808211156131f357600080fd5b5061320087828801613112565b95989497509550505050565b8015158114610fa657600080fd5b6000806040838503121561322d57600080fd5b823561323881612fbd565b915060208301356132488161320c565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561327f57600080fd5b843561328a81612fbd565b9350602085013561329a81612fbd565b925060408501359150606085013567ffffffffffffffff808211156132be57600080fd5b818701915087601f8301126132d257600080fd5b8135818111156132e4576132e4613253565b604051601f8201601f19908116603f0116810190838211818310171561330c5761330c613253565b816040528281528a602084870101111561332557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561335c57600080fd5b823561336781612fbd565b9150602083013561324881612fbd565b60008060006060848603121561338c57600080fd5b505081359360208301359350604090920135919050565b602080825260139082015272151c98591a5b99c8139bdd08115b98589b1959606a1b604082015260600190565b60208082526016908201527514d95b99195c88139bdd0815da1a5d195b1a5cdd195960521b604082015260600190565b6020808252600d908201526c125b9d985b1a5908125b9c1d5d609a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561345057613450613427565b500190565b60208082526017908201527f4d696e74204578636565647320427265616b706f696e74000000000000000000604082015260600190565b6020808252601d908201527f63616c6c6572206e6f74206f776e6572206e6f7220617070726f766564000000604082015260600190565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161354f5761354f613427565b5060010190565b60006020828403121561356857600080fd5b5051919050565b60006020828403121561358157600080fd5b8151611bed8161320c565b60008160001904831182151516156135a6576135a6613427565b500290565b6000826135c857634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156135df576135df613427565b500390565b600181811c908216806135f857607f821691505b60208210810361361857634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c908083168061363857607f831692505b6020808410820361365957634e487b7160e01b600052602260045260246000fd5b81801561366d576001811461367e576136ab565b60ff198616895284890196506136ab565b60008881526020902060005b868110156136a35781548b82015290850190830161368a565b505084890196505b50505050505092915050565b60006136c3828561361e565b83516136d3818360208801612f52565b01949350505050565b600083516136ee818460208801612f52565b6129da8184018561361e565b60006020828403121561370c57600080fd5b8151611bed81612fbd565b60008161372657613726613427565b506000190190565b60208082526026908201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560408201526536b2b73a32b960d11b606082015260800190565b600060ff821660ff84168060ff0382111561379157613791613427565b019392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137cc90830184612f7e565b9695505050505050565b6000602082840312156137e857600080fd5b8151611bed81612f1f56fea26469706673582212203e6f5162de0ded8e5cf014514cf03aa33849e1871eb3d6a8c2dfd1668f90c57f64736f6c634300080e0033

Deployed Bytecode Sourcemap

24904:27315:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48712:502;;;;;;;;;;-1:-1:-1;48712:502:0;;;;;:::i;:::-;;:::i;:::-;;;345:25:1;;;333:2;318:18;48712:502:0;;;;;;;;44897:338;;;;;;;;;;-1:-1:-1;44897:338:0;;;;;:::i;:::-;;:::i;:::-;;;932:14:1;;925:22;907:41;;895:2;880:18;44897:338:0;767:187:1;45841:92:0;;;;;;;;;;-1:-1:-1;45920:5:0;;;;;;;;;;;;-1:-1:-1;;;45920:5:0;;;;45841:92;;;;;;;:::i;47266:245::-;;;;;;;;;;-1:-1:-1;47266:245:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1874:32:1;;;1856:51;;1844:2;1829:18;47266:245:0;1710:203:1;32375:377:0;;;;;;;;;;-1:-1:-1;32375:377:0;;;;;:::i;:::-;;:::i;:::-;;25995:27;;;;;;;;;;;;;;;;26549:37;;;;;;;;;;;;;;;;43879:93;;;;;;;;;;-1:-1:-1;43952:12:0;;43879:93;;31236:284;;;;;;;;;;-1:-1:-1;31236:284:0;;;;;:::i;:::-;;:::i;25314:33::-;;;;;;;;;;;;;;;;33063:293;;;;;;;;;;-1:-1:-1;33063:293:0;;;;;:::i;:::-;;:::i;28884:98::-;;;;;;;;;;-1:-1:-1;28884:98:0;;;;;:::i;:::-;;:::i;28990:102::-;;;;;;;;;;-1:-1:-1;28990:102:0;;;;;:::i;:::-;;:::i;25379:42::-;;;;;;;;;;;;25416:5;25379:42;;31740:133;;;;;;;;;;-1:-1:-1;31740:133:0;;;;;:::i;:::-;;:::i;27207:45::-;;;;;;;;;;-1:-1:-1;27207:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28472:150;;;;;;;;;;;;;:::i;33427:177::-;;;;;;;;;;-1:-1:-1;33427:177:0;;;;;:::i;:::-;;:::i;31528:204::-;;;;;;;;;;-1:-1:-1;31528:204:0;;;;;:::i;:::-;;:::i;29206:114::-;;;;;;;;;;-1:-1:-1;29206:114:0;;;;;:::i;:::-;;:::i;27096:34::-;;;;;;;;;;-1:-1:-1;27096:34:0;;;;;;;;27137:35;;;;;;;;;;-1:-1:-1;27137:35:0;;;;;;;;;;;29100:98;;;;;;;;;;-1:-1:-1;29100:98:0;;;;;:::i;:::-;;:::i;43980:464::-;;;;;;;;;;-1:-1:-1;43980:464:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31881:130::-;;;;;;;;;;-1:-1:-1;31881:130:0;;;;;:::i;:::-;;:::i;26802:41::-;;;;;;;;;;;;26840:3;26802:41;;45551:223;;;;;;;;;;-1:-1:-1;45551:223:0;;;;;:::i;:::-;;:::i;26737:26::-;;;;;;;;;;;;;;;;26704;;;;;;;;;;;;;;;;29614:404;;;;;;;;;;-1:-1:-1;29614:404:0;;;;;:::i;:::-;;:::i;45299:190::-;;;;;;;;;;-1:-1:-1;45299:190:0;;;;;:::i;:::-;;:::i;26593:36::-;;;;;;;;;;;;;;;;30253:243;;;;;;:::i;:::-;;:::i;28184:86::-;;;;;;;;;;;;;:::i;26850:43::-;;;;;;;;;;;;26888:5;26850:43;;24814:83;;;;;;;;;;-1:-1:-1;24884:5:0;;-1:-1:-1;;;;;24884:5:0;24814:83;;28630:246;;;;;;;;;;-1:-1:-1;28630:246:0;;;;;:::i;:::-;;:::i;32127:149::-;;;;;;;;;;-1:-1:-1;32127:149:0;;;;;:::i;:::-;;:::i;30869:296::-;;;;;;:::i;:::-;;:::i;44452:373::-;;;;;;;;;;-1:-1:-1;44452:373:0;;;;;:::i;:::-;;:::i;:::-;;;;6115:25:1;;;6171:2;6156:18;;6149:34;;;;6199:18;;;6192:34;6103:2;6088:18;44452:373:0;5913:319:1;26389:37:0;;;;;;;;;;;;;;;;26345;;;;;;;;;;;;;;;;46002:96;;;;;;;;;;-1:-1:-1;46083:7:0;;;;;;;;;;;;-1:-1:-1;;;46083:7:0;;;;46002:96;;30567:231;;;;;;;;;;-1:-1:-1;30567:231:0;;;;;:::i;:::-;;:::i;32824:172::-;;;;;;;;;;-1:-1:-1;32824:172:0;;;;;:::i;:::-;;:::i;47850:392::-;;;;;;;;;;-1:-1:-1;47850:392:0;;;;;:::i;:::-;;:::i;24589:132::-;;;;;;;;;;-1:-1:-1;24589:132:0;;;;;:::i;:::-;;:::i;32019:100::-;;;;;;;;;;-1:-1:-1;32019:100:0;;;;;:::i;:::-;;:::i;50607:124::-;;;;;;;;;;-1:-1:-1;50607:124:0;;-1:-1:-1;;;6891:52:1;;6879:2;6864:18;50607:124:0;6747:202:1;26671:26:0;;;;;;;;;;;;;;;;33675:337;;;;;;;;;;-1:-1:-1;33675:337:0;;;;;:::i;:::-;;:::i;26505:37::-;;;;;;;;;;;;;;;;48307:340;;;;;;;;;;-1:-1:-1;48307:340:0;;;;;:::i;:::-;;:::i;46169:346::-;;;;;;;;;;-1:-1:-1;46169:346:0;;;;;:::i;:::-;;:::i;28376:88::-;;;;;;;;;;;;;:::i;28278:90::-;;;;;;;;;;;;;:::i;26461:37::-;;;;;;;;;;;;;;;;28092:84;;;;;;;;;;;;;:::i;47582:203::-;;;;;;;;;;-1:-1:-1;47582:203:0;;;;;:::i;:::-;-1:-1:-1;;;;;47739:27:0;;;47710:4;47739:27;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;;;;47582:203;29328:278;;;;;;;;;;-1:-1:-1;29328:278:0;;;;;:::i;:::-;;:::i;26052:87::-;;;;;;;;;;;;26096:42;26052:87;;27725:359;;;;;;;;;;-1:-1:-1;27725:359:0;;;;;:::i;:::-;;:::i;48712:502::-;48806:7;48835:16;;;:7;:16;;;;;;-1:-1:-1;;;;;48835:16:0;48831:71;;-1:-1:-1;48889:1:0;;48712:502;-1:-1:-1;48712:502:0:o;48831:71::-;48914:29;48946:31;48969:7;48946:22;:31::i;:::-;48988:28;49019:22;;;:13;:22;;;;;;48914:63;;-1:-1:-1;49058:45:0;;;49054:86;;-1:-1:-1;49127:1:0;;48712:502;-1:-1:-1;;;48712:502:0:o;49054:86::-;49159:47;:21;49185:20;49159:25;:47::i;:::-;49152:54;48712:502;-1:-1:-1;;;;48712:502:0:o;44897:338::-;45027:4;-1:-1:-1;;;;;;45069:40:0;;-1:-1:-1;;;45069:40:0;;:105;;-1:-1:-1;;;;;;;45126:48:0;;-1:-1:-1;;;45126:48:0;45069:105;:158;;;-1:-1:-1;;;;;;;;;;4596:40:0;;;45191:36;45049:178;44897:338;-1:-1:-1;;44897:338:0:o;47266:245::-;47370:7;50016:16;;;:7;:16;;;;;;-1:-1:-1;;;;;50016:16:0;47395:64;;;;-1:-1:-1;;;47395:64:0;;9936:2:1;47395:64:0;;;9918:21:1;9975:2;9955:18;;;9948:30;10014:34;9994:18;;;9987:62;-1:-1:-1;;;10065:18:1;;;10058:33;10108:19;;47395:64:0;;;;;;;;;-1:-1:-1;47479:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;47479:24:0;;47266:245::o;32375:377::-;32448:15;32466:16;32474:7;32466;:16::i;:::-;32448:34;;32507:7;-1:-1:-1;;;;;32501:13:0;:2;-1:-1:-1;;;;;32501:13:0;;32493:59;;;;-1:-1:-1;;;32493:59:0;;10340:2:1;32493:59:0;;;10322:21:1;10379:2;10359:18;;;10352:30;10418:34;10398:18;;;10391:62;-1:-1:-1;;;10469:18:1;;;10462:31;10510:19;;32493:59:0;10138:397:1;32493:59:0;18132:10;-1:-1:-1;;;;;32587:23:0;;;;:66;;-1:-1:-1;32614:39:0;32631:7;18132:10;47582:203;:::i;32614:39::-;32565:145;;;;-1:-1:-1;;;32565:145:0;;10742:2:1;32565:145:0;;;10724:21:1;10781:2;10761:18;;;10754:30;10820:31;10800:18;;;10793:59;10869:18;;32565:145:0;10540:353:1;32565:145:0;32723:21;32732:2;32736:7;32723:8;:21::i;:::-;32437:315;32375:377;;:::o;31236:284::-;27322:14;;31324:13;;27322:14;;27314:46;;;;-1:-1:-1;;;27314:46:0;;;;;;;:::i;:::-;27375:16;;;;;;;27371:109;;;27430:10;27416:25;;;;:13;:25;;;;;;;;27408:60;;;;-1:-1:-1;;;27408:60:0;;;;;;;:::i;:::-;27514:1;27498:13;:17;27490:43;;;;-1:-1:-1;;;27490:43:0;;;;;;;:::i;:::-;26888:5:::1;31398:13;31377:18;;:34;;;;:::i;:::-;:49;;31355:122;;;;-1:-1:-1::0;;;31355:122:0::1;;;;;;;:::i;:::-;31488:24;31498:13;31488:9;:24::i;:::-;31236:284:::0;;:::o;33063:293::-;33211:41;18132:10;33230:12;33244:7;33211:18;:41::i;:::-;33189:120;;;;-1:-1:-1;;;33189:120:0;;;;;;;:::i;:::-;33320:28;33330:4;33336:2;33340:7;33320:9;:28::i;28884:98::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;28954:7:::1;:20:::0;28884:98::o;28990:102::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;29062:8:::1;:22:::0;28990:102::o;31740:133::-;18391:1;18537:7;;:19;18529:63;;;;-1:-1:-1;;;18529:63:0;;;;;;;:::i;:::-;18391:1;18603:7;:18;31814:51:::1;31839:4:::0;31845:19:::1;31839:4:::0;31845:13:::1;:19::i;:::-;31814:24;:51::i;:::-;-1:-1:-1::0;18347:1:0;18644:7;:22;31740:133::o;28472:150::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;28535:58:::1;::::0;28523:6:::1;::::0;28543:10:::1;::::0;28567:21:::1;::::0;28523:6;28535:58;28523:6;28535:58;28567:21;28543:10;28535:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28522:71;;;28612:1;28604:10;;;::::0;::::1;;28511:111;28472:150::o:0;33427:177::-;33557:39;33574:4;33580:2;33584:7;33557:39;;;;;;;;;;;;:16;:39::i;31528:204::-;31601:41;18132:10;31620:12;18052:98;31601:41;31579:120;;;;-1:-1:-1;;;31579:120:0;;;;;;;:::i;:::-;31710:14;31716:7;31710:5;:14::i;29206:114::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;29291:21:::1;:6;29300:12:::0;;29291:21:::1;:::i;29100:98::-:0;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;29174:16:::1;:7;29184:6:::0;;29174:16:::1;:::i;43980:464::-:0;44066:16;44100:20;44137:16;44147:5;44137:9;:16::i;:::-;44123:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44123:31:0;;44100:54;;44169:16;44179:5;44169:9;:16::i;:::-;44189:1;44169:21;44165:37;;44199:3;43980:464;-1:-1:-1;;43980:464:0:o;44165:37::-;44213:13;44246:9;44241:175;44265:18;;44261:1;:22;44241:175;;;44309:10;;;;:7;:10;;;;;;-1:-1:-1;;;;;44309:19:0;;;:10;;:19;44305:100;;44362:1;44349:3;44353:5;44349:10;;;;;;;;:::i;:::-;;;;;;;;;;:14;44382:7;;;;:::i;:::-;;;;44305:100;44285:3;;;;:::i;:::-;;;;44241:175;;;-1:-1:-1;44433:3:0;;43980:464;-1:-1:-1;;;43980:464:0:o;31881:130::-;18391:1;18537:7;;:19;18529:63;;;;-1:-1:-1;;;18529:63:0;;;;;;;:::i;:::-;18391:1;18603:7;:18;31963:40:::1;31982:10;31994:8:::0;;31963:18:::1;:40::i;:::-;-1:-1:-1::0;;18347:1:0;18644:7;:22;31881:130::o;45551:223::-;45615:7;45653:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45653:16:0;;45680:61;;;;-1:-1:-1;;;45680:61:0;;14306:2:1;45680:61:0;;;14288:21:1;14345:2;14325:18;;;14318:30;14384:29;14364:18;;;14357:57;14431:18;;45680:61:0;14104:351:1;29614:404:0;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;29754:5;29740:11:::1;29777:234;29801:3;29797:1;:7;29777:234;;;29828:9;29823:115;29847:7;;29855:1;29847:10;;;;;;;:::i;:::-;;;;;;;29843:1;:14;29823:115;;;29883:39;29893:5;;29899:1;29893:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;29903:18;;29883:9;:39::i;:::-;29859:3:::0;::::1;::::0;::::1;:::i;:::-;;;;29823:115;;;-1:-1:-1::0;29981:3:0::1;;29777:234;;;;29729:289;29614:404:::0;;;;:::o;45299:190::-;45365:7;-1:-1:-1;;;;;45393:21:0;;45385:60;;;;-1:-1:-1;;;45385:60:0;;14662:2:1;45385:60:0;;;14644:21:1;14701:2;14681:18;;;14674:30;14740:28;14720:18;;;14713:56;14786:18;;45385:60:0;14460:350:1;45385:60:0;-1:-1:-1;;;;;;45463:18:0;;;;;:9;:18;;;;;;;45299:190::o;30253:243::-;27322:14;;30354:13;;27322:14;;27314:46;;;;-1:-1:-1;;;27314:46:0;;;;;;;:::i;:::-;27375:16;;;;;;;27371:109;;;27430:10;27416:25;;;;:13;:25;;;;;;;;27408:60;;;;-1:-1:-1;;;27408:60:0;;;;;;;:::i;:::-;27514:1;27498:13;:17;27490:43;;;;-1:-1:-1;;;27490:43:0;;;;;;;:::i;:::-;26888:5:::1;30393:18;;:33;;30385:69;;;;-1:-1:-1::0;;;30385:69:0::1;;;;;;;:::i;:::-;30465:23;30474:13;30465:8;:23::i;28184:86::-:0;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;28240:14:::1;:22:::0;;-1:-1:-1;;28240:22:0::1;::::0;;28184:86::o;28630:246::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28707:20:0;::::1;28699:45;;;::::0;-1:-1:-1;;;28699:45:0;;15017:2:1;28699:45:0::1;::::0;::::1;14999:21:1::0;15056:2;15036:18;;;15029:30;-1:-1:-1;;;15075:18:1;;;15068:42;15127:18;;28699:45:0::1;14815:336:1::0;28699:45:0::1;28818:39;::::0;-1:-1:-1;;;28818:39:0;;28851:4:::1;28818:39;::::0;::::1;1856:51:1::0;-1:-1:-1;;;;;28755:23:0;::::1;::::0;::::1;::::0;28793:10:::1;::::0;28755:23;;28818:24:::1;::::0;1829:18:1;;28818:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28755:113;::::0;-1:-1:-1;;;;;;28755:113:0::1;::::0;;;;;;-1:-1:-1;;;;;15537:32:1;;;28755:113:0::1;::::0;::::1;15519:51:1::0;15586:18;;;15579:34;15492:18;;28755:113:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32127:149::-:0;18391:1;18537:7;;:19;18529:63;;;;-1:-1:-1;;;18529:63:0;;;;;;;:::i;:::-;18391:1;18603:7;:18;;;32219:19:::1;32231:6:::0;32219:11:::1;:19::i;:::-;32200:38;;32249:19;32259:8;32249:9;:19::i;30869:296::-:0;27322:14;;30970:13;;27322:14;;27314:46;;;;-1:-1:-1;;;27314:46:0;;;;;;;:::i;:::-;27375:16;;;;;;;27371:109;;;27430:10;27416:25;;;;:13;:25;;;;;;;;27408:60;;;;-1:-1:-1;;;27408:60:0;;;;;;;:::i;:::-;27514:1;27498:13;:17;27490:43;;;;-1:-1:-1;;;27490:43:0;;;;;;;:::i;:::-;26888:5:::1;31044:13;31023:18;;:34;;;;:::i;:::-;:49;;31001:122;;;;-1:-1:-1::0;;;31001:122:0::1;;;;;;;:::i;44452:373::-:0;44552:14;44581;44610;44691:15;;44671:16;;44662:6;:25;;;;:::i;:::-;44661:45;;;;:::i;:::-;44652:54;;44756:15;;44736:16;;44727:6;:25;;;;:::i;:::-;44726:45;;;;:::i;:::-;44717:54;-1:-1:-1;44801:15:0;44717:54;44801:6;:15;:::i;:::-;44791:26;;:6;:26;:::i;:::-;44452:373;;;;-1:-1:-1;;44452:373:0:o;30567:231::-;27322:14;;30655:13;;27322:14;;27314:46;;;;-1:-1:-1;;;27314:46:0;;;;;;;:::i;:::-;27375:16;;;;;;;27371:109;;;27430:10;27416:25;;;;:13;:25;;;;;;;;27408:60;;;;-1:-1:-1;;;27408:60:0;;;;;;;:::i;:::-;27514:1;27498:13;:17;27490:43;;;;-1:-1:-1;;;27490:43:0;;;;;;;:::i;:::-;26888:5:::1;30694:18;;:33;;30686:69;;;;-1:-1:-1::0;;;30686:69:0::1;;;;;;;:::i;32824:172::-:0;32935:53;18132:10;32968:9;32979:8;32935:18;:53::i;47850:392::-;47943:13;47974:25;48002:19;48016:4;48002:13;:19::i;:::-;48048:15;;47974:47;;-1:-1:-1;48034:11:0;48074:161;48098:3;48094:1;:7;48074:161;;;48129:32;48149:8;48158:1;48149:11;;;;;;;;:::i;:::-;;;;;;;48129:19;:32::i;:::-;48120:41;;;;:::i;:::-;;-1:-1:-1;48205:3:0;;48074:161;;;;47963:279;;47850:392;;;:::o;24589:132::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;24670:5:::1;::::0;24661:25:::1;::::0;-1:-1:-1;;;;;24661:25:0;;::::1;::::0;24670:5:::1;::::0;24661:25:::1;::::0;24670:5:::1;::::0;24661:25:::1;24697:5;:16:::0;;-1:-1:-1;;;;;;24697:16:0::1;-1:-1:-1::0;;;;;24697:16:0;;;::::1;::::0;;;::::1;::::0;;24589:132::o;32019:100::-;18391:1;18537:7;;:19;18529:63;;;;-1:-1:-1;;;18529:63:0;;;;;;;:::i;:::-;18391:1;18603:7;:18;32090:21:::1;32103:7:::0;32090:12:::1;:21::i;33675:337::-:0;33856:41;18132:10;33889:7;33856:18;:41::i;:::-;33834:120;;;;-1:-1:-1;;;33834:120:0;;;;;;;:::i;:::-;33965:39;33979:4;33985:2;33989:7;33998:5;33965:13;:39::i;:::-;33675:337;;;;:::o;48307:340::-;48408:13;48453:8;48408:13;48479:161;48503:3;48499:1;:7;48479:161;;;48534:32;48554:8;;48563:1;48554:11;;;;;;;:::i;:::-;;;;;;;48534:19;:32::i;:::-;48525:41;;;;:::i;:::-;;-1:-1:-1;48610:3:0;;48479:161;;;;48428:219;48307:340;;;;:::o;46169:346::-;49992:4;50016:16;;;:7;:16;;;;;;46270:13;;-1:-1:-1;;;;;50016:16:0;46301:46;;;;-1:-1:-1;;;46301:46:0;;16601:2:1;46301:46:0;;;16583:21:1;16640:2;16620:18;;;16613:30;-1:-1:-1;;;16659:18:1;;;16652:47;16716:18;;46301:46:0;16399:341:1;46301:46:0;46360:19;46382:17;46391:7;46382:8;:17::i;:::-;46360:39;;46410:19;46446:7;46455:5;46432:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46410:51;;46493:5;46500:6;46479:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46472:35;;;;46169:346;;;:::o;28376:88::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;28433:16:::1;:23:::0;;-1:-1:-1;;28433:23:0::1;;;::::0;;28376:88::o;28278:90::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;28336:16:::1;:24:::0;;-1:-1:-1;;28336:24:0::1;::::0;;28278:90::o;28092:84::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;28147:14:::1;:21:::0;;-1:-1:-1;;28147:21:0::1;28164:4;28147:21;::::0;;28092:84::o;29328:278::-;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;29423:5;29406:14:::1;29446:153;29470:6;29466:1;:10;29446:153;;;29521:4;29495:13;:23;29509:5;;29515:1;29509:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29495:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;29495:23:0;:30;;-1:-1:-1;;29495:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;29569:3:0::1;29446:153;;27725:359:::0;24200:5;;-1:-1:-1;;;;;24200:5:0;24186:10;:19;24178:51;;;;-1:-1:-1;;;24178:51:0;;;;;;;:::i;:::-;27875:1:::1;27867:5;:9;:23;;;;;27889:1;27880:6;:10;27867:23;:36;;;;;27902:1;27894:5;:9;27867:36;27859:60;;;::::0;-1:-1:-1;;;27859:60:0;;19178:2:1;27859:60:0::1;::::0;::::1;19160:21:1::0;19217:2;19197:18;;;19190:30;-1:-1:-1;;;19236:18:1;;;19229:41;19287:18;;27859:60:0::1;18976:335:1::0;27859:60:0::1;27930:16;:24:::0;;;27965:16:::1;:25:::0;;;28001:16:::1;:24:::0;;;28020:5;28054:14:::1;27984:6:::0;27949:5;28054:14:::1;:::i;:::-;:22;;;;:::i;:::-;28036:15;:40:::0;-1:-1:-1;;;27725:359:0:o;49293:398::-;49392:7;26840:3;49421:7;:21;49417:267;;;49490:9;;49466:21;;:33;;;;:::i;49417:267::-;26888:5;49521:7;:21;49517:167;;;49590:9;;49566:21;;:33;;;;:::i;49517:167::-;49663:9;;49639:21;;:33;;;;:::i;19408:136::-;19466:7;19493:43;19497:1;19500;19493:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;19486:50;19408:136;-1:-1:-1;;;19408:136:0:o;43087:159::-;43154:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;43154:29:0;-1:-1:-1;;;;;43154:29:0;;;;;;;;:24;;43208:16;43154:24;43208:7;:16::i;:::-;-1:-1:-1;;;;;43199:39:0;;;;;;;;;;;43087:159;;:::o;34511:503::-;34606:12;34632:13;34621:8;;:24;;;;:::i;:::-;34606:39;;34656:16;34675:17;34687:4;34675:11;:17::i;:::-;34656:36;;34719:8;34711:4;:16;;34703:49;;;;-1:-1:-1;;;34703:49:0;;19518:2:1;34703:49:0;;;19500:21:1;19557:2;19537:18;;;19530:30;-1:-1:-1;;;19576:18:1;;;19569:50;19636:18;;34703:49:0;19316:344:1;34703:49:0;34770:9;34765:171;34789:13;34785:1;:17;34765:171;;;34821:41;34831:10;34843:18;;34821:9;:41::i;:::-;34906:3;;34765:171;;;;34974:32;34980:4;-1:-1:-1;;;;;34980:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34997:8;34974:5;:32::i;50221:378::-;50333:4;50016:16;;;:7;:16;;;;;;-1:-1:-1;;;;;50016:16:0;50355:54;;;;-1:-1:-1;;;50355:54:0;;20123:2:1;50355:54:0;;;20105:21:1;20162:2;20142:18;;;20135:30;20201:27;20181:18;;;20174:55;20246:18;;50355:54:0;19921:349:1;50355:54:0;50420:15;50438:16;50446:7;50438;:16::i;:::-;50420:34;;50484:7;-1:-1:-1;;;;;50473:18:0;:7;-1:-1:-1;;;;;50473:18:0;;:66;;;;50532:7;-1:-1:-1;;;;;50508:31:0;:20;50520:7;50508:11;:20::i;:::-;-1:-1:-1;;;;;50508:31:0;;50473:66;:117;;;-1:-1:-1;;;;;;47739:27:0;;;47710:4;47739:27;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;50556:34;47582:203;40094:783;18391:1;18537:7;;:19;18529:63;;;;-1:-1:-1;;;18529:63:0;;;;;;;:::i;:::-;18391:1;18603:7;:18;-1:-1:-1;;;;;40231:24:0;::::1;:16;40239:7:::0;40231::::1;:16::i;:::-;-1:-1:-1::0;;;;;40231:24:0::1;;40223:52;;;::::0;-1:-1:-1;;;40223:52:0;;20477:2:1;40223:52:0::1;::::0;::::1;20459:21:1::0;20516:2;20496:18;;;20489:30;-1:-1:-1;;;20535:18:1;;;20528:45;20590:18;;40223:52:0::1;20275:339:1::0;40223:52:0::1;-1:-1:-1::0;;;;;40294:16:0;::::1;40286:41;;;::::0;-1:-1:-1;;;40286:41:0;;20821:2:1;40286:41:0::1;::::0;::::1;20803:21:1::0;20860:2;20840:18;;;20833:30;-1:-1:-1;;;20879:18:1;;;20872:42;20931:18;;40286:41:0::1;20619:336:1::0;40286:41:0::1;40364:1;40346:15;40356:4;40346:9;:15::i;:::-;:19;40338:44;;;::::0;-1:-1:-1;;;40338:44:0;;21162:2:1;40338:44:0::1;::::0;::::1;21144:21:1::0;21201:2;21181:18;;;21174:30;-1:-1:-1;;;21220:18:1;;;21213:42;21272:18;;40338:44:0::1;20960:336:1::0;40338:44:0::1;40447:29;40464:1;40468:7;40447:8;:29::i;:::-;40527:21;40540:7;40527:12;:21::i;:::-;-1:-1:-1::0;;;;;40609:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:22:::1;::::0;40629:1:::1;40609:19;:22::i;:::-;-1:-1:-1::0;;;;;40591:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:40;;;;40642:13;;::::1;::::0;;;;;:18;;40659:1:::1;::::0;40591:15;40642:18:::1;::::0;40659:1;;40642:18:::1;:::i;:::-;::::0;;;-1:-1:-1;;40671:16:0::1;::::0;;;:7:::1;:16;::::0;;;;:21;;-1:-1:-1;;;;;;40671:21:0::1;-1:-1:-1::0;;;;;40671:21:0;::::1;;::::0;;40767:31:::1;40671:16:::0;40767:22:::1;:31::i;:::-;40742:22;::::0;;;:13:::1;:22;::::0;;;;;:56;;;;40842:27;;40756:7;;-1:-1:-1;;;;;40842:27:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;18347:1:0;18644:7;:22;-1:-1:-1;40094:783:0:o;41973:565::-;42120:15;;42082:13;;;42148:319;42172:3;42168:1;:7;42148:319;;;42194:10;42207:8;42216:1;42207:11;;;;;;;;:::i;:::-;;;;;;;;;;;;42241;;;;:7;:11;;;;;;;;42207;;-1:-1:-1;;;;;;42241:19:0;;;:11;;:19;42233:52;;;;-1:-1:-1;;;42233:52:0;;21503:2:1;42233:52:0;;;21485:21:1;21542:2;21522:18;;;21515:30;-1:-1:-1;;;21561:18:1;;;21554:50;21621:18;;42233:52:0;21301:344:1;42233:52:0;42309:23;42329:2;42309:19;:23::i;:::-;42300:32;;;;:::i;:::-;;;42367:26;42390:2;42367:22;:26::i;:::-;42347:17;;;;:13;:17;;;;;;:46;42437:3;;42148:319;;;;42512:18;42518:4;42524:5;42512;:18::i;37736:807::-;49992:4;50016:16;;;:7;:16;;;;;;-1:-1:-1;;;;;50016:16:0;37788:49;;;;-1:-1:-1;;;37788:49:0;;21852:2:1;37788:49:0;;;21834:21:1;21891:2;21871:18;;;21864:30;-1:-1:-1;;;21910:18:1;;;21903:50;21970:18;;37788:49:0;21650:344:1;37788:49:0;37877:13;37893:16;37901:7;37893;:16::i;:::-;37877:32;;37950:29;37967:1;37971:7;37950:8;:29::i;:::-;38030:21;38043:7;38030:12;:21::i;:::-;-1:-1:-1;;;;;38094:16:0;;;;;;:9;:16;;;;;:21;;38114:1;;38094:16;:21;;38114:1;;38094:21;:::i;:::-;;;;-1:-1:-1;;38133:16:0;;;;:7;:16;;;;;38126:23;;-1:-1:-1;;;;;;38126:23:0;;;38197:12;:17;;38126:23;;38133:16;38197:17;;38126:23;;38197:17;:::i;:::-;;;;-1:-1:-1;;26840:3:0;38274:21;;38270:186;;;38312:11;:13;;;:11;:13;;;:::i;:::-;;;;;;38270:186;;;26888:5;38347:7;:21;38343:113;;;38385:11;:13;;;:11;:13;;;:::i;38343:113::-;38431:11;:13;;;:11;:13;;;:::i;:::-;;;;;;38343:113;38499:36;;38527:7;;38523:1;;-1:-1:-1;;;;;38499:36:0;;;;;38523:1;;38499:36;37777:766;37736:807;:::o;41404:561::-;41509:13;41547:8;41509:13;41575:319;41599:3;41595:1;:7;41575:319;;;41621:10;41634:8;;41643:1;41634:11;;;;;;;:::i;:::-;;;;;;;;;;41668;;;;:7;:11;;;;;;;;41634;;-1:-1:-1;;;;;;;41668:19:0;;;:11;;:19;41660:52;;;;-1:-1:-1;;;41660:52:0;;21503:2:1;41660:52:0;;;21485:21:1;21542:2;21522:18;;;21515:30;-1:-1:-1;;;21561:18:1;;;21554:50;21621:18;;41660:52:0;21301:344:1;41660:52:0;41736:23;41756:2;41736:19;:23::i;:::-;41727:32;;;;:::i;:::-;;;41794:26;41817:2;41794:22;:26::i;:::-;41774:17;;;;:13;:17;;;;;;:46;41864:3;;41575:319;;;;41939:18;41945:4;41951:5;41939;:18::i;:::-;41498:467;;41404:561;;;:::o;36170:256::-;36238:18;36244:2;36248:7;36238:5;:18::i;:::-;36289:51;36320:1;36324:2;36328:7;36289:51;;;;;;;;;;;;:22;:51::i;:::-;36267:151;;;;-1:-1:-1;;;36267:151:0;;22342:2:1;36267:151:0;;;22324:21:1;22381:2;22361:18;;;22354:30;22420:34;22400:18;;;22393:62;-1:-1:-1;;;22471:18:1;;;22464:48;22529:19;;36267:151:0;22140:414:1;34184:319:0;34280:9;34263:13;34253:7;;:23;;;;:::i;:::-;:36;;34245:69;;;;-1:-1:-1;;;34245:69:0;;19518:2:1;34245:69:0;;;19500:21:1;19557:2;19537:18;;;19530:30;-1:-1:-1;;;19576:18:1;;;19569:50;19636:18;;34245:69:0;19316:344:1;34245:69:0;34330:9;34325:171;34349:13;34345:1;:17;34325:171;;;34381:41;34391:10;34403:18;;34381:9;:41::i;:::-;34466:3;;34325:171;;35524:419;35616:36;;-1:-1:-1;;;35616:36:0;;35646:4;35616:36;;;1856:51:1;35579:7:0;;;;26096:42;;35616:21;;1829:18:1;;35616:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35685:59;;-1:-1:-1;;;35685:59:0;;35710:10;35685:59;;;22799:34:1;35730:4:0;22849:18:1;;;22842:43;22901:18;;;22894:34;;;35599:53:0;;-1:-1:-1;26096:42:0;;35685:24;;22734:18:1;;35685:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35663:126;;;;-1:-1:-1;;;35663:126:0;;23141:2:1;35663:126:0;;;23123:21:1;23180:2;23160:18;;;23153:30;-1:-1:-1;;;23199:18:1;;;23192:47;23256:18;;35663:126:0;22939:341:1;35663:126:0;35816:36;;-1:-1:-1;;;35816:36:0;;35846:4;35816:36;;;1856:51:1;35800:13:0;;26096:42;;35816:21;;1829:18:1;;35816:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35800:52;;35879:6;35871:5;:14;35863:40;;;;-1:-1:-1;;;35863:40:0;;23487:2:1;35863:40:0;;;23469:21:1;23526:2;23506:18;;;23499:30;-1:-1:-1;;;23545:18:1;;;23538:43;23598:18;;35863:40:0;23285:337:1;35863:40:0;35921:14;35929:6;35921:5;:14;:::i;35022:494::-;35093:6;35077:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;35111:10:0;;-1:-1:-1;35111:10:0;;35149:20;35162:6;35149:12;:20::i;:::-;35110:59;;;;;;35198:1;35184:11;;:15;35180:103;;;35260:11;;35247:9;;35242:14;;:2;:14;:::i;:::-;35241:30;;;;:::i;:::-;35216:21;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;35180:103:0;35297:11;;:15;35293:103;;35373:11;;35360:9;;35355:14;;:2;:14;:::i;:::-;35354:30;;;;:::i;:::-;35329:21;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;35293:103:0;35410:11;;:15;35406:103;;35486:11;;35473:9;;35468:14;;:2;:14;:::i;:::-;35467:30;;;;:::i;:::-;35442:21;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;35066:450:0;;;35022:494;:::o;43388:319::-;43540:9;-1:-1:-1;;;;;43529:20:0;:7;-1:-1:-1;;;;;43529:20:0;;43521:58;;;;-1:-1:-1;;;43521:58:0;;23829:2:1;43521:58:0;;;23811:21:1;23868:2;23848:18;;;23841:30;23907:27;23887:18;;;23880:55;23952:18;;43521:58:0;23627:349:1;43521:58:0;-1:-1:-1;;;;;43590:27:0;;;;;;;:18;:27;;;;;;;;:38;;;;;;;;;;;;;:49;;-1:-1:-1;;43590:49:0;;;;;;;;;;43655:44;;907:41:1;;;43655:44:0;;880:18:1;43655:44:0;;;;;;;43388:319;;;:::o;40935:461::-;41027:12;41042:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41042:16:0;;41069:57;;41108:7;40935:461;:::o;41069:57::-;41172:15;41190:28;41210:7;41190:19;:28::i;:::-;41172:46;;41288:31;41311:7;41288:22;:31::i;:::-;41263:22;;;;:13;:22;;;;;:56;41368:20;41374:4;41380:7;41368:5;:20::i;39425:332::-;39574:28;39584:4;39590:2;39594:7;39574:9;:28::i;:::-;39635:48;39658:4;39664:2;39668:7;39677:5;39635:22;:48::i;:::-;39613:136;;;;-1:-1:-1;;;39613:136:0;;;;;;;:::i;46579:621::-;46659:27;46708:2;46714:1;46708:7;46704:50;;-1:-1:-1;;46732:10:0;;;;;;;;;;;;-1:-1:-1;;;46732:10:0;;;;;46579:621::o;46704:50::-;46776:2;46764:9;46811:69;46818:6;;46811:69;;46841:5;;;;:::i;:::-;;-1:-1:-1;46861:7:0;;-1:-1:-1;46866:2:0;46861:7;;:::i;:::-;;;46811:69;;;46890:17;46920:3;46910:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46910:14:0;-1:-1:-1;46890:34:0;-1:-1:-1;46947:3:0;46961:202;46968:7;;46961:202;;46996:5;47000:1;46996;:5;:::i;:::-;46992:9;-1:-1:-1;47016:10:0;47047:7;47052:2;47047;:7;:::i;:::-;47046:14;;47058:2;47046:14;:::i;:::-;47041:19;;:2;:19;:::i;:::-;47030:31;;:2;:31;:::i;:::-;47016:46;;47077:9;47096:4;47089:12;;47077:24;;47126:2;47116:4;47121:1;47116:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;47116:12:0;;;;;;;;-1:-1:-1;47143:8:0;47149:2;47143:8;;:::i;:::-;;;46977:186;;46961:202;;;-1:-1:-1;47187:4:0;46579:621;-1:-1:-1;;;;46579:621:0:o;19847:226::-;19967:7;20003:12;19995:6;;;;19987:29;;;;-1:-1:-1;;;19987:29:0;;;;;;;;:::i;:::-;-1:-1:-1;20027:9:0;20039:5;20043:1;20039;:5;:::i;:::-;20027:17;19847:226;-1:-1:-1;;;;;19847:226:0:o;42546:423::-;42657:36;;-1:-1:-1;;;42657:36:0;;42687:4;42657:36;;;1856:51:1;42642:12:0;;26096:42;;42657:21;;1829:18:1;;42657:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42642:51;;42717:4;42708:6;:13;42704:59;;;42747:4;42738:13;;42704:59;42812:6;42822:1;42812:11;42808:50;;42840:7;42546:423;;:::o;42808:50::-;42906:32;;-1:-1:-1;;;42906:32:0;;-1:-1:-1;;;;;15537:32:1;;42906::0;;;15519:51:1;15586:18;;;15579:34;;;26096:42:0;;42906:20;;15492:18:1;;42906:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42898:63;;;;-1:-1:-1;;;42898:63:0;;24799:2:1;42898:63:0;;;24781:21:1;24838:2;24818:18;;;24811:30;-1:-1:-1;;;24857:18:1;;;24850:48;24915:18;;42898:63:0;24597:342:1;36762:745:0;49992:4;50016:16;;;:7;:16;;;;;;-1:-1:-1;;;;;50016:16:0;:30;36826:58;;;;-1:-1:-1;;;36826:58:0;;25146:2:1;36826:58:0;;;25128:21:1;25185:2;25165:18;;;25158:30;25224;25204:18;;;25197:58;25272:18;;36826:58:0;24944:352:1;36826:58:0;25416:5;36903:18;;:31;36895:69;;;;-1:-1:-1;;;36895:69:0;;25503:2:1;36895:69:0;;;25485:21:1;25542:2;25522:18;;;25515:30;25581:27;25561:18;;;25554:55;25626:18;;36895:69:0;25301:349:1;36895:69:0;-1:-1:-1;;;;;36977:13:0;;;;;;:9;:13;;;;;:18;;36994:1;;36977:13;:18;;36994:1;;36977:18;:::i;:::-;;;;-1:-1:-1;;37006:16:0;;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;37006:21:0;-1:-1:-1;;;;;37006:21:0;;;;;37038:12;:14;;;;;;:::i;:::-;;;;-1:-1:-1;;37063:18:0;:20;;;:18;:20;;;:::i;:::-;;;;;;37119:31;37142:7;37119:22;:31::i;:::-;37094:22;;;;:13;:22;;;;;:56;26840:3;37167:21;;37163:186;;;37205:11;:13;;;:11;:13;;;:::i;:::-;;;;;;37163:186;;;26888:5;37240:7;:21;37236:113;;;37278:11;:13;;;:11;:13;;;:::i;37236:113::-;37324:11;:13;;;:11;:13;;;:::i;:::-;;;;;;37236:113;26888:5;37365:18;;:33;37361:88;;37415:14;:22;;-1:-1:-1;;37415:22:0;;;37361:88;37466:33;;37491:7;;-1:-1:-1;;;;;37466:33:0;;;37483:1;;37466:33;;37483:1;;37466:33;36762:745;;:::o;51296:920::-;51451:4;51472:15;:2;-1:-1:-1;;;;;51472:13:0;;:15::i;:::-;51468:741;;;51525:175;;-1:-1:-1;;;51525:175:0;;-1:-1:-1;;;;;51525:36:0;;;;;:175;;18132:10;;51619:4;;51646:7;;51676:5;;51525:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51525:175:0;;;;;;;;-1:-1:-1;;51525:175:0;;;;;;;;;;;;:::i;:::-;;;51504:650;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51883:6;:13;51900:1;51883:18;51879:260;;51926:48;;-1:-1:-1;;;51926:48:0;;;;;;;:::i;51879:260::-;52089:6;52083:13;52074:6;52070:2;52066:15;52059:38;51504:650;-1:-1:-1;;;;;;51764:51:0;-1:-1:-1;;;51764:51:0;;-1:-1:-1;51757:58:0;;51468:741;-1:-1:-1;52193:4:0;51296:920;;;;;;:::o;11606:641::-;11666:4;12147:20;;11977:66;12196:23;;;;;;:42;;-1:-1:-1;;12223:15:0;;;12188:51;-1:-1:-1;;11606:641:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:180:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;381:131::-;-1:-1:-1;;;;;;455:32:1;;445:43;;435:71;;502:1;499;492:12;517:245;575:6;628:2;616:9;607:7;603:23;599:32;596:52;;;644:1;641;634:12;596:52;683:9;670:23;702:30;726:5;702:30;:::i;959:258::-;1031:1;1041:113;1055:6;1052:1;1049:13;1041:113;;;1131:11;;;1125:18;1112:11;;;1105:39;1077:2;1070:10;1041:113;;;1172:6;1169:1;1166:13;1163:48;;;-1:-1:-1;;1207:1:1;1189:16;;1182:27;959:258::o;1222:::-;1264:3;1302:5;1296:12;1329:6;1324:3;1317:19;1345:63;1401:6;1394:4;1389:3;1385:14;1378:4;1371:5;1367:16;1345:63;:::i;:::-;1462:2;1441:15;-1:-1:-1;;1437:29:1;1428:39;;;;1469:4;1424:50;;1222:258;-1:-1:-1;;1222:258:1:o;1485:220::-;1634:2;1623:9;1616:21;1597:4;1654:45;1695:2;1684:9;1680:18;1672:6;1654:45;:::i;1918:131::-;-1:-1:-1;;;;;1993:31:1;;1983:42;;1973:70;;2039:1;2036;2029:12;2054:315;2122:6;2130;2183:2;2171:9;2162:7;2158:23;2154:32;2151:52;;;2199:1;2196;2189:12;2151:52;2238:9;2225:23;2257:31;2282:5;2257:31;:::i;:::-;2307:5;2359:2;2344:18;;;;2331:32;;-1:-1:-1;;;2054:315:1:o;2374:456::-;2451:6;2459;2467;2520:2;2508:9;2499:7;2495:23;2491:32;2488:52;;;2536:1;2533;2526:12;2488:52;2575:9;2562:23;2594:31;2619:5;2594:31;:::i;:::-;2644:5;-1:-1:-1;2701:2:1;2686:18;;2673:32;2714:33;2673:32;2714:33;:::i;:::-;2374:456;;2766:7;;-1:-1:-1;;;2820:2:1;2805:18;;;;2792:32;;2374:456::o;2835:247::-;2894:6;2947:2;2935:9;2926:7;2922:23;2918:32;2915:52;;;2963:1;2960;2953:12;2915:52;3002:9;2989:23;3021:31;3046:5;3021:31;:::i;3087:592::-;3158:6;3166;3219:2;3207:9;3198:7;3194:23;3190:32;3187:52;;;3235:1;3232;3225:12;3187:52;3275:9;3262:23;3304:18;3345:2;3337:6;3334:14;3331:34;;;3361:1;3358;3351:12;3331:34;3399:6;3388:9;3384:22;3374:32;;3444:7;3437:4;3433:2;3429:13;3425:27;3415:55;;3466:1;3463;3456:12;3415:55;3506:2;3493:16;3532:2;3524:6;3521:14;3518:34;;;3548:1;3545;3538:12;3518:34;3593:7;3588:2;3579:6;3575:2;3571:15;3567:24;3564:37;3561:57;;;3614:1;3611;3604:12;3561:57;3645:2;3637:11;;;;;3667:6;;-1:-1:-1;3087:592:1;;-1:-1:-1;;;;3087:592:1:o;3684:632::-;3855:2;3907:21;;;3977:13;;3880:18;;;3999:22;;;3826:4;;3855:2;4078:15;;;;4052:2;4037:18;;;3826:4;4121:169;4135:6;4132:1;4129:13;4121:169;;;4196:13;;4184:26;;4265:15;;;;4230:12;;;;4157:1;4150:9;4121:169;;;-1:-1:-1;4307:3:1;;3684:632;-1:-1:-1;;;;;;3684:632:1:o;4321:367::-;4384:8;4394:6;4448:3;4441:4;4433:6;4429:17;4425:27;4415:55;;4466:1;4463;4456:12;4415:55;-1:-1:-1;4489:20:1;;4532:18;4521:30;;4518:50;;;4564:1;4561;4554:12;4518:50;4601:4;4593:6;4589:17;4577:29;;4661:3;4654:4;4644:6;4641:1;4637:14;4629:6;4625:27;4621:38;4618:47;4615:67;;;4678:1;4675;4668:12;4615:67;4321:367;;;;;:::o;4693:437::-;4779:6;4787;4840:2;4828:9;4819:7;4815:23;4811:32;4808:52;;;4856:1;4853;4846:12;4808:52;4896:9;4883:23;4929:18;4921:6;4918:30;4915:50;;;4961:1;4958;4951:12;4915:50;5000:70;5062:7;5053:6;5042:9;5038:22;5000:70;:::i;:::-;5089:8;;4974:96;;-1:-1:-1;4693:437:1;-1:-1:-1;;;;4693:437:1:o;5135:773::-;5257:6;5265;5273;5281;5334:2;5322:9;5313:7;5309:23;5305:32;5302:52;;;5350:1;5347;5340:12;5302:52;5390:9;5377:23;5419:18;5460:2;5452:6;5449:14;5446:34;;;5476:1;5473;5466:12;5446:34;5515:70;5577:7;5568:6;5557:9;5553:22;5515:70;:::i;:::-;5604:8;;-1:-1:-1;5489:96:1;-1:-1:-1;5692:2:1;5677:18;;5664:32;;-1:-1:-1;5708:16:1;;;5705:36;;;5737:1;5734;5727:12;5705:36;;5776:72;5840:7;5829:8;5818:9;5814:24;5776:72;:::i;:::-;5135:773;;;;-1:-1:-1;5867:8:1;-1:-1:-1;;;;5135:773:1:o;6237:118::-;6323:5;6316:13;6309:21;6302:5;6299:32;6289:60;;6345:1;6342;6335:12;6360:382;6425:6;6433;6486:2;6474:9;6465:7;6461:23;6457:32;6454:52;;;6502:1;6499;6492:12;6454:52;6541:9;6528:23;6560:31;6585:5;6560:31;:::i;:::-;6610:5;-1:-1:-1;6667:2:1;6652:18;;6639:32;6680:30;6639:32;6680:30;:::i;:::-;6729:7;6719:17;;;6360:382;;;;;:::o;6954:127::-;7015:10;7010:3;7006:20;7003:1;6996:31;7046:4;7043:1;7036:15;7070:4;7067:1;7060:15;7086:1266;7181:6;7189;7197;7205;7258:3;7246:9;7237:7;7233:23;7229:33;7226:53;;;7275:1;7272;7265:12;7226:53;7314:9;7301:23;7333:31;7358:5;7333:31;:::i;:::-;7383:5;-1:-1:-1;7440:2:1;7425:18;;7412:32;7453:33;7412:32;7453:33;:::i;:::-;7505:7;-1:-1:-1;7559:2:1;7544:18;;7531:32;;-1:-1:-1;7614:2:1;7599:18;;7586:32;7637:18;7667:14;;;7664:34;;;7694:1;7691;7684:12;7664:34;7732:6;7721:9;7717:22;7707:32;;7777:7;7770:4;7766:2;7762:13;7758:27;7748:55;;7799:1;7796;7789:12;7748:55;7835:2;7822:16;7857:2;7853;7850:10;7847:36;;;7863:18;;:::i;:::-;7938:2;7932:9;7906:2;7992:13;;-1:-1:-1;;7988:22:1;;;8012:2;7984:31;7980:40;7968:53;;;8036:18;;;8056:22;;;8033:46;8030:72;;;8082:18;;:::i;:::-;8122:10;8118:2;8111:22;8157:2;8149:6;8142:18;8197:7;8192:2;8187;8183;8179:11;8175:20;8172:33;8169:53;;;8218:1;8215;8208:12;8169:53;8274:2;8269;8265;8261:11;8256:2;8248:6;8244:15;8231:46;8319:1;8314:2;8309;8301:6;8297:15;8293:24;8286:35;8340:6;8330:16;;;;;;;7086:1266;;;;;;;:::o;8357:388::-;8425:6;8433;8486:2;8474:9;8465:7;8461:23;8457:32;8454:52;;;8502:1;8499;8492:12;8454:52;8541:9;8528:23;8560:31;8585:5;8560:31;:::i;:::-;8610:5;-1:-1:-1;8667:2:1;8652:18;;8639:32;8680:33;8639:32;8680:33;:::i;9413:316::-;9490:6;9498;9506;9559:2;9547:9;9538:7;9534:23;9530:32;9527:52;;;9575:1;9572;9565:12;9527:52;-1:-1:-1;;9598:23:1;;;9668:2;9653:18;;9640:32;;-1:-1:-1;9719:2:1;9704:18;;;9691:32;;9413:316;-1:-1:-1;9413:316:1:o;10898:343::-;11100:2;11082:21;;;11139:2;11119:18;;;11112:30;-1:-1:-1;;;11173:2:1;11158:18;;11151:49;11232:2;11217:18;;10898:343::o;11246:346::-;11448:2;11430:21;;;11487:2;11467:18;;;11460:30;-1:-1:-1;;;11521:2:1;11506:18;;11499:52;11583:2;11568:18;;11246:346::o;11597:337::-;11799:2;11781:21;;;11838:2;11818:18;;;11811:30;-1:-1:-1;;;11872:2:1;11857:18;;11850:43;11925:2;11910:18;;11597:337::o;11939:127::-;12000:10;11995:3;11991:20;11988:1;11981:31;12031:4;12028:1;12021:15;12055:4;12052:1;12045:15;12071:128;12111:3;12142:1;12138:6;12135:1;12132:13;12129:39;;;12148:18;;:::i;:::-;-1:-1:-1;12184:9:1;;12071:128::o;12204:347::-;12406:2;12388:21;;;12445:2;12425:18;;;12418:30;12484:25;12479:2;12464:18;;12457:53;12542:2;12527:18;;12204:347::o;12556:353::-;12758:2;12740:21;;;12797:2;12777:18;;;12770:30;12836:31;12831:2;12816:18;;12809:59;12900:2;12885:18;;12556:353::o;12914:343::-;13116:2;13098:21;;;13155:2;13135:18;;;13128:30;-1:-1:-1;;;13189:2:1;13174:18;;13167:49;13248:2;13233:18;;12914:343::o;13262:355::-;13464:2;13446:21;;;13503:2;13483:18;;;13476:30;13542:33;13537:2;13522:18;;13515:61;13608:2;13593:18;;13262:355::o;13832:127::-;13893:10;13888:3;13884:20;13881:1;13874:31;13924:4;13921:1;13914:15;13948:4;13945:1;13938:15;13964:135;14003:3;14024:17;;;14021:43;;14044:18;;:::i;:::-;-1:-1:-1;14091:1:1;14080:13;;13964:135::o;15156:184::-;15226:6;15279:2;15267:9;15258:7;15254:23;15250:32;15247:52;;;15295:1;15292;15285:12;15247:52;-1:-1:-1;15318:16:1;;15156:184;-1:-1:-1;15156:184:1:o;15624:245::-;15691:6;15744:2;15732:9;15723:7;15719:23;15715:32;15712:52;;;15760:1;15757;15750:12;15712:52;15792:9;15786:16;15811:28;15833:5;15811:28;:::i;15874:168::-;15914:7;15980:1;15976;15972:6;15968:14;15965:1;15962:21;15957:1;15950:9;15943:17;15939:45;15936:71;;;15987:18;;:::i;:::-;-1:-1:-1;16027:9:1;;15874:168::o;16047:217::-;16087:1;16113;16103:132;;16157:10;16152:3;16148:20;16145:1;16138:31;16192:4;16189:1;16182:15;16220:4;16217:1;16210:15;16103:132;-1:-1:-1;16249:9:1;;16047:217::o;16269:125::-;16309:4;16337:1;16334;16331:8;16328:34;;;16342:18;;:::i;:::-;-1:-1:-1;16379:9:1;;16269:125::o;16745:380::-;16824:1;16820:12;;;;16867;;;16888:61;;16942:4;16934:6;16930:17;16920:27;;16888:61;16995:2;16987:6;16984:14;16964:18;16961:38;16958:161;;17041:10;17036:3;17032:20;17029:1;17022:31;17076:4;17073:1;17066:15;17104:4;17101:1;17094:15;16958:161;;16745:380;;;:::o;17256:973::-;17341:12;;17306:3;;17396:1;17416:18;;;;17469;;;;17496:61;;17550:4;17542:6;17538:17;17528:27;;17496:61;17576:2;17624;17616:6;17613:14;17593:18;17590:38;17587:161;;17670:10;17665:3;17661:20;17658:1;17651:31;17705:4;17702:1;17695:15;17733:4;17730:1;17723:15;17587:161;17764:18;17791:104;;;;17909:1;17904:319;;;;17757:466;;17791:104;-1:-1:-1;;17824:24:1;;17812:37;;17869:16;;;;-1:-1:-1;17791:104:1;;17904:319;17203:1;17196:14;;;17240:4;17227:18;;17998:1;18012:165;18026:6;18023:1;18020:13;18012:165;;;18104:14;;18091:11;;;18084:35;18147:16;;;;18041:10;;18012:165;;;18016:3;;18206:6;18201:3;18197:16;18190:23;;17757:466;;;;;;;17256:973;;;;:::o;18234:376::-;18410:3;18438:38;18472:3;18464:6;18438:38;:::i;:::-;18505:6;18499:13;18521:52;18566:6;18562:2;18555:4;18547:6;18543:17;18521:52;:::i;:::-;18589:15;;18234:376;-1:-1:-1;;;;18234:376:1:o;18615:356::-;18791:3;18829:6;18823:13;18845:53;18891:6;18886:3;18879:4;18871:6;18867:17;18845:53;:::i;:::-;18914:51;18957:6;18952:3;18948:16;18940:6;18914:51;:::i;19665:251::-;19735:6;19788:2;19776:9;19767:7;19763:23;19759:32;19756:52;;;19804:1;19801;19794:12;19756:52;19836:9;19830:16;19855:31;19880:5;19855:31;:::i;21999:136::-;22038:3;22066:5;22056:39;;22075:18;;:::i;:::-;-1:-1:-1;;;22111:18:1;;21999:136::o;23981:402::-;24183:2;24165:21;;;24222:2;24202:18;;;24195:30;24261:34;24256:2;24241:18;;24234:62;-1:-1:-1;;;24327:2:1;24312:18;;24305:36;24373:3;24358:19;;23981:402::o;24388:204::-;24426:3;24462:4;24459:1;24455:12;24494:4;24491:1;24487:12;24529:3;24523:4;24519:14;24514:3;24511:23;24508:49;;;24537:18;;:::i;:::-;24573:13;;24388:204;-1:-1:-1;;;24388:204:1:o;25655:489::-;-1:-1:-1;;;;;25924:15:1;;;25906:34;;25976:15;;25971:2;25956:18;;25949:43;26023:2;26008:18;;26001:34;;;26071:3;26066:2;26051:18;;26044:31;;;25849:4;;26092:46;;26118:19;;26110:6;26092:46;:::i;:::-;26084:54;25655:489;-1:-1:-1;;;;;;25655:489:1:o;26149:249::-;26218:6;26271:2;26259:9;26250:7;26246:23;26242:32;26239:52;;;26287:1;26284;26277:12;26239:52;26319:9;26313:16;26338:30;26362:5;26338:30;:::i

Swarm Source

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