ETH Price: $3,293.55 (+1.35%)
Gas: 2 Gwei

Token

TaterTown (TATER)
 

Overview

Max Total Supply

5,555 TATER

Holders

289

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TATER
0xC9E6edbD8172906201A6E1887bDB9942e9E48dB0
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:
TATERTOWN

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;
// File: SafeMath.sol

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

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

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

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

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

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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);
        return a / b;
    }

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


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


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

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

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

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

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


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


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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// File: Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)



/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)


/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: IERC721Receiver.sol


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


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


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


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


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



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


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



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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)



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

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

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


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



/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: ERC721A.sol

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // Compiler will pack the following 
    // _currentIndex and _burnCounter into a single 256bit word.
    
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex;

    // The number of tokens burned.
    uint128 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant: 
                    // There will always be an ownership that has an address and is not burned 
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
// remember here is test for  i = 1 usually its just i no = anything
            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

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

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

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked { 
            _burnCounter++;
        }
    }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: Tater.sol

/*
* ERC721A Gas Optimized Minting
*  https://twitter.com/SQUIDzillaz0e
*  Feel free to use and Modify.
*  
*/


contract TATERTOWN is ERC721A, Ownable {
    using SafeMath for uint256;

    uint256 MAX_MINTS = 100;
    uint256 MAX_ELEMENTS = 5555;
    uint256 public mintRate = 0.07 ether;
    uint256 public privateMintPrice = 0.055 ether;
    uint256 public MAX_MINT_WHITELIST = 50;
    /*
    * @Dev Booleans for sale states. 
    * salesIsActive must be true in any case to mint
    * privateSaleIsActive must be true in the case of Whitelist mints
    */
    bool public saleIsActive = false;
    bool public privateSaleIsActive = true;
    /*
    * @Dev Whitelist Struct and Mappings
    * the address and amount minted to keep track of how many you may mint
    */
    struct Whitelist {
        address addr;
        uint256 claimAmount;
        uint256 hasMinted;
    }

    mapping(address => Whitelist) public whitelist;

    address[] whitelistAddr;


    string public baseURI = "ipfs://QmctVWhKnYK5FDkQAVZf9My2FAhNHmJV6tH6zyB1eGKYHy/";

    constructor() ERC721A("TaterTown", "TATER") {}

    /*
     *  @dev
     * Set presell price to mint
     */
    function setPrivateMintPrice(uint256 _price) external onlyOwner {
        privateMintPrice = _price;
    }

    /*
     *@dev
     * Set publicsell price to mint
     */
    function setPublicMintPrice(uint256 _price) external onlyOwner {
        mintRate = _price;
    }

    /*
    * @dev mint funtion with _to address. no cost mint
    *  by contract owner/deployer
    */
    function Devmint(uint256 quantity, address _to) external payable onlyOwner {
        require(saleIsActive, "Sale must be active to mint");
        require(totalSupply() + quantity <= MAX_ELEMENTS, "Not enough tokens left");
        _safeMint(_to, quantity);
    }

    /*
    * @dev mint function adn checks for saleState and mint quantity
    *
    */    
    function mint(uint256 quantity) external payable {
        require(saleIsActive, "Sale must be active to mint");
        // _safeMint's second argument now takes in a quantity, not a tokenId.
        require(quantity + _numberMinted(msg.sender) <= MAX_MINTS, "Exceeds Max Allowed Mint Count");
        require(totalSupply() + quantity <= MAX_ELEMENTS, "Not enough tokens left to Mint");

        if(privateSaleIsActive) {
           require(msg.value >= (privateMintPrice * quantity), "Not enough ETH sent");
           require(quantity <= MAX_MINT_WHITELIST, "Above max Mint Whitelist count");
           require(isWhitelisted(msg.sender), "Is not whitelisted");
           require(
                whitelist[msg.sender].hasMinted.add(quantity) <=
                    MAX_MINT_WHITELIST,
                "Exceeds Max Mint During Whitelist Period"
            );
            whitelist[msg.sender].hasMinted = whitelist[msg.sender]
                .hasMinted
                .add(quantity);
        } else {
        if (isWhitelisted(msg.sender)) {
            require((balanceOf(msg.sender) - whitelist[msg.sender].hasMinted + quantity) <= MAX_MINTS, "Cant Mint any More Tokens");
        } else {
            require((balanceOf(msg.sender) + quantity) <= MAX_MINTS, "Cant Mint any More Tokens");
        }
            require(
                (mintRate * quantity) <= msg.value,
                "Value below price"
            );
        }


        if (totalSupply() < MAX_ELEMENTS){
        _safeMint(msg.sender, quantity);
        }
    }

    function setMaxMints(uint256 _max) external onlyOwner {
        MAX_MINTS = _max;
    }

    function setMaxMintsWhiteList(uint256 _wlMax) external onlyOwner {
        MAX_MINT_WHITELIST = _wlMax;
    }

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

    function maxSupply() external view returns (uint256) {
        return MAX_ELEMENTS;
    }

    function maxAllowedMints() external view returns (uint256) {
        return MAX_MINTS;
    }

    function publicmintPrice() external view returns (uint256) {
    return mintRate;
    }

    function withdraw() external payable onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

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

    function setPublicRate(uint256 _mintRate) public onlyOwner {
        mintRate = _mintRate;
    }

     /*
     * Pause sale if active, make active if paused
     */

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }
    
    /*
    * @dev flip sale state form whitelist to public
    *
    */
    function flipPrivateSaleState() public onlyOwner {
        privateSaleIsActive = !privateSaleIsActive;
    }

    function setWhitelistAddr(address[] memory addrs) public onlyOwner {
        whitelistAddr = addrs;
        for (uint256 i = 0; i < whitelistAddr.length; i++) {
            addAddressToWhitelist(whitelistAddr[i]);
        }
    }

    function altWithdraw(uint256 _amount, address payable _to)
        external
        onlyOwner
    {
        require(_amount > 0, "Withdraw must be greater than 0");
        require(_amount <= address(this).balance, "Amount too high");
        (bool success, ) = _to.call{value: _amount}("");
        require(success);
    }

    function addAddressToWhitelist(address addr)
        public
        onlyOwner
        returns (bool success)
    {
        require(!isWhitelisted(addr), "Already whitelisted");
        whitelist[addr].addr = addr;
        success = true;
    }
    
    /*
    * @dev return a boolean true or false if
    * an address is whitelisted on etherscan
    * or frontend
    */
    function isWhitelisted(address addr)
        public
        view
        returns (bool isWhiteListed)
    {
        return whitelist[addr].addr == addr;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"Devmint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"MAX_MINT_WHITELIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAddressToWhitelist","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"altWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPrivateSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","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"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"isWhiteListed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAllowedMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicmintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlMax","type":"uint256"}],"name":"setMaxMintsWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrivateMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPublicMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintRate","type":"uint256"}],"name":"setPublicRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"setWhitelistAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"claimAmount","type":"uint256"},{"internalType":"uint256","name":"hasMinted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260646008556115b360095566f8b0a10e470000600a5566c3663566a58000600b556032600c556000600d60006101000a81548160ff0219169083151502179055506001600d60016101000a81548160ff0219169083151502179055506040518060600160405280603681526020016200538260369139601090805190602001906200009192919062000234565b503480156200009f57600080fd5b506040518060400160405280600981526020017f5461746572546f776e00000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f544154455200000000000000000000000000000000000000000000000000000081525081600190805190602001906200012492919062000234565b5080600290805190602001906200013d92919062000234565b50505062000160620001546200016660201b60201c565b6200016e60201b60201c565b62000349565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024290620002e4565b90600052602060002090601f016020900481019282620002665760008555620002b2565b82601f106200028157805160ff1916838001178555620002b2565b82800160010185558215620002b2579182015b82811115620002b157825182559160200191906001019062000294565b5b509050620002c19190620002c5565b5090565b5b80821115620002e0576000816000905550600101620002c6565b5090565b60006002820490506001821680620002fd57607f821691505b602082108114156200031457620003136200031a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61502980620003596000396000f3fe6080604052600436106102665760003560e01c80636352211e116101445780639b19251a116100b6578063ca0dcf161161007a578063ca0dcf16146108f0578063cd7d508f1461091b578063d5abeb0114610944578063e985e9c51461096f578063eb8d2444146109ac578063f2fde38b146109d757610266565b80639b19251a14610806578063a0712d6814610845578063a22cb46514610861578063b88d4fde1461088a578063c87b56dd146108b357610266565b80637a5657d2116101085780637a5657d2146106f65780637b9417c81461071f5780638da5cb5b1461075c5780639150fd8414610787578063924b4729146107b057806395d89b41146107db57610266565b80636352211e146106115780636c0360eb1461064e57806370a0823114610679578063715018a6146106b657806379c9cb7b146106cd57610266565b806334918dfd116101dd57806344fead9e116101a157806344fead9e146105105780634f6ccce71461053b57806354ef2f701461057857806355f804b31461059457806358941a4d146105bd5780635d82cf6e146105e857610266565b806334918dfd146104725780633719e3b0146104895780633af32abf146104a05780633ccfd60b146104dd57806342842e0e146104e757610266565b8063095ea7b31161022f578063095ea7b31461036657806318160ddd1461038f5780631970d1fb146103ba57806323b872dd146103e3578063287a40e71461040c5780632f745c591461043557610266565b806204348e1461026b57806301ffc9a71461029657806304737a01146102d357806306fdde03146102fe578063081812fc14610329575b600080fd5b34801561027757600080fd5b50610280610a00565b60405161028d91906147e2565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b89190614057565b610a06565b6040516102ca91906145a5565b60405180910390f35b3480156102df57600080fd5b506102e8610b50565b6040516102f591906145a5565b60405180910390f35b34801561030a57600080fd5b50610313610b63565b60405161032091906145c0565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b91906140fe565b610bf5565b60405161035d9190614507565b60405180910390f35b34801561037257600080fd5b5061038d60048036038101906103889190613fce565b610c71565b005b34801561039b57600080fd5b506103a4610d7c565b6040516103b191906147e2565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc91906140fe565b610dd1565b005b3480156103ef57600080fd5b5061040a60048036038101906104059190613eb8565b610e57565b005b34801561041857600080fd5b50610433600480360381019061042e91906140fe565b610e67565b005b34801561044157600080fd5b5061045c60048036038101906104579190613fce565b610eed565b60405161046991906147e2565b60405180910390f35b34801561047e57600080fd5b506104876110f4565b005b34801561049557600080fd5b5061049e61119c565b005b3480156104ac57600080fd5b506104c760048036038101906104c29190613e4b565b611244565b6040516104d491906145a5565b60405180910390f35b6104e56112de565b005b3480156104f357600080fd5b5061050e60048036038101906105099190613eb8565b6113aa565b005b34801561051c57600080fd5b506105256113ca565b60405161053291906147e2565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d91906140fe565b6113d4565b60405161056f91906147e2565b60405180910390f35b610592600480360381019061058d919061412b565b611545565b005b3480156105a057600080fd5b506105bb60048036038101906105b691906140b1565b611675565b005b3480156105c957600080fd5b506105d2611707565b6040516105df91906147e2565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a91906140fe565b61170d565b005b34801561061d57600080fd5b50610638600480360381019061063391906140fe565b611793565b6040516106459190614507565b60405180910390f35b34801561065a57600080fd5b506106636117a9565b60405161067091906145c0565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b9190613e4b565b611837565b6040516106ad91906147e2565b60405180910390f35b3480156106c257600080fd5b506106cb611907565b005b3480156106d957600080fd5b506106f460048036038101906106ef91906140fe565b61198f565b005b34801561070257600080fd5b5061071d6004803603810190610718919061416b565b611a15565b005b34801561072b57600080fd5b5061074660048036038101906107419190613e4b565b611b92565b60405161075391906145a5565b60405180910390f35b34801561076857600080fd5b50610771611ce3565b60405161077e9190614507565b60405180910390f35b34801561079357600080fd5b506107ae60048036038101906107a991906140fe565b611d0d565b005b3480156107bc57600080fd5b506107c5611d93565b6040516107d291906147e2565b60405180910390f35b3480156107e757600080fd5b506107f0611d9d565b6040516107fd91906145c0565b60405180910390f35b34801561081257600080fd5b5061082d60048036038101906108289190613e4b565b611e2f565b60405161083c9392919061456e565b60405180910390f35b61085f600480360381019061085a91906140fe565b611e79565b005b34801561086d57600080fd5b5061088860048036038101906108839190613f8e565b612323565b005b34801561089657600080fd5b506108b160048036038101906108ac9190613f0b565b61249b565b005b3480156108bf57600080fd5b506108da60048036038101906108d591906140fe565b6124ee565b6040516108e791906145c0565b60405180910390f35b3480156108fc57600080fd5b5061090561258d565b60405161091291906147e2565b60405180910390f35b34801561092757600080fd5b50610942600480360381019061093d919061400e565b612593565b005b34801561095057600080fd5b50610959612695565b60405161096691906147e2565b60405180910390f35b34801561097b57600080fd5b5061099660048036038101906109919190613e78565b61269f565b6040516109a391906145a5565b60405180910390f35b3480156109b857600080fd5b506109c1612733565b6040516109ce91906145a5565b60405180910390f35b3480156109e357600080fd5b506109fe60048036038101906109f99190613e4b565b612746565b005b600b5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b495750610b488261283e565b5b9050919050565b600d60019054906101000a900460ff1681565b606060018054610b7290614aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9e90614aaa565b8015610beb5780601f10610bc057610100808354040283529160200191610beb565b820191906000526020600020905b815481529060010190602001808311610bce57829003601f168201915b5050505050905090565b6000610c00826128a8565b610c36576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7c82611793565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d03612910565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d355750610d3381610d2e612910565b61269f565b155b15610d6c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d77838383612918565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610dd9612910565b73ffffffffffffffffffffffffffffffffffffffff16610df7611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e44906146e2565b60405180910390fd5b80600b8190555050565b610e628383836129ca565b505050565b610e6f612910565b73ffffffffffffffffffffffffffffffffffffffff16610e8d611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda906146e2565b60405180910390fd5b80600c8190555050565b6000610ef883611837565b8210610f30576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b838110156110e8576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511561104757506110db565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461108757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110d957868414156110d05781955050505050506110ee565b83806001019450505b505b8080600101915050610f6a565b50600080fd5b92915050565b6110fc612910565b73ffffffffffffffffffffffffffffffffffffffff1661111a611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611167906146e2565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6111a4612910565b73ffffffffffffffffffffffffffffffffffffffff166111c2611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f906146e2565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b60008173ffffffffffffffffffffffffffffffffffffffff16600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149050919050565b6112e6612910565b73ffffffffffffffffffffffffffffffffffffffff16611304611ce3565b73ffffffffffffffffffffffffffffffffffffffff161461135a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611351906146e2565b60405180910390fd5b611362611ce3565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113a7573d6000803e3d6000fd5b50565b6113c58383836040518060200160405280600081525061249b565b505050565b6000600854905090565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b8281101561150d576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516114ff57858314156114f65781945050505050611540565b82806001019350505b50808060010191505061140c565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61154d612910565b73ffffffffffffffffffffffffffffffffffffffff1661156b611ce3565b73ffffffffffffffffffffffffffffffffffffffff16146115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b8906146e2565b60405180910390fd5b600d60009054906101000a900460ff16611610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160790614662565b60405180910390fd5b6009548261161c610d7c565b61162691906148cd565b1115611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165e906146c2565b60405180910390fd5b6116718183612ee7565b5050565b61167d612910565b73ffffffffffffffffffffffffffffffffffffffff1661169b611ce3565b73ffffffffffffffffffffffffffffffffffffffff16146116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e8906146e2565b60405180910390fd5b818160109190611702929190613af9565b505050565b600c5481565b611715612910565b73ffffffffffffffffffffffffffffffffffffffff16611733611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611789576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611780906146e2565b60405180910390fd5b80600a8190555050565b600061179e82612f05565b600001519050919050565b601080546117b690614aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546117e290614aaa565b801561182f5780601f106118045761010080835404028352916020019161182f565b820191906000526020600020905b81548152906001019060200180831161181257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561189f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61190f612910565b73ffffffffffffffffffffffffffffffffffffffff1661192d611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a906146e2565b60405180910390fd5b61198d60006131ad565b565b611997612910565b73ffffffffffffffffffffffffffffffffffffffff166119b5611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a02906146e2565b60405180910390fd5b8060088190555050565b611a1d612910565b73ffffffffffffffffffffffffffffffffffffffff16611a3b611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a88906146e2565b60405180910390fd5b60008211611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90614682565b60405180910390fd5b47821115611b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0e906146a2565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1683604051611b3d906144f2565b60006040518083038185875af1925050503d8060008114611b7a576040519150601f19603f3d011682016040523d82523d6000602084013e611b7f565b606091505b5050905080611b8d57600080fd5b505050565b6000611b9c612910565b73ffffffffffffffffffffffffffffffffffffffff16611bba611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c07906146e2565b60405180910390fd5b611c1982611244565b15611c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5090614742565b60405180910390fd5b81600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d15612910565b73ffffffffffffffffffffffffffffffffffffffff16611d33611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d80906146e2565b60405180910390fd5b80600a8190555050565b6000600a54905090565b606060028054611dac90614aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd890614aaa565b8015611e255780601f10611dfa57610100808354040283529160200191611e25565b820191906000526020600020905b815481529060010190602001808311611e0857829003601f168201915b5050505050905090565b600e6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b600d60009054906101000a900460ff16611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebf90614662565b60405180910390fd5b600854611ed433613273565b82611edf91906148cd565b1115611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1790614602565b60405180910390fd5b60095481611f2c610d7c565b611f3691906148cd565b1115611f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6e906145e2565b60405180910390fd5b600d60019054906101000a900460ff16156121a25780600b54611f9a9190614954565b341015611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd390614782565b60405180910390fd5b600c54811115612021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612018906147a2565b60405180910390fd5b61202a33611244565b612069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612060906147c2565b60405180910390fd5b600c546120c182600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461334390919063ffffffff16565b1115612102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f990614702565b60405180910390fd5b61215781600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461334390919063ffffffff16565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550612304565b6121ab33611244565b1561225a5760085481600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461220033611837565b61220a91906149ae565b61221491906148cd565b1115612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224c90614722565b60405180910390fd5b6122b3565b6008548161226733611837565b61227191906148cd565b11156122b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a990614722565b60405180910390fd5b5b3481600a546122c29190614954565b1115612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90614762565b60405180910390fd5b5b60095461230f610d7c565b10156123205761231f3382612ee7565b5b50565b61232b612910565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612390576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806006600061239d612910565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661244a612910565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161248f91906145a5565b60405180910390a35050565b6124a68484846129ca565b6124b2848484846133a1565b6124e8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606124f9826128a8565b61252f576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061253961352f565b905060008151141561255a5760405180602001604052806000815250612585565b80612564846135c1565b6040516020016125759291906144ce565b6040516020818303038152906040525b915050919050565b600a5481565b61259b612910565b73ffffffffffffffffffffffffffffffffffffffff166125b9611ce3565b73ffffffffffffffffffffffffffffffffffffffff161461260f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612606906146e2565b60405180910390fd5b80600f9080519060200190612625929190613b7f565b5060005b600f805490508110156126915761267d600f828154811061264d5761264c614c14565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611b92565b50808061268990614b0d565b915050612629565b5050565b6000600954905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b61274e612910565b73ffffffffffffffffffffffffffffffffffffffff1661276c611ce3565b73ffffffffffffffffffffffffffffffffffffffff16146127c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b9906146e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282990614622565b60405180910390fd5b61283b816131ad565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612909575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006129d582612f05565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166129fc612910565b73ffffffffffffffffffffffffffffffffffffffff161480612a2f5750612a2e8260000151612a29612910565b61269f565b5b80612a745750612a3d612910565b73ffffffffffffffffffffffffffffffffffffffff16612a5c84610bf5565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612aad576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612b16576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b7d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b8a8585856001613722565b612b9a6000848460000151612918565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e775760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612e765782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ee08585856001613728565b5050505050565b612f0182826040518060200160405280600081525061372e565b5050565b612f0d613c09565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015613176576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161317457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130585780925050506131a8565b5b60011561317357818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461316e5780925050506131a8565b613059565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132db576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600080828461335291906148cd565b905083811015613397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338e90614642565b60405180910390fd5b8091505092915050565b60006133c28473ffffffffffffffffffffffffffffffffffffffff16613740565b15613522578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133eb612910565b8786866040518563ffffffff1660e01b815260040161340d9493929190614522565b602060405180830381600087803b15801561342757600080fd5b505af192505050801561345857506040513d601f19601f820116820180604052508101906134559190614084565b60015b6134d2573d8060008114613488576040519150601f19603f3d011682016040523d82523d6000602084013e61348d565b606091505b506000815114156134ca576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613527565b600190505b949350505050565b60606010805461353e90614aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461356a90614aaa565b80156135b75780601f1061358c576101008083540402835291602001916135b7565b820191906000526020600020905b81548152906001019060200180831161359a57829003601f168201915b5050505050905090565b60606000821415613609576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061371d565b600082905060005b6000821461363b57808061362490614b0d565b915050600a826136349190614923565b9150613611565b60008167ffffffffffffffff81111561365757613656614c43565b5b6040519080825280601f01601f1916602001820160405280156136895781602001600182028036833780820191505090505b5090505b60008514613716576001826136a291906149ae565b9150600a856136b19190614b56565b60306136bd91906148cd565b60f81b8183815181106136d3576136d2614c14565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561370f9190614923565b945061368d565b8093505050505b919050565b50505050565b50505050565b61373b8383836001613763565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156137fe576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613839576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138466000868387613722565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015613aab57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015613a5f5750613a5d60008884886133a1565b155b15613a96576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506139e4565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050613af26000868387613728565b5050505050565b828054613b0590614aaa565b90600052602060002090601f016020900481019282613b275760008555613b6e565b82601f10613b4057803560ff1916838001178555613b6e565b82800160010185558215613b6e579182015b82811115613b6d578235825591602001919060010190613b52565b5b509050613b7b9190613c4c565b5090565b828054828255906000526020600020908101928215613bf8579160200282015b82811115613bf75782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613b9f565b5b509050613c059190613c4c565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613c65576000816000905550600101613c4d565b5090565b6000613c7c613c7784614822565b6147fd565b90508083825260208201905082856020860282011115613c9f57613c9e614c7c565b5b60005b85811015613ccf5781613cb58882613d1b565b845260208401935060208301925050600181019050613ca2565b5050509392505050565b6000613cec613ce78461484e565b6147fd565b905082815260208101848484011115613d0857613d07614c81565b5b613d13848285614a68565b509392505050565b600081359050613d2a81614f80565b92915050565b600081359050613d3f81614f97565b92915050565b600082601f830112613d5a57613d59614c77565b5b8135613d6a848260208601613c69565b91505092915050565b600081359050613d8281614fae565b92915050565b600081359050613d9781614fc5565b92915050565b600081519050613dac81614fc5565b92915050565b600082601f830112613dc757613dc6614c77565b5b8135613dd7848260208601613cd9565b91505092915050565b60008083601f840112613df657613df5614c77565b5b8235905067ffffffffffffffff811115613e1357613e12614c72565b5b602083019150836001820283011115613e2f57613e2e614c7c565b5b9250929050565b600081359050613e4581614fdc565b92915050565b600060208284031215613e6157613e60614c8b565b5b6000613e6f84828501613d1b565b91505092915050565b60008060408385031215613e8f57613e8e614c8b565b5b6000613e9d85828601613d1b565b9250506020613eae85828601613d1b565b9150509250929050565b600080600060608486031215613ed157613ed0614c8b565b5b6000613edf86828701613d1b565b9350506020613ef086828701613d1b565b9250506040613f0186828701613e36565b9150509250925092565b60008060008060808587031215613f2557613f24614c8b565b5b6000613f3387828801613d1b565b9450506020613f4487828801613d1b565b9350506040613f5587828801613e36565b925050606085013567ffffffffffffffff811115613f7657613f75614c86565b5b613f8287828801613db2565b91505092959194509250565b60008060408385031215613fa557613fa4614c8b565b5b6000613fb385828601613d1b565b9250506020613fc485828601613d73565b9150509250929050565b60008060408385031215613fe557613fe4614c8b565b5b6000613ff385828601613d1b565b925050602061400485828601613e36565b9150509250929050565b60006020828403121561402457614023614c8b565b5b600082013567ffffffffffffffff81111561404257614041614c86565b5b61404e84828501613d45565b91505092915050565b60006020828403121561406d5761406c614c8b565b5b600061407b84828501613d88565b91505092915050565b60006020828403121561409a57614099614c8b565b5b60006140a884828501613d9d565b91505092915050565b600080602083850312156140c8576140c7614c8b565b5b600083013567ffffffffffffffff8111156140e6576140e5614c86565b5b6140f285828601613de0565b92509250509250929050565b60006020828403121561411457614113614c8b565b5b600061412284828501613e36565b91505092915050565b6000806040838503121561414257614141614c8b565b5b600061415085828601613e36565b925050602061416185828601613d1b565b9150509250929050565b6000806040838503121561418257614181614c8b565b5b600061419085828601613e36565b92505060206141a185828601613d30565b9150509250929050565b6141b4816149e2565b82525050565b6141c381614a06565b82525050565b60006141d48261487f565b6141de8185614895565b93506141ee818560208601614a77565b6141f781614c90565b840191505092915050565b600061420d8261488a565b61421781856148b1565b9350614227818560208601614a77565b61423081614c90565b840191505092915050565b60006142468261488a565b61425081856148c2565b9350614260818560208601614a77565b80840191505092915050565b6000614279601e836148b1565b915061428482614ca1565b602082019050919050565b600061429c601e836148b1565b91506142a782614cca565b602082019050919050565b60006142bf6026836148b1565b91506142ca82614cf3565b604082019050919050565b60006142e2601b836148b1565b91506142ed82614d42565b602082019050919050565b6000614305601b836148b1565b915061431082614d6b565b602082019050919050565b6000614328601f836148b1565b915061433382614d94565b602082019050919050565b600061434b600f836148b1565b915061435682614dbd565b602082019050919050565b600061436e6016836148b1565b915061437982614de6565b602082019050919050565b60006143916020836148b1565b915061439c82614e0f565b602082019050919050565b60006143b46028836148b1565b91506143bf82614e38565b604082019050919050565b60006143d76019836148b1565b91506143e282614e87565b602082019050919050565b60006143fa6013836148b1565b915061440582614eb0565b602082019050919050565b600061441d6011836148b1565b915061442882614ed9565b602082019050919050565b60006144406013836148b1565b915061444b82614f02565b602082019050919050565b6000614463601e836148b1565b915061446e82614f2b565b602082019050919050565b60006144866000836148a6565b915061449182614f54565b600082019050919050565b60006144a96012836148b1565b91506144b482614f57565b602082019050919050565b6144c881614a5e565b82525050565b60006144da828561423b565b91506144e6828461423b565b91508190509392505050565b60006144fd82614479565b9150819050919050565b600060208201905061451c60008301846141ab565b92915050565b600060808201905061453760008301876141ab565b61454460208301866141ab565b61455160408301856144bf565b818103606083015261456381846141c9565b905095945050505050565b600060608201905061458360008301866141ab565b61459060208301856144bf565b61459d60408301846144bf565b949350505050565b60006020820190506145ba60008301846141ba565b92915050565b600060208201905081810360008301526145da8184614202565b905092915050565b600060208201905081810360008301526145fb8161426c565b9050919050565b6000602082019050818103600083015261461b8161428f565b9050919050565b6000602082019050818103600083015261463b816142b2565b9050919050565b6000602082019050818103600083015261465b816142d5565b9050919050565b6000602082019050818103600083015261467b816142f8565b9050919050565b6000602082019050818103600083015261469b8161431b565b9050919050565b600060208201905081810360008301526146bb8161433e565b9050919050565b600060208201905081810360008301526146db81614361565b9050919050565b600060208201905081810360008301526146fb81614384565b9050919050565b6000602082019050818103600083015261471b816143a7565b9050919050565b6000602082019050818103600083015261473b816143ca565b9050919050565b6000602082019050818103600083015261475b816143ed565b9050919050565b6000602082019050818103600083015261477b81614410565b9050919050565b6000602082019050818103600083015261479b81614433565b9050919050565b600060208201905081810360008301526147bb81614456565b9050919050565b600060208201905081810360008301526147db8161449c565b9050919050565b60006020820190506147f760008301846144bf565b92915050565b6000614807614818565b90506148138282614adc565b919050565b6000604051905090565b600067ffffffffffffffff82111561483d5761483c614c43565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561486957614868614c43565b5b61487282614c90565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006148d882614a5e565b91506148e383614a5e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561491857614917614b87565b5b828201905092915050565b600061492e82614a5e565b915061493983614a5e565b92508261494957614948614bb6565b5b828204905092915050565b600061495f82614a5e565b915061496a83614a5e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149a3576149a2614b87565b5b828202905092915050565b60006149b982614a5e565b91506149c483614a5e565b9250828210156149d7576149d6614b87565b5b828203905092915050565b60006149ed82614a3e565b9050919050565b60006149ff82614a3e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a95578082015181840152602081019050614a7a565b83811115614aa4576000848401525b50505050565b60006002820490506001821680614ac257607f821691505b60208210811415614ad657614ad5614be5565b5b50919050565b614ae582614c90565b810181811067ffffffffffffffff82111715614b0457614b03614c43565b5b80604052505050565b6000614b1882614a5e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b4b57614b4a614b87565b5b600182019050919050565b6000614b6182614a5e565b9150614b6c83614a5e565b925082614b7c57614b7b614bb6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f204d696e740000600082015250565b7f45786365656473204d617820416c6c6f776564204d696e7420436f756e740000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b7f5769746864726177206d7573742062652067726561746572207468616e203000600082015250565b7f416d6f756e7420746f6f20686967680000000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473204d6178204d696e7420447572696e672057686974656c697360008201527f7420506572696f64000000000000000000000000000000000000000000000000602082015250565b7f43616e74204d696e7420616e79204d6f726520546f6b656e7300000000000000600082015250565b7f416c72656164792077686974656c697374656400000000000000000000000000600082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b7f41626f7665206d6178204d696e742057686974656c69737420636f756e740000600082015250565b50565b7f4973206e6f742077686974656c69737465640000000000000000000000000000600082015250565b614f89816149e2565b8114614f9457600080fd5b50565b614fa0816149f4565b8114614fab57600080fd5b50565b614fb781614a06565b8114614fc257600080fd5b50565b614fce81614a12565b8114614fd957600080fd5b50565b614fe581614a5e565b8114614ff057600080fd5b5056fea2646970667358221220f767bb9b95830ac14f825f79f8dfdad0c6dd597bb718d0abc331b84e169d02ec64736f6c63430008070033697066733a2f2f516d63745657684b6e594b3546446b5141565a66394d79324641684e486d4a56367448367a79423165474b5948792f

Deployed Bytecode

0x6080604052600436106102665760003560e01c80636352211e116101445780639b19251a116100b6578063ca0dcf161161007a578063ca0dcf16146108f0578063cd7d508f1461091b578063d5abeb0114610944578063e985e9c51461096f578063eb8d2444146109ac578063f2fde38b146109d757610266565b80639b19251a14610806578063a0712d6814610845578063a22cb46514610861578063b88d4fde1461088a578063c87b56dd146108b357610266565b80637a5657d2116101085780637a5657d2146106f65780637b9417c81461071f5780638da5cb5b1461075c5780639150fd8414610787578063924b4729146107b057806395d89b41146107db57610266565b80636352211e146106115780636c0360eb1461064e57806370a0823114610679578063715018a6146106b657806379c9cb7b146106cd57610266565b806334918dfd116101dd57806344fead9e116101a157806344fead9e146105105780634f6ccce71461053b57806354ef2f701461057857806355f804b31461059457806358941a4d146105bd5780635d82cf6e146105e857610266565b806334918dfd146104725780633719e3b0146104895780633af32abf146104a05780633ccfd60b146104dd57806342842e0e146104e757610266565b8063095ea7b31161022f578063095ea7b31461036657806318160ddd1461038f5780631970d1fb146103ba57806323b872dd146103e3578063287a40e71461040c5780632f745c591461043557610266565b806204348e1461026b57806301ffc9a71461029657806304737a01146102d357806306fdde03146102fe578063081812fc14610329575b600080fd5b34801561027757600080fd5b50610280610a00565b60405161028d91906147e2565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b89190614057565b610a06565b6040516102ca91906145a5565b60405180910390f35b3480156102df57600080fd5b506102e8610b50565b6040516102f591906145a5565b60405180910390f35b34801561030a57600080fd5b50610313610b63565b60405161032091906145c0565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b91906140fe565b610bf5565b60405161035d9190614507565b60405180910390f35b34801561037257600080fd5b5061038d60048036038101906103889190613fce565b610c71565b005b34801561039b57600080fd5b506103a4610d7c565b6040516103b191906147e2565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc91906140fe565b610dd1565b005b3480156103ef57600080fd5b5061040a60048036038101906104059190613eb8565b610e57565b005b34801561041857600080fd5b50610433600480360381019061042e91906140fe565b610e67565b005b34801561044157600080fd5b5061045c60048036038101906104579190613fce565b610eed565b60405161046991906147e2565b60405180910390f35b34801561047e57600080fd5b506104876110f4565b005b34801561049557600080fd5b5061049e61119c565b005b3480156104ac57600080fd5b506104c760048036038101906104c29190613e4b565b611244565b6040516104d491906145a5565b60405180910390f35b6104e56112de565b005b3480156104f357600080fd5b5061050e60048036038101906105099190613eb8565b6113aa565b005b34801561051c57600080fd5b506105256113ca565b60405161053291906147e2565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d91906140fe565b6113d4565b60405161056f91906147e2565b60405180910390f35b610592600480360381019061058d919061412b565b611545565b005b3480156105a057600080fd5b506105bb60048036038101906105b691906140b1565b611675565b005b3480156105c957600080fd5b506105d2611707565b6040516105df91906147e2565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a91906140fe565b61170d565b005b34801561061d57600080fd5b50610638600480360381019061063391906140fe565b611793565b6040516106459190614507565b60405180910390f35b34801561065a57600080fd5b506106636117a9565b60405161067091906145c0565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b9190613e4b565b611837565b6040516106ad91906147e2565b60405180910390f35b3480156106c257600080fd5b506106cb611907565b005b3480156106d957600080fd5b506106f460048036038101906106ef91906140fe565b61198f565b005b34801561070257600080fd5b5061071d6004803603810190610718919061416b565b611a15565b005b34801561072b57600080fd5b5061074660048036038101906107419190613e4b565b611b92565b60405161075391906145a5565b60405180910390f35b34801561076857600080fd5b50610771611ce3565b60405161077e9190614507565b60405180910390f35b34801561079357600080fd5b506107ae60048036038101906107a991906140fe565b611d0d565b005b3480156107bc57600080fd5b506107c5611d93565b6040516107d291906147e2565b60405180910390f35b3480156107e757600080fd5b506107f0611d9d565b6040516107fd91906145c0565b60405180910390f35b34801561081257600080fd5b5061082d60048036038101906108289190613e4b565b611e2f565b60405161083c9392919061456e565b60405180910390f35b61085f600480360381019061085a91906140fe565b611e79565b005b34801561086d57600080fd5b5061088860048036038101906108839190613f8e565b612323565b005b34801561089657600080fd5b506108b160048036038101906108ac9190613f0b565b61249b565b005b3480156108bf57600080fd5b506108da60048036038101906108d591906140fe565b6124ee565b6040516108e791906145c0565b60405180910390f35b3480156108fc57600080fd5b5061090561258d565b60405161091291906147e2565b60405180910390f35b34801561092757600080fd5b50610942600480360381019061093d919061400e565b612593565b005b34801561095057600080fd5b50610959612695565b60405161096691906147e2565b60405180910390f35b34801561097b57600080fd5b5061099660048036038101906109919190613e78565b61269f565b6040516109a391906145a5565b60405180910390f35b3480156109b857600080fd5b506109c1612733565b6040516109ce91906145a5565b60405180910390f35b3480156109e357600080fd5b506109fe60048036038101906109f99190613e4b565b612746565b005b600b5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3957507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b495750610b488261283e565b5b9050919050565b600d60019054906101000a900460ff1681565b606060018054610b7290614aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9e90614aaa565b8015610beb5780601f10610bc057610100808354040283529160200191610beb565b820191906000526020600020905b815481529060010190602001808311610bce57829003601f168201915b5050505050905090565b6000610c00826128a8565b610c36576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7c82611793565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d03612910565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d355750610d3381610d2e612910565b61269f565b155b15610d6c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d77838383612918565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b610dd9612910565b73ffffffffffffffffffffffffffffffffffffffff16610df7611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e44906146e2565b60405180910390fd5b80600b8190555050565b610e628383836129ca565b505050565b610e6f612910565b73ffffffffffffffffffffffffffffffffffffffff16610e8d611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda906146e2565b60405180910390fd5b80600c8190555050565b6000610ef883611837565b8210610f30576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b838110156110e8576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511561104757506110db565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461108757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110d957868414156110d05781955050505050506110ee565b83806001019450505b505b8080600101915050610f6a565b50600080fd5b92915050565b6110fc612910565b73ffffffffffffffffffffffffffffffffffffffff1661111a611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611167906146e2565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6111a4612910565b73ffffffffffffffffffffffffffffffffffffffff166111c2611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f906146e2565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b60008173ffffffffffffffffffffffffffffffffffffffff16600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149050919050565b6112e6612910565b73ffffffffffffffffffffffffffffffffffffffff16611304611ce3565b73ffffffffffffffffffffffffffffffffffffffff161461135a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611351906146e2565b60405180910390fd5b611362611ce3565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113a7573d6000803e3d6000fd5b50565b6113c58383836040518060200160405280600081525061249b565b505050565b6000600854905090565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b8281101561150d576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516114ff57858314156114f65781945050505050611540565b82806001019350505b50808060010191505061140c565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61154d612910565b73ffffffffffffffffffffffffffffffffffffffff1661156b611ce3565b73ffffffffffffffffffffffffffffffffffffffff16146115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b8906146e2565b60405180910390fd5b600d60009054906101000a900460ff16611610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160790614662565b60405180910390fd5b6009548261161c610d7c565b61162691906148cd565b1115611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165e906146c2565b60405180910390fd5b6116718183612ee7565b5050565b61167d612910565b73ffffffffffffffffffffffffffffffffffffffff1661169b611ce3565b73ffffffffffffffffffffffffffffffffffffffff16146116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e8906146e2565b60405180910390fd5b818160109190611702929190613af9565b505050565b600c5481565b611715612910565b73ffffffffffffffffffffffffffffffffffffffff16611733611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611789576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611780906146e2565b60405180910390fd5b80600a8190555050565b600061179e82612f05565b600001519050919050565b601080546117b690614aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546117e290614aaa565b801561182f5780601f106118045761010080835404028352916020019161182f565b820191906000526020600020905b81548152906001019060200180831161181257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561189f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61190f612910565b73ffffffffffffffffffffffffffffffffffffffff1661192d611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a906146e2565b60405180910390fd5b61198d60006131ad565b565b611997612910565b73ffffffffffffffffffffffffffffffffffffffff166119b5611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a02906146e2565b60405180910390fd5b8060088190555050565b611a1d612910565b73ffffffffffffffffffffffffffffffffffffffff16611a3b611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a88906146e2565b60405180910390fd5b60008211611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90614682565b60405180910390fd5b47821115611b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0e906146a2565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1683604051611b3d906144f2565b60006040518083038185875af1925050503d8060008114611b7a576040519150601f19603f3d011682016040523d82523d6000602084013e611b7f565b606091505b5050905080611b8d57600080fd5b505050565b6000611b9c612910565b73ffffffffffffffffffffffffffffffffffffffff16611bba611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c07906146e2565b60405180910390fd5b611c1982611244565b15611c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5090614742565b60405180910390fd5b81600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d15612910565b73ffffffffffffffffffffffffffffffffffffffff16611d33611ce3565b73ffffffffffffffffffffffffffffffffffffffff1614611d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d80906146e2565b60405180910390fd5b80600a8190555050565b6000600a54905090565b606060028054611dac90614aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054611dd890614aaa565b8015611e255780601f10611dfa57610100808354040283529160200191611e25565b820191906000526020600020905b815481529060010190602001808311611e0857829003601f168201915b5050505050905090565b600e6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b600d60009054906101000a900460ff16611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebf90614662565b60405180910390fd5b600854611ed433613273565b82611edf91906148cd565b1115611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1790614602565b60405180910390fd5b60095481611f2c610d7c565b611f3691906148cd565b1115611f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6e906145e2565b60405180910390fd5b600d60019054906101000a900460ff16156121a25780600b54611f9a9190614954565b341015611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd390614782565b60405180910390fd5b600c54811115612021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612018906147a2565b60405180910390fd5b61202a33611244565b612069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612060906147c2565b60405180910390fd5b600c546120c182600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461334390919063ffffffff16565b1115612102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f990614702565b60405180910390fd5b61215781600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461334390919063ffffffff16565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550612304565b6121ab33611244565b1561225a5760085481600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461220033611837565b61220a91906149ae565b61221491906148cd565b1115612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224c90614722565b60405180910390fd5b6122b3565b6008548161226733611837565b61227191906148cd565b11156122b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a990614722565b60405180910390fd5b5b3481600a546122c29190614954565b1115612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90614762565b60405180910390fd5b5b60095461230f610d7c565b10156123205761231f3382612ee7565b5b50565b61232b612910565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612390576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806006600061239d612910565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661244a612910565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161248f91906145a5565b60405180910390a35050565b6124a68484846129ca565b6124b2848484846133a1565b6124e8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606124f9826128a8565b61252f576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061253961352f565b905060008151141561255a5760405180602001604052806000815250612585565b80612564846135c1565b6040516020016125759291906144ce565b6040516020818303038152906040525b915050919050565b600a5481565b61259b612910565b73ffffffffffffffffffffffffffffffffffffffff166125b9611ce3565b73ffffffffffffffffffffffffffffffffffffffff161461260f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612606906146e2565b60405180910390fd5b80600f9080519060200190612625929190613b7f565b5060005b600f805490508110156126915761267d600f828154811061264d5761264c614c14565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611b92565b50808061268990614b0d565b915050612629565b5050565b6000600954905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b61274e612910565b73ffffffffffffffffffffffffffffffffffffffff1661276c611ce3565b73ffffffffffffffffffffffffffffffffffffffff16146127c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b9906146e2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282990614622565b60405180910390fd5b61283b816131ad565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612909575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006129d582612f05565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166129fc612910565b73ffffffffffffffffffffffffffffffffffffffff161480612a2f5750612a2e8260000151612a29612910565b61269f565b5b80612a745750612a3d612910565b73ffffffffffffffffffffffffffffffffffffffff16612a5c84610bf5565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612aad576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612b16576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b7d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b8a8585856001613722565b612b9a6000848460000151612918565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e775760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612e765782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ee08585856001613728565b5050505050565b612f0182826040518060200160405280600081525061372e565b5050565b612f0d613c09565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015613176576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161317457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130585780925050506131a8565b5b60011561317357818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461316e5780925050506131a8565b613059565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132db576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600080828461335291906148cd565b905083811015613397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338e90614642565b60405180910390fd5b8091505092915050565b60006133c28473ffffffffffffffffffffffffffffffffffffffff16613740565b15613522578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133eb612910565b8786866040518563ffffffff1660e01b815260040161340d9493929190614522565b602060405180830381600087803b15801561342757600080fd5b505af192505050801561345857506040513d601f19601f820116820180604052508101906134559190614084565b60015b6134d2573d8060008114613488576040519150601f19603f3d011682016040523d82523d6000602084013e61348d565b606091505b506000815114156134ca576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613527565b600190505b949350505050565b60606010805461353e90614aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461356a90614aaa565b80156135b75780601f1061358c576101008083540402835291602001916135b7565b820191906000526020600020905b81548152906001019060200180831161359a57829003601f168201915b5050505050905090565b60606000821415613609576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061371d565b600082905060005b6000821461363b57808061362490614b0d565b915050600a826136349190614923565b9150613611565b60008167ffffffffffffffff81111561365757613656614c43565b5b6040519080825280601f01601f1916602001820160405280156136895781602001600182028036833780820191505090505b5090505b60008514613716576001826136a291906149ae565b9150600a856136b19190614b56565b60306136bd91906148cd565b60f81b8183815181106136d3576136d2614c14565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561370f9190614923565b945061368d565b8093505050505b919050565b50505050565b50505050565b61373b8383836001613763565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156137fe576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613839576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138466000868387613722565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015613aab57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015613a5f5750613a5d60008884886133a1565b155b15613a96576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506139e4565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050613af26000868387613728565b5050505050565b828054613b0590614aaa565b90600052602060002090601f016020900481019282613b275760008555613b6e565b82601f10613b4057803560ff1916838001178555613b6e565b82800160010185558215613b6e579182015b82811115613b6d578235825591602001919060010190613b52565b5b509050613b7b9190613c4c565b5090565b828054828255906000526020600020908101928215613bf8579160200282015b82811115613bf75782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613b9f565b5b509050613c059190613c4c565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613c65576000816000905550600101613c4d565b5090565b6000613c7c613c7784614822565b6147fd565b90508083825260208201905082856020860282011115613c9f57613c9e614c7c565b5b60005b85811015613ccf5781613cb58882613d1b565b845260208401935060208301925050600181019050613ca2565b5050509392505050565b6000613cec613ce78461484e565b6147fd565b905082815260208101848484011115613d0857613d07614c81565b5b613d13848285614a68565b509392505050565b600081359050613d2a81614f80565b92915050565b600081359050613d3f81614f97565b92915050565b600082601f830112613d5a57613d59614c77565b5b8135613d6a848260208601613c69565b91505092915050565b600081359050613d8281614fae565b92915050565b600081359050613d9781614fc5565b92915050565b600081519050613dac81614fc5565b92915050565b600082601f830112613dc757613dc6614c77565b5b8135613dd7848260208601613cd9565b91505092915050565b60008083601f840112613df657613df5614c77565b5b8235905067ffffffffffffffff811115613e1357613e12614c72565b5b602083019150836001820283011115613e2f57613e2e614c7c565b5b9250929050565b600081359050613e4581614fdc565b92915050565b600060208284031215613e6157613e60614c8b565b5b6000613e6f84828501613d1b565b91505092915050565b60008060408385031215613e8f57613e8e614c8b565b5b6000613e9d85828601613d1b565b9250506020613eae85828601613d1b565b9150509250929050565b600080600060608486031215613ed157613ed0614c8b565b5b6000613edf86828701613d1b565b9350506020613ef086828701613d1b565b9250506040613f0186828701613e36565b9150509250925092565b60008060008060808587031215613f2557613f24614c8b565b5b6000613f3387828801613d1b565b9450506020613f4487828801613d1b565b9350506040613f5587828801613e36565b925050606085013567ffffffffffffffff811115613f7657613f75614c86565b5b613f8287828801613db2565b91505092959194509250565b60008060408385031215613fa557613fa4614c8b565b5b6000613fb385828601613d1b565b9250506020613fc485828601613d73565b9150509250929050565b60008060408385031215613fe557613fe4614c8b565b5b6000613ff385828601613d1b565b925050602061400485828601613e36565b9150509250929050565b60006020828403121561402457614023614c8b565b5b600082013567ffffffffffffffff81111561404257614041614c86565b5b61404e84828501613d45565b91505092915050565b60006020828403121561406d5761406c614c8b565b5b600061407b84828501613d88565b91505092915050565b60006020828403121561409a57614099614c8b565b5b60006140a884828501613d9d565b91505092915050565b600080602083850312156140c8576140c7614c8b565b5b600083013567ffffffffffffffff8111156140e6576140e5614c86565b5b6140f285828601613de0565b92509250509250929050565b60006020828403121561411457614113614c8b565b5b600061412284828501613e36565b91505092915050565b6000806040838503121561414257614141614c8b565b5b600061415085828601613e36565b925050602061416185828601613d1b565b9150509250929050565b6000806040838503121561418257614181614c8b565b5b600061419085828601613e36565b92505060206141a185828601613d30565b9150509250929050565b6141b4816149e2565b82525050565b6141c381614a06565b82525050565b60006141d48261487f565b6141de8185614895565b93506141ee818560208601614a77565b6141f781614c90565b840191505092915050565b600061420d8261488a565b61421781856148b1565b9350614227818560208601614a77565b61423081614c90565b840191505092915050565b60006142468261488a565b61425081856148c2565b9350614260818560208601614a77565b80840191505092915050565b6000614279601e836148b1565b915061428482614ca1565b602082019050919050565b600061429c601e836148b1565b91506142a782614cca565b602082019050919050565b60006142bf6026836148b1565b91506142ca82614cf3565b604082019050919050565b60006142e2601b836148b1565b91506142ed82614d42565b602082019050919050565b6000614305601b836148b1565b915061431082614d6b565b602082019050919050565b6000614328601f836148b1565b915061433382614d94565b602082019050919050565b600061434b600f836148b1565b915061435682614dbd565b602082019050919050565b600061436e6016836148b1565b915061437982614de6565b602082019050919050565b60006143916020836148b1565b915061439c82614e0f565b602082019050919050565b60006143b46028836148b1565b91506143bf82614e38565b604082019050919050565b60006143d76019836148b1565b91506143e282614e87565b602082019050919050565b60006143fa6013836148b1565b915061440582614eb0565b602082019050919050565b600061441d6011836148b1565b915061442882614ed9565b602082019050919050565b60006144406013836148b1565b915061444b82614f02565b602082019050919050565b6000614463601e836148b1565b915061446e82614f2b565b602082019050919050565b60006144866000836148a6565b915061449182614f54565b600082019050919050565b60006144a96012836148b1565b91506144b482614f57565b602082019050919050565b6144c881614a5e565b82525050565b60006144da828561423b565b91506144e6828461423b565b91508190509392505050565b60006144fd82614479565b9150819050919050565b600060208201905061451c60008301846141ab565b92915050565b600060808201905061453760008301876141ab565b61454460208301866141ab565b61455160408301856144bf565b818103606083015261456381846141c9565b905095945050505050565b600060608201905061458360008301866141ab565b61459060208301856144bf565b61459d60408301846144bf565b949350505050565b60006020820190506145ba60008301846141ba565b92915050565b600060208201905081810360008301526145da8184614202565b905092915050565b600060208201905081810360008301526145fb8161426c565b9050919050565b6000602082019050818103600083015261461b8161428f565b9050919050565b6000602082019050818103600083015261463b816142b2565b9050919050565b6000602082019050818103600083015261465b816142d5565b9050919050565b6000602082019050818103600083015261467b816142f8565b9050919050565b6000602082019050818103600083015261469b8161431b565b9050919050565b600060208201905081810360008301526146bb8161433e565b9050919050565b600060208201905081810360008301526146db81614361565b9050919050565b600060208201905081810360008301526146fb81614384565b9050919050565b6000602082019050818103600083015261471b816143a7565b9050919050565b6000602082019050818103600083015261473b816143ca565b9050919050565b6000602082019050818103600083015261475b816143ed565b9050919050565b6000602082019050818103600083015261477b81614410565b9050919050565b6000602082019050818103600083015261479b81614433565b9050919050565b600060208201905081810360008301526147bb81614456565b9050919050565b600060208201905081810360008301526147db8161449c565b9050919050565b60006020820190506147f760008301846144bf565b92915050565b6000614807614818565b90506148138282614adc565b919050565b6000604051905090565b600067ffffffffffffffff82111561483d5761483c614c43565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561486957614868614c43565b5b61487282614c90565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006148d882614a5e565b91506148e383614a5e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561491857614917614b87565b5b828201905092915050565b600061492e82614a5e565b915061493983614a5e565b92508261494957614948614bb6565b5b828204905092915050565b600061495f82614a5e565b915061496a83614a5e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149a3576149a2614b87565b5b828202905092915050565b60006149b982614a5e565b91506149c483614a5e565b9250828210156149d7576149d6614b87565b5b828203905092915050565b60006149ed82614a3e565b9050919050565b60006149ff82614a3e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a95578082015181840152602081019050614a7a565b83811115614aa4576000848401525b50505050565b60006002820490506001821680614ac257607f821691505b60208210811415614ad657614ad5614be5565b5b50919050565b614ae582614c90565b810181811067ffffffffffffffff82111715614b0457614b03614c43565b5b80604052505050565b6000614b1882614a5e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b4b57614b4a614b87565b5b600182019050919050565b6000614b6182614a5e565b9150614b6c83614a5e565b925082614b7c57614b7b614bb6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f7420656e6f75676820746f6b656e73206c65667420746f204d696e740000600082015250565b7f45786365656473204d617820416c6c6f776564204d696e7420436f756e740000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b7f5769746864726177206d7573742062652067726561746572207468616e203000600082015250565b7f416d6f756e7420746f6f20686967680000000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473204d6178204d696e7420447572696e672057686974656c697360008201527f7420506572696f64000000000000000000000000000000000000000000000000602082015250565b7f43616e74204d696e7420616e79204d6f726520546f6b656e7300000000000000600082015250565b7f416c72656164792077686974656c697374656400000000000000000000000000600082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b7f41626f7665206d6178204d696e742057686974656c69737420636f756e740000600082015250565b50565b7f4973206e6f742077686974656c69737465640000000000000000000000000000600082015250565b614f89816149e2565b8114614f9457600080fd5b50565b614fa0816149f4565b8114614fab57600080fd5b50565b614fb781614a06565b8114614fc257600080fd5b50565b614fce81614a12565b8114614fd957600080fd5b50565b614fe581614a5e565b8114614ff057600080fd5b5056fea2646970667358221220f767bb9b95830ac14f825f79f8dfdad0c6dd597bb718d0abc331b84e169d02ec64736f6c63430008070033

Deployed Bytecode Sourcemap

53455:5916:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53643:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36784:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53959:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39394:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40897:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40460:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34021:280;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54549:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41754:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56997:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35607:1105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57936:89;;;;;;;;;;;;;:::i;:::-;;58113:110;;;;;;;;;;;;;:::i;:::-;;59202:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57528:114;;;:::i;:::-;;41995:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57329:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34594:713;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54945:267;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57116:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53695:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54731:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39203:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54341:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37220:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12273:103;;;;;;;;;;;;;:::i;:::-;;56900:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58473:331;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58812:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11622:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57758:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57431:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39563:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54252:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;55316:1576;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41173:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42251:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39738:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53600:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58231:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57230:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41523:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53920:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12531:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53643:45;;;;:::o;36784:372::-;36886:4;36938:25;36923:40;;;:11;:40;;;;:105;;;;36995:33;36980:48;;;:11;:48;;;;36923:105;:172;;;;37060:35;37045:50;;;:11;:50;;;;36923:172;:225;;;;37112:36;37136:11;37112:23;:36::i;:::-;36923:225;36903:245;;36784:372;;;:::o;53959:38::-;;;;;;;;;;;;;:::o;39394:100::-;39448:13;39481:5;39474:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39394:100;:::o;40897:204::-;40965:7;40990:16;40998:7;40990;:16::i;:::-;40985:64;;41015:34;;;;;;;;;;;;;;40985:64;41069:15;:24;41085:7;41069:24;;;;;;;;;;;;;;;;;;;;;41062:31;;40897:204;;;:::o;40460:371::-;40533:13;40549:24;40565:7;40549:15;:24::i;:::-;40533:40;;40594:5;40588:11;;:2;:11;;;40584:48;;;40608:24;;;;;;;;;;;;;;40584:48;40665:5;40649:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;40675:37;40692:5;40699:12;:10;:12::i;:::-;40675:16;:37::i;:::-;40674:38;40649:63;40645:138;;;40736:35;;;;;;;;;;;;;;40645:138;40795:28;40804:2;40808:7;40817:5;40795:8;:28::i;:::-;40522:309;40460:371;;:::o;34021:280::-;34074:7;34266:12;;;;;;;;;;;34250:13;;;;;;;;;;:28;34243:35;;;;34021:280;:::o;54549:108::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54643:6:::1;54624:16;:25;;;;54549:108:::0;:::o;41754:170::-;41888:28;41898:4;41904:2;41908:7;41888:9;:28::i;:::-;41754:170;;;:::o;56997:111::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57094:6:::1;57073:18;:27;;;;56997:111:::0;:::o;35607:1105::-;35696:7;35729:16;35739:5;35729:9;:16::i;:::-;35720:5;:25;35716:61;;35754:23;;;;;;;;;;;;;;35716:61;35788:22;35813:13;;;;;;;;;;;35788:38;;;;35837:19;35867:25;36068:9;36063:557;36083:14;36079:1;:18;36063:557;;;36123:31;36157:11;:14;36169:1;36157:14;;;;;;;;;;;36123:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36194:9;:16;;;36190:73;;;36235:8;;;36190:73;36311:1;36285:28;;:9;:14;;;:28;;;36281:111;;36358:9;:14;;;36338:34;;36281:111;36435:5;36414:26;;:17;:26;;;36410:195;;;36484:5;36469:11;:20;36465:85;;;36525:1;36518:8;;;;;;;;;36465:85;36572:13;;;;;;;36410:195;36104:516;36063:557;36099:3;;;;;;;36063:557;;;;36696:8;;;35607:1105;;;;;:::o;57936:89::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58005:12:::1;;;;;;;;;;;58004:13;57989:12;;:28;;;;;;;;;;;;;;;;;;57936:89::o:0;58113:110::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58196:19:::1;;;;;;;;;;;58195:20;58173:19;;:42;;;;;;;;;;;;;;;;;;58113:110::o:0;59202:164::-;59287:18;59354:4;59330:28;;:9;:15;59340:4;59330:15;;;;;;;;;;;;;;;:20;;;;;;;;;;;;:28;;;59323:35;;59202:164;;;:::o;57528:114::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57594:7:::1;:5;:7::i;:::-;57586:25;;:48;57612:21;57586:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57528:114::o:0;41995:185::-;42133:39;42150:4;42156:2;42160:7;42133:39;;;;;;;;;;;;:16;:39::i;:::-;41995:185;;;:::o;57329:94::-;57379:7;57406:9;;57399:16;;57329:94;:::o;34594:713::-;34661:7;34681:22;34706:13;;;;;;;;;;34681:38;;;;34730:19;34925:9;34920:328;34940:14;34936:1;:18;34920:328;;;34980:31;35014:11;:14;35026:1;35014:14;;;;;;;;;;;34980:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35052:9;:16;;;35047:186;;35112:5;35097:11;:20;35093:85;;;35153:1;35146:8;;;;;;;;35093:85;35200:13;;;;;;;35047:186;34961:287;34956:3;;;;;;;34920:328;;;;35276:23;;;;;;;;;;;;;;34594:713;;;;:::o;54945:267::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55039:12:::1;;;;;;;;;;;55031:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;55130:12;;55118:8;55102:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;55094:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;55180:24;55190:3;55195:8;55180:9;:24::i;:::-;54945:267:::0;;:::o;57116:106::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57204:10:::1;;57194:7;:20;;;;;;;:::i;:::-;;57116:106:::0;;:::o;53695:38::-;;;;:::o;54731:99::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54816:6:::1;54805:8;:17;;;;54731:99:::0;:::o;39203:124::-;39267:7;39294:20;39306:7;39294:11;:20::i;:::-;:25;;;39287:32;;39203:124;;;:::o;54341:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37220:206::-;37284:7;37325:1;37308:19;;:5;:19;;;37304:60;;;37336:28;;;;;;;;;;;;;;37304:60;37390:12;:19;37403:5;37390:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;37382:36;;37375:43;;37220:206;;;:::o;12273:103::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12338:30:::1;12365:1;12338:18;:30::i;:::-;12273:103::o:0;56900:89::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56977:4:::1;56965:9;:16;;;;56900:89:::0;:::o;58473:331::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58603:1:::1;58593:7;:11;58585:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;58670:21;58659:7;:32;;58651:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;58723:12;58741:3;:8;;58757:7;58741:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58722:47;;;58788:7;58780:16;;;::::0;::::1;;58574:230;58473:331:::0;;:::o;58812:251::-;58910:12;11853;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58949:19:::1;58963:4;58949:13;:19::i;:::-;58948:20;58940:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;59026:4;59003:9;:15;59013:4;59003:15;;;;;;;;;;;;;;;:20;;;:27;;;;;;;;;;;;;;;;;;59051:4;59041:14;;58812:251:::0;;;:::o;11622:87::-;11668:7;11695:6;;;;;;;;;;;11688:13;;11622:87;:::o;57758:98::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57839:9:::1;57828:8;:20;;;;57758:98:::0;:::o;57431:89::-;57481:7;57504:8;;57497:15;;57431:89;:::o;39563:104::-;39619:13;39652:7;39645:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39563:104;:::o;54252:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55316:1576::-;55384:12;;;;;;;;;;;55376:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;55567:9;;55538:25;55552:10;55538:13;:25::i;:::-;55527:8;:36;;;;:::i;:::-;:49;;55519:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;55658:12;;55646:8;55630:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;55622:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;55721:19;;;;;;;;;;;55718:1066;;;55797:8;55778:16;;:27;;;;:::i;:::-;55764:9;:42;;55756:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;55864:18;;55852:8;:30;;55844:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55939:25;55953:10;55939:13;:25::i;:::-;55931:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56097:18;;56027:45;56063:8;56027:9;:21;56037:10;56027:21;;;;;;;;;;;;;;;:31;;;:35;;:45;;;;:::i;:::-;:88;;56001:190;;;;;;;;;;;;:::i;:::-;;;;;;;;;56240:81;56312:8;56240:9;:21;56250:10;56240:21;;;;;;;;;;;;;;;:49;;;:71;;:81;;;;:::i;:::-;56206:9;:21;56216:10;56206:21;;;;;;;;;;;;;;;:31;;:115;;;;55718:1066;;;56354:25;56368:10;56354:13;:25::i;:::-;56350:295;;;56476:9;;56463:8;56429:9;:21;56439:10;56429:21;;;;;;;;;;;;;;;:31;;;56405:21;56415:10;56405:9;:21::i;:::-;:55;;;;:::i;:::-;:66;;;;:::i;:::-;56404:81;;56396:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;56350:295;;;56594:9;;56581:8;56557:21;56567:10;56557:9;:21::i;:::-;:32;;;;:::i;:::-;56556:47;;56548:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;56350:295;56710:9;56697:8;56686;;:19;;;;:::i;:::-;56685:34;;56659:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;55718:1066;56818:12;;56802:13;:11;:13::i;:::-;:28;56798:87;;;56842:31;56852:10;56864:8;56842:9;:31::i;:::-;56798:87;55316:1576;:::o;41173:279::-;41276:12;:10;:12::i;:::-;41264:24;;:8;:24;;;41260:54;;;41297:17;;;;;;;;;;;;;;41260:54;41372:8;41327:18;:32;41346:12;:10;:12::i;:::-;41327:32;;;;;;;;;;;;;;;:42;41360:8;41327:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41425:8;41396:48;;41411:12;:10;:12::i;:::-;41396:48;;;41435:8;41396:48;;;;;;:::i;:::-;;;;;;;;41173:279;;:::o;42251:342::-;42418:28;42428:4;42434:2;42438:7;42418:9;:28::i;:::-;42462:48;42485:4;42491:2;42495:7;42504:5;42462:22;:48::i;:::-;42457:129;;42534:40;;;;;;;;;;;;;;42457:129;42251:342;;;;:::o;39738:318::-;39811:13;39842:16;39850:7;39842;:16::i;:::-;39837:59;;39867:29;;;;;;;;;;;;;;39837:59;39909:21;39933:10;:8;:10::i;:::-;39909:34;;39986:1;39967:7;39961:21;:26;;:87;;;;;;;;;;;;;;;;;40014:7;40023:18;:7;:16;:18::i;:::-;39997:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39961:87;39954:94;;;39738:318;;;:::o;53600:36::-;;;;:::o;58231:234::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58325:5:::1;58309:13;:21;;;;;;;;;;;;:::i;:::-;;58346:9;58341:117;58365:13;:20;;;;58361:1;:24;58341:117;;;58407:39;58429:13;58443:1;58429:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58407:21;:39::i;:::-;;58387:3;;;;;:::i;:::-;;;;58341:117;;;;58231:234:::0;:::o;57230:91::-;57274:7;57301:12;;57294:19;;57230:91;:::o;41523:164::-;41620:4;41644:18;:25;41663:5;41644:25;;;;;;;;;;;;;;;:35;41670:8;41644:35;;;;;;;;;;;;;;;;;;;;;;;;;41637:42;;41523:164;;;;:::o;53920:32::-;;;;;;;;;;;;;:::o;12531:201::-;11853:12;:10;:12::i;:::-;11842:23;;:7;:5;:7::i;:::-;:23;;;11834:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12640:1:::1;12620:22;;:8;:22;;;;12612:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12696:28;12715:8;12696:18;:28::i;:::-;12531:201:::0;:::o;24143:157::-;24228:4;24267:25;24252:40;;;:11;:40;;;;24245:47;;24143:157;;;:::o;42848:144::-;42905:4;42939:13;;;;;;;;;;;42929:23;;:7;:23;:55;;;;;42957:11;:20;42969:7;42957:20;;;;;;;;;;;:27;;;;;;;;;;;;42956:28;42929:55;42922:62;;42848:144;;;:::o;10404:98::-;10457:7;10484:10;10477:17;;10404:98;:::o;50132:196::-;50274:2;50247:15;:24;50263:7;50247:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;50312:7;50308:2;50292:28;;50301:5;50292:28;;;;;;;;;;;;50132:196;;;:::o;45633:2112::-;45748:35;45786:20;45798:7;45786:11;:20::i;:::-;45748:58;;45819:22;45861:13;:18;;;45845:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;45896:50;45913:13;:18;;;45933:12;:10;:12::i;:::-;45896:16;:50::i;:::-;45845:101;:154;;;;45987:12;:10;:12::i;:::-;45963:36;;:20;45975:7;45963:11;:20::i;:::-;:36;;;45845:154;45819:181;;46018:17;46013:66;;46044:35;;;;;;;;;;;;;;46013:66;46116:4;46094:26;;:13;:18;;;:26;;;46090:67;;46129:28;;;;;;;;;;;;;;46090:67;46186:1;46172:16;;:2;:16;;;46168:52;;;46197:23;;;;;;;;;;;;;;46168:52;46233:43;46255:4;46261:2;46265:7;46274:1;46233:21;:43::i;:::-;46341:49;46358:1;46362:7;46371:13;:18;;;46341:8;:49::i;:::-;46716:1;46686:12;:18;46699:4;46686:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46760:1;46732:12;:16;46745:2;46732:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46806:2;46778:11;:20;46790:7;46778:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;46868:15;46823:11;:20;46835:7;46823:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;47136:19;47168:1;47158:7;:11;47136:33;;47229:1;47188:43;;:11;:24;47200:11;47188:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;47184:445;;;47413:13;;;;;;;;;;47399:27;;:11;:27;47395:219;;;47483:13;:18;;;47451:11;:24;47463:11;47451:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;47566:13;:28;;;47524:11;:24;47536:11;47524:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;47395:219;47184:445;46661:979;47676:7;47672:2;47657:27;;47666:4;47657:27;;;;;;;;;;;;47695:42;47716:4;47722:2;47726:7;47735:1;47695:20;:42::i;:::-;45737:2008;;45633:2112;;;:::o;43000:104::-;43069:27;43079:2;43083:8;43069:27;;;;;;;;;;;;:9;:27::i;:::-;43000:104;;:::o;38058:1083::-;38119:21;;:::i;:::-;38153:12;38168:7;38153:22;;38224:13;;;;;;;;;;38217:20;;:4;:20;38213:861;;;38258:31;38292:11;:17;38304:4;38292:17;;;;;;;;;;;38258:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38333:9;:16;;;38328:731;;38404:1;38378:28;;:9;:14;;;:28;;;38374:101;;38442:9;38435:16;;;;;;38374:101;38779:261;38786:4;38779:261;;;38819:6;;;;;;;;38864:11;:17;38876:4;38864:17;;;;;;;;;;;38852:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38938:1;38912:28;;:9;:14;;;:28;;;38908:109;;38980:9;38973:16;;;;;;38908:109;38779:261;;;38328:731;38239:835;38213:861;39102:31;;;;;;;;;;;;;;38058:1083;;;;:::o;12892:191::-;12966:16;12985:6;;;;;;;;;;;12966:25;;13011:8;13002:6;;:17;;;;;;;;;;;;;;;;;;13066:8;13035:40;;13056:8;13035:40;;;;;;;;;;;;12955:128;12892:191;:::o;37434:207::-;37495:7;37536:1;37519:19;;:5;:19;;;37515:59;;;37547:27;;;;;;;;;;;;;;37515:59;37600:12;:19;37613:5;37600:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;37592:41;;37585:48;;37434:207;;;:::o;2946:179::-;3004:7;3024:9;3040:1;3036;:5;;;;:::i;:::-;3024:17;;3065:1;3060;:6;;3052:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;3116:1;3109:8;;;2946:179;;;;:::o;50893:790::-;51048:4;51069:15;:2;:13;;;:15::i;:::-;51065:611;;;51121:2;51105:36;;;51142:12;:10;:12::i;:::-;51156:4;51162:7;51171:5;51105:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51101:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51368:1;51351:6;:13;:18;51347:259;;;51401:40;;;;;;;;;;;;;;51347:259;51556:6;51550:13;51541:6;51537:2;51533:15;51526:38;51101:520;51238:45;;;51228:55;;;:6;:55;;;;51221:62;;;;;51065:611;51660:4;51653:11;;50893:790;;;;;;;:::o;57650:100::-;57702:13;57735:7;57728:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57650:100;:::o;8023:723::-;8079:13;8309:1;8300:5;:10;8296:53;;;8327:10;;;;;;;;;;;;;;;;;;;;;8296:53;8359:12;8374:5;8359:20;;8390:14;8415:78;8430:1;8422:4;:9;8415:78;;8448:8;;;;;:::i;:::-;;;;8479:2;8471:10;;;;;:::i;:::-;;;8415:78;;;8503:19;8535:6;8525:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8503:39;;8553:154;8569:1;8560:5;:10;8553:154;;8597:1;8587:11;;;;;:::i;:::-;;;8664:2;8656:5;:10;;;;:::i;:::-;8643:2;:24;;;;:::i;:::-;8630:39;;8613:6;8620;8613:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8693:2;8684:11;;;;;:::i;:::-;;;8553:154;;;8731:6;8717:21;;;;;8023:723;;;;:::o;52331:159::-;;;;;:::o;53149:158::-;;;;;:::o;43467:163::-;43590:32;43596:2;43600:8;43610:5;43617:4;43590:5;:32::i;:::-;43467:163;;;:::o;14266:326::-;14326:4;14583:1;14561:7;:19;;;:23;14554:30;;14266:326;;;:::o;43889:1490::-;44028:20;44051:13;;;;;;;;;;;44028:36;;;;44093:1;44079:16;;:2;:16;;;44075:48;;;44104:19;;;;;;;;;;;;;;44075:48;44150:1;44138:8;:13;44134:44;;;44160:18;;;;;;;;;;;;;;44134:44;44191:61;44221:1;44225:2;44229:12;44243:8;44191:21;:61::i;:::-;44565:8;44530:12;:16;44543:2;44530:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44629:8;44589:12;:16;44602:2;44589:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44688:2;44655:11;:25;44667:12;44655:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;44755:15;44705:11;:25;44717:12;44705:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;44788:20;44811:12;44788:35;;44913:9;44908:328;44928:8;44924:1;:12;44908:328;;;44992:12;44988:2;44967:38;;44984:1;44967:38;;;;;;;;;;;;45028:4;:68;;;;;45037:59;45068:1;45072:2;45076:12;45090:5;45037:22;:59::i;:::-;45036:60;45028:68;45024:164;;;45128:40;;;;;;;;;;;;;;45024:164;45206:14;;;;;;;44938:3;;;;;;;44908:328;;;;45276:12;45252:13;;:37;;;;;;;;;;;;;;;;;;44505:796;45311:60;45340:1;45344:2;45348:12;45362:8;45311:20;:60::i;:::-;44017:1362;43889:1490;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1313:155::-;1367:5;1405:6;1392:20;1383:29;;1421:41;1456:5;1421:41;:::i;:::-;1313:155;;;;:::o;1491:370::-;1562:5;1611:3;1604:4;1596:6;1592:17;1588:27;1578:122;;1619:79;;:::i;:::-;1578:122;1736:6;1723:20;1761:94;1851:3;1843:6;1836:4;1828:6;1824:17;1761:94;:::i;:::-;1752:103;;1568:293;1491:370;;;;:::o;1867:133::-;1910:5;1948:6;1935:20;1926:29;;1964:30;1988:5;1964:30;:::i;:::-;1867:133;;;;:::o;2006:137::-;2051:5;2089:6;2076:20;2067:29;;2105:32;2131:5;2105:32;:::i;:::-;2006:137;;;;:::o;2149:141::-;2205:5;2236:6;2230:13;2221:22;;2252:32;2278:5;2252:32;:::i;:::-;2149:141;;;;:::o;2309:338::-;2364:5;2413:3;2406:4;2398:6;2394:17;2390:27;2380:122;;2421:79;;:::i;:::-;2380:122;2538:6;2525:20;2563:78;2637:3;2629:6;2622:4;2614:6;2610:17;2563:78;:::i;:::-;2554:87;;2370:277;2309:338;;;;:::o;2667:553::-;2725:8;2735:6;2785:3;2778:4;2770:6;2766:17;2762:27;2752:122;;2793:79;;:::i;:::-;2752:122;2906:6;2893:20;2883:30;;2936:18;2928:6;2925:30;2922:117;;;2958:79;;:::i;:::-;2922:117;3072:4;3064:6;3060:17;3048:29;;3126:3;3118:4;3110:6;3106:17;3096:8;3092:32;3089:41;3086:128;;;3133:79;;:::i;:::-;3086:128;2667:553;;;;;:::o;3226:139::-;3272:5;3310:6;3297:20;3288:29;;3326:33;3353:5;3326:33;:::i;:::-;3226:139;;;;:::o;3371:329::-;3430:6;3479:2;3467:9;3458:7;3454:23;3450:32;3447:119;;;3485:79;;:::i;:::-;3447:119;3605:1;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3576:117;3371:329;;;;:::o;3706:474::-;3774:6;3782;3831:2;3819:9;3810:7;3806:23;3802:32;3799:119;;;3837:79;;:::i;:::-;3799:119;3957:1;3982:53;4027:7;4018:6;4007:9;4003:22;3982:53;:::i;:::-;3972:63;;3928:117;4084:2;4110:53;4155:7;4146:6;4135:9;4131:22;4110:53;:::i;:::-;4100:63;;4055:118;3706:474;;;;;:::o;4186:619::-;4263:6;4271;4279;4328:2;4316:9;4307:7;4303:23;4299:32;4296:119;;;4334:79;;:::i;:::-;4296:119;4454:1;4479:53;4524:7;4515:6;4504:9;4500:22;4479:53;:::i;:::-;4469:63;;4425:117;4581:2;4607:53;4652:7;4643:6;4632:9;4628:22;4607:53;:::i;:::-;4597:63;;4552:118;4709:2;4735:53;4780:7;4771:6;4760:9;4756:22;4735:53;:::i;:::-;4725:63;;4680:118;4186:619;;;;;:::o;4811:943::-;4906:6;4914;4922;4930;4979:3;4967:9;4958:7;4954:23;4950:33;4947:120;;;4986:79;;:::i;:::-;4947:120;5106:1;5131:53;5176:7;5167:6;5156:9;5152:22;5131:53;:::i;:::-;5121:63;;5077:117;5233:2;5259:53;5304:7;5295:6;5284:9;5280:22;5259:53;:::i;:::-;5249:63;;5204:118;5361:2;5387:53;5432:7;5423:6;5412:9;5408:22;5387:53;:::i;:::-;5377:63;;5332:118;5517:2;5506:9;5502:18;5489:32;5548:18;5540:6;5537:30;5534:117;;;5570:79;;:::i;:::-;5534:117;5675:62;5729:7;5720:6;5709:9;5705:22;5675:62;:::i;:::-;5665:72;;5460:287;4811:943;;;;;;;:::o;5760:468::-;5825:6;5833;5882:2;5870:9;5861:7;5857:23;5853:32;5850:119;;;5888:79;;:::i;:::-;5850:119;6008:1;6033:53;6078:7;6069:6;6058:9;6054:22;6033:53;:::i;:::-;6023:63;;5979:117;6135:2;6161:50;6203:7;6194:6;6183:9;6179:22;6161:50;:::i;:::-;6151:60;;6106:115;5760:468;;;;;:::o;6234:474::-;6302:6;6310;6359:2;6347:9;6338:7;6334:23;6330:32;6327:119;;;6365:79;;:::i;:::-;6327:119;6485:1;6510:53;6555:7;6546:6;6535:9;6531:22;6510:53;:::i;:::-;6500:63;;6456:117;6612:2;6638:53;6683:7;6674:6;6663:9;6659:22;6638:53;:::i;:::-;6628:63;;6583:118;6234:474;;;;;:::o;6714:539::-;6798:6;6847:2;6835:9;6826:7;6822:23;6818:32;6815:119;;;6853:79;;:::i;:::-;6815:119;7001:1;6990:9;6986:17;6973:31;7031:18;7023:6;7020:30;7017:117;;;7053:79;;:::i;:::-;7017:117;7158:78;7228:7;7219:6;7208:9;7204:22;7158:78;:::i;:::-;7148:88;;6944:302;6714:539;;;;:::o;7259:327::-;7317:6;7366:2;7354:9;7345:7;7341:23;7337:32;7334:119;;;7372:79;;:::i;:::-;7334:119;7492:1;7517:52;7561:7;7552:6;7541:9;7537:22;7517:52;:::i;:::-;7507:62;;7463:116;7259:327;;;;:::o;7592:349::-;7661:6;7710:2;7698:9;7689:7;7685:23;7681:32;7678:119;;;7716:79;;:::i;:::-;7678:119;7836:1;7861:63;7916:7;7907:6;7896:9;7892:22;7861:63;:::i;:::-;7851:73;;7807:127;7592:349;;;;:::o;7947:529::-;8018:6;8026;8075:2;8063:9;8054:7;8050:23;8046:32;8043:119;;;8081:79;;:::i;:::-;8043:119;8229:1;8218:9;8214:17;8201:31;8259:18;8251:6;8248:30;8245:117;;;8281:79;;:::i;:::-;8245:117;8394:65;8451:7;8442:6;8431:9;8427:22;8394:65;:::i;:::-;8376:83;;;;8172:297;7947:529;;;;;:::o;8482:329::-;8541:6;8590:2;8578:9;8569:7;8565:23;8561:32;8558:119;;;8596:79;;:::i;:::-;8558:119;8716:1;8741:53;8786:7;8777:6;8766:9;8762:22;8741:53;:::i;:::-;8731:63;;8687:117;8482:329;;;;:::o;8817:474::-;8885:6;8893;8942:2;8930:9;8921:7;8917:23;8913:32;8910:119;;;8948:79;;:::i;:::-;8910:119;9068:1;9093:53;9138:7;9129:6;9118:9;9114:22;9093:53;:::i;:::-;9083:63;;9039:117;9195:2;9221:53;9266:7;9257:6;9246:9;9242:22;9221:53;:::i;:::-;9211:63;;9166:118;8817:474;;;;;:::o;9297:490::-;9373:6;9381;9430:2;9418:9;9409:7;9405:23;9401:32;9398:119;;;9436:79;;:::i;:::-;9398:119;9556:1;9581:53;9626:7;9617:6;9606:9;9602:22;9581:53;:::i;:::-;9571:63;;9527:117;9683:2;9709:61;9762:7;9753:6;9742:9;9738:22;9709:61;:::i;:::-;9699:71;;9654:126;9297:490;;;;;:::o;9793:118::-;9880:24;9898:5;9880:24;:::i;:::-;9875:3;9868:37;9793:118;;:::o;9917:109::-;9998:21;10013:5;9998:21;:::i;:::-;9993:3;9986:34;9917:109;;:::o;10032:360::-;10118:3;10146:38;10178:5;10146:38;:::i;:::-;10200:70;10263:6;10258:3;10200:70;:::i;:::-;10193:77;;10279:52;10324:6;10319:3;10312:4;10305:5;10301:16;10279:52;:::i;:::-;10356:29;10378:6;10356:29;:::i;:::-;10351:3;10347:39;10340:46;;10122:270;10032:360;;;;:::o;10398:364::-;10486:3;10514:39;10547:5;10514:39;:::i;:::-;10569:71;10633:6;10628:3;10569:71;:::i;:::-;10562:78;;10649:52;10694:6;10689:3;10682:4;10675:5;10671:16;10649:52;:::i;:::-;10726:29;10748:6;10726:29;:::i;:::-;10721:3;10717:39;10710:46;;10490:272;10398:364;;;;:::o;10768:377::-;10874:3;10902:39;10935:5;10902:39;:::i;:::-;10957:89;11039:6;11034:3;10957:89;:::i;:::-;10950:96;;11055:52;11100:6;11095:3;11088:4;11081:5;11077:16;11055:52;:::i;:::-;11132:6;11127:3;11123:16;11116:23;;10878:267;10768:377;;;;:::o;11151:366::-;11293:3;11314:67;11378:2;11373:3;11314:67;:::i;:::-;11307:74;;11390:93;11479:3;11390:93;:::i;:::-;11508:2;11503:3;11499:12;11492:19;;11151:366;;;:::o;11523:::-;11665:3;11686:67;11750:2;11745:3;11686:67;:::i;:::-;11679:74;;11762:93;11851:3;11762:93;:::i;:::-;11880:2;11875:3;11871:12;11864:19;;11523:366;;;:::o;11895:::-;12037:3;12058:67;12122:2;12117:3;12058:67;:::i;:::-;12051:74;;12134:93;12223:3;12134:93;:::i;:::-;12252:2;12247:3;12243:12;12236:19;;11895:366;;;:::o;12267:::-;12409:3;12430:67;12494:2;12489:3;12430:67;:::i;:::-;12423:74;;12506:93;12595:3;12506:93;:::i;:::-;12624:2;12619:3;12615:12;12608:19;;12267:366;;;:::o;12639:::-;12781:3;12802:67;12866:2;12861:3;12802:67;:::i;:::-;12795:74;;12878:93;12967:3;12878:93;:::i;:::-;12996:2;12991:3;12987:12;12980:19;;12639:366;;;:::o;13011:::-;13153:3;13174:67;13238:2;13233:3;13174:67;:::i;:::-;13167:74;;13250:93;13339:3;13250:93;:::i;:::-;13368:2;13363:3;13359:12;13352:19;;13011:366;;;:::o;13383:::-;13525:3;13546:67;13610:2;13605:3;13546:67;:::i;:::-;13539:74;;13622:93;13711:3;13622:93;:::i;:::-;13740:2;13735:3;13731:12;13724:19;;13383:366;;;:::o;13755:::-;13897:3;13918:67;13982:2;13977:3;13918:67;:::i;:::-;13911:74;;13994:93;14083:3;13994:93;:::i;:::-;14112:2;14107:3;14103:12;14096:19;;13755:366;;;:::o;14127:::-;14269:3;14290:67;14354:2;14349:3;14290:67;:::i;:::-;14283:74;;14366:93;14455:3;14366:93;:::i;:::-;14484:2;14479:3;14475:12;14468:19;;14127:366;;;:::o;14499:::-;14641:3;14662:67;14726:2;14721:3;14662:67;:::i;:::-;14655:74;;14738:93;14827:3;14738:93;:::i;:::-;14856:2;14851:3;14847:12;14840:19;;14499:366;;;:::o;14871:::-;15013:3;15034:67;15098:2;15093:3;15034:67;:::i;:::-;15027:74;;15110:93;15199:3;15110:93;:::i;:::-;15228:2;15223:3;15219:12;15212:19;;14871:366;;;:::o;15243:::-;15385:3;15406:67;15470:2;15465:3;15406:67;:::i;:::-;15399:74;;15482:93;15571:3;15482:93;:::i;:::-;15600:2;15595:3;15591:12;15584:19;;15243:366;;;:::o;15615:::-;15757:3;15778:67;15842:2;15837:3;15778:67;:::i;:::-;15771:74;;15854:93;15943:3;15854:93;:::i;:::-;15972:2;15967:3;15963:12;15956:19;;15615:366;;;:::o;15987:::-;16129:3;16150:67;16214:2;16209:3;16150:67;:::i;:::-;16143:74;;16226:93;16315:3;16226:93;:::i;:::-;16344:2;16339:3;16335:12;16328:19;;15987:366;;;:::o;16359:::-;16501:3;16522:67;16586:2;16581:3;16522:67;:::i;:::-;16515:74;;16598:93;16687:3;16598:93;:::i;:::-;16716:2;16711:3;16707:12;16700:19;;16359:366;;;:::o;16731:398::-;16890:3;16911:83;16992:1;16987:3;16911:83;:::i;:::-;16904:90;;17003:93;17092:3;17003:93;:::i;:::-;17121:1;17116:3;17112:11;17105:18;;16731:398;;;:::o;17135:366::-;17277:3;17298:67;17362:2;17357:3;17298:67;:::i;:::-;17291:74;;17374:93;17463:3;17374:93;:::i;:::-;17492:2;17487:3;17483:12;17476:19;;17135:366;;;:::o;17507:118::-;17594:24;17612:5;17594:24;:::i;:::-;17589:3;17582:37;17507:118;;:::o;17631:435::-;17811:3;17833:95;17924:3;17915:6;17833:95;:::i;:::-;17826:102;;17945:95;18036:3;18027:6;17945:95;:::i;:::-;17938:102;;18057:3;18050:10;;17631:435;;;;;:::o;18072:379::-;18256:3;18278:147;18421:3;18278:147;:::i;:::-;18271:154;;18442:3;18435:10;;18072:379;;;:::o;18457:222::-;18550:4;18588:2;18577:9;18573:18;18565:26;;18601:71;18669:1;18658:9;18654:17;18645:6;18601:71;:::i;:::-;18457:222;;;;:::o;18685:640::-;18880:4;18918:3;18907:9;18903:19;18895:27;;18932:71;19000:1;18989:9;18985:17;18976:6;18932:71;:::i;:::-;19013:72;19081:2;19070:9;19066:18;19057:6;19013:72;:::i;:::-;19095;19163:2;19152:9;19148:18;19139:6;19095:72;:::i;:::-;19214:9;19208:4;19204:20;19199:2;19188:9;19184:18;19177:48;19242:76;19313:4;19304:6;19242:76;:::i;:::-;19234:84;;18685:640;;;;;;;:::o;19331:442::-;19480:4;19518:2;19507:9;19503:18;19495:26;;19531:71;19599:1;19588:9;19584:17;19575:6;19531:71;:::i;:::-;19612:72;19680:2;19669:9;19665:18;19656:6;19612:72;:::i;:::-;19694;19762:2;19751:9;19747:18;19738:6;19694:72;:::i;:::-;19331:442;;;;;;:::o;19779:210::-;19866:4;19904:2;19893:9;19889:18;19881:26;;19917:65;19979:1;19968:9;19964:17;19955:6;19917:65;:::i;:::-;19779:210;;;;:::o;19995:313::-;20108:4;20146:2;20135:9;20131:18;20123:26;;20195:9;20189:4;20185:20;20181:1;20170:9;20166:17;20159:47;20223:78;20296:4;20287:6;20223:78;:::i;:::-;20215:86;;19995:313;;;;:::o;20314:419::-;20480:4;20518:2;20507:9;20503:18;20495:26;;20567:9;20561:4;20557:20;20553:1;20542:9;20538:17;20531:47;20595:131;20721:4;20595:131;:::i;:::-;20587:139;;20314:419;;;:::o;20739:::-;20905:4;20943:2;20932:9;20928:18;20920:26;;20992:9;20986:4;20982:20;20978:1;20967:9;20963:17;20956:47;21020:131;21146:4;21020:131;:::i;:::-;21012:139;;20739:419;;;:::o;21164:::-;21330:4;21368:2;21357:9;21353:18;21345:26;;21417:9;21411:4;21407:20;21403:1;21392:9;21388:17;21381:47;21445:131;21571:4;21445:131;:::i;:::-;21437:139;;21164:419;;;:::o;21589:::-;21755:4;21793:2;21782:9;21778:18;21770:26;;21842:9;21836:4;21832:20;21828:1;21817:9;21813:17;21806:47;21870:131;21996:4;21870:131;:::i;:::-;21862:139;;21589:419;;;:::o;22014:::-;22180:4;22218:2;22207:9;22203:18;22195:26;;22267:9;22261:4;22257:20;22253:1;22242:9;22238:17;22231:47;22295:131;22421:4;22295:131;:::i;:::-;22287:139;;22014:419;;;:::o;22439:::-;22605:4;22643:2;22632:9;22628:18;22620:26;;22692:9;22686:4;22682:20;22678:1;22667:9;22663:17;22656:47;22720:131;22846:4;22720:131;:::i;:::-;22712:139;;22439:419;;;:::o;22864:::-;23030:4;23068:2;23057:9;23053:18;23045:26;;23117:9;23111:4;23107:20;23103:1;23092:9;23088:17;23081:47;23145:131;23271:4;23145:131;:::i;:::-;23137:139;;22864:419;;;:::o;23289:::-;23455:4;23493:2;23482:9;23478:18;23470:26;;23542:9;23536:4;23532:20;23528:1;23517:9;23513:17;23506:47;23570:131;23696:4;23570:131;:::i;:::-;23562:139;;23289:419;;;:::o;23714:::-;23880:4;23918:2;23907:9;23903:18;23895:26;;23967:9;23961:4;23957:20;23953:1;23942:9;23938:17;23931:47;23995:131;24121:4;23995:131;:::i;:::-;23987:139;;23714:419;;;:::o;24139:::-;24305:4;24343:2;24332:9;24328:18;24320:26;;24392:9;24386:4;24382:20;24378:1;24367:9;24363:17;24356:47;24420:131;24546:4;24420:131;:::i;:::-;24412:139;;24139:419;;;:::o;24564:::-;24730:4;24768:2;24757:9;24753:18;24745:26;;24817:9;24811:4;24807:20;24803:1;24792:9;24788:17;24781:47;24845:131;24971:4;24845:131;:::i;:::-;24837:139;;24564:419;;;:::o;24989:::-;25155:4;25193:2;25182:9;25178:18;25170:26;;25242:9;25236:4;25232:20;25228:1;25217:9;25213:17;25206:47;25270:131;25396:4;25270:131;:::i;:::-;25262:139;;24989:419;;;:::o;25414:::-;25580:4;25618:2;25607:9;25603:18;25595:26;;25667:9;25661:4;25657:20;25653:1;25642:9;25638:17;25631:47;25695:131;25821:4;25695:131;:::i;:::-;25687:139;;25414:419;;;:::o;25839:::-;26005:4;26043:2;26032:9;26028:18;26020:26;;26092:9;26086:4;26082:20;26078:1;26067:9;26063:17;26056:47;26120:131;26246:4;26120:131;:::i;:::-;26112:139;;25839:419;;;:::o;26264:::-;26430:4;26468:2;26457:9;26453:18;26445:26;;26517:9;26511:4;26507:20;26503:1;26492:9;26488:17;26481:47;26545:131;26671:4;26545:131;:::i;:::-;26537:139;;26264:419;;;:::o;26689:::-;26855:4;26893:2;26882:9;26878:18;26870:26;;26942:9;26936:4;26932:20;26928:1;26917:9;26913:17;26906:47;26970:131;27096:4;26970:131;:::i;:::-;26962:139;;26689:419;;;:::o;27114:222::-;27207:4;27245:2;27234:9;27230:18;27222:26;;27258:71;27326:1;27315:9;27311:17;27302:6;27258:71;:::i;:::-;27114:222;;;;:::o;27342:129::-;27376:6;27403:20;;:::i;:::-;27393:30;;27432:33;27460:4;27452:6;27432:33;:::i;:::-;27342:129;;;:::o;27477:75::-;27510:6;27543:2;27537:9;27527:19;;27477:75;:::o;27558:311::-;27635:4;27725:18;27717:6;27714:30;27711:56;;;27747:18;;:::i;:::-;27711:56;27797:4;27789:6;27785:17;27777:25;;27857:4;27851;27847:15;27839:23;;27558:311;;;:::o;27875:307::-;27936:4;28026:18;28018:6;28015:30;28012:56;;;28048:18;;:::i;:::-;28012:56;28086:29;28108:6;28086:29;:::i;:::-;28078:37;;28170:4;28164;28160:15;28152:23;;27875:307;;;:::o;28188:98::-;28239:6;28273:5;28267:12;28257:22;;28188:98;;;:::o;28292:99::-;28344:6;28378:5;28372:12;28362:22;;28292:99;;;:::o;28397:168::-;28480:11;28514:6;28509:3;28502:19;28554:4;28549:3;28545:14;28530:29;;28397:168;;;;:::o;28571:147::-;28672:11;28709:3;28694:18;;28571:147;;;;:::o;28724:169::-;28808:11;28842:6;28837:3;28830:19;28882:4;28877:3;28873:14;28858:29;;28724:169;;;;:::o;28899:148::-;29001:11;29038:3;29023:18;;28899:148;;;;:::o;29053:305::-;29093:3;29112:20;29130:1;29112:20;:::i;:::-;29107:25;;29146:20;29164:1;29146:20;:::i;:::-;29141:25;;29300:1;29232:66;29228:74;29225:1;29222:81;29219:107;;;29306:18;;:::i;:::-;29219:107;29350:1;29347;29343:9;29336:16;;29053:305;;;;:::o;29364:185::-;29404:1;29421:20;29439:1;29421:20;:::i;:::-;29416:25;;29455:20;29473:1;29455:20;:::i;:::-;29450:25;;29494:1;29484:35;;29499:18;;:::i;:::-;29484:35;29541:1;29538;29534:9;29529:14;;29364:185;;;;:::o;29555:348::-;29595:7;29618:20;29636:1;29618:20;:::i;:::-;29613:25;;29652:20;29670:1;29652:20;:::i;:::-;29647:25;;29840:1;29772:66;29768:74;29765:1;29762:81;29757:1;29750:9;29743:17;29739:105;29736:131;;;29847:18;;:::i;:::-;29736:131;29895:1;29892;29888:9;29877:20;;29555:348;;;;:::o;29909:191::-;29949:4;29969:20;29987:1;29969:20;:::i;:::-;29964:25;;30003:20;30021:1;30003:20;:::i;:::-;29998:25;;30042:1;30039;30036:8;30033:34;;;30047:18;;:::i;:::-;30033:34;30092:1;30089;30085:9;30077:17;;29909:191;;;;:::o;30106:96::-;30143:7;30172:24;30190:5;30172:24;:::i;:::-;30161:35;;30106:96;;;:::o;30208:104::-;30253:7;30282:24;30300:5;30282:24;:::i;:::-;30271:35;;30208:104;;;:::o;30318:90::-;30352:7;30395:5;30388:13;30381:21;30370:32;;30318:90;;;:::o;30414:149::-;30450:7;30490:66;30483:5;30479:78;30468:89;;30414:149;;;:::o;30569:126::-;30606:7;30646:42;30639:5;30635:54;30624:65;;30569:126;;;:::o;30701:77::-;30738:7;30767:5;30756:16;;30701:77;;;:::o;30784:154::-;30868:6;30863:3;30858;30845:30;30930:1;30921:6;30916:3;30912:16;30905:27;30784:154;;;:::o;30944:307::-;31012:1;31022:113;31036:6;31033:1;31030:13;31022:113;;;31121:1;31116:3;31112:11;31106:18;31102:1;31097:3;31093:11;31086:39;31058:2;31055:1;31051:10;31046:15;;31022:113;;;31153:6;31150:1;31147:13;31144:101;;;31233:1;31224:6;31219:3;31215:16;31208:27;31144:101;30993:258;30944:307;;;:::o;31257:320::-;31301:6;31338:1;31332:4;31328:12;31318:22;;31385:1;31379:4;31375:12;31406:18;31396:81;;31462:4;31454:6;31450:17;31440:27;;31396:81;31524:2;31516:6;31513:14;31493:18;31490:38;31487:84;;;31543:18;;:::i;:::-;31487:84;31308:269;31257:320;;;:::o;31583:281::-;31666:27;31688:4;31666:27;:::i;:::-;31658:6;31654:40;31796:6;31784:10;31781:22;31760:18;31748:10;31745:34;31742:62;31739:88;;;31807:18;;:::i;:::-;31739:88;31847:10;31843:2;31836:22;31626:238;31583:281;;:::o;31870:233::-;31909:3;31932:24;31950:5;31932:24;:::i;:::-;31923:33;;31978:66;31971:5;31968:77;31965:103;;;32048:18;;:::i;:::-;31965:103;32095:1;32088:5;32084:13;32077:20;;31870:233;;;:::o;32109:176::-;32141:1;32158:20;32176:1;32158:20;:::i;:::-;32153:25;;32192:20;32210:1;32192:20;:::i;:::-;32187:25;;32231:1;32221:35;;32236:18;;:::i;:::-;32221:35;32277:1;32274;32270:9;32265:14;;32109:176;;;;:::o;32291:180::-;32339:77;32336:1;32329:88;32436:4;32433:1;32426:15;32460:4;32457:1;32450:15;32477:180;32525:77;32522:1;32515:88;32622:4;32619:1;32612:15;32646:4;32643:1;32636:15;32663:180;32711:77;32708:1;32701:88;32808:4;32805:1;32798:15;32832:4;32829:1;32822:15;32849:180;32897:77;32894:1;32887:88;32994:4;32991:1;32984:15;33018:4;33015:1;33008:15;33035:180;33083:77;33080:1;33073:88;33180:4;33177:1;33170:15;33204:4;33201:1;33194:15;33221:117;33330:1;33327;33320:12;33344:117;33453:1;33450;33443:12;33467:117;33576:1;33573;33566:12;33590:117;33699:1;33696;33689:12;33713:117;33822:1;33819;33812:12;33836:117;33945:1;33942;33935:12;33959:102;34000:6;34051:2;34047:7;34042:2;34035:5;34031:14;34027:28;34017:38;;33959:102;;;:::o;34067:180::-;34207:32;34203:1;34195:6;34191:14;34184:56;34067:180;:::o;34253:::-;34393:32;34389:1;34381:6;34377:14;34370:56;34253:180;:::o;34439:225::-;34579:34;34575:1;34567:6;34563:14;34556:58;34648:8;34643:2;34635:6;34631:15;34624:33;34439:225;:::o;34670:177::-;34810:29;34806:1;34798:6;34794:14;34787:53;34670:177;:::o;34853:::-;34993:29;34989:1;34981:6;34977:14;34970:53;34853:177;:::o;35036:181::-;35176:33;35172:1;35164:6;35160:14;35153:57;35036:181;:::o;35223:165::-;35363:17;35359:1;35351:6;35347:14;35340:41;35223:165;:::o;35394:172::-;35534:24;35530:1;35522:6;35518:14;35511:48;35394:172;:::o;35572:182::-;35712:34;35708:1;35700:6;35696:14;35689:58;35572:182;:::o;35760:227::-;35900:34;35896:1;35888:6;35884:14;35877:58;35969:10;35964:2;35956:6;35952:15;35945:35;35760:227;:::o;35993:175::-;36133:27;36129:1;36121:6;36117:14;36110:51;35993:175;:::o;36174:169::-;36314:21;36310:1;36302:6;36298:14;36291:45;36174:169;:::o;36349:167::-;36489:19;36485:1;36477:6;36473:14;36466:43;36349:167;:::o;36522:169::-;36662:21;36658:1;36650:6;36646:14;36639:45;36522:169;:::o;36697:180::-;36837:32;36833:1;36825:6;36821:14;36814:56;36697:180;:::o;36883:114::-;;:::o;37003:168::-;37143:20;37139:1;37131:6;37127:14;37120:44;37003:168;:::o;37177:122::-;37250:24;37268:5;37250:24;:::i;:::-;37243:5;37240:35;37230:63;;37289:1;37286;37279:12;37230:63;37177:122;:::o;37305:138::-;37386:32;37412:5;37386:32;:::i;:::-;37379:5;37376:43;37366:71;;37433:1;37430;37423:12;37366:71;37305:138;:::o;37449:116::-;37519:21;37534:5;37519:21;:::i;:::-;37512:5;37509:32;37499:60;;37555:1;37552;37545:12;37499:60;37449:116;:::o;37571:120::-;37643:23;37660:5;37643:23;:::i;:::-;37636:5;37633:34;37623:62;;37681:1;37678;37671:12;37623:62;37571:120;:::o;37697:122::-;37770:24;37788:5;37770:24;:::i;:::-;37763:5;37760:35;37750:63;;37809:1;37806;37799:12;37750:63;37697:122;:::o

Swarm Source

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