ETH Price: $2,588.25 (-3.49%)

Token

TUJO (TUJO)
 

Overview

Max Total Supply

536 TUJO

Holders

140

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
4 TUJO
0xbb165400963D64db7e9D89758B4a21ccB2819B00
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Tujo is a series of exploration in a 7x7 grid that uses the movement and scaling of lines to evoke distinct shapes. The algorithm is fully dictated by multiple 4D noises in 3D space displayed in a 2D static image. Irregularities are created to give life to the piece - imitating the human touch.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TUJO

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-14
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

//----------------------------------------\\
//----------------------------------------\\
//     |__   __| |  | |    | |/ __ \      \\
//        | |  | |  | |    | | |  | |     \\
//        | |  | |  | |_   | | |  | |     \\
//        | |  | |__| | |__| | |__| |     \\
//        |_|   \____/ \____/ \____/      \\
//----------------------------------------\\
//----------------------------------------\\

// Project  : TUJO
// Buidler  : Nero One
// Note     : WAGMI


// IERC165.sol

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

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

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


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

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



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

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


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

// ERC721S.sol

pragma solidity ^0.8.10;


abstract contract ERC721S is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    string private _name;
    string private _symbol;
    address[] internal _owners;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;     
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }     
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        uint count = 0;
        uint length = _owners.length;
        for( uint i = 0; i < length; ++i ){
          if( owner == _owners[i] ){
            ++count;
          }
        }
        delete length;
        return count;
    }
    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;
    }
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721S.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);
    }
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    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);
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
    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);
    }     
    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");
    }
	function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }
	function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721S.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }
	function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }
	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"
        );
    }
	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);
        _owners.push(to);

        emit Transfer(address(0), to, tokenId);
    }
	function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721S.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }
	function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721S.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
	function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721S.ownerOf(tokenId), to, tokenId);
    }
	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;
        }
    }
	function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// SafeMath.sol


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Address.sol


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



// ERC721Enum.sol

pragma solidity ^0.8.10;

abstract contract ERC721Enum is ERC721S, IERC721Enumerable {
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721S) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) {
        require(index < ERC721S.balanceOf(owner), "ERC721Enum: owner ioob");
        uint count;
        for( uint i; i < _owners.length; ++i ){
            if( owner == _owners[i] ){
                if( count == index )
                    return i;
                else
                    ++count;
            }
        }
        require(false, "ERC721Enum: owner ioob");
    }
    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        require(0 < ERC721S.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }
    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enum.totalSupply(), "ERC721Enum: global ioob");
        return index;
    }
}

// ReentrancyGuard.sol


pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// PaymentSplitter.sol


pragma solidity ^0.8.0;


/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + _totalReleased;
        uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account];

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] = _released[account] + payment;
        _totalReleased = _totalReleased + payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

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

// 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() {
        _setOwner(_msgSender());
    }

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

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

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

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

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

// TUJO.sol

pragma solidity ^0.8.10;


contract TUJO is ERC721Enum, Ownable, ReentrancyGuard {

	using Strings for uint256;
	string public baseURI;
    string public baseExtension = ".json";
    string public initURI;

	uint256 public constant costPublic = 0.035 ether;

	uint256 public constant maxSupply = 2583;

    uint256 public constant maxFree = 500;  
    uint256 public constant maxNFTPerFree = 10;

    uint256 public constant maxPerTx = 10;

    bool public salePublic = false;
    bool public saleFree = false;
    bool public revealed = false;

    mapping(address => uint256) public freeMintedBalance;
    
		
	constructor() ERC721S("TUJO", "TUJO"){
	    setInitURI("ipfs://QmaK2CnYoQnPmb2FwMfSWXLYu61x7LV5y67q2Jybo2ApLo");
	}

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

	function mintPublic(uint256 _mintAmount) public payable nonReentrant{
		uint256 s = totalSupply();
        require(tx.origin == msg.sender,"Contract is not allowed to mint.");
        require(salePublic, "Public sale is not active. Cannot mint yet!");
		require(_mintAmount > 0, "Cannot mint 0" );
		require(_mintAmount <= maxPerTx, "Cannot mint more than max mint per tx" );
		require(s + _mintAmount <= maxSupply, "Cannot go over supply" );
		require(msg.value >= costPublic * _mintAmount, "Insufficient funds!");
		for (uint256 i = 0; i < _mintAmount; ++i) {
			_safeMint(msg.sender, s + i, "");
		}
        refundIfOver(costPublic * _mintAmount);
		delete s;
	}

    function mintFree(uint256 _mintAmount) public payable nonReentrant{
		uint256 s = totalSupply();
        require(tx.origin == msg.sender,"Contract is not allowed to mint.");
        require(saleFree, "Free mint is not active. Cannot mint yet!");
        uint256 ownerMintedCount = freeMintedBalance[msg.sender];
        require(ownerMintedCount + _mintAmount <= maxNFTPerFree, "max free NFT per address exceeded");
		require(_mintAmount > 0, "Cannot mint 0" );
		require(_mintAmount <= maxPerTx, "Cannot mint more than max mint per tx" );
		require(s + _mintAmount <= maxFree, "All free mints claimed" );
		for (uint256 i = 0; i < _mintAmount; ++i) {
            freeMintedBalance[msg.sender]++;
			_safeMint(msg.sender, s + i, "");
		}
		delete s;
	}
	
	function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
	    require(_exists(tokenId), "ERC721Metadata: Nonexistent token");
	    string memory currentBaseURI = _baseURI();

        if (!revealed) {
            return initURI;
        }

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

	function setBaseURI(string memory _newBaseURI) public onlyOwner {
	    baseURI = _newBaseURI;
	}

    function setInitURI(string memory _initURI) public onlyOwner {
        initURI = _initURI;
    }

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
	    baseExtension = _newBaseExtension;
	}

	function setSalePublic(bool _state) public onlyOwner {
	    salePublic = _state;
	}

    function setSaleFree(bool _state) public onlyOwner {
	    saleFree = _state;
	}

    function setRevealed(bool _state) public onlyOwner {
	    revealed = _state;
	}

    function refundIfOver(uint256 price) private {
        require(msg.value >= price, "Need to send more ETH.");
        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }

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

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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintedBalance","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":"initURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNFTPerFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintFree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintPublic","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":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"salePublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_initURI","type":"string"}],"name":"setInitURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setSaleFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setSalePublic","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":"tokenId","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060089080519060200190620000519291906200034c565b506000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055506000600a60026101000a81548160ff021916908315150217905550348015620000b057600080fd5b506040518060400160405280600481526020017f54554a4f000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f54554a4f000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001359291906200034c565b5080600190805190602001906200014e9291906200034c565b5050506200017162000165620001a960201b60201c565b620001b160201b60201c565b6001600681905550620001a3604051806060016040528060358152602001620050d0603591396200027760201b60201c565b620004e4565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000287620001a960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002ad6200032260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000306576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fd906200045d565b60405180910390fd5b80600990805190602001906200031e9291906200034c565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200035a90620004ae565b90600052602060002090601f0160209004810192826200037e5760008555620003ca565b82601f106200039957805160ff1916838001178555620003ca565b82800160010185558215620003ca579182015b82811115620003c9578251825591602001919060010190620003ac565b5b509050620003d99190620003dd565b5090565b5b80821115620003f8576000816000905550600101620003de565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000445602083620003fc565b915062000452826200040d565b602082019050919050565b60006020820190508181036000830152620004788162000436565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004c757607f821691505b60208210811415620004de57620004dd6200047f565b5b50919050565b614bdc80620004f46000396000f3fe6080604052600436106102465760003560e01c80636c0360eb11610139578063b88d4fde116100b6578063da3ef23f1161007a578063da3ef23f14610878578063e0a80853146108a1578063e985e9c5146108ca578063efd0cbf914610907578063f2fde38b14610923578063f968adbe1461094c57610246565b8063b88d4fde14610793578063c0e17c38146107bc578063c6682862146107e5578063c87b56dd14610810578063d5abeb011461084d57610246565b80638da5cb5b116100fd5780638da5cb5b146106cd57806395d89b41146106f8578063a22cb46514610723578063a3dea7fd1461074c578063a41467331461077757610246565b80636c0360eb146105e857806370a0823114610613578063715018a61461065057806383f32de9146106675780638462151c1461069057610246565b80633bab6856116101c75780634f6ccce71161018b5780634f6ccce7146104ef578063518302271461052c57806355f804b3146105575780636352211e1461058057806363cc1113146105bd57610246565b80633bab68561461043d5780633ccfd60b1461046857806342842e0e14610472578063452df9a51461049b578063485a68a3146104c457610246565b80631edc06781161020e5780631edc06781461034457806320a447941461036f57806323b872dd1461039a578063276cd3a3146103c35780632f745c591461040057610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806318160ddd14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613115565b610977565b60405161027f919061315d565b60405180910390f35b34801561029457600080fd5b5061029d6109f1565b6040516102aa9190613211565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613269565b610a83565b6040516102e791906132d7565b60405180910390f35b3480156102fc57600080fd5b506103176004803603810190610312919061331e565b610b08565b005b34801561032557600080fd5b5061032e610c20565b60405161033b919061336d565b60405180910390f35b34801561035057600080fd5b50610359610c2d565b604051610366919061336d565b60405180910390f35b34801561037b57600080fd5b50610384610c32565b604051610391919061315d565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613388565b610c45565b005b3480156103cf57600080fd5b506103ea60048036038101906103e591906133db565b610ca5565b6040516103f7919061336d565b60405180910390f35b34801561040c57600080fd5b506104276004803603810190610422919061331e565b610cbd565b604051610434919061336d565b60405180910390f35b34801561044957600080fd5b50610452610e06565b60405161045f9190613211565b60405180910390f35b610470610e94565b005b34801561047e57600080fd5b5061049960048036038101906104949190613388565b610f89565b005b3480156104a757600080fd5b506104c260048036038101906104bd919061353d565b610fa9565b005b3480156104d057600080fd5b506104d961103f565b6040516104e6919061336d565b60405180910390f35b3480156104fb57600080fd5b5061051660048036038101906105119190613269565b611045565b604051610523919061336d565b60405180910390f35b34801561053857600080fd5b50610541611098565b60405161054e919061315d565b60405180910390f35b34801561056357600080fd5b5061057e6004803603810190610579919061353d565b6110ab565b005b34801561058c57600080fd5b506105a760048036038101906105a29190613269565b611141565b6040516105b491906132d7565b60405180910390f35b3480156105c957600080fd5b506105d26111fe565b6040516105df919061336d565b60405180910390f35b3480156105f457600080fd5b506105fd611209565b60405161060a9190613211565b60405180910390f35b34801561061f57600080fd5b5061063a600480360381019061063591906133db565b611297565b604051610647919061336d565b60405180910390f35b34801561065c57600080fd5b506106656113bd565b005b34801561067357600080fd5b5061068e600480360381019061068991906135b2565b611445565b005b34801561069c57600080fd5b506106b760048036038101906106b291906133db565b6114de565b6040516106c4919061369d565b60405180910390f35b3480156106d957600080fd5b506106e26115d7565b6040516106ef91906132d7565b60405180910390f35b34801561070457600080fd5b5061070d611601565b60405161071a9190613211565b60405180910390f35b34801561072f57600080fd5b5061074a600480360381019061074591906136bf565b611693565b005b34801561075857600080fd5b50610761611814565b60405161076e919061315d565b60405180910390f35b610791600480360381019061078c9190613269565b611827565b005b34801561079f57600080fd5b506107ba60048036038101906107b591906137a0565b611b50565b005b3480156107c857600080fd5b506107e360048036038101906107de91906135b2565b611bb2565b005b3480156107f157600080fd5b506107fa611c4b565b6040516108079190613211565b60405180910390f35b34801561081c57600080fd5b5061083760048036038101906108329190613269565b611cd9565b6040516108449190613211565b60405180910390f35b34801561085957600080fd5b50610862611e2b565b60405161086f919061336d565b60405180910390f35b34801561088457600080fd5b5061089f600480360381019061089a919061353d565b611e31565b005b3480156108ad57600080fd5b506108c860048036038101906108c391906135b2565b611ec7565b005b3480156108d657600080fd5b506108f160048036038101906108ec9190613823565b611f60565b6040516108fe919061315d565b60405180910390f35b610921600480360381019061091c9190613269565b611ff4565b005b34801561092f57600080fd5b5061094a600480360381019061094591906133db565b6122a4565b005b34801561095857600080fd5b5061096161239c565b60405161096e919061336d565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ea57506109e9826123a1565b5b9050919050565b606060008054610a0090613892565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2c90613892565b8015610a795780601f10610a4e57610100808354040283529160200191610a79565b820191906000526020600020905b815481529060010190602001808311610a5c57829003601f168201915b5050505050905090565b6000610a8e82612483565b610acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac490613936565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b1382611141565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7b906139c8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ba361250b565b73ffffffffffffffffffffffffffffffffffffffff161480610bd25750610bd181610bcc61250b565b611f60565b5b610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0890613a5a565b60405180910390fd5b610c1b8383612513565b505050565b6000600280549050905090565b600a81565b600a60009054906101000a900460ff1681565b610c56610c5061250b565b826125cc565b610c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c90613aec565b60405180910390fd5b610ca08383836126aa565b505050565b600b6020528060005260406000206000915090505481565b6000610cc883611297565b8210610d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0090613b58565b60405180910390fd5b6000805b600280549050811015610dbc5760028181548110610d2e57610d2d613b78565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610dab5783821415610d9e578092505050610e00565b81610da890613bd6565b91505b80610db590613bd6565b9050610d0d565b506000610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590613b58565b60405180910390fd5b505b92915050565b60098054610e1390613892565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3f90613892565b8015610e8c5780601f10610e6157610100808354040283529160200191610e8c565b820191906000526020600020905b815481529060010190602001808311610e6f57829003601f168201915b505050505081565b610e9c61250b565b73ffffffffffffffffffffffffffffffffffffffff16610eba6115d7565b73ffffffffffffffffffffffffffffffffffffffff1614610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0790613c6b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610f3690613cbc565b60006040518083038185875af1925050503d8060008114610f73576040519150601f19603f3d011682016040523d82523d6000602084013e610f78565b606091505b5050905080610f8657600080fd5b50565b610fa483838360405180602001604052806000815250611b50565b505050565b610fb161250b565b73ffffffffffffffffffffffffffffffffffffffff16610fcf6115d7565b73ffffffffffffffffffffffffffffffffffffffff1614611025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101c90613c6b565b60405180910390fd5b806009908051906020019061103b929190613006565b5050565b6101f481565b600061104f610c20565b8210611090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108790613d1d565b60405180910390fd5b819050919050565b600a60029054906101000a900460ff1681565b6110b361250b565b73ffffffffffffffffffffffffffffffffffffffff166110d16115d7565b73ffffffffffffffffffffffffffffffffffffffff1614611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111e90613c6b565b60405180910390fd5b806007908051906020019061113d929190613006565b5050565b6000806002838154811061115857611157613b78565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90613daf565b60405180910390fd5b80915050919050565b667c58508723800081565b6007805461121690613892565b80601f016020809104026020016040519081016040528092919081815260200182805461124290613892565b801561128f5780601f106112645761010080835404028352916020019161128f565b820191906000526020600020905b81548152906001019060200180831161127257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff90613e41565b60405180910390fd5b600080600280549050905060005b818110156113ae576002818154811061133257611331613b78565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561139d578261139a90613bd6565b92505b806113a790613bd6565b9050611316565b50600090508192505050919050565b6113c561250b565b73ffffffffffffffffffffffffffffffffffffffff166113e36115d7565b73ffffffffffffffffffffffffffffffffffffffff1614611439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143090613c6b565b60405180910390fd5b6114436000612863565b565b61144d61250b565b73ffffffffffffffffffffffffffffffffffffffff1661146b6115d7565b73ffffffffffffffffffffffffffffffffffffffff16146114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b890613c6b565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b60606114e982611297565b60001061152b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152290613b58565b60405180910390fd5b600061153683611297565b905060008167ffffffffffffffff81111561155457611553613412565b5b6040519080825280602002602001820160405280156115825781602001602082028036833780820191505090505b50905060005b828110156115cc5761159a8582610cbd565b8282815181106115ad576115ac613b78565b5b60200260200101818152505080806115c490613bd6565b915050611588565b508092505050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461161090613892565b80601f016020809104026020016040519081016040528092919081815260200182805461163c90613892565b80156116895780601f1061165e57610100808354040283529160200191611689565b820191906000526020600020905b81548152906001019060200180831161166c57829003601f168201915b5050505050905090565b61169b61250b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090613ead565b60405180910390fd5b806004600061171661250b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117c361250b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611808919061315d565b60405180910390a35050565b600a60019054906101000a900460ff1681565b6002600654141561186d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186490613f19565b60405180910390fd5b6002600681905550600061187f610c20565b90503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e690613f85565b60405180910390fd5b600a60019054906101000a900460ff1661193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590614017565b60405180910390fd5b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600a83826119909190614037565b11156119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c8906140ff565b60405180910390fd5b60008311611a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b9061416b565b60405180910390fd5b600a831115611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f906141fd565b60405180910390fd5b6101f48383611a679190614037565b1115611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90614269565b60405180910390fd5b60005b83811015611b3e57600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611b0390613bd6565b9190505550611b2d338285611b189190614037565b60405180602001604052806000815250612929565b80611b3790613bd6565b9050611aab565b50600091505050600160068190555050565b611b61611b5b61250b565b836125cc565b611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9790613aec565b60405180910390fd5b611bac84848484612984565b50505050565b611bba61250b565b73ffffffffffffffffffffffffffffffffffffffff16611bd86115d7565b73ffffffffffffffffffffffffffffffffffffffff1614611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590613c6b565b60405180910390fd5b80600a60016101000a81548160ff02191690831515021790555050565b60088054611c5890613892565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8490613892565b8015611cd15780601f10611ca657610100808354040283529160200191611cd1565b820191906000526020600020905b815481529060010190602001808311611cb457829003601f168201915b505050505081565b6060611ce482612483565b611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a906142fb565b60405180910390fd5b6000611d2d6129e0565b9050600a60029054906101000a900460ff16611dd65760098054611d5090613892565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7c90613892565b8015611dc95780601f10611d9e57610100808354040283529160200191611dc9565b820191906000526020600020905b815481529060010190602001808311611dac57829003601f168201915b5050505050915050611e26565b6000815111611df45760405180602001604052806000815250611e22565b80611dfe84612a72565b6008604051602001611e12939291906143eb565b6040516020818303038152906040525b9150505b919050565b610a1781565b611e3961250b565b73ffffffffffffffffffffffffffffffffffffffff16611e576115d7565b73ffffffffffffffffffffffffffffffffffffffff1614611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea490613c6b565b60405180910390fd5b8060089080519060200190611ec3929190613006565b5050565b611ecf61250b565b73ffffffffffffffffffffffffffffffffffffffff16611eed6115d7565b73ffffffffffffffffffffffffffffffffffffffff1614611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90613c6b565b60405180910390fd5b80600a60026101000a81548160ff02191690831515021790555050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6002600654141561203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190613f19565b60405180910390fd5b6002600681905550600061204c610c20565b90503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146120bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b390613f85565b60405180910390fd5b600a60009054906101000a900460ff1661210b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121029061448e565b60405180910390fd5b6000821161214e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121459061416b565b60405180910390fd5b600a821115612192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612189906141fd565b60405180910390fd5b610a1782826121a19190614037565b11156121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d9906144fa565b60405180910390fd5b81667c5850872380006121f5919061451a565b341015612237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222e906145c0565b60405180910390fd5b60005b82811015612278576122673382846122529190614037565b60405180602001604052806000815250612929565b8061227190613bd6565b905061223a565b5061229482667c58508723800061228f919061451a565b612bd3565b6000905050600160068190555050565b6122ac61250b565b73ffffffffffffffffffffffffffffffffffffffff166122ca6115d7565b73ffffffffffffffffffffffffffffffffffffffff1614612320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231790613c6b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238790614652565b60405180910390fd5b61239981612863565b50565b600a81565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061246c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061247c575061247b82612c74565b5b9050919050565b6000600280549050821080156125045750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106124c0576124bf613b78565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661258683611141565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125d782612483565b612616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260d906146e4565b60405180910390fd5b600061262183611141565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061269057508373ffffffffffffffffffffffffffffffffffffffff1661267884610a83565b73ffffffffffffffffffffffffffffffffffffffff16145b806126a157506126a08185611f60565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126ca82611141565b73ffffffffffffffffffffffffffffffffffffffff1614612720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271790614776565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278790614808565b60405180910390fd5b61279b838383612cde565b6127a6600082612513565b81600282815481106127bb576127ba613b78565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129338383612ce3565b6129406000848484612e6b565b61297f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129769061489a565b60405180910390fd5b505050565b61298f8484846126aa565b61299b84848484612e6b565b6129da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d19061489a565b60405180910390fd5b50505050565b6060600780546129ef90613892565b80601f0160208091040260200160405190810160405280929190818152602001828054612a1b90613892565b8015612a685780601f10612a3d57610100808354040283529160200191612a68565b820191906000526020600020905b815481529060010190602001808311612a4b57829003601f168201915b5050505050905090565b60606000821415612aba576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bce565b600082905060005b60008214612aec578080612ad590613bd6565b915050600a82612ae591906148e9565b9150612ac2565b60008167ffffffffffffffff811115612b0857612b07613412565b5b6040519080825280601f01601f191660200182016040528015612b3a5781602001600182028036833780820191505090505b5090505b60008514612bc757600182612b53919061491a565b9150600a85612b62919061494e565b6030612b6e9190614037565b60f81b818381518110612b8457612b83613b78565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bc091906148e9565b9450612b3e565b8093505050505b919050565b80341015612c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0d906149cb565b60405180910390fd5b80341115612c71573373ffffffffffffffffffffffffffffffffffffffff166108fc8234612c44919061491a565b9081150290604051600060405180830381858888f19350505050158015612c6f573d6000803e3d6000fd5b505b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4a90614a37565b60405180910390fd5b612d5c81612483565b15612d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9390614aa3565b60405180910390fd5b612da860008383612cde565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612e8c8473ffffffffffffffffffffffffffffffffffffffff16612ff3565b15612fe6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612eb561250b565b8786866040518563ffffffff1660e01b8152600401612ed79493929190614b18565b6020604051808303816000875af1925050508015612f1357506040513d601f19601f82011682018060405250810190612f109190614b79565b60015b612f96573d8060008114612f43576040519150601f19603f3d011682016040523d82523d6000602084013e612f48565b606091505b50600081511415612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f859061489a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612feb565b600190505b949350505050565b600080823b905060008111915050919050565b82805461301290613892565b90600052602060002090601f016020900481019282613034576000855561307b565b82601f1061304d57805160ff191683800117855561307b565b8280016001018555821561307b579182015b8281111561307a57825182559160200191906001019061305f565b5b509050613088919061308c565b5090565b5b808211156130a557600081600090555060010161308d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130f2816130bd565b81146130fd57600080fd5b50565b60008135905061310f816130e9565b92915050565b60006020828403121561312b5761312a6130b3565b5b600061313984828501613100565b91505092915050565b60008115159050919050565b61315781613142565b82525050565b6000602082019050613172600083018461314e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131b2578082015181840152602081019050613197565b838111156131c1576000848401525b50505050565b6000601f19601f8301169050919050565b60006131e382613178565b6131ed8185613183565b93506131fd818560208601613194565b613206816131c7565b840191505092915050565b6000602082019050818103600083015261322b81846131d8565b905092915050565b6000819050919050565b61324681613233565b811461325157600080fd5b50565b6000813590506132638161323d565b92915050565b60006020828403121561327f5761327e6130b3565b5b600061328d84828501613254565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132c182613296565b9050919050565b6132d1816132b6565b82525050565b60006020820190506132ec60008301846132c8565b92915050565b6132fb816132b6565b811461330657600080fd5b50565b600081359050613318816132f2565b92915050565b60008060408385031215613335576133346130b3565b5b600061334385828601613309565b925050602061335485828601613254565b9150509250929050565b61336781613233565b82525050565b6000602082019050613382600083018461335e565b92915050565b6000806000606084860312156133a1576133a06130b3565b5b60006133af86828701613309565b93505060206133c086828701613309565b92505060406133d186828701613254565b9150509250925092565b6000602082840312156133f1576133f06130b3565b5b60006133ff84828501613309565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344a826131c7565b810181811067ffffffffffffffff8211171561346957613468613412565b5b80604052505050565b600061347c6130a9565b90506134888282613441565b919050565b600067ffffffffffffffff8211156134a8576134a7613412565b5b6134b1826131c7565b9050602081019050919050565b82818337600083830152505050565b60006134e06134db8461348d565b613472565b9050828152602081018484840111156134fc576134fb61340d565b5b6135078482856134be565b509392505050565b600082601f83011261352457613523613408565b5b81356135348482602086016134cd565b91505092915050565b600060208284031215613553576135526130b3565b5b600082013567ffffffffffffffff811115613571576135706130b8565b5b61357d8482850161350f565b91505092915050565b61358f81613142565b811461359a57600080fd5b50565b6000813590506135ac81613586565b92915050565b6000602082840312156135c8576135c76130b3565b5b60006135d68482850161359d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61361481613233565b82525050565b6000613626838361360b565b60208301905092915050565b6000602082019050919050565b600061364a826135df565b61365481856135ea565b935061365f836135fb565b8060005b83811015613690578151613677888261361a565b975061368283613632565b925050600181019050613663565b5085935050505092915050565b600060208201905081810360008301526136b7818461363f565b905092915050565b600080604083850312156136d6576136d56130b3565b5b60006136e485828601613309565b92505060206136f58582860161359d565b9150509250929050565b600067ffffffffffffffff82111561371a57613719613412565b5b613723826131c7565b9050602081019050919050565b600061374361373e846136ff565b613472565b90508281526020810184848401111561375f5761375e61340d565b5b61376a8482856134be565b509392505050565b600082601f83011261378757613786613408565b5b8135613797848260208601613730565b91505092915050565b600080600080608085870312156137ba576137b96130b3565b5b60006137c887828801613309565b94505060206137d987828801613309565b93505060406137ea87828801613254565b925050606085013567ffffffffffffffff81111561380b5761380a6130b8565b5b61381787828801613772565b91505092959194509250565b6000806040838503121561383a576138396130b3565b5b600061384885828601613309565b925050602061385985828601613309565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138aa57607f821691505b602082108114156138be576138bd613863565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613920602c83613183565b915061392b826138c4565b604082019050919050565b6000602082019050818103600083015261394f81613913565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006139b2602183613183565b91506139bd82613956565b604082019050919050565b600060208201905081810360008301526139e1816139a5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613a44603883613183565b9150613a4f826139e8565b604082019050919050565b60006020820190508181036000830152613a7381613a37565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613ad6603183613183565b9150613ae182613a7a565b604082019050919050565b60006020820190508181036000830152613b0581613ac9565b9050919050565b7f455243373231456e756d3a206f776e657220696f6f6200000000000000000000600082015250565b6000613b42601683613183565b9150613b4d82613b0c565b602082019050919050565b60006020820190508181036000830152613b7181613b35565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613be182613233565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c1457613c13613ba7565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c55602083613183565b9150613c6082613c1f565b602082019050919050565b60006020820190508181036000830152613c8481613c48565b9050919050565b600081905092915050565b50565b6000613ca6600083613c8b565b9150613cb182613c96565b600082019050919050565b6000613cc782613c99565b9150819050919050565b7f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000600082015250565b6000613d07601783613183565b9150613d1282613cd1565b602082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613d99602983613183565b9150613da482613d3d565b604082019050919050565b60006020820190508181036000830152613dc881613d8c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613e2b602a83613183565b9150613e3682613dcf565b604082019050919050565b60006020820190508181036000830152613e5a81613e1e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613e97601983613183565b9150613ea282613e61565b602082019050919050565b60006020820190508181036000830152613ec681613e8a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613f03601f83613183565b9150613f0e82613ecd565b602082019050919050565b60006020820190508181036000830152613f3281613ef6565b9050919050565b7f436f6e7472616374206973206e6f7420616c6c6f77656420746f206d696e742e600082015250565b6000613f6f602083613183565b9150613f7a82613f39565b602082019050919050565b60006020820190508181036000830152613f9e81613f62565b9050919050565b7f46726565206d696e74206973206e6f74206163746976652e2043616e6e6f742060008201527f6d696e7420796574210000000000000000000000000000000000000000000000602082015250565b6000614001602983613183565b915061400c82613fa5565b604082019050919050565b6000602082019050818103600083015261403081613ff4565b9050919050565b600061404282613233565b915061404d83613233565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561408257614081613ba7565b5b828201905092915050565b7f6d61782066726565204e4654207065722061646472657373206578636565646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006140e9602183613183565b91506140f48261408d565b604082019050919050565b60006020820190508181036000830152614118816140dc565b9050919050565b7f43616e6e6f74206d696e74203000000000000000000000000000000000000000600082015250565b6000614155600d83613183565b91506141608261411f565b602082019050919050565b6000602082019050818103600083015261418481614148565b9050919050565b7f43616e6e6f74206d696e74206d6f7265207468616e206d6178206d696e74207060008201527f6572207478000000000000000000000000000000000000000000000000000000602082015250565b60006141e7602583613183565b91506141f28261418b565b604082019050919050565b60006020820190508181036000830152614216816141da565b9050919050565b7f416c6c2066726565206d696e747320636c61696d656400000000000000000000600082015250565b6000614253601683613183565b915061425e8261421d565b602082019050919050565b6000602082019050818103600083015261428281614246565b9050919050565b7f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006142e5602183613183565b91506142f082614289565b604082019050919050565b60006020820190508181036000830152614314816142d8565b9050919050565b600081905092915050565b600061433182613178565b61433b818561431b565b935061434b818560208601613194565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461437981613892565b614383818661431b565b9450600182166000811461439e57600181146143af576143e2565b60ff198316865281860193506143e2565b6143b885614357565b60005b838110156143da578154818901526001820191506020810190506143bb565b838801955050505b50505092915050565b60006143f78286614326565b91506144038285614326565b915061440f828461436c565b9150819050949350505050565b7f5075626c69632073616c65206973206e6f74206163746976652e2043616e6e6f60008201527f74206d696e742079657421000000000000000000000000000000000000000000602082015250565b6000614478602b83613183565b91506144838261441c565b604082019050919050565b600060208201905081810360008301526144a78161446b565b9050919050565b7f43616e6e6f7420676f206f76657220737570706c790000000000000000000000600082015250565b60006144e4601583613183565b91506144ef826144ae565b602082019050919050565b60006020820190508181036000830152614513816144d7565b9050919050565b600061452582613233565b915061453083613233565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561456957614568613ba7565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006145aa601383613183565b91506145b582614574565b602082019050919050565b600060208201905081810360008301526145d98161459d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061463c602683613183565b9150614647826145e0565b604082019050919050565b6000602082019050818103600083015261466b8161462f565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006146ce602c83613183565b91506146d982614672565b604082019050919050565b600060208201905081810360008301526146fd816146c1565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614760602983613183565b915061476b82614704565b604082019050919050565b6000602082019050818103600083015261478f81614753565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147f2602483613183565b91506147fd82614796565b604082019050919050565b60006020820190508181036000830152614821816147e5565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614884603283613183565b915061488f82614828565b604082019050919050565b600060208201905081810360008301526148b381614877565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148f482613233565b91506148ff83613233565b92508261490f5761490e6148ba565b5b828204905092915050565b600061492582613233565b915061493083613233565b92508282101561494357614942613ba7565b5b828203905092915050565b600061495982613233565b915061496483613233565b925082614974576149736148ba565b5b828206905092915050565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b60006149b5601683613183565b91506149c08261497f565b602082019050919050565b600060208201905081810360008301526149e4816149a8565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a21602083613183565b9150614a2c826149eb565b602082019050919050565b60006020820190508181036000830152614a5081614a14565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614a8d601c83613183565b9150614a9882614a57565b602082019050919050565b60006020820190508181036000830152614abc81614a80565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614aea82614ac3565b614af48185614ace565b9350614b04818560208601613194565b614b0d816131c7565b840191505092915050565b6000608082019050614b2d60008301876132c8565b614b3a60208301866132c8565b614b47604083018561335e565b8181036060830152614b598184614adf565b905095945050505050565b600081519050614b73816130e9565b92915050565b600060208284031215614b8f57614b8e6130b3565b5b6000614b9d84828501614b64565b9150509291505056fea2646970667358221220da50ad10d9601e99d5fdb8d5bae550cd1a35f9311b2ebdef305988741bd3a12964736f6c634300080b0033697066733a2f2f516d614b32436e596f516e506d623246774d665357584c5975363178374c563579363771324a79626f3241704c6f

Deployed Bytecode

0x6080604052600436106102465760003560e01c80636c0360eb11610139578063b88d4fde116100b6578063da3ef23f1161007a578063da3ef23f14610878578063e0a80853146108a1578063e985e9c5146108ca578063efd0cbf914610907578063f2fde38b14610923578063f968adbe1461094c57610246565b8063b88d4fde14610793578063c0e17c38146107bc578063c6682862146107e5578063c87b56dd14610810578063d5abeb011461084d57610246565b80638da5cb5b116100fd5780638da5cb5b146106cd57806395d89b41146106f8578063a22cb46514610723578063a3dea7fd1461074c578063a41467331461077757610246565b80636c0360eb146105e857806370a0823114610613578063715018a61461065057806383f32de9146106675780638462151c1461069057610246565b80633bab6856116101c75780634f6ccce71161018b5780634f6ccce7146104ef578063518302271461052c57806355f804b3146105575780636352211e1461058057806363cc1113146105bd57610246565b80633bab68561461043d5780633ccfd60b1461046857806342842e0e14610472578063452df9a51461049b578063485a68a3146104c457610246565b80631edc06781161020e5780631edc06781461034457806320a447941461036f57806323b872dd1461039a578063276cd3a3146103c35780632f745c591461040057610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806318160ddd14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613115565b610977565b60405161027f919061315d565b60405180910390f35b34801561029457600080fd5b5061029d6109f1565b6040516102aa9190613211565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613269565b610a83565b6040516102e791906132d7565b60405180910390f35b3480156102fc57600080fd5b506103176004803603810190610312919061331e565b610b08565b005b34801561032557600080fd5b5061032e610c20565b60405161033b919061336d565b60405180910390f35b34801561035057600080fd5b50610359610c2d565b604051610366919061336d565b60405180910390f35b34801561037b57600080fd5b50610384610c32565b604051610391919061315d565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613388565b610c45565b005b3480156103cf57600080fd5b506103ea60048036038101906103e591906133db565b610ca5565b6040516103f7919061336d565b60405180910390f35b34801561040c57600080fd5b506104276004803603810190610422919061331e565b610cbd565b604051610434919061336d565b60405180910390f35b34801561044957600080fd5b50610452610e06565b60405161045f9190613211565b60405180910390f35b610470610e94565b005b34801561047e57600080fd5b5061049960048036038101906104949190613388565b610f89565b005b3480156104a757600080fd5b506104c260048036038101906104bd919061353d565b610fa9565b005b3480156104d057600080fd5b506104d961103f565b6040516104e6919061336d565b60405180910390f35b3480156104fb57600080fd5b5061051660048036038101906105119190613269565b611045565b604051610523919061336d565b60405180910390f35b34801561053857600080fd5b50610541611098565b60405161054e919061315d565b60405180910390f35b34801561056357600080fd5b5061057e6004803603810190610579919061353d565b6110ab565b005b34801561058c57600080fd5b506105a760048036038101906105a29190613269565b611141565b6040516105b491906132d7565b60405180910390f35b3480156105c957600080fd5b506105d26111fe565b6040516105df919061336d565b60405180910390f35b3480156105f457600080fd5b506105fd611209565b60405161060a9190613211565b60405180910390f35b34801561061f57600080fd5b5061063a600480360381019061063591906133db565b611297565b604051610647919061336d565b60405180910390f35b34801561065c57600080fd5b506106656113bd565b005b34801561067357600080fd5b5061068e600480360381019061068991906135b2565b611445565b005b34801561069c57600080fd5b506106b760048036038101906106b291906133db565b6114de565b6040516106c4919061369d565b60405180910390f35b3480156106d957600080fd5b506106e26115d7565b6040516106ef91906132d7565b60405180910390f35b34801561070457600080fd5b5061070d611601565b60405161071a9190613211565b60405180910390f35b34801561072f57600080fd5b5061074a600480360381019061074591906136bf565b611693565b005b34801561075857600080fd5b50610761611814565b60405161076e919061315d565b60405180910390f35b610791600480360381019061078c9190613269565b611827565b005b34801561079f57600080fd5b506107ba60048036038101906107b591906137a0565b611b50565b005b3480156107c857600080fd5b506107e360048036038101906107de91906135b2565b611bb2565b005b3480156107f157600080fd5b506107fa611c4b565b6040516108079190613211565b60405180910390f35b34801561081c57600080fd5b5061083760048036038101906108329190613269565b611cd9565b6040516108449190613211565b60405180910390f35b34801561085957600080fd5b50610862611e2b565b60405161086f919061336d565b60405180910390f35b34801561088457600080fd5b5061089f600480360381019061089a919061353d565b611e31565b005b3480156108ad57600080fd5b506108c860048036038101906108c391906135b2565b611ec7565b005b3480156108d657600080fd5b506108f160048036038101906108ec9190613823565b611f60565b6040516108fe919061315d565b60405180910390f35b610921600480360381019061091c9190613269565b611ff4565b005b34801561092f57600080fd5b5061094a600480360381019061094591906133db565b6122a4565b005b34801561095857600080fd5b5061096161239c565b60405161096e919061336d565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ea57506109e9826123a1565b5b9050919050565b606060008054610a0090613892565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2c90613892565b8015610a795780601f10610a4e57610100808354040283529160200191610a79565b820191906000526020600020905b815481529060010190602001808311610a5c57829003601f168201915b5050505050905090565b6000610a8e82612483565b610acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac490613936565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b1382611141565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7b906139c8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ba361250b565b73ffffffffffffffffffffffffffffffffffffffff161480610bd25750610bd181610bcc61250b565b611f60565b5b610c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0890613a5a565b60405180910390fd5b610c1b8383612513565b505050565b6000600280549050905090565b600a81565b600a60009054906101000a900460ff1681565b610c56610c5061250b565b826125cc565b610c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c90613aec565b60405180910390fd5b610ca08383836126aa565b505050565b600b6020528060005260406000206000915090505481565b6000610cc883611297565b8210610d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0090613b58565b60405180910390fd5b6000805b600280549050811015610dbc5760028181548110610d2e57610d2d613b78565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610dab5783821415610d9e578092505050610e00565b81610da890613bd6565b91505b80610db590613bd6565b9050610d0d565b506000610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590613b58565b60405180910390fd5b505b92915050565b60098054610e1390613892565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3f90613892565b8015610e8c5780601f10610e6157610100808354040283529160200191610e8c565b820191906000526020600020905b815481529060010190602001808311610e6f57829003601f168201915b505050505081565b610e9c61250b565b73ffffffffffffffffffffffffffffffffffffffff16610eba6115d7565b73ffffffffffffffffffffffffffffffffffffffff1614610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0790613c6b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610f3690613cbc565b60006040518083038185875af1925050503d8060008114610f73576040519150601f19603f3d011682016040523d82523d6000602084013e610f78565b606091505b5050905080610f8657600080fd5b50565b610fa483838360405180602001604052806000815250611b50565b505050565b610fb161250b565b73ffffffffffffffffffffffffffffffffffffffff16610fcf6115d7565b73ffffffffffffffffffffffffffffffffffffffff1614611025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101c90613c6b565b60405180910390fd5b806009908051906020019061103b929190613006565b5050565b6101f481565b600061104f610c20565b8210611090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108790613d1d565b60405180910390fd5b819050919050565b600a60029054906101000a900460ff1681565b6110b361250b565b73ffffffffffffffffffffffffffffffffffffffff166110d16115d7565b73ffffffffffffffffffffffffffffffffffffffff1614611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111e90613c6b565b60405180910390fd5b806007908051906020019061113d929190613006565b5050565b6000806002838154811061115857611157613b78565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90613daf565b60405180910390fd5b80915050919050565b667c58508723800081565b6007805461121690613892565b80601f016020809104026020016040519081016040528092919081815260200182805461124290613892565b801561128f5780601f106112645761010080835404028352916020019161128f565b820191906000526020600020905b81548152906001019060200180831161127257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff90613e41565b60405180910390fd5b600080600280549050905060005b818110156113ae576002818154811061133257611331613b78565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561139d578261139a90613bd6565b92505b806113a790613bd6565b9050611316565b50600090508192505050919050565b6113c561250b565b73ffffffffffffffffffffffffffffffffffffffff166113e36115d7565b73ffffffffffffffffffffffffffffffffffffffff1614611439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143090613c6b565b60405180910390fd5b6114436000612863565b565b61144d61250b565b73ffffffffffffffffffffffffffffffffffffffff1661146b6115d7565b73ffffffffffffffffffffffffffffffffffffffff16146114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b890613c6b565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b60606114e982611297565b60001061152b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152290613b58565b60405180910390fd5b600061153683611297565b905060008167ffffffffffffffff81111561155457611553613412565b5b6040519080825280602002602001820160405280156115825781602001602082028036833780820191505090505b50905060005b828110156115cc5761159a8582610cbd565b8282815181106115ad576115ac613b78565b5b60200260200101818152505080806115c490613bd6565b915050611588565b508092505050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461161090613892565b80601f016020809104026020016040519081016040528092919081815260200182805461163c90613892565b80156116895780601f1061165e57610100808354040283529160200191611689565b820191906000526020600020905b81548152906001019060200180831161166c57829003601f168201915b5050505050905090565b61169b61250b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090613ead565b60405180910390fd5b806004600061171661250b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117c361250b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611808919061315d565b60405180910390a35050565b600a60019054906101000a900460ff1681565b6002600654141561186d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186490613f19565b60405180910390fd5b6002600681905550600061187f610c20565b90503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e690613f85565b60405180910390fd5b600a60019054906101000a900460ff1661193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590614017565b60405180910390fd5b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600a83826119909190614037565b11156119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c8906140ff565b60405180910390fd5b60008311611a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b9061416b565b60405180910390fd5b600a831115611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f906141fd565b60405180910390fd5b6101f48383611a679190614037565b1115611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f90614269565b60405180910390fd5b60005b83811015611b3e57600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611b0390613bd6565b9190505550611b2d338285611b189190614037565b60405180602001604052806000815250612929565b80611b3790613bd6565b9050611aab565b50600091505050600160068190555050565b611b61611b5b61250b565b836125cc565b611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9790613aec565b60405180910390fd5b611bac84848484612984565b50505050565b611bba61250b565b73ffffffffffffffffffffffffffffffffffffffff16611bd86115d7565b73ffffffffffffffffffffffffffffffffffffffff1614611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590613c6b565b60405180910390fd5b80600a60016101000a81548160ff02191690831515021790555050565b60088054611c5890613892565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8490613892565b8015611cd15780601f10611ca657610100808354040283529160200191611cd1565b820191906000526020600020905b815481529060010190602001808311611cb457829003601f168201915b505050505081565b6060611ce482612483565b611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a906142fb565b60405180910390fd5b6000611d2d6129e0565b9050600a60029054906101000a900460ff16611dd65760098054611d5090613892565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7c90613892565b8015611dc95780601f10611d9e57610100808354040283529160200191611dc9565b820191906000526020600020905b815481529060010190602001808311611dac57829003601f168201915b5050505050915050611e26565b6000815111611df45760405180602001604052806000815250611e22565b80611dfe84612a72565b6008604051602001611e12939291906143eb565b6040516020818303038152906040525b9150505b919050565b610a1781565b611e3961250b565b73ffffffffffffffffffffffffffffffffffffffff16611e576115d7565b73ffffffffffffffffffffffffffffffffffffffff1614611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea490613c6b565b60405180910390fd5b8060089080519060200190611ec3929190613006565b5050565b611ecf61250b565b73ffffffffffffffffffffffffffffffffffffffff16611eed6115d7565b73ffffffffffffffffffffffffffffffffffffffff1614611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90613c6b565b60405180910390fd5b80600a60026101000a81548160ff02191690831515021790555050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6002600654141561203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190613f19565b60405180910390fd5b6002600681905550600061204c610c20565b90503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146120bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b390613f85565b60405180910390fd5b600a60009054906101000a900460ff1661210b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121029061448e565b60405180910390fd5b6000821161214e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121459061416b565b60405180910390fd5b600a821115612192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612189906141fd565b60405180910390fd5b610a1782826121a19190614037565b11156121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d9906144fa565b60405180910390fd5b81667c5850872380006121f5919061451a565b341015612237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222e906145c0565b60405180910390fd5b60005b82811015612278576122673382846122529190614037565b60405180602001604052806000815250612929565b8061227190613bd6565b905061223a565b5061229482667c58508723800061228f919061451a565b612bd3565b6000905050600160068190555050565b6122ac61250b565b73ffffffffffffffffffffffffffffffffffffffff166122ca6115d7565b73ffffffffffffffffffffffffffffffffffffffff1614612320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231790613c6b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238790614652565b60405180910390fd5b61239981612863565b50565b600a81565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061246c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061247c575061247b82612c74565b5b9050919050565b6000600280549050821080156125045750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106124c0576124bf613b78565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661258683611141565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125d782612483565b612616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260d906146e4565b60405180910390fd5b600061262183611141565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061269057508373ffffffffffffffffffffffffffffffffffffffff1661267884610a83565b73ffffffffffffffffffffffffffffffffffffffff16145b806126a157506126a08185611f60565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126ca82611141565b73ffffffffffffffffffffffffffffffffffffffff1614612720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271790614776565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278790614808565b60405180910390fd5b61279b838383612cde565b6127a6600082612513565b81600282815481106127bb576127ba613b78565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129338383612ce3565b6129406000848484612e6b565b61297f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129769061489a565b60405180910390fd5b505050565b61298f8484846126aa565b61299b84848484612e6b565b6129da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d19061489a565b60405180910390fd5b50505050565b6060600780546129ef90613892565b80601f0160208091040260200160405190810160405280929190818152602001828054612a1b90613892565b8015612a685780601f10612a3d57610100808354040283529160200191612a68565b820191906000526020600020905b815481529060010190602001808311612a4b57829003601f168201915b5050505050905090565b60606000821415612aba576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bce565b600082905060005b60008214612aec578080612ad590613bd6565b915050600a82612ae591906148e9565b9150612ac2565b60008167ffffffffffffffff811115612b0857612b07613412565b5b6040519080825280601f01601f191660200182016040528015612b3a5781602001600182028036833780820191505090505b5090505b60008514612bc757600182612b53919061491a565b9150600a85612b62919061494e565b6030612b6e9190614037565b60f81b818381518110612b8457612b83613b78565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bc091906148e9565b9450612b3e565b8093505050505b919050565b80341015612c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0d906149cb565b60405180910390fd5b80341115612c71573373ffffffffffffffffffffffffffffffffffffffff166108fc8234612c44919061491a565b9081150290604051600060405180830381858888f19350505050158015612c6f573d6000803e3d6000fd5b505b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4a90614a37565b60405180910390fd5b612d5c81612483565b15612d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9390614aa3565b60405180910390fd5b612da860008383612cde565b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612e8c8473ffffffffffffffffffffffffffffffffffffffff16612ff3565b15612fe6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612eb561250b565b8786866040518563ffffffff1660e01b8152600401612ed79493929190614b18565b6020604051808303816000875af1925050508015612f1357506040513d601f19601f82011682018060405250810190612f109190614b79565b60015b612f96573d8060008114612f43576040519150601f19603f3d011682016040523d82523d6000602084013e612f48565b606091505b50600081511415612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f859061489a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612feb565b600190505b949350505050565b600080823b905060008111915050919050565b82805461301290613892565b90600052602060002090601f016020900481019282613034576000855561307b565b82601f1061304d57805160ff191683800117855561307b565b8280016001018555821561307b579182015b8281111561307a57825182559160200191906001019061305f565b5b509050613088919061308c565b5090565b5b808211156130a557600081600090555060010161308d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6130f2816130bd565b81146130fd57600080fd5b50565b60008135905061310f816130e9565b92915050565b60006020828403121561312b5761312a6130b3565b5b600061313984828501613100565b91505092915050565b60008115159050919050565b61315781613142565b82525050565b6000602082019050613172600083018461314e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131b2578082015181840152602081019050613197565b838111156131c1576000848401525b50505050565b6000601f19601f8301169050919050565b60006131e382613178565b6131ed8185613183565b93506131fd818560208601613194565b613206816131c7565b840191505092915050565b6000602082019050818103600083015261322b81846131d8565b905092915050565b6000819050919050565b61324681613233565b811461325157600080fd5b50565b6000813590506132638161323d565b92915050565b60006020828403121561327f5761327e6130b3565b5b600061328d84828501613254565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132c182613296565b9050919050565b6132d1816132b6565b82525050565b60006020820190506132ec60008301846132c8565b92915050565b6132fb816132b6565b811461330657600080fd5b50565b600081359050613318816132f2565b92915050565b60008060408385031215613335576133346130b3565b5b600061334385828601613309565b925050602061335485828601613254565b9150509250929050565b61336781613233565b82525050565b6000602082019050613382600083018461335e565b92915050565b6000806000606084860312156133a1576133a06130b3565b5b60006133af86828701613309565b93505060206133c086828701613309565b92505060406133d186828701613254565b9150509250925092565b6000602082840312156133f1576133f06130b3565b5b60006133ff84828501613309565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344a826131c7565b810181811067ffffffffffffffff8211171561346957613468613412565b5b80604052505050565b600061347c6130a9565b90506134888282613441565b919050565b600067ffffffffffffffff8211156134a8576134a7613412565b5b6134b1826131c7565b9050602081019050919050565b82818337600083830152505050565b60006134e06134db8461348d565b613472565b9050828152602081018484840111156134fc576134fb61340d565b5b6135078482856134be565b509392505050565b600082601f83011261352457613523613408565b5b81356135348482602086016134cd565b91505092915050565b600060208284031215613553576135526130b3565b5b600082013567ffffffffffffffff811115613571576135706130b8565b5b61357d8482850161350f565b91505092915050565b61358f81613142565b811461359a57600080fd5b50565b6000813590506135ac81613586565b92915050565b6000602082840312156135c8576135c76130b3565b5b60006135d68482850161359d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61361481613233565b82525050565b6000613626838361360b565b60208301905092915050565b6000602082019050919050565b600061364a826135df565b61365481856135ea565b935061365f836135fb565b8060005b83811015613690578151613677888261361a565b975061368283613632565b925050600181019050613663565b5085935050505092915050565b600060208201905081810360008301526136b7818461363f565b905092915050565b600080604083850312156136d6576136d56130b3565b5b60006136e485828601613309565b92505060206136f58582860161359d565b9150509250929050565b600067ffffffffffffffff82111561371a57613719613412565b5b613723826131c7565b9050602081019050919050565b600061374361373e846136ff565b613472565b90508281526020810184848401111561375f5761375e61340d565b5b61376a8482856134be565b509392505050565b600082601f83011261378757613786613408565b5b8135613797848260208601613730565b91505092915050565b600080600080608085870312156137ba576137b96130b3565b5b60006137c887828801613309565b94505060206137d987828801613309565b93505060406137ea87828801613254565b925050606085013567ffffffffffffffff81111561380b5761380a6130b8565b5b61381787828801613772565b91505092959194509250565b6000806040838503121561383a576138396130b3565b5b600061384885828601613309565b925050602061385985828601613309565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138aa57607f821691505b602082108114156138be576138bd613863565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613920602c83613183565b915061392b826138c4565b604082019050919050565b6000602082019050818103600083015261394f81613913565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006139b2602183613183565b91506139bd82613956565b604082019050919050565b600060208201905081810360008301526139e1816139a5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613a44603883613183565b9150613a4f826139e8565b604082019050919050565b60006020820190508181036000830152613a7381613a37565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613ad6603183613183565b9150613ae182613a7a565b604082019050919050565b60006020820190508181036000830152613b0581613ac9565b9050919050565b7f455243373231456e756d3a206f776e657220696f6f6200000000000000000000600082015250565b6000613b42601683613183565b9150613b4d82613b0c565b602082019050919050565b60006020820190508181036000830152613b7181613b35565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613be182613233565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c1457613c13613ba7565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c55602083613183565b9150613c6082613c1f565b602082019050919050565b60006020820190508181036000830152613c8481613c48565b9050919050565b600081905092915050565b50565b6000613ca6600083613c8b565b9150613cb182613c96565b600082019050919050565b6000613cc782613c99565b9150819050919050565b7f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000600082015250565b6000613d07601783613183565b9150613d1282613cd1565b602082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613d99602983613183565b9150613da482613d3d565b604082019050919050565b60006020820190508181036000830152613dc881613d8c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613e2b602a83613183565b9150613e3682613dcf565b604082019050919050565b60006020820190508181036000830152613e5a81613e1e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613e97601983613183565b9150613ea282613e61565b602082019050919050565b60006020820190508181036000830152613ec681613e8a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613f03601f83613183565b9150613f0e82613ecd565b602082019050919050565b60006020820190508181036000830152613f3281613ef6565b9050919050565b7f436f6e7472616374206973206e6f7420616c6c6f77656420746f206d696e742e600082015250565b6000613f6f602083613183565b9150613f7a82613f39565b602082019050919050565b60006020820190508181036000830152613f9e81613f62565b9050919050565b7f46726565206d696e74206973206e6f74206163746976652e2043616e6e6f742060008201527f6d696e7420796574210000000000000000000000000000000000000000000000602082015250565b6000614001602983613183565b915061400c82613fa5565b604082019050919050565b6000602082019050818103600083015261403081613ff4565b9050919050565b600061404282613233565b915061404d83613233565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561408257614081613ba7565b5b828201905092915050565b7f6d61782066726565204e4654207065722061646472657373206578636565646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006140e9602183613183565b91506140f48261408d565b604082019050919050565b60006020820190508181036000830152614118816140dc565b9050919050565b7f43616e6e6f74206d696e74203000000000000000000000000000000000000000600082015250565b6000614155600d83613183565b91506141608261411f565b602082019050919050565b6000602082019050818103600083015261418481614148565b9050919050565b7f43616e6e6f74206d696e74206d6f7265207468616e206d6178206d696e74207060008201527f6572207478000000000000000000000000000000000000000000000000000000602082015250565b60006141e7602583613183565b91506141f28261418b565b604082019050919050565b60006020820190508181036000830152614216816141da565b9050919050565b7f416c6c2066726565206d696e747320636c61696d656400000000000000000000600082015250565b6000614253601683613183565b915061425e8261421d565b602082019050919050565b6000602082019050818103600083015261428281614246565b9050919050565b7f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b60006142e5602183613183565b91506142f082614289565b604082019050919050565b60006020820190508181036000830152614314816142d8565b9050919050565b600081905092915050565b600061433182613178565b61433b818561431b565b935061434b818560208601613194565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461437981613892565b614383818661431b565b9450600182166000811461439e57600181146143af576143e2565b60ff198316865281860193506143e2565b6143b885614357565b60005b838110156143da578154818901526001820191506020810190506143bb565b838801955050505b50505092915050565b60006143f78286614326565b91506144038285614326565b915061440f828461436c565b9150819050949350505050565b7f5075626c69632073616c65206973206e6f74206163746976652e2043616e6e6f60008201527f74206d696e742079657421000000000000000000000000000000000000000000602082015250565b6000614478602b83613183565b91506144838261441c565b604082019050919050565b600060208201905081810360008301526144a78161446b565b9050919050565b7f43616e6e6f7420676f206f76657220737570706c790000000000000000000000600082015250565b60006144e4601583613183565b91506144ef826144ae565b602082019050919050565b60006020820190508181036000830152614513816144d7565b9050919050565b600061452582613233565b915061453083613233565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561456957614568613ba7565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006145aa601383613183565b91506145b582614574565b602082019050919050565b600060208201905081810360008301526145d98161459d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061463c602683613183565b9150614647826145e0565b604082019050919050565b6000602082019050818103600083015261466b8161462f565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006146ce602c83613183565b91506146d982614672565b604082019050919050565b600060208201905081810360008301526146fd816146c1565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614760602983613183565b915061476b82614704565b604082019050919050565b6000602082019050818103600083015261478f81614753565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006147f2602483613183565b91506147fd82614796565b604082019050919050565b60006020820190508181036000830152614821816147e5565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614884603283613183565b915061488f82614828565b604082019050919050565b600060208201905081810360008301526148b381614877565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148f482613233565b91506148ff83613233565b92508261490f5761490e6148ba565b5b828204905092915050565b600061492582613233565b915061493083613233565b92508282101561494357614942613ba7565b5b828203905092915050565b600061495982613233565b915061496483613233565b925082614974576149736148ba565b5b828206905092915050565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b60006149b5601683613183565b91506149c08261497f565b602082019050919050565b600060208201905081810360008301526149e4816149a8565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a21602083613183565b9150614a2c826149eb565b602082019050919050565b60006020820190508181036000830152614a5081614a14565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614a8d601c83613183565b9150614a9882614a57565b602082019050919050565b60006020820190508181036000830152614abc81614a80565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614aea82614ac3565b614af48185614ace565b9350614b04818560208601613194565b614b0d816131c7565b840191505092915050565b6000608082019050614b2d60008301876132c8565b614b3a60208301866132c8565b614b47604083018561335e565b8181036060830152614b598184614adf565b905095945050505050565b600081519050614b73816130e9565b92915050565b600060208284031215614b8f57614b8e6130b3565b5b6000614b9d84828501614b64565b9150509291505056fea2646970667358221220da50ad10d9601e99d5fdb8d5bae550cd1a35f9311b2ebdef305988741bd3a12964736f6c634300080b0033

Deployed Bytecode Sourcemap

46237:3709:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32690:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11808:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12442:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12024:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33851:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46574:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46671:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13140:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46780:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32921:500;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46398:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49778:159;;;:::i;:::-;;13485:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49045:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46528:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33967:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46743:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48939:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11563:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46425:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46326:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11143:414;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45563:94;;;;;;;;;;;;;:::i;:::-;;49278:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33427:418;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44912:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11914:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12669:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46708:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47752:765;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13676:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49371:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46354:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48523:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46479:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49151:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49460:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12970:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47066:678;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45812:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46625:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32690:225;32793:4;32832:35;32817:50;;;:11;:50;;;;:90;;;;32871:36;32895:11;32871:23;:36::i;:::-;32817:90;32810:97;;32690:225;;;:::o;11808:100::-;11862:13;11895:5;11888:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11808:100;:::o;12442:221::-;12518:7;12546:16;12554:7;12546;:16::i;:::-;12538:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12631:15;:24;12647:7;12631:24;;;;;;;;;;;;;;;;;;;;;12624:31;;12442:221;;;:::o;12024:412::-;12105:13;12121:24;12137:7;12121:15;:24::i;:::-;12105:40;;12170:5;12164:11;;:2;:11;;;;12156:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;12264:5;12248:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;12273:37;12290:5;12297:12;:10;:12::i;:::-;12273:16;:37::i;:::-;12248:62;12226:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;12407:21;12416:2;12420:7;12407:8;:21::i;:::-;12094:342;12024:412;;:::o;33851:110::-;33912:7;33939;:14;;;;33932:21;;33851:110;:::o;46574:42::-;46614:2;46574:42;:::o;46671:30::-;;;;;;;;;;;;;:::o;13140:339::-;13335:41;13354:12;:10;:12::i;:::-;13368:7;13335:18;:41::i;:::-;13327:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;13443:28;13453:4;13459:2;13463:7;13443:9;:28::i;:::-;13140:339;;;:::o;46780:52::-;;;;;;;;;;;;;;;;;:::o;32921:500::-;33010:15;33054:24;33072:5;33054:17;:24::i;:::-;33046:5;:32;33038:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33116:10;33142:6;33137:226;33154:7;:14;;;;33150:1;:18;33137:226;;;33203:7;33211:1;33203:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33194:19;;:5;:19;;;33190:162;;;33247:5;33238;:14;33234:102;;;33283:1;33276:8;;;;;;33234:102;33329:7;;;;:::i;:::-;;;33190:162;33170:3;;;;:::i;:::-;;;33137:226;;;;33381:5;33373:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;33027:394;32921:500;;;;;:::o;46398:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49778:159::-;45143:12;:10;:12::i;:::-;45132:23;;:7;:5;:7::i;:::-;:23;;;45124:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49832:12:::1;49858:10;49850:24;;49882:21;49850:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49831:77;;;49924:7;49916:16;;;::::0;::::1;;49823:114;49778:159::o:0;13485:185::-;13623:39;13640:4;13646:2;13650:7;13623:39;;;;;;;;;;;;:16;:39::i;:::-;13485:185;;;:::o;49045:98::-;45143:12;:10;:12::i;:::-;45132:23;;:7;:5;:7::i;:::-;:23;;;45124:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49127:8:::1;49117:7;:18;;;;;;;;;;;;:::i;:::-;;49045:98:::0;:::o;46528:37::-;46562:3;46528:37;:::o;33967:194::-;34042:7;34078:24;:22;:24::i;:::-;34070:5;:32;34062:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34148:5;34141:12;;33967:194;;;:::o;46743:28::-;;;;;;;;;;;;;:::o;48939:98::-;45143:12;:10;:12::i;:::-;45132:23;;:7;:5;:7::i;:::-;:23;;;45124:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49021:11:::1;49011:7;:21;;;;;;;;;;;;:::i;:::-;;48939:98:::0;:::o;11563:239::-;11635:7;11655:13;11671:7;11679;11671:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11655:32;;11723:1;11706:19;;:5;:19;;;;11698:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11789:5;11782:12;;;11563:239;;;:::o;46425:48::-;46462:11;46425:48;:::o;46326:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11143:414::-;11215:7;11260:1;11243:19;;:5;:19;;;;11235:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;11320:10;11345:11;11359:7;:14;;;;11345:28;;11389:6;11384:119;11405:6;11401:1;:10;11384:119;;;11444:7;11452:1;11444:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11435:19;;:5;:19;;;11431:61;;;11471:7;;;;:::i;:::-;;;11431:61;11413:3;;;;:::i;:::-;;;11384:119;;;;11513:13;;;11544:5;11537:12;;;;11143:414;;;:::o;45563:94::-;45143:12;:10;:12::i;:::-;45132:23;;:7;:5;:7::i;:::-;:23;;;45124:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45628:21:::1;45646:1;45628:9;:21::i;:::-;45563:94::o:0;49278:85::-;45143:12;:10;:12::i;:::-;45132:23;;:7;:5;:7::i;:::-;:23;;;45124:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49352:6:::1;49339:10;;:19;;;;;;;;;;;;;;;;;;49278:85:::0;:::o;33427:418::-;33486:16;33527:24;33545:5;33527:17;:24::i;:::-;33523:1;:28;33515:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;33589:18;33610:16;33620:5;33610:9;:16::i;:::-;33589:37;;33637:25;33679:10;33665:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33637:53;;33706:9;33701:111;33725:10;33721:1;:14;33701:111;;;33771:29;33791:5;33798:1;33771:19;:29::i;:::-;33757:8;33766:1;33757:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;33737:3;;;;;:::i;:::-;;;;33701:111;;;;33829:8;33822:15;;;;33427:418;;;:::o;44912:87::-;44958:7;44985:6;;;;;;;;;;;44978:13;;44912:87;:::o;11914:104::-;11970:13;12003:7;11996:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11914:104;:::o;12669:295::-;12784:12;:10;:12::i;:::-;12772:24;;:8;:24;;;;12764:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;12884:8;12839:18;:32;12858:12;:10;:12::i;:::-;12839:32;;;;;;;;;;;;;;;:42;12872:8;12839:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;12937:8;12908:48;;12923:12;:10;:12::i;:::-;12908:48;;;12947:8;12908:48;;;;;;:::i;:::-;;;;;;;;12669:295;;:::o;46708:28::-;;;;;;;;;;;;;:::o;47752:765::-;35874:1;36470:7;;:19;;36462:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;35874:1;36603:7;:18;;;;47823:9:::1;47835:13;:11;:13::i;:::-;47823:25;;47880:10;47867:23;;:9;:23;;;47859:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;47945:8;;;;;;;;;;;47937:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48010:24;48037:17;:29;48055:10;48037:29;;;;;;;;;;;;;;;;48010:56;;46614:2;48104:11;48085:16;:30;;;;:::i;:::-;:47;;48077:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;48197:1;48183:11;:15;48175:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;46660:2;48230:11;:23;;48222:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46562:3;48313:11;48309:1;:15;;;;:::i;:::-;:26;;48301:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48373:9;48368:132;48392:11;48388:1;:15;48368:132;;;48425:17;:29;48443:10;48425:29;;;;;;;;;;;;;;;;:31;;;;;;;;;:::i;:::-;;;;;;48462:32;48472:10;48488:1;48484;:5;;;;:::i;:::-;48462:32;;;;;;;;;;;::::0;:9:::1;:32::i;:::-;48405:3;;;;:::i;:::-;;;48368:132;;;;48504:8;;;47818:699;;35830:1:::0;36782:7;:22;;;;47752:765;:::o;13676:328::-;13851:41;13870:12;:10;:12::i;:::-;13884:7;13851:18;:41::i;:::-;13843:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;13957:39;13971:4;13977:2;13981:7;13990:5;13957:13;:39::i;:::-;13676:328;;;;:::o;49371:81::-;45143:12;:10;:12::i;:::-;45132:23;;:7;:5;:7::i;:::-;:23;;;45124:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49441:6:::1;49430:8;;:17;;;;;;;;;;;;;;;;;;49371:81:::0;:::o;46354:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48523:411::-;48596:13;48627:16;48635:7;48627;:16::i;:::-;48619:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48689:28;48720:10;:8;:10::i;:::-;48689:41;;48748:8;;;;;;;;;;;48743:56;;48780:7;48773:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48743:56;48846:1;48821:14;48815:28;:32;:114;;;;;;;;;;;;;;;;;48874:14;48890:18;:7;:16;:18::i;:::-;48909:13;48857:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48815:114;48808:121;;;48523:411;;;;:::o;46479:40::-;46515:4;46479:40;:::o;49151:122::-;45143:12;:10;:12::i;:::-;45132:23;;:7;:5;:7::i;:::-;:23;;;45124:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49251:17:::1;49235:13;:33;;;;;;;;;;;;:::i;:::-;;49151:122:::0;:::o;49460:81::-;45143:12;:10;:12::i;:::-;45132:23;;:7;:5;:7::i;:::-;:23;;;45124:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49530:6:::1;49519:8;;:17;;;;;;;;;;;;;;;;;;49460:81:::0;:::o;12970:164::-;13067:4;13091:18;:25;13110:5;13091:25;;;;;;;;;;;;;;;:35;13117:8;13091:35;;;;;;;;;;;;;;;;;;;;;;;;;13084:42;;12970:164;;;;:::o;47066:678::-;35874:1;36470:7;;:19;;36462:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;35874:1;36603:7;:18;;;;47139:9:::1;47151:13;:11;:13::i;:::-;47139:25;;47196:10;47183:23;;:9;:23;;;47175:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;47261:10;;;;;;;;;;;47253:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47346:1;47332:11;:15;47324:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;46660:2;47379:11;:23;;47371:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46515:4;47462:11;47458:1;:15;;;;:::i;:::-;:28;;47450:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;47552:11;46462;47539:24;;;;:::i;:::-;47526:9;:37;;47518:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;47597:9;47592:86;47616:11;47612:1;:15;47592:86;;;47640:32;47650:10;47666:1;47662;:5;;;;:::i;:::-;47640:32;;;;;;;;;;;::::0;:9:::1;:32::i;:::-;47629:3;;;;:::i;:::-;;;47592:86;;;;47688:38;47714:11;46462;47701:24;;;;:::i;:::-;47688:12;:38::i;:::-;47731:8;;;47134:610;35830:1:::0;36782:7;:22;;;;47066:678;:::o;45812:192::-;45143:12;:10;:12::i;:::-;45132:23;;:7;:5;:7::i;:::-;:23;;;45124:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45921:1:::1;45901:22;;:8;:22;;;;45893:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45977:19;45987:8;45977:9;:19::i;:::-;45812:192:::0;:::o;46625:37::-;46660:2;46625:37;:::o;10832:305::-;10934:4;10986:25;10971:40;;;:11;:40;;;;:105;;;;11043:33;11028:48;;;:11;:48;;;;10971:105;:158;;;;11093:36;11117:11;11093:23;:36::i;:::-;10971:158;10951:178;;10832:305;;;:::o;14333:155::-;14398:4;14432:7;:14;;;;14422:7;:24;:58;;;;;14478:1;14450:30;;:7;14458;14450:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:30;;;;14422:58;14415:65;;14333:155;;;:::o;10103:98::-;10156:7;10183:10;10176:17;;10103:98;:::o;16485:175::-;16587:2;16560:15;:24;16576:7;16560:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;16644:7;16640:2;16605:47;;16614:24;16630:7;16614:15;:24::i;:::-;16605:47;;;;;;;;;;;;16485:175;;:::o;14491:349::-;14584:4;14609:16;14617:7;14609;:16::i;:::-;14601:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14685:13;14701:24;14717:7;14701:15;:24::i;:::-;14685:40;;14755:5;14744:16;;:7;:16;;;:51;;;;14788:7;14764:31;;:20;14776:7;14764:11;:20::i;:::-;:31;;;14744:51;:87;;;;14799:32;14816:5;14823:7;14799:16;:32::i;:::-;14744:87;14736:96;;;14491:349;;;;:::o;15965:517::-;16125:4;16097:32;;:24;16113:7;16097:15;:24::i;:::-;:32;;;16089:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;16208:1;16194:16;;:2;:16;;;;16186:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;16264:39;16285:4;16291:2;16295:7;16264:20;:39::i;:::-;16368:29;16385:1;16389:7;16368:8;:29::i;:::-;16427:2;16408:7;16416;16408:16;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;16466:7;16462:2;16447:27;;16456:4;16447:27;;;;;;;;;;;;15965:517;;;:::o;46012:173::-;46068:16;46087:6;;;;;;;;;;;46068:25;;46113:8;46104:6;;:17;;;;;;;;;;;;;;;;;;46168:8;46137:40;;46158:8;46137:40;;;;;;;;;;;;46057:128;46012:173;:::o;14956:321::-;15086:18;15092:2;15096:7;15086:5;:18::i;:::-;15137:54;15168:1;15172:2;15176:7;15185:5;15137:22;:54::i;:::-;15115:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;14956:321;;;:::o;14015:315::-;14172:28;14182:4;14188:2;14192:7;14172:9;:28::i;:::-;14219:48;14242:4;14248:2;14252:7;14261:5;14219:22;:48::i;:::-;14211:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;14015:315;;;;:::o;46968:93::-;47019:13;47049:7;47042:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46968:93;:::o;42194:723::-;42250:13;42480:1;42471:5;:10;42467:53;;;42498:10;;;;;;;;;;;;;;;;;;;;;42467:53;42530:12;42545:5;42530:20;;42561:14;42586:78;42601:1;42593:4;:9;42586:78;;42619:8;;;;;:::i;:::-;;;;42650:2;42642:10;;;;;:::i;:::-;;;42586:78;;;42674:19;42706:6;42696:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42674:39;;42724:154;42740:1;42731:5;:10;42724:154;;42768:1;42758:11;;;;;:::i;:::-;;;42835:2;42827:5;:10;;;;:::i;:::-;42814:2;:24;;;;:::i;:::-;42801:39;;42784:6;42791;42784:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;42864:2;42855:11;;;;;:::i;:::-;;;42724:154;;;42902:6;42888:21;;;;;42194:723;;;;:::o;49549:224::-;49626:5;49613:9;:18;;49605:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;49685:5;49673:9;:17;49669:97;;;49715:10;49707:28;;:47;49748:5;49736:9;:17;;;;:::i;:::-;49707:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49669:97;49549:224;:::o;2061:157::-;2146:4;2185:25;2170:40;;;:11;:40;;;;2163:47;;2061:157;;;:::o;17465:126::-;;;;:::o;15280:346::-;15374:1;15360:16;;:2;:16;;;;15352:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;15433:16;15441:7;15433;:16::i;:::-;15432:17;15424:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;15495:45;15524:1;15528:2;15532:7;15495:20;:45::i;:::-;15551:7;15564:2;15551:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15610:7;15606:2;15585:33;;15602:1;15585:33;;;;;;;;;;;;15280:346;;:::o;16663:799::-;16818:4;16839:15;:2;:13;;;:15::i;:::-;16835:620;;;16891:2;16875:36;;;16912:12;:10;:12::i;:::-;16926:4;16932:7;16941:5;16875:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;16871:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17134:1;17117:6;:13;:18;17113:272;;;17160:60;;;;;;;;;;:::i;:::-;;;;;;;;17113:272;17335:6;17329:13;17320:6;17316:2;17312:15;17305:38;16871:529;17008:41;;;16998:51;;;:6;:51;;;;16991:58;;;;;16835:620;17439:4;17432:11;;16663:799;;;;;;;:::o;25240:387::-;25300:4;25508:12;25575:7;25563:20;25555:28;;25618:1;25611:4;:8;25604:15;;;25240:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:323::-;9188:6;9237:2;9225:9;9216:7;9212:23;9208:32;9205:119;;;9243:79;;:::i;:::-;9205:119;9363:1;9388:50;9430:7;9421:6;9410:9;9406:22;9388:50;:::i;:::-;9378:60;;9334:114;9132:323;;;;:::o;9461:114::-;9528:6;9562:5;9556:12;9546:22;;9461:114;;;:::o;9581:184::-;9680:11;9714:6;9709:3;9702:19;9754:4;9749:3;9745:14;9730:29;;9581:184;;;;:::o;9771:132::-;9838:4;9861:3;9853:11;;9891:4;9886:3;9882:14;9874:22;;9771:132;;;:::o;9909:108::-;9986:24;10004:5;9986:24;:::i;:::-;9981:3;9974:37;9909:108;;:::o;10023:179::-;10092:10;10113:46;10155:3;10147:6;10113:46;:::i;:::-;10191:4;10186:3;10182:14;10168:28;;10023:179;;;;:::o;10208:113::-;10278:4;10310;10305:3;10301:14;10293:22;;10208:113;;;:::o;10357:732::-;10476:3;10505:54;10553:5;10505:54;:::i;:::-;10575:86;10654:6;10649:3;10575:86;:::i;:::-;10568:93;;10685:56;10735:5;10685:56;:::i;:::-;10764:7;10795:1;10780:284;10805:6;10802:1;10799:13;10780:284;;;10881:6;10875:13;10908:63;10967:3;10952:13;10908:63;:::i;:::-;10901:70;;10994:60;11047:6;10994:60;:::i;:::-;10984:70;;10840:224;10827:1;10824;10820:9;10815:14;;10780:284;;;10784:14;11080:3;11073:10;;10481:608;;;10357:732;;;;:::o;11095:373::-;11238:4;11276:2;11265:9;11261:18;11253:26;;11325:9;11319:4;11315:20;11311:1;11300:9;11296:17;11289:47;11353:108;11456:4;11447:6;11353:108;:::i;:::-;11345:116;;11095:373;;;;:::o;11474:468::-;11539:6;11547;11596:2;11584:9;11575:7;11571:23;11567:32;11564:119;;;11602:79;;:::i;:::-;11564:119;11722:1;11747:53;11792:7;11783:6;11772:9;11768:22;11747:53;:::i;:::-;11737:63;;11693:117;11849:2;11875:50;11917:7;11908:6;11897:9;11893:22;11875:50;:::i;:::-;11865:60;;11820:115;11474:468;;;;;:::o;11948:307::-;12009:4;12099:18;12091:6;12088:30;12085:56;;;12121:18;;:::i;:::-;12085:56;12159:29;12181:6;12159:29;:::i;:::-;12151:37;;12243:4;12237;12233:15;12225:23;;11948:307;;;:::o;12261:410::-;12338:5;12363:65;12379:48;12420:6;12379:48;:::i;:::-;12363:65;:::i;:::-;12354:74;;12451:6;12444:5;12437:21;12489:4;12482:5;12478:16;12527:3;12518:6;12513:3;12509:16;12506:25;12503:112;;;12534:79;;:::i;:::-;12503:112;12624:41;12658:6;12653:3;12648;12624:41;:::i;:::-;12344:327;12261:410;;;;;:::o;12690:338::-;12745:5;12794:3;12787:4;12779:6;12775:17;12771:27;12761:122;;12802:79;;:::i;:::-;12761:122;12919:6;12906:20;12944:78;13018:3;13010:6;13003:4;12995:6;12991:17;12944:78;:::i;:::-;12935:87;;12751:277;12690:338;;;;:::o;13034:943::-;13129:6;13137;13145;13153;13202:3;13190:9;13181:7;13177:23;13173:33;13170:120;;;13209:79;;:::i;:::-;13170:120;13329:1;13354:53;13399:7;13390:6;13379:9;13375:22;13354:53;:::i;:::-;13344:63;;13300:117;13456:2;13482:53;13527:7;13518:6;13507:9;13503:22;13482:53;:::i;:::-;13472:63;;13427:118;13584:2;13610:53;13655:7;13646:6;13635:9;13631:22;13610:53;:::i;:::-;13600:63;;13555:118;13740:2;13729:9;13725:18;13712:32;13771:18;13763:6;13760:30;13757:117;;;13793:79;;:::i;:::-;13757:117;13898:62;13952:7;13943:6;13932:9;13928:22;13898:62;:::i;:::-;13888:72;;13683:287;13034:943;;;;;;;:::o;13983:474::-;14051:6;14059;14108:2;14096:9;14087:7;14083:23;14079:32;14076:119;;;14114:79;;:::i;:::-;14076:119;14234:1;14259:53;14304:7;14295:6;14284:9;14280:22;14259:53;:::i;:::-;14249:63;;14205:117;14361:2;14387:53;14432:7;14423:6;14412:9;14408:22;14387:53;:::i;:::-;14377:63;;14332:118;13983:474;;;;;:::o;14463:180::-;14511:77;14508:1;14501:88;14608:4;14605:1;14598:15;14632:4;14629:1;14622:15;14649:320;14693:6;14730:1;14724:4;14720:12;14710:22;;14777:1;14771:4;14767:12;14798:18;14788:81;;14854:4;14846:6;14842:17;14832:27;;14788:81;14916:2;14908:6;14905:14;14885:18;14882:38;14879:84;;;14935:18;;:::i;:::-;14879:84;14700:269;14649:320;;;:::o;14975:231::-;15115:34;15111:1;15103:6;15099:14;15092:58;15184:14;15179:2;15171:6;15167:15;15160:39;14975:231;:::o;15212:366::-;15354:3;15375:67;15439:2;15434:3;15375:67;:::i;:::-;15368:74;;15451:93;15540:3;15451:93;:::i;:::-;15569:2;15564:3;15560:12;15553:19;;15212:366;;;:::o;15584:419::-;15750:4;15788:2;15777:9;15773:18;15765:26;;15837:9;15831:4;15827:20;15823:1;15812:9;15808:17;15801:47;15865:131;15991:4;15865:131;:::i;:::-;15857:139;;15584:419;;;:::o;16009:220::-;16149:34;16145:1;16137:6;16133:14;16126:58;16218:3;16213:2;16205:6;16201:15;16194:28;16009:220;:::o;16235:366::-;16377:3;16398:67;16462:2;16457:3;16398:67;:::i;:::-;16391:74;;16474:93;16563:3;16474:93;:::i;:::-;16592:2;16587:3;16583:12;16576:19;;16235:366;;;:::o;16607:419::-;16773:4;16811:2;16800:9;16796:18;16788:26;;16860:9;16854:4;16850:20;16846:1;16835:9;16831:17;16824:47;16888:131;17014:4;16888:131;:::i;:::-;16880:139;;16607:419;;;:::o;17032:243::-;17172:34;17168:1;17160:6;17156:14;17149:58;17241:26;17236:2;17228:6;17224:15;17217:51;17032:243;:::o;17281:366::-;17423:3;17444:67;17508:2;17503:3;17444:67;:::i;:::-;17437:74;;17520:93;17609:3;17520:93;:::i;:::-;17638:2;17633:3;17629:12;17622:19;;17281:366;;;:::o;17653:419::-;17819:4;17857:2;17846:9;17842:18;17834:26;;17906:9;17900:4;17896:20;17892:1;17881:9;17877:17;17870:47;17934:131;18060:4;17934:131;:::i;:::-;17926:139;;17653:419;;;:::o;18078:236::-;18218:34;18214:1;18206:6;18202:14;18195:58;18287:19;18282:2;18274:6;18270:15;18263:44;18078:236;:::o;18320:366::-;18462:3;18483:67;18547:2;18542:3;18483:67;:::i;:::-;18476:74;;18559:93;18648:3;18559:93;:::i;:::-;18677:2;18672:3;18668:12;18661:19;;18320:366;;;:::o;18692:419::-;18858:4;18896:2;18885:9;18881:18;18873:26;;18945:9;18939:4;18935:20;18931:1;18920:9;18916:17;18909:47;18973:131;19099:4;18973:131;:::i;:::-;18965:139;;18692:419;;;:::o;19117:172::-;19257:24;19253:1;19245:6;19241:14;19234:48;19117:172;:::o;19295:366::-;19437:3;19458:67;19522:2;19517:3;19458:67;:::i;:::-;19451:74;;19534:93;19623:3;19534:93;:::i;:::-;19652:2;19647:3;19643:12;19636:19;;19295:366;;;:::o;19667:419::-;19833:4;19871:2;19860:9;19856:18;19848:26;;19920:9;19914:4;19910:20;19906:1;19895:9;19891:17;19884:47;19948:131;20074:4;19948:131;:::i;:::-;19940:139;;19667:419;;;:::o;20092:180::-;20140:77;20137:1;20130:88;20237:4;20234:1;20227:15;20261:4;20258:1;20251:15;20278:180;20326:77;20323:1;20316:88;20423:4;20420:1;20413:15;20447:4;20444:1;20437:15;20464:233;20503:3;20526:24;20544:5;20526:24;:::i;:::-;20517:33;;20572:66;20565:5;20562:77;20559:103;;;20642:18;;:::i;:::-;20559:103;20689:1;20682:5;20678:13;20671:20;;20464:233;;;:::o;20703:182::-;20843:34;20839:1;20831:6;20827:14;20820:58;20703:182;:::o;20891:366::-;21033:3;21054:67;21118:2;21113:3;21054:67;:::i;:::-;21047:74;;21130:93;21219:3;21130:93;:::i;:::-;21248:2;21243:3;21239:12;21232:19;;20891:366;;;:::o;21263:419::-;21429:4;21467:2;21456:9;21452:18;21444:26;;21516:9;21510:4;21506:20;21502:1;21491:9;21487:17;21480:47;21544:131;21670:4;21544:131;:::i;:::-;21536:139;;21263:419;;;:::o;21688:147::-;21789:11;21826:3;21811:18;;21688:147;;;;:::o;21841:114::-;;:::o;21961:398::-;22120:3;22141:83;22222:1;22217:3;22141:83;:::i;:::-;22134:90;;22233:93;22322:3;22233:93;:::i;:::-;22351:1;22346:3;22342:11;22335:18;;21961:398;;;:::o;22365:379::-;22549:3;22571:147;22714:3;22571:147;:::i;:::-;22564:154;;22735:3;22728:10;;22365:379;;;:::o;22750:173::-;22890:25;22886:1;22878:6;22874:14;22867:49;22750:173;:::o;22929:366::-;23071:3;23092:67;23156:2;23151:3;23092:67;:::i;:::-;23085:74;;23168:93;23257:3;23168:93;:::i;:::-;23286:2;23281:3;23277:12;23270:19;;22929:366;;;:::o;23301:419::-;23467:4;23505:2;23494:9;23490:18;23482:26;;23554:9;23548:4;23544:20;23540:1;23529:9;23525:17;23518:47;23582:131;23708:4;23582:131;:::i;:::-;23574:139;;23301:419;;;:::o;23726:228::-;23866:34;23862:1;23854:6;23850:14;23843:58;23935:11;23930:2;23922:6;23918:15;23911:36;23726:228;:::o;23960:366::-;24102:3;24123:67;24187:2;24182:3;24123:67;:::i;:::-;24116:74;;24199:93;24288:3;24199:93;:::i;:::-;24317:2;24312:3;24308:12;24301:19;;23960:366;;;:::o;24332:419::-;24498:4;24536:2;24525:9;24521:18;24513:26;;24585:9;24579:4;24575:20;24571:1;24560:9;24556:17;24549:47;24613:131;24739:4;24613:131;:::i;:::-;24605:139;;24332:419;;;:::o;24757:229::-;24897:34;24893:1;24885:6;24881:14;24874:58;24966:12;24961:2;24953:6;24949:15;24942:37;24757:229;:::o;24992:366::-;25134:3;25155:67;25219:2;25214:3;25155:67;:::i;:::-;25148:74;;25231:93;25320:3;25231:93;:::i;:::-;25349:2;25344:3;25340:12;25333:19;;24992:366;;;:::o;25364:419::-;25530:4;25568:2;25557:9;25553:18;25545:26;;25617:9;25611:4;25607:20;25603:1;25592:9;25588:17;25581:47;25645:131;25771:4;25645:131;:::i;:::-;25637:139;;25364:419;;;:::o;25789:175::-;25929:27;25925:1;25917:6;25913:14;25906:51;25789:175;:::o;25970:366::-;26112:3;26133:67;26197:2;26192:3;26133:67;:::i;:::-;26126:74;;26209:93;26298:3;26209:93;:::i;:::-;26327:2;26322:3;26318:12;26311:19;;25970:366;;;:::o;26342:419::-;26508:4;26546:2;26535:9;26531:18;26523:26;;26595:9;26589:4;26585:20;26581:1;26570:9;26566:17;26559:47;26623:131;26749:4;26623:131;:::i;:::-;26615:139;;26342:419;;;:::o;26767:181::-;26907:33;26903:1;26895:6;26891:14;26884:57;26767:181;:::o;26954:366::-;27096:3;27117:67;27181:2;27176:3;27117:67;:::i;:::-;27110:74;;27193:93;27282:3;27193:93;:::i;:::-;27311:2;27306:3;27302:12;27295:19;;26954:366;;;:::o;27326:419::-;27492:4;27530:2;27519:9;27515:18;27507:26;;27579:9;27573:4;27569:20;27565:1;27554:9;27550:17;27543:47;27607:131;27733:4;27607:131;:::i;:::-;27599:139;;27326:419;;;:::o;27751:182::-;27891:34;27887:1;27879:6;27875:14;27868:58;27751:182;:::o;27939:366::-;28081:3;28102:67;28166:2;28161:3;28102:67;:::i;:::-;28095:74;;28178:93;28267:3;28178:93;:::i;:::-;28296:2;28291:3;28287:12;28280:19;;27939:366;;;:::o;28311:419::-;28477:4;28515:2;28504:9;28500:18;28492:26;;28564:9;28558:4;28554:20;28550:1;28539:9;28535:17;28528:47;28592:131;28718:4;28592:131;:::i;:::-;28584:139;;28311:419;;;:::o;28736:228::-;28876:34;28872:1;28864:6;28860:14;28853:58;28945:11;28940:2;28932:6;28928:15;28921:36;28736:228;:::o;28970:366::-;29112:3;29133:67;29197:2;29192:3;29133:67;:::i;:::-;29126:74;;29209:93;29298:3;29209:93;:::i;:::-;29327:2;29322:3;29318:12;29311:19;;28970:366;;;:::o;29342:419::-;29508:4;29546:2;29535:9;29531:18;29523:26;;29595:9;29589:4;29585:20;29581:1;29570:9;29566:17;29559:47;29623:131;29749:4;29623:131;:::i;:::-;29615:139;;29342:419;;;:::o;29767:305::-;29807:3;29826:20;29844:1;29826:20;:::i;:::-;29821:25;;29860:20;29878:1;29860:20;:::i;:::-;29855:25;;30014:1;29946:66;29942:74;29939:1;29936:81;29933:107;;;30020:18;;:::i;:::-;29933:107;30064:1;30061;30057:9;30050:16;;29767:305;;;;:::o;30078:220::-;30218:34;30214:1;30206:6;30202:14;30195:58;30287:3;30282:2;30274:6;30270:15;30263:28;30078:220;:::o;30304:366::-;30446:3;30467:67;30531:2;30526:3;30467:67;:::i;:::-;30460:74;;30543:93;30632:3;30543:93;:::i;:::-;30661:2;30656:3;30652:12;30645:19;;30304:366;;;:::o;30676:419::-;30842:4;30880:2;30869:9;30865:18;30857:26;;30929:9;30923:4;30919:20;30915:1;30904:9;30900:17;30893:47;30957:131;31083:4;30957:131;:::i;:::-;30949:139;;30676:419;;;:::o;31101:163::-;31241:15;31237:1;31229:6;31225:14;31218:39;31101:163;:::o;31270:366::-;31412:3;31433:67;31497:2;31492:3;31433:67;:::i;:::-;31426:74;;31509:93;31598:3;31509:93;:::i;:::-;31627:2;31622:3;31618:12;31611:19;;31270:366;;;:::o;31642:419::-;31808:4;31846:2;31835:9;31831:18;31823:26;;31895:9;31889:4;31885:20;31881:1;31870:9;31866:17;31859:47;31923:131;32049:4;31923:131;:::i;:::-;31915:139;;31642:419;;;:::o;32067:224::-;32207:34;32203:1;32195:6;32191:14;32184:58;32276:7;32271:2;32263:6;32259:15;32252:32;32067:224;:::o;32297:366::-;32439:3;32460:67;32524:2;32519:3;32460:67;:::i;:::-;32453:74;;32536:93;32625:3;32536:93;:::i;:::-;32654:2;32649:3;32645:12;32638:19;;32297:366;;;:::o;32669:419::-;32835:4;32873:2;32862:9;32858:18;32850:26;;32922:9;32916:4;32912:20;32908:1;32897:9;32893:17;32886:47;32950:131;33076:4;32950:131;:::i;:::-;32942:139;;32669:419;;;:::o;33094:172::-;33234:24;33230:1;33222:6;33218:14;33211:48;33094:172;:::o;33272:366::-;33414:3;33435:67;33499:2;33494:3;33435:67;:::i;:::-;33428:74;;33511:93;33600:3;33511:93;:::i;:::-;33629:2;33624:3;33620:12;33613:19;;33272:366;;;:::o;33644:419::-;33810:4;33848:2;33837:9;33833:18;33825:26;;33897:9;33891:4;33887:20;33883:1;33872:9;33868:17;33861:47;33925:131;34051:4;33925:131;:::i;:::-;33917:139;;33644:419;;;:::o;34069:220::-;34209:34;34205:1;34197:6;34193:14;34186:58;34278:3;34273:2;34265:6;34261:15;34254:28;34069:220;:::o;34295:366::-;34437:3;34458:67;34522:2;34517:3;34458:67;:::i;:::-;34451:74;;34534:93;34623:3;34534:93;:::i;:::-;34652:2;34647:3;34643:12;34636:19;;34295:366;;;:::o;34667:419::-;34833:4;34871:2;34860:9;34856:18;34848:26;;34920:9;34914:4;34910:20;34906:1;34895:9;34891:17;34884:47;34948:131;35074:4;34948:131;:::i;:::-;34940:139;;34667:419;;;:::o;35092:148::-;35194:11;35231:3;35216:18;;35092:148;;;;:::o;35246:377::-;35352:3;35380:39;35413:5;35380:39;:::i;:::-;35435:89;35517:6;35512:3;35435:89;:::i;:::-;35428:96;;35533:52;35578:6;35573:3;35566:4;35559:5;35555:16;35533:52;:::i;:::-;35610:6;35605:3;35601:16;35594:23;;35356:267;35246:377;;;;:::o;35629:141::-;35678:4;35701:3;35693:11;;35724:3;35721:1;35714:14;35758:4;35755:1;35745:18;35737:26;;35629:141;;;:::o;35800:845::-;35903:3;35940:5;35934:12;35969:36;35995:9;35969:36;:::i;:::-;36021:89;36103:6;36098:3;36021:89;:::i;:::-;36014:96;;36141:1;36130:9;36126:17;36157:1;36152:137;;;;36303:1;36298:341;;;;36119:520;;36152:137;36236:4;36232:9;36221;36217:25;36212:3;36205:38;36272:6;36267:3;36263:16;36256:23;;36152:137;;36298:341;36365:38;36397:5;36365:38;:::i;:::-;36425:1;36439:154;36453:6;36450:1;36447:13;36439:154;;;36527:7;36521:14;36517:1;36512:3;36508:11;36501:35;36577:1;36568:7;36564:15;36553:26;;36475:4;36472:1;36468:12;36463:17;;36439:154;;;36622:6;36617:3;36613:16;36606:23;;36305:334;;36119:520;;35907:738;;35800:845;;;;:::o;36651:589::-;36876:3;36898:95;36989:3;36980:6;36898:95;:::i;:::-;36891:102;;37010:95;37101:3;37092:6;37010:95;:::i;:::-;37003:102;;37122:92;37210:3;37201:6;37122:92;:::i;:::-;37115:99;;37231:3;37224:10;;36651:589;;;;;;:::o;37246:230::-;37386:34;37382:1;37374:6;37370:14;37363:58;37455:13;37450:2;37442:6;37438:15;37431:38;37246:230;:::o;37482:366::-;37624:3;37645:67;37709:2;37704:3;37645:67;:::i;:::-;37638:74;;37721:93;37810:3;37721:93;:::i;:::-;37839:2;37834:3;37830:12;37823:19;;37482:366;;;:::o;37854:419::-;38020:4;38058:2;38047:9;38043:18;38035:26;;38107:9;38101:4;38097:20;38093:1;38082:9;38078:17;38071:47;38135:131;38261:4;38135:131;:::i;:::-;38127:139;;37854:419;;;:::o;38279:171::-;38419:23;38415:1;38407:6;38403:14;38396:47;38279:171;:::o;38456:366::-;38598:3;38619:67;38683:2;38678:3;38619:67;:::i;:::-;38612:74;;38695:93;38784:3;38695:93;:::i;:::-;38813:2;38808:3;38804:12;38797:19;;38456:366;;;:::o;38828:419::-;38994:4;39032:2;39021:9;39017:18;39009:26;;39081:9;39075:4;39071:20;39067:1;39056:9;39052:17;39045:47;39109:131;39235:4;39109:131;:::i;:::-;39101:139;;38828:419;;;:::o;39253:348::-;39293:7;39316:20;39334:1;39316:20;:::i;:::-;39311:25;;39350:20;39368:1;39350:20;:::i;:::-;39345:25;;39538:1;39470:66;39466:74;39463:1;39460:81;39455:1;39448:9;39441:17;39437:105;39434:131;;;39545:18;;:::i;:::-;39434:131;39593:1;39590;39586:9;39575:20;;39253:348;;;;:::o;39607:169::-;39747:21;39743:1;39735:6;39731:14;39724:45;39607:169;:::o;39782:366::-;39924:3;39945:67;40009:2;40004:3;39945:67;:::i;:::-;39938:74;;40021:93;40110:3;40021:93;:::i;:::-;40139:2;40134:3;40130:12;40123:19;;39782:366;;;:::o;40154:419::-;40320:4;40358:2;40347:9;40343:18;40335:26;;40407:9;40401:4;40397:20;40393:1;40382:9;40378:17;40371:47;40435:131;40561:4;40435:131;:::i;:::-;40427:139;;40154:419;;;:::o;40579:225::-;40719:34;40715:1;40707:6;40703:14;40696:58;40788:8;40783:2;40775:6;40771:15;40764:33;40579:225;:::o;40810:366::-;40952:3;40973:67;41037:2;41032:3;40973:67;:::i;:::-;40966:74;;41049:93;41138:3;41049:93;:::i;:::-;41167:2;41162:3;41158:12;41151:19;;40810:366;;;:::o;41182:419::-;41348:4;41386:2;41375:9;41371:18;41363:26;;41435:9;41429:4;41425:20;41421:1;41410:9;41406:17;41399:47;41463:131;41589:4;41463:131;:::i;:::-;41455:139;;41182:419;;;:::o;41607:231::-;41747:34;41743:1;41735:6;41731:14;41724:58;41816:14;41811:2;41803:6;41799:15;41792:39;41607:231;:::o;41844:366::-;41986:3;42007:67;42071:2;42066:3;42007:67;:::i;:::-;42000:74;;42083:93;42172:3;42083:93;:::i;:::-;42201:2;42196:3;42192:12;42185:19;;41844:366;;;:::o;42216:419::-;42382:4;42420:2;42409:9;42405:18;42397:26;;42469:9;42463:4;42459:20;42455:1;42444:9;42440:17;42433:47;42497:131;42623:4;42497:131;:::i;:::-;42489:139;;42216:419;;;:::o;42641:228::-;42781:34;42777:1;42769:6;42765:14;42758:58;42850:11;42845:2;42837:6;42833:15;42826:36;42641:228;:::o;42875:366::-;43017:3;43038:67;43102:2;43097:3;43038:67;:::i;:::-;43031:74;;43114:93;43203:3;43114:93;:::i;:::-;43232:2;43227:3;43223:12;43216:19;;42875:366;;;:::o;43247:419::-;43413:4;43451:2;43440:9;43436:18;43428:26;;43500:9;43494:4;43490:20;43486:1;43475:9;43471:17;43464:47;43528:131;43654:4;43528:131;:::i;:::-;43520:139;;43247:419;;;:::o;43672:223::-;43812:34;43808:1;43800:6;43796:14;43789:58;43881:6;43876:2;43868:6;43864:15;43857:31;43672:223;:::o;43901:366::-;44043:3;44064:67;44128:2;44123:3;44064:67;:::i;:::-;44057:74;;44140:93;44229:3;44140:93;:::i;:::-;44258:2;44253:3;44249:12;44242:19;;43901:366;;;:::o;44273:419::-;44439:4;44477:2;44466:9;44462:18;44454:26;;44526:9;44520:4;44516:20;44512:1;44501:9;44497:17;44490:47;44554:131;44680:4;44554:131;:::i;:::-;44546:139;;44273:419;;;:::o;44698:237::-;44838:34;44834:1;44826:6;44822:14;44815:58;44907:20;44902:2;44894:6;44890:15;44883:45;44698:237;:::o;44941:366::-;45083:3;45104:67;45168:2;45163:3;45104:67;:::i;:::-;45097:74;;45180:93;45269:3;45180:93;:::i;:::-;45298:2;45293:3;45289:12;45282:19;;44941:366;;;:::o;45313:419::-;45479:4;45517:2;45506:9;45502:18;45494:26;;45566:9;45560:4;45556:20;45552:1;45541:9;45537:17;45530:47;45594:131;45720:4;45594:131;:::i;:::-;45586:139;;45313:419;;;:::o;45738:180::-;45786:77;45783:1;45776:88;45883:4;45880:1;45873:15;45907:4;45904:1;45897:15;45924:185;45964:1;45981:20;45999:1;45981:20;:::i;:::-;45976:25;;46015:20;46033:1;46015:20;:::i;:::-;46010:25;;46054:1;46044:35;;46059:18;;:::i;:::-;46044:35;46101:1;46098;46094:9;46089:14;;45924:185;;;;:::o;46115:191::-;46155:4;46175:20;46193:1;46175:20;:::i;:::-;46170:25;;46209:20;46227:1;46209:20;:::i;:::-;46204:25;;46248:1;46245;46242:8;46239:34;;;46253:18;;:::i;:::-;46239:34;46298:1;46295;46291:9;46283:17;;46115:191;;;;:::o;46312:176::-;46344:1;46361:20;46379:1;46361:20;:::i;:::-;46356:25;;46395:20;46413:1;46395:20;:::i;:::-;46390:25;;46434:1;46424:35;;46439:18;;:::i;:::-;46424:35;46480:1;46477;46473:9;46468:14;;46312:176;;;;:::o;46494:172::-;46634:24;46630:1;46622:6;46618:14;46611:48;46494:172;:::o;46672:366::-;46814:3;46835:67;46899:2;46894:3;46835:67;:::i;:::-;46828:74;;46911:93;47000:3;46911:93;:::i;:::-;47029:2;47024:3;47020:12;47013:19;;46672:366;;;:::o;47044:419::-;47210:4;47248:2;47237:9;47233:18;47225:26;;47297:9;47291:4;47287:20;47283:1;47272:9;47268:17;47261:47;47325:131;47451:4;47325:131;:::i;:::-;47317:139;;47044:419;;;:::o;47469:182::-;47609:34;47605:1;47597:6;47593:14;47586:58;47469:182;:::o;47657:366::-;47799:3;47820:67;47884:2;47879:3;47820:67;:::i;:::-;47813:74;;47896:93;47985:3;47896:93;:::i;:::-;48014:2;48009:3;48005:12;47998:19;;47657:366;;;:::o;48029:419::-;48195:4;48233:2;48222:9;48218:18;48210:26;;48282:9;48276:4;48272:20;48268:1;48257:9;48253:17;48246:47;48310:131;48436:4;48310:131;:::i;:::-;48302:139;;48029:419;;;:::o;48454:178::-;48594:30;48590:1;48582:6;48578:14;48571:54;48454:178;:::o;48638:366::-;48780:3;48801:67;48865:2;48860:3;48801:67;:::i;:::-;48794:74;;48877:93;48966:3;48877:93;:::i;:::-;48995:2;48990:3;48986:12;48979:19;;48638:366;;;:::o;49010:419::-;49176:4;49214:2;49203:9;49199:18;49191:26;;49263:9;49257:4;49253:20;49249:1;49238:9;49234:17;49227:47;49291:131;49417:4;49291:131;:::i;:::-;49283:139;;49010:419;;;:::o;49435:98::-;49486:6;49520:5;49514:12;49504:22;;49435:98;;;:::o;49539:168::-;49622:11;49656:6;49651:3;49644:19;49696:4;49691:3;49687:14;49672:29;;49539:168;;;;:::o;49713:360::-;49799:3;49827:38;49859:5;49827:38;:::i;:::-;49881:70;49944:6;49939:3;49881:70;:::i;:::-;49874:77;;49960:52;50005:6;50000:3;49993:4;49986:5;49982:16;49960:52;:::i;:::-;50037:29;50059:6;50037:29;:::i;:::-;50032:3;50028:39;50021:46;;49803:270;49713:360;;;;:::o;50079:640::-;50274:4;50312:3;50301:9;50297:19;50289:27;;50326:71;50394:1;50383:9;50379:17;50370:6;50326:71;:::i;:::-;50407:72;50475:2;50464:9;50460:18;50451:6;50407:72;:::i;:::-;50489;50557:2;50546:9;50542:18;50533:6;50489:72;:::i;:::-;50608:9;50602:4;50598:20;50593:2;50582:9;50578:18;50571:48;50636:76;50707:4;50698:6;50636:76;:::i;:::-;50628:84;;50079:640;;;;;;;:::o;50725:141::-;50781:5;50812:6;50806:13;50797:22;;50828:32;50854:5;50828:32;:::i;:::-;50725:141;;;;:::o;50872:349::-;50941:6;50990:2;50978:9;50969:7;50965:23;50961:32;50958:119;;;50996:79;;:::i;:::-;50958:119;51116:1;51141:63;51196:7;51187:6;51176:9;51172:22;51141:63;:::i;:::-;51131:73;;51087:127;50872:349;;;;:::o

Swarm Source

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