ETH Price: $3,466.05 (+2.12%)
Gas: 15 Gwei

Token

EpoHeroes (HERO)
 

Overview

Max Total Supply

10,000 HERO

Holders

1,533

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
0 HERO
0x16038d6f7eb7bca1e5aaad7ac6340ee598d42562
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

EpoHeroes are dynamic, user-generated virtual identities created using our text-to-hero generator that are game-ready for metaverse games. EpoHeroes owners can animate their virtual identities using text or voice — making the EpoHeroes speak their messages.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ArtAI

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 1337 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-31
*/

pragma solidity ^0.8.0;

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

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 Emitted when `owner` pays to purchase a specific image id.
     */
    event Purchase(address indexed owner, string imageId, string name);

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

pragma solidity ^0.8.0;

library Random {
    function rand1To10(uint256 seed) internal view returns (uint256) {
        uint256 _number = (uint256(
            keccak256(abi.encodePacked(blockhash(block.number - 1), seed))
        ) % 10);
        if (_number <= 0) {
            _number = 10;
        }

        return _number;
    }
}

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

    function addressToString(address _addr)
        internal
        pure
        returns (string memory)
    {
        bytes32 value = bytes32(uint256(uint160(_addr)));
        bytes memory alphabet = "0123456789abcdef";

        bytes memory str = new bytes(42);
        str[0] = "0";
        str[1] = "x";
        for (uint256 i = 0; i < 20; i++) {
            str[2 + i * 2] = alphabet[uint256(uint8(value[i + 12] >> 4))];
            str[3 + i * 2] = alphabet[uint256(uint8(value[i + 12] & 0x0f))];
        }
        return string(str);
    }

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

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

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

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

pragma solidity ^0.8.0;

contract Ownable {
    address _owner;
    address _levelTrainer;

    constructor() {
        _owner = msg.sender;
    }

    modifier onlyOwner() {
        require(
            msg.sender == _owner,
            "Only the contract owner may call this function"
        );
        _;
    }

    modifier onlyLevelTrainer() {
        require(
            msg.sender == _levelTrainer,
            "Only the level trainer may call this function"
        );
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0));
        _owner = newOwner;
    }

    function setLevelTrainer(address newTrainer) external onlyOwner {
        require(newTrainer != address(0));
        _levelTrainer = newTrainer;
    }

    function withdrawBalance() external onlyOwner {
        payable(_owner).transfer(address(this).balance);
    }

    function withdrawAmountTo(address _recipient, uint256 _amount)
        external
        onlyOwner
    {
        require(address(this).balance >= _amount);
        payable(_recipient).transfer(_amount);
    }
}

pragma solidity ^0.8.0;



/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context, Ownable {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;
    bool private _whitelistIsOpen;
    bool private _publicSaleIsOpen;
    bool private _statsAreRevealed;

    /**
     * @dev Initializes the contract in paused state.
     */
    constructor() {
        _paused = true;
        _whitelistIsOpen = false;
        _publicSaleIsOpen = false;
        _statsAreRevealed = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    function statsAreRevealed() public view returns (bool) {
        return _statsAreRevealed;
    }

    function publicSaleIsOpen() public view returns (bool) {
        return _publicSaleIsOpen;
    }

    function whitelistIsOpen() public view returns (bool) {
        return _whitelistIsOpen;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }

    function revealStats() external onlyOwner {
        _statsAreRevealed = true;
    }

    function openWhitelist() external onlyOwner {
        _whitelistIsOpen = true;
    }

    function closeWhitelist() external onlyOwner {
        _whitelistIsOpen = false;
    }

    function openPublicSale() external onlyOwner {
        _publicSaleIsOpen = true;
    }

    function closePublicSale() external onlyOwner {
        _publicSaleIsOpen = false;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (address, RecoverError)
    {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (address)
    {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(
                vs,
                0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
            )
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (
            uint256(s) >
            0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0
        ) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash)
        internal
        pure
        returns (bytes32)
    {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return
            keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
            );
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked(
                    "\x19Ethereum Signed Message:\n",
                    Strings.toString(s.length),
                    s
                )
            );
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", domainSeparator, structHash)
            );
    }
}

pragma solidity ^0.8.0;













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

    using Address for address;
    using Strings for uint256;
    using ECDSA for bytes;

    struct Hero {
        string name;
        string imageId;
        string imageHash;
        uint256 class;
        uint256 disposition;
        uint256 level;
        uint256 strength;
        uint256 dexterity;
        uint256 vitality;
        uint256 energy;
        bool isHonorary;
    }
    uint256 _protectedClassId;

    // class id to class strings
    string[] public _classList;
    // disposition id to disposition strings
    string[] public _dispositionList;

    // Max total supply
    uint256 public maxSupply = 10000;
    // Max hero name length
    uint256 private _maxImageNameLength = 100;

    // prices
    uint256 public _purchasePrice = 80000000000000000 wei;
    uint256 public _nameUpdatePrice = 5000;
    // public signer address
    address private _messageSigner;

    // ERC721 Addresses
    address private _gen1Address;
    address private _gen2Address;

    // EPO ERC20 address
    address private _EPOAddress;
    address private EPOWallet;

    // baseURI for Metadata
    string private _metadataURI = "https://art-ai.com/api/hero/metadata/";

    // Token name
    string private _name;
    // Token symbol
    string private _symbol;
    // Token supply
    uint256 public _tokenSupply;

    // Mapping from address to whitelist status
    mapping(address => bool) private _freeMintAddresses;
    mapping(address => bool) private _honoraryAddresses;
    mapping(address => bool) private _claimed;
    mapping(address => bool) private _claimedHonorary;

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

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

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

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

    // Mapping from token id to stored Hero info
    mapping(uint256 => Hero) private _tokenIdToHero;

    // Status of signed messages
    mapping(bytes => bool) private _usedSignedMessages;

    // used IPFS hashes
    mapping(string => bool) private _usedIPFSHashes;

    // used image IDs
    mapping(string => bool) private _usedImageIds;

    // used image names
    mapping(string => bool) private _usedNames;

    constructor(
        string memory name_,
        string memory symbol_,
        address gen1Address_,
        address gen2Address_
    ) {
        _name = name_;
        _symbol = symbol_;
        _gen1Address = gen1Address_;
        _gen2Address = gen2Address_;

        _classList.push("Sorcerer");
        _classList.push("Warrior");
        _classList.push("Necromancer");
        _classList.push("Monk");
        _classList.push("Assassin");
        _classList.push("Druid");
        _classList.push("Artificer");
        _protectedClassId = _classList.length - 1;

        _dispositionList.push("Good");
        _dispositionList.push("Neutral");
        _dispositionList.push("Evil");
    }

    function levelUp(uint256 _tokenId) external onlyLevelTrainer {
        require(_tokenId <= maxSupply);
        _tokenIdToHero[_tokenId].level++;
    }

    function addDisposition(string calldata newDisposition) external onlyOwner {
        _dispositionList.push(newDisposition);
    }

    function addClass(string calldata newClass) external onlyOwner {
        _classList.push(newClass);
    }

    function setEPOWallet(address wallet) external onlyOwner {
        EPOWallet = wallet;
    }

    function updateNameChangePrice(uint256 newPrice) external onlyOwner {
        _nameUpdatePrice = newPrice;
    }

    function setEPOAddress(address newAddress) external onlyOwner {
        _EPOAddress = newAddress;
    }

    function setBaseURI(string calldata newURI) external onlyOwner {
        _metadataURI = newURI;
    }

    function setPurchasePrice(uint256 newPrice) external onlyOwner {
        _purchasePrice = newPrice;
    }

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

    function canClaimProtectedClass(address claimant)
        external
        view
        returns (bool)
    {
        return _getEponymBalance(claimant) > 0;
    }

    function isNameAvailable(string calldata _imageName)
        external
        view
        returns (bool)
    {
        return !_usedNames[_imageName];
    }

    function hasClaimedFreeMint(address claimant) external view returns (bool) {
        return _claimed[claimant];
    }

    function isOnFreeMintList(address _address) external view returns (bool) {
        return !!_freeMintAddresses[_address];
    }

    function canClaimHonorary(address _address) external view returns (bool) {
        return !!_honoraryAddresses[_address] && !_claimedHonorary[_address];
    }

    function setMessageSigner(address newSigner) external onlyOwner {
        _messageSigner = newSigner;
    }

    function addAddressToFreeMint(address _address) external onlyOwner {
        _freeMintAddresses[_address] = true;
    }

    function addAddressToHonoraryList(address _address) external onlyOwner {
        _honoraryAddresses[_address] = true;
    }

    function addAddressesToFreeMint(address[] calldata _addressList)
        external
        onlyOwner
    {
        for (uint256 i; i < _addressList.length; i++) {
            _freeMintAddresses[_addressList[i]] = true;
        }
    }

    function removeAddressFromFreeMint(address _addressToRemove)
        external
        onlyOwner
    {
        _freeMintAddresses[_addressToRemove] = false;
    }

    function _getEponymBalance(address _owner) private view returns (uint256) {
        IERC721 _gen1 = IERC721(_gen1Address);
        IERC721 _gen2 = IERC721(_gen2Address);
        return _gen1.balanceOf(_owner) + _gen2.balanceOf(_owner);
    }

    function _mint(
        address _owner,
        string memory _imageName,
        string memory _imageHash,
        string memory _imageId,
        uint256 _classId,
        uint256 _dispositionId,
        uint256[4] memory _seeds,
        bytes memory _signedMessage,
        bool _isHonorary
    ) private returns (uint256) {
        uint256 _newTokenId = _tokenSupply + 1;

        _safeMint(_owner, _newTokenId);
        _updateStoredValues(
            _imageName,
            _imageHash,
            _imageId,
            _classId,
            _dispositionId,
            _signedMessage,
            _newTokenId,
            _seeds,
            _isHonorary
        );

        return _newTokenId;
    }

    function _verifyRewardProof(bytes memory _signedMessage)
        internal
        returns (bool)
    {
        if (_usedSignedMessages[_signedMessage]) {
            return false;
        }

        bytes32 _message = ECDSA.toEthSignedMessageHash(
            abi.encodePacked(_msgSender().addressToString())
        );

        address signer = ECDSA.recover(_message, _signedMessage);

        if (signer != _messageSigner) {
            return false;
        }

        _usedSignedMessages[_signedMessage] = true;
        return true;
    }

    function _verifySignedMessage(
        string memory _imageName,
        string memory _imageHash,
        string memory _imageId,
        uint256 _classId,
        uint256 _dispositionId,
        uint256[4] memory _seeds,
        bytes memory _signedMessage
    ) internal returns (bool) {
        if (_usedSignedMessages[_signedMessage]) {
            return false;
        }

        string memory seedString = string(
            abi.encodePacked(
                _seeds[0].toString(),
                _seeds[1].toString(),
                _seeds[2].toString(),
                _seeds[3].toString()
            )
        );
        bytes32 _message = ECDSA.toEthSignedMessageHash(
            abi.encodePacked(
                _imageName,
                _imageId,
                _imageHash,
                _classId.toString(),
                _dispositionId.toString(),
                seedString
            )
        );

        address signer = ECDSA.recover(_message, _signedMessage);

        if (signer != _messageSigner) {
            return false;
        }

        _usedSignedMessages[_signedMessage] = true;
        return true;
    }

    function _verifyClass(uint256 _classId) internal view returns (bool) {
        require(_classId < _classList.length, "class id");
        bool ownsEponym = _getEponymBalance(_msgSender()) > 0;
        if (_classId == _protectedClassId && !ownsEponym) {
            return false;
        }

        return true;
    }

    function _verifyParams(
        string memory _imageName,
        string memory _imageHash,
        string memory _imageId,
        uint256 _classId,
        uint256 _dispositionId,
        uint256[4] memory _seeds,
        bytes memory _signedMessage
    ) internal {
        require(bytes(_imageName).length <= _maxImageNameLength, "len");
        require(!_usedNames[_imageName], "name");
        require(!_usedImageIds[_imageId], "id");
        require(!_usedIPFSHashes[_imageHash], "hash");
        require(_verifyClass(_classId), "class");
        require(_dispositionId < _dispositionList.length, "disp");
        require(
            _verifySignedMessage(
                _imageName,
                _imageHash,
                _imageId,
                _classId,
                _dispositionId,
                _seeds,
                _signedMessage
            ),
            "signature"
        );
    }

    function _updateStoredValues(
        string memory _imageName,
        string memory _imageHash,
        string memory _imageId,
        uint256 _classId,
        uint256 _dispositionId,
        bytes memory _signedMessage,
        uint256 _tokenId,
        uint256[4] memory _seeds,
        bool _isHonorary
    ) private {
        _usedSignedMessages[_signedMessage] = true;
        _usedImageIds[_imageId] = true;
        _usedIPFSHashes[_imageHash] = true;
        _usedNames[_imageName] = true;

        Hero memory _newHero = Hero(
            _imageName,
            _imageId,
            _imageHash,
            _classId,
            _dispositionId,
            1,
            Random.rand1To10(_seeds[0]),
            Random.rand1To10(_seeds[1]),
            Random.rand1To10(_seeds[2]),
            Random.rand1To10(_seeds[3]),
            _isHonorary
        );

        _tokenIdToHero[_tokenId] = _newHero;
    }

    function _isMintAvailable(
        address _user,
        uint256 _whitelistAllocation,
        bytes memory _whitelistMessage
    ) private view returns (bool) {
        if (publicSaleIsOpen()) {
            return true;
        }

        if (whitelistIsOpen()) {
            bytes32 _message = ECDSA.toEthSignedMessageHash(
                abi.encodePacked(
                    _user.addressToString(),
                    _whitelistAllocation.toString()
                )
            );
            address signer = ECDSA.recover(_message, _whitelistMessage);
            if (
                balanceOf(_user) < _whitelistAllocation &&
                signer == _messageSigner
            ) {
                return true;
            }

            return false;
        }

        return false;
    }

    function _verifyHonorary(bool _isHonorary) private returns (bool) {
        if (!_isHonorary) {
            return true;
        }

        if (
            !!_honoraryAddresses[_msgSender()] &&
            !_claimedHonorary[_msgSender()]
        ) {
            _claimedHonorary[_msgSender()] = true;
            return true;
        }

        return false;
    }

    function _checkFreeElligibility(bytes memory _signedRewardProof)
        private
        returns (bool)
    {
        return
            _verifyRewardProof(_signedRewardProof) ||
            _freeMintAddresses[_msgSender()];
    }

    function updateImageName(string memory _newImageName, uint256 _tokenId)
        external
        whenNotPaused
    {
        IERC20 epoToken = IERC20(_EPOAddress);
        require(ownerOf(_tokenId) == _msgSender());
        require(
            epoToken.balanceOf(_msgSender()) >= _nameUpdatePrice,
            "epo bal"
        );
        require(
            epoToken.allowance(_msgSender(), address(this)) >= _nameUpdatePrice,
            "allowance"
        );
        require(bytes(_newImageName).length <= _maxImageNameLength, "length");
        require(!_usedNames[_newImageName], "used");

        epoToken.transferFrom(_msgSender(), EPOWallet, _nameUpdatePrice);
        Hero storage _tokenInfo = _tokenIdToHero[_tokenId];
        _usedNames[_tokenInfo.name] = false;
        _usedNames[_newImageName] = true;
        _tokenInfo.name = _newImageName;
    }

    function ownerMint(
        string memory _imageName,
        string memory _imageHash,
        string memory _imageId,
        uint256 _classId,
        uint256 _dispositionId,
        uint256[4] memory _seeds,
        address _recipient,
        bool _isHonorary
    ) external onlyOwner returns (uint256) {
        require(_tokenSupply < maxSupply, "max supply");
        require(_classId < _classList.length, "class");
        require(_dispositionId < _dispositionList.length, "disp");
        bytes memory _message = bytes(_imageName);
        uint256 _newTokenId = _mint(
            _recipient,
            _imageName,
            _imageHash,
            _imageId,
            _classId,
            _dispositionId,
            _seeds,
            _message,
            _isHonorary
        );

        return _newTokenId;
    }

    function mint(
        string memory _imageName,
        string memory _imageHash,
        string memory _imageId,
        uint256 _classId,
        uint256 _dispositionId,
        uint256[4] memory _seeds,
        bytes memory _signedMessage,
        bytes memory _whitelistMessage,
        uint256 _whitelistAllocation,
        bool _isHonorary
    ) external payable whenNotPaused returns (uint256) {
        require(!msg.sender.isContract(), "contract");
        require(_verifyHonorary(_isHonorary), "honorary");
        require(msg.value >= _purchasePrice, "price");
        require(
            _isMintAvailable(
                _msgSender(),
                _whitelistAllocation,
                _whitelistMessage
            ),
            "mint"
        );
        require(_tokenSupply < maxSupply, "max supply");

        _verifyParams(
            _imageName,
            _imageHash,
            _imageId,
            _classId,
            _dispositionId,
            _seeds,
            _signedMessage
        );
        uint256 _newTokenId = _mint(
            msg.sender,
            _imageName,
            _imageHash,
            _imageId,
            _classId,
            _dispositionId,
            _seeds,
            _signedMessage,
            _isHonorary
        );

        return _newTokenId;
    }

    function rewardMint(
        string memory _imageName,
        string memory _imageHash,
        string memory _imageId,
        uint256 _classId,
        uint256 _dispositionId,
        uint256[4] memory _seeds,
        bytes memory _signedMessage,
        bytes memory _signedRewardProof,
        bool _isHonorary
    ) external payable whenNotPaused returns (uint256) {
        require(!msg.sender.isContract(), "contract");
        require(_tokenSupply < maxSupply, "max supply");
        require(_verifyHonorary(_isHonorary), "honorary");
        require(!_claimed[_msgSender()], "claim");
        require(_checkFreeElligibility(_signedRewardProof), "elligible");
        _verifyParams(
            _imageName,
            _imageHash,
            _imageId,
            _classId,
            _dispositionId,
            _seeds,
            _signedMessage
        );

        _claimed[_msgSender()] = true;
        uint256 _newTokenId = _mint(
            _msgSender(),
            _imageName,
            _imageHash,
            _imageId,
            _classId,
            _dispositionId,
            _seeds,
            _signedMessage,
            _isHonorary
        );

        return _newTokenId;
    }

    function tokenInfo(uint256 _tokenId)
        external
        view
        returns (
            string memory tokenName,
            string memory imageId,
            string memory imageHash,
            string memory class,
            string memory disposition,
            uint256 level,
            uint256 strength,
            uint256 dexterity,
            uint256 vitality,
            uint256 energy,
            bool isHonorary
        )
    {
        Hero memory _hero = _tokenIdToHero[_tokenId];
        if (statsAreRevealed()) {
            return (
                _hero.name,
                _hero.imageId,
                _hero.imageHash,
                _classList[_hero.class],
                _dispositionList[_hero.disposition],
                _hero.level,
                _hero.strength,
                _hero.dexterity,
                _hero.vitality,
                _hero.energy,
                _hero.isHonorary
            );
        }

        return (
            _hero.name,
            _hero.imageId,
            _hero.imageHash,
            _classList[_hero.class],
            _dispositionList[_hero.disposition],
            _hero.level,
            0,
            0,
            0,
            0,
            _hero.isHonorary
        );
    }

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"gen1Address_","type":"address"},{"internalType":"address","name":"gen2Address_","type":"address"}],"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"imageId","type":"string"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"Purchase","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_classList","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_dispositionList","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_nameUpdatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_purchasePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addAddressToFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addAddressToHonoraryList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressList","type":"address[]"}],"name":"addAddressesToFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newClass","type":"string"}],"name":"addClass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newDisposition","type":"string"}],"name":"addDisposition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"canClaimHonorary","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"claimant","type":"address"}],"name":"canClaimProtectedClass","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"claimant","type":"address"}],"name":"hasClaimedFreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_imageName","type":"string"}],"name":"isNameAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isOnFreeMintList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"levelUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_imageName","type":"string"},{"internalType":"string","name":"_imageHash","type":"string"},{"internalType":"string","name":"_imageId","type":"string"},{"internalType":"uint256","name":"_classId","type":"uint256"},{"internalType":"uint256","name":"_dispositionId","type":"uint256"},{"internalType":"uint256[4]","name":"_seeds","type":"uint256[4]"},{"internalType":"bytes","name":"_signedMessage","type":"bytes"},{"internalType":"bytes","name":"_whitelistMessage","type":"bytes"},{"internalType":"uint256","name":"_whitelistAllocation","type":"uint256"},{"internalType":"bool","name":"_isHonorary","type":"bool"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_imageName","type":"string"},{"internalType":"string","name":"_imageHash","type":"string"},{"internalType":"string","name":"_imageId","type":"string"},{"internalType":"uint256","name":"_classId","type":"uint256"},{"internalType":"uint256","name":"_dispositionId","type":"uint256"},{"internalType":"uint256[4]","name":"_seeds","type":"uint256[4]"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bool","name":"_isHonorary","type":"bool"}],"name":"ownerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressToRemove","type":"address"}],"name":"removeAddressFromFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealStats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_imageName","type":"string"},{"internalType":"string","name":"_imageHash","type":"string"},{"internalType":"string","name":"_imageId","type":"string"},{"internalType":"uint256","name":"_classId","type":"uint256"},{"internalType":"uint256","name":"_dispositionId","type":"uint256"},{"internalType":"uint256[4]","name":"_seeds","type":"uint256[4]"},{"internalType":"bytes","name":"_signedMessage","type":"bytes"},{"internalType":"bytes","name":"_signedRewardProof","type":"bytes"},{"internalType":"bool","name":"_isHonorary","type":"bool"}],"name":"rewardMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setEPOAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setEPOWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTrainer","type":"address"}],"name":"setLevelTrainer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setMessageSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPurchasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"statsAreRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_tokenId","type":"uint256"}],"name":"tokenInfo","outputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"imageId","type":"string"},{"internalType":"string","name":"imageHash","type":"string"},{"internalType":"string","name":"class","type":"string"},{"internalType":"string","name":"disposition","type":"string"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"uint256","name":"strength","type":"uint256"},{"internalType":"uint256","name":"dexterity","type":"uint256"},{"internalType":"uint256","name":"vitality","type":"uint256"},{"internalType":"uint256","name":"energy","type":"uint256"},{"internalType":"bool","name":"isHonorary","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newImageName","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"updateImageName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"updateNameChangePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAmountTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

612710600555606460065567011c37937e08000060075561138860085560e0604052602560808181529062005b1460a03980516200004691600e916020909101906200043d565b503480156200005457600080fd5b5060405162005b5938038062005b598339810160408190526200007791620005cd565b600080546001600160a01b031916331790556001805463ffffffff60a01b1916600160a01b1790558351620000b490600f9060208701906200043d565b508251620000ca9060109060208601906200043d565b50600a80546001600160a01b038085166001600160a01b031992831617909255600b805492841692909116919091179055600380546001810182556000919091526040805180820190915260088082526729b7b931b2b932b960c11b6020929092019182526200014d9260008051602062005af48339815191520191906200043d565b5060038054600181018255600091909152604080518082019091526007808252662bb0b93934b7b960c91b60209092019182526200019e9260008051602062005af48339815191520191906200043d565b506003805460018101825560009190915260408051808201909152600b8082526a2732b1b937b6b0b731b2b960a91b6020909201918252620001f39260008051602062005af48339815191520191906200043d565b5060038054600181018255600091909152604080518082019091526004808252634d6f6e6b60e01b6020909201918252620002419260008051602062005af48339815191520191906200043d565b50600380546001810182556000919091526040805180820190915260088082526720b9b9b0b9b9b4b760c11b6020909201918252620002939260008051602062005af48339815191520191906200043d565b506003805460018101825560009190915260408051808201909152600580825264111c9d5a5960da1b6020909201918252620002e29260008051602062005af48339815191520191906200043d565b50600380546001810182556000919091526040805180820190915260098082526820b93a34b334b1b2b960b91b6020909201918252620003359260008051602062005af48339815191520191906200043d565b5060035462000347906001906200065c565b600255600480546001810182556000829052604080518082019091528281526311dbdbd960e21b6020909101908152620003959260008051602062005b39833981519152909201916200043d565b50600480546001810182556000919091526040805180820190915260078082526613995d5d1c985b60ca1b6020909201918252620003e69260008051602062005b398339815191520191906200043d565b506004805460018101825560008290526040805180820190915282815263115d9a5b60e21b6020909101908152620004329260008051602062005b39833981519152909201916200043d565b5050505050620006bf565b8280546200044b9062000682565b90600052602060002090601f0160209004810192826200046f5760008555620004ba565b82601f106200048a57805160ff1916838001178555620004ba565b82800160010185558215620004ba579182015b82811115620004ba5782518255916020019190600101906200049d565b50620004c8929150620004cc565b5090565b5b80821115620004c85760008155600101620004cd565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200050b57600080fd5b81516001600160401b0380821115620005285762000528620004e3565b604051601f8301601f19908116603f01168101908282118183101715620005535762000553620004e3565b816040528381526020925086838588010111156200057057600080fd5b600091505b8382101562000594578582018301518183018401529082019062000575565b83821115620005a65760008385830101525b9695505050505050565b80516001600160a01b0381168114620005c857600080fd5b919050565b60008060008060808587031215620005e457600080fd5b84516001600160401b0380821115620005fc57600080fd5b6200060a88838901620004f9565b955060208701519150808211156200062157600080fd5b506200063087828801620004f9565b9350506200064160408601620005b0565b91506200065160608601620005b0565b905092959194509250565b6000828210156200067d57634e487b7160e01b600052601160045260246000fd5b500390565b600181811c908216806200069757607f821691505b60208210811415620006b957634e487b7160e01b600052602260045260246000fd5b50919050565b61542580620006cf6000396000f3fe60806040526004361061038c5760003560e01c80637b73be21116101dc578063c2abb40a11610102578063dfa982fc116100a0578063f2fde38b1161006f578063f2fde38b14610a7b578063fcb7c91b14610a9b578063fcc9b56d14610abb578063fd12e17414610adb57600080fd5b8063dfa982fc146109d2578063e37dd980146109f2578063e465f1f514610a12578063e985e9c514610a3257600080fd5b8063cc33c875116100dc578063cc33c87514610946578063d5abeb011461097d578063d729666214610993578063da7eacb9146109b357600080fd5b8063c2abb40a146108f1578063c422634714610911578063c87b56dd1461092657600080fd5b8063a22cb4651161017a578063b69da57111610149578063b69da57114610857578063b88d4fde14610877578063b8e4e17514610897578063bc4d982a146108b657600080fd5b8063a22cb465146107ec578063ae76e8fb1461080c578063af74ba2a14610822578063b585209b1461084257600080fd5b80638cf44d21116101b65780638cf44d21146107795780638da5cb5b1461079957806395d89b41146107b757806397c77137146107cc57600080fd5b80637b73be21146107245780637c886b7b146107445780638456cb591461076457600080fd5b806342842e0e116102c157806358e8e77e1161025f578063629b05f01161022e578063629b05f0146106ae5780636352211e146106c457806370a08231146106e4578063759dcb121461070457600080fd5b806358e8e77e146106445780635c975abb1461065a5780635fd8c71014610679578063607696da1461068e57600080fd5b80634e4506d81161029b5780634e4506d8146105cf5780635308ddc2146105ef57806355f804b31461060f578063586b9a7c1461062f57600080fd5b806342842e0e14610556578063428640d8146105765780634b36df53146105af57600080fd5b806318160ddd1161032e57806327679cb91161030857806327679cb9146104ed5780632af891791461050c5780633f4ba83a1461052157806340429d3b1461053657600080fd5b806318160ddd146104985780631af434f5146104ad57806323b872dd146104cd57600080fd5b8063083bbe7f1161036a578063083bbe7f14610420578063095ea7b3146104375780630ce90ec214610457578063151614b01461047757600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004614811565b610aee565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b8b565b6040516103bd9190614886565b3480156103f457600080fd5b50610408610403366004614899565b610c1d565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b50610435610ca2565b005b34801561044357600080fd5b506104356104523660046148ce565b610d31565b34801561046357600080fd5b50610435610472366004614899565b610e3d565b61048a610485366004614a22565b610ef1565b6040519081526020016103bd565b3480156104a457600080fd5b5060055461048a565b3480156104b957600080fd5b506104356104c8366004614b2c565b6110fa565b3480156104d957600080fd5b506104356104e8366004614b47565b61117b565b3480156104f957600080fd5b50600154600160b81b900460ff166103b1565b34801561051857600080fd5b506104356111dc565b34801561052d57600080fd5b50610435611265565b34801561054257600080fd5b50610435610551366004614b2c565b6112ce565b34801561056257600080fd5b50610435610571366004614b47565b61134e565b34801561058257600080fd5b506103b1610591366004614b2c565b6001600160a01b031660009081526014602052604090205460ff1690565b3480156105bb57600080fd5b506104356105ca366004614b2c565b611369565b3480156105db57600080fd5b506104356105ea366004614b2c565b6113ea565b3480156105fb57600080fd5b506103b161060a366004614b2c565b61146b565b34801561061b57600080fd5b5061043561062a366004614b83565b6114b0565b34801561063b57600080fd5b5061043561151b565b34801561065057600080fd5b5061048a60085481565b34801561066657600080fd5b50600154600160a01b900460ff166103b1565b34801561068557600080fd5b506104356115a4565b34801561069a57600080fd5b506103b16106a9366004614b2c565b611640565b3480156106ba57600080fd5b5061048a60115481565b3480156106d057600080fd5b506104086106df366004614899565b611653565b3480156106f057600080fd5b5061048a6106ff366004614b2c565b6116b8565b34801561071057600080fd5b5061043561071f366004614b2c565b61172c565b34801561073057600080fd5b5061043561073f366004614899565b6117c0565b34801561075057600080fd5b5061043561075f366004614b2c565b611824565b34801561077057600080fd5b506104356118a7565b34801561078557600080fd5b506103b1610794366004614b83565b61190e565b3480156107a557600080fd5b506000546001600160a01b0316610408565b3480156107c357600080fd5b506103db61193e565b3480156107d857600080fd5b506104356107e7366004614bf5565b61194d565b3480156107f857600080fd5b50610435610807366004614c58565b611a1e565b34801561081857600080fd5b5061048a60075481565b34801561082e57600080fd5b5061043561083d366004614c8f565b611ae3565b34801561084e57600080fd5b50610435611ed1565b34801561086357600080fd5b506103db610872366004614899565b611f60565b34801561088357600080fd5b50610435610892366004614cd4565b61200c565b3480156108a357600080fd5b50600154600160b01b900460ff166103b1565b3480156108c257600080fd5b506103b16108d1366004614b2c565b6001600160a01b031660009081526012602052604090205460ff16151590565b3480156108fd57600080fd5b5061043561090c366004614b83565b612074565b34801561091d57600080fd5b50610435612110565b34801561093257600080fd5b506103db610941366004614899565b61219f565b34801561095257600080fd5b50610966610961366004614899565b612288565b6040516103bd9b9a99989796959493929190614d3c565b34801561098957600080fd5b5061048a60055481565b34801561099f57600080fd5b506104356109ae366004614899565b612829565b3480156109bf57600080fd5b50600154600160a81b900460ff166103b1565b3480156109de57600080fd5b506104356109ed366004614b2c565b61288d565b3480156109fe57600080fd5b506103db610a0d366004614899565b612910565b348015610a1e57600080fd5b50610435610a2d3660046148ce565b612920565b348015610a3e57600080fd5b506103b1610a4d366004614ddb565b6001600160a01b03918216600090815260196020908152604080832093909416825291909152205460ff1690565b348015610a8757600080fd5b50610435610a96366004614b2c565b6129c2565b348015610aa757600080fd5b50610435610ab6366004614b83565b612a56565b348015610ac757600080fd5b5061048a610ad6366004614e0e565b612af2565b61048a610ae9366004614edf565b612c19565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b5157506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b8557507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6060600f8054610b9a90614ff4565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc690614ff4565b8015610c135780601f10610be857610100808354040283529160200191610c13565b820191906000526020600020905b815481529060010190602001808311610bf657829003601f168201915b5050505050905090565b6000818152601660205260408120546001600160a01b0316610c865760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e0000000000000060448201526064015b60405180910390fd5b506000908152601860205260409020546001600160a01b031690565b6000546001600160a01b03163314610d015760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600180547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16600160a81b179055565b6000610d3c82611653565b9050806001600160a01b0316836001600160a01b03161415610da05760405162461bcd60e51b815260206004820152601560248201527f4552433732313a2063757272656e74206f776e657200000000000000000000006044820152606401610c7d565b336001600160a01b0382161480610dbc5750610dbc8133610a4d565b610e2e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c7d565b610e388383612e00565b505050565b6001546001600160a01b03163314610ebd5760405162461bcd60e51b815260206004820152602d60248201527f4f6e6c7920746865206c6576656c20747261696e6572206d61792063616c6c2060448201527f746869732066756e6374696f6e000000000000000000000000000000000000006064820152608401610c7d565b600554811115610ecc57600080fd5b6000818152601a60205260408120600501805491610ee983615045565b919050555050565b600154600090600160a01b900460ff1615610f415760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c7d565b333b15610f7b5760405162461bcd60e51b815260206004820152600860248201526718dbdb9d1c9858dd60c21b6044820152606401610c7d565b60055460115410610fbb5760405162461bcd60e51b815260206004820152600a6024820152696d617820737570706c7960b01b6044820152606401610c7d565b610fc482612e6e565b610ffb5760405162461bcd60e51b8152602060048201526008602482015267686f6e6f7261727960c01b6044820152606401610c7d565b3360009081526014602052604090205460ff161561105b5760405162461bcd60e51b815260206004820152600560248201527f636c61696d0000000000000000000000000000000000000000000000000000006044820152606401610c7d565b61106483612edd565b6110b05760405162461bcd60e51b815260206004820152600960248201527f656c6c696769626c6500000000000000000000000000000000000000000000006044820152606401610c7d565b6110bf8a8a8a8a8a8a8a612f07565b336000818152601460205260408120805460ff19166001179055906110eb908c8c8c8c8c8c8c8b613189565b9b9a5050505050505050505050565b6000546001600160a01b031633146111595760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b61118533826131c6565b6111d15760405162461bcd60e51b815260206004820152601e60248201527f4552433732313a206e6f74206f776e6572206e6f7220617070726f76656400006044820152606401610c7d565b610e388383836132a8565b6000546001600160a01b0316331461123b5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600180547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff169055565b6000546001600160a01b031633146112c45760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6112cc61342a565b565b6000546001600160a01b0316331461132d5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6001600160a01b03166000908152601260205260409020805460ff19169055565b610e388383836040518060200160405280600081525061200c565b6000546001600160a01b031633146113c85760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114495760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526013602052604081205460ff1615801590610b855750506001600160a01b031660009081526015602052604090205460ff161590565b6000546001600160a01b0316331461150f5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b610e38600e83836146ee565b6000546001600160a01b0316331461157a5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600180547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055565b6000546001600160a01b031633146116035760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f1935050505015801561163d573d6000803e3d6000fd5b50565b60008061164c836134eb565b1192915050565b6000818152601660205260408120546001600160a01b031680610b855760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610c7d565b60006001600160a01b0382166117105760405162461bcd60e51b815260206004820152601460248201527f4552433732313a207a65726f20616464726573730000000000000000000000006044820152606401610c7d565b506001600160a01b031660009081526017602052604090205490565b6000546001600160a01b0316331461178b5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6001600160a01b03811661179e57600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461181f5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600855565b6000546001600160a01b031633146118835760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6001600160a01b03166000908152601260205260409020805460ff19166001179055565b6000546001600160a01b031633146119065760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6112cc6135d6565b6000601e8383604051611922929190615060565b9081526040519081900360200190205460ff1615905092915050565b606060108054610b9a90614ff4565b6000546001600160a01b031633146119ac5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b60005b81811015610e38576001601260008585858181106119cf576119cf615070565b90506020020160208101906119e49190614b2c565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a1681615045565b9150506119af565b6001600160a01b038216331415611a775760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c7d565b3360008181526019602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600154600160a01b900460ff1615611b305760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c7d565b600c546001600160a01b031633611b4683611653565b6001600160a01b031614611b5957600080fd5b6008546001600160a01b0382166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd49190615086565b1015611c225760405162461bcd60e51b815260206004820152600760248201527f65706f2062616c000000000000000000000000000000000000000000000000006044820152606401610c7d565b6008546001600160a01b03821663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa158015611c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca39190615086565b1015611cf15760405162461bcd60e51b815260206004820152600960248201527f616c6c6f77616e636500000000000000000000000000000000000000000000006044820152606401610c7d565b60065483511115611d445760405162461bcd60e51b815260206004820152600660248201527f6c656e67746800000000000000000000000000000000000000000000000000006044820152606401610c7d565b601e83604051611d54919061509f565b9081526040519081900360200190205460ff1615611db65760405162461bcd60e51b8152600401610c7d9060208082526004908201527f7573656400000000000000000000000000000000000000000000000000000000604082015260600190565b6001600160a01b0381166323b872dd33600d5460085460405160e085901b6001600160e01b03191681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015611e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4491906150bb565b506000828152601a60205260408082209051909190601e90611e679084906150d8565b908152604051908190036020018120805492151560ff1990931692909217909155600190601e90611e9990879061509f565b90815260405160209181900382019020805460ff1916921515929092179091558451611eca91839190870190614772565b5050505050565b6000546001600160a01b03163314611f305760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600180547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16600160b01b179055565b60048181548110611f7057600080fd5b906000526020600020016000915090508054611f8b90614ff4565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb790614ff4565b80156120045780601f10611fd957610100808354040283529160200191612004565b820191906000526020600020905b815481529060010190602001808311611fe757829003601f168201915b505050505081565b61201633836131c6565b6120625760405162461bcd60e51b815260206004820152601e60248201527f4552433732313a206e6f74206f776e6572206e6f7220617070726f76656400006044820152606401610c7d565b61206e84848484613679565b50505050565b6000546001600160a01b031633146120d35760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b60038054600181018255600091909152610e38907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0183836146ee565b6000546001600160a01b0316331461216f5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600180547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b179055565b6000818152601660205260409020546060906001600160a01b031661222c5760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a206e6f6e6578697374656e7420746f6b6560448201527f6e000000000000000000000000000000000000000000000000000000000000006064820152608401610c7d565b60006122366136eb565b905060008151116122565760405180602001604052806000815250612281565b80612260846136fa565b604051602001612271929190615174565b6040516020818303038152906040525b9392505050565b60608060608060606000806000806000806000601a60008e8152602001908152602001600020604051806101600160405290816000820180546122ca90614ff4565b80601f01602080910402602001604051908101604052809291908181526020018280546122f690614ff4565b80156123435780601f1061231857610100808354040283529160200191612343565b820191906000526020600020905b81548152906001019060200180831161232657829003601f168201915b5050505050815260200160018201805461235c90614ff4565b80601f016020809104026020016040519081016040528092919081815260200182805461238890614ff4565b80156123d55780601f106123aa576101008083540402835291602001916123d5565b820191906000526020600020905b8154815290600101906020018083116123b857829003601f168201915b505050505081526020016002820180546123ee90614ff4565b80601f016020809104026020016040519081016040528092919081815260200182805461241a90614ff4565b80156124675780601f1061243c57610100808354040283529160200191612467565b820191906000526020600020905b81548152906001019060200180831161244a57829003601f168201915b505050918352505060038201546020820152600482015460408201526005820154606082015260068201546080820152600782015460a0820152600882015460c0820152600982015460e0820152600a9091015460ff1615156101009091015290506124dd60015460ff600160b81b9091041690565b1561268857806000015181602001518260400151600384606001518154811061250857612508615070565b90600052602060002001600485608001518154811061252957612529615070565b906000526020600020018560a001518660c001518760e001518861010001518961012001518a610140015187805461256090614ff4565b80601f016020809104026020016040519081016040528092919081815260200182805461258c90614ff4565b80156125d95780601f106125ae576101008083540402835291602001916125d9565b820191906000526020600020905b8154815290600101906020018083116125bc57829003601f168201915b505050505097508680546125ec90614ff4565b80601f016020809104026020016040519081016040528092919081815260200182805461261890614ff4565b80156126655780601f1061263a57610100808354040283529160200191612665565b820191906000526020600020905b81548152906001019060200180831161264857829003601f168201915b505050505096509b509b509b509b509b509b509b509b509b509b509b505061281a565b80600001518160200151826040015160038460600151815481106126ae576126ae615070565b9060005260206000200160048560800151815481106126cf576126cf615070565b906000526020600020018560a001516000806000808a61014001518780546126f690614ff4565b80601f016020809104026020016040519081016040528092919081815260200182805461272290614ff4565b801561276f5780601f106127445761010080835404028352916020019161276f565b820191906000526020600020905b81548152906001019060200180831161275257829003601f168201915b5050505050975086805461278290614ff4565b80601f01602080910402602001604051908101604052809291908181526020018280546127ae90614ff4565b80156127fb5780601f106127d0576101008083540402835291602001916127fb565b820191906000526020600020905b8154815290600101906020018083116127de57829003601f168201915b505050505096509b509b509b509b509b509b509b509b509b509b509b50505b91939597999b90929496989a50565b6000546001600160a01b031633146128885760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600755565b6000546001600160a01b031633146128ec5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b60038181548110611f7057600080fd5b6000546001600160a01b0316331461297f5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b8047101561298c57600080fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610e38573d6000803e3d6000fd5b6000546001600160a01b03163314612a215760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6001600160a01b038116612a3457600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612ab55760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b60048054600181018255600091909152610e38907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0183836146ee565b600080546001600160a01b03163314612b525760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b60055460115410612b925760405162461bcd60e51b815260206004820152600a6024820152696d617820737570706c7960b01b6044820152606401610c7d565b6003548610612bcb5760405162461bcd60e51b8152602060048201526005602482015264636c61737360d81b6044820152606401610c7d565b6004548510612c055760405162461bcd60e51b8152600401610c7d906020808252600490820152630646973760e41b604082015260600190565b8860006110eb85838c8c8c8c8c858c613189565b600154600090600160a01b900460ff1615612c695760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c7d565b333b15612ca35760405162461bcd60e51b815260206004820152600860248201526718dbdb9d1c9858dd60c21b6044820152606401610c7d565b612cac82612e6e565b612ce35760405162461bcd60e51b8152602060048201526008602482015267686f6e6f7261727960c01b6044820152606401610c7d565b600754341015612d355760405162461bcd60e51b815260206004820152600560248201527f70726963650000000000000000000000000000000000000000000000000000006044820152606401610c7d565b612d403384866137f8565b612d8e5760405162461bcd60e51b8152600401610c7d9060208082526004908201527f6d696e7400000000000000000000000000000000000000000000000000000000604082015260600190565b60055460115410612dce5760405162461bcd60e51b815260206004820152600a6024820152696d617820737570706c7960b01b6044820152606401610c7d565b612ddd8b8b8b8b8b8b8b612f07565b6000612df0338d8d8d8d8d8d8d8b613189565b9c9b505050505050505050505050565b600081815260186020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612e3582611653565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081612e7d57506001919050565b3360009081526013602052604090205460ff1615801590612eae57503360009081526015602052604090205460ff16155b15612ed5575050336000908152601560205260409020805460ff1916600190811790915590565b506000919050565b6000612ee8826138c5565b80610b855750503360009081526012602052604090205460ff16919050565b60065487511115612f5a5760405162461bcd60e51b815260206004820152600360248201527f6c656e00000000000000000000000000000000000000000000000000000000006044820152606401610c7d565b601e87604051612f6a919061509f565b9081526040519081900360200190205460ff1615612fcc5760405162461bcd60e51b8152600401610c7d9060208082526004908201527f6e616d6500000000000000000000000000000000000000000000000000000000604082015260600190565b601d85604051612fdc919061509f565b9081526040519081900360200190205460ff161561303c5760405162461bcd60e51b815260206004820152600260248201527f69640000000000000000000000000000000000000000000000000000000000006044820152606401610c7d565b601c8660405161304c919061509f565b9081526040519081900360200190205460ff16156130ae5760405162461bcd60e51b8152600401610c7d9060208082526004908201527f6861736800000000000000000000000000000000000000000000000000000000604082015260600190565b6130b784613981565b6130eb5760405162461bcd60e51b8152602060048201526005602482015264636c61737360d81b6044820152606401610c7d565b60045483106131255760405162461bcd60e51b8152600401610c7d906020808252600490820152630646973760e41b604082015260600190565b61313487878787878787613a0a565b6131805760405162461bcd60e51b815260206004820152600960248201527f7369676e617475726500000000000000000000000000000000000000000000006044820152606401610c7d565b50505050505050565b600080601154600161319b91906151a3565b90506131a78b82613b3a565b6131b88a8a8a8a8a89878c8b613b58565b9a9950505050505050505050565b6000818152601660205260408120546001600160a01b031661322a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610c7d565b600061323583611653565b9050806001600160a01b0316846001600160a01b031614806132705750836001600160a01b031661326584610c1d565b6001600160a01b0316145b806132a057506001600160a01b0380821660009081526019602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166132bb82611653565b6001600160a01b0316146133115760405162461bcd60e51b815260206004820152600f60248201527f4552433732313a206e6f74206f776e00000000000000000000000000000000006044820152606401610c7d565b6001600160a01b0382166133675760405162461bcd60e51b815260206004820152601460248201527f4552433732313a207a65726f20616464726573730000000000000000000000006044820152606401610c7d565b613372600082612e00565b6001600160a01b038316600090815260176020526040812080546001929061339b9084906151bb565b90915550506001600160a01b03821660009081526017602052604081208054600192906133c99084906151a3565b909155505060008181526016602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600154600160a01b900460ff166134835760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610c7d565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600a54600b546040516370a0823160e01b81526001600160a01b038481166004830152600093811692169081906370a0823190602401602060405180830381865afa15801561353e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135629190615086565b6040516370a0823160e01b81526001600160a01b0386811660048301528416906370a0823190602401602060405180830381865afa1580156135a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cc9190615086565b6132a091906151a3565b600154600160a01b900460ff16156136235760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c7d565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586134ce3390565b6136848484846132a8565b61369084848484613d7f565b61206e5760405162461bcd60e51b815260206004820152602660248201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560448201526536b2b73a32b960d11b6064820152608401610c7d565b6060600e8054610b9a90614ff4565b60608161371e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613748578061373281615045565b91506137419050600a836151e8565b9150613722565b60008167ffffffffffffffff811115613763576137636148f8565b6040519080825280601f01601f19166020018201604052801561378d576020820181803683370190505b5090505b84156132a0576137a26001836151bb565b91506137af600a866151fc565b6137ba9060306151a3565b60f81b8183815181106137cf576137cf615070565b60200101906001600160f81b031916908160001a9053506137f1600a866151e8565b9450613791565b600154600090600160b01b900460ff161561381557506001612281565b600154600160a81b900460ff16156138bb57600061386c61383e866001600160a01b0316613ebc565b613847866136fa565b604051602001613858929190615174565b604051602081830303815290604052614100565b9050600061387a828561413b565b905084613886876116b8565b1080156138a057506009546001600160a01b038281169116145b156138b057600192505050612281565b600092505050612281565b5060009392505050565b6000601b826040516138d7919061509f565b9081526040519081900360200190205460ff16156138f757506000919050565b600061391561390533613ebc565b604051602001613858919061509f565b90506000613923828561413b565b6009549091506001600160a01b03808316911614613945575060009392505050565b6001601b85604051613957919061509f565b908152604051908190036020019020805491151560ff199092169190911790555060019392505050565b60035460009082106139d55760405162461bcd60e51b815260206004820152600860248201527f636c6173732069640000000000000000000000000000000000000000000000006044820152606401610c7d565b6000806139e1336134eb565b119050600254831480156139f3575080155b15613a015750600092915050565b50600192915050565b6000601b82604051613a1c919061509f565b9081526040519081900360200190205460ff1615613a3c57506000613b2f565b6000613a4e84825b60200201516136fa565b613a59856001613a44565b613a64866002613a44565b613a6f876003613a44565b604051602001613a829493929190615210565b60405160208183030381529060405290506000613ac38a898b613aa48b6136fa565b613aad8b6136fa565b8760405160200161385896959493929190615267565b90506000613ad1828661413b565b6009549091506001600160a01b03808316911614613af55760009350505050613b2f565b6001601b86604051613b07919061509f565b908152604051908190036020019020805491151560ff19909216919091179055506001925050505b979650505050505050565b613b5482826040518060200160405280600081525061415f565b5050565b6001601b85604051613b6a919061509f565b908152604051908190036020018120805492151560ff1990931692909217909155600190601d90613b9c908a9061509f565b908152604051908190036020018120805492151560ff1990931692909217909155600190601c90613bce908b9061509f565b908152604051908190036020018120805492151560ff1990931692909217909155600190601e90613c00908c9061509f565b908152602001604051809103902060006101000a81548160ff02191690831515021790555060006040518061016001604052808b81526020018981526020018a815260200188815260200187815260200160018152602001613c7885600060048110613c6e57613c6e615070565b60200201516141d1565b8152602001613c88856001613c6e565b8152602001613c98856002613c6e565b8152602001613ca8856003613c6e565b81528315156020918201526000868152601a8252604090208251805193945084939192613cda92849290910190614772565b506020828101518051613cf39260018501920190614772565b5060408201518051613d0f916002840191602090910190614772565b50606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e082015160078201556101008201516008820155610120820151600982015561014090910151600a909101805460ff191691151591909117905550505050505050505050565b60006001600160a01b0384163b15613eb157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613dc39033908990889088906004016152e6565b6020604051808303816000875af1925050508015613dfe575060408051601f3d908101601f19168201909252613dfb91810190615322565b60015b613e97573d808015613e2c576040519150601f19603f3d011682016040523d82523d6000602084013e613e31565b606091505b508051613e8f5760405162461bcd60e51b815260206004820152602660248201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560448201526536b2b73a32b960d11b6064820152608401610c7d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506132a0565b506001949350505050565b604080518082018252601081527f303132333435363738396162636465660000000000000000000000000000000060208201528151602a80825260608281019094526001600160a01b0385169291600091602082018180368337019050509050600360fc1b81600081518110613f3457613f34615070565b60200101906001600160f81b031916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613f7f57613f7f615070565b60200101906001600160f81b031916908160001a90535060005b60148110156140f75782600485613fb184600c6151a3565b60208110613fc157613fc1615070565b1a60f81b6001600160f81b031916901c60f81c60ff1681518110613fe757613fe7615070565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168261401a83600261533f565b6140259060026151a3565b8151811061403557614035615070565b60200101906001600160f81b031916908160001a905350828461405983600c6151a3565b6020811061406957614069615070565b825191901a600f1690811061408057614080615070565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016826140b383600261533f565b6140be9060036151a3565b815181106140ce576140ce615070565b60200101906001600160f81b031916908160001a905350806140ef81615045565b915050613f99565b50949350505050565b600061410c82516136fa565b8260405160200161411e92919061535e565b604051602081830303815290604052805190602001209050919050565b600080600061414a858561422a565b915091506141578161429a565b509392505050565b6141698383614455565b6141766000848484613d7f565b610e385760405162461bcd60e51b815260206004820152602660248201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560448201526536b2b73a32b960d11b6064820152608401610c7d565b600080600a6141e16001436151bb565b604080519140602083015281018590526060016040516020818303038152906040528051906020012060001c61421791906151fc565b905060008111610b855750600a92915050565b6000808251604114156142615760208301516040840151606085015160001a614255878285856145b9565b94509450505050614293565b82516040141561428b57602083015160408401516142808683836146a6565b935093505050614293565b506000905060025b9250929050565b60008160048111156142ae576142ae6153b9565b14156142b75750565b60018160048111156142cb576142cb6153b9565b14156143195760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c7d565b600281600481111561432d5761432d6153b9565b141561437b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c7d565b600381600481111561438f5761438f6153b9565b14156143e85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610c7d565b60048160048111156143fc576143fc6153b9565b141561163d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610c7d565b6001600160a01b0382166144ab5760405162461bcd60e51b815260206004820152601460248201527f4552433732313a207a65726f20616464726573730000000000000000000000006044820152606401610c7d565b6000818152601660205260409020546001600160a01b0316156145105760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c7d565b6001600160a01b03821660009081526017602052604081208054600192906145399084906151a3565b9091555050600081815260166020526040812080546001600160a01b0319166001600160a01b03851617905560118054600192906145789084906151a3565b909155505060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156145f0575060009050600361469d565b8460ff16601b1415801561460857508460ff16601c14155b15614619575060009050600461469d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561466d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166146965760006001925092505061469d565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016146e0878288856145b9565b935093505050935093915050565b8280546146fa90614ff4565b90600052602060002090601f01602090048101928261471c5760008555614762565b82601f106147355782800160ff19823516178555614762565b82800160010185558215614762579182015b82811115614762578235825591602001919060010190614747565b5061476e9291506147e6565b5090565b82805461477e90614ff4565b90600052602060002090601f0160209004810192826147a05760008555614762565b82601f106147b957805160ff1916838001178555614762565b82800160010185558215614762579182015b828111156147625782518255916020019190600101906147cb565b5b8082111561476e57600081556001016147e7565b6001600160e01b03198116811461163d57600080fd5b60006020828403121561482357600080fd5b8135612281816147fb565b60005b83811015614849578181015183820152602001614831565b8381111561206e5750506000910152565b6000815180845261487281602086016020860161482e565b601f01601f19169290920160200192915050565b602081526000612281602083018461485a565b6000602082840312156148ab57600080fd5b5035919050565b80356001600160a01b03811681146148c957600080fd5b919050565b600080604083850312156148e157600080fd5b6148ea836148b2565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261491f57600080fd5b813567ffffffffffffffff8082111561493a5761493a6148f8565b604051601f8301601f19908116603f01168101908282118183101715614962576149626148f8565b8160405283815286602085880101111561497b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f8301126149ac57600080fd5b6040516080810181811067ffffffffffffffff821117156149cf576149cf6148f8565b6040528060808401858111156149e457600080fd5b845b818110156149fe5780358352602092830192016149e6565b509195945050505050565b801515811461163d57600080fd5b80356148c981614a09565b60008060008060008060008060006101808a8c031215614a4157600080fd5b893567ffffffffffffffff80821115614a5957600080fd5b614a658d838e0161490e565b9a5060208c0135915080821115614a7b57600080fd5b614a878d838e0161490e565b995060408c0135915080821115614a9d57600080fd5b614aa98d838e0161490e565b985060608c0135975060808c01359650614ac68d60a08e0161499b565b95506101208c0135915080821115614add57600080fd5b614ae98d838e0161490e565b94506101408c0135915080821115614b0057600080fd5b50614b0d8c828d0161490e565b925050614b1d6101608b01614a17565b90509295985092959850929598565b600060208284031215614b3e57600080fd5b612281826148b2565b600080600060608486031215614b5c57600080fd5b614b65846148b2565b9250614b73602085016148b2565b9150604084013590509250925092565b60008060208385031215614b9657600080fd5b823567ffffffffffffffff80821115614bae57600080fd5b818501915085601f830112614bc257600080fd5b813581811115614bd157600080fd5b866020828501011115614be357600080fd5b60209290920196919550909350505050565b60008060208385031215614c0857600080fd5b823567ffffffffffffffff80821115614c2057600080fd5b818501915085601f830112614c3457600080fd5b813581811115614c4357600080fd5b8660208260051b8501011115614be357600080fd5b60008060408385031215614c6b57600080fd5b614c74836148b2565b91506020830135614c8481614a09565b809150509250929050565b60008060408385031215614ca257600080fd5b823567ffffffffffffffff811115614cb957600080fd5b614cc58582860161490e565b95602094909401359450505050565b60008060008060808587031215614cea57600080fd5b614cf3856148b2565b9350614d01602086016148b2565b925060408501359150606085013567ffffffffffffffff811115614d2457600080fd5b614d308782880161490e565b91505092959194509250565b6000610160808352614d508184018f61485a565b90508281036020840152614d64818e61485a565b90508281036040840152614d78818d61485a565b90508281036060840152614d8c818c61485a565b90508281036080840152614da0818b61485a565b60a0840199909952505060c081019590955260e085019390935261010084019190915261012083015215156101409091015295945050505050565b60008060408385031215614dee57600080fd5b614df7836148b2565b9150614e05602084016148b2565b90509250929050565b600080600080600080600080610160898b031215614e2b57600080fd5b883567ffffffffffffffff80821115614e4357600080fd5b614e4f8c838d0161490e565b995060208b0135915080821115614e6557600080fd5b614e718c838d0161490e565b985060408b0135915080821115614e8757600080fd5b50614e948b828c0161490e565b9650506060890135945060808901359350614eb28a60a08b0161499b565b9250614ec16101208a016148b2565b9150614ed06101408a01614a17565b90509295985092959890939650565b6000806000806000806000806000806101a08b8d031215614eff57600080fd5b8a3567ffffffffffffffff80821115614f1757600080fd5b614f238e838f0161490e565b9b5060208d0135915080821115614f3957600080fd5b614f458e838f0161490e565b9a5060408d0135915080821115614f5b57600080fd5b614f678e838f0161490e565b995060608d0135985060808d01359750614f848e60a08f0161499b565b96506101208d0135915080821115614f9b57600080fd5b614fa78e838f0161490e565b95506101408d0135915080821115614fbe57600080fd5b50614fcb8d828e0161490e565b9350506101608b01359150614fe36101808c01614a17565b90509295989b9194979a5092959850565b600181811c9082168061500857607f821691505b6020821081141561502957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006000198214156150595761505961502f565b5060010190565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561509857600080fd5b5051919050565b600082516150b181846020870161482e565b9190910192915050565b6000602082840312156150cd57600080fd5b815161228181614a09565b600080835481600182811c9150808316806150f457607f831692505b602080841082141561511457634e487b7160e01b86526022600452602486fd5b818015615128576001811461513957615166565b60ff19861689528489019650615166565b60008a81526020902060005b8681101561515e5781548b820152908501908301615145565b505084890196505b509498975050505050505050565b6000835161518681846020880161482e565b83519083019061519a81836020880161482e565b01949350505050565b600082198211156151b6576151b661502f565b500190565b6000828210156151cd576151cd61502f565b500390565b634e487b7160e01b600052601260045260246000fd5b6000826151f7576151f76151d2565b500490565b60008261520b5761520b6151d2565b500690565b60008551615222818460208a0161482e565b855190830190615236818360208a0161482e565b855191019061524981836020890161482e565b845191019061525c81836020880161482e565b019695505050505050565b60008751602061527a8285838d0161482e565b88519184019161528d8184848d0161482e565b885192019161529f8184848c0161482e565b87519201916152b18184848b0161482e565b86519201916152c38184848a0161482e565b85519201916152d5818484890161482e565b919091019998505050505050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152615318608083018461485a565b9695505050505050565b60006020828403121561533457600080fd5b8151612281816147fb565b60008160001904831182151516156153595761535961502f565b500290565b7f19457468657265756d205369676e6564204d6573736167653a0a00000000000081526000835161539681601a85016020880161482e565b8351908301906153ad81601a84016020880161482e565b01601a01949350505050565b634e487b7160e01b600052602160045260246000fdfe4f6e6c792074686520636f6e7472616374206f776e6572206d61792063616c6ca2646970667358221220ea1b1328662447503a5a04793281db1afbdc2697db60a5b87f92eba51e90b11b64736f6c634300080b0033c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b68747470733a2f2f6172742d61692e636f6d2f6170692f6865726f2f6d657461646174612f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000aa20f900e24ca7ed897c44d92012158f436ef791000000000000000000000000bf0f9180325d2606765c8fc60566810830b897b0000000000000000000000000000000000000000000000000000000000000000945706f4865726f6573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044845524f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061038c5760003560e01c80637b73be21116101dc578063c2abb40a11610102578063dfa982fc116100a0578063f2fde38b1161006f578063f2fde38b14610a7b578063fcb7c91b14610a9b578063fcc9b56d14610abb578063fd12e17414610adb57600080fd5b8063dfa982fc146109d2578063e37dd980146109f2578063e465f1f514610a12578063e985e9c514610a3257600080fd5b8063cc33c875116100dc578063cc33c87514610946578063d5abeb011461097d578063d729666214610993578063da7eacb9146109b357600080fd5b8063c2abb40a146108f1578063c422634714610911578063c87b56dd1461092657600080fd5b8063a22cb4651161017a578063b69da57111610149578063b69da57114610857578063b88d4fde14610877578063b8e4e17514610897578063bc4d982a146108b657600080fd5b8063a22cb465146107ec578063ae76e8fb1461080c578063af74ba2a14610822578063b585209b1461084257600080fd5b80638cf44d21116101b65780638cf44d21146107795780638da5cb5b1461079957806395d89b41146107b757806397c77137146107cc57600080fd5b80637b73be21146107245780637c886b7b146107445780638456cb591461076457600080fd5b806342842e0e116102c157806358e8e77e1161025f578063629b05f01161022e578063629b05f0146106ae5780636352211e146106c457806370a08231146106e4578063759dcb121461070457600080fd5b806358e8e77e146106445780635c975abb1461065a5780635fd8c71014610679578063607696da1461068e57600080fd5b80634e4506d81161029b5780634e4506d8146105cf5780635308ddc2146105ef57806355f804b31461060f578063586b9a7c1461062f57600080fd5b806342842e0e14610556578063428640d8146105765780634b36df53146105af57600080fd5b806318160ddd1161032e57806327679cb91161030857806327679cb9146104ed5780632af891791461050c5780633f4ba83a1461052157806340429d3b1461053657600080fd5b806318160ddd146104985780631af434f5146104ad57806323b872dd146104cd57600080fd5b8063083bbe7f1161036a578063083bbe7f14610420578063095ea7b3146104375780630ce90ec214610457578063151614b01461047757600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004614811565b610aee565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b8b565b6040516103bd9190614886565b3480156103f457600080fd5b50610408610403366004614899565b610c1d565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b50610435610ca2565b005b34801561044357600080fd5b506104356104523660046148ce565b610d31565b34801561046357600080fd5b50610435610472366004614899565b610e3d565b61048a610485366004614a22565b610ef1565b6040519081526020016103bd565b3480156104a457600080fd5b5060055461048a565b3480156104b957600080fd5b506104356104c8366004614b2c565b6110fa565b3480156104d957600080fd5b506104356104e8366004614b47565b61117b565b3480156104f957600080fd5b50600154600160b81b900460ff166103b1565b34801561051857600080fd5b506104356111dc565b34801561052d57600080fd5b50610435611265565b34801561054257600080fd5b50610435610551366004614b2c565b6112ce565b34801561056257600080fd5b50610435610571366004614b47565b61134e565b34801561058257600080fd5b506103b1610591366004614b2c565b6001600160a01b031660009081526014602052604090205460ff1690565b3480156105bb57600080fd5b506104356105ca366004614b2c565b611369565b3480156105db57600080fd5b506104356105ea366004614b2c565b6113ea565b3480156105fb57600080fd5b506103b161060a366004614b2c565b61146b565b34801561061b57600080fd5b5061043561062a366004614b83565b6114b0565b34801561063b57600080fd5b5061043561151b565b34801561065057600080fd5b5061048a60085481565b34801561066657600080fd5b50600154600160a01b900460ff166103b1565b34801561068557600080fd5b506104356115a4565b34801561069a57600080fd5b506103b16106a9366004614b2c565b611640565b3480156106ba57600080fd5b5061048a60115481565b3480156106d057600080fd5b506104086106df366004614899565b611653565b3480156106f057600080fd5b5061048a6106ff366004614b2c565b6116b8565b34801561071057600080fd5b5061043561071f366004614b2c565b61172c565b34801561073057600080fd5b5061043561073f366004614899565b6117c0565b34801561075057600080fd5b5061043561075f366004614b2c565b611824565b34801561077057600080fd5b506104356118a7565b34801561078557600080fd5b506103b1610794366004614b83565b61190e565b3480156107a557600080fd5b506000546001600160a01b0316610408565b3480156107c357600080fd5b506103db61193e565b3480156107d857600080fd5b506104356107e7366004614bf5565b61194d565b3480156107f857600080fd5b50610435610807366004614c58565b611a1e565b34801561081857600080fd5b5061048a60075481565b34801561082e57600080fd5b5061043561083d366004614c8f565b611ae3565b34801561084e57600080fd5b50610435611ed1565b34801561086357600080fd5b506103db610872366004614899565b611f60565b34801561088357600080fd5b50610435610892366004614cd4565b61200c565b3480156108a357600080fd5b50600154600160b01b900460ff166103b1565b3480156108c257600080fd5b506103b16108d1366004614b2c565b6001600160a01b031660009081526012602052604090205460ff16151590565b3480156108fd57600080fd5b5061043561090c366004614b83565b612074565b34801561091d57600080fd5b50610435612110565b34801561093257600080fd5b506103db610941366004614899565b61219f565b34801561095257600080fd5b50610966610961366004614899565b612288565b6040516103bd9b9a99989796959493929190614d3c565b34801561098957600080fd5b5061048a60055481565b34801561099f57600080fd5b506104356109ae366004614899565b612829565b3480156109bf57600080fd5b50600154600160a81b900460ff166103b1565b3480156109de57600080fd5b506104356109ed366004614b2c565b61288d565b3480156109fe57600080fd5b506103db610a0d366004614899565b612910565b348015610a1e57600080fd5b50610435610a2d3660046148ce565b612920565b348015610a3e57600080fd5b506103b1610a4d366004614ddb565b6001600160a01b03918216600090815260196020908152604080832093909416825291909152205460ff1690565b348015610a8757600080fd5b50610435610a96366004614b2c565b6129c2565b348015610aa757600080fd5b50610435610ab6366004614b83565b612a56565b348015610ac757600080fd5b5061048a610ad6366004614e0e565b612af2565b61048a610ae9366004614edf565b612c19565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b5157506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b8557507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6060600f8054610b9a90614ff4565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc690614ff4565b8015610c135780601f10610be857610100808354040283529160200191610c13565b820191906000526020600020905b815481529060010190602001808311610bf657829003601f168201915b5050505050905090565b6000818152601660205260408120546001600160a01b0316610c865760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e0000000000000060448201526064015b60405180910390fd5b506000908152601860205260409020546001600160a01b031690565b6000546001600160a01b03163314610d015760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600180547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16600160a81b179055565b6000610d3c82611653565b9050806001600160a01b0316836001600160a01b03161415610da05760405162461bcd60e51b815260206004820152601560248201527f4552433732313a2063757272656e74206f776e657200000000000000000000006044820152606401610c7d565b336001600160a01b0382161480610dbc5750610dbc8133610a4d565b610e2e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c7d565b610e388383612e00565b505050565b6001546001600160a01b03163314610ebd5760405162461bcd60e51b815260206004820152602d60248201527f4f6e6c7920746865206c6576656c20747261696e6572206d61792063616c6c2060448201527f746869732066756e6374696f6e000000000000000000000000000000000000006064820152608401610c7d565b600554811115610ecc57600080fd5b6000818152601a60205260408120600501805491610ee983615045565b919050555050565b600154600090600160a01b900460ff1615610f415760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c7d565b333b15610f7b5760405162461bcd60e51b815260206004820152600860248201526718dbdb9d1c9858dd60c21b6044820152606401610c7d565b60055460115410610fbb5760405162461bcd60e51b815260206004820152600a6024820152696d617820737570706c7960b01b6044820152606401610c7d565b610fc482612e6e565b610ffb5760405162461bcd60e51b8152602060048201526008602482015267686f6e6f7261727960c01b6044820152606401610c7d565b3360009081526014602052604090205460ff161561105b5760405162461bcd60e51b815260206004820152600560248201527f636c61696d0000000000000000000000000000000000000000000000000000006044820152606401610c7d565b61106483612edd565b6110b05760405162461bcd60e51b815260206004820152600960248201527f656c6c696769626c6500000000000000000000000000000000000000000000006044820152606401610c7d565b6110bf8a8a8a8a8a8a8a612f07565b336000818152601460205260408120805460ff19166001179055906110eb908c8c8c8c8c8c8c8b613189565b9b9a5050505050505050505050565b6000546001600160a01b031633146111595760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b61118533826131c6565b6111d15760405162461bcd60e51b815260206004820152601e60248201527f4552433732313a206e6f74206f776e6572206e6f7220617070726f76656400006044820152606401610c7d565b610e388383836132a8565b6000546001600160a01b0316331461123b5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600180547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff169055565b6000546001600160a01b031633146112c45760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6112cc61342a565b565b6000546001600160a01b0316331461132d5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6001600160a01b03166000908152601260205260409020805460ff19169055565b610e388383836040518060200160405280600081525061200c565b6000546001600160a01b031633146113c85760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114495760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526013602052604081205460ff1615801590610b855750506001600160a01b031660009081526015602052604090205460ff161590565b6000546001600160a01b0316331461150f5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b610e38600e83836146ee565b6000546001600160a01b0316331461157a5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600180547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055565b6000546001600160a01b031633146116035760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f1935050505015801561163d573d6000803e3d6000fd5b50565b60008061164c836134eb565b1192915050565b6000818152601660205260408120546001600160a01b031680610b855760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610c7d565b60006001600160a01b0382166117105760405162461bcd60e51b815260206004820152601460248201527f4552433732313a207a65726f20616464726573730000000000000000000000006044820152606401610c7d565b506001600160a01b031660009081526017602052604090205490565b6000546001600160a01b0316331461178b5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6001600160a01b03811661179e57600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461181f5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600855565b6000546001600160a01b031633146118835760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6001600160a01b03166000908152601260205260409020805460ff19166001179055565b6000546001600160a01b031633146119065760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6112cc6135d6565b6000601e8383604051611922929190615060565b9081526040519081900360200190205460ff1615905092915050565b606060108054610b9a90614ff4565b6000546001600160a01b031633146119ac5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b60005b81811015610e38576001601260008585858181106119cf576119cf615070565b90506020020160208101906119e49190614b2c565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a1681615045565b9150506119af565b6001600160a01b038216331415611a775760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c7d565b3360008181526019602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600154600160a01b900460ff1615611b305760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c7d565b600c546001600160a01b031633611b4683611653565b6001600160a01b031614611b5957600080fd5b6008546001600160a01b0382166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd49190615086565b1015611c225760405162461bcd60e51b815260206004820152600760248201527f65706f2062616c000000000000000000000000000000000000000000000000006044820152606401610c7d565b6008546001600160a01b03821663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa158015611c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca39190615086565b1015611cf15760405162461bcd60e51b815260206004820152600960248201527f616c6c6f77616e636500000000000000000000000000000000000000000000006044820152606401610c7d565b60065483511115611d445760405162461bcd60e51b815260206004820152600660248201527f6c656e67746800000000000000000000000000000000000000000000000000006044820152606401610c7d565b601e83604051611d54919061509f565b9081526040519081900360200190205460ff1615611db65760405162461bcd60e51b8152600401610c7d9060208082526004908201527f7573656400000000000000000000000000000000000000000000000000000000604082015260600190565b6001600160a01b0381166323b872dd33600d5460085460405160e085901b6001600160e01b03191681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015611e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4491906150bb565b506000828152601a60205260408082209051909190601e90611e679084906150d8565b908152604051908190036020018120805492151560ff1990931692909217909155600190601e90611e9990879061509f565b90815260405160209181900382019020805460ff1916921515929092179091558451611eca91839190870190614772565b5050505050565b6000546001600160a01b03163314611f305760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600180547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16600160b01b179055565b60048181548110611f7057600080fd5b906000526020600020016000915090508054611f8b90614ff4565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb790614ff4565b80156120045780601f10611fd957610100808354040283529160200191612004565b820191906000526020600020905b815481529060010190602001808311611fe757829003601f168201915b505050505081565b61201633836131c6565b6120625760405162461bcd60e51b815260206004820152601e60248201527f4552433732313a206e6f74206f776e6572206e6f7220617070726f76656400006044820152606401610c7d565b61206e84848484613679565b50505050565b6000546001600160a01b031633146120d35760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b60038054600181018255600091909152610e38907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0183836146ee565b6000546001600160a01b0316331461216f5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600180547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b179055565b6000818152601660205260409020546060906001600160a01b031661222c5760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a206e6f6e6578697374656e7420746f6b6560448201527f6e000000000000000000000000000000000000000000000000000000000000006064820152608401610c7d565b60006122366136eb565b905060008151116122565760405180602001604052806000815250612281565b80612260846136fa565b604051602001612271929190615174565b6040516020818303038152906040525b9392505050565b60608060608060606000806000806000806000601a60008e8152602001908152602001600020604051806101600160405290816000820180546122ca90614ff4565b80601f01602080910402602001604051908101604052809291908181526020018280546122f690614ff4565b80156123435780601f1061231857610100808354040283529160200191612343565b820191906000526020600020905b81548152906001019060200180831161232657829003601f168201915b5050505050815260200160018201805461235c90614ff4565b80601f016020809104026020016040519081016040528092919081815260200182805461238890614ff4565b80156123d55780601f106123aa576101008083540402835291602001916123d5565b820191906000526020600020905b8154815290600101906020018083116123b857829003601f168201915b505050505081526020016002820180546123ee90614ff4565b80601f016020809104026020016040519081016040528092919081815260200182805461241a90614ff4565b80156124675780601f1061243c57610100808354040283529160200191612467565b820191906000526020600020905b81548152906001019060200180831161244a57829003601f168201915b505050918352505060038201546020820152600482015460408201526005820154606082015260068201546080820152600782015460a0820152600882015460c0820152600982015460e0820152600a9091015460ff1615156101009091015290506124dd60015460ff600160b81b9091041690565b1561268857806000015181602001518260400151600384606001518154811061250857612508615070565b90600052602060002001600485608001518154811061252957612529615070565b906000526020600020018560a001518660c001518760e001518861010001518961012001518a610140015187805461256090614ff4565b80601f016020809104026020016040519081016040528092919081815260200182805461258c90614ff4565b80156125d95780601f106125ae576101008083540402835291602001916125d9565b820191906000526020600020905b8154815290600101906020018083116125bc57829003601f168201915b505050505097508680546125ec90614ff4565b80601f016020809104026020016040519081016040528092919081815260200182805461261890614ff4565b80156126655780601f1061263a57610100808354040283529160200191612665565b820191906000526020600020905b81548152906001019060200180831161264857829003601f168201915b505050505096509b509b509b509b509b509b509b509b509b509b509b505061281a565b80600001518160200151826040015160038460600151815481106126ae576126ae615070565b9060005260206000200160048560800151815481106126cf576126cf615070565b906000526020600020018560a001516000806000808a61014001518780546126f690614ff4565b80601f016020809104026020016040519081016040528092919081815260200182805461272290614ff4565b801561276f5780601f106127445761010080835404028352916020019161276f565b820191906000526020600020905b81548152906001019060200180831161275257829003601f168201915b5050505050975086805461278290614ff4565b80601f01602080910402602001604051908101604052809291908181526020018280546127ae90614ff4565b80156127fb5780601f106127d0576101008083540402835291602001916127fb565b820191906000526020600020905b8154815290600101906020018083116127de57829003601f168201915b505050505096509b509b509b509b509b509b509b509b509b509b509b50505b91939597999b90929496989a50565b6000546001600160a01b031633146128885760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b600755565b6000546001600160a01b031633146128ec5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b60038181548110611f7057600080fd5b6000546001600160a01b0316331461297f5760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b8047101561298c57600080fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610e38573d6000803e3d6000fd5b6000546001600160a01b03163314612a215760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b6001600160a01b038116612a3457600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612ab55760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b60048054600181018255600091909152610e38907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0183836146ee565b600080546001600160a01b03163314612b525760405162461bcd60e51b815260206004820152602e60248201526000805160206153d083398151915260448201526d103a3434b990333ab731ba34b7b760911b6064820152608401610c7d565b60055460115410612b925760405162461bcd60e51b815260206004820152600a6024820152696d617820737570706c7960b01b6044820152606401610c7d565b6003548610612bcb5760405162461bcd60e51b8152602060048201526005602482015264636c61737360d81b6044820152606401610c7d565b6004548510612c055760405162461bcd60e51b8152600401610c7d906020808252600490820152630646973760e41b604082015260600190565b8860006110eb85838c8c8c8c8c858c613189565b600154600090600160a01b900460ff1615612c695760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c7d565b333b15612ca35760405162461bcd60e51b815260206004820152600860248201526718dbdb9d1c9858dd60c21b6044820152606401610c7d565b612cac82612e6e565b612ce35760405162461bcd60e51b8152602060048201526008602482015267686f6e6f7261727960c01b6044820152606401610c7d565b600754341015612d355760405162461bcd60e51b815260206004820152600560248201527f70726963650000000000000000000000000000000000000000000000000000006044820152606401610c7d565b612d403384866137f8565b612d8e5760405162461bcd60e51b8152600401610c7d9060208082526004908201527f6d696e7400000000000000000000000000000000000000000000000000000000604082015260600190565b60055460115410612dce5760405162461bcd60e51b815260206004820152600a6024820152696d617820737570706c7960b01b6044820152606401610c7d565b612ddd8b8b8b8b8b8b8b612f07565b6000612df0338d8d8d8d8d8d8d8b613189565b9c9b505050505050505050505050565b600081815260186020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612e3582611653565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081612e7d57506001919050565b3360009081526013602052604090205460ff1615801590612eae57503360009081526015602052604090205460ff16155b15612ed5575050336000908152601560205260409020805460ff1916600190811790915590565b506000919050565b6000612ee8826138c5565b80610b855750503360009081526012602052604090205460ff16919050565b60065487511115612f5a5760405162461bcd60e51b815260206004820152600360248201527f6c656e00000000000000000000000000000000000000000000000000000000006044820152606401610c7d565b601e87604051612f6a919061509f565b9081526040519081900360200190205460ff1615612fcc5760405162461bcd60e51b8152600401610c7d9060208082526004908201527f6e616d6500000000000000000000000000000000000000000000000000000000604082015260600190565b601d85604051612fdc919061509f565b9081526040519081900360200190205460ff161561303c5760405162461bcd60e51b815260206004820152600260248201527f69640000000000000000000000000000000000000000000000000000000000006044820152606401610c7d565b601c8660405161304c919061509f565b9081526040519081900360200190205460ff16156130ae5760405162461bcd60e51b8152600401610c7d9060208082526004908201527f6861736800000000000000000000000000000000000000000000000000000000604082015260600190565b6130b784613981565b6130eb5760405162461bcd60e51b8152602060048201526005602482015264636c61737360d81b6044820152606401610c7d565b60045483106131255760405162461bcd60e51b8152600401610c7d906020808252600490820152630646973760e41b604082015260600190565b61313487878787878787613a0a565b6131805760405162461bcd60e51b815260206004820152600960248201527f7369676e617475726500000000000000000000000000000000000000000000006044820152606401610c7d565b50505050505050565b600080601154600161319b91906151a3565b90506131a78b82613b3a565b6131b88a8a8a8a8a89878c8b613b58565b9a9950505050505050505050565b6000818152601660205260408120546001600160a01b031661322a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610c7d565b600061323583611653565b9050806001600160a01b0316846001600160a01b031614806132705750836001600160a01b031661326584610c1d565b6001600160a01b0316145b806132a057506001600160a01b0380821660009081526019602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166132bb82611653565b6001600160a01b0316146133115760405162461bcd60e51b815260206004820152600f60248201527f4552433732313a206e6f74206f776e00000000000000000000000000000000006044820152606401610c7d565b6001600160a01b0382166133675760405162461bcd60e51b815260206004820152601460248201527f4552433732313a207a65726f20616464726573730000000000000000000000006044820152606401610c7d565b613372600082612e00565b6001600160a01b038316600090815260176020526040812080546001929061339b9084906151bb565b90915550506001600160a01b03821660009081526017602052604081208054600192906133c99084906151a3565b909155505060008181526016602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600154600160a01b900460ff166134835760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610c7d565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600a54600b546040516370a0823160e01b81526001600160a01b038481166004830152600093811692169081906370a0823190602401602060405180830381865afa15801561353e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135629190615086565b6040516370a0823160e01b81526001600160a01b0386811660048301528416906370a0823190602401602060405180830381865afa1580156135a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cc9190615086565b6132a091906151a3565b600154600160a01b900460ff16156136235760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c7d565b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586134ce3390565b6136848484846132a8565b61369084848484613d7f565b61206e5760405162461bcd60e51b815260206004820152602660248201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560448201526536b2b73a32b960d11b6064820152608401610c7d565b6060600e8054610b9a90614ff4565b60608161371e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613748578061373281615045565b91506137419050600a836151e8565b9150613722565b60008167ffffffffffffffff811115613763576137636148f8565b6040519080825280601f01601f19166020018201604052801561378d576020820181803683370190505b5090505b84156132a0576137a26001836151bb565b91506137af600a866151fc565b6137ba9060306151a3565b60f81b8183815181106137cf576137cf615070565b60200101906001600160f81b031916908160001a9053506137f1600a866151e8565b9450613791565b600154600090600160b01b900460ff161561381557506001612281565b600154600160a81b900460ff16156138bb57600061386c61383e866001600160a01b0316613ebc565b613847866136fa565b604051602001613858929190615174565b604051602081830303815290604052614100565b9050600061387a828561413b565b905084613886876116b8565b1080156138a057506009546001600160a01b038281169116145b156138b057600192505050612281565b600092505050612281565b5060009392505050565b6000601b826040516138d7919061509f565b9081526040519081900360200190205460ff16156138f757506000919050565b600061391561390533613ebc565b604051602001613858919061509f565b90506000613923828561413b565b6009549091506001600160a01b03808316911614613945575060009392505050565b6001601b85604051613957919061509f565b908152604051908190036020019020805491151560ff199092169190911790555060019392505050565b60035460009082106139d55760405162461bcd60e51b815260206004820152600860248201527f636c6173732069640000000000000000000000000000000000000000000000006044820152606401610c7d565b6000806139e1336134eb565b119050600254831480156139f3575080155b15613a015750600092915050565b50600192915050565b6000601b82604051613a1c919061509f565b9081526040519081900360200190205460ff1615613a3c57506000613b2f565b6000613a4e84825b60200201516136fa565b613a59856001613a44565b613a64866002613a44565b613a6f876003613a44565b604051602001613a829493929190615210565b60405160208183030381529060405290506000613ac38a898b613aa48b6136fa565b613aad8b6136fa565b8760405160200161385896959493929190615267565b90506000613ad1828661413b565b6009549091506001600160a01b03808316911614613af55760009350505050613b2f565b6001601b86604051613b07919061509f565b908152604051908190036020019020805491151560ff19909216919091179055506001925050505b979650505050505050565b613b5482826040518060200160405280600081525061415f565b5050565b6001601b85604051613b6a919061509f565b908152604051908190036020018120805492151560ff1990931692909217909155600190601d90613b9c908a9061509f565b908152604051908190036020018120805492151560ff1990931692909217909155600190601c90613bce908b9061509f565b908152604051908190036020018120805492151560ff1990931692909217909155600190601e90613c00908c9061509f565b908152602001604051809103902060006101000a81548160ff02191690831515021790555060006040518061016001604052808b81526020018981526020018a815260200188815260200187815260200160018152602001613c7885600060048110613c6e57613c6e615070565b60200201516141d1565b8152602001613c88856001613c6e565b8152602001613c98856002613c6e565b8152602001613ca8856003613c6e565b81528315156020918201526000868152601a8252604090208251805193945084939192613cda92849290910190614772565b506020828101518051613cf39260018501920190614772565b5060408201518051613d0f916002840191602090910190614772565b50606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e082015160078201556101008201516008820155610120820151600982015561014090910151600a909101805460ff191691151591909117905550505050505050505050565b60006001600160a01b0384163b15613eb157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613dc39033908990889088906004016152e6565b6020604051808303816000875af1925050508015613dfe575060408051601f3d908101601f19168201909252613dfb91810190615322565b60015b613e97573d808015613e2c576040519150601f19603f3d011682016040523d82523d6000602084013e613e31565b606091505b508051613e8f5760405162461bcd60e51b815260206004820152602660248201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560448201526536b2b73a32b960d11b6064820152608401610c7d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506132a0565b506001949350505050565b604080518082018252601081527f303132333435363738396162636465660000000000000000000000000000000060208201528151602a80825260608281019094526001600160a01b0385169291600091602082018180368337019050509050600360fc1b81600081518110613f3457613f34615070565b60200101906001600160f81b031916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613f7f57613f7f615070565b60200101906001600160f81b031916908160001a90535060005b60148110156140f75782600485613fb184600c6151a3565b60208110613fc157613fc1615070565b1a60f81b6001600160f81b031916901c60f81c60ff1681518110613fe757613fe7615070565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168261401a83600261533f565b6140259060026151a3565b8151811061403557614035615070565b60200101906001600160f81b031916908160001a905350828461405983600c6151a3565b6020811061406957614069615070565b825191901a600f1690811061408057614080615070565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016826140b383600261533f565b6140be9060036151a3565b815181106140ce576140ce615070565b60200101906001600160f81b031916908160001a905350806140ef81615045565b915050613f99565b50949350505050565b600061410c82516136fa565b8260405160200161411e92919061535e565b604051602081830303815290604052805190602001209050919050565b600080600061414a858561422a565b915091506141578161429a565b509392505050565b6141698383614455565b6141766000848484613d7f565b610e385760405162461bcd60e51b815260206004820152602660248201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560448201526536b2b73a32b960d11b6064820152608401610c7d565b600080600a6141e16001436151bb565b604080519140602083015281018590526060016040516020818303038152906040528051906020012060001c61421791906151fc565b905060008111610b855750600a92915050565b6000808251604114156142615760208301516040840151606085015160001a614255878285856145b9565b94509450505050614293565b82516040141561428b57602083015160408401516142808683836146a6565b935093505050614293565b506000905060025b9250929050565b60008160048111156142ae576142ae6153b9565b14156142b75750565b60018160048111156142cb576142cb6153b9565b14156143195760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c7d565b600281600481111561432d5761432d6153b9565b141561437b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c7d565b600381600481111561438f5761438f6153b9565b14156143e85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610c7d565b60048160048111156143fc576143fc6153b9565b141561163d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610c7d565b6001600160a01b0382166144ab5760405162461bcd60e51b815260206004820152601460248201527f4552433732313a207a65726f20616464726573730000000000000000000000006044820152606401610c7d565b6000818152601660205260409020546001600160a01b0316156145105760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c7d565b6001600160a01b03821660009081526017602052604081208054600192906145399084906151a3565b9091555050600081815260166020526040812080546001600160a01b0319166001600160a01b03851617905560118054600192906145789084906151a3565b909155505060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156145f0575060009050600361469d565b8460ff16601b1415801561460857508460ff16601c14155b15614619575060009050600461469d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561466d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166146965760006001925092505061469d565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016146e0878288856145b9565b935093505050935093915050565b8280546146fa90614ff4565b90600052602060002090601f01602090048101928261471c5760008555614762565b82601f106147355782800160ff19823516178555614762565b82800160010185558215614762579182015b82811115614762578235825591602001919060010190614747565b5061476e9291506147e6565b5090565b82805461477e90614ff4565b90600052602060002090601f0160209004810192826147a05760008555614762565b82601f106147b957805160ff1916838001178555614762565b82800160010185558215614762579182015b828111156147625782518255916020019190600101906147cb565b5b8082111561476e57600081556001016147e7565b6001600160e01b03198116811461163d57600080fd5b60006020828403121561482357600080fd5b8135612281816147fb565b60005b83811015614849578181015183820152602001614831565b8381111561206e5750506000910152565b6000815180845261487281602086016020860161482e565b601f01601f19169290920160200192915050565b602081526000612281602083018461485a565b6000602082840312156148ab57600080fd5b5035919050565b80356001600160a01b03811681146148c957600080fd5b919050565b600080604083850312156148e157600080fd5b6148ea836148b2565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261491f57600080fd5b813567ffffffffffffffff8082111561493a5761493a6148f8565b604051601f8301601f19908116603f01168101908282118183101715614962576149626148f8565b8160405283815286602085880101111561497b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f8301126149ac57600080fd5b6040516080810181811067ffffffffffffffff821117156149cf576149cf6148f8565b6040528060808401858111156149e457600080fd5b845b818110156149fe5780358352602092830192016149e6565b509195945050505050565b801515811461163d57600080fd5b80356148c981614a09565b60008060008060008060008060006101808a8c031215614a4157600080fd5b893567ffffffffffffffff80821115614a5957600080fd5b614a658d838e0161490e565b9a5060208c0135915080821115614a7b57600080fd5b614a878d838e0161490e565b995060408c0135915080821115614a9d57600080fd5b614aa98d838e0161490e565b985060608c0135975060808c01359650614ac68d60a08e0161499b565b95506101208c0135915080821115614add57600080fd5b614ae98d838e0161490e565b94506101408c0135915080821115614b0057600080fd5b50614b0d8c828d0161490e565b925050614b1d6101608b01614a17565b90509295985092959850929598565b600060208284031215614b3e57600080fd5b612281826148b2565b600080600060608486031215614b5c57600080fd5b614b65846148b2565b9250614b73602085016148b2565b9150604084013590509250925092565b60008060208385031215614b9657600080fd5b823567ffffffffffffffff80821115614bae57600080fd5b818501915085601f830112614bc257600080fd5b813581811115614bd157600080fd5b866020828501011115614be357600080fd5b60209290920196919550909350505050565b60008060208385031215614c0857600080fd5b823567ffffffffffffffff80821115614c2057600080fd5b818501915085601f830112614c3457600080fd5b813581811115614c4357600080fd5b8660208260051b8501011115614be357600080fd5b60008060408385031215614c6b57600080fd5b614c74836148b2565b91506020830135614c8481614a09565b809150509250929050565b60008060408385031215614ca257600080fd5b823567ffffffffffffffff811115614cb957600080fd5b614cc58582860161490e565b95602094909401359450505050565b60008060008060808587031215614cea57600080fd5b614cf3856148b2565b9350614d01602086016148b2565b925060408501359150606085013567ffffffffffffffff811115614d2457600080fd5b614d308782880161490e565b91505092959194509250565b6000610160808352614d508184018f61485a565b90508281036020840152614d64818e61485a565b90508281036040840152614d78818d61485a565b90508281036060840152614d8c818c61485a565b90508281036080840152614da0818b61485a565b60a0840199909952505060c081019590955260e085019390935261010084019190915261012083015215156101409091015295945050505050565b60008060408385031215614dee57600080fd5b614df7836148b2565b9150614e05602084016148b2565b90509250929050565b600080600080600080600080610160898b031215614e2b57600080fd5b883567ffffffffffffffff80821115614e4357600080fd5b614e4f8c838d0161490e565b995060208b0135915080821115614e6557600080fd5b614e718c838d0161490e565b985060408b0135915080821115614e8757600080fd5b50614e948b828c0161490e565b9650506060890135945060808901359350614eb28a60a08b0161499b565b9250614ec16101208a016148b2565b9150614ed06101408a01614a17565b90509295985092959890939650565b6000806000806000806000806000806101a08b8d031215614eff57600080fd5b8a3567ffffffffffffffff80821115614f1757600080fd5b614f238e838f0161490e565b9b5060208d0135915080821115614f3957600080fd5b614f458e838f0161490e565b9a5060408d0135915080821115614f5b57600080fd5b614f678e838f0161490e565b995060608d0135985060808d01359750614f848e60a08f0161499b565b96506101208d0135915080821115614f9b57600080fd5b614fa78e838f0161490e565b95506101408d0135915080821115614fbe57600080fd5b50614fcb8d828e0161490e565b9350506101608b01359150614fe36101808c01614a17565b90509295989b9194979a5092959850565b600181811c9082168061500857607f821691505b6020821081141561502957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006000198214156150595761505961502f565b5060010190565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561509857600080fd5b5051919050565b600082516150b181846020870161482e565b9190910192915050565b6000602082840312156150cd57600080fd5b815161228181614a09565b600080835481600182811c9150808316806150f457607f831692505b602080841082141561511457634e487b7160e01b86526022600452602486fd5b818015615128576001811461513957615166565b60ff19861689528489019650615166565b60008a81526020902060005b8681101561515e5781548b820152908501908301615145565b505084890196505b509498975050505050505050565b6000835161518681846020880161482e565b83519083019061519a81836020880161482e565b01949350505050565b600082198211156151b6576151b661502f565b500190565b6000828210156151cd576151cd61502f565b500390565b634e487b7160e01b600052601260045260246000fd5b6000826151f7576151f76151d2565b500490565b60008261520b5761520b6151d2565b500690565b60008551615222818460208a0161482e565b855190830190615236818360208a0161482e565b855191019061524981836020890161482e565b845191019061525c81836020880161482e565b019695505050505050565b60008751602061527a8285838d0161482e565b88519184019161528d8184848d0161482e565b885192019161529f8184848c0161482e565b87519201916152b18184848b0161482e565b86519201916152c38184848a0161482e565b85519201916152d5818484890161482e565b919091019998505050505050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152615318608083018461485a565b9695505050505050565b60006020828403121561533457600080fd5b8151612281816147fb565b60008160001904831182151516156153595761535961502f565b500290565b7f19457468657265756d205369676e6564204d6573736167653a0a00000000000081526000835161539681601a85016020880161482e565b8351908301906153ad81601a84016020880161482e565b01601a01949350505050565b634e487b7160e01b600052602160045260246000fdfe4f6e6c792074686520636f6e7472616374206f776e6572206d61792063616c6ca2646970667358221220ea1b1328662447503a5a04793281db1afbdc2697db60a5b87f92eba51e90b11b64736f6c634300080b0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000aa20f900e24ca7ed897c44d92012158f436ef791000000000000000000000000bf0f9180325d2606765c8fc60566810830b897b0000000000000000000000000000000000000000000000000000000000000000945706f4865726f6573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044845524f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): EpoHeroes
Arg [1] : symbol_ (string): HERO
Arg [2] : gen1Address_ (address): 0xaA20f900e24cA7Ed897C44D92012158f436ef791
Arg [3] : gen2Address_ (address): 0xbf0F9180325D2606765c8fc60566810830B897b0

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000aa20f900e24ca7ed897c44d92012158f436ef791
Arg [3] : 000000000000000000000000bf0f9180325d2606765c8fc60566810830b897b0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 45706f4865726f65730000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4845524f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

37999:30567:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56542:355;;;;;;;;;;-1:-1:-1;56542:355:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;56542:355:0;;;;;;;;57599:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;59238:252::-;;;;;;;;;;-1:-1:-1;59238:252:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1738:55:1;;;1720:74;;1708:2;1693:18;59238:252:0;1574:226:1;27147:86:0;;;;;;;;;;;;;:::i;:::-;;58774:398;;;;;;;;;;-1:-1:-1;58774:398:0;;;;;:::i;:::-;;:::i;41604:153::-;;;;;;;;;;-1:-1:-1;41604:153:0;;;;;:::i;:::-;;:::i;53886:1250::-;;;;;;:::i;:::-;;:::i;:::-;;;5701:25:1;;;5689:2;5674:18;53886:1250:0;5555:177:1;42582:90:0;;;;;;;;;;-1:-1:-1;42655:9:0;;42582:90;;42019:94;;;;;;;;;;-1:-1:-1;42019:94:0;;;;;:::i;:::-;;:::i;60241:357::-;;;;;;;;;;-1:-1:-1;60241:357:0;;;;;:::i;:::-;;:::i;26022:98::-;;;;;;;;;;-1:-1:-1;26095:17:0;;-1:-1:-1;;;26095:17:0;;;;26022:98;;27433:90;;;;;;;;;;;;;:::i;26979:67::-;;;;;;;;;;;;;:::i;44086:166::-;;;;;;;;;;-1:-1:-1;44086:166:0;;;;;:::i;:::-;;:::i;60669:185::-;;;;;;;;;;-1:-1:-1;60669:185:0;;;;;:::i;:::-;;:::i;43027:119::-;;;;;;;;;;-1:-1:-1;43027:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;43120:18:0;43096:4;43120:18;;;:8;:18;;;;;;;;;43027:119;43459:109;;;;;;;;;;-1:-1:-1;43459:109:0;;;;;:::i;:::-;;:::i;42243:105::-;;;;;;;;;;-1:-1:-1;42243:105:0;;;;;:::i;:::-;;:::i;43291:160::-;;;;;;;;;;-1:-1:-1;43291:160:0;;;;;:::i;:::-;;:::i;42356:103::-;;;;;;;;;;-1:-1:-1;42356:103:0;;;;;:::i;:::-;;:::i;27241:88::-;;;;;;;;;;;;;:::i;39170:38::-;;;;;;;;;;;;;;;;25928:86;;;;;;;;;;-1:-1:-1;25999:7:0;;-1:-1:-1;;;25999:7:0;;;;25928:86;;24351:112;;;;;;;;;;;;;:::i;42680:168::-;;;;;;;;;;-1:-1:-1;42680:168:0;;;;;:::i;:::-;;:::i;39699:27::-;;;;;;;;;;;;;;;;57259:273;;;;;;;;;;-1:-1:-1;57259:273:0;;;;;:::i;:::-;;:::i;56961:236::-;;;;;;;;;;-1:-1:-1;56961:236:0;;;;;:::i;:::-;;:::i;24190:153::-;;;;;;;;;;-1:-1:-1;24190:153:0;;;;;:::i;:::-;;:::i;42121:114::-;;;;;;;;;;-1:-1:-1;42121:114:0;;;;;:::i;:::-;;:::i;43576:121::-;;;;;;;;;;-1:-1:-1;43576:121:0;;;;;:::i;:::-;;:::i;26908:63::-;;;;;;;;;;;;;:::i;42856:163::-;;;;;;;;;;-1:-1:-1;42856:163:0;;;;;:::i;:::-;;:::i;23945:87::-;;;;;;;;;;-1:-1:-1;23991:7:0;24018:6;-1:-1:-1;;;;;24018:6:0;23945:87;;57768:104;;;;;;;;;;;;;:::i;43838:240::-;;;;;;;;;;-1:-1:-1;43838:240:0;;;;;:::i;:::-;;:::i;59562:327::-;;;;;;;;;;-1:-1:-1;59562:327:0;;;;;:::i;:::-;;:::i;39110:53::-;;;;;;;;;;;;;;;;50744:887;;;;;;;;;;-1:-1:-1;50744:887:0;;;;;:::i;:::-;;:::i;27337:88::-;;;;;;;;;;;;;:::i;38911:32::-;;;;;;;;;;-1:-1:-1;38911:32:0;;;;;:::i;:::-;;:::i;60925:346::-;;;;;;;;;;-1:-1:-1;60925:346:0;;;;;:::i;:::-;;:::i;26128:98::-;;;;;;;;;;-1:-1:-1;26201:17:0;;-1:-1:-1;;;26201:17:0;;;;26128:98;;43154:129;;;;;;;;;;-1:-1:-1;43154:129:0;;;;;:::i;:::-;-1:-1:-1;;;;;43247:28:0;43221:4;43247:28;;;:18;:28;;;;;;;;43246:29;43245:30;;43154:129;41904:107;;;;;;;;;;-1:-1:-1;41904:107:0;;;;;:::i;:::-;;:::i;27054:85::-;;;;;;;;;;;;;:::i;57943:417::-;;;;;;;;;;-1:-1:-1;57943:417:0;;;;;:::i;:::-;;:::i;55144:1326::-;;;;;;;;;;-1:-1:-1;55144:1326:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;38977:32::-;;;;;;;;;;;;;;;;42467:107;;;;;;;;;;-1:-1:-1;42467:107:0;;;;;:::i;:::-;;:::i;26234:96::-;;;;;;;;;;-1:-1:-1;26306:16:0;;-1:-1:-1;;;26306:16:0;;;;26234:96;;43705:125;;;;;;;;;;-1:-1:-1;43705:125:0;;;;;:::i;:::-;;:::i;38832:26::-;;;;;;;;;;-1:-1:-1;38832:26:0;;;;;:::i;:::-;;:::i;24471:213::-;;;;;;;;;;-1:-1:-1;24471:213:0;;;;;:::i;:::-;;:::i;59960:214::-;;;;;;;;;;-1:-1:-1;59960:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;60131:25:0;;;60102:4;60131:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;59960:214;24040:142;;;;;;;;;;-1:-1:-1;24040:142:0;;;;;:::i;:::-;;:::i;41765:131::-;;;;;;;;;;-1:-1:-1;41765:131:0;;;;;:::i;:::-;;:::i;51639:860::-;;;;;;;;;;-1:-1:-1;51639:860:0;;;;;:::i;:::-;;:::i;52507:1371::-;;;;;;:::i;:::-;;:::i;56542:355::-;56689:4;-1:-1:-1;;;;;;56731:40:0;;56746:25;56731:40;;:105;;-1:-1:-1;;;;;;;56788:48:0;;56803:33;56788:48;56731:105;:158;;;-1:-1:-1;23378:25:0;-1:-1:-1;;;;;;23363:40:0;;;56853:36;56711:178;56542:355;-1:-1:-1;;56542:355:0:o;57599:100::-;57653:13;57686:5;57679:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57599:100;:::o;59238:252::-;59359:7;62895:16;;;:7;:16;;;;;;-1:-1:-1;;;;;62895:16:0;59384:54;;;;-1:-1:-1;;;59384:54:0;;13669:2:1;59384:54:0;;;13651:21:1;13708:2;13688:18;;;13681:30;13747:27;13727:18;;;13720:55;13792:18;;59384:54:0;;;;;;;;;-1:-1:-1;59458:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;59458:24:0;;59238:252::o;27147:86::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;27221:4:::1;27202:23:::0;;;::::1;-1:-1:-1::0;;;27202:23:0::1;::::0;;27147:86::o;58774:398::-;58855:13;58871:22;58885:7;58871:13;:22::i;:::-;58855:38;;58918:5;-1:-1:-1;;;;;58912:11:0;:2;-1:-1:-1;;;;;58912:11:0;;;58904:45;;;;-1:-1:-1;;;58904:45:0;;14438:2:1;58904:45:0;;;14420:21:1;14477:2;14457:18;;;14450:30;14516:23;14496:18;;;14489:51;14557:18;;58904:45:0;14236:345:1;58904:45:0;20299:10;-1:-1:-1;;;;;58984:21:0;;;;:62;;-1:-1:-1;59009:37:0;59026:5;20299:10;59960:214;:::i;59009:37::-;58962:168;;;;-1:-1:-1;;;58962:168:0;;14788:2:1;58962:168:0;;;14770:21:1;14827:2;14807:18;;;14800:30;14866:34;14846:18;;;14839:62;14937:26;14917:18;;;14910:54;14981:19;;58962:168:0;14586:420:1;58962:168:0;59143:21;59152:2;59156:7;59143:8;:21::i;:::-;58844:328;58774:398;;:::o;41604:153::-;23831:13;;-1:-1:-1;;;;;23831:13:0;23817:10;:27;23795:122;;;;-1:-1:-1;;;23795:122:0;;15213:2:1;23795:122:0;;;15195:21:1;15252:2;15232:18;;;15225:30;15291:34;15271:18;;;15264:62;15362:15;15342:18;;;15335:43;15395:19;;23795:122:0;15011:409:1;23795:122:0;41696:9:::1;;41684:8;:21;;41676:30;;;::::0;::::1;;41717:24;::::0;;;:14:::1;:24;::::0;;;;:30:::1;;:32:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;41604:153:::0;:::o;53886:1250::-;25999:7;;54258;;-1:-1:-1;;;25999:7:0;;;;26569:9;26561:38;;;;-1:-1:-1;;;26561:38:0;;15956:2:1;26561:38:0;;;15938:21:1;15995:2;15975:18;;;15968:30;-1:-1:-1;;;16014:18:1;;;16007:46;16070:18;;26561:38:0;15754:340:1;26561:38:0;54287:10:::1;11610:20:::0;11658:8;54278:45:::1;;;::::0;-1:-1:-1;;;54278:45:0;;16301:2:1;54278:45:0::1;::::0;::::1;16283:21:1::0;16340:1;16320:18;;;16313:29;-1:-1:-1;;;16358:18:1;;;16351:38;16406:18;;54278:45:0::1;16099:331:1::0;54278:45:0::1;54357:9;;54342:12;;:24;54334:47;;;::::0;-1:-1:-1;;;54334:47:0;;16637:2:1;54334:47:0::1;::::0;::::1;16619:21:1::0;16676:2;16656:18;;;16649:30;-1:-1:-1;;;16695:18:1;;;16688:40;16745:18;;54334:47:0::1;16435:334:1::0;54334:47:0::1;54400:28;54416:11;54400:15;:28::i;:::-;54392:49;;;::::0;-1:-1:-1;;;54392:49:0;;16976:2:1;54392:49:0::1;::::0;::::1;16958:21:1::0;17015:1;16995:18;;;16988:29;-1:-1:-1;;;17033:18:1;;;17026:38;17081:18;;54392:49:0::1;16774:331:1::0;54392:49:0::1;20299:10:::0;54461:22:::1;::::0;;;:8:::1;:22;::::0;;;;;::::1;;54460:23;54452:41;;;::::0;-1:-1:-1;;;54452:41:0;;17312:2:1;54452:41:0::1;::::0;::::1;17294:21:1::0;17351:1;17331:18;;;17324:29;17389:7;17369:18;;;17362:35;17414:18;;54452:41:0::1;17110:328:1::0;54452:41:0::1;54512:42;54535:18;54512:22;:42::i;:::-;54504:64;;;::::0;-1:-1:-1;;;54504:64:0;;17645:2:1;54504:64:0::1;::::0;::::1;17627:21:1::0;17684:1;17664:18;;;17657:29;17722:11;17702:18;;;17695:39;17751:18;;54504:64:0::1;17443:332:1::0;54504:64:0::1;54579:199;54607:10;54632;54657:8;54680;54703:14;54732:6;54753:14;54579:13;:199::i;:::-;20299:10:::0;54791:22:::1;::::0;;;:8:::1;:22;::::0;;;;:29;;-1:-1:-1;;54791:29:0::1;54816:4;54791:29;::::0;;:22;54853:244:::1;::::0;54900:10;54925;54950:8;54973;54996:14;55025:6;55046:14;55075:11;54853:5:::1;:244::i;:::-;54831:266:::0;53886:1250;-1:-1:-1;;;;;;;;;;;53886:1250:0:o;42019:94::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;42087:9:::1;:18:::0;;-1:-1:-1;;;;;;42087:18:0::1;-1:-1:-1::0;;;;;42087:18:0;;;::::1;::::0;;;::::1;::::0;;42019:94::o;60241:357::-;60450:41;20299:10;60483:7;60450:18;:41::i;:::-;60428:121;;;;-1:-1:-1;;;60428:121:0;;17982:2:1;60428:121:0;;;17964:21:1;18021:2;18001:18;;;17994:30;18060:32;18040:18;;;18033:60;18110:18;;60428:121:0;17780:354:1;60428:121:0;60562:28;60572:4;60578:2;60582:7;60562:9;:28::i;27433:90::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;27490:17:::1;:25:::0;;;::::1;::::0;;27433:90::o;26979:67::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;27028:10:::1;:8;:10::i;:::-;26979:67::o:0;44086:166::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;-1:-1:-1;;;;;44200:36:0::1;44239:5;44200:36:::0;;;:18:::1;:36;::::0;;;;:44;;-1:-1:-1;;44200:44:0::1;::::0;;44086:166::o;60669:185::-;60807:39;60824:4;60830:2;60834:7;60807:39;;;;;;;;;;;;:16;:39::i;43459:109::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;43534:14:::1;:26:::0;;-1:-1:-1;;;;;;43534:26:0::1;-1:-1:-1::0;;;;;43534:26:0;;;::::1;::::0;;;::::1;::::0;;43459:109::o;42243:105::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;42316:11:::1;:24:::0;;-1:-1:-1;;;;;;42316:24:0::1;-1:-1:-1::0;;;;;42316:24:0;;;::::1;::::0;;;::::1;::::0;;42243:105::o;43291:160::-;-1:-1:-1;;;;;43384:28:0;;43358:4;43384:28;;;:18;:28;;;;;;;;43383:29;43382:30;;;:61;;-1:-1:-1;;;;;;;43417:26:0;;;;;:16;:26;;;;;;;;43416:27;;43291:160::o;42356:103::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;42430:21:::1;:12;42445:6:::0;;42430:21:::1;:::i;27241:88::-:0;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;27297:16:::1;:24:::0;;;::::1;::::0;;27241:88::o;24351:112::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;24416:6:::1;::::0;;24408:47:::1;::::0;-1:-1:-1;;;;;24416:6:0;;::::1;::::0;24433:21:::1;24408:47:::0;::::1;;;::::0;24433:21;;24408:47;24416:6;24408:47;24433:21;24416:6;24408:47;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;24351:112::o:0;42680:168::-;42780:4;42839:1;42809:27;42827:8;42809:17;:27::i;:::-;:31;;42680:168;-1:-1:-1;;42680:168:0:o;57259:273::-;57376:7;57417:16;;;:7;:16;;;;;;-1:-1:-1;;;;;57417:16:0;57452:19;57444:57;;;;-1:-1:-1;;;57444:57:0;;13669:2:1;57444:57:0;;;13651:21:1;13708:2;13688:18;;;13681:30;13747:27;13727:18;;;13720:55;13792:18;;57444:57:0;13467:349:1;56961:236:0;57078:7;-1:-1:-1;;;;;57111:19:0;;57103:52;;;;-1:-1:-1;;;57103:52:0;;18341:2:1;57103:52:0;;;18323:21:1;18380:2;18360:18;;;18353:30;18419:22;18399:18;;;18392:50;18459:18;;57103:52:0;18139:344:1;57103:52:0;-1:-1:-1;;;;;;57173:16:0;;;;;:9;:16;;;;;;;56961:236::o;24190:153::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;-1:-1:-1;;;;;24273:24:0;::::1;24265:33;;;::::0;::::1;;24309:13;:26:::0;;-1:-1:-1;;;;;;24309:26:0::1;-1:-1:-1::0;;;;;24309:26:0;;;::::1;::::0;;;::::1;::::0;;24190:153::o;42121:114::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;42200:16:::1;:27:::0;42121:114::o;43576:121::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;-1:-1:-1;;;;;43654:28:0::1;;::::0;;;:18:::1;:28;::::0;;;;:35;;-1:-1:-1;;43654:35:0::1;43685:4;43654:35;::::0;;43576:121::o;26908:63::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;26955:8:::1;:6;:8::i;42856:163::-:0;42959:4;42989:10;43000;;42989:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;42988:23;;-1:-1:-1;42856:163:0;;;;:::o;57768:104::-;57824:13;57857:7;57850:14;;;;;:::i;43838:240::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;43961:9:::1;43956:115;43972:23:::0;;::::1;43956:115;;;44055:4;44017:18;:35;44036:12;;44049:1;44036:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44017:35:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;44017:35:0;:42;;-1:-1:-1;;44017:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;43997:3;::::1;::::0;::::1;:::i;:::-;;;;43956:115;;59562:327:::0;-1:-1:-1;;;;;59697:24:0;;20299:10;59697:24;;59689:62;;;;-1:-1:-1;;;59689:62:0;;19157:2:1;59689:62:0;;;19139:21:1;19196:2;19176:18;;;19169:30;19235:27;19215:18;;;19208:55;19280:18;;59689:62:0;18955:349:1;59689:62:0;20299:10;59764:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;59764:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;59764:53:0;;;;;;;;;;59833:48;;586:41:1;;;59764:42:0;;20299:10;59833:48;;559:18:1;59833:48:0;;;;;;;59562:327;;:::o;50744:887::-;25999:7;;-1:-1:-1;;;25999:7:0;;;;26569:9;26561:38;;;;-1:-1:-1;;;26561:38:0;;15956:2:1;26561:38:0;;;15938:21:1;15995:2;15975:18;;;15968:30;-1:-1:-1;;;16014:18:1;;;16007:46;16070:18;;26561:38:0;15754:340:1;26561:38:0;50898:11:::1;::::0;-1:-1:-1;;;;;50898:11:0::1;20299:10:::0;50929:17:::1;50937:8:::0;50929:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;50929:33:0::1;;50921:42;;;::::0;::::1;;51032:16;::::0;-1:-1:-1;;;;;50996:18:0;::::1;;20299:10:::0;50996:32:::1;::::0;-1:-1:-1;;;;;;50996:32:0::1;::::0;;;;;;-1:-1:-1;;;;;1738:55:1;;;50996:32:0::1;::::0;::::1;1720:74:1::0;1693:18;;50996:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;50974:109;;;::::0;-1:-1:-1;;;50974:109:0;;19700:2:1;50974:109:0::1;::::0;::::1;19682:21:1::0;19739:1;19719:18;;;19712:29;19777:9;19757:18;;;19750:37;19804:18;;50974:109:0::1;19498:330:1::0;50974:109:0::1;51167:16;::::0;-1:-1:-1;;;;;51116:18:0;::::1;;20299:10:::0;51116:47:::1;::::0;-1:-1:-1;;;;;;51116:47:0::1;::::0;;;;;;-1:-1:-1;;;;;20086:15:1;;;51116:47:0::1;::::0;::::1;20068:34:1::0;51157:4:0::1;20118:18:1::0;;;20111:43;19980:18;;51116:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;51094:126;;;::::0;-1:-1:-1;;;51094:126:0;;20367:2:1;51094:126:0::1;::::0;::::1;20349:21:1::0;20406:1;20386:18;;;20379:29;20444:11;20424:18;;;20417:39;20473:18;;51094:126:0::1;20165:332:1::0;51094:126:0::1;51270:19;;51245:13;51239:27;:50;;51231:69;;;::::0;-1:-1:-1;;;51231:69:0;;20704:2:1;51231:69:0::1;::::0;::::1;20686:21:1::0;20743:1;20723:18;;;20716:29;20781:8;20761:18;;;20754:36;20807:18;;51231:69:0::1;20502:329:1::0;51231:69:0::1;51320:10;51331:13;51320:25;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;51319:26;51311:43;;;;-1:-1:-1::0;;;51311:43:0::1;;;;;;21319:2:1::0;21301:21;;;21358:1;21338:18;;;21331:29;21396:6;21391:2;21376:18;;21369:34;21435:2;21420:18;;21117:327;51311:43:0::1;-1:-1:-1::0;;;;;51367:21:0;::::1;;20299:10:::0;51403:9:::1;::::0;51414:16:::1;::::0;51367:64:::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;;51367:64:0;;;-1:-1:-1;;;;;21730:15:1;;;51367:64:0::1;::::0;::::1;21712:34:1::0;51403:9:0;;;::::1;21762:18:1::0;;;21755:43;21814:18;;;21807:34;21624:18;;51367:64:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;51442:23:0::1;51468:24:::0;;;:14:::1;:24;::::0;;;;;51503:27;;51468:24;;51442:23;51503:10:::1;::::0;:27:::1;::::0;51468:24;;51503:27:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:35;;;::::1;;-1:-1:-1::0;;51503:35:0;;::::1;::::0;;;::::1;::::0;;;;;51549:10:::1;::::0;:25:::1;::::0;51560:13;;51549:25:::1;:::i;:::-;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;:32;;-1:-1:-1;;51549:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;51592:31;;::::1;::::0;:10;;:31;;::::1;::::0;::::1;:::i;:::-;;50862:769;;50744:887:::0;;:::o;27337:88::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;27413:4:::1;27393:24:::0;;;::::1;-1:-1:-1::0;;;27393:24:0::1;::::0;;27337:88::o;38911:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60925:346::-;61114:41;20299:10;61147:7;61114:18;:41::i;:::-;61092:121;;;;-1:-1:-1;;;61092:121:0;;17982:2:1;61092:121:0;;;17964:21:1;18021:2;18001:18;;;17994:30;18060:32;18040:18;;;18033:60;18110:18;;61092:121:0;17780:354:1;61092:121:0;61224:39;61238:4;61244:2;61248:7;61257:5;61224:13;:39::i;:::-;60925:346;;;;:::o;41904:107::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;41978:10:::1;:25:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;41978:25:0;;;;::::1;::::0;;::::1;41994:8:::0;;41978:25:::1;:::i;27054:85::-:0;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;27127:4:::1;27107:24:::0;;;::::1;-1:-1:-1::0;;;27107:24:0::1;::::0;;27054:85::o;57943:417::-;62871:4;62895:16;;;:7;:16;;;;;;58061:13;;-1:-1:-1;;;;;62895:16:0;58092:62;;;;-1:-1:-1;;;58092:62:0;;23591:2:1;58092:62:0;;;23573:21:1;23630:2;23610:18;;;23603:30;23669:34;23649:18;;;23642:62;23740:3;23720:18;;;23713:31;23761:19;;58092:62:0;23389:397:1;58092:62:0;58167:21;58191:10;:8;:10::i;:::-;58167:34;;58256:1;58238:7;58232:21;:25;:120;;;;;;;;;;;;;;;;;58301:7;58310:18;:7;:16;:18::i;:::-;58284:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58232:120;58212:140;57943:417;-1:-1:-1;;;57943:417:0:o;55144:1326::-;55245:23;55283:21;55319:23;55357:19;55391:25;55431:13;55459:16;55490:17;55522:16;55553:14;55582:15;55625:17;55645:14;:24;55660:8;55645:24;;;;;;;;;;;55625:44;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55625:44:0;;;-1:-1:-1;;55625:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55684:18:0;26095:17;;;-1:-1:-1;;;26095:17:0;;;;;26022:98;55684:18;55680:460;;;55745:5;:10;;;55774:5;:13;;;55806:5;:15;;;55840:10;55851:5;:11;;;55840:23;;;;;;;;:::i;:::-;;;;;;;;55882:16;55899:5;:17;;;55882:35;;;;;;;;:::i;:::-;;;;;;;;55936:5;:11;;;55966:5;:14;;;55999:5;:15;;;56033:5;:14;;;56066:5;:12;;;56097:5;:16;;;55719:409;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55680:460;56174:5;:10;;;56199:5;:13;;;56227:5;:15;;;56257:10;56268:5;:11;;;56257:23;;;;;;;;:::i;:::-;;;;;;;;56295:16;56312:5;:17;;;56295:35;;;;;;;;:::i;:::-;;;;;;;;56345:5;:11;;;56371:1;56387;56403;56419;56435:5;:16;;;56152:310;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55144:1326;;;;;;;;;;;;;;:::o;42467:107::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;42541:14:::1;:25:::0;42467:107::o;43705:125::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;-1:-1:-1;;;;;43787:28:0::1;;::::0;;;:18:::1;:28;::::0;;;;:35;;-1:-1:-1;;43787:35:0::1;43818:4;43787:35;::::0;;43705:125::o;38832:26::-;;;;;;;;;;;;24471:213;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;24620:7:::1;24595:21;:32;;24587:41;;;::::0;::::1;;24639:37;::::0;-1:-1:-1;;;;;24639:28:0;::::1;::::0;:37;::::1;;;::::0;24668:7;;24639:37:::1;::::0;;;24668:7;24639:28;:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;24040:142:::0;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;-1:-1:-1;;;;;24123:22:0;::::1;24115:31;;;::::0;::::1;;24157:6;:17:::0;;-1:-1:-1;;;;;;24157:17:0::1;-1:-1:-1::0;;;;;24157:17:0;;;::::1;::::0;;;::::1;::::0;;24040:142::o;41765:131::-;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;41851:16:::1;:37:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;41851:37:0;;;;::::1;::::0;;::::1;41873:14:::0;;41851:37:::1;:::i;51639:860::-:0;51947:7;23648:6;;-1:-1:-1;;;;;23648:6:0;23634:10;:20;23612:116;;;;-1:-1:-1;;;23612:116:0;;14023:2:1;23612:116:0;;;14005:21:1;14062:2;14042:18;;;14035:30;-1:-1:-1;;;;;;;;;;;14081:18:1;;;14074:62;-1:-1:-1;;;14152:18:1;;;14145:44;14206:19;;23612:116:0;13821:410:1;23612:116:0;51990:9:::1;;51975:12;;:24;51967:47;;;::::0;-1:-1:-1;;;51967:47:0;;16637:2:1;51967:47:0::1;::::0;::::1;16619:21:1::0;16676:2;16656:18;;;16649:30;-1:-1:-1;;;16695:18:1;;;16688:40;16745:18;;51967:47:0::1;16435:334:1::0;51967:47:0::1;52044:10;:17:::0;52033:28;::::1;52025:46;;;::::0;-1:-1:-1;;;52025:46:0;;24468:2:1;52025:46:0::1;::::0;::::1;24450:21:1::0;24507:1;24487:18;;;24480:29;-1:-1:-1;;;24525:18:1;;;24518:35;24570:18;;52025:46:0::1;24266:328:1::0;52025:46:0::1;52107:16;:23:::0;52090:40;::::1;52082:57;;;;-1:-1:-1::0;;;52082:57:0::1;;;;;;24801:2:1::0;24783:21;;;24840:1;24820:18;;;24813:29;-1:-1:-1;;;24873:2:1;24858:18;;24851:34;24917:2;24902:18;;24599:327;52082:57:0::1;52180:10:::0;52150:21:::1;52224:236;52244:10:::0;52180;52294;52319:8;52342;52365:14;52394:6;52180:10;52438:11;52224:5:::1;:236::i;52507:1371::-:0;25999:7;;52911;;-1:-1:-1;;;25999:7:0;;;;26569:9;26561:38;;;;-1:-1:-1;;;26561:38:0;;15956:2:1;26561:38:0;;;15938:21:1;15995:2;15975:18;;;15968:30;-1:-1:-1;;;16014:18:1;;;16007:46;16070:18;;26561:38:0;15754:340:1;26561:38:0;52940:10:::1;11610:20:::0;11658:8;52931:45:::1;;;::::0;-1:-1:-1;;;52931:45:0;;16301:2:1;52931:45:0::1;::::0;::::1;16283:21:1::0;16340:1;16320:18;;;16313:29;-1:-1:-1;;;16358:18:1;;;16351:38;16406:18;;52931:45:0::1;16099:331:1::0;52931:45:0::1;52995:28;53011:11;52995:15;:28::i;:::-;52987:49;;;::::0;-1:-1:-1;;;52987:49:0;;16976:2:1;52987:49:0::1;::::0;::::1;16958:21:1::0;17015:1;16995:18;;;16988:29;-1:-1:-1;;;17033:18:1;;;17026:38;17081:18;;52987:49:0::1;16774:331:1::0;52987:49:0::1;53068:14;;53055:9;:27;;53047:45;;;::::0;-1:-1:-1;;;53047:45:0;;25133:2:1;53047:45:0::1;::::0;::::1;25115:21:1::0;25172:1;25152:18;;;25145:29;25210:7;25190:18;;;25183:35;25235:18;;53047:45:0::1;24931:328:1::0;53047:45:0::1;53125:137;20299:10:::0;53191:20:::1;53230:17;53125:16;:137::i;:::-;53103:191;;;;-1:-1:-1::0;;;53103:191:0::1;;;;;;25466:2:1::0;25448:21;;;25505:1;25485:18;;;25478:29;25543:6;25538:2;25523:18;;25516:34;25582:2;25567:18;;25264:327;53103:191:0::1;53328:9;;53313:12;;:24;53305:47;;;::::0;-1:-1:-1;;;53305:47:0;;16637:2:1;53305:47:0::1;::::0;::::1;16619:21:1::0;16676:2;16656:18;;;16649:30;-1:-1:-1;;;16695:18:1;;;16688:40;16745:18;;53305:47:0::1;16435:334:1::0;53305:47:0::1;53365:199;53393:10;53418;53443:8;53466;53489:14;53518:6;53539:14;53365:13;:199::i;:::-;53575:19;53597:242;53617:10;53642;53667;53692:8;53715;53738:14;53767:6;53788:14;53817:11;53597:5;:242::i;:::-;53575:264:::0;52507:1371;-1:-1:-1;;;;;;;;;;;;52507:1371:0:o;66207:173::-;66282:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;66282:29:0;-1:-1:-1;;;;;66282:29:0;;;;;;;;:24;;66336:22;66282:24;66336:13;:22::i;:::-;-1:-1:-1;;;;;66327:45:0;;;;;;;;;;;66207:173;;:::o;50112:379::-;50172:4;50194:11;50189:56;;-1:-1:-1;50229:4:0;;50112:379;-1:-1:-1;50112:379:0:o;50189:56::-;20299:10;50277:32;;;;:18;:32;;;;;;;;50276:33;50275:34;;;:82;;-1:-1:-1;20299:10:0;50327:30;;;;:16;:30;;;;;;;;50326:31;50275:82;50257:202;;;-1:-1:-1;;20299:10:0;50384:30;;;;:16;:30;;;;;:37;;-1:-1:-1;;50384:37:0;50417:4;50384:37;;;;;;50417:4;50112:379::o;50257:202::-;-1:-1:-1;50478:5:0;;50112:379;-1:-1:-1;50112:379:0:o;50499:237::-;50599:4;50641:38;50660:18;50641;:38::i;:::-;:87;;;-1:-1:-1;;20299:10:0;50696:32;;;;:18;:32;;;;;;;;;50621:107;-1:-1:-1;50499:237:0:o;47359:941::-;47681:19;;47659:10;47653:24;:47;;47645:63;;;;-1:-1:-1;;;47645:63:0;;25798:2:1;47645:63:0;;;25780:21:1;25837:1;25817:18;;;25810:29;25875:5;25855:18;;;25848:33;25898:18;;47645:63:0;25596:326:1;47645:63:0;47728:10;47739;47728:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;47727:23;47719:40;;;;-1:-1:-1;;;47719:40:0;;;;;;26129:2:1;26111:21;;;26168:1;26148:18;;;26141:29;26206:6;26201:2;26186:18;;26179:34;26245:2;26230:18;;25927:327;47719:40:0;47779:13;47793:8;47779:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;47778:24;47770:39;;;;-1:-1:-1;;;47770:39:0;;26461:2:1;47770:39:0;;;26443:21:1;26500:1;26480:18;;;26473:29;26538:4;26518:18;;;26511:32;26560:18;;47770:39:0;26259:325:1;47770:39:0;47829:15;47845:10;47829:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;47828:28;47820:45;;;;-1:-1:-1;;;47820:45:0;;;;;;26791:2:1;26773:21;;;26830:1;26810:18;;;26803:29;26868:6;26863:2;26848:18;;26841:34;26907:2;26892:18;;26589:327;47820:45:0;47884:22;47897:8;47884:12;:22::i;:::-;47876:40;;;;-1:-1:-1;;;47876:40:0;;24468:2:1;47876:40:0;;;24450:21:1;24507:1;24487:18;;;24480:29;-1:-1:-1;;;24525:18:1;;;24518:35;24570:18;;47876:40:0;24266:328:1;47876:40:0;47952:16;:23;47935:40;;47927:57;;;;-1:-1:-1;;;47927:57:0;;;;;;24801:2:1;24783:21;;;24840:1;24820:18;;;24813:29;-1:-1:-1;;;24873:2:1;24858:18;;24851:34;24917:2;24902:18;;24599:327;47927:57:0;48017:238;48056:10;48085;48114:8;48141;48168:14;48201:6;48226:14;48017:20;:238::i;:::-;47995:297;;;;-1:-1:-1;;;47995:297:0;;27123:2:1;47995:297:0;;;27105:21:1;27162:1;27142:18;;;27135:29;27200:11;27180:18;;;27173:39;27229:18;;47995:297:0;26921:332:1;47995:297:0;47359:941;;;;;;;:::o;44513:735::-;44840:7;44860:19;44882:12;;44897:1;44882:16;;;;:::i;:::-;44860:38;;44911:30;44921:6;44929:11;44911:9;:30::i;:::-;44952:257;44986:10;45011;45036:8;45059;45082:14;45111;45140:11;45166:6;45187:11;44952:19;:257::i;:::-;45229:11;44513:735;-1:-1:-1;;;;;;;;;;44513:735:0:o;63100:395::-;63229:4;62895:16;;;:7;:16;;;;;;-1:-1:-1;;;;;62895:16:0;63251:54;;;;-1:-1:-1;;;63251:54:0;;13669:2:1;63251:54:0;;;13651:21:1;13708:2;13688:18;;;13681:30;13747:27;13727:18;;;13720:55;13792:18;;63251:54:0;13467:349:1;63251:54:0;63316:13;63332:22;63346:7;63332:13;:22::i;:::-;63316:38;;63384:5;-1:-1:-1;;;;;63373:16:0;:7;-1:-1:-1;;;;;63373:16:0;;:64;;;;63430:7;-1:-1:-1;;;;;63406:31:0;:20;63418:7;63406:11;:20::i;:::-;-1:-1:-1;;;;;63406:31:0;;63373:64;:113;;;-1:-1:-1;;;;;;60131:25:0;;;60102:4;60131:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;63454:32;63365:122;63100:395;-1:-1:-1;;;;63100:395:0:o;65554:535::-;65712:4;-1:-1:-1;;;;;65686:30:0;:22;65700:7;65686:13;:22::i;:::-;-1:-1:-1;;;;;65686:30:0;;65678:58;;;;-1:-1:-1;;;65678:58:0;;27593:2:1;65678:58:0;;;27575:21:1;27632:2;27612:18;;;27605:30;27671:17;27651:18;;;27644:45;27706:18;;65678:58:0;27391:339:1;65678:58:0;-1:-1:-1;;;;;65755:16:0;;65747:49;;;;-1:-1:-1;;;65747:49:0;;18341:2:1;65747:49:0;;;18323:21:1;18380:2;18360:18;;;18353:30;18419:22;18399:18;;;18392:50;18459:18;;65747:49:0;18139:344:1;65747:49:0;65913:29;65930:1;65934:7;65913:8;:29::i;:::-;-1:-1:-1;;;;;65955:15:0;;;;;;:9;:15;;;;;:20;;65974:1;;65955:15;:20;;65974:1;;65955:20;:::i;:::-;;;;-1:-1:-1;;;;;;;65986:13:0;;;;;;:9;:13;;;;;:18;;66003:1;;65986:13;:18;;66003:1;;65986:18;:::i;:::-;;;;-1:-1:-1;;66015:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;66015:21:0;-1:-1:-1;;;;;66015:21:0;;;;;;;;;66054:27;;66015:16;;66054:27;;;;;;;65554:535;;;:::o;27926:120::-;25999:7;;-1:-1:-1;;;25999:7:0;;;;26839:41;;;;-1:-1:-1;;;26839:41:0;;28067:2:1;26839:41:0;;;28049:21:1;28106:2;28086:18;;;28079:30;28145:22;28125:18;;;28118:50;28185:18;;26839:41:0;27865:344:1;26839:41:0;27985:7:::1;:15:::0;;;::::1;::::0;;28016:22:::1;20299:10:::0;28025:12:::1;28016:22;::::0;-1:-1:-1;;;;;1738:55:1;;;1720:74;;1708:2;1693:18;28016:22:0::1;;;;;;;27926:120::o:0;44260:245::-;44369:12;;44417;;44474:23;;-1:-1:-1;;;44474:23:0;;-1:-1:-1;;;;;1738:55:1;;;44474:23:0;;;1720:74:1;44325:7:0;;44369:12;;;44417;;;;44474:15;;1693:18:1;;44474:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44448;;-1:-1:-1;;;44448:23:0;;-1:-1:-1;;;;;1738:55:1;;;44448:23:0;;;1720:74:1;44448:15:0;;;;;1693:18:1;;44448:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;;;:::i;27667:118::-;25999:7;;-1:-1:-1;;;25999:7:0;;;;26569:9;26561:38;;;;-1:-1:-1;;;26561:38:0;;15956:2:1;26561:38:0;;;15938:21:1;15995:2;15975:18;;;15968:30;-1:-1:-1;;;16014:18:1;;;16007:46;16070:18;;26561:38:0;15754:340:1;26561:38:0;27737:4:::1;27727:14:::0;;;::::1;-1:-1:-1::0;;;27727:14:0::1;::::0;;27757:20:::1;27764:12;20299:10:::0;;20219:98;62153:340;62310:28;62320:4;62326:2;62330:7;62310:9;:28::i;:::-;62371:48;62394:4;62400:2;62404:7;62413:5;62371:22;:48::i;:::-;62349:136;;;;-1:-1:-1;;;62349:136:0;;28416:2:1;62349:136:0;;;28398:21:1;28455:2;28435:18;;;28428:30;28494:34;28474:18;;;28467:62;-1:-1:-1;;;28545:18:1;;;28538:36;28591:19;;62349:136:0;28214:402:1;58608:104:0;58659:13;58692:12;58685:19;;;;;:::i;20686:723::-;20742:13;20963:10;20959:53;;-1:-1:-1;;20990:10:0;;;;;;;;;;;;-1:-1:-1;;;20990:10:0;;;;;20686:723::o;20959:53::-;21037:5;21022:12;21078:78;21085:9;;21078:78;;21111:8;;;;:::i;:::-;;-1:-1:-1;21134:10:0;;-1:-1:-1;21142:2:0;21134:10;;:::i;:::-;;;21078:78;;;21166:19;21198:6;21188:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21188:17:0;;21166:39;;21216:154;21223:10;;21216:154;;21250:11;21260:1;21250:11;;:::i;:::-;;-1:-1:-1;21319:10:0;21327:2;21319:5;:10;:::i;:::-;21306:24;;:2;:24;:::i;:::-;21293:39;;21276:6;21283;21276:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;21276:56:0;;;;;;;;-1:-1:-1;21347:11:0;21356:2;21347:11;;:::i;:::-;;;21216:154;;49271:833;26201:17;;49430:4;;-1:-1:-1;;;26201:17:0;;;;49447:62;;;-1:-1:-1;49493:4:0;49486:11;;49447:62;26306:16;;-1:-1:-1;;;26306:16:0;;;;49521:551;;;49559:16;49578:197;49664:23;:5;-1:-1:-1;;;;;49664:21:0;;:23::i;:::-;49710:31;:20;:29;:31::i;:::-;49625:135;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49578:28;:197::i;:::-;49559:216;;49790:14;49807:42;49821:8;49831:17;49807:13;:42::i;:::-;49790:59;;49905:20;49886:16;49896:5;49886:9;:16::i;:::-;:39;:84;;;;-1:-1:-1;49956:14:0;;-1:-1:-1;;;;;49946:24:0;;;49956:14;;49946:24;49886:84;49864:168;;;50012:4;50005:11;;;;;;49864:168;50055:5;50048:12;;;;;;49521:551;-1:-1:-1;50091:5:0;49271:833;;;;;:::o;45256:563::-;45349:4;45375:19;45395:14;45375:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;45371:80;;;-1:-1:-1;45434:5:0;;45256:563;-1:-1:-1;45256:563:0:o;45371:80::-;45463:16;45482:102;45542:30;20299:10;45542:28;:30::i;:::-;45525:48;;;;;;;;:::i;45482:102::-;45463:121;;45597:14;45614:39;45628:8;45638:14;45614:13;:39::i;:::-;45680:14;;45597:56;;-1:-1:-1;;;;;;45670:24:0;;;45680:14;;45670:24;45666:69;;-1:-1:-1;45718:5:0;;45256:563;-1:-1:-1;;;45256:563:0:o;45666:69::-;45785:4;45747:19;45767:14;45747:35;;;;;;:::i;:::-;;;;;;;;;;;;;;:42;;;;;-1:-1:-1;;45747:42:0;;;;;;;;;-1:-1:-1;45747:42:0;;45256:563;-1:-1:-1;;;45256:563:0:o;47027:324::-;47126:10;:17;47090:4;;47115:28;;47107:49;;;;-1:-1:-1;;;47107:49:0;;29533:2:1;47107:49:0;;;29515:21:1;29572:1;29552:18;;;29545:29;29610:10;29590:18;;;29583:38;29638:18;;47107:49:0;29331:331:1;47107:49:0;47167:15;;47185:31;20299:10;47185:17;:31::i;:::-;:35;47167:53;;47247:17;;47235:8;:29;:44;;;;;47269:10;47268:11;47235:44;47231:89;;;-1:-1:-1;47303:5:0;;47027:324;-1:-1:-1;;47027:324:0:o;47231:89::-;-1:-1:-1;47339:4:0;;47027:324;-1:-1:-1;;47027:324:0:o;45827:1192::-;46118:4;46139:19;46159:14;46139:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;46135:80;;;-1:-1:-1;46198:5:0;46191:12;;46135:80;46227:24;46310:20;:6;46227:24;46310:9;;;;;:18;:20::i;:::-;46349;:6;46356:1;46349:9;;:20;46388;:6;46395:1;46388:9;;:20;46427;:6;46434:1;46427:9;;:20;46275:187;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46227:246;;46484:16;46503:281;46581:10;46610:8;46637:10;46666:19;:8;:17;:19::i;:::-;46704:25;:14;:23;:25::i;:::-;46748:10;46546:227;;;;;;;;;;;;;:::i;46503:281::-;46484:300;;46797:14;46814:39;46828:8;46838:14;46814:13;:39::i;:::-;46880:14;;46797:56;;-1:-1:-1;;;;;;46870:24:0;;;46880:14;;46870:24;46866:69;;46918:5;46911:12;;;;;;;46866:69;46985:4;46947:19;46967:14;46947:35;;;;;;:::i;:::-;;;;;;;;;;;;;;:42;;;;;-1:-1:-1;;46947:42:0;;;;;;;;;-1:-1:-1;46947:42:0;;-1:-1:-1;;;45827:1192:0;;;;;;;;;;:::o;63837:110::-;63913:26;63923:2;63927:7;63913:26;;;;;;;;;;;;:9;:26::i;:::-;63837:110;;:::o;48308:955::-;48691:4;48653:19;48673:14;48653:35;;;;;;:::i;:::-;;;;;;;;;;;;;;:42;;;;;-1:-1:-1;;48653:42:0;;;;;;;;;;;;48706:13;;:23;;48720:8;;48706:23;:::i;:::-;;;;;;;;;;;;;;:30;;;;;-1:-1:-1;;48706:30:0;;;;;;;;;;;;48747:15;;:27;;48763:10;;48747:27;:::i;:::-;;;;;;;;;;;;;;:34;;;;;-1:-1:-1;;48747:34:0;;;;;;;;;;;;48792:10;;:22;;48803:10;;48792:22;:::i;:::-;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;48834:20;48857:350;;;;;;;;48876:10;48857:350;;;;48901:8;48857:350;;;;48924:10;48857:350;;;;48949:8;48857:350;;;;48972:14;48857:350;;;;49001:1;48857:350;;;;49017:27;49034:6;49041:1;49034:9;;;;;;;:::i;:::-;;;;;49017:16;:27::i;:::-;48857:350;;;;49059:27;49076:6;49083:1;49076:9;;49059:27;48857:350;;;;49101:27;49118:6;49125:1;49118:9;;49101:27;48857:350;;;;49143:27;49160:6;49167:1;49160:9;;49143:27;48857:350;;;;;;;;;;-1:-1:-1;49220:24:0;;;:14;:24;;;;;:35;;;;48834:373;;-1:-1:-1;48834:373:0;;49220:24;;:35;;:24;;:35;;;;;:::i;:::-;-1:-1:-1;49220:35:0;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;49220:35:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;49220:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49220:35:0;;;;;;;;;;-1:-1:-1;;;;;;;;;;48308:955:0:o;66945:920::-;67100:4;-1:-1:-1;;;;;67121:13:0;;11610:20;11658:8;67117:741;;67174:175;;-1:-1:-1;;;67174:175:0;;-1:-1:-1;;;;;67174:36:0;;;;;:175;;20299:10;;67268:4;;67295:7;;67325:5;;67174:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67174:175:0;;;;;;;;-1:-1:-1;;67174:175:0;;;;;;;;;;;;:::i;:::-;;;67153:650;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67532:13:0;;67528:260;;67575:48;;-1:-1:-1;;;67575:48:0;;28416:2:1;67575:48:0;;;28398:21:1;28455:2;28435:18;;;28428:30;28494:34;28474:18;;;28467:62;-1:-1:-1;;;28545:18:1;;;28538:36;28591:19;;67575:48:0;28214:402:1;67528:260:0;67738:6;67732:13;67723:6;67719:2;67715:15;67708:38;67153:650;-1:-1:-1;;;;;;67413:51:0;-1:-1:-1;;;67413:51:0;;-1:-1:-1;67406:58:0;;67117:741;-1:-1:-1;67842:4:0;66945:920;;;;;;:::o;11682:559::-;11862:42;;;;;;;;;;;;;;;;11936:13;;11946:2;11936:13;;;11772;11936;;;;;;-1:-1:-1;;;;;11827:23:0;;;11862:42;-1:-1:-1;;11936:13:0;;;;;;;;;;-1:-1:-1;11936:13:0;11917:32;;-1:-1:-1;;;11960:3:0;11964:1;11960:6;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;11960:12:0;;;;;;;;;11983;:3;11987:1;11983:6;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;11983:12:0;;;;;;;;;12011:9;12006:199;12030:2;12026:1;:6;12006:199;;;12071:8;12111:1;12094:5;12100:6;:1;12104:2;12100:6;:::i;:::-;12094:13;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;12094:18:0;;;;12088:25;;12080:34;;12071:44;;;;;;;;:::i;:::-;;;;;;;12054:3;12062:5;:1;12066;12062:5;:::i;:::-;12058:9;;:1;:9;:::i;:::-;12054:14;;;;;;;;:::i;:::-;;;;:61;-1:-1:-1;;;;;12054:61:0;;;;;;;;-1:-1:-1;12147:8:0;12170:5;12176:6;:1;12180:2;12176:6;:::i;:::-;12170:13;;;;;;;:::i;:::-;12147:46;;12170:13;;;12186:4;12164:27;;12147:46;;;;;;:::i;:::-;;;;;;;12130:3;12138:5;:1;12142;12138:5;:::i;:::-;12134:9;;:1;:9;:::i;:::-;12130:14;;;;;;;;:::i;:::-;;;;:63;-1:-1:-1;;;;;12130:63:0;;;;;;;;-1:-1:-1;12034:3:0;;;;:::i;:::-;;;;12006:199;;;-1:-1:-1;12229:3:0;11682:559;-1:-1:-1;;;;11682:559:0:o;36961:357::-;37059:7;37226:26;37243:1;:8;37226:16;:26::i;:::-;37275:1;37132:163;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37104:206;;;;;;37084:226;;36961:357;;;:::o;32353:263::-;32458:7;32484:17;32503:18;32525:27;32536:4;32542:9;32525:10;:27::i;:::-;32483:69;;;;32563:18;32575:5;32563:11;:18::i;:::-;-1:-1:-1;32599:9:0;32353:263;-1:-1:-1;;;32353:263:0:o;64174:309::-;64304:18;64310:2;64314:7;64304:5;:18::i;:::-;64355:54;64386:1;64390:2;64394:7;64403:5;64355:22;:54::i;:::-;64333:142;;;;-1:-1:-1;;;64333:142:0;;28416:2:1;64333:142:0;;;28398:21:1;28455:2;28435:18;;;28428:30;28494:34;28474:18;;;28467:62;-1:-1:-1;;;28545:18:1;;;28538:36;28591:19;;64333:142:0;28214:402:1;10274:298:0;10330:7;;10467:2;10428:16;10443:1;10428:12;:16;:::i;:::-;10401:51;;;10418:27;;10401:51;;;33573:19:1;33608:12;;33601:28;;;33645:12;;10401:51:0;;;;;;;;;;;;10391:62;;;;;;10369:95;;:100;;;;:::i;:::-;10350:120;;10496:1;10485:7;:12;10481:57;;-1:-1:-1;10524:2:0;10557:7;10274:298;-1:-1:-1;;10274:298:0:o;30211:1340::-;30319:7;30328:12;30558:9;:16;30578:2;30558:22;30554:990;;;30854:4;30839:20;;30833:27;30904:4;30889:20;;30883:27;30962:4;30947:20;;30941:27;30597:9;30933:36;31005:25;31016:4;30933:36;30833:27;30883;31005:10;:25::i;:::-;30998:32;;;;;;;;;30554:990;31052:9;:16;31072:2;31052:22;31048:496;;;31327:4;31312:20;;31306:27;31378:4;31363:20;;31357:27;31420:23;31431:4;31306:27;31357;31420:10;:23::i;:::-;31413:30;;;;;;;;31048:496;-1:-1:-1;31492:1:0;;-1:-1:-1;31496:35:0;31048:496;30211:1340;;;;;:::o;28482:643::-;28560:20;28551:5;:29;;;;;;;;:::i;:::-;;28547:571;;;28482:643;:::o;28547:571::-;28658:29;28649:5;:38;;;;;;;;:::i;:::-;;28645:473;;;28704:34;;-1:-1:-1;;;28704:34:0;;34059:2:1;28704:34:0;;;34041:21:1;34098:2;34078:18;;;34071:30;34137:26;34117:18;;;34110:54;34181:18;;28704:34:0;33857:348:1;28645:473:0;28769:35;28760:5;:44;;;;;;;;:::i;:::-;;28756:362;;;28821:41;;-1:-1:-1;;;28821:41:0;;34412:2:1;28821:41:0;;;34394:21:1;34451:2;34431:18;;;34424:30;34490:33;34470:18;;;34463:61;34541:18;;28821:41:0;34210:355:1;28756:362:0;28893:30;28884:5;:39;;;;;;;;:::i;:::-;;28880:238;;;28940:44;;-1:-1:-1;;;28940:44:0;;34772:2:1;28940:44:0;;;34754:21:1;34811:2;34791:18;;;34784:30;34850:34;34830:18;;;34823:62;-1:-1:-1;;;34901:18:1;;;34894:32;34943:19;;28940:44:0;34570:398:1;28880:238:0;29015:30;29006:5;:39;;;;;;;;:::i;:::-;;29002:116;;;29062:44;;-1:-1:-1;;;29062:44:0;;35175:2:1;29062:44:0;;;35157:21:1;35214:2;35194:18;;;35187:30;35253:34;35233:18;;;35226:62;-1:-1:-1;;;35304:18:1;;;35297:32;35346:19;;29062:44:0;34973:398:1;64819::0;-1:-1:-1;;;;;64899:16:0;;64891:49;;;;-1:-1:-1;;;64891:49:0;;18341:2:1;64891:49:0;;;18323:21:1;18380:2;18360:18;;;18353:30;18419:22;18399:18;;;18392:50;18459:18;;64891:49:0;18139:344:1;64891:49:0;62871:4;62895:16;;;:7;:16;;;;;;-1:-1:-1;;;;;62895:16:0;:30;64951:58;;;;-1:-1:-1;;;64951:58:0;;35578:2:1;64951:58:0;;;35560:21:1;35617:2;35597:18;;;35590:30;35656;35636:18;;;35629:58;35704:18;;64951:58:0;35376:352:1;64951:58:0;-1:-1:-1;;;;;65080:13:0;;;;;;:9;:13;;;;;:18;;65097:1;;65080:13;:18;;65097:1;;65080:18;:::i;:::-;;;;-1:-1:-1;;65109:16:0;;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;65109:21:0;-1:-1:-1;;;;;65109:21:0;;;;;65141:12;:17;;-1:-1:-1;;65109:16:0;65141:17;;-1:-1:-1;;65141:17:0;:::i;:::-;;;;-1:-1:-1;;65176:33:0;;65201:7;;-1:-1:-1;;;;;65176:33:0;;;65193:1;;65176:33;;65193:1;;65176:33;64819:398;;:::o;33933:1669::-;34064:7;;35025:66;34999:92;;34981:200;;;-1:-1:-1;35134:1:0;;-1:-1:-1;35138:30:0;35118:51;;34981:200;35195:1;:7;;35200:2;35195:7;;:18;;;;;35206:1;:7;;35211:2;35206:7;;35195:18;35191:102;;;-1:-1:-1;35246:1:0;;-1:-1:-1;35250:30:0;35230:51;;35191:102;35407:24;;;35390:14;35407:24;;;;;;;;;35960:25:1;;;36033:4;36021:17;;36001:18;;;35994:45;;;;36055:18;;;36048:34;;;36098:18;;;36091:34;;;35407:24:0;;35932:19:1;;35407:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35407:24:0;;-1:-1:-1;;35407:24:0;;;-1:-1:-1;;;;;;;35446:20:0;;35442:103;;35499:1;35503:29;35483:50;;;;;;;35442:103;35565:6;-1:-1:-1;35573:20:0;;-1:-1:-1;33933:1669:0;;;;;;;;:::o;32879:440::-;32993:7;;33137:66;33094:124;;33245:3;33241:12;;;33255:2;33237:21;33286:25;33297:4;33237:21;33306:1;33094:124;33286:10;:25::i;:::-;33279:32;;;;;;32879:440;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:1;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1141:2;1120:15;-1:-1:-1;;1116:29:1;1107:39;;;;1148:4;1103:50;;901:258;-1:-1:-1;;901:258:1:o;1164:220::-;1313:2;1302:9;1295:21;1276:4;1333:45;1374:2;1363:9;1359:18;1351:6;1333:45;:::i;1389:180::-;1448:6;1501:2;1489:9;1480:7;1476:23;1472:32;1469:52;;;1517:1;1514;1507:12;1469:52;-1:-1:-1;1540:23:1;;1389:180;-1:-1:-1;1389:180:1:o;1805:196::-;1873:20;;-1:-1:-1;;;;;1922:54:1;;1912:65;;1902:93;;1991:1;1988;1981:12;1902:93;1805:196;;;:::o;2006:254::-;2074:6;2082;2135:2;2123:9;2114:7;2110:23;2106:32;2103:52;;;2151:1;2148;2141:12;2103:52;2174:29;2193:9;2174:29;:::i;:::-;2164:39;2250:2;2235:18;;;;2222:32;;-1:-1:-1;;;2006:254:1:o;2265:184::-;-1:-1:-1;;;2314:1:1;2307:88;2414:4;2411:1;2404:15;2438:4;2435:1;2428:15;2454:719;2497:5;2550:3;2543:4;2535:6;2531:17;2527:27;2517:55;;2568:1;2565;2558:12;2517:55;2604:6;2591:20;2630:18;2667:2;2663;2660:10;2657:36;;;2673:18;;:::i;:::-;2748:2;2742:9;2716:2;2802:13;;-1:-1:-1;;2798:22:1;;;2822:2;2794:31;2790:40;2778:53;;;2846:18;;;2866:22;;;2843:46;2840:72;;;2892:18;;:::i;:::-;2932:10;2928:2;2921:22;2967:2;2959:6;2952:18;3013:3;3006:4;3001:2;2993:6;2989:15;2985:26;2982:35;2979:55;;;3030:1;3027;3020:12;2979:55;3094:2;3087:4;3079:6;3075:17;3068:4;3060:6;3056:17;3043:54;3141:1;3134:4;3129:2;3121:6;3117:15;3113:26;3106:37;3161:6;3152:15;;;;;;2454:719;;;;:::o;3178:648::-;3228:5;3281:3;3274:4;3266:6;3262:17;3258:27;3248:55;;3299:1;3296;3289:12;3248:55;3332:2;3326:9;3374:3;3366:6;3362:16;3444:6;3432:10;3429:22;3408:18;3396:10;3393:34;3390:62;3387:88;;;3455:18;;:::i;:::-;3491:2;3484:22;3526:6;3567:3;3555:16;;3583:15;;;3580:35;;;3611:1;3608;3601:12;3580:35;3635:6;3650:146;3666:6;3661:3;3658:15;3650:146;;;3734:17;;3722:30;;3781:4;3772:14;;;;3683;3650:146;;;-1:-1:-1;3814:6:1;;3178:648;-1:-1:-1;;;;;3178:648:1:o;3831:118::-;3917:5;3910:13;3903:21;3896:5;3893:32;3883:60;;3939:1;3936;3929:12;3954:128;4019:20;;4048:28;4019:20;4048:28;:::i;4087:1463::-;4286:6;4294;4302;4310;4318;4326;4334;4342;4350;4403:3;4391:9;4382:7;4378:23;4374:33;4371:53;;;4420:1;4417;4410:12;4371:53;4460:9;4447:23;4489:18;4530:2;4522:6;4519:14;4516:34;;;4546:1;4543;4536:12;4516:34;4569:50;4611:7;4602:6;4591:9;4587:22;4569:50;:::i;:::-;4559:60;;4672:2;4661:9;4657:18;4644:32;4628:48;;4701:2;4691:8;4688:16;4685:36;;;4717:1;4714;4707:12;4685:36;4740:52;4784:7;4773:8;4762:9;4758:24;4740:52;:::i;:::-;4730:62;;4845:2;4834:9;4830:18;4817:32;4801:48;;4874:2;4864:8;4861:16;4858:36;;;4890:1;4887;4880:12;4858:36;4913:52;4957:7;4946:8;4935:9;4931:24;4913:52;:::i;:::-;4903:62;;5012:2;5001:9;4997:18;4984:32;4974:42;;5063:3;5052:9;5048:19;5035:33;5025:43;;5087:54;5133:7;5127:3;5116:9;5112:19;5087:54;:::i;:::-;5077:64;;5194:3;5183:9;5179:19;5166:33;5150:49;;5224:2;5214:8;5211:16;5208:36;;;5240:1;5237;5230:12;5208:36;5263:52;5307:7;5296:8;5285:9;5281:24;5263:52;:::i;:::-;5253:62;;5368:3;5357:9;5353:19;5340:33;5324:49;;5398:2;5388:8;5385:16;5382:36;;;5414:1;5411;5404:12;5382:36;;5437:52;5481:7;5470:8;5459:9;5455:24;5437:52;:::i;:::-;5427:62;;;5508:36;5539:3;5528:9;5524:19;5508:36;:::i;:::-;5498:46;;4087:1463;;;;;;;;;;;:::o;5737:186::-;5796:6;5849:2;5837:9;5828:7;5824:23;5820:32;5817:52;;;5865:1;5862;5855:12;5817:52;5888:29;5907:9;5888:29;:::i;5928:328::-;6005:6;6013;6021;6074:2;6062:9;6053:7;6049:23;6045:32;6042:52;;;6090:1;6087;6080:12;6042:52;6113:29;6132:9;6113:29;:::i;:::-;6103:39;;6161:38;6195:2;6184:9;6180:18;6161:38;:::i;:::-;6151:48;;6246:2;6235:9;6231:18;6218:32;6208:42;;5928:328;;;;;:::o;6261:592::-;6332:6;6340;6393:2;6381:9;6372:7;6368:23;6364:32;6361:52;;;6409:1;6406;6399:12;6361:52;6449:9;6436:23;6478:18;6519:2;6511:6;6508:14;6505:34;;;6535:1;6532;6525:12;6505:34;6573:6;6562:9;6558:22;6548:32;;6618:7;6611:4;6607:2;6603:13;6599:27;6589:55;;6640:1;6637;6630:12;6589:55;6680:2;6667:16;6706:2;6698:6;6695:14;6692:34;;;6722:1;6719;6712:12;6692:34;6767:7;6762:2;6753:6;6749:2;6745:15;6741:24;6738:37;6735:57;;;6788:1;6785;6778:12;6735:57;6819:2;6811:11;;;;;6841:6;;-1:-1:-1;6261:592:1;;-1:-1:-1;;;;6261:592:1:o;6858:615::-;6944:6;6952;7005:2;6993:9;6984:7;6980:23;6976:32;6973:52;;;7021:1;7018;7011:12;6973:52;7061:9;7048:23;7090:18;7131:2;7123:6;7120:14;7117:34;;;7147:1;7144;7137:12;7117:34;7185:6;7174:9;7170:22;7160:32;;7230:7;7223:4;7219:2;7215:13;7211:27;7201:55;;7252:1;7249;7242:12;7201:55;7292:2;7279:16;7318:2;7310:6;7307:14;7304:34;;;7334:1;7331;7324:12;7304:34;7387:7;7382:2;7372:6;7369:1;7365:14;7361:2;7357:23;7353:32;7350:45;7347:65;;;7408:1;7405;7398:12;7478:315;7543:6;7551;7604:2;7592:9;7583:7;7579:23;7575:32;7572:52;;;7620:1;7617;7610:12;7572:52;7643:29;7662:9;7643:29;:::i;:::-;7633:39;;7722:2;7711:9;7707:18;7694:32;7735:28;7757:5;7735:28;:::i;:::-;7782:5;7772:15;;;7478:315;;;;;:::o;7798:390::-;7876:6;7884;7937:2;7925:9;7916:7;7912:23;7908:32;7905:52;;;7953:1;7950;7943:12;7905:52;7993:9;7980:23;8026:18;8018:6;8015:30;8012:50;;;8058:1;8055;8048:12;8012:50;8081;8123:7;8114:6;8103:9;8099:22;8081:50;:::i;:::-;8071:60;8178:2;8163:18;;;;8150:32;;-1:-1:-1;;;;7798:390:1:o;8193:538::-;8288:6;8296;8304;8312;8365:3;8353:9;8344:7;8340:23;8336:33;8333:53;;;8382:1;8379;8372:12;8333:53;8405:29;8424:9;8405:29;:::i;:::-;8395:39;;8453:38;8487:2;8476:9;8472:18;8453:38;:::i;:::-;8443:48;;8538:2;8527:9;8523:18;8510:32;8500:42;;8593:2;8582:9;8578:18;8565:32;8620:18;8612:6;8609:30;8606:50;;;8652:1;8649;8642:12;8606:50;8675;8717:7;8708:6;8697:9;8693:22;8675:50;:::i;:::-;8665:60;;;8193:538;;;;;;;:::o;8736:1339::-;9203:4;9232:3;9262:2;9251:9;9244:21;9288:45;9329:2;9318:9;9314:18;9306:6;9288:45;:::i;:::-;9274:59;;9381:9;9373:6;9369:22;9364:2;9353:9;9349:18;9342:50;9415:33;9441:6;9433;9415:33;:::i;:::-;9401:47;;9496:9;9488:6;9484:22;9479:2;9468:9;9464:18;9457:50;9530:33;9556:6;9548;9530:33;:::i;:::-;9516:47;;9611:9;9603:6;9599:22;9594:2;9583:9;9579:18;9572:50;9645:33;9671:6;9663;9645:33;:::i;:::-;9631:47;;9727:9;9719:6;9715:22;9709:3;9698:9;9694:19;9687:51;9755:33;9781:6;9773;9755:33;:::i;:::-;9819:3;9804:19;;9797:35;;;;-1:-1:-1;;9863:3:1;9848:19;;9841:35;;;;9907:3;9892:19;;9885:35;;;;9951:3;9936:19;;9929:35;;;;9995:3;9980:19;;9973:35;10052:15;10045:23;10039:3;10024:19;;;10017:52;9747:41;8736:1339;-1:-1:-1;;;;;8736:1339:1:o;10080:260::-;10148:6;10156;10209:2;10197:9;10188:7;10184:23;10180:32;10177:52;;;10225:1;10222;10215:12;10177:52;10248:29;10267:9;10248:29;:::i;:::-;10238:39;;10296:38;10330:2;10319:9;10315:18;10296:38;:::i;:::-;10286:48;;10080:260;;;;;:::o;10345:1138::-;10517:6;10525;10533;10541;10549;10557;10565;10573;10626:3;10614:9;10605:7;10601:23;10597:33;10594:53;;;10643:1;10640;10633:12;10594:53;10683:9;10670:23;10712:18;10753:2;10745:6;10742:14;10739:34;;;10769:1;10766;10759:12;10739:34;10792:50;10834:7;10825:6;10814:9;10810:22;10792:50;:::i;:::-;10782:60;;10895:2;10884:9;10880:18;10867:32;10851:48;;10924:2;10914:8;10911:16;10908:36;;;10940:1;10937;10930:12;10908:36;10963:52;11007:7;10996:8;10985:9;10981:24;10963:52;:::i;:::-;10953:62;;11068:2;11057:9;11053:18;11040:32;11024:48;;11097:2;11087:8;11084:16;11081:36;;;11113:1;11110;11103:12;11081:36;;11136:52;11180:7;11169:8;11158:9;11154:24;11136:52;:::i;:::-;11126:62;;;11235:2;11224:9;11220:18;11207:32;11197:42;;11286:3;11275:9;11271:19;11258:33;11248:43;;11310:54;11356:7;11350:3;11339:9;11335:19;11310:54;:::i;:::-;11300:64;;11383:39;11417:3;11406:9;11402:19;11383:39;:::i;:::-;11373:49;;11441:36;11472:3;11461:9;11457:19;11441:36;:::i;:::-;11431:46;;10345:1138;;;;;;;;;;;:::o;11488:1532::-;11696:6;11704;11712;11720;11728;11736;11744;11752;11760;11768;11821:3;11809:9;11800:7;11796:23;11792:33;11789:53;;;11838:1;11835;11828:12;11789:53;11878:9;11865:23;11907:18;11948:2;11940:6;11937:14;11934:34;;;11964:1;11961;11954:12;11934:34;11987:50;12029:7;12020:6;12009:9;12005:22;11987:50;:::i;:::-;11977:60;;12090:2;12079:9;12075:18;12062:32;12046:48;;12119:2;12109:8;12106:16;12103:36;;;12135:1;12132;12125:12;12103:36;12158:52;12202:7;12191:8;12180:9;12176:24;12158:52;:::i;:::-;12148:62;;12263:2;12252:9;12248:18;12235:32;12219:48;;12292:2;12282:8;12279:16;12276:36;;;12308:1;12305;12298:12;12276:36;12331:52;12375:7;12364:8;12353:9;12349:24;12331:52;:::i;:::-;12321:62;;12430:2;12419:9;12415:18;12402:32;12392:42;;12481:3;12470:9;12466:19;12453:33;12443:43;;12505:54;12551:7;12545:3;12534:9;12530:19;12505:54;:::i;:::-;12495:64;;12612:3;12601:9;12597:19;12584:33;12568:49;;12642:2;12632:8;12629:16;12626:36;;;12658:1;12655;12648:12;12626:36;12681:52;12725:7;12714:8;12703:9;12699:24;12681:52;:::i;:::-;12671:62;;12786:3;12775:9;12771:19;12758:33;12742:49;;12816:2;12806:8;12803:16;12800:36;;;12832:1;12829;12822:12;12800:36;;12855:52;12899:7;12888:8;12877:9;12873:24;12855:52;:::i;:::-;12845:62;;;12954:3;12943:9;12939:19;12926:33;12916:43;;12978:36;13009:3;12998:9;12994:19;12978:36;:::i;:::-;12968:46;;11488:1532;;;;;;;;;;;;;:::o;13025:437::-;13104:1;13100:12;;;;13147;;;13168:61;;13222:4;13214:6;13210:17;13200:27;;13168:61;13275:2;13267:6;13264:14;13244:18;13241:38;13238:218;;;-1:-1:-1;;;13309:1:1;13302:88;13413:4;13410:1;13403:15;13441:4;13438:1;13431:15;13238:218;;13025:437;;;:::o;15425:184::-;-1:-1:-1;;;15474:1:1;15467:88;15574:4;15571:1;15564:15;15598:4;15595:1;15588:15;15614:135;15653:3;-1:-1:-1;;15674:17:1;;15671:43;;;15694:18;;:::i;:::-;-1:-1:-1;15741:1:1;15730:13;;15614:135::o;18488:273::-;18673:6;18665;18660:3;18647:33;18629:3;18699:16;;18724:13;;;18699:16;18488:273;-1:-1:-1;18488:273:1:o;18766:184::-;-1:-1:-1;;;18815:1:1;18808:88;18915:4;18912:1;18905:15;18939:4;18936:1;18929:15;19309:184;19379:6;19432:2;19420:9;19411:7;19407:23;19403:32;19400:52;;;19448:1;19445;19438:12;19400:52;-1:-1:-1;19471:16:1;;19309:184;-1:-1:-1;19309:184:1:o;20836:276::-;20967:3;21005:6;20999:13;21021:53;21067:6;21062:3;21055:4;21047:6;21043:17;21021:53;:::i;:::-;21090:16;;;;;20836:276;-1:-1:-1;;20836:276:1:o;21852:245::-;21919:6;21972:2;21960:9;21951:7;21947:23;21943:32;21940:52;;;21988:1;21985;21978:12;21940:52;22020:9;22014:16;22039:28;22061:5;22039:28;:::i;22228:1156::-;22356:3;22385:1;22418:6;22412:13;22448:3;22470:1;22498:9;22494:2;22490:18;22480:28;;22558:2;22547:9;22543:18;22580;22570:61;;22624:4;22616:6;22612:17;22602:27;;22570:61;22650:2;22698;22690:6;22687:14;22667:18;22664:38;22661:222;;;-1:-1:-1;;;22732:3:1;22725:90;22838:4;22835:1;22828:15;22868:4;22863:3;22856:17;22661:222;22899:18;22926:104;;;;23044:1;23039:320;;;;22892:467;;22926:104;-1:-1:-1;;22959:24:1;;22947:37;;23004:16;;;;-1:-1:-1;22926:104:1;;23039:320;22175:1;22168:14;;;22212:4;22199:18;;23134:1;23148:165;23162:6;23159:1;23156:13;23148:165;;;23240:14;;23227:11;;;23220:35;23283:16;;;;23177:10;;23148:165;;;23152:3;;23342:6;23337:3;23333:16;23326:23;;22892:467;-1:-1:-1;23375:3:1;;22228:1156;-1:-1:-1;;;;;;;;22228:1156:1:o;23791:470::-;23970:3;24008:6;24002:13;24024:53;24070:6;24065:3;24058:4;24050:6;24046:17;24024:53;:::i;:::-;24140:13;;24099:16;;;;24162:57;24140:13;24099:16;24196:4;24184:17;;24162:57;:::i;:::-;24235:20;;23791:470;-1:-1:-1;;;;23791:470:1:o;27258:128::-;27298:3;27329:1;27325:6;27322:1;27319:13;27316:39;;;27335:18;;:::i;:::-;-1:-1:-1;27371:9:1;;27258:128::o;27735:125::-;27775:4;27803:1;27800;27797:8;27794:34;;;27808:18;;:::i;:::-;-1:-1:-1;27845:9:1;;27735:125::o;28621:184::-;-1:-1:-1;;;28670:1:1;28663:88;28770:4;28767:1;28760:15;28794:4;28791:1;28784:15;28810:120;28850:1;28876;28866:35;;28881:18;;:::i;:::-;-1:-1:-1;28915:9:1;;28810:120::o;28935:112::-;28967:1;28993;28983:35;;28998:18;;:::i;:::-;-1:-1:-1;29032:9:1;;28935:112::o;29667:858::-;29942:3;29980:6;29974:13;29996:53;30042:6;30037:3;30030:4;30022:6;30018:17;29996:53;:::i;:::-;30112:13;;30071:16;;;;30134:57;30112:13;30071:16;30168:4;30156:17;;30134:57;:::i;:::-;30258:13;;30213:20;;;30280:57;30258:13;30213:20;30314:4;30302:17;;30280:57;:::i;:::-;30404:13;;30359:20;;;30426:57;30404:13;30359:20;30460:4;30448:17;;30426:57;:::i;:::-;30499:20;;29667:858;-1:-1:-1;;;;;;29667:858:1:o;30530:1257::-;30901:3;30939:6;30933:13;30965:4;30978:51;31022:6;31017:3;31012:2;31004:6;31000:15;30978:51;:::i;:::-;31092:13;;31051:16;;;;31114:55;31092:13;31051:16;31136:15;;;31114:55;:::i;:::-;31236:13;;31191:20;;;31258:55;31236:13;31191:20;31280:15;;;31258:55;:::i;:::-;31380:13;;31335:20;;;31402:55;31380:13;31335:20;31424:15;;;31402:55;:::i;:::-;31524:13;;31479:20;;;31546:55;31524:13;31479:20;31568:15;;;31546:55;:::i;:::-;31668:13;;31623:20;;;31690:55;31668:13;31623:20;31712:15;;;31690:55;:::i;:::-;31761:20;;;;;30530:1257;-1:-1:-1;;;;;;;;;30530:1257:1:o;31792:512::-;31986:4;-1:-1:-1;;;;;32096:2:1;32088:6;32084:15;32073:9;32066:34;32148:2;32140:6;32136:15;32131:2;32120:9;32116:18;32109:43;;32188:6;32183:2;32172:9;32168:18;32161:34;32231:3;32226:2;32215:9;32211:18;32204:31;32252:46;32293:3;32282:9;32278:19;32270:6;32252:46;:::i;:::-;32244:54;31792:512;-1:-1:-1;;;;;;31792:512:1:o;32309:249::-;32378:6;32431:2;32419:9;32410:7;32406:23;32402:32;32399:52;;;32447:1;32444;32437:12;32399:52;32479:9;32473:16;32498:30;32522:5;32498:30;:::i;32563:168::-;32603:7;32669:1;32665;32661:6;32657:14;32654:1;32651:21;32646:1;32639:9;32632:17;32628:45;32625:71;;;32676:18;;:::i;:::-;-1:-1:-1;32716:9:1;;32563:168::o;32736:675::-;33044:66;33039:3;33032:79;33014:3;33140:6;33134:13;33156:62;33211:6;33206:2;33201:3;33197:12;33190:4;33182:6;33178:17;33156:62;:::i;:::-;33278:13;;33237:16;;;;33300:63;33278:13;33349:2;33341:11;;33334:4;33322:17;;33300:63;:::i;:::-;33383:17;33402:2;33379:26;;32736:675;-1:-1:-1;;;;32736:675:1:o;33668:184::-;-1:-1:-1;;;33717:1:1;33710:88;33817:4;33814:1;33807:15;33841:4;33838:1;33831:15

Swarm Source

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