ETH Price: $3,395.17 (+6.36%)
Gas: 19 Gwei

Token

hoodie mfer madness 2023 (MFERMADNESS2023)
 

Overview

Max Total Supply

64 MFERMADNESS2023

Holders

46

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
reylarsdayum.eth
Balance
1 MFERMADNESS2023
0xea1c7edf57c7302679807bd7de1d21501bd61c03
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MferMadness2023

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-14
*/

// Sources flattened with hardhat v2.13.0 https://hardhat.org

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

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

pragma solidity ^0.8.0;

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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

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


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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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


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

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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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);

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

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/MferMadness2023.sol


pragma solidity ^0.8.18;



interface RequiredToken {
    function balanceOf(address) external view returns (uint256);
}

contract MferMadness2023 is ERC721, ERC721Enumerable, Ownable {
    address ALLOWLIST_CONTRACT_ADDRESS = 0xEe2585cAa74dD5c68Ca6a854cDAe17C0627f8235;

    bool public saleIsActive = false;
    bool public allowListFreeMint = true;

    uint128 public maxSupply = 64;
    uint128 public maxTokenOwnership = 2;

    uint256 public minPrice = 0.1 ether;

    string private _baseURIextended;
    bytes32 private _hashOfRandomDraw = 0x0;

    constructor() ERC721("hoodie mfer madness 2023", "MFERMADNESS2023") {}

    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 _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }

    function mint(uint256 numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint tokens");

        bool allowFree = allowListFreeMint && RequiredToken(ALLOWLIST_CONTRACT_ADDRESS).balanceOf(msg.sender) > 0;

        require(numberOfTokens <= maxTokenOwnership, "Exceeded max token purchase");
        require(totalSupply() + numberOfTokens <= maxSupply, "Exceeded max supply");
        require(balanceOf(msg.sender) + numberOfTokens <= maxTokenOwnership, "Exceeded max ownership");
        require(allowFree || (minPrice * numberOfTokens <= msg.value), "Ether value sent is not correct");

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

    function getSHA256HashOfRandomDraw() external view returns (bytes32) {
        return _hashOfRandomDraw;
    }

    /* Owner Functions */

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

    function setAllowListFreeMint(bool newState) external onlyOwner {
        allowListFreeMint = newState;
    }

    function setSaleState(bool newState) external onlyOwner {
        saleIsActive = newState;
    }

    function setSHA256HashOfRandomDraw(bytes32 newHash) external onlyOwner {
        _hashOfRandomDraw = newHash;
    }

    function reserve(uint numberOfTokens) external onlyOwner {
        uint supply = totalSupply();
        uint i;
        for (i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function setMaxTokenOwnership(uint128 newMaxTokenOwnership) external onlyOwner {
        maxTokenOwnership = newMaxTokenOwnership;
    }

    function setMaxSupply(uint128 newMaxSupply) external onlyOwner {
        maxSupply = newMaxSupply;
    }

    function setMinPrice(uint256 newMinPrice) external onlyOwner {
        minPrice = newMinPrice;
    }

    function withdraw(address payable to) external onlyOwner {
        uint256 balance = address(this).balance;
        Address.sendValue(to, balance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"allowListFreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSHA256HashOfRandomDraw","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"maxSupply","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenOwnership","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setAllowListFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newMaxSupply","type":"uint128"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newMaxTokenOwnership","type":"uint128"}],"name":"setMaxTokenOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinPrice","type":"uint256"}],"name":"setMinPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newHash","type":"bytes32"}],"name":"setSHA256HashOfRandomDraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273ee2585caa74dd5c68ca6a854cdae17c0627f8235600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600b60146101000a81548160ff0219169083151502179055506001600b60156101000a81548160ff0219169083151502179055506040600c60006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506002600c60106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555067016345785d8a0000600d556000801b600f553480156200012357600080fd5b506040518060400160405280601881526020017f686f6f646965206d666572206d61646e657373203230323300000000000000008152506040518060400160405280600f81526020017f4d4645524d41444e4553533230323300000000000000000000000000000000008152508160009081620001a1919062000524565b508060019081620001b3919062000524565b505050620001d6620001ca620001dc60201b60201c565b620001e460201b60201c565b6200060b565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200032c57607f821691505b602082108103620003425762000341620002e4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200036d565b620003b886836200036d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000405620003ff620003f984620003d0565b620003da565b620003d0565b9050919050565b6000819050919050565b6200042183620003e4565b6200043962000430826200040c565b8484546200037a565b825550505050565b600090565b6200045062000441565b6200045d81848462000416565b505050565b5b8181101562000485576200047960008262000446565b60018101905062000463565b5050565b601f821115620004d4576200049e8162000348565b620004a9846200035d565b81016020851015620004b9578190505b620004d1620004c8856200035d565b83018262000462565b50505b505050565b600082821c905092915050565b6000620004f960001984600802620004d9565b1980831691505092915050565b6000620005148383620004e6565b9150826002028217905092915050565b6200052f82620002aa565b67ffffffffffffffff8111156200054b576200054a620002b5565b5b62000557825462000313565b6200056482828562000489565b600060209050601f8311600181146200059c576000841562000587578287015190505b62000593858262000506565b86555062000603565b601f198416620005ac8662000348565b60005b82811015620005d657848901518255600182019150602085019450602081019050620005af565b86831015620005f65784890151620005f2601f891682620004e6565b8355505b6001600288020188555050505b505050505050565b614aee806200061b6000396000f3fe6080604052600436106102045760003560e01c806371201f1e11610118578063b88d4fde116100a0578063dbfe781f1161006f578063dbfe781f14610754578063e45be8eb1461077d578063e985e9c5146107a8578063eb8d2444146107e5578063f2fde38b1461081057610204565b8063b88d4fde1461069a578063c4e37095146106c3578063c87b56dd146106ec578063d5abeb011461072957610204565b80638da5cb5b116100e75780638da5cb5b146105d457806395d89b41146105ff578063a0712d681461062a578063a22cb46514610646578063a44512611461066f57610204565b806371201f1e14610540578063715018a61461056b578063819b25ba146105825780638ac068a2146105ab57610204565b806342842e0e1161019b57806355f804b31161016a57806355f804b3146104495780635b8cb145146104725780635ea8cd121461049d5780636352211e146104c657806370a082311461050357610204565b806342842e0e146103915780634de5b4ec146103ba5780634f6ccce7146103e357806351cff8d91461042057610204565b806318160ddd116101d757806318160ddd146102d757806323b872dd146103025780632b9af4f01461032b5780632f745c591461035457610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612f17565b610839565b60405161023d9190612f5f565b60405180910390f35b34801561025257600080fd5b5061025b61084b565b604051610268919061300a565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613062565b6108dd565b6040516102a591906130d0565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613117565b610962565b005b3480156102e357600080fd5b506102ec610a79565b6040516102f99190613166565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190613181565b610a86565b005b34801561033757600080fd5b50610352600480360381019061034d919061320a565b610ae6565b005b34801561036057600080fd5b5061037b60048036038101906103769190613117565b610b6c565b6040516103889190613166565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190613181565b610c11565b005b3480156103c657600080fd5b506103e160048036038101906103dc919061327f565b610c31565b005b3480156103ef57600080fd5b5061040a60048036038101906104059190613062565b610ce9565b6040516104179190613166565b60405180910390f35b34801561042c57600080fd5b50610447600480360381019061044291906132ea565b610d5a565b005b34801561045557600080fd5b50610470600480360381019061046b919061344c565b610de9565b005b34801561047e57600080fd5b50610487610e78565b6040516104949190612f5f565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf9190613062565b610e8b565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190613062565b610f11565b6040516104fa91906130d0565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190613495565b610fc2565b6040516105379190613166565b60405180910390f35b34801561054c57600080fd5b50610555611079565b60405161056291906134d1565b60405180910390f35b34801561057757600080fd5b5061058061109b565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613062565b611123565b005b3480156105b757600080fd5b506105d260048036038101906105cd919061327f565b6111e3565b005b3480156105e057600080fd5b506105e961129b565b6040516105f691906130d0565b60405180910390f35b34801561060b57600080fd5b506106146112c5565b604051610621919061300a565b60405180910390f35b610644600480360381019061063f9190613062565b611357565b005b34801561065257600080fd5b5061066d60048036038101906106689190613518565b6116b1565b005b34801561067b57600080fd5b506106846116c7565b6040516106919190613567565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190613623565b6116d1565b005b3480156106cf57600080fd5b506106ea60048036038101906106e591906136a6565b611733565b005b3480156106f857600080fd5b50610713600480360381019061070e9190613062565b6117cc565b604051610720919061300a565b60405180910390f35b34801561073557600080fd5b5061073e611873565b60405161074b91906134d1565b60405180910390f35b34801561076057600080fd5b5061077b600480360381019061077691906136a6565b611895565b005b34801561078957600080fd5b5061079261192e565b60405161079f9190613166565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca91906136d3565b611934565b6040516107dc9190612f5f565b60405180910390f35b3480156107f157600080fd5b506107fa6119c8565b6040516108079190612f5f565b60405180910390f35b34801561081c57600080fd5b5061083760048036038101906108329190613495565b6119db565b005b600061084482611ad2565b9050919050565b60606000805461085a90613742565b80601f016020809104026020016040519081016040528092919081815260200182805461088690613742565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b60006108e882611b4c565b610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e906137e5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096d82610f11565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d490613877565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109fc611bb8565b73ffffffffffffffffffffffffffffffffffffffff161480610a2b5750610a2a81610a25611bb8565b611934565b5b610a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6190613909565b60405180910390fd5b610a748383611bc0565b505050565b6000600880549050905090565b610a97610a91611bb8565b82611c79565b610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd9061399b565b60405180910390fd5b610ae1838383611d57565b505050565b610aee611bb8565b73ffffffffffffffffffffffffffffffffffffffff16610b0c61129b565b73ffffffffffffffffffffffffffffffffffffffff1614610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990613a07565b60405180910390fd5b80600f8190555050565b6000610b7783610fc2565b8210610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf90613a99565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c2c838383604051806020016040528060008152506116d1565b505050565b610c39611bb8565b73ffffffffffffffffffffffffffffffffffffffff16610c5761129b565b73ffffffffffffffffffffffffffffffffffffffff1614610cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca490613a07565b60405180910390fd5b80600c60106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b6000610cf3610a79565b8210610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90613b2b565b60405180910390fd5b60088281548110610d4857610d47613b4b565b5b90600052602060002001549050919050565b610d62611bb8565b73ffffffffffffffffffffffffffffffffffffffff16610d8061129b565b73ffffffffffffffffffffffffffffffffffffffff1614610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd90613a07565b60405180910390fd5b6000479050610de58282611fbd565b5050565b610df1611bb8565b73ffffffffffffffffffffffffffffffffffffffff16610e0f61129b565b73ffffffffffffffffffffffffffffffffffffffff1614610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c90613a07565b60405180910390fd5b80600e9081610e749190613d26565b5050565b600b60159054906101000a900460ff1681565b610e93611bb8565b73ffffffffffffffffffffffffffffffffffffffff16610eb161129b565b73ffffffffffffffffffffffffffffffffffffffff1614610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe90613a07565b60405180910390fd5b80600d8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb090613e6a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102990613efc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c60109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6110a3611bb8565b73ffffffffffffffffffffffffffffffffffffffff166110c161129b565b73ffffffffffffffffffffffffffffffffffffffff1614611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e90613a07565b60405180910390fd5b61112160006120b1565b565b61112b611bb8565b73ffffffffffffffffffffffffffffffffffffffff1661114961129b565b73ffffffffffffffffffffffffffffffffffffffff161461119f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119690613a07565b60405180910390fd5b60006111a9610a79565b905060005b828110156111de576111cb3382846111c69190613f4b565b612177565b80806111d690613f7f565b9150506111ae565b505050565b6111eb611bb8565b73ffffffffffffffffffffffffffffffffffffffff1661120961129b565b73ffffffffffffffffffffffffffffffffffffffff161461125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613a07565b60405180910390fd5b80600c60006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112d490613742565b80601f016020809104026020016040519081016040528092919081815260200182805461130090613742565b801561134d5780601f106113225761010080835404028352916020019161134d565b820191906000526020600020905b81548152906001019060200180831161133057829003601f168201915b5050505050905090565b600b60149054906101000a900460ff166113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d90614039565b60405180910390fd5b6000600b60159054906101000a900460ff16801561145f57506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161141c91906130d0565b602060405180830381865afa158015611439573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145d919061406e565b115b9050600c60109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168211156114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb906140e7565b60405180910390fd5b600c60009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168261150e610a79565b6115189190613f4b565b1115611559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155090614153565b60405180910390fd5b600c60109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168261159433610fc2565b61159e9190613f4b565b11156115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d6906141bf565b60405180910390fd5b80806115f857503482600d546115f591906141df565b11155b611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e9061426d565b60405180910390fd5b60005b828110156116ac57600061164c610a79565b9050600c60009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16611687610a79565b1015611698576116973382612177565b5b5080806116a490613f7f565b91505061163a565b505050565b6116c36116bc611bb8565b8383612195565b5050565b6000600f54905090565b6116e26116dc611bb8565b83611c79565b611721576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117189061399b565b60405180910390fd5b61172d84848484612301565b50505050565b61173b611bb8565b73ffffffffffffffffffffffffffffffffffffffff1661175961129b565b73ffffffffffffffffffffffffffffffffffffffff16146117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690613a07565b60405180910390fd5b80600b60146101000a81548160ff02191690831515021790555050565b60606117d782611b4c565b611816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180d906142ff565b60405180910390fd5b600061182061235d565b90506000815111611840576040518060200160405280600081525061186b565b8061184a846123ef565b60405160200161185b92919061435b565b6040516020818303038152906040525b915050919050565b600c60009054906101000a90046fffffffffffffffffffffffffffffffff1681565b61189d611bb8565b73ffffffffffffffffffffffffffffffffffffffff166118bb61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190890613a07565b60405180910390fd5b80600b60156101000a81548160ff02191690831515021790555050565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60149054906101000a900460ff1681565b6119e3611bb8565b73ffffffffffffffffffffffffffffffffffffffff16611a0161129b565b73ffffffffffffffffffffffffffffffffffffffff1614611a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4e90613a07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd906143f1565b60405180910390fd5b611acf816120b1565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b455750611b448261254f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c3383610f11565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c8482611b4c565b611cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cba90614483565b60405180910390fd5b6000611cce83610f11565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d3d57508373ffffffffffffffffffffffffffffffffffffffff16611d25846108dd565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d4e5750611d4d8185611934565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d7782610f11565b73ffffffffffffffffffffffffffffffffffffffff1614611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490614515565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e33906145a7565b60405180910390fd5b611e47838383612631565b611e52600082611bc0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ea291906145c7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ef99190613f4b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fb8838383612641565b505050565b80471015612000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff790614647565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161202690614698565b60006040518083038185875af1925050503d8060008114612063576040519150601f19603f3d011682016040523d82523d6000602084013e612068565b606091505b50509050806120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a39061471f565b60405180910390fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612191828260405180602001604052806000815250612646565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa9061478b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122f49190612f5f565b60405180910390a3505050565b61230c848484611d57565b612318848484846126a1565b612357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234e9061481d565b60405180910390fd5b50505050565b6060600e805461236c90613742565b80601f016020809104026020016040519081016040528092919081815260200182805461239890613742565b80156123e55780601f106123ba576101008083540402835291602001916123e5565b820191906000526020600020905b8154815290600101906020018083116123c857829003601f168201915b5050505050905090565b606060008203612436576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061254a565b600082905060005b6000821461246857808061245190613f7f565b915050600a82612461919061486c565b915061243e565b60008167ffffffffffffffff81111561248457612483613321565b5b6040519080825280601f01601f1916602001820160405280156124b65781602001600182028036833780820191505090505b5090505b60008514612543576001826124cf91906145c7565b9150600a856124de919061489d565b60306124ea9190613f4b565b60f81b818381518110612500576124ff613b4b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561253c919061486c565b94506124ba565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061261a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061262a575061262982612828565b5b9050919050565b61263c838383612892565b505050565b505050565b61265083836129a4565b61265d60008484846126a1565b61269c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126939061481d565b60405180910390fd5b505050565b60006126c28473ffffffffffffffffffffffffffffffffffffffff16612b7d565b1561281b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126eb611bb8565b8786866040518563ffffffff1660e01b815260040161270d9493929190614923565b6020604051808303816000875af192505050801561274957506040513d601f19601f820116820180604052508101906127469190614984565b60015b6127cb573d8060008114612779576040519150601f19603f3d011682016040523d82523d6000602084013e61277e565b606091505b5060008151036127c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ba9061481d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612820565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61289d838383612ba0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128df576128da81612ba5565b61291e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461291d5761291c8382612bee565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129605761295b81612d5b565b61299f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461299e5761299d8282612e2c565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0a906149fd565b60405180910390fd5b612a1c81611b4c565b15612a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5390614a69565b60405180910390fd5b612a6860008383612631565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ab89190613f4b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b7960008383612641565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612bfb84610fc2565b612c0591906145c7565b9050600060076000848152602001908152602001600020549050818114612cea576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d6f91906145c7565b9050600060096000848152602001908152602001600020549050600060088381548110612d9f57612d9e613b4b565b5b906000526020600020015490508060088381548110612dc157612dc0613b4b565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e1057612e0f614a89565b5b6001900381819060005260206000200160009055905550505050565b6000612e3783610fc2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ef481612ebf565b8114612eff57600080fd5b50565b600081359050612f1181612eeb565b92915050565b600060208284031215612f2d57612f2c612eb5565b5b6000612f3b84828501612f02565b91505092915050565b60008115159050919050565b612f5981612f44565b82525050565b6000602082019050612f746000830184612f50565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fb4578082015181840152602081019050612f99565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fdc82612f7a565b612fe68185612f85565b9350612ff6818560208601612f96565b612fff81612fc0565b840191505092915050565b600060208201905081810360008301526130248184612fd1565b905092915050565b6000819050919050565b61303f8161302c565b811461304a57600080fd5b50565b60008135905061305c81613036565b92915050565b60006020828403121561307857613077612eb5565b5b60006130868482850161304d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130ba8261308f565b9050919050565b6130ca816130af565b82525050565b60006020820190506130e560008301846130c1565b92915050565b6130f4816130af565b81146130ff57600080fd5b50565b600081359050613111816130eb565b92915050565b6000806040838503121561312e5761312d612eb5565b5b600061313c85828601613102565b925050602061314d8582860161304d565b9150509250929050565b6131608161302c565b82525050565b600060208201905061317b6000830184613157565b92915050565b60008060006060848603121561319a57613199612eb5565b5b60006131a886828701613102565b93505060206131b986828701613102565b92505060406131ca8682870161304d565b9150509250925092565b6000819050919050565b6131e7816131d4565b81146131f257600080fd5b50565b600081359050613204816131de565b92915050565b6000602082840312156132205761321f612eb5565b5b600061322e848285016131f5565b91505092915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61325c81613237565b811461326757600080fd5b50565b60008135905061327981613253565b92915050565b60006020828403121561329557613294612eb5565b5b60006132a38482850161326a565b91505092915050565b60006132b78261308f565b9050919050565b6132c7816132ac565b81146132d257600080fd5b50565b6000813590506132e4816132be565b92915050565b600060208284031215613300576132ff612eb5565b5b600061330e848285016132d5565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61335982612fc0565b810181811067ffffffffffffffff8211171561337857613377613321565b5b80604052505050565b600061338b612eab565b90506133978282613350565b919050565b600067ffffffffffffffff8211156133b7576133b6613321565b5b6133c082612fc0565b9050602081019050919050565b82818337600083830152505050565b60006133ef6133ea8461339c565b613381565b90508281526020810184848401111561340b5761340a61331c565b5b6134168482856133cd565b509392505050565b600082601f83011261343357613432613317565b5b81356134438482602086016133dc565b91505092915050565b60006020828403121561346257613461612eb5565b5b600082013567ffffffffffffffff8111156134805761347f612eba565b5b61348c8482850161341e565b91505092915050565b6000602082840312156134ab576134aa612eb5565b5b60006134b984828501613102565b91505092915050565b6134cb81613237565b82525050565b60006020820190506134e660008301846134c2565b92915050565b6134f581612f44565b811461350057600080fd5b50565b600081359050613512816134ec565b92915050565b6000806040838503121561352f5761352e612eb5565b5b600061353d85828601613102565b925050602061354e85828601613503565b9150509250929050565b613561816131d4565b82525050565b600060208201905061357c6000830184613558565b92915050565b600067ffffffffffffffff82111561359d5761359c613321565b5b6135a682612fc0565b9050602081019050919050565b60006135c66135c184613582565b613381565b9050828152602081018484840111156135e2576135e161331c565b5b6135ed8482856133cd565b509392505050565b600082601f83011261360a57613609613317565b5b813561361a8482602086016135b3565b91505092915050565b6000806000806080858703121561363d5761363c612eb5565b5b600061364b87828801613102565b945050602061365c87828801613102565b935050604061366d8782880161304d565b925050606085013567ffffffffffffffff81111561368e5761368d612eba565b5b61369a878288016135f5565b91505092959194509250565b6000602082840312156136bc576136bb612eb5565b5b60006136ca84828501613503565b91505092915050565b600080604083850312156136ea576136e9612eb5565b5b60006136f885828601613102565b925050602061370985828601613102565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061375a57607f821691505b60208210810361376d5761376c613713565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006137cf602c83612f85565b91506137da82613773565b604082019050919050565b600060208201905081810360008301526137fe816137c2565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613861602183612f85565b915061386c82613805565b604082019050919050565b6000602082019050818103600083015261389081613854565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006138f3603883612f85565b91506138fe82613897565b604082019050919050565b60006020820190508181036000830152613922816138e6565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613985603183612f85565b915061399082613929565b604082019050919050565b600060208201905081810360008301526139b481613978565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139f1602083612f85565b91506139fc826139bb565b602082019050919050565b60006020820190508181036000830152613a20816139e4565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613a83602b83612f85565b9150613a8e82613a27565b604082019050919050565b60006020820190508181036000830152613ab281613a76565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613b15602c83612f85565b9150613b2082613ab9565b604082019050919050565b60006020820190508181036000830152613b4481613b08565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613bdc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613b9f565b613be68683613b9f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613c23613c1e613c198461302c565b613bfe565b61302c565b9050919050565b6000819050919050565b613c3d83613c08565b613c51613c4982613c2a565b848454613bac565b825550505050565b600090565b613c66613c59565b613c71818484613c34565b505050565b5b81811015613c9557613c8a600082613c5e565b600181019050613c77565b5050565b601f821115613cda57613cab81613b7a565b613cb484613b8f565b81016020851015613cc3578190505b613cd7613ccf85613b8f565b830182613c76565b50505b505050565b600082821c905092915050565b6000613cfd60001984600802613cdf565b1980831691505092915050565b6000613d168383613cec565b9150826002028217905092915050565b613d2f82612f7a565b67ffffffffffffffff811115613d4857613d47613321565b5b613d528254613742565b613d5d828285613c99565b600060209050601f831160018114613d905760008415613d7e578287015190505b613d888582613d0a565b865550613df0565b601f198416613d9e86613b7a565b60005b82811015613dc657848901518255600182019150602085019450602081019050613da1565b86831015613de35784890151613ddf601f891682613cec565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613e54602983612f85565b9150613e5f82613df8565b604082019050919050565b60006020820190508181036000830152613e8381613e47565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613ee6602a83612f85565b9150613ef182613e8a565b604082019050919050565b60006020820190508181036000830152613f1581613ed9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f568261302c565b9150613f618361302c565b9250828201905080821115613f7957613f78613f1c565b5b92915050565b6000613f8a8261302c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613fbc57613fbb613f1c565b5b600182019050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000614023602283612f85565b915061402e82613fc7565b604082019050919050565b6000602082019050818103600083015261405281614016565b9050919050565b60008151905061406881613036565b92915050565b60006020828403121561408457614083612eb5565b5b600061409284828501614059565b91505092915050565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b60006140d1601b83612f85565b91506140dc8261409b565b602082019050919050565b60006020820190508181036000830152614100816140c4565b9050919050565b7f4578636565646564206d617820737570706c7900000000000000000000000000600082015250565b600061413d601383612f85565b915061414882614107565b602082019050919050565b6000602082019050818103600083015261416c81614130565b9050919050565b7f4578636565646564206d6178206f776e65727368697000000000000000000000600082015250565b60006141a9601683612f85565b91506141b482614173565b602082019050919050565b600060208201905081810360008301526141d88161419c565b9050919050565b60006141ea8261302c565b91506141f58361302c565b92508282026142038161302c565b9150828204841483151761421a57614219613f1c565b5b5092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614257601f83612f85565b915061426282614221565b602082019050919050565b600060208201905081810360008301526142868161424a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142e9602f83612f85565b91506142f48261428d565b604082019050919050565b60006020820190508181036000830152614318816142dc565b9050919050565b600081905092915050565b600061433582612f7a565b61433f818561431f565b935061434f818560208601612f96565b80840191505092915050565b6000614367828561432a565b9150614373828461432a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143db602683612f85565b91506143e68261437f565b604082019050919050565b6000602082019050818103600083015261440a816143ce565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061446d602c83612f85565b915061447882614411565b604082019050919050565b6000602082019050818103600083015261449c81614460565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006144ff602583612f85565b915061450a826144a3565b604082019050919050565b6000602082019050818103600083015261452e816144f2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614591602483612f85565b915061459c82614535565b604082019050919050565b600060208201905081810360008301526145c081614584565b9050919050565b60006145d28261302c565b91506145dd8361302c565b92508282039050818111156145f5576145f4613f1c565b5b92915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614631601d83612f85565b915061463c826145fb565b602082019050919050565b6000602082019050818103600083015261466081614624565b9050919050565b600081905092915050565b50565b6000614682600083614667565b915061468d82614672565b600082019050919050565b60006146a382614675565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614709603a83612f85565b9150614714826146ad565b604082019050919050565b60006020820190508181036000830152614738816146fc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614775601983612f85565b91506147808261473f565b602082019050919050565b600060208201905081810360008301526147a481614768565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614807603283612f85565b9150614812826147ab565b604082019050919050565b60006020820190508181036000830152614836816147fa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148778261302c565b91506148828361302c565b9250826148925761489161483d565b5b828204905092915050565b60006148a88261302c565b91506148b38361302c565b9250826148c3576148c261483d565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006148f5826148ce565b6148ff81856148d9565b935061490f818560208601612f96565b61491881612fc0565b840191505092915050565b600060808201905061493860008301876130c1565b61494560208301866130c1565b6149526040830185613157565b818103606083015261496481846148ea565b905095945050505050565b60008151905061497e81612eeb565b92915050565b60006020828403121561499a57614999612eb5565b5b60006149a88482850161496f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006149e7602083612f85565b91506149f2826149b1565b602082019050919050565b60006020820190508181036000830152614a16816149da565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614a53601c83612f85565b9150614a5e82614a1d565b602082019050919050565b60006020820190508181036000830152614a8281614a46565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122080f3eee3cc102aa54c0dddf4fc5ad99514fe743d83af83b513c138f29f55bd4a64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102045760003560e01c806371201f1e11610118578063b88d4fde116100a0578063dbfe781f1161006f578063dbfe781f14610754578063e45be8eb1461077d578063e985e9c5146107a8578063eb8d2444146107e5578063f2fde38b1461081057610204565b8063b88d4fde1461069a578063c4e37095146106c3578063c87b56dd146106ec578063d5abeb011461072957610204565b80638da5cb5b116100e75780638da5cb5b146105d457806395d89b41146105ff578063a0712d681461062a578063a22cb46514610646578063a44512611461066f57610204565b806371201f1e14610540578063715018a61461056b578063819b25ba146105825780638ac068a2146105ab57610204565b806342842e0e1161019b57806355f804b31161016a57806355f804b3146104495780635b8cb145146104725780635ea8cd121461049d5780636352211e146104c657806370a082311461050357610204565b806342842e0e146103915780634de5b4ec146103ba5780634f6ccce7146103e357806351cff8d91461042057610204565b806318160ddd116101d757806318160ddd146102d757806323b872dd146103025780632b9af4f01461032b5780632f745c591461035457610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612f17565b610839565b60405161023d9190612f5f565b60405180910390f35b34801561025257600080fd5b5061025b61084b565b604051610268919061300a565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613062565b6108dd565b6040516102a591906130d0565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613117565b610962565b005b3480156102e357600080fd5b506102ec610a79565b6040516102f99190613166565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190613181565b610a86565b005b34801561033757600080fd5b50610352600480360381019061034d919061320a565b610ae6565b005b34801561036057600080fd5b5061037b60048036038101906103769190613117565b610b6c565b6040516103889190613166565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190613181565b610c11565b005b3480156103c657600080fd5b506103e160048036038101906103dc919061327f565b610c31565b005b3480156103ef57600080fd5b5061040a60048036038101906104059190613062565b610ce9565b6040516104179190613166565b60405180910390f35b34801561042c57600080fd5b50610447600480360381019061044291906132ea565b610d5a565b005b34801561045557600080fd5b50610470600480360381019061046b919061344c565b610de9565b005b34801561047e57600080fd5b50610487610e78565b6040516104949190612f5f565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf9190613062565b610e8b565b005b3480156104d257600080fd5b506104ed60048036038101906104e89190613062565b610f11565b6040516104fa91906130d0565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190613495565b610fc2565b6040516105379190613166565b60405180910390f35b34801561054c57600080fd5b50610555611079565b60405161056291906134d1565b60405180910390f35b34801561057757600080fd5b5061058061109b565b005b34801561058e57600080fd5b506105a960048036038101906105a49190613062565b611123565b005b3480156105b757600080fd5b506105d260048036038101906105cd919061327f565b6111e3565b005b3480156105e057600080fd5b506105e961129b565b6040516105f691906130d0565b60405180910390f35b34801561060b57600080fd5b506106146112c5565b604051610621919061300a565b60405180910390f35b610644600480360381019061063f9190613062565b611357565b005b34801561065257600080fd5b5061066d60048036038101906106689190613518565b6116b1565b005b34801561067b57600080fd5b506106846116c7565b6040516106919190613567565b60405180910390f35b3480156106a657600080fd5b506106c160048036038101906106bc9190613623565b6116d1565b005b3480156106cf57600080fd5b506106ea60048036038101906106e591906136a6565b611733565b005b3480156106f857600080fd5b50610713600480360381019061070e9190613062565b6117cc565b604051610720919061300a565b60405180910390f35b34801561073557600080fd5b5061073e611873565b60405161074b91906134d1565b60405180910390f35b34801561076057600080fd5b5061077b600480360381019061077691906136a6565b611895565b005b34801561078957600080fd5b5061079261192e565b60405161079f9190613166565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca91906136d3565b611934565b6040516107dc9190612f5f565b60405180910390f35b3480156107f157600080fd5b506107fa6119c8565b6040516108079190612f5f565b60405180910390f35b34801561081c57600080fd5b5061083760048036038101906108329190613495565b6119db565b005b600061084482611ad2565b9050919050565b60606000805461085a90613742565b80601f016020809104026020016040519081016040528092919081815260200182805461088690613742565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b60006108e882611b4c565b610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e906137e5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096d82610f11565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d490613877565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109fc611bb8565b73ffffffffffffffffffffffffffffffffffffffff161480610a2b5750610a2a81610a25611bb8565b611934565b5b610a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6190613909565b60405180910390fd5b610a748383611bc0565b505050565b6000600880549050905090565b610a97610a91611bb8565b82611c79565b610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd9061399b565b60405180910390fd5b610ae1838383611d57565b505050565b610aee611bb8565b73ffffffffffffffffffffffffffffffffffffffff16610b0c61129b565b73ffffffffffffffffffffffffffffffffffffffff1614610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990613a07565b60405180910390fd5b80600f8190555050565b6000610b7783610fc2565b8210610bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baf90613a99565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c2c838383604051806020016040528060008152506116d1565b505050565b610c39611bb8565b73ffffffffffffffffffffffffffffffffffffffff16610c5761129b565b73ffffffffffffffffffffffffffffffffffffffff1614610cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca490613a07565b60405180910390fd5b80600c60106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b6000610cf3610a79565b8210610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90613b2b565b60405180910390fd5b60088281548110610d4857610d47613b4b565b5b90600052602060002001549050919050565b610d62611bb8565b73ffffffffffffffffffffffffffffffffffffffff16610d8061129b565b73ffffffffffffffffffffffffffffffffffffffff1614610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd90613a07565b60405180910390fd5b6000479050610de58282611fbd565b5050565b610df1611bb8565b73ffffffffffffffffffffffffffffffffffffffff16610e0f61129b565b73ffffffffffffffffffffffffffffffffffffffff1614610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c90613a07565b60405180910390fd5b80600e9081610e749190613d26565b5050565b600b60159054906101000a900460ff1681565b610e93611bb8565b73ffffffffffffffffffffffffffffffffffffffff16610eb161129b565b73ffffffffffffffffffffffffffffffffffffffff1614610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe90613a07565b60405180910390fd5b80600d8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb090613e6a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102990613efc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c60109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6110a3611bb8565b73ffffffffffffffffffffffffffffffffffffffff166110c161129b565b73ffffffffffffffffffffffffffffffffffffffff1614611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110e90613a07565b60405180910390fd5b61112160006120b1565b565b61112b611bb8565b73ffffffffffffffffffffffffffffffffffffffff1661114961129b565b73ffffffffffffffffffffffffffffffffffffffff161461119f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119690613a07565b60405180910390fd5b60006111a9610a79565b905060005b828110156111de576111cb3382846111c69190613f4b565b612177565b80806111d690613f7f565b9150506111ae565b505050565b6111eb611bb8565b73ffffffffffffffffffffffffffffffffffffffff1661120961129b565b73ffffffffffffffffffffffffffffffffffffffff161461125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613a07565b60405180910390fd5b80600c60006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112d490613742565b80601f016020809104026020016040519081016040528092919081815260200182805461130090613742565b801561134d5780601f106113225761010080835404028352916020019161134d565b820191906000526020600020905b81548152906001019060200180831161133057829003601f168201915b5050505050905090565b600b60149054906101000a900460ff166113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d90614039565b60405180910390fd5b6000600b60159054906101000a900460ff16801561145f57506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161141c91906130d0565b602060405180830381865afa158015611439573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145d919061406e565b115b9050600c60109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168211156114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb906140e7565b60405180910390fd5b600c60009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168261150e610a79565b6115189190613f4b565b1115611559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155090614153565b60405180910390fd5b600c60109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168261159433610fc2565b61159e9190613f4b565b11156115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d6906141bf565b60405180910390fd5b80806115f857503482600d546115f591906141df565b11155b611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e9061426d565b60405180910390fd5b60005b828110156116ac57600061164c610a79565b9050600c60009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16611687610a79565b1015611698576116973382612177565b5b5080806116a490613f7f565b91505061163a565b505050565b6116c36116bc611bb8565b8383612195565b5050565b6000600f54905090565b6116e26116dc611bb8565b83611c79565b611721576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117189061399b565b60405180910390fd5b61172d84848484612301565b50505050565b61173b611bb8565b73ffffffffffffffffffffffffffffffffffffffff1661175961129b565b73ffffffffffffffffffffffffffffffffffffffff16146117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690613a07565b60405180910390fd5b80600b60146101000a81548160ff02191690831515021790555050565b60606117d782611b4c565b611816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180d906142ff565b60405180910390fd5b600061182061235d565b90506000815111611840576040518060200160405280600081525061186b565b8061184a846123ef565b60405160200161185b92919061435b565b6040516020818303038152906040525b915050919050565b600c60009054906101000a90046fffffffffffffffffffffffffffffffff1681565b61189d611bb8565b73ffffffffffffffffffffffffffffffffffffffff166118bb61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190890613a07565b60405180910390fd5b80600b60156101000a81548160ff02191690831515021790555050565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60149054906101000a900460ff1681565b6119e3611bb8565b73ffffffffffffffffffffffffffffffffffffffff16611a0161129b565b73ffffffffffffffffffffffffffffffffffffffff1614611a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4e90613a07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd906143f1565b60405180910390fd5b611acf816120b1565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b455750611b448261254f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c3383610f11565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c8482611b4c565b611cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cba90614483565b60405180910390fd5b6000611cce83610f11565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d3d57508373ffffffffffffffffffffffffffffffffffffffff16611d25846108dd565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d4e5750611d4d8185611934565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d7782610f11565b73ffffffffffffffffffffffffffffffffffffffff1614611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490614515565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e33906145a7565b60405180910390fd5b611e47838383612631565b611e52600082611bc0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ea291906145c7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ef99190613f4b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fb8838383612641565b505050565b80471015612000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff790614647565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161202690614698565b60006040518083038185875af1925050503d8060008114612063576040519150601f19603f3d011682016040523d82523d6000602084013e612068565b606091505b50509050806120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a39061471f565b60405180910390fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612191828260405180602001604052806000815250612646565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa9061478b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122f49190612f5f565b60405180910390a3505050565b61230c848484611d57565b612318848484846126a1565b612357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234e9061481d565b60405180910390fd5b50505050565b6060600e805461236c90613742565b80601f016020809104026020016040519081016040528092919081815260200182805461239890613742565b80156123e55780601f106123ba576101008083540402835291602001916123e5565b820191906000526020600020905b8154815290600101906020018083116123c857829003601f168201915b5050505050905090565b606060008203612436576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061254a565b600082905060005b6000821461246857808061245190613f7f565b915050600a82612461919061486c565b915061243e565b60008167ffffffffffffffff81111561248457612483613321565b5b6040519080825280601f01601f1916602001820160405280156124b65781602001600182028036833780820191505090505b5090505b60008514612543576001826124cf91906145c7565b9150600a856124de919061489d565b60306124ea9190613f4b565b60f81b818381518110612500576124ff613b4b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561253c919061486c565b94506124ba565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061261a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061262a575061262982612828565b5b9050919050565b61263c838383612892565b505050565b505050565b61265083836129a4565b61265d60008484846126a1565b61269c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126939061481d565b60405180910390fd5b505050565b60006126c28473ffffffffffffffffffffffffffffffffffffffff16612b7d565b1561281b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126eb611bb8565b8786866040518563ffffffff1660e01b815260040161270d9493929190614923565b6020604051808303816000875af192505050801561274957506040513d601f19601f820116820180604052508101906127469190614984565b60015b6127cb573d8060008114612779576040519150601f19603f3d011682016040523d82523d6000602084013e61277e565b606091505b5060008151036127c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ba9061481d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612820565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61289d838383612ba0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128df576128da81612ba5565b61291e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461291d5761291c8382612bee565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129605761295b81612d5b565b61299f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461299e5761299d8282612e2c565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0a906149fd565b60405180910390fd5b612a1c81611b4c565b15612a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5390614a69565b60405180910390fd5b612a6860008383612631565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ab89190613f4b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b7960008383612641565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612bfb84610fc2565b612c0591906145c7565b9050600060076000848152602001908152602001600020549050818114612cea576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d6f91906145c7565b9050600060096000848152602001908152602001600020549050600060088381548110612d9f57612d9e613b4b565b5b906000526020600020015490508060088381548110612dc157612dc0613b4b565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e1057612e0f614a89565b5b6001900381819060005260206000200160009055905550505050565b6000612e3783610fc2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ef481612ebf565b8114612eff57600080fd5b50565b600081359050612f1181612eeb565b92915050565b600060208284031215612f2d57612f2c612eb5565b5b6000612f3b84828501612f02565b91505092915050565b60008115159050919050565b612f5981612f44565b82525050565b6000602082019050612f746000830184612f50565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fb4578082015181840152602081019050612f99565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fdc82612f7a565b612fe68185612f85565b9350612ff6818560208601612f96565b612fff81612fc0565b840191505092915050565b600060208201905081810360008301526130248184612fd1565b905092915050565b6000819050919050565b61303f8161302c565b811461304a57600080fd5b50565b60008135905061305c81613036565b92915050565b60006020828403121561307857613077612eb5565b5b60006130868482850161304d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130ba8261308f565b9050919050565b6130ca816130af565b82525050565b60006020820190506130e560008301846130c1565b92915050565b6130f4816130af565b81146130ff57600080fd5b50565b600081359050613111816130eb565b92915050565b6000806040838503121561312e5761312d612eb5565b5b600061313c85828601613102565b925050602061314d8582860161304d565b9150509250929050565b6131608161302c565b82525050565b600060208201905061317b6000830184613157565b92915050565b60008060006060848603121561319a57613199612eb5565b5b60006131a886828701613102565b93505060206131b986828701613102565b92505060406131ca8682870161304d565b9150509250925092565b6000819050919050565b6131e7816131d4565b81146131f257600080fd5b50565b600081359050613204816131de565b92915050565b6000602082840312156132205761321f612eb5565b5b600061322e848285016131f5565b91505092915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61325c81613237565b811461326757600080fd5b50565b60008135905061327981613253565b92915050565b60006020828403121561329557613294612eb5565b5b60006132a38482850161326a565b91505092915050565b60006132b78261308f565b9050919050565b6132c7816132ac565b81146132d257600080fd5b50565b6000813590506132e4816132be565b92915050565b600060208284031215613300576132ff612eb5565b5b600061330e848285016132d5565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61335982612fc0565b810181811067ffffffffffffffff8211171561337857613377613321565b5b80604052505050565b600061338b612eab565b90506133978282613350565b919050565b600067ffffffffffffffff8211156133b7576133b6613321565b5b6133c082612fc0565b9050602081019050919050565b82818337600083830152505050565b60006133ef6133ea8461339c565b613381565b90508281526020810184848401111561340b5761340a61331c565b5b6134168482856133cd565b509392505050565b600082601f83011261343357613432613317565b5b81356134438482602086016133dc565b91505092915050565b60006020828403121561346257613461612eb5565b5b600082013567ffffffffffffffff8111156134805761347f612eba565b5b61348c8482850161341e565b91505092915050565b6000602082840312156134ab576134aa612eb5565b5b60006134b984828501613102565b91505092915050565b6134cb81613237565b82525050565b60006020820190506134e660008301846134c2565b92915050565b6134f581612f44565b811461350057600080fd5b50565b600081359050613512816134ec565b92915050565b6000806040838503121561352f5761352e612eb5565b5b600061353d85828601613102565b925050602061354e85828601613503565b9150509250929050565b613561816131d4565b82525050565b600060208201905061357c6000830184613558565b92915050565b600067ffffffffffffffff82111561359d5761359c613321565b5b6135a682612fc0565b9050602081019050919050565b60006135c66135c184613582565b613381565b9050828152602081018484840111156135e2576135e161331c565b5b6135ed8482856133cd565b509392505050565b600082601f83011261360a57613609613317565b5b813561361a8482602086016135b3565b91505092915050565b6000806000806080858703121561363d5761363c612eb5565b5b600061364b87828801613102565b945050602061365c87828801613102565b935050604061366d8782880161304d565b925050606085013567ffffffffffffffff81111561368e5761368d612eba565b5b61369a878288016135f5565b91505092959194509250565b6000602082840312156136bc576136bb612eb5565b5b60006136ca84828501613503565b91505092915050565b600080604083850312156136ea576136e9612eb5565b5b60006136f885828601613102565b925050602061370985828601613102565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061375a57607f821691505b60208210810361376d5761376c613713565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006137cf602c83612f85565b91506137da82613773565b604082019050919050565b600060208201905081810360008301526137fe816137c2565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613861602183612f85565b915061386c82613805565b604082019050919050565b6000602082019050818103600083015261389081613854565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006138f3603883612f85565b91506138fe82613897565b604082019050919050565b60006020820190508181036000830152613922816138e6565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613985603183612f85565b915061399082613929565b604082019050919050565b600060208201905081810360008301526139b481613978565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139f1602083612f85565b91506139fc826139bb565b602082019050919050565b60006020820190508181036000830152613a20816139e4565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613a83602b83612f85565b9150613a8e82613a27565b604082019050919050565b60006020820190508181036000830152613ab281613a76565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613b15602c83612f85565b9150613b2082613ab9565b604082019050919050565b60006020820190508181036000830152613b4481613b08565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613bdc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613b9f565b613be68683613b9f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613c23613c1e613c198461302c565b613bfe565b61302c565b9050919050565b6000819050919050565b613c3d83613c08565b613c51613c4982613c2a565b848454613bac565b825550505050565b600090565b613c66613c59565b613c71818484613c34565b505050565b5b81811015613c9557613c8a600082613c5e565b600181019050613c77565b5050565b601f821115613cda57613cab81613b7a565b613cb484613b8f565b81016020851015613cc3578190505b613cd7613ccf85613b8f565b830182613c76565b50505b505050565b600082821c905092915050565b6000613cfd60001984600802613cdf565b1980831691505092915050565b6000613d168383613cec565b9150826002028217905092915050565b613d2f82612f7a565b67ffffffffffffffff811115613d4857613d47613321565b5b613d528254613742565b613d5d828285613c99565b600060209050601f831160018114613d905760008415613d7e578287015190505b613d888582613d0a565b865550613df0565b601f198416613d9e86613b7a565b60005b82811015613dc657848901518255600182019150602085019450602081019050613da1565b86831015613de35784890151613ddf601f891682613cec565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613e54602983612f85565b9150613e5f82613df8565b604082019050919050565b60006020820190508181036000830152613e8381613e47565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613ee6602a83612f85565b9150613ef182613e8a565b604082019050919050565b60006020820190508181036000830152613f1581613ed9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f568261302c565b9150613f618361302c565b9250828201905080821115613f7957613f78613f1c565b5b92915050565b6000613f8a8261302c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613fbc57613fbb613f1c565b5b600182019050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000614023602283612f85565b915061402e82613fc7565b604082019050919050565b6000602082019050818103600083015261405281614016565b9050919050565b60008151905061406881613036565b92915050565b60006020828403121561408457614083612eb5565b5b600061409284828501614059565b91505092915050565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b60006140d1601b83612f85565b91506140dc8261409b565b602082019050919050565b60006020820190508181036000830152614100816140c4565b9050919050565b7f4578636565646564206d617820737570706c7900000000000000000000000000600082015250565b600061413d601383612f85565b915061414882614107565b602082019050919050565b6000602082019050818103600083015261416c81614130565b9050919050565b7f4578636565646564206d6178206f776e65727368697000000000000000000000600082015250565b60006141a9601683612f85565b91506141b482614173565b602082019050919050565b600060208201905081810360008301526141d88161419c565b9050919050565b60006141ea8261302c565b91506141f58361302c565b92508282026142038161302c565b9150828204841483151761421a57614219613f1c565b5b5092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614257601f83612f85565b915061426282614221565b602082019050919050565b600060208201905081810360008301526142868161424a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142e9602f83612f85565b91506142f48261428d565b604082019050919050565b60006020820190508181036000830152614318816142dc565b9050919050565b600081905092915050565b600061433582612f7a565b61433f818561431f565b935061434f818560208601612f96565b80840191505092915050565b6000614367828561432a565b9150614373828461432a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143db602683612f85565b91506143e68261437f565b604082019050919050565b6000602082019050818103600083015261440a816143ce565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061446d602c83612f85565b915061447882614411565b604082019050919050565b6000602082019050818103600083015261449c81614460565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006144ff602583612f85565b915061450a826144a3565b604082019050919050565b6000602082019050818103600083015261452e816144f2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614591602483612f85565b915061459c82614535565b604082019050919050565b600060208201905081810360008301526145c081614584565b9050919050565b60006145d28261302c565b91506145dd8361302c565b92508282039050818111156145f5576145f4613f1c565b5b92915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614631601d83612f85565b915061463c826145fb565b602082019050919050565b6000602082019050818103600083015261466081614624565b9050919050565b600081905092915050565b50565b6000614682600083614667565b915061468d82614672565b600082019050919050565b60006146a382614675565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614709603a83612f85565b9150614714826146ad565b604082019050919050565b60006020820190508181036000830152614738816146fc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614775601983612f85565b91506147808261473f565b602082019050919050565b600060208201905081810360008301526147a481614768565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614807603283612f85565b9150614812826147ab565b604082019050919050565b60006020820190508181036000830152614836816147fa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148778261302c565b91506148828361302c565b9250826148925761489161483d565b5b828204905092915050565b60006148a88261302c565b91506148b38361302c565b9250826148c3576148c261483d565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006148f5826148ce565b6148ff81856148d9565b935061490f818560208601612f96565b61491881612fc0565b840191505092915050565b600060808201905061493860008301876130c1565b61494560208301866130c1565b6149526040830185613157565b818103606083015261496481846148ea565b905095945050505050565b60008151905061497e81612eeb565b92915050565b60006020828403121561499a57614999612eb5565b5b60006149a88482850161496f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006149e7602083612f85565b91506149f2826149b1565b602082019050919050565b60006020820190508181036000830152614a16816149da565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614a53601c83612f85565b9150614a5e82614a1d565b602082019050919050565b60006020820190508181036000830152614a8281614a46565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122080f3eee3cc102aa54c0dddf4fc5ad99514fe743d83af83b513c138f29f55bd4a64736f6c63430008120033

Deployed Bytecode Sourcemap

45758:3279:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46477:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25167:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26726:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26249:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40075:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27476:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48146:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39743:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27886:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48506:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40265:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48876:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47804:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45954:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48766:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24861:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24591:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46035:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2679:103;;;;;;;;;;;;;:::i;:::-;;48271:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48652:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2028:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25336:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46789:858;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27019:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47655:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28142:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48040:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25511:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45999:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47921:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46080:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27245:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45915:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2937:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46477:179;46588:4;46612:36;46636:11;46612:23;:36::i;:::-;46605:43;;46477:179;;;:::o;25167:100::-;25221:13;25254:5;25247:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25167:100;:::o;26726:221::-;26802:7;26830:16;26838:7;26830;:16::i;:::-;26822:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26915:15;:24;26931:7;26915:24;;;;;;;;;;;;;;;;;;;;;26908:31;;26726:221;;;:::o;26249:411::-;26330:13;26346:23;26361:7;26346:14;:23::i;:::-;26330:39;;26394:5;26388:11;;:2;:11;;;26380:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26488:5;26472:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26497:37;26514:5;26521:12;:10;:12::i;:::-;26497:16;:37::i;:::-;26472:62;26450:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26631:21;26640:2;26644:7;26631:8;:21::i;:::-;26319:341;26249:411;;:::o;40075:113::-;40136:7;40163:10;:17;;;;40156:24;;40075:113;:::o;27476:339::-;27671:41;27690:12;:10;:12::i;:::-;27704:7;27671:18;:41::i;:::-;27663:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27779:28;27789:4;27795:2;27799:7;27779:9;:28::i;:::-;27476:339;;;:::o;48146:117::-;2259:12;:10;:12::i;:::-;2248:23;;:7;:5;:7::i;:::-;:23;;;2240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48248:7:::1;48228:17;:27;;;;48146:117:::0;:::o;39743:256::-;39840:7;39876:23;39893:5;39876:16;:23::i;:::-;39868:5;:31;39860:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39965:12;:19;39978:5;39965:19;;;;;;;;;;;;;;;:26;39985:5;39965:26;;;;;;;;;;;;39958:33;;39743:256;;;;:::o;27886:185::-;28024:39;28041:4;28047:2;28051:7;28024:39;;;;;;;;;;;;:16;:39::i;:::-;27886:185;;;:::o;48506:138::-;2259:12;:10;:12::i;:::-;2248:23;;:7;:5;:7::i;:::-;:23;;;2240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48616:20:::1;48596:17;;:40;;;;;;;;;;;;;;;;;;48506:138:::0;:::o;40265:233::-;40340:7;40376:30;:28;:30::i;:::-;40368:5;:38;40360:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40473:10;40484:5;40473:17;;;;;;;;:::i;:::-;;;;;;;;;;40466:24;;40265:233;;;:::o;48876:156::-;2259:12;:10;:12::i;:::-;2248:23;;:7;:5;:7::i;:::-;:23;;;2240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48944:15:::1;48962:21;48944:39;;48994:30;49012:2;49016:7;48994:17;:30::i;:::-;48933:99;48876:156:::0;:::o;47804:109::-;2259:12;:10;:12::i;:::-;2248:23;;:7;:5;:7::i;:::-;:23;;;2240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47897:8:::1;47878:16;:27;;;;;;:::i;:::-;;47804:109:::0;:::o;45954:36::-;;;;;;;;;;;;;:::o;48766:102::-;2259:12;:10;:12::i;:::-;2248:23;;:7;:5;:7::i;:::-;:23;;;2240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48849:11:::1;48838:8;:22;;;;48766:102:::0;:::o;24861:239::-;24933:7;24953:13;24969:7;:16;24977:7;24969:16;;;;;;;;;;;;;;;;;;;;;24953:32;;25021:1;25004:19;;:5;:19;;;24996:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25087:5;25080:12;;;24861:239;;;:::o;24591:208::-;24663:7;24708:1;24691:19;;:5;:19;;;24683:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24775:9;:16;24785:5;24775:16;;;;;;;;;;;;;;;;24768:23;;24591:208;;;:::o;46035:36::-;;;;;;;;;;;;;:::o;2679:103::-;2259:12;:10;:12::i;:::-;2248:23;;:7;:5;:7::i;:::-;:23;;;2240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2744:30:::1;2771:1;2744:18;:30::i;:::-;2679:103::o:0;48271:227::-;2259:12;:10;:12::i;:::-;2248:23;;:7;:5;:7::i;:::-;:23;;;2240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48339:11:::1;48353:13;:11;:13::i;:::-;48339:27;;48377:6;48394:97;48410:14;48406:1;:18;48394:97;;;48446:33;48456:10;48477:1;48468:6;:10;;;;:::i;:::-;48446:9;:33::i;:::-;48426:3;;;;;:::i;:::-;;;;48394:97;;;48328:170;;48271:227:::0;:::o;48652:106::-;2259:12;:10;:12::i;:::-;2248:23;;:7;:5;:7::i;:::-;:23;;;2240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48738:12:::1;48726:9;;:24;;;;;;;;;;;;;;;;;;48652:106:::0;:::o;2028:87::-;2074:7;2101:6;;;;;;;;;;;2094:13;;2028:87;:::o;25336:104::-;25392:13;25425:7;25418:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25336:104;:::o;46789:858::-;46861:12;;;;;;;;;;;46853:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;46925:14;46942:17;;;;;;;;;;;:88;;;;;47029:1;46977:26;;;;;;;;;;;46963:51;;;47015:10;46963:63;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;46942:88;46925:105;;47069:17;;;;;;;;;;;47051:35;;:14;:35;;47043:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;47171:9;;;;;;;;;;;47137:43;;47153:14;47137:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;47129:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;47265:17;;;;;;;;;;;47223:59;;47247:14;47223:21;47233:10;47223:9;:21::i;:::-;:38;;;;:::i;:::-;:59;;47215:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;47328:9;:53;;;;47371:9;47353:14;47342:8;;:25;;;;:::i;:::-;:38;;47328:53;47320:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;47434:6;47430:210;47450:14;47446:1;:18;47430:210;;;47486:14;47503:13;:11;:13::i;:::-;47486:30;;47551:9;;;;;;;;;;;47535:25;;:13;:11;:13::i;:::-;:25;47531:98;;;47581:32;47591:10;47603:9;47581;:32::i;:::-;47531:98;47471:169;47466:3;;;;;:::i;:::-;;;;47430:210;;;;46842:805;46789:858;:::o;27019:155::-;27114:52;27133:12;:10;:12::i;:::-;27147:8;27157;27114:18;:52::i;:::-;27019:155;;:::o;47655:112::-;47715:7;47742:17;;47735:24;;47655:112;:::o;28142:328::-;28317:41;28336:12;:10;:12::i;:::-;28350:7;28317:18;:41::i;:::-;28309:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28423:39;28437:4;28443:2;28447:7;28456:5;28423:13;:39::i;:::-;28142:328;;;;:::o;48040:98::-;2259:12;:10;:12::i;:::-;2248:23;;:7;:5;:7::i;:::-;:23;;;2240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48122:8:::1;48107:12;;:23;;;;;;;;;;;;;;;;;;48040:98:::0;:::o;25511:334::-;25584:13;25618:16;25626:7;25618;:16::i;:::-;25610:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25699:21;25723:10;:8;:10::i;:::-;25699:34;;25775:1;25757:7;25751:21;:25;:86;;;;;;;;;;;;;;;;;25803:7;25812:18;:7;:16;:18::i;:::-;25786:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25751:86;25744:93;;;25511:334;;;:::o;45999:29::-;;;;;;;;;;;;;:::o;47921:111::-;2259:12;:10;:12::i;:::-;2248:23;;:7;:5;:7::i;:::-;:23;;;2240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48016:8:::1;47996:17;;:28;;;;;;;;;;;;;;;;;;47921:111:::0;:::o;46080:35::-;;;;:::o;27245:164::-;27342:4;27366:18;:25;27385:5;27366:25;;;;;;;;;;;;;;;:35;27392:8;27366:35;;;;;;;;;;;;;;;;;;;;;;;;;27359:42;;27245:164;;;;:::o;45915:32::-;;;;;;;;;;;;;:::o;2937:201::-;2259:12;:10;:12::i;:::-;2248:23;;:7;:5;:7::i;:::-;:23;;;2240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3046:1:::1;3026:22;;:8;:22;;::::0;3018:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3102:28;3121:8;3102:18;:28::i;:::-;2937:201:::0;:::o;39435:224::-;39537:4;39576:35;39561:50;;;:11;:50;;;;:90;;;;39615:36;39639:11;39615:23;:36::i;:::-;39561:90;39554:97;;39435:224;;;:::o;29980:127::-;30045:4;30097:1;30069:30;;:7;:16;30077:7;30069:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30062:37;;29980:127;;;:::o;748:98::-;801:7;828:10;821:17;;748:98;:::o;34126:174::-;34228:2;34201:15;:24;34217:7;34201:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34284:7;34280:2;34246:46;;34255:23;34270:7;34255:14;:23::i;:::-;34246:46;;;;;;;;;;;;34126:174;;:::o;30274:348::-;30367:4;30392:16;30400:7;30392;:16::i;:::-;30384:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30468:13;30484:23;30499:7;30484:14;:23::i;:::-;30468:39;;30537:5;30526:16;;:7;:16;;;:51;;;;30570:7;30546:31;;:20;30558:7;30546:11;:20::i;:::-;:31;;;30526:51;:87;;;;30581:32;30598:5;30605:7;30581:16;:32::i;:::-;30526:87;30518:96;;;30274:348;;;;:::o;33383:625::-;33542:4;33515:31;;:23;33530:7;33515:14;:23::i;:::-;:31;;;33507:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;33621:1;33607:16;;:2;:16;;;33599:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33677:39;33698:4;33704:2;33708:7;33677:20;:39::i;:::-;33781:29;33798:1;33802:7;33781:8;:29::i;:::-;33842:1;33823:9;:15;33833:4;33823:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33871:1;33854:9;:13;33864:2;33854:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33902:2;33883:7;:16;33891:7;33883:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33941:7;33937:2;33922:27;;33931:4;33922:27;;;;;;;;;;;;33962:38;33982:4;33988:2;33992:7;33962:19;:38::i;:::-;33383:625;;;:::o;13639:317::-;13754:6;13729:21;:31;;13721:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13808:12;13826:9;:14;;13848:6;13826:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13807:52;;;13878:7;13870:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;13710:246;13639:317;;:::o;3298:191::-;3372:16;3391:6;;;;;;;;;;;3372:25;;3417:8;3408:6;;:17;;;;;;;;;;;;;;;;;;3472:8;3441:40;;3462:8;3441:40;;;;;;;;;;;;3361:128;3298:191;:::o;30964:110::-;31040:26;31050:2;31054:7;31040:26;;;;;;;;;;;;:9;:26::i;:::-;30964:110;;:::o;34442:315::-;34597:8;34588:17;;:5;:17;;;34580:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34684:8;34646:18;:25;34665:5;34646:25;;;;;;;;;;;;;;;:35;34672:8;34646:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34730:8;34708:41;;34723:5;34708:41;;;34740:8;34708:41;;;;;;:::i;:::-;;;;;;;;34442:315;;;:::o;29352:::-;29509:28;29519:4;29525:2;29529:7;29509:9;:28::i;:::-;29556:48;29579:4;29585:2;29589:7;29598:5;29556:22;:48::i;:::-;29548:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29352:315;;;;:::o;46664:117::-;46724:13;46757:16;46750:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46664:117;:::o;21052:723::-;21108:13;21338:1;21329:5;:10;21325:53;;21356:10;;;;;;;;;;;;;;;;;;;;;21325:53;21388:12;21403:5;21388:20;;21419:14;21444:78;21459:1;21451:4;:9;21444:78;;21477:8;;;;;:::i;:::-;;;;21508:2;21500:10;;;;;:::i;:::-;;;21444:78;;;21532:19;21564:6;21554:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21532:39;;21582:154;21598:1;21589:5;:10;21582:154;;21626:1;21616:11;;;;;:::i;:::-;;;21693:2;21685:5;:10;;;;:::i;:::-;21672:2;:24;;;;:::i;:::-;21659:39;;21642:6;21649;21642:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;21722:2;21713:11;;;;;:::i;:::-;;;21582:154;;;21760:6;21746:21;;;;;21052:723;;;;:::o;24222:305::-;24324:4;24376:25;24361:40;;;:11;:40;;;;:105;;;;24433:33;24418:48;;;:11;:48;;;;24361:105;:158;;;;24483:36;24507:11;24483:23;:36::i;:::-;24361:158;24341:178;;24222:305;;;:::o;46288:181::-;46416:45;46443:4;46449:2;46453:7;46416:26;:45::i;:::-;46288:181;;;:::o;37204:125::-;;;;:::o;31301:321::-;31431:18;31437:2;31441:7;31431:5;:18::i;:::-;31482:54;31513:1;31517:2;31521:7;31530:5;31482:22;:54::i;:::-;31460:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31301:321;;;:::o;35322:799::-;35477:4;35498:15;:2;:13;;;:15::i;:::-;35494:620;;;35550:2;35534:36;;;35571:12;:10;:12::i;:::-;35585:4;35591:7;35600:5;35534:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35530:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35793:1;35776:6;:13;:18;35772:272;;35819:60;;;;;;;;;;:::i;:::-;;;;;;;;35772:272;35994:6;35988:13;35979:6;35975:2;35971:15;35964:38;35530:529;35667:41;;;35657:51;;;:6;:51;;;;35650:58;;;;;35494:620;36098:4;36091:11;;35322:799;;;;;;;:::o;20517:157::-;20602:4;20641:25;20626:40;;;:11;:40;;;;20619:47;;20517:157;;;:::o;41111:589::-;41255:45;41282:4;41288:2;41292:7;41255:26;:45::i;:::-;41333:1;41317:18;;:4;:18;;;41313:187;;41352:40;41384:7;41352:31;:40::i;:::-;41313:187;;;41422:2;41414:10;;:4;:10;;;41410:90;;41441:47;41474:4;41480:7;41441:32;:47::i;:::-;41410:90;41313:187;41528:1;41514:16;;:2;:16;;;41510:183;;41547:45;41584:7;41547:36;:45::i;:::-;41510:183;;;41620:4;41614:10;;:2;:10;;;41610:83;;41641:40;41669:2;41673:7;41641:27;:40::i;:::-;41610:83;41510:183;41111:589;;;:::o;31958:439::-;32052:1;32038:16;;:2;:16;;;32030:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32111:16;32119:7;32111;:16::i;:::-;32110:17;32102:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32173:45;32202:1;32206:2;32210:7;32173:20;:45::i;:::-;32248:1;32231:9;:13;32241:2;32231:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32279:2;32260:7;:16;32268:7;32260:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32324:7;32320:2;32299:33;;32316:1;32299:33;;;;;;;;;;;;32345:44;32373:1;32377:2;32381:7;32345:19;:44::i;:::-;31958:439;;:::o;12378:326::-;12438:4;12695:1;12673:7;:19;;;:23;12666:30;;12378:326;;;:::o;36693:126::-;;;;:::o;42423:164::-;42527:10;:17;;;;42500:15;:24;42516:7;42500:24;;;;;;;;;;;:44;;;;42555:10;42571:7;42555:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42423:164;:::o;43214:988::-;43480:22;43530:1;43505:22;43522:4;43505:16;:22::i;:::-;:26;;;;:::i;:::-;43480:51;;43542:18;43563:17;:26;43581:7;43563:26;;;;;;;;;;;;43542:47;;43710:14;43696:10;:28;43692:328;;43741:19;43763:12;:18;43776:4;43763:18;;;;;;;;;;;;;;;:34;43782:14;43763:34;;;;;;;;;;;;43741:56;;43847:11;43814:12;:18;43827:4;43814:18;;;;;;;;;;;;;;;:30;43833:10;43814:30;;;;;;;;;;;:44;;;;43964:10;43931:17;:30;43949:11;43931:30;;;;;;;;;;;:43;;;;43726:294;43692:328;44116:17;:26;44134:7;44116:26;;;;;;;;;;;44109:33;;;44160:12;:18;44173:4;44160:18;;;;;;;;;;;;;;;:34;44179:14;44160:34;;;;;;;;;;;44153:41;;;43295:907;;43214:988;;:::o;44497:1079::-;44750:22;44795:1;44775:10;:17;;;;:21;;;;:::i;:::-;44750:46;;44807:18;44828:15;:24;44844:7;44828:24;;;;;;;;;;;;44807:45;;45179:19;45201:10;45212:14;45201:26;;;;;;;;:::i;:::-;;;;;;;;;;45179:48;;45265:11;45240:10;45251;45240:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45376:10;45345:15;:28;45361:11;45345:28;;;;;;;;;;;:41;;;;45517:15;:24;45533:7;45517:24;;;;;;;;;;;45510:31;;;45552:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44568:1008;;;44497:1079;:::o;42001:221::-;42086:14;42103:20;42120:2;42103:16;:20::i;:::-;42086:37;;42161:7;42134:12;:16;42147:2;42134:16;;;;;;;;;;;;;;;:24;42151:6;42134:24;;;;;;;;;;;:34;;;;42208:6;42179:17;:26;42197:7;42179:26;;;;;;;;;;;:35;;;;42075:147;42001:221;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:77::-;5904:7;5933:5;5922:16;;5867:77;;;:::o;5950:122::-;6023:24;6041:5;6023:24;:::i;:::-;6016:5;6013:35;6003:63;;6062:1;6059;6052:12;6003:63;5950:122;:::o;6078:139::-;6124:5;6162:6;6149:20;6140:29;;6178:33;6205:5;6178:33;:::i;:::-;6078:139;;;;:::o;6223:329::-;6282:6;6331:2;6319:9;6310:7;6306:23;6302:32;6299:119;;;6337:79;;:::i;:::-;6299:119;6457:1;6482:53;6527:7;6518:6;6507:9;6503:22;6482:53;:::i;:::-;6472:63;;6428:117;6223:329;;;;:::o;6558:118::-;6595:7;6635:34;6628:5;6624:46;6613:57;;6558:118;;;:::o;6682:122::-;6755:24;6773:5;6755:24;:::i;:::-;6748:5;6745:35;6735:63;;6794:1;6791;6784:12;6735:63;6682:122;:::o;6810:139::-;6856:5;6894:6;6881:20;6872:29;;6910:33;6937:5;6910:33;:::i;:::-;6810:139;;;;:::o;6955:329::-;7014:6;7063:2;7051:9;7042:7;7038:23;7034:32;7031:119;;;7069:79;;:::i;:::-;7031:119;7189:1;7214:53;7259:7;7250:6;7239:9;7235:22;7214:53;:::i;:::-;7204:63;;7160:117;6955:329;;;;:::o;7290:104::-;7335:7;7364:24;7382:5;7364:24;:::i;:::-;7353:35;;7290:104;;;:::o;7400:138::-;7481:32;7507:5;7481:32;:::i;:::-;7474:5;7471:43;7461:71;;7528:1;7525;7518:12;7461:71;7400:138;:::o;7544:155::-;7598:5;7636:6;7623:20;7614:29;;7652:41;7687:5;7652:41;:::i;:::-;7544:155;;;;:::o;7705:345::-;7772:6;7821:2;7809:9;7800:7;7796:23;7792:32;7789:119;;;7827:79;;:::i;:::-;7789:119;7947:1;7972:61;8025:7;8016:6;8005:9;8001:22;7972:61;:::i;:::-;7962:71;;7918:125;7705:345;;;;:::o;8056:117::-;8165:1;8162;8155:12;8179:117;8288:1;8285;8278:12;8302:180;8350:77;8347:1;8340:88;8447:4;8444:1;8437:15;8471:4;8468:1;8461:15;8488:281;8571:27;8593:4;8571:27;:::i;:::-;8563:6;8559:40;8701:6;8689:10;8686:22;8665:18;8653:10;8650:34;8647:62;8644:88;;;8712:18;;:::i;:::-;8644:88;8752:10;8748:2;8741:22;8531:238;8488:281;;:::o;8775:129::-;8809:6;8836:20;;:::i;:::-;8826:30;;8865:33;8893:4;8885:6;8865:33;:::i;:::-;8775:129;;;:::o;8910:308::-;8972:4;9062:18;9054:6;9051:30;9048:56;;;9084:18;;:::i;:::-;9048:56;9122:29;9144:6;9122:29;:::i;:::-;9114:37;;9206:4;9200;9196:15;9188:23;;8910:308;;;:::o;9224:146::-;9321:6;9316:3;9311;9298:30;9362:1;9353:6;9348:3;9344:16;9337:27;9224:146;;;:::o;9376:425::-;9454:5;9479:66;9495:49;9537:6;9495:49;:::i;:::-;9479:66;:::i;:::-;9470:75;;9568:6;9561:5;9554:21;9606:4;9599:5;9595:16;9644:3;9635:6;9630:3;9626:16;9623:25;9620:112;;;9651:79;;:::i;:::-;9620:112;9741:54;9788:6;9783:3;9778;9741:54;:::i;:::-;9460:341;9376:425;;;;;:::o;9821:340::-;9877:5;9926:3;9919:4;9911:6;9907:17;9903:27;9893:122;;9934:79;;:::i;:::-;9893:122;10051:6;10038:20;10076:79;10151:3;10143:6;10136:4;10128:6;10124:17;10076:79;:::i;:::-;10067:88;;9883:278;9821:340;;;;:::o;10167:509::-;10236:6;10285:2;10273:9;10264:7;10260:23;10256:32;10253:119;;;10291:79;;:::i;:::-;10253:119;10439:1;10428:9;10424:17;10411:31;10469:18;10461:6;10458:30;10455:117;;;10491:79;;:::i;:::-;10455:117;10596:63;10651:7;10642:6;10631:9;10627:22;10596:63;:::i;:::-;10586:73;;10382:287;10167:509;;;;:::o;10682:329::-;10741:6;10790:2;10778:9;10769:7;10765:23;10761:32;10758:119;;;10796:79;;:::i;:::-;10758:119;10916:1;10941:53;10986:7;10977:6;10966:9;10962:22;10941:53;:::i;:::-;10931:63;;10887:117;10682:329;;;;:::o;11017:118::-;11104:24;11122:5;11104:24;:::i;:::-;11099:3;11092:37;11017:118;;:::o;11141:222::-;11234:4;11272:2;11261:9;11257:18;11249:26;;11285:71;11353:1;11342:9;11338:17;11329:6;11285:71;:::i;:::-;11141:222;;;;:::o;11369:116::-;11439:21;11454:5;11439:21;:::i;:::-;11432:5;11429:32;11419:60;;11475:1;11472;11465:12;11419:60;11369:116;:::o;11491:133::-;11534:5;11572:6;11559:20;11550:29;;11588:30;11612:5;11588:30;:::i;:::-;11491:133;;;;:::o;11630:468::-;11695:6;11703;11752:2;11740:9;11731:7;11727:23;11723:32;11720:119;;;11758:79;;:::i;:::-;11720:119;11878:1;11903:53;11948:7;11939:6;11928:9;11924:22;11903:53;:::i;:::-;11893:63;;11849:117;12005:2;12031:50;12073:7;12064:6;12053:9;12049:22;12031:50;:::i;:::-;12021:60;;11976:115;11630:468;;;;;:::o;12104:118::-;12191:24;12209:5;12191:24;:::i;:::-;12186:3;12179:37;12104:118;;:::o;12228:222::-;12321:4;12359:2;12348:9;12344:18;12336:26;;12372:71;12440:1;12429:9;12425:17;12416:6;12372:71;:::i;:::-;12228:222;;;;:::o;12456:307::-;12517:4;12607:18;12599:6;12596:30;12593:56;;;12629:18;;:::i;:::-;12593:56;12667:29;12689:6;12667:29;:::i;:::-;12659:37;;12751:4;12745;12741:15;12733:23;;12456:307;;;:::o;12769:423::-;12846:5;12871:65;12887:48;12928:6;12887:48;:::i;:::-;12871:65;:::i;:::-;12862:74;;12959:6;12952:5;12945:21;12997:4;12990:5;12986:16;13035:3;13026:6;13021:3;13017:16;13014:25;13011:112;;;13042:79;;:::i;:::-;13011:112;13132:54;13179:6;13174:3;13169;13132:54;:::i;:::-;12852:340;12769:423;;;;;:::o;13211:338::-;13266:5;13315:3;13308:4;13300:6;13296:17;13292:27;13282:122;;13323:79;;:::i;:::-;13282:122;13440:6;13427:20;13465:78;13539:3;13531:6;13524:4;13516:6;13512:17;13465:78;:::i;:::-;13456:87;;13272:277;13211:338;;;;:::o;13555:943::-;13650:6;13658;13666;13674;13723:3;13711:9;13702:7;13698:23;13694:33;13691:120;;;13730:79;;:::i;:::-;13691:120;13850:1;13875:53;13920:7;13911:6;13900:9;13896:22;13875:53;:::i;:::-;13865:63;;13821:117;13977:2;14003:53;14048:7;14039:6;14028:9;14024:22;14003:53;:::i;:::-;13993:63;;13948:118;14105:2;14131:53;14176:7;14167:6;14156:9;14152:22;14131:53;:::i;:::-;14121:63;;14076:118;14261:2;14250:9;14246:18;14233:32;14292:18;14284:6;14281:30;14278:117;;;14314:79;;:::i;:::-;14278:117;14419:62;14473:7;14464:6;14453:9;14449:22;14419:62;:::i;:::-;14409:72;;14204:287;13555:943;;;;;;;:::o;14504:323::-;14560:6;14609:2;14597:9;14588:7;14584:23;14580:32;14577:119;;;14615:79;;:::i;:::-;14577:119;14735:1;14760:50;14802:7;14793:6;14782:9;14778:22;14760:50;:::i;:::-;14750:60;;14706:114;14504:323;;;;:::o;14833:474::-;14901:6;14909;14958:2;14946:9;14937:7;14933:23;14929:32;14926:119;;;14964:79;;:::i;:::-;14926:119;15084:1;15109:53;15154:7;15145:6;15134:9;15130:22;15109:53;:::i;:::-;15099:63;;15055:117;15211:2;15237:53;15282:7;15273:6;15262:9;15258:22;15237:53;:::i;:::-;15227:63;;15182:118;14833:474;;;;;:::o;15313:180::-;15361:77;15358:1;15351:88;15458:4;15455:1;15448:15;15482:4;15479:1;15472:15;15499:320;15543:6;15580:1;15574:4;15570:12;15560:22;;15627:1;15621:4;15617:12;15648:18;15638:81;;15704:4;15696:6;15692:17;15682:27;;15638:81;15766:2;15758:6;15755:14;15735:18;15732:38;15729:84;;15785:18;;:::i;:::-;15729:84;15550:269;15499:320;;;:::o;15825:231::-;15965:34;15961:1;15953:6;15949:14;15942:58;16034:14;16029:2;16021:6;16017:15;16010:39;15825:231;:::o;16062:366::-;16204:3;16225:67;16289:2;16284:3;16225:67;:::i;:::-;16218:74;;16301:93;16390:3;16301:93;:::i;:::-;16419:2;16414:3;16410:12;16403:19;;16062:366;;;:::o;16434:419::-;16600:4;16638:2;16627:9;16623:18;16615:26;;16687:9;16681:4;16677:20;16673:1;16662:9;16658:17;16651:47;16715:131;16841:4;16715:131;:::i;:::-;16707:139;;16434:419;;;:::o;16859:220::-;16999:34;16995:1;16987:6;16983:14;16976:58;17068:3;17063:2;17055:6;17051:15;17044:28;16859:220;:::o;17085:366::-;17227:3;17248:67;17312:2;17307:3;17248:67;:::i;:::-;17241:74;;17324:93;17413:3;17324:93;:::i;:::-;17442:2;17437:3;17433:12;17426:19;;17085:366;;;:::o;17457:419::-;17623:4;17661:2;17650:9;17646:18;17638:26;;17710:9;17704:4;17700:20;17696:1;17685:9;17681:17;17674:47;17738:131;17864:4;17738:131;:::i;:::-;17730:139;;17457:419;;;:::o;17882:243::-;18022:34;18018:1;18010:6;18006:14;17999:58;18091:26;18086:2;18078:6;18074:15;18067:51;17882:243;:::o;18131:366::-;18273:3;18294:67;18358:2;18353:3;18294:67;:::i;:::-;18287:74;;18370:93;18459:3;18370:93;:::i;:::-;18488:2;18483:3;18479:12;18472:19;;18131:366;;;:::o;18503:419::-;18669:4;18707:2;18696:9;18692:18;18684:26;;18756:9;18750:4;18746:20;18742:1;18731:9;18727:17;18720:47;18784:131;18910:4;18784:131;:::i;:::-;18776:139;;18503:419;;;:::o;18928:236::-;19068:34;19064:1;19056:6;19052:14;19045:58;19137:19;19132:2;19124:6;19120:15;19113:44;18928:236;:::o;19170:366::-;19312:3;19333:67;19397:2;19392:3;19333:67;:::i;:::-;19326:74;;19409:93;19498:3;19409:93;:::i;:::-;19527:2;19522:3;19518:12;19511:19;;19170:366;;;:::o;19542:419::-;19708:4;19746:2;19735:9;19731:18;19723:26;;19795:9;19789:4;19785:20;19781:1;19770:9;19766:17;19759:47;19823:131;19949:4;19823:131;:::i;:::-;19815:139;;19542:419;;;:::o;19967:182::-;20107:34;20103:1;20095:6;20091:14;20084:58;19967:182;:::o;20155:366::-;20297:3;20318:67;20382:2;20377:3;20318:67;:::i;:::-;20311:74;;20394:93;20483:3;20394:93;:::i;:::-;20512:2;20507:3;20503:12;20496:19;;20155:366;;;:::o;20527:419::-;20693:4;20731:2;20720:9;20716:18;20708:26;;20780:9;20774:4;20770:20;20766:1;20755:9;20751:17;20744:47;20808:131;20934:4;20808:131;:::i;:::-;20800:139;;20527:419;;;:::o;20952:230::-;21092:34;21088:1;21080:6;21076:14;21069:58;21161:13;21156:2;21148:6;21144:15;21137:38;20952:230;:::o;21188:366::-;21330:3;21351:67;21415:2;21410:3;21351:67;:::i;:::-;21344:74;;21427:93;21516:3;21427:93;:::i;:::-;21545:2;21540:3;21536:12;21529:19;;21188:366;;;:::o;21560:419::-;21726:4;21764:2;21753:9;21749:18;21741:26;;21813:9;21807:4;21803:20;21799:1;21788:9;21784:17;21777:47;21841:131;21967:4;21841:131;:::i;:::-;21833:139;;21560:419;;;:::o;21985:231::-;22125:34;22121:1;22113:6;22109:14;22102:58;22194:14;22189:2;22181:6;22177:15;22170:39;21985:231;:::o;22222:366::-;22364:3;22385:67;22449:2;22444:3;22385:67;:::i;:::-;22378:74;;22461:93;22550:3;22461:93;:::i;:::-;22579:2;22574:3;22570:12;22563:19;;22222:366;;;:::o;22594:419::-;22760:4;22798:2;22787:9;22783:18;22775:26;;22847:9;22841:4;22837:20;22833:1;22822:9;22818:17;22811:47;22875:131;23001:4;22875:131;:::i;:::-;22867:139;;22594:419;;;:::o;23019:180::-;23067:77;23064:1;23057:88;23164:4;23161:1;23154:15;23188:4;23185:1;23178:15;23205:141;23254:4;23277:3;23269:11;;23300:3;23297:1;23290:14;23334:4;23331:1;23321:18;23313:26;;23205:141;;;:::o;23352:93::-;23389:6;23436:2;23431;23424:5;23420:14;23416:23;23406:33;;23352:93;;;:::o;23451:107::-;23495:8;23545:5;23539:4;23535:16;23514:37;;23451:107;;;;:::o;23564:393::-;23633:6;23683:1;23671:10;23667:18;23706:97;23736:66;23725:9;23706:97;:::i;:::-;23824:39;23854:8;23843:9;23824:39;:::i;:::-;23812:51;;23896:4;23892:9;23885:5;23881:21;23872:30;;23945:4;23935:8;23931:19;23924:5;23921:30;23911:40;;23640:317;;23564:393;;;;;:::o;23963:60::-;23991:3;24012:5;24005:12;;23963:60;;;:::o;24029:142::-;24079:9;24112:53;24130:34;24139:24;24157:5;24139:24;:::i;:::-;24130:34;:::i;:::-;24112:53;:::i;:::-;24099:66;;24029:142;;;:::o;24177:75::-;24220:3;24241:5;24234:12;;24177:75;;;:::o;24258:269::-;24368:39;24399:7;24368:39;:::i;:::-;24429:91;24478:41;24502:16;24478:41;:::i;:::-;24470:6;24463:4;24457:11;24429:91;:::i;:::-;24423:4;24416:105;24334:193;24258:269;;;:::o;24533:73::-;24578:3;24533:73;:::o;24612:189::-;24689:32;;:::i;:::-;24730:65;24788:6;24780;24774:4;24730:65;:::i;:::-;24665:136;24612:189;;:::o;24807:186::-;24867:120;24884:3;24877:5;24874:14;24867:120;;;24938:39;24975:1;24968:5;24938:39;:::i;:::-;24911:1;24904:5;24900:13;24891:22;;24867:120;;;24807:186;;:::o;24999:543::-;25100:2;25095:3;25092:11;25089:446;;;25134:38;25166:5;25134:38;:::i;:::-;25218:29;25236:10;25218:29;:::i;:::-;25208:8;25204:44;25401:2;25389:10;25386:18;25383:49;;;25422:8;25407:23;;25383:49;25445:80;25501:22;25519:3;25501:22;:::i;:::-;25491:8;25487:37;25474:11;25445:80;:::i;:::-;25104:431;;25089:446;24999:543;;;:::o;25548:117::-;25602:8;25652:5;25646:4;25642:16;25621:37;;25548:117;;;;:::o;25671:169::-;25715:6;25748:51;25796:1;25792:6;25784:5;25781:1;25777:13;25748:51;:::i;:::-;25744:56;25829:4;25823;25819:15;25809:25;;25722:118;25671:169;;;;:::o;25845:295::-;25921:4;26067:29;26092:3;26086:4;26067:29;:::i;:::-;26059:37;;26129:3;26126:1;26122:11;26116:4;26113:21;26105:29;;25845:295;;;;:::o;26145:1395::-;26262:37;26295:3;26262:37;:::i;:::-;26364:18;26356:6;26353:30;26350:56;;;26386:18;;:::i;:::-;26350:56;26430:38;26462:4;26456:11;26430:38;:::i;:::-;26515:67;26575:6;26567;26561:4;26515:67;:::i;:::-;26609:1;26633:4;26620:17;;26665:2;26657:6;26654:14;26682:1;26677:618;;;;27339:1;27356:6;27353:77;;;27405:9;27400:3;27396:19;27390:26;27381:35;;27353:77;27456:67;27516:6;27509:5;27456:67;:::i;:::-;27450:4;27443:81;27312:222;26647:887;;26677:618;26729:4;26725:9;26717:6;26713:22;26763:37;26795:4;26763:37;:::i;:::-;26822:1;26836:208;26850:7;26847:1;26844:14;26836:208;;;26929:9;26924:3;26920:19;26914:26;26906:6;26899:42;26980:1;26972:6;26968:14;26958:24;;27027:2;27016:9;27012:18;26999:31;;26873:4;26870:1;26866:12;26861:17;;26836:208;;;27072:6;27063:7;27060:19;27057:179;;;27130:9;27125:3;27121:19;27115:26;27173:48;27215:4;27207:6;27203:17;27192:9;27173:48;:::i;:::-;27165:6;27158:64;27080:156;27057:179;27282:1;27278;27270:6;27266:14;27262:22;27256:4;27249:36;26684:611;;;26647:887;;26237:1303;;;26145:1395;;:::o;27546:228::-;27686:34;27682:1;27674:6;27670:14;27663:58;27755:11;27750:2;27742:6;27738:15;27731:36;27546:228;:::o;27780:366::-;27922:3;27943:67;28007:2;28002:3;27943:67;:::i;:::-;27936:74;;28019:93;28108:3;28019:93;:::i;:::-;28137:2;28132:3;28128:12;28121:19;;27780:366;;;:::o;28152:419::-;28318:4;28356:2;28345:9;28341:18;28333:26;;28405:9;28399:4;28395:20;28391:1;28380:9;28376:17;28369:47;28433:131;28559:4;28433:131;:::i;:::-;28425:139;;28152:419;;;:::o;28577:229::-;28717:34;28713:1;28705:6;28701:14;28694:58;28786:12;28781:2;28773:6;28769:15;28762:37;28577:229;:::o;28812:366::-;28954:3;28975:67;29039:2;29034:3;28975:67;:::i;:::-;28968:74;;29051:93;29140:3;29051:93;:::i;:::-;29169:2;29164:3;29160:12;29153:19;;28812:366;;;:::o;29184:419::-;29350:4;29388:2;29377:9;29373:18;29365:26;;29437:9;29431:4;29427:20;29423:1;29412:9;29408:17;29401:47;29465:131;29591:4;29465:131;:::i;:::-;29457:139;;29184:419;;;:::o;29609:180::-;29657:77;29654:1;29647:88;29754:4;29751:1;29744:15;29778:4;29775:1;29768:15;29795:191;29835:3;29854:20;29872:1;29854:20;:::i;:::-;29849:25;;29888:20;29906:1;29888:20;:::i;:::-;29883:25;;29931:1;29928;29924:9;29917:16;;29952:3;29949:1;29946:10;29943:36;;;29959:18;;:::i;:::-;29943:36;29795:191;;;;:::o;29992:233::-;30031:3;30054:24;30072:5;30054:24;:::i;:::-;30045:33;;30100:66;30093:5;30090:77;30087:103;;30170:18;;:::i;:::-;30087:103;30217:1;30210:5;30206:13;30199:20;;29992:233;;;:::o;30231:221::-;30371:34;30367:1;30359:6;30355:14;30348:58;30440:4;30435:2;30427:6;30423:15;30416:29;30231:221;:::o;30458:366::-;30600:3;30621:67;30685:2;30680:3;30621:67;:::i;:::-;30614:74;;30697:93;30786:3;30697:93;:::i;:::-;30815:2;30810:3;30806:12;30799:19;;30458:366;;;:::o;30830:419::-;30996:4;31034:2;31023:9;31019:18;31011:26;;31083:9;31077:4;31073:20;31069:1;31058:9;31054:17;31047:47;31111:131;31237:4;31111:131;:::i;:::-;31103:139;;30830:419;;;:::o;31255:143::-;31312:5;31343:6;31337:13;31328:22;;31359:33;31386:5;31359:33;:::i;:::-;31255:143;;;;:::o;31404:351::-;31474:6;31523:2;31511:9;31502:7;31498:23;31494:32;31491:119;;;31529:79;;:::i;:::-;31491:119;31649:1;31674:64;31730:7;31721:6;31710:9;31706:22;31674:64;:::i;:::-;31664:74;;31620:128;31404:351;;;;:::o;31761:177::-;31901:29;31897:1;31889:6;31885:14;31878:53;31761:177;:::o;31944:366::-;32086:3;32107:67;32171:2;32166:3;32107:67;:::i;:::-;32100:74;;32183:93;32272:3;32183:93;:::i;:::-;32301:2;32296:3;32292:12;32285:19;;31944:366;;;:::o;32316:419::-;32482:4;32520:2;32509:9;32505:18;32497:26;;32569:9;32563:4;32559:20;32555:1;32544:9;32540:17;32533:47;32597:131;32723:4;32597:131;:::i;:::-;32589:139;;32316:419;;;:::o;32741:169::-;32881:21;32877:1;32869:6;32865:14;32858:45;32741:169;:::o;32916:366::-;33058:3;33079:67;33143:2;33138:3;33079:67;:::i;:::-;33072:74;;33155:93;33244:3;33155:93;:::i;:::-;33273:2;33268:3;33264:12;33257:19;;32916:366;;;:::o;33288:419::-;33454:4;33492:2;33481:9;33477:18;33469:26;;33541:9;33535:4;33531:20;33527:1;33516:9;33512:17;33505:47;33569:131;33695:4;33569:131;:::i;:::-;33561:139;;33288:419;;;:::o;33713:172::-;33853:24;33849:1;33841:6;33837:14;33830:48;33713:172;:::o;33891:366::-;34033:3;34054:67;34118:2;34113:3;34054:67;:::i;:::-;34047:74;;34130:93;34219:3;34130:93;:::i;:::-;34248:2;34243:3;34239:12;34232:19;;33891:366;;;:::o;34263:419::-;34429:4;34467:2;34456:9;34452:18;34444:26;;34516:9;34510:4;34506:20;34502:1;34491:9;34487:17;34480:47;34544:131;34670:4;34544:131;:::i;:::-;34536:139;;34263:419;;;:::o;34688:410::-;34728:7;34751:20;34769:1;34751:20;:::i;:::-;34746:25;;34785:20;34803:1;34785:20;:::i;:::-;34780:25;;34840:1;34837;34833:9;34862:30;34880:11;34862:30;:::i;:::-;34851:41;;35041:1;35032:7;35028:15;35025:1;35022:22;35002:1;34995:9;34975:83;34952:139;;35071:18;;:::i;:::-;34952:139;34736:362;34688:410;;;;:::o;35104:181::-;35244:33;35240:1;35232:6;35228:14;35221:57;35104:181;:::o;35291:366::-;35433:3;35454:67;35518:2;35513:3;35454:67;:::i;:::-;35447:74;;35530:93;35619:3;35530:93;:::i;:::-;35648:2;35643:3;35639:12;35632:19;;35291:366;;;:::o;35663:419::-;35829:4;35867:2;35856:9;35852:18;35844:26;;35916:9;35910:4;35906:20;35902:1;35891:9;35887:17;35880:47;35944:131;36070:4;35944:131;:::i;:::-;35936:139;;35663:419;;;:::o;36088:234::-;36228:34;36224:1;36216:6;36212:14;36205:58;36297:17;36292:2;36284:6;36280:15;36273:42;36088:234;:::o;36328:366::-;36470:3;36491:67;36555:2;36550:3;36491:67;:::i;:::-;36484:74;;36567:93;36656:3;36567:93;:::i;:::-;36685:2;36680:3;36676:12;36669:19;;36328:366;;;:::o;36700:419::-;36866:4;36904:2;36893:9;36889:18;36881:26;;36953:9;36947:4;36943:20;36939:1;36928:9;36924:17;36917:47;36981:131;37107:4;36981:131;:::i;:::-;36973:139;;36700:419;;;:::o;37125:148::-;37227:11;37264:3;37249:18;;37125:148;;;;:::o;37279:390::-;37385:3;37413:39;37446:5;37413:39;:::i;:::-;37468:89;37550:6;37545:3;37468:89;:::i;:::-;37461:96;;37566:65;37624:6;37619:3;37612:4;37605:5;37601:16;37566:65;:::i;:::-;37656:6;37651:3;37647:16;37640:23;;37389:280;37279:390;;;;:::o;37675:435::-;37855:3;37877:95;37968:3;37959:6;37877:95;:::i;:::-;37870:102;;37989:95;38080:3;38071:6;37989:95;:::i;:::-;37982:102;;38101:3;38094:10;;37675:435;;;;;:::o;38116:225::-;38256:34;38252:1;38244:6;38240:14;38233:58;38325:8;38320:2;38312:6;38308:15;38301:33;38116:225;:::o;38347:366::-;38489:3;38510:67;38574:2;38569:3;38510:67;:::i;:::-;38503:74;;38586:93;38675:3;38586:93;:::i;:::-;38704:2;38699:3;38695:12;38688:19;;38347:366;;;:::o;38719:419::-;38885:4;38923:2;38912:9;38908:18;38900:26;;38972:9;38966:4;38962:20;38958:1;38947:9;38943:17;38936:47;39000:131;39126:4;39000:131;:::i;:::-;38992:139;;38719:419;;;:::o;39144:231::-;39284:34;39280:1;39272:6;39268:14;39261:58;39353:14;39348:2;39340:6;39336:15;39329:39;39144:231;:::o;39381:366::-;39523:3;39544:67;39608:2;39603:3;39544:67;:::i;:::-;39537:74;;39620:93;39709:3;39620:93;:::i;:::-;39738:2;39733:3;39729:12;39722:19;;39381:366;;;:::o;39753:419::-;39919:4;39957:2;39946:9;39942:18;39934:26;;40006:9;40000:4;39996:20;39992:1;39981:9;39977:17;39970:47;40034:131;40160:4;40034:131;:::i;:::-;40026:139;;39753:419;;;:::o;40178:224::-;40318:34;40314:1;40306:6;40302:14;40295:58;40387:7;40382:2;40374:6;40370:15;40363:32;40178:224;:::o;40408:366::-;40550:3;40571:67;40635:2;40630:3;40571:67;:::i;:::-;40564:74;;40647:93;40736:3;40647:93;:::i;:::-;40765:2;40760:3;40756:12;40749:19;;40408:366;;;:::o;40780:419::-;40946:4;40984:2;40973:9;40969:18;40961:26;;41033:9;41027:4;41023:20;41019:1;41008:9;41004:17;40997:47;41061:131;41187:4;41061:131;:::i;:::-;41053:139;;40780:419;;;:::o;41205:223::-;41345:34;41341:1;41333:6;41329:14;41322:58;41414:6;41409:2;41401:6;41397:15;41390:31;41205:223;:::o;41434:366::-;41576:3;41597:67;41661:2;41656:3;41597:67;:::i;:::-;41590:74;;41673:93;41762:3;41673:93;:::i;:::-;41791:2;41786:3;41782:12;41775:19;;41434:366;;;:::o;41806:419::-;41972:4;42010:2;41999:9;41995:18;41987:26;;42059:9;42053:4;42049:20;42045:1;42034:9;42030:17;42023:47;42087:131;42213:4;42087:131;:::i;:::-;42079:139;;41806:419;;;:::o;42231:194::-;42271:4;42291:20;42309:1;42291:20;:::i;:::-;42286:25;;42325:20;42343:1;42325:20;:::i;:::-;42320:25;;42369:1;42366;42362:9;42354:17;;42393:1;42387:4;42384:11;42381:37;;;42398:18;;:::i;:::-;42381:37;42231:194;;;;:::o;42431:179::-;42571:31;42567:1;42559:6;42555:14;42548:55;42431:179;:::o;42616:366::-;42758:3;42779:67;42843:2;42838:3;42779:67;:::i;:::-;42772:74;;42855:93;42944:3;42855:93;:::i;:::-;42973:2;42968:3;42964:12;42957:19;;42616:366;;;:::o;42988:419::-;43154:4;43192:2;43181:9;43177:18;43169:26;;43241:9;43235:4;43231:20;43227:1;43216:9;43212:17;43205:47;43269:131;43395:4;43269:131;:::i;:::-;43261:139;;42988:419;;;:::o;43413:147::-;43514:11;43551:3;43536:18;;43413:147;;;;:::o;43566:114::-;;:::o;43686:398::-;43845:3;43866:83;43947:1;43942:3;43866:83;:::i;:::-;43859:90;;43958:93;44047:3;43958:93;:::i;:::-;44076:1;44071:3;44067:11;44060:18;;43686:398;;;:::o;44090:379::-;44274:3;44296:147;44439:3;44296:147;:::i;:::-;44289:154;;44460:3;44453:10;;44090:379;;;:::o;44475:245::-;44615:34;44611:1;44603:6;44599:14;44592:58;44684:28;44679:2;44671:6;44667:15;44660:53;44475:245;:::o;44726:366::-;44868:3;44889:67;44953:2;44948:3;44889:67;:::i;:::-;44882:74;;44965:93;45054:3;44965:93;:::i;:::-;45083:2;45078:3;45074:12;45067:19;;44726:366;;;:::o;45098:419::-;45264:4;45302:2;45291:9;45287:18;45279:26;;45351:9;45345:4;45341:20;45337:1;45326:9;45322:17;45315:47;45379:131;45505:4;45379:131;:::i;:::-;45371:139;;45098:419;;;:::o;45523:175::-;45663:27;45659:1;45651:6;45647:14;45640:51;45523:175;:::o;45704:366::-;45846:3;45867:67;45931:2;45926:3;45867:67;:::i;:::-;45860:74;;45943:93;46032:3;45943:93;:::i;:::-;46061:2;46056:3;46052:12;46045:19;;45704:366;;;:::o;46076:419::-;46242:4;46280:2;46269:9;46265:18;46257:26;;46329:9;46323:4;46319:20;46315:1;46304:9;46300:17;46293:47;46357:131;46483:4;46357:131;:::i;:::-;46349:139;;46076:419;;;:::o;46501:237::-;46641:34;46637:1;46629:6;46625:14;46618:58;46710:20;46705:2;46697:6;46693:15;46686:45;46501:237;:::o;46744:366::-;46886:3;46907:67;46971:2;46966:3;46907:67;:::i;:::-;46900:74;;46983:93;47072:3;46983:93;:::i;:::-;47101:2;47096:3;47092:12;47085:19;;46744:366;;;:::o;47116:419::-;47282:4;47320:2;47309:9;47305:18;47297:26;;47369:9;47363:4;47359:20;47355:1;47344:9;47340:17;47333:47;47397:131;47523:4;47397:131;:::i;:::-;47389:139;;47116:419;;;:::o;47541:180::-;47589:77;47586:1;47579:88;47686:4;47683:1;47676:15;47710:4;47707:1;47700:15;47727:185;47767:1;47784:20;47802:1;47784:20;:::i;:::-;47779:25;;47818:20;47836:1;47818:20;:::i;:::-;47813:25;;47857:1;47847:35;;47862:18;;:::i;:::-;47847:35;47904:1;47901;47897:9;47892:14;;47727:185;;;;:::o;47918:176::-;47950:1;47967:20;47985:1;47967:20;:::i;:::-;47962:25;;48001:20;48019:1;48001:20;:::i;:::-;47996:25;;48040:1;48030:35;;48045:18;;:::i;:::-;48030:35;48086:1;48083;48079:9;48074:14;;47918:176;;;;:::o;48100:98::-;48151:6;48185:5;48179:12;48169:22;;48100:98;;;:::o;48204:168::-;48287:11;48321:6;48316:3;48309:19;48361:4;48356:3;48352:14;48337:29;;48204:168;;;;:::o;48378:373::-;48464:3;48492:38;48524:5;48492:38;:::i;:::-;48546:70;48609:6;48604:3;48546:70;:::i;:::-;48539:77;;48625:65;48683:6;48678:3;48671:4;48664:5;48660:16;48625:65;:::i;:::-;48715:29;48737:6;48715:29;:::i;:::-;48710:3;48706:39;48699:46;;48468:283;48378:373;;;;:::o;48757:640::-;48952:4;48990:3;48979:9;48975:19;48967:27;;49004:71;49072:1;49061:9;49057:17;49048:6;49004:71;:::i;:::-;49085:72;49153:2;49142:9;49138:18;49129:6;49085:72;:::i;:::-;49167;49235:2;49224:9;49220:18;49211:6;49167:72;:::i;:::-;49286:9;49280:4;49276:20;49271:2;49260:9;49256:18;49249:48;49314:76;49385:4;49376:6;49314:76;:::i;:::-;49306:84;;48757:640;;;;;;;:::o;49403:141::-;49459:5;49490:6;49484:13;49475:22;;49506:32;49532:5;49506:32;:::i;:::-;49403:141;;;;:::o;49550:349::-;49619:6;49668:2;49656:9;49647:7;49643:23;49639:32;49636:119;;;49674:79;;:::i;:::-;49636:119;49794:1;49819:63;49874:7;49865:6;49854:9;49850:22;49819:63;:::i;:::-;49809:73;;49765:127;49550:349;;;;:::o;49905:182::-;50045:34;50041:1;50033:6;50029:14;50022:58;49905:182;:::o;50093:366::-;50235:3;50256:67;50320:2;50315:3;50256:67;:::i;:::-;50249:74;;50332:93;50421:3;50332:93;:::i;:::-;50450:2;50445:3;50441:12;50434:19;;50093:366;;;:::o;50465:419::-;50631:4;50669:2;50658:9;50654:18;50646:26;;50718:9;50712:4;50708:20;50704:1;50693:9;50689:17;50682:47;50746:131;50872:4;50746:131;:::i;:::-;50738:139;;50465:419;;;:::o;50890:178::-;51030:30;51026:1;51018:6;51014:14;51007:54;50890:178;:::o;51074:366::-;51216:3;51237:67;51301:2;51296:3;51237:67;:::i;:::-;51230:74;;51313:93;51402:3;51313:93;:::i;:::-;51431:2;51426:3;51422:12;51415:19;;51074:366;;;:::o;51446:419::-;51612:4;51650:2;51639:9;51635:18;51627:26;;51699:9;51693:4;51689:20;51685:1;51674:9;51670:17;51663:47;51727:131;51853:4;51727:131;:::i;:::-;51719:139;;51446:419;;;:::o;51871:180::-;51919:77;51916:1;51909:88;52016:4;52013:1;52006:15;52040:4;52037:1;52030:15

Swarm Source

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