ETH Price: $3,403.06 (+4.66%)

Token

SUPERNERDS (NERD)
 

Overview

Max Total Supply

401 NERD

Holders

166

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
13 NERD
0x54aa838242788fa865ceeb913f77a61a1bc7e4e6
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Supernerds are a unique collection of 4004 programmatically generated NFTs living on the block(chain).

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NERD

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

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

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

/**
 *Submitted for verification at Etherscan.io on 2021-08-27
*/

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

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

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

// File @openzeppelin/contracts/utils/math/SaftMath.sol
pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


pragma solidity ^0.8.0;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// File @openzeppelin/contracts/access/[email protected]


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/DZI.sol


pragma solidity ^0.8.0;



contract NERD is ERC721, ERC721Enumerable, Ownable {

    using Strings for uint256;

    string public PROVENANCE;
    uint256 public constant tokenPrice = 44400000000000000; // 0.0444 ETH
    uint public maxTokenPurchase = 20;
    uint public maxTokenPerWallet = 44;
    uint256 public MAX_TOKENS = 4004;
    bool public saleIsActive = false;
    bool public revealed = false;
    string public notRevealedUri;
    string public baseExtension = ".json";
    string private _baseURIextended;
    // WhiteLists for presale.
    mapping (address => bool) private _isWhiteListed;
    mapping (address => uint) private _numberOfWallets;
    
    event AddWhiteListWallet(address _wallet );
    event RemoveWhiteListWallet(address _wallet );
    event SetMaxTokensPurchase(uint _maxTokens);
    event SetMaxTokensWallet(uint _maxTokens);
    
    constructor(

    ) ERC721("SUPERNERDS", "NERD") {

    }

    function reveal() public onlyOwner {
        revealed = true;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

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

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

    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

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

    function setProvenance(string memory provenance) public onlyOwner {
        PROVENANCE = provenance;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
        _exists(tokenId),
        "ERC721Metadata: URI query for nonexistent token"
        );
        
        if(revealed == false) {
            return notRevealedUri;
        }

        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, ( tokenId + 1 ).toString(), baseExtension))
            : "";
    }

    function reserveTokens() public onlyOwner {
        uint supply = totalSupply();
        require(supply < 100, "More than 44 tokens have already been reserved or minted.");
        uint i;
        for (i = 0; i < 44; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }


    function preSaleToken(uint numberOfTokens) public payable {
        require(!saleIsActive, "Could not pre-mint after sales active");
        require(numberOfTokens <= maxTokenPurchase, "Exceeded max token purchase");
        require(_numberOfWallets[msg.sender] + numberOfTokens <= maxTokenPerWallet, "Exceeded max token purchase per wallet");
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply of tokens");
        require(tokenPrice * numberOfTokens <= msg.value, "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_TOKENS) {
                _safeMint(msg.sender, mintIndex);
            }
        }
        
        _numberOfWallets[msg.sender] = _numberOfWallets[msg.sender] + numberOfTokens;
    }
    
    function mintToken(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint Tokens");
        require(numberOfTokens <= maxTokenPurchase, "Exceeded max token purchase");
        require(_numberOfWallets[msg.sender] + numberOfTokens <= maxTokenPerWallet, "Exceeded max token purchase per wallet");
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply of tokens");
        require(tokenPrice * numberOfTokens <= msg.value, "Ether value sent is not correct");

        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_TOKENS) {
                _safeMint(msg.sender, mintIndex);
            }
        }
        _numberOfWallets[msg.sender] = _numberOfWallets[msg.sender] + numberOfTokens;
    }

    // Update Max Tokens
    function setMaxTokensPurchase(uint _maxTokens) external onlyOwner {
        maxTokenPurchase = _maxTokens;
        emit SetMaxTokensPurchase(_maxTokens);
    }

    function setMaxTokensWallet(uint _maxTokens) external onlyOwner {
        maxTokenPerWallet = _maxTokens;
        emit SetMaxTokensWallet(_maxTokens);
    }
    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_wallet","type":"address"}],"name":"AddWhiteListWallet","type":"event"},{"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":false,"internalType":"address","name":"_wallet","type":"address"}],"name":"RemoveWhiteListWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"name":"SetMaxTokensPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"name":"SetMaxTokensWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":[],"name":"maxTokenPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"preSaleToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"name":"setMaxTokensPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"name":"setMaxTokensWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","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":[],"name":"tokenPrice","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526014600c55602c600d55610fa4600e556000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060119080519060200190620000979291906200023a565b50348015620000a557600080fd5b506040518060400160405280600a81526020017f53555045524e45524453000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e4552440000000000000000000000000000000000000000000000000000000081525081600090805190602001906200012a9291906200023a565b508060019080519060200190620001439291906200023a565b505050620001666200015a6200016c60201b60201c565b6200017460201b60201c565b6200034f565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024890620002ea565b90600052602060002090601f0160209004810192826200026c5760008555620002b8565b82601f106200028757805160ff1916838001178555620002b8565b82800160010185558215620002b8579182015b82811115620002b75782518255916020019190600101906200029a565b5b509050620002c79190620002cb565b5090565b5b80821115620002e6576000816000905550600101620002cc565b5090565b600060028204905060018216806200030357607f821691505b602082108114156200031a576200031962000320565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614b5e806200035f6000396000f3fe6080604052600436106102305760003560e01c806367b138e11161012e578063b88d4fde116100ab578063eb8d24441161006f578063eb8d2444146107e9578063f2c4ce1e14610814578063f2fde38b1461083d578063f47c84c514610866578063ffe630b51461089157610230565b8063b88d4fde146106ff578063c634d03214610728578063c668286214610744578063c87b56dd1461076f578063e985e9c5146107ac57610230565b80637ff9b596116100f25780637ff9b5961461063e5780638da5cb5b1461066957806395d89b4114610694578063a22cb465146106bf578063a475b5dd146106e857610230565b806367b138e11461057a5780636955327d146105a357806370a08231146105bf578063715018a6146105fc5780637a8baf521461061357610230565b80632f745c59116101bc5780635183022711610180578063518302271461049557806355f804b3146104c05780635c5d81cc146104e95780636352211e146105125780636373a6b11461054f57610230565b80632f745c59146103c457806334918dfd146104015780633ccfd60b1461041857806342842e0e1461042f5780634f6ccce71461045857610230565b8063095ea7b311610203578063095ea7b31461030557806309aa3dcf1461032e57806318160ddd1461035957806323b872dd1461038457806327ac36c4146103ad57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063081c8c44146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613772565b6108ba565b6040516102699190614327565b60405180910390f35b34801561027e57600080fd5b506102876108cc565b6040516102949190614342565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613805565b61095e565b6040516102d191906142c0565b60405180910390f35b3480156102e657600080fd5b506102ef6109e3565b6040516102fc9190614342565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190613736565b610a71565b005b34801561033a57600080fd5b50610343610b89565b6040516103509190614684565b60405180910390f35b34801561036557600080fd5b5061036e610b8f565b60405161037b9190614684565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a69190613630565b610b9c565b005b3480156103b957600080fd5b506103c2610bfc565b005b3480156103d057600080fd5b506103eb60048036038101906103e69190613736565b610cff565b6040516103f89190614684565b60405180910390f35b34801561040d57600080fd5b50610416610da4565b005b34801561042457600080fd5b5061042d610e4c565b005b34801561043b57600080fd5b5061045660048036038101906104519190613630565b610f17565b005b34801561046457600080fd5b5061047f600480360381019061047a9190613805565b610f37565b60405161048c9190614684565b60405180910390f35b3480156104a157600080fd5b506104aa610fce565b6040516104b79190614327565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e291906137c4565b610fe1565b005b3480156104f557600080fd5b50610510600480360381019061050b9190613805565b611077565b005b34801561051e57600080fd5b5061053960048036038101906105349190613805565b611134565b60405161054691906142c0565b60405180910390f35b34801561055b57600080fd5b506105646111e6565b6040516105719190614342565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190613805565b611274565b005b6105bd60048036038101906105b89190613805565b611331565b005b3480156105cb57600080fd5b506105e660048036038101906105e191906135cb565b6115da565b6040516105f39190614684565b60405180910390f35b34801561060857600080fd5b50610611611692565b005b34801561061f57600080fd5b5061062861171a565b6040516106359190614684565b60405180910390f35b34801561064a57600080fd5b50610653611720565b6040516106609190614684565b60405180910390f35b34801561067557600080fd5b5061067e61172b565b60405161068b91906142c0565b60405180910390f35b3480156106a057600080fd5b506106a9611755565b6040516106b69190614342565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e191906136fa565b6117e7565b005b3480156106f457600080fd5b506106fd611968565b005b34801561070b57600080fd5b506107266004803603810190610721919061367f565b611a01565b005b610742600480360381019061073d9190613805565b611a63565b005b34801561075057600080fd5b50610759611d0b565b6040516107669190614342565b60405180910390f35b34801561077b57600080fd5b5061079660048036038101906107919190613805565b611d99565b6040516107a39190614342565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce91906135f4565b611efe565b6040516107e09190614327565b60405180910390f35b3480156107f557600080fd5b506107fe611f92565b60405161080b9190614327565b60405180910390f35b34801561082057600080fd5b5061083b600480360381019061083691906137c4565b611fa5565b005b34801561084957600080fd5b50610864600480360381019061085f91906135cb565b61203b565b005b34801561087257600080fd5b5061087b612133565b6040516108889190614684565b60405180910390f35b34801561089d57600080fd5b506108b860048036038101906108b391906137c4565b612139565b005b60006108c5826121cf565b9050919050565b6060600080546108db90614953565b80601f016020809104026020016040519081016040528092919081815260200182805461090790614953565b80156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b5050505050905090565b600061096982612249565b6109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f90614584565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601080546109f090614953565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1c90614953565b8015610a695780601f10610a3e57610100808354040283529160200191610a69565b820191906000526020600020905b815481529060010190602001808311610a4c57829003601f168201915b505050505081565b6000610a7c82611134565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae490614604565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0c6122b5565b73ffffffffffffffffffffffffffffffffffffffff161480610b3b5750610b3a81610b356122b5565b611efe565b5b610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b71906144c4565b60405180910390fd5b610b8483836122bd565b505050565b600c5481565b6000600880549050905090565b610bad610ba76122b5565b82612376565b610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390614644565b60405180910390fd5b610bf7838383612454565b505050565b610c046122b5565b73ffffffffffffffffffffffffffffffffffffffff16610c2261172b565b73ffffffffffffffffffffffffffffffffffffffff1614610c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6f906145a4565b60405180910390fd5b6000610c82610b8f565b905060648110610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90614544565b60405180910390fd5b60005b602c811015610cfb57610ce8338284610ce39190614788565b6126b0565b8080610cf390614985565b915050610cca565b5050565b6000610d0a836115da565b8210610d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4290614364565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610dac6122b5565b73ffffffffffffffffffffffffffffffffffffffff16610dca61172b565b73ffffffffffffffffffffffffffffffffffffffff1614610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e17906145a4565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610e546122b5565b73ffffffffffffffffffffffffffffffffffffffff16610e7261172b565b73ffffffffffffffffffffffffffffffffffffffff1614610ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebf906145a4565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f13573d6000803e3d6000fd5b5050565b610f3283838360405180602001604052806000815250611a01565b505050565b6000610f41610b8f565b8210610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7990614664565b60405180910390fd5b60088281548110610fbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600f60019054906101000a900460ff1681565b610fe96122b5565b73ffffffffffffffffffffffffffffffffffffffff1661100761172b565b73ffffffffffffffffffffffffffffffffffffffff161461105d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611054906145a4565b60405180910390fd5b80601290805190602001906110739291906133ef565b5050565b61107f6122b5565b73ffffffffffffffffffffffffffffffffffffffff1661109d61172b565b73ffffffffffffffffffffffffffffffffffffffff16146110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea906145a4565b60405180910390fd5b80600c819055507f34c497eca31bd81a9cf2dbd7a38803d8847a7630e78982cf1636761f9c208a1e816040516111299190614684565b60405180910390a150565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490614504565b60405180910390fd5b80915050919050565b600b80546111f390614953565b80601f016020809104026020016040519081016040528092919081815260200182805461121f90614953565b801561126c5780601f106112415761010080835404028352916020019161126c565b820191906000526020600020905b81548152906001019060200180831161124f57829003601f168201915b505050505081565b61127c6122b5565b73ffffffffffffffffffffffffffffffffffffffff1661129a61172b565b73ffffffffffffffffffffffffffffffffffffffff16146112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e7906145a4565b60405180910390fd5b80600d819055507fdb0edf818ba53623589eda65d96a84c4b722bf5cf63d09b8bfc6184d78b088ab816040516113269190614684565b60405180910390a150565b600f60009054906101000a900460ff1615611381576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611378906144a4565b60405180910390fd5b600c548111156113c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bd90614624565b60405180910390fd5b600d5481601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114149190614788565b1115611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c906143e4565b60405180910390fd5b600e5481611461610b8f565b61146b9190614788565b11156114ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a390614524565b60405180910390fd5b3481669dbd90940700006114c0919061480f565b1115611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f890614444565b60405180910390fd5b60005b81811015611548576000611516610b8f565b9050600e54611523610b8f565b10156115345761153333826126b0565b5b50808061154090614985565b915050611504565b5080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115949190614788565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561164b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611642906144e4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61169a6122b5565b73ffffffffffffffffffffffffffffffffffffffff166116b861172b565b73ffffffffffffffffffffffffffffffffffffffff161461170e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611705906145a4565b60405180910390fd5b61171860006126ce565b565b600d5481565b669dbd909407000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461176490614953565b80601f016020809104026020016040519081016040528092919081815260200182805461179090614953565b80156117dd5780601f106117b2576101008083540402835291602001916117dd565b820191906000526020600020905b8154815290600101906020018083116117c057829003601f168201915b5050505050905090565b6117ef6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490614424565b60405180910390fd5b806005600061186a6122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119176122b5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161195c9190614327565b60405180910390a35050565b6119706122b5565b73ffffffffffffffffffffffffffffffffffffffff1661198e61172b565b73ffffffffffffffffffffffffffffffffffffffff16146119e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119db906145a4565b60405180910390fd5b6001600f60016101000a81548160ff021916908315150217905550565b611a12611a0c6122b5565b83612376565b611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4890614644565b60405180910390fd5b611a5d84848484612794565b50505050565b600f60009054906101000a900460ff16611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990614464565b60405180910390fd5b600c54811115611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90614624565b60405180910390fd5b600d5481601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b459190614788565b1115611b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7d906143e4565b60405180910390fd5b600e5481611b92610b8f565b611b9c9190614788565b1115611bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd490614524565b60405180910390fd5b3481669dbd9094070000611bf1919061480f565b1115611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2990614444565b60405180910390fd5b60005b81811015611c79576000611c47610b8f565b9050600e54611c54610b8f565b1015611c6557611c6433826126b0565b5b508080611c7190614985565b915050611c35565b5080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc59190614788565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60118054611d1890614953565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4490614953565b8015611d915780601f10611d6657610100808354040283529160200191611d91565b820191906000526020600020905b815481529060010190602001808311611d7457829003601f168201915b505050505081565b6060611da482612249565b611de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dda906145e4565b60405180910390fd5b60001515600f60019054906101000a900460ff1615151415611e915760108054611e0c90614953565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3890614953565b8015611e855780601f10611e5a57610100808354040283529160200191611e85565b820191906000526020600020905b815481529060010190602001808311611e6857829003601f168201915b50505050509050611ef9565b6000611e9b6127f0565b90506000815111611ebb5760405180602001604052806000815250611ef5565b80611ed1600185611ecc9190614788565b612882565b6011604051602001611ee59392919061428f565b6040516020818303038152906040525b9150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b611fad6122b5565b73ffffffffffffffffffffffffffffffffffffffff16611fcb61172b565b73ffffffffffffffffffffffffffffffffffffffff1614612021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612018906145a4565b60405180910390fd5b80601090805190602001906120379291906133ef565b5050565b6120436122b5565b73ffffffffffffffffffffffffffffffffffffffff1661206161172b565b73ffffffffffffffffffffffffffffffffffffffff16146120b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae906145a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211e906143a4565b60405180910390fd5b612130816126ce565b50565b600e5481565b6121416122b5565b73ffffffffffffffffffffffffffffffffffffffff1661215f61172b565b73ffffffffffffffffffffffffffffffffffffffff16146121b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ac906145a4565b60405180910390fd5b80600b90805190602001906121cb9291906133ef565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612242575061224182612a2f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661233083611134565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061238182612249565b6123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b790614484565b60405180910390fd5b60006123cb83611134565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061243a57508373ffffffffffffffffffffffffffffffffffffffff166124228461095e565b73ffffffffffffffffffffffffffffffffffffffff16145b8061244b575061244a8185611efe565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661247482611134565b73ffffffffffffffffffffffffffffffffffffffff16146124ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c1906145c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253190614404565b60405180910390fd5b612545838383612b11565b6125506000826122bd565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125a09190614869565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125f79190614788565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6126ca828260405180602001604052806000815250612b21565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61279f848484612454565b6127ab84848484612b7c565b6127ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e190614384565b60405180910390fd5b50505050565b6060601280546127ff90614953565b80601f016020809104026020016040519081016040528092919081815260200182805461282b90614953565b80156128785780601f1061284d57610100808354040283529160200191612878565b820191906000526020600020905b81548152906001019060200180831161285b57829003601f168201915b5050505050905090565b606060008214156128ca576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a2a565b600082905060005b600082146128fc5780806128e590614985565b915050600a826128f591906147de565b91506128d2565b60008167ffffffffffffffff81111561293e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129705781602001600182028036833780820191505090505b5090505b60008514612a23576001826129899190614869565b9150600a8561299891906149ce565b60306129a49190614788565b60f81b8183815181106129e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a1c91906147de565b9450612974565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612afa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b0a5750612b0982612d13565b5b9050919050565b612b1c838383612d7d565b505050565b612b2b8383612e91565b612b386000848484612b7c565b612b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6e90614384565b60405180910390fd5b505050565b6000612b9d8473ffffffffffffffffffffffffffffffffffffffff1661305f565b15612d06578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bc66122b5565b8786866040518563ffffffff1660e01b8152600401612be894939291906142db565b602060405180830381600087803b158015612c0257600080fd5b505af1925050508015612c3357506040513d601f19601f82011682018060405250810190612c30919061379b565b60015b612cb6573d8060008114612c63576040519150601f19603f3d011682016040523d82523d6000602084013e612c68565b606091505b50600081511415612cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca590614384565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d0b565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d88838383613072565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dcb57612dc681613077565b612e0a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e0957612e0883826130c0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e4d57612e488161322d565b612e8c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e8b57612e8a8282613370565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef890614564565b60405180910390fd5b612f0a81612249565b15612f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f41906143c4565b60405180910390fd5b612f5660008383612b11565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa69190614788565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130cd846115da565b6130d79190614869565b90506000600760008481526020019081526020016000205490508181146131bc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132419190614869565b9050600060096000848152602001908152602001600020549050600060088381548110613297577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106132df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613354577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061337b836115da565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546133fb90614953565b90600052602060002090601f01602090048101928261341d5760008555613464565b82601f1061343657805160ff1916838001178555613464565b82800160010185558215613464579182015b82811115613463578251825591602001919060010190613448565b5b5090506134719190613475565b5090565b5b8082111561348e576000816000905550600101613476565b5090565b60006134a56134a0846146d0565b61469f565b9050828152602081018484840111156134bd57600080fd5b6134c8848285614911565b509392505050565b60006134e36134de84614700565b61469f565b9050828152602081018484840111156134fb57600080fd5b613506848285614911565b509392505050565b60008135905061351d81614acc565b92915050565b60008135905061353281614ae3565b92915050565b60008135905061354781614afa565b92915050565b60008151905061355c81614afa565b92915050565b600082601f83011261357357600080fd5b8135613583848260208601613492565b91505092915050565b600082601f83011261359d57600080fd5b81356135ad8482602086016134d0565b91505092915050565b6000813590506135c581614b11565b92915050565b6000602082840312156135dd57600080fd5b60006135eb8482850161350e565b91505092915050565b6000806040838503121561360757600080fd5b60006136158582860161350e565b92505060206136268582860161350e565b9150509250929050565b60008060006060848603121561364557600080fd5b60006136538682870161350e565b93505060206136648682870161350e565b9250506040613675868287016135b6565b9150509250925092565b6000806000806080858703121561369557600080fd5b60006136a38782880161350e565b94505060206136b48782880161350e565b93505060406136c5878288016135b6565b925050606085013567ffffffffffffffff8111156136e257600080fd5b6136ee87828801613562565b91505092959194509250565b6000806040838503121561370d57600080fd5b600061371b8582860161350e565b925050602061372c85828601613523565b9150509250929050565b6000806040838503121561374957600080fd5b60006137578582860161350e565b9250506020613768858286016135b6565b9150509250929050565b60006020828403121561378457600080fd5b600061379284828501613538565b91505092915050565b6000602082840312156137ad57600080fd5b60006137bb8482850161354d565b91505092915050565b6000602082840312156137d657600080fd5b600082013567ffffffffffffffff8111156137f057600080fd5b6137fc8482850161358c565b91505092915050565b60006020828403121561381757600080fd5b6000613825848285016135b6565b91505092915050565b6138378161489d565b82525050565b613846816148af565b82525050565b600061385782614745565b613861818561475b565b9350613871818560208601614920565b61387a81614abb565b840191505092915050565b600061389082614750565b61389a818561476c565b93506138aa818560208601614920565b6138b381614abb565b840191505092915050565b60006138c982614750565b6138d3818561477d565b93506138e3818560208601614920565b80840191505092915050565b600081546138fc81614953565b613906818661477d565b94506001821660008114613921576001811461393257613965565b60ff19831686528186019350613965565b61393b85614730565b60005b8381101561395d5781548189015260018201915060208101905061393e565b838801955050505b50505092915050565b600061397b602b8361476c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006139e160328361476c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613a4760268361476c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613aad601c8361476c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613aed60268361476c565b91507f4578636565646564206d617820746f6b656e207075726368617365207065722060008301527f77616c6c657400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b5360248361476c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bb960198361476c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613bf9601f8361476c565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613c3960228361476c565b91507f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008301527f6e730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c9f602c8361476c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613d0560258361476c565b91507f436f756c64206e6f74207072652d6d696e742061667465722073616c6573206160008301527f63746976650000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d6b60388361476c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613dd1602a8361476c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e3760298361476c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e9d602a8361476c565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f0360398361476c565b91507f4d6f7265207468616e20343420746f6b656e73206861766520616c726561647960008301527f206265656e207265736572766564206f72206d696e7465642e000000000000006020830152604082019050919050565b6000613f6960208361476c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613fa9602c8361476c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061400f60208361476c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061404f60298361476c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006140b5602f8361476c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061411b60218361476c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614181601b8361476c565b91507f4578636565646564206d617820746f6b656e20707572636861736500000000006000830152602082019050919050565b60006141c160318361476c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614227602c8361476c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61428981614907565b82525050565b600061429b82866138be565b91506142a782856138be565b91506142b382846138ef565b9150819050949350505050565b60006020820190506142d5600083018461382e565b92915050565b60006080820190506142f0600083018761382e565b6142fd602083018661382e565b61430a6040830185614280565b818103606083015261431c818461384c565b905095945050505050565b600060208201905061433c600083018461383d565b92915050565b6000602082019050818103600083015261435c8184613885565b905092915050565b6000602082019050818103600083015261437d8161396e565b9050919050565b6000602082019050818103600083015261439d816139d4565b9050919050565b600060208201905081810360008301526143bd81613a3a565b9050919050565b600060208201905081810360008301526143dd81613aa0565b9050919050565b600060208201905081810360008301526143fd81613ae0565b9050919050565b6000602082019050818103600083015261441d81613b46565b9050919050565b6000602082019050818103600083015261443d81613bac565b9050919050565b6000602082019050818103600083015261445d81613bec565b9050919050565b6000602082019050818103600083015261447d81613c2c565b9050919050565b6000602082019050818103600083015261449d81613c92565b9050919050565b600060208201905081810360008301526144bd81613cf8565b9050919050565b600060208201905081810360008301526144dd81613d5e565b9050919050565b600060208201905081810360008301526144fd81613dc4565b9050919050565b6000602082019050818103600083015261451d81613e2a565b9050919050565b6000602082019050818103600083015261453d81613e90565b9050919050565b6000602082019050818103600083015261455d81613ef6565b9050919050565b6000602082019050818103600083015261457d81613f5c565b9050919050565b6000602082019050818103600083015261459d81613f9c565b9050919050565b600060208201905081810360008301526145bd81614002565b9050919050565b600060208201905081810360008301526145dd81614042565b9050919050565b600060208201905081810360008301526145fd816140a8565b9050919050565b6000602082019050818103600083015261461d8161410e565b9050919050565b6000602082019050818103600083015261463d81614174565b9050919050565b6000602082019050818103600083015261465d816141b4565b9050919050565b6000602082019050818103600083015261467d8161421a565b9050919050565b60006020820190506146996000830184614280565b92915050565b6000604051905081810181811067ffffffffffffffff821117156146c6576146c5614a8c565b5b8060405250919050565b600067ffffffffffffffff8211156146eb576146ea614a8c565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561471b5761471a614a8c565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061479382614907565b915061479e83614907565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147d3576147d26149ff565b5b828201905092915050565b60006147e982614907565b91506147f483614907565b92508261480457614803614a2e565b5b828204905092915050565b600061481a82614907565b915061482583614907565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561485e5761485d6149ff565b5b828202905092915050565b600061487482614907565b915061487f83614907565b925082821015614892576148916149ff565b5b828203905092915050565b60006148a8826148e7565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561493e578082015181840152602081019050614923565b8381111561494d576000848401525b50505050565b6000600282049050600182168061496b57607f821691505b6020821081141561497f5761497e614a5d565b5b50919050565b600061499082614907565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149c3576149c26149ff565b5b600182019050919050565b60006149d982614907565b91506149e483614907565b9250826149f4576149f3614a2e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614ad58161489d565b8114614ae057600080fd5b50565b614aec816148af565b8114614af757600080fd5b50565b614b03816148bb565b8114614b0e57600080fd5b50565b614b1a81614907565b8114614b2557600080fd5b5056fea2646970667358221220a430b06116766dd68882c3b60758a507cd7f8cf778edf9a8138900545551f2fe64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102305760003560e01c806367b138e11161012e578063b88d4fde116100ab578063eb8d24441161006f578063eb8d2444146107e9578063f2c4ce1e14610814578063f2fde38b1461083d578063f47c84c514610866578063ffe630b51461089157610230565b8063b88d4fde146106ff578063c634d03214610728578063c668286214610744578063c87b56dd1461076f578063e985e9c5146107ac57610230565b80637ff9b596116100f25780637ff9b5961461063e5780638da5cb5b1461066957806395d89b4114610694578063a22cb465146106bf578063a475b5dd146106e857610230565b806367b138e11461057a5780636955327d146105a357806370a08231146105bf578063715018a6146105fc5780637a8baf521461061357610230565b80632f745c59116101bc5780635183022711610180578063518302271461049557806355f804b3146104c05780635c5d81cc146104e95780636352211e146105125780636373a6b11461054f57610230565b80632f745c59146103c457806334918dfd146104015780633ccfd60b1461041857806342842e0e1461042f5780634f6ccce71461045857610230565b8063095ea7b311610203578063095ea7b31461030557806309aa3dcf1461032e57806318160ddd1461035957806323b872dd1461038457806327ac36c4146103ad57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063081c8c44146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613772565b6108ba565b6040516102699190614327565b60405180910390f35b34801561027e57600080fd5b506102876108cc565b6040516102949190614342565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613805565b61095e565b6040516102d191906142c0565b60405180910390f35b3480156102e657600080fd5b506102ef6109e3565b6040516102fc9190614342565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190613736565b610a71565b005b34801561033a57600080fd5b50610343610b89565b6040516103509190614684565b60405180910390f35b34801561036557600080fd5b5061036e610b8f565b60405161037b9190614684565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a69190613630565b610b9c565b005b3480156103b957600080fd5b506103c2610bfc565b005b3480156103d057600080fd5b506103eb60048036038101906103e69190613736565b610cff565b6040516103f89190614684565b60405180910390f35b34801561040d57600080fd5b50610416610da4565b005b34801561042457600080fd5b5061042d610e4c565b005b34801561043b57600080fd5b5061045660048036038101906104519190613630565b610f17565b005b34801561046457600080fd5b5061047f600480360381019061047a9190613805565b610f37565b60405161048c9190614684565b60405180910390f35b3480156104a157600080fd5b506104aa610fce565b6040516104b79190614327565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e291906137c4565b610fe1565b005b3480156104f557600080fd5b50610510600480360381019061050b9190613805565b611077565b005b34801561051e57600080fd5b5061053960048036038101906105349190613805565b611134565b60405161054691906142c0565b60405180910390f35b34801561055b57600080fd5b506105646111e6565b6040516105719190614342565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190613805565b611274565b005b6105bd60048036038101906105b89190613805565b611331565b005b3480156105cb57600080fd5b506105e660048036038101906105e191906135cb565b6115da565b6040516105f39190614684565b60405180910390f35b34801561060857600080fd5b50610611611692565b005b34801561061f57600080fd5b5061062861171a565b6040516106359190614684565b60405180910390f35b34801561064a57600080fd5b50610653611720565b6040516106609190614684565b60405180910390f35b34801561067557600080fd5b5061067e61172b565b60405161068b91906142c0565b60405180910390f35b3480156106a057600080fd5b506106a9611755565b6040516106b69190614342565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e191906136fa565b6117e7565b005b3480156106f457600080fd5b506106fd611968565b005b34801561070b57600080fd5b506107266004803603810190610721919061367f565b611a01565b005b610742600480360381019061073d9190613805565b611a63565b005b34801561075057600080fd5b50610759611d0b565b6040516107669190614342565b60405180910390f35b34801561077b57600080fd5b5061079660048036038101906107919190613805565b611d99565b6040516107a39190614342565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce91906135f4565b611efe565b6040516107e09190614327565b60405180910390f35b3480156107f557600080fd5b506107fe611f92565b60405161080b9190614327565b60405180910390f35b34801561082057600080fd5b5061083b600480360381019061083691906137c4565b611fa5565b005b34801561084957600080fd5b50610864600480360381019061085f91906135cb565b61203b565b005b34801561087257600080fd5b5061087b612133565b6040516108889190614684565b60405180910390f35b34801561089d57600080fd5b506108b860048036038101906108b391906137c4565b612139565b005b60006108c5826121cf565b9050919050565b6060600080546108db90614953565b80601f016020809104026020016040519081016040528092919081815260200182805461090790614953565b80156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b5050505050905090565b600061096982612249565b6109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f90614584565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601080546109f090614953565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1c90614953565b8015610a695780601f10610a3e57610100808354040283529160200191610a69565b820191906000526020600020905b815481529060010190602001808311610a4c57829003601f168201915b505050505081565b6000610a7c82611134565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae490614604565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0c6122b5565b73ffffffffffffffffffffffffffffffffffffffff161480610b3b5750610b3a81610b356122b5565b611efe565b5b610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b71906144c4565b60405180910390fd5b610b8483836122bd565b505050565b600c5481565b6000600880549050905090565b610bad610ba76122b5565b82612376565b610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390614644565b60405180910390fd5b610bf7838383612454565b505050565b610c046122b5565b73ffffffffffffffffffffffffffffffffffffffff16610c2261172b565b73ffffffffffffffffffffffffffffffffffffffff1614610c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6f906145a4565b60405180910390fd5b6000610c82610b8f565b905060648110610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90614544565b60405180910390fd5b60005b602c811015610cfb57610ce8338284610ce39190614788565b6126b0565b8080610cf390614985565b915050610cca565b5050565b6000610d0a836115da565b8210610d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4290614364565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610dac6122b5565b73ffffffffffffffffffffffffffffffffffffffff16610dca61172b565b73ffffffffffffffffffffffffffffffffffffffff1614610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e17906145a4565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610e546122b5565b73ffffffffffffffffffffffffffffffffffffffff16610e7261172b565b73ffffffffffffffffffffffffffffffffffffffff1614610ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebf906145a4565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f13573d6000803e3d6000fd5b5050565b610f3283838360405180602001604052806000815250611a01565b505050565b6000610f41610b8f565b8210610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7990614664565b60405180910390fd5b60088281548110610fbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600f60019054906101000a900460ff1681565b610fe96122b5565b73ffffffffffffffffffffffffffffffffffffffff1661100761172b565b73ffffffffffffffffffffffffffffffffffffffff161461105d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611054906145a4565b60405180910390fd5b80601290805190602001906110739291906133ef565b5050565b61107f6122b5565b73ffffffffffffffffffffffffffffffffffffffff1661109d61172b565b73ffffffffffffffffffffffffffffffffffffffff16146110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea906145a4565b60405180910390fd5b80600c819055507f34c497eca31bd81a9cf2dbd7a38803d8847a7630e78982cf1636761f9c208a1e816040516111299190614684565b60405180910390a150565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d490614504565b60405180910390fd5b80915050919050565b600b80546111f390614953565b80601f016020809104026020016040519081016040528092919081815260200182805461121f90614953565b801561126c5780601f106112415761010080835404028352916020019161126c565b820191906000526020600020905b81548152906001019060200180831161124f57829003601f168201915b505050505081565b61127c6122b5565b73ffffffffffffffffffffffffffffffffffffffff1661129a61172b565b73ffffffffffffffffffffffffffffffffffffffff16146112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e7906145a4565b60405180910390fd5b80600d819055507fdb0edf818ba53623589eda65d96a84c4b722bf5cf63d09b8bfc6184d78b088ab816040516113269190614684565b60405180910390a150565b600f60009054906101000a900460ff1615611381576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611378906144a4565b60405180910390fd5b600c548111156113c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bd90614624565b60405180910390fd5b600d5481601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114149190614788565b1115611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c906143e4565b60405180910390fd5b600e5481611461610b8f565b61146b9190614788565b11156114ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a390614524565b60405180910390fd5b3481669dbd90940700006114c0919061480f565b1115611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f890614444565b60405180910390fd5b60005b81811015611548576000611516610b8f565b9050600e54611523610b8f565b10156115345761153333826126b0565b5b50808061154090614985565b915050611504565b5080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115949190614788565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561164b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611642906144e4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61169a6122b5565b73ffffffffffffffffffffffffffffffffffffffff166116b861172b565b73ffffffffffffffffffffffffffffffffffffffff161461170e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611705906145a4565b60405180910390fd5b61171860006126ce565b565b600d5481565b669dbd909407000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461176490614953565b80601f016020809104026020016040519081016040528092919081815260200182805461179090614953565b80156117dd5780601f106117b2576101008083540402835291602001916117dd565b820191906000526020600020905b8154815290600101906020018083116117c057829003601f168201915b5050505050905090565b6117ef6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490614424565b60405180910390fd5b806005600061186a6122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119176122b5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161195c9190614327565b60405180910390a35050565b6119706122b5565b73ffffffffffffffffffffffffffffffffffffffff1661198e61172b565b73ffffffffffffffffffffffffffffffffffffffff16146119e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119db906145a4565b60405180910390fd5b6001600f60016101000a81548160ff021916908315150217905550565b611a12611a0c6122b5565b83612376565b611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4890614644565b60405180910390fd5b611a5d84848484612794565b50505050565b600f60009054906101000a900460ff16611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990614464565b60405180910390fd5b600c54811115611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee90614624565b60405180910390fd5b600d5481601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b459190614788565b1115611b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7d906143e4565b60405180910390fd5b600e5481611b92610b8f565b611b9c9190614788565b1115611bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd490614524565b60405180910390fd5b3481669dbd9094070000611bf1919061480f565b1115611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2990614444565b60405180910390fd5b60005b81811015611c79576000611c47610b8f565b9050600e54611c54610b8f565b1015611c6557611c6433826126b0565b5b508080611c7190614985565b915050611c35565b5080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc59190614788565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60118054611d1890614953565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4490614953565b8015611d915780601f10611d6657610100808354040283529160200191611d91565b820191906000526020600020905b815481529060010190602001808311611d7457829003601f168201915b505050505081565b6060611da482612249565b611de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dda906145e4565b60405180910390fd5b60001515600f60019054906101000a900460ff1615151415611e915760108054611e0c90614953565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3890614953565b8015611e855780601f10611e5a57610100808354040283529160200191611e85565b820191906000526020600020905b815481529060010190602001808311611e6857829003601f168201915b50505050509050611ef9565b6000611e9b6127f0565b90506000815111611ebb5760405180602001604052806000815250611ef5565b80611ed1600185611ecc9190614788565b612882565b6011604051602001611ee59392919061428f565b6040516020818303038152906040525b9150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b611fad6122b5565b73ffffffffffffffffffffffffffffffffffffffff16611fcb61172b565b73ffffffffffffffffffffffffffffffffffffffff1614612021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612018906145a4565b60405180910390fd5b80601090805190602001906120379291906133ef565b5050565b6120436122b5565b73ffffffffffffffffffffffffffffffffffffffff1661206161172b565b73ffffffffffffffffffffffffffffffffffffffff16146120b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae906145a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211e906143a4565b60405180910390fd5b612130816126ce565b50565b600e5481565b6121416122b5565b73ffffffffffffffffffffffffffffffffffffffff1661215f61172b565b73ffffffffffffffffffffffffffffffffffffffff16146121b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ac906145a4565b60405180910390fd5b80600b90805190602001906121cb9291906133ef565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612242575061224182612a2f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661233083611134565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061238182612249565b6123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b790614484565b60405180910390fd5b60006123cb83611134565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061243a57508373ffffffffffffffffffffffffffffffffffffffff166124228461095e565b73ffffffffffffffffffffffffffffffffffffffff16145b8061244b575061244a8185611efe565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661247482611134565b73ffffffffffffffffffffffffffffffffffffffff16146124ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c1906145c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561253a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253190614404565b60405180910390fd5b612545838383612b11565b6125506000826122bd565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125a09190614869565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125f79190614788565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6126ca828260405180602001604052806000815250612b21565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61279f848484612454565b6127ab84848484612b7c565b6127ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e190614384565b60405180910390fd5b50505050565b6060601280546127ff90614953565b80601f016020809104026020016040519081016040528092919081815260200182805461282b90614953565b80156128785780601f1061284d57610100808354040283529160200191612878565b820191906000526020600020905b81548152906001019060200180831161285b57829003601f168201915b5050505050905090565b606060008214156128ca576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a2a565b600082905060005b600082146128fc5780806128e590614985565b915050600a826128f591906147de565b91506128d2565b60008167ffffffffffffffff81111561293e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129705781602001600182028036833780820191505090505b5090505b60008514612a23576001826129899190614869565b9150600a8561299891906149ce565b60306129a49190614788565b60f81b8183815181106129e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a1c91906147de565b9450612974565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612afa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b0a5750612b0982612d13565b5b9050919050565b612b1c838383612d7d565b505050565b612b2b8383612e91565b612b386000848484612b7c565b612b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6e90614384565b60405180910390fd5b505050565b6000612b9d8473ffffffffffffffffffffffffffffffffffffffff1661305f565b15612d06578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bc66122b5565b8786866040518563ffffffff1660e01b8152600401612be894939291906142db565b602060405180830381600087803b158015612c0257600080fd5b505af1925050508015612c3357506040513d601f19601f82011682018060405250810190612c30919061379b565b60015b612cb6573d8060008114612c63576040519150601f19603f3d011682016040523d82523d6000602084013e612c68565b606091505b50600081511415612cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca590614384565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d0b565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d88838383613072565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dcb57612dc681613077565b612e0a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e0957612e0883826130c0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e4d57612e488161322d565b612e8c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e8b57612e8a8282613370565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef890614564565b60405180910390fd5b612f0a81612249565b15612f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f41906143c4565b60405180910390fd5b612f5660008383612b11565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa69190614788565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130cd846115da565b6130d79190614869565b90506000600760008481526020019081526020016000205490508181146131bc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132419190614869565b9050600060096000848152602001908152602001600020549050600060088381548110613297577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106132df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613354577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061337b836115da565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546133fb90614953565b90600052602060002090601f01602090048101928261341d5760008555613464565b82601f1061343657805160ff1916838001178555613464565b82800160010185558215613464579182015b82811115613463578251825591602001919060010190613448565b5b5090506134719190613475565b5090565b5b8082111561348e576000816000905550600101613476565b5090565b60006134a56134a0846146d0565b61469f565b9050828152602081018484840111156134bd57600080fd5b6134c8848285614911565b509392505050565b60006134e36134de84614700565b61469f565b9050828152602081018484840111156134fb57600080fd5b613506848285614911565b509392505050565b60008135905061351d81614acc565b92915050565b60008135905061353281614ae3565b92915050565b60008135905061354781614afa565b92915050565b60008151905061355c81614afa565b92915050565b600082601f83011261357357600080fd5b8135613583848260208601613492565b91505092915050565b600082601f83011261359d57600080fd5b81356135ad8482602086016134d0565b91505092915050565b6000813590506135c581614b11565b92915050565b6000602082840312156135dd57600080fd5b60006135eb8482850161350e565b91505092915050565b6000806040838503121561360757600080fd5b60006136158582860161350e565b92505060206136268582860161350e565b9150509250929050565b60008060006060848603121561364557600080fd5b60006136538682870161350e565b93505060206136648682870161350e565b9250506040613675868287016135b6565b9150509250925092565b6000806000806080858703121561369557600080fd5b60006136a38782880161350e565b94505060206136b48782880161350e565b93505060406136c5878288016135b6565b925050606085013567ffffffffffffffff8111156136e257600080fd5b6136ee87828801613562565b91505092959194509250565b6000806040838503121561370d57600080fd5b600061371b8582860161350e565b925050602061372c85828601613523565b9150509250929050565b6000806040838503121561374957600080fd5b60006137578582860161350e565b9250506020613768858286016135b6565b9150509250929050565b60006020828403121561378457600080fd5b600061379284828501613538565b91505092915050565b6000602082840312156137ad57600080fd5b60006137bb8482850161354d565b91505092915050565b6000602082840312156137d657600080fd5b600082013567ffffffffffffffff8111156137f057600080fd5b6137fc8482850161358c565b91505092915050565b60006020828403121561381757600080fd5b6000613825848285016135b6565b91505092915050565b6138378161489d565b82525050565b613846816148af565b82525050565b600061385782614745565b613861818561475b565b9350613871818560208601614920565b61387a81614abb565b840191505092915050565b600061389082614750565b61389a818561476c565b93506138aa818560208601614920565b6138b381614abb565b840191505092915050565b60006138c982614750565b6138d3818561477d565b93506138e3818560208601614920565b80840191505092915050565b600081546138fc81614953565b613906818661477d565b94506001821660008114613921576001811461393257613965565b60ff19831686528186019350613965565b61393b85614730565b60005b8381101561395d5781548189015260018201915060208101905061393e565b838801955050505b50505092915050565b600061397b602b8361476c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006139e160328361476c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613a4760268361476c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613aad601c8361476c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613aed60268361476c565b91507f4578636565646564206d617820746f6b656e207075726368617365207065722060008301527f77616c6c657400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b5360248361476c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bb960198361476c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613bf9601f8361476c565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613c3960228361476c565b91507f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008301527f6e730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c9f602c8361476c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613d0560258361476c565b91507f436f756c64206e6f74207072652d6d696e742061667465722073616c6573206160008301527f63746976650000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d6b60388361476c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613dd1602a8361476c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e3760298361476c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e9d602a8361476c565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f0360398361476c565b91507f4d6f7265207468616e20343420746f6b656e73206861766520616c726561647960008301527f206265656e207265736572766564206f72206d696e7465642e000000000000006020830152604082019050919050565b6000613f6960208361476c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613fa9602c8361476c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061400f60208361476c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061404f60298361476c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006140b5602f8361476c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061411b60218361476c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614181601b8361476c565b91507f4578636565646564206d617820746f6b656e20707572636861736500000000006000830152602082019050919050565b60006141c160318361476c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614227602c8361476c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61428981614907565b82525050565b600061429b82866138be565b91506142a782856138be565b91506142b382846138ef565b9150819050949350505050565b60006020820190506142d5600083018461382e565b92915050565b60006080820190506142f0600083018761382e565b6142fd602083018661382e565b61430a6040830185614280565b818103606083015261431c818461384c565b905095945050505050565b600060208201905061433c600083018461383d565b92915050565b6000602082019050818103600083015261435c8184613885565b905092915050565b6000602082019050818103600083015261437d8161396e565b9050919050565b6000602082019050818103600083015261439d816139d4565b9050919050565b600060208201905081810360008301526143bd81613a3a565b9050919050565b600060208201905081810360008301526143dd81613aa0565b9050919050565b600060208201905081810360008301526143fd81613ae0565b9050919050565b6000602082019050818103600083015261441d81613b46565b9050919050565b6000602082019050818103600083015261443d81613bac565b9050919050565b6000602082019050818103600083015261445d81613bec565b9050919050565b6000602082019050818103600083015261447d81613c2c565b9050919050565b6000602082019050818103600083015261449d81613c92565b9050919050565b600060208201905081810360008301526144bd81613cf8565b9050919050565b600060208201905081810360008301526144dd81613d5e565b9050919050565b600060208201905081810360008301526144fd81613dc4565b9050919050565b6000602082019050818103600083015261451d81613e2a565b9050919050565b6000602082019050818103600083015261453d81613e90565b9050919050565b6000602082019050818103600083015261455d81613ef6565b9050919050565b6000602082019050818103600083015261457d81613f5c565b9050919050565b6000602082019050818103600083015261459d81613f9c565b9050919050565b600060208201905081810360008301526145bd81614002565b9050919050565b600060208201905081810360008301526145dd81614042565b9050919050565b600060208201905081810360008301526145fd816140a8565b9050919050565b6000602082019050818103600083015261461d8161410e565b9050919050565b6000602082019050818103600083015261463d81614174565b9050919050565b6000602082019050818103600083015261465d816141b4565b9050919050565b6000602082019050818103600083015261467d8161421a565b9050919050565b60006020820190506146996000830184614280565b92915050565b6000604051905081810181811067ffffffffffffffff821117156146c6576146c5614a8c565b5b8060405250919050565b600067ffffffffffffffff8211156146eb576146ea614a8c565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561471b5761471a614a8c565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061479382614907565b915061479e83614907565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147d3576147d26149ff565b5b828201905092915050565b60006147e982614907565b91506147f483614907565b92508261480457614803614a2e565b5b828204905092915050565b600061481a82614907565b915061482583614907565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561485e5761485d6149ff565b5b828202905092915050565b600061487482614907565b915061487f83614907565b925082821015614892576148916149ff565b5b828203905092915050565b60006148a8826148e7565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561493e578082015181840152602081019050614923565b8381111561494d576000848401525b50505050565b6000600282049050600182168061496b57607f821691505b6020821081141561497f5761497e614a5d565b5b50919050565b600061499082614907565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149c3576149c26149ff565b5b600182019050919050565b60006149d982614907565b91506149e483614907565b9250826149f4576149f3614a2e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614ad58161489d565b8114614ae057600080fd5b50565b614aec816148af565b8114614af757600080fd5b50565b614b03816148bb565b8114614b0e57600080fd5b50565b614b1a81614907565b8114614b2557600080fd5b5056fea2646970667358221220a430b06116766dd68882c3b60758a507cd7f8cf778edf9a8138900545551f2fe64736f6c63430008000033

Deployed Bytecode Sourcemap

50297:5139:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51632:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28683:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30251:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50691:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29774:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50497:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44725:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31141:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52760:293;;;;;;;;;;;;;:::i;:::-;;44393:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53061:89;;;;;;;;;;;;;:::i;:::-;;55288:143;;;;;;;;;;;;;:::i;:::-;;31551:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44915:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50656:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51819:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54953:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28377:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50391:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55123:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53160:886;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28107:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41527:94;;;;;;;;;;;;;:::i;:::-;;50537:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50422:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40876:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28852:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30544:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51232:69;;;;;;;;;;;;;:::i;:::-;;31807:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54058:861;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50726:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52179:573;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30910:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50617:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51309:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41776:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50578:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52063:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51632:179;51743:4;51767:36;51791:11;51767:23;:36::i;:::-;51760:43;;51632:179;;;:::o;28683:100::-;28737:13;28770:5;28763:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28683:100;:::o;30251:221::-;30327:7;30355:16;30363:7;30355;:16::i;:::-;30347:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30440:15;:24;30456:7;30440:24;;;;;;;;;;;;;;;;;;;;;30433:31;;30251:221;;;:::o;50691:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29774:411::-;29855:13;29871:23;29886:7;29871:14;:23::i;:::-;29855:39;;29919:5;29913:11;;:2;:11;;;;29905:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30013:5;29997:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30022:37;30039:5;30046:12;:10;:12::i;:::-;30022:16;:37::i;:::-;29997:62;29975:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;30156:21;30165:2;30169:7;30156:8;:21::i;:::-;29774:411;;;:::o;50497:33::-;;;;:::o;44725:113::-;44786:7;44813:10;:17;;;;44806:24;;44725:113;:::o;31141:339::-;31336:41;31355:12;:10;:12::i;:::-;31369:7;31336:18;:41::i;:::-;31328:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31444:28;31454:4;31460:2;31464:7;31444:9;:28::i;:::-;31141:339;;;:::o;52760:293::-;41107:12;:10;:12::i;:::-;41096:23;;:7;:5;:7::i;:::-;:23;;;41088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52813:11:::1;52827:13;:11;:13::i;:::-;52813:27;;52868:3;52859:6;:12;52851:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;52944:6;52961:85;52977:2;52973:1;:6;52961:85;;;53001:33;53011:10;53032:1;53023:6;:10;;;;:::i;:::-;53001:9;:33::i;:::-;52981:3;;;;;:::i;:::-;;;;52961:85;;;41167:1;;52760:293::o:0;44393:256::-;44490:7;44526:23;44543:5;44526:16;:23::i;:::-;44518:5;:31;44510:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44615:12;:19;44628:5;44615:19;;;;;;;;;;;;;;;:26;44635:5;44615:26;;;;;;;;;;;;44608:33;;44393:256;;;;:::o;53061:89::-;41107:12;:10;:12::i;:::-;41096:23;;:7;:5;:7::i;:::-;:23;;;41088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53130:12:::1;;;;;;;;;;;53129:13;53114:12;;:28;;;;;;;;;;;;;;;;;;53061:89::o:0;55288:143::-;41107:12;:10;:12::i;:::-;41096:23;;:7;:5;:7::i;:::-;:23;;;41088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55336:15:::1;55354:21;55336:39;;55394:10;55386:28;;:37;55415:7;55386:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;41167:1;55288:143::o:0;31551:185::-;31689:39;31706:4;31712:2;31716:7;31689:39;;;;;;;;;;;;:16;:39::i;:::-;31551:185;;;:::o;44915:233::-;44990:7;45026:30;:28;:30::i;:::-;45018:5;:38;45010:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;45123:10;45134:5;45123:17;;;;;;;;;;;;;;;;;;;;;;;;45116:24;;44915:233;;;:::o;50656:28::-;;;;;;;;;;;;;:::o;51819:111::-;41107:12;:10;:12::i;:::-;41096:23;;:7;:5;:7::i;:::-;:23;;;41088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51914:8:::1;51895:16;:27;;;;;;;;;;;;:::i;:::-;;51819:111:::0;:::o;54953:162::-;41107:12;:10;:12::i;:::-;41096:23;;:7;:5;:7::i;:::-;:23;;;41088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55049:10:::1;55030:16;:29;;;;55075:32;55096:10;55075:32;;;;;;:::i;:::-;;;;;;;;54953:162:::0;:::o;28377:239::-;28449:7;28469:13;28485:7;:16;28493:7;28485:16;;;;;;;;;;;;;;;;;;;;;28469:32;;28537:1;28520:19;;:5;:19;;;;28512:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28603:5;28596:12;;;28377:239;;;:::o;50391:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55123:159::-;41107:12;:10;:12::i;:::-;41096:23;;:7;:5;:7::i;:::-;:23;;;41088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55218:10:::1;55198:17;:30;;;;55244;55263:10;55244:30;;;;;;:::i;:::-;;;;;;;;55123:159:::0;:::o;53160:886::-;53238:12;;;;;;;;;;;53237:13;53229:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;53329:16;;53311:14;:34;;53303:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;53445:17;;53427:14;53396:16;:28;53413:10;53396:28;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;:66;;53388:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;53558:10;;53540:14;53524:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;53516:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;53665:9;53647:14;50459:17;53634:27;;;;:::i;:::-;:40;;53626:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;53735:6;53731:211;53751:14;53747:1;:18;53731:211;;;53787:14;53804:13;:11;:13::i;:::-;53787:30;;53852:10;;53836:13;:11;:13::i;:::-;:26;53832:99;;;53883:32;53893:10;53905:9;53883;:32::i;:::-;53832:99;53731:211;53767:3;;;;;:::i;:::-;;;;53731:211;;;;54024:14;53993:16;:28;54010:10;53993:28;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;53962:16;:28;53979:10;53962:28;;;;;;;;;;;;;;;:76;;;;53160:886;:::o;28107:208::-;28179:7;28224:1;28207:19;;:5;:19;;;;28199:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28291:9;:16;28301:5;28291:16;;;;;;;;;;;;;;;;28284:23;;28107:208;;;:::o;41527:94::-;41107:12;:10;:12::i;:::-;41096:23;;:7;:5;:7::i;:::-;:23;;;41088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41592:21:::1;41610:1;41592:9;:21::i;:::-;41527:94::o:0;50537:34::-;;;;:::o;50422:54::-;50459:17;50422:54;:::o;40876:87::-;40922:7;40949:6;;;;;;;;;;;40942:13;;40876:87;:::o;28852:104::-;28908:13;28941:7;28934:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28852:104;:::o;30544:295::-;30659:12;:10;:12::i;:::-;30647:24;;:8;:24;;;;30639:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30759:8;30714:18;:32;30733:12;:10;:12::i;:::-;30714:32;;;;;;;;;;;;;;;:42;30747:8;30714:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30812:8;30783:48;;30798:12;:10;:12::i;:::-;30783:48;;;30822:8;30783:48;;;;;;:::i;:::-;;;;;;;;30544:295;;:::o;51232:69::-;41107:12;:10;:12::i;:::-;41096:23;;:7;:5;:7::i;:::-;:23;;;41088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51289:4:::1;51278:8;;:15;;;;;;;;;;;;;;;;;;51232:69::o:0;31807:328::-;31982:41;32001:12;:10;:12::i;:::-;32015:7;31982:18;:41::i;:::-;31974:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32088:39;32102:4;32108:2;32112:7;32121:5;32088:13;:39::i;:::-;31807:328;;;;:::o;54058:861::-;54132:12;;;;;;;;;;;54124:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54220:16;;54202:14;:34;;54194:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;54336:17;;54318:14;54287:16;:28;54304:10;54287:28;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;:66;;54279:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;54449:10;;54431:14;54415:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;54407:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;54556:9;54538:14;50459:17;54525:27;;;;:::i;:::-;:40;;54517:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;54618:6;54614:211;54634:14;54630:1;:18;54614:211;;;54670:14;54687:13;:11;:13::i;:::-;54670:30;;54735:10;;54719:13;:11;:13::i;:::-;:26;54715:99;;;54766:32;54776:10;54788:9;54766;:32::i;:::-;54715:99;54614:211;54650:3;;;;;:::i;:::-;;;;54614:211;;;;54897:14;54866:16;:28;54883:10;54866:28;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;54835:16;:28;54852:10;54835:28;;;;;;;;;;;;;;;:76;;;;54058:861;:::o;50726:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52179:573::-;52297:13;52346:16;52354:7;52346;:16::i;:::-;52328:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;52469:5;52457:17;;:8;;;;;;;;;;;:17;;;52454:70;;;52498:14;52491:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52454:70;52536:28;52567:10;:8;:10::i;:::-;52536:41;;52626:1;52601:14;52595:28;:32;:149;;;;;;;;;;;;;;;;;52667:14;52683:26;52695:1;52685:7;:11;;;;:::i;:::-;52683:24;:26::i;:::-;52711:13;52650:75;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52595:149;52588:156;;;52179:573;;;;:::o;30910:164::-;31007:4;31031:18;:25;31050:5;31031:25;;;;;;;;;;;;;;;:35;31057:8;31031:35;;;;;;;;;;;;;;;;;;;;;;;;;31024:42;;30910:164;;;;:::o;50617:32::-;;;;;;;;;;;;;:::o;51309:126::-;41107:12;:10;:12::i;:::-;41096:23;;:7;:5;:7::i;:::-;:23;;;41088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51412:15:::1;51395:14;:32;;;;;;;;;;;;:::i;:::-;;51309:126:::0;:::o;41776:192::-;41107:12;:10;:12::i;:::-;41096:23;;:7;:5;:7::i;:::-;:23;;;41088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41885:1:::1;41865:22;;:8;:22;;;;41857:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41941:19;41951:8;41941:9;:19::i;:::-;41776:192:::0;:::o;50578:32::-;;;;:::o;52063:108::-;41107:12;:10;:12::i;:::-;41096:23;;:7;:5;:7::i;:::-;:23;;;41088:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52153:10:::1;52140;:23;;;;;;;;;;;;:::i;:::-;;52063:108:::0;:::o;44085:224::-;44187:4;44226:35;44211:50;;;:11;:50;;;;:90;;;;44265:36;44289:11;44265:23;:36::i;:::-;44211:90;44204:97;;44085:224;;;:::o;33645:127::-;33710:4;33762:1;33734:30;;:7;:16;33742:7;33734:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33727:37;;33645:127;;;:::o;16196:98::-;16249:7;16276:10;16269:17;;16196:98;:::o;37627:174::-;37729:2;37702:15;:24;37718:7;37702:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37785:7;37781:2;37747:46;;37756:23;37771:7;37756:14;:23::i;:::-;37747:46;;;;;;;;;;;;37627:174;;:::o;33939:348::-;34032:4;34057:16;34065:7;34057;:16::i;:::-;34049:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34133:13;34149:23;34164:7;34149:14;:23::i;:::-;34133:39;;34202:5;34191:16;;:7;:16;;;:51;;;;34235:7;34211:31;;:20;34223:7;34211:11;:20::i;:::-;:31;;;34191:51;:87;;;;34246:32;34263:5;34270:7;34246:16;:32::i;:::-;34191:87;34183:96;;;33939:348;;;;:::o;36931:578::-;37090:4;37063:31;;:23;37078:7;37063:14;:23::i;:::-;:31;;;37055:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37173:1;37159:16;;:2;:16;;;;37151:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37229:39;37250:4;37256:2;37260:7;37229:20;:39::i;:::-;37333:29;37350:1;37354:7;37333:8;:29::i;:::-;37394:1;37375:9;:15;37385:4;37375:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37423:1;37406:9;:13;37416:2;37406:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37454:2;37435:7;:16;37443:7;37435:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37493:7;37489:2;37474:27;;37483:4;37474:27;;;;;;;;;;;;36931:578;;;:::o;34629:110::-;34705:26;34715:2;34719:7;34705:26;;;;;;;;;;;;:9;:26::i;:::-;34629:110;;:::o;41976:173::-;42032:16;42051:6;;;;;;;;;;;42032:25;;42077:8;42068:6;;:17;;;;;;;;;;;;;;;;;;42132:8;42101:40;;42122:8;42101:40;;;;;;;;;;;;41976:173;;:::o;33017:315::-;33174:28;33184:4;33190:2;33194:7;33174:9;:28::i;:::-;33221:48;33244:4;33250:2;33254:7;33263:5;33221:22;:48::i;:::-;33213:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33017:315;;;;:::o;51938:117::-;51998:13;52031:16;52024:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51938:117;:::o;23677:723::-;23733:13;23963:1;23954:5;:10;23950:53;;;23981:10;;;;;;;;;;;;;;;;;;;;;23950:53;24013:12;24028:5;24013:20;;24044:14;24069:78;24084:1;24076:4;:9;24069:78;;24102:8;;;;;:::i;:::-;;;;24133:2;24125:10;;;;;:::i;:::-;;;24069:78;;;24157:19;24189:6;24179:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24157:39;;24207:154;24223:1;24214:5;:10;24207:154;;24251:1;24241:11;;;;;:::i;:::-;;;24318:2;24310:5;:10;;;;:::i;:::-;24297:2;:24;;;;:::i;:::-;24284:39;;24267:6;24274;24267:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;24347:2;24338:11;;;;;:::i;:::-;;;24207:154;;;24385:6;24371:21;;;;;23677:723;;;;:::o;27738:305::-;27840:4;27892:25;27877:40;;;:11;:40;;;;:105;;;;27949:33;27934:48;;;:11;:48;;;;27877:105;:158;;;;27999:36;28023:11;27999:23;:36::i;:::-;27877:158;27857:178;;27738:305;;;:::o;51443:181::-;51571:45;51598:4;51604:2;51608:7;51571:26;:45::i;:::-;51443:181;;;:::o;34966:321::-;35096:18;35102:2;35106:7;35096:5;:18::i;:::-;35147:54;35178:1;35182:2;35186:7;35195:5;35147:22;:54::i;:::-;35125:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34966:321;;;:::o;38366:803::-;38521:4;38542:15;:2;:13;;;:15::i;:::-;38538:624;;;38594:2;38578:36;;;38615:12;:10;:12::i;:::-;38629:4;38635:7;38644:5;38578:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38574:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38841:1;38824:6;:13;:18;38820:272;;;38867:60;;;;;;;;;;:::i;:::-;;;;;;;;38820:272;39042:6;39036:13;39027:6;39023:2;39019:15;39012:38;38574:533;38711:45;;;38701:55;;;:6;:55;;;;38694:62;;;;;38538:624;39146:4;39139:11;;38366:803;;;;;;;:::o;26238:157::-;26323:4;26362:25;26347:40;;;:11;:40;;;;26340:47;;26238:157;;;:::o;45761:589::-;45905:45;45932:4;45938:2;45942:7;45905:26;:45::i;:::-;45983:1;45967:18;;:4;:18;;;45963:187;;;46002:40;46034:7;46002:31;:40::i;:::-;45963:187;;;46072:2;46064:10;;:4;:10;;;46060:90;;46091:47;46124:4;46130:7;46091:32;:47::i;:::-;46060:90;45963:187;46178:1;46164:16;;:2;:16;;;46160:183;;;46197:45;46234:7;46197:36;:45::i;:::-;46160:183;;;46270:4;46264:10;;:2;:10;;;46260:83;;46291:40;46319:2;46323:7;46291:27;:40::i;:::-;46260:83;46160:183;45761:589;;;:::o;35623:382::-;35717:1;35703:16;;:2;:16;;;;35695:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35776:16;35784:7;35776;:16::i;:::-;35775:17;35767:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35838:45;35867:1;35871:2;35875:7;35838:20;:45::i;:::-;35913:1;35896:9;:13;35906:2;35896:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35944:2;35925:7;:16;35933:7;35925:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35989:7;35985:2;35964:33;;35981:1;35964:33;;;;;;;;;;;;35623:382;;:::o;8452:387::-;8512:4;8720:12;8787:7;8775:20;8767:28;;8830:1;8823:4;:8;8816:15;;;8452:387;;;:::o;39741:126::-;;;;:::o;47073:164::-;47177:10;:17;;;;47150:15;:24;47166:7;47150:24;;;;;;;;;;;:44;;;;47205:10;47221:7;47205:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47073:164;:::o;47864:988::-;48130:22;48180:1;48155:22;48172:4;48155:16;:22::i;:::-;:26;;;;:::i;:::-;48130:51;;48192:18;48213:17;:26;48231:7;48213:26;;;;;;;;;;;;48192:47;;48360:14;48346:10;:28;48342:328;;48391:19;48413:12;:18;48426:4;48413:18;;;;;;;;;;;;;;;:34;48432:14;48413:34;;;;;;;;;;;;48391:56;;48497:11;48464:12;:18;48477:4;48464:18;;;;;;;;;;;;;;;:30;48483:10;48464:30;;;;;;;;;;;:44;;;;48614:10;48581:17;:30;48599:11;48581:30;;;;;;;;;;;:43;;;;48342:328;;48766:17;:26;48784:7;48766:26;;;;;;;;;;;48759:33;;;48810:12;:18;48823:4;48810:18;;;;;;;;;;;;;;;:34;48829:14;48810:34;;;;;;;;;;;48803:41;;;47864:988;;;;:::o;49147:1079::-;49400:22;49445:1;49425:10;:17;;;;:21;;;;:::i;:::-;49400:46;;49457:18;49478:15;:24;49494:7;49478:24;;;;;;;;;;;;49457:45;;49829:19;49851:10;49862:14;49851:26;;;;;;;;;;;;;;;;;;;;;;;;49829:48;;49915:11;49890:10;49901;49890:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;50026:10;49995:15;:28;50011:11;49995:28;;;;;;;;;;;:41;;;;50167:15;:24;50183:7;50167:24;;;;;;;;;;;50160:31;;;50202:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49147:1079;;;;:::o;46651:221::-;46736:14;46753:20;46770:2;46753:16;:20::i;:::-;46736:37;;46811:7;46784:12;:16;46797:2;46784:16;;;;;;;;;;;;;;;:24;46801:6;46784:24;;;;;;;;;;;:34;;;;46858:6;46829:17;:26;46847:7;46829:26;;;;;;;;;;;:35;;;;46651:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7466:845::-;;7606:5;7600:12;7635:36;7661:9;7635:36;:::i;:::-;7687:89;7769:6;7764:3;7687:89;:::i;:::-;7680:96;;7807:1;7796:9;7792:17;7823:1;7818:137;;;;7969:1;7964:341;;;;7785:520;;7818:137;7902:4;7898:9;7887;7883:25;7878:3;7871:38;7938:6;7933:3;7929:16;7922:23;;7818:137;;7964:341;8031:38;8063:5;8031:38;:::i;:::-;8091:1;8105:154;8119:6;8116:1;8113:13;8105:154;;;8193:7;8187:14;8183:1;8178:3;8174:11;8167:35;8243:1;8234:7;8230:15;8219:26;;8141:4;8138:1;8134:12;8129:17;;8105:154;;;8288:6;8283:3;8279:16;8272:23;;7971:334;;7785:520;;7573:738;;;;;;:::o;8317:375::-;;8480:67;8544:2;8539:3;8480:67;:::i;:::-;8473:74;;8577:34;8573:1;8568:3;8564:11;8557:55;8643:13;8638:2;8633:3;8629:12;8622:35;8683:2;8678:3;8674:12;8667:19;;8463:229;;;:::o;8698:382::-;;8861:67;8925:2;8920:3;8861:67;:::i;:::-;8854:74;;8958:34;8954:1;8949:3;8945:11;8938:55;9024:20;9019:2;9014:3;9010:12;9003:42;9071:2;9066:3;9062:12;9055:19;;8844:236;;;:::o;9086:370::-;;9249:67;9313:2;9308:3;9249:67;:::i;:::-;9242:74;;9346:34;9342:1;9337:3;9333:11;9326:55;9412:8;9407:2;9402:3;9398:12;9391:30;9447:2;9442:3;9438:12;9431:19;;9232:224;;;:::o;9462:326::-;;9625:67;9689:2;9684:3;9625:67;:::i;:::-;9618:74;;9722:30;9718:1;9713:3;9709:11;9702:51;9779:2;9774:3;9770:12;9763:19;;9608:180;;;:::o;9794:370::-;;9957:67;10021:2;10016:3;9957:67;:::i;:::-;9950:74;;10054:34;10050:1;10045:3;10041:11;10034:55;10120:8;10115:2;10110:3;10106:12;10099:30;10155:2;10150:3;10146:12;10139:19;;9940:224;;;:::o;10170:368::-;;10333:67;10397:2;10392:3;10333:67;:::i;:::-;10326:74;;10430:34;10426:1;10421:3;10417:11;10410:55;10496:6;10491:2;10486:3;10482:12;10475:28;10529:2;10524:3;10520:12;10513:19;;10316:222;;;:::o;10544:323::-;;10707:67;10771:2;10766:3;10707:67;:::i;:::-;10700:74;;10804:27;10800:1;10795:3;10791:11;10784:48;10858:2;10853:3;10849:12;10842:19;;10690:177;;;:::o;10873:329::-;;11036:67;11100:2;11095:3;11036:67;:::i;:::-;11029:74;;11133:33;11129:1;11124:3;11120:11;11113:54;11193:2;11188:3;11184:12;11177:19;;11019:183;;;:::o;11208:366::-;;11371:67;11435:2;11430:3;11371:67;:::i;:::-;11364:74;;11468:34;11464:1;11459:3;11455:11;11448:55;11534:4;11529:2;11524:3;11520:12;11513:26;11565:2;11560:3;11556:12;11549:19;;11354:220;;;:::o;11580:376::-;;11743:67;11807:2;11802:3;11743:67;:::i;:::-;11736:74;;11840:34;11836:1;11831:3;11827:11;11820:55;11906:14;11901:2;11896:3;11892:12;11885:36;11947:2;11942:3;11938:12;11931:19;;11726:230;;;:::o;11962:369::-;;12125:67;12189:2;12184:3;12125:67;:::i;:::-;12118:74;;12222:34;12218:1;12213:3;12209:11;12202:55;12288:7;12283:2;12278:3;12274:12;12267:29;12322:2;12317:3;12313:12;12306:19;;12108:223;;;:::o;12337:388::-;;12500:67;12564:2;12559:3;12500:67;:::i;:::-;12493:74;;12597:34;12593:1;12588:3;12584:11;12577:55;12663:26;12658:2;12653:3;12649:12;12642:48;12716:2;12711:3;12707:12;12700:19;;12483:242;;;:::o;12731:374::-;;12894:67;12958:2;12953:3;12894:67;:::i;:::-;12887:74;;12991:34;12987:1;12982:3;12978:11;12971:55;13057:12;13052:2;13047:3;13043:12;13036:34;13096:2;13091:3;13087:12;13080:19;;12877:228;;;:::o;13111:373::-;;13274:67;13338:2;13333:3;13274:67;:::i;:::-;13267:74;;13371:34;13367:1;13362:3;13358:11;13351:55;13437:11;13432:2;13427:3;13423:12;13416:33;13475:2;13470:3;13466:12;13459:19;;13257:227;;;:::o;13490:374::-;;13653:67;13717:2;13712:3;13653:67;:::i;:::-;13646:74;;13750:34;13746:1;13741:3;13737:11;13730:55;13816:12;13811:2;13806:3;13802:12;13795:34;13855:2;13850:3;13846:12;13839:19;;13636:228;;;:::o;13870:389::-;;14033:67;14097:2;14092:3;14033:67;:::i;:::-;14026:74;;14130:34;14126:1;14121:3;14117:11;14110:55;14196:27;14191:2;14186:3;14182:12;14175:49;14250:2;14245:3;14241:12;14234:19;;14016:243;;;:::o;14265:330::-;;14428:67;14492:2;14487:3;14428:67;:::i;:::-;14421:74;;14525:34;14521:1;14516:3;14512:11;14505:55;14586:2;14581:3;14577:12;14570:19;;14411:184;;;:::o;14601:376::-;;14764:67;14828:2;14823:3;14764:67;:::i;:::-;14757:74;;14861:34;14857:1;14852:3;14848:11;14841:55;14927:14;14922:2;14917:3;14913:12;14906:36;14968:2;14963:3;14959:12;14952:19;;14747:230;;;:::o;14983:330::-;;15146:67;15210:2;15205:3;15146:67;:::i;:::-;15139:74;;15243:34;15239:1;15234:3;15230:11;15223:55;15304:2;15299:3;15295:12;15288:19;;15129:184;;;:::o;15319:373::-;;15482:67;15546:2;15541:3;15482:67;:::i;:::-;15475:74;;15579:34;15575:1;15570:3;15566:11;15559:55;15645:11;15640:2;15635:3;15631:12;15624:33;15683:2;15678:3;15674:12;15667:19;;15465:227;;;:::o;15698:379::-;;15861:67;15925:2;15920:3;15861:67;:::i;:::-;15854:74;;15958:34;15954:1;15949:3;15945:11;15938:55;16024:17;16019:2;16014:3;16010:12;16003:39;16068:2;16063:3;16059:12;16052:19;;15844:233;;;:::o;16083:365::-;;16246:67;16310:2;16305:3;16246:67;:::i;:::-;16239:74;;16343:34;16339:1;16334:3;16330:11;16323:55;16409:3;16404:2;16399:3;16395:12;16388:25;16439:2;16434:3;16430:12;16423:19;;16229:219;;;:::o;16454:325::-;;16617:67;16681:2;16676:3;16617:67;:::i;:::-;16610:74;;16714:29;16710:1;16705:3;16701:11;16694:50;16770:2;16765:3;16761:12;16754:19;;16600:179;;;:::o;16785:381::-;;16948:67;17012:2;17007:3;16948:67;:::i;:::-;16941:74;;17045:34;17041:1;17036:3;17032:11;17025:55;17111:19;17106:2;17101:3;17097:12;17090:41;17157:2;17152:3;17148:12;17141:19;;16931:235;;;:::o;17172:376::-;;17335:67;17399:2;17394:3;17335:67;:::i;:::-;17328:74;;17432:34;17428:1;17423:3;17419:11;17412:55;17498:14;17493:2;17488:3;17484:12;17477:36;17539:2;17534:3;17530:12;17523:19;;17318:230;;;:::o;17554:118::-;17641:24;17659:5;17641:24;:::i;:::-;17636:3;17629:37;17619:53;;:::o;17678:589::-;;17925:95;18016:3;18007:6;17925:95;:::i;:::-;17918:102;;18037:95;18128:3;18119:6;18037:95;:::i;:::-;18030:102;;18149:92;18237:3;18228:6;18149:92;:::i;:::-;18142:99;;18258:3;18251:10;;17907:360;;;;;;:::o;18273:222::-;;18404:2;18393:9;18389:18;18381:26;;18417:71;18485:1;18474:9;18470:17;18461:6;18417:71;:::i;:::-;18371:124;;;;:::o;18501:640::-;;18734:3;18723:9;18719:19;18711:27;;18748:71;18816:1;18805:9;18801:17;18792:6;18748:71;:::i;:::-;18829:72;18897:2;18886:9;18882:18;18873:6;18829:72;:::i;:::-;18911;18979:2;18968:9;18964:18;18955:6;18911:72;:::i;:::-;19030:9;19024:4;19020:20;19015:2;19004:9;19000:18;18993:48;19058:76;19129:4;19120:6;19058:76;:::i;:::-;19050:84;;18701:440;;;;;;;:::o;19147:210::-;;19272:2;19261:9;19257:18;19249:26;;19285:65;19347:1;19336:9;19332:17;19323:6;19285:65;:::i;:::-;19239:118;;;;:::o;19363:313::-;;19514:2;19503:9;19499:18;19491:26;;19563:9;19557:4;19553:20;19549:1;19538:9;19534:17;19527:47;19591:78;19664:4;19655:6;19591:78;:::i;:::-;19583:86;;19481:195;;;;:::o;19682:419::-;;19886:2;19875:9;19871:18;19863:26;;19935:9;19929:4;19925:20;19921:1;19910:9;19906:17;19899:47;19963:131;20089:4;19963:131;:::i;:::-;19955:139;;19853:248;;;:::o;20107:419::-;;20311:2;20300:9;20296:18;20288:26;;20360:9;20354:4;20350:20;20346:1;20335:9;20331:17;20324:47;20388:131;20514:4;20388:131;:::i;:::-;20380:139;;20278:248;;;:::o;20532:419::-;;20736:2;20725:9;20721:18;20713:26;;20785:9;20779:4;20775:20;20771:1;20760:9;20756:17;20749:47;20813:131;20939:4;20813:131;:::i;:::-;20805:139;;20703:248;;;:::o;20957:419::-;;21161:2;21150:9;21146:18;21138:26;;21210:9;21204:4;21200:20;21196:1;21185:9;21181:17;21174:47;21238:131;21364:4;21238:131;:::i;:::-;21230:139;;21128:248;;;:::o;21382:419::-;;21586:2;21575:9;21571:18;21563:26;;21635:9;21629:4;21625:20;21621:1;21610:9;21606:17;21599:47;21663:131;21789:4;21663:131;:::i;:::-;21655:139;;21553:248;;;:::o;21807:419::-;;22011:2;22000:9;21996:18;21988:26;;22060:9;22054:4;22050:20;22046:1;22035:9;22031:17;22024:47;22088:131;22214:4;22088:131;:::i;:::-;22080:139;;21978:248;;;:::o;22232:419::-;;22436:2;22425:9;22421:18;22413:26;;22485:9;22479:4;22475:20;22471:1;22460:9;22456:17;22449:47;22513:131;22639:4;22513:131;:::i;:::-;22505:139;;22403:248;;;:::o;22657:419::-;;22861:2;22850:9;22846:18;22838:26;;22910:9;22904:4;22900:20;22896:1;22885:9;22881:17;22874:47;22938:131;23064:4;22938:131;:::i;:::-;22930:139;;22828:248;;;:::o;23082:419::-;;23286:2;23275:9;23271:18;23263:26;;23335:9;23329:4;23325:20;23321:1;23310:9;23306:17;23299:47;23363:131;23489:4;23363:131;:::i;:::-;23355:139;;23253:248;;;:::o;23507:419::-;;23711:2;23700:9;23696:18;23688:26;;23760:9;23754:4;23750:20;23746:1;23735:9;23731:17;23724:47;23788:131;23914:4;23788:131;:::i;:::-;23780:139;;23678:248;;;:::o;23932:419::-;;24136:2;24125:9;24121:18;24113:26;;24185:9;24179:4;24175:20;24171:1;24160:9;24156:17;24149:47;24213:131;24339:4;24213:131;:::i;:::-;24205:139;;24103:248;;;:::o;24357:419::-;;24561:2;24550:9;24546:18;24538:26;;24610:9;24604:4;24600:20;24596:1;24585:9;24581:17;24574:47;24638:131;24764:4;24638:131;:::i;:::-;24630:139;;24528:248;;;:::o;24782:419::-;;24986:2;24975:9;24971:18;24963:26;;25035:9;25029:4;25025:20;25021:1;25010:9;25006:17;24999:47;25063:131;25189:4;25063:131;:::i;:::-;25055:139;;24953:248;;;:::o;25207:419::-;;25411:2;25400:9;25396:18;25388:26;;25460:9;25454:4;25450:20;25446:1;25435:9;25431:17;25424:47;25488:131;25614:4;25488:131;:::i;:::-;25480:139;;25378:248;;;:::o;25632:419::-;;25836:2;25825:9;25821:18;25813:26;;25885:9;25879:4;25875:20;25871:1;25860:9;25856:17;25849:47;25913:131;26039:4;25913:131;:::i;:::-;25905:139;;25803:248;;;:::o;26057:419::-;;26261:2;26250:9;26246:18;26238:26;;26310:9;26304:4;26300:20;26296:1;26285:9;26281:17;26274:47;26338:131;26464:4;26338:131;:::i;:::-;26330:139;;26228:248;;;:::o;26482:419::-;;26686:2;26675:9;26671:18;26663:26;;26735:9;26729:4;26725:20;26721:1;26710:9;26706:17;26699:47;26763:131;26889:4;26763:131;:::i;:::-;26755:139;;26653:248;;;:::o;26907:419::-;;27111:2;27100:9;27096:18;27088:26;;27160:9;27154:4;27150:20;27146:1;27135:9;27131:17;27124:47;27188:131;27314:4;27188:131;:::i;:::-;27180:139;;27078:248;;;:::o;27332:419::-;;27536:2;27525:9;27521:18;27513:26;;27585:9;27579:4;27575:20;27571:1;27560:9;27556:17;27549:47;27613:131;27739:4;27613:131;:::i;:::-;27605:139;;27503:248;;;:::o;27757:419::-;;27961:2;27950:9;27946:18;27938:26;;28010:9;28004:4;28000:20;27996:1;27985:9;27981:17;27974:47;28038:131;28164:4;28038:131;:::i;:::-;28030:139;;27928:248;;;:::o;28182:419::-;;28386:2;28375:9;28371:18;28363:26;;28435:9;28429:4;28425:20;28421:1;28410:9;28406:17;28399:47;28463:131;28589:4;28463:131;:::i;:::-;28455:139;;28353:248;;;:::o;28607:419::-;;28811:2;28800:9;28796:18;28788:26;;28860:9;28854:4;28850:20;28846:1;28835:9;28831:17;28824:47;28888:131;29014:4;28888:131;:::i;:::-;28880:139;;28778:248;;;:::o;29032:419::-;;29236:2;29225:9;29221:18;29213:26;;29285:9;29279:4;29275:20;29271:1;29260:9;29256:17;29249:47;29313:131;29439:4;29313:131;:::i;:::-;29305:139;;29203:248;;;:::o;29457:419::-;;29661:2;29650:9;29646:18;29638:26;;29710:9;29704:4;29700:20;29696:1;29685:9;29681:17;29674:47;29738:131;29864:4;29738:131;:::i;:::-;29730:139;;29628:248;;;:::o;29882:419::-;;30086:2;30075:9;30071:18;30063:26;;30135:9;30129:4;30125:20;30121:1;30110:9;30106:17;30099:47;30163:131;30289:4;30163:131;:::i;:::-;30155:139;;30053:248;;;:::o;30307:222::-;;30438:2;30427:9;30423:18;30415:26;;30451:71;30519:1;30508:9;30504:17;30495:6;30451:71;:::i;:::-;30405:124;;;;:::o;30535:283::-;;30601:2;30595:9;30585:19;;30643:4;30635:6;30631:17;30750:6;30738:10;30735:22;30714:18;30702:10;30699:34;30696:62;30693:2;;;30761:18;;:::i;:::-;30693:2;30801:10;30797:2;30790:22;30575:243;;;;:::o;30824:331::-;;30975:18;30967:6;30964:30;30961:2;;;30997:18;;:::i;:::-;30961:2;31082:4;31078:9;31071:4;31063:6;31059:17;31055:33;31047:41;;31143:4;31137;31133:15;31125:23;;30890:265;;;:::o;31161:332::-;;31313:18;31305:6;31302:30;31299:2;;;31335:18;;:::i;:::-;31299:2;31420:4;31416:9;31409:4;31401:6;31397:17;31393:33;31385:41;;31481:4;31475;31471:15;31463:23;;31228:265;;;:::o;31499:141::-;;31571:3;31563:11;;31594:3;31591:1;31584:14;31628:4;31625:1;31615:18;31607:26;;31553:87;;;:::o;31646:98::-;;31731:5;31725:12;31715:22;;31704:40;;;:::o;31750:99::-;;31836:5;31830:12;31820:22;;31809:40;;;:::o;31855:168::-;;31972:6;31967:3;31960:19;32012:4;32007:3;32003:14;31988:29;;31950:73;;;;:::o;32029:169::-;;32147:6;32142:3;32135:19;32187:4;32182:3;32178:14;32163:29;;32125:73;;;;:::o;32204:148::-;;32343:3;32328:18;;32318:34;;;;:::o;32358:305::-;;32417:20;32435:1;32417:20;:::i;:::-;32412:25;;32451:20;32469:1;32451:20;:::i;:::-;32446:25;;32605:1;32537:66;32533:74;32530:1;32527:81;32524:2;;;32611:18;;:::i;:::-;32524:2;32655:1;32652;32648:9;32641:16;;32402:261;;;;:::o;32669:185::-;;32726:20;32744:1;32726:20;:::i;:::-;32721:25;;32760:20;32778:1;32760:20;:::i;:::-;32755:25;;32799:1;32789:2;;32804:18;;:::i;:::-;32789:2;32846:1;32843;32839:9;32834:14;;32711:143;;;;:::o;32860:348::-;;32923:20;32941:1;32923:20;:::i;:::-;32918:25;;32957:20;32975:1;32957:20;:::i;:::-;32952:25;;33145:1;33077:66;33073:74;33070:1;33067:81;33062:1;33055:9;33048:17;33044:105;33041:2;;;33152:18;;:::i;:::-;33041:2;33200:1;33197;33193:9;33182:20;;32908:300;;;;:::o;33214:191::-;;33274:20;33292:1;33274:20;:::i;:::-;33269:25;;33308:20;33326:1;33308:20;:::i;:::-;33303:25;;33347:1;33344;33341:8;33338:2;;;33352:18;;:::i;:::-;33338:2;33397:1;33394;33390:9;33382:17;;33259:146;;;;:::o;33411:96::-;;33477:24;33495:5;33477:24;:::i;:::-;33466:35;;33456:51;;;:::o;33513:90::-;;33590:5;33583:13;33576:21;33565:32;;33555:48;;;:::o;33609:149::-;;33685:66;33678:5;33674:78;33663:89;;33653:105;;;:::o;33764:126::-;;33841:42;33834:5;33830:54;33819:65;;33809:81;;;:::o;33896:77::-;;33962:5;33951:16;;33941:32;;;:::o;33979:154::-;34063:6;34058:3;34053;34040:30;34125:1;34116:6;34111:3;34107:16;34100:27;34030:103;;;:::o;34139:307::-;34207:1;34217:113;34231:6;34228:1;34225:13;34217:113;;;34316:1;34311:3;34307:11;34301:18;34297:1;34292:3;34288:11;34281:39;34253:2;34250:1;34246:10;34241:15;;34217:113;;;34348:6;34345:1;34342:13;34339:2;;;34428:1;34419:6;34414:3;34410:16;34403:27;34339:2;34188:258;;;;:::o;34452:320::-;;34533:1;34527:4;34523:12;34513:22;;34580:1;34574:4;34570:12;34601:18;34591:2;;34657:4;34649:6;34645:17;34635:27;;34591:2;34719;34711:6;34708:14;34688:18;34685:38;34682:2;;;34738:18;;:::i;:::-;34682:2;34503:269;;;;:::o;34778:233::-;;34840:24;34858:5;34840:24;:::i;:::-;34831:33;;34886:66;34879:5;34876:77;34873:2;;;34956:18;;:::i;:::-;34873:2;35003:1;34996:5;34992:13;34985:20;;34821:190;;;:::o;35017:176::-;;35066:20;35084:1;35066:20;:::i;:::-;35061:25;;35100:20;35118:1;35100:20;:::i;:::-;35095:25;;35139:1;35129:2;;35144:18;;:::i;:::-;35129:2;35185:1;35182;35178:9;35173:14;;35051:142;;;;:::o;35199:180::-;35247:77;35244:1;35237:88;35344:4;35341:1;35334:15;35368:4;35365:1;35358:15;35385:180;35433:77;35430:1;35423:88;35530:4;35527:1;35520:15;35554:4;35551:1;35544:15;35571:180;35619:77;35616:1;35609:88;35716:4;35713:1;35706:15;35740:4;35737:1;35730:15;35757:180;35805:77;35802:1;35795:88;35902:4;35899:1;35892:15;35926:4;35923:1;35916:15;35943:102;;36035:2;36031:7;36026:2;36019:5;36015:14;36011:28;36001:38;;35991:54;;;:::o;36051:122::-;36124:24;36142:5;36124:24;:::i;:::-;36117:5;36114:35;36104:2;;36163:1;36160;36153:12;36104:2;36094:79;:::o;36179:116::-;36249:21;36264:5;36249:21;:::i;:::-;36242:5;36239:32;36229:2;;36285:1;36282;36275:12;36229:2;36219:76;:::o;36301:120::-;36373:23;36390:5;36373:23;:::i;:::-;36366:5;36363:34;36353:2;;36411:1;36408;36401:12;36353:2;36343:78;:::o;36427:122::-;36500:24;36518:5;36500:24;:::i;:::-;36493:5;36490:35;36480:2;;36539:1;36536;36529:12;36480:2;36470:79;:::o

Swarm Source

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