ETH Price: $3,477.41 (+0.86%)

Token

Homospacien NFT (Homospacien)
 

Overview

Max Total Supply

215 Homospacien

Holders

91

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 Homospacien
0x77169284e0cda0fbd170ab0701a2f89036b7276b
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Homospacien

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/Strings.sol

pragma solidity ^0.8.4;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol

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

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

// File: @openzeppelin/contracts/access/Ownable.sol



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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

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

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: @openzeppelin/contracts/utils/Counters.sol

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
        counter._value += 1;
       }
   }

    function incrementByValue(Counter storage counter, uint256 primaryValue) internal{
            unchecked {
            counter._value += primaryValue;
        }
    }


function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}

function reset(Counter storage counter) internal {
counter._value = 0;
}
}

// File: contracts/Homospacien.sol



// File: @openzeppelin/contracts/utils/math/SafeMath.sol

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

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

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

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

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

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

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

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

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

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

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

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

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


function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}

function ceil(uint256 a, uint256 m) internal pure returns (uint256) {
uint256 c = add(a,m);
uint256 d = sub(c,1);
return mul(div(d,m),m);
}
}

contract Homospacien is  ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
Counters.Counter private _earlyBirds; // early
Counters.Counter private _preSales;
Counters.Counter private _freeTokenIds;
Counters.Counter private _mainSales;
using SafeMath for uint256;
using Strings for uint256;
mapping(string => bool) _homospacienExists;
string public _baseHomospacienArtURL;
uint256 private _totalFreeTokenSupply;
uint256 private _totalEarlyBirdSupply;
uint256 private _totalPreSaleSupply;
uint256 private _totalMainSaleSupply;
uint commissionDenominator = 10000;
uint256 public basePercent = 100;

uint256 private _earlyBirdPrice = 0.045 ether;
uint256 private _preSalePrice = 0.045 ether;
uint256 private _mainSalePrice = 0.045 ether;
uint256 private defaultRoyalityPercent = 1000;
bool private EarlyBirdOngoing;
bool private PreSaleOngoing;
bool private MainSaleOngoing;

bool private EarlyBirdUpgraded;
bool private PreSaleUpgraded;
uint32 private TOKEN_TYPE_FREE =1;
uint32 private TOKEN_TYPE_EARLY_BIRD =2;
uint32 private TOKEN_TYPE_PRE_SALE =3;
uint32 private TOKEN_TYPE_MAIN_SALE =4;
uint32 public maxiumum_Early_Bird_TPT;
uint32 public maximum_token_per_transactions;
uint32 private default_token_per_transactions=10;
mapping(address=>bool) freeTokenWhiteList;
mapping(address=>uint256) freeTokenRecivers;
mapping(address=>uint256) freeTokensOwned;
address[] internal whitelist;
address[] internal whitelistEarlyBird;
address[] internal whitelistPreSale;
address[] internal team;

// Data of each NFT
struct TokenData {
uint256 price;       // price of the token
bool isSellEnabled;
//uint32 type;
}


mapping(uint256 => TokenData) tokens;
constructor() ERC721("Homospacien NFT", "Homospacien") {
    EarlyBirdOngoing= false;
    PreSaleOngoing = false;
    MainSaleOngoing =false;
    EarlyBirdUpgraded =false;
    PreSaleUpgraded = false;
    maxiumum_Early_Bird_TPT=1;
    maximum_token_per_transactions=default_token_per_transactions;
    _baseHomospacienArtURL= "https://ipfs.io/ipfs/QmSszmPiMeX6ZqvM4YNzy5GtfHQTGjaHJBef4ZHJNBnpNY/";
    _totalFreeTokenSupply = 500;
    _totalEarlyBirdSupply = 500;
    _totalPreSaleSupply   = 1000;
    _totalMainSaleSupply  = 8000;
    _tokenIds.incrementByValue(78);
    _freeTokenIds.incrementByValue(60);
    _mainSales.incrementByValue(18);
  
}

event TotalSupplyChnaged(uint32 tokenType,  uint256 _prevSupply,  uint256 _newSupply, uint now);

function chnageTotalSupply(uint32 tokenType, uint256 _supply)
public
onlyOwner
{   uint256 _prevSupply =0;
    if (tokenType == TOKEN_TYPE_FREE){
    _prevSupply = _totalFreeTokenSupply;
    _totalFreeTokenSupply = _supply;
    } else if(tokenType == TOKEN_TYPE_EARLY_BIRD){
    _prevSupply = _totalEarlyBirdSupply;
    _totalEarlyBirdSupply = _supply;
    } else if(tokenType == TOKEN_TYPE_PRE_SALE){
    _prevSupply = _totalPreSaleSupply;
    _totalPreSaleSupply = _supply;
    } else if(tokenType == TOKEN_TYPE_MAIN_SALE){
    _prevSupply = _totalMainSaleSupply;
    _totalMainSaleSupply = _supply;
}
emit TotalSupplyChnaged( tokenType,   _prevSupply,   _supply, block.timestamp);
}



function change_baseURL( string memory _url) public
onlyOwner
returns (string memory) {
    _baseHomospacienArtURL = _url;
    return _baseHomospacienArtURL;
}

function change_TPT_EarlyBird( uint32 tpt) public
onlyOwner
returns (uint32) {
    maxiumum_Early_Bird_TPT = tpt;
    return maxiumum_Early_Bird_TPT;
}


function change_TPT( uint32 tpt) public
onlyOwner
returns (uint32) {
    maximum_token_per_transactions = tpt;
    return maximum_token_per_transactions;
}

event SaleStarted(uint32 tokenType,  uint now);

function setupEarlyBird( bool isOpen) public
onlyOwner
returns (bool) {
    EarlyBirdOngoing = isOpen;
    if(isOpen){
    setupPreSale(false);
    setupMainSale(false);
    emit SaleStarted( TOKEN_TYPE_EARLY_BIRD,  block.timestamp);
    }
    return EarlyBirdOngoing;
}

function setupPreSale( bool isOpen) public
onlyOwner
returns (bool) {
    PreSaleOngoing = isOpen;
    if(isOpen){
    setupEarlyBird(false);
    setupMainSale(false);
    emit SaleStarted( TOKEN_TYPE_PRE_SALE,  block.timestamp);
    }
    return PreSaleOngoing;
}


function setupMainSale( bool isOpen) public
onlyOwner
returns (bool) {
    MainSaleOngoing = isOpen;
    if(isOpen){
    setupEarlyBird(false);
    setupPreSale(false);
    emit SaleStarted( TOKEN_TYPE_MAIN_SALE,  block.timestamp);
    }
    return MainSaleOngoing;
}


function upgradeEarlyBird()public
onlyOwner
returns (bool) {

    EarlyBirdUpgraded = true;
    _totalPreSaleSupply = _totalPreSaleSupply.add(_totalEarlyBirdSupply.sub(_earlyBirds.current()));
    setupEarlyBird(false);
    setupPreSale(true);
    return EarlyBirdUpgraded;
}


function upgradePreSale()public
onlyOwner
returns (bool) {
    PreSaleUpgraded = true;
    _totalMainSaleSupply = _totalMainSaleSupply.add(_totalPreSaleSupply.sub(_preSales.current()));
    setupPreSale(false);
    return PreSaleUpgraded;
}

function payPrice(address sender, uint256 _price)
internal
{
    require( address(sender).balance>_price, "Insufficient Balance.");
    address payable _platform= payable(owner());
    _platform.transfer(_price);
}
event HomoSpacienCreated(uint32 tokenType,  uint256 num,  uint now);
function mintEarlyBird(uint256 num) public
payable
returns(uint256)
{
    require(EarlyBirdOngoing, "Currently Early Bird session is not enabled.");
    require(num<=maxiumum_Early_Bird_TPT, "Only fixed number of tokens can be minted per transactions.");
    uint256 supply = _earlyBirds.current();
    require( supply + num < _totalEarlyBirdSupply && num > 0, "Exceeds maximum supply for early bird" );
    (bool _isListed, ) = isWhiteListed(msg.sender, TOKEN_TYPE_EARLY_BIRD);
    require(_isListed, "Only whiteListed User can mint early bird token."); 
    require(msg.value >= num * _earlyBirdPrice, "Price is more than Balance." );
    for(uint256 i; i < num; i++){
        mintToken(  _earlyBirdPrice );
        _earlyBirds.increment();
    }
    emit HomoSpacienCreated(TOKEN_TYPE_EARLY_BIRD,   num,  block.timestamp);
    return _earlyBirds.current();
}


function mintFreeTokens(uint256 num) public
onlyOwner
returns(uint256)
{

    uint256 supply = _freeTokenIds.current();
    require( supply + num < _totalFreeTokenSupply && num > 0, "Exceeds maximum supply for free tokens." );
    
    for(uint256 i; i < num; i++){
        mintToken(  0.0 );
        _freeTokenIds.increment();
    }
    emit HomoSpacienCreated(TOKEN_TYPE_FREE,   num,  block.timestamp);
    return _freeTokenIds.current();
}

function transferFromOwner(address to, uint256  _tokenId) public{
    require(super._isApprovedOrOwner(super._msgSender(), _tokenId), "ERC721: transfer caller is not owner nor approved");
    transferFrom(super._msgSender(),  to, _tokenId);

}


function mintPreSaleTokens(uint256 num) public
payable
returns(uint256)
{
    require(PreSaleOngoing, "Currently Pre-Sale session is not enabled.");
    require(num<=maxiumum_Early_Bird_TPT && num > 0, "Only fixed number of tokens can be minted per transactions.");
    uint256 supply = _preSales.current();
    require( supply + num < _totalPreSaleSupply, "Exceeds maximum supply for free tokens." );
    (bool _isListed, ) = isWhiteListed(msg.sender, TOKEN_TYPE_PRE_SALE);
    require(_isListed, "Only whiteListed User can mint pre-sale token.");
    require(msg.value >= _preSalePrice * num, "Insufficient Balance." );

    for(uint256 i; i < num; i++){
        mintToken( _preSalePrice );
        _preSales.increment();
    }
    emit HomoSpacienCreated(TOKEN_TYPE_PRE_SALE,   num,  block.timestamp);
    return _preSales.current();
}


function mintMainSaleToken() public
payable
returns(uint256){

    require(MainSaleOngoing, "Currently Main Sale session is not enabled.");
    require( _mainSales.current() +1 < _totalMainSaleSupply , "Exceeds maximum supply for free tokens." );
    require(msg.value >= _mainSalePrice, "Insufficient Balance." );
    mintToken(  _mainSalePrice );
    _mainSales.increment();  
    emit HomoSpacienCreated(TOKEN_TYPE_MAIN_SALE, 1,  block.timestamp);
    return _mainSales.current();
}


function mintMainSaleTokens(uint256 num) public
payable
returns(uint256){

    require(MainSaleOngoing, "Currently Main Sale session is not enabled.");
    require(num<=maximum_token_per_transactions && num > 0, "Only 10 tokens can be minted per transactions.");
    uint256 supply = _mainSales.current();
    require( supply + num < _totalMainSaleSupply, "Exceeds maximum supply for free tokens." ); 
    require(msg.value >= _mainSalePrice * num, "Insufficient Balance." );

    for(uint256 i; i < num; i++){
        mintToken(  _mainSalePrice );
        _mainSales.increment();
    }
    emit HomoSpacienCreated(TOKEN_TYPE_MAIN_SALE, num,  block.timestamp);
    return _mainSales.current();
}

function getBaseUrl() public view returns (string memory)
{
    return _baseHomospacienArtURL;
}

function getTokenUrl(uint256 tokenId) internal view returns (string memory)
{
    string memory currentUrl = string(abi.encodePacked(_baseHomospacienArtURL, tokenId.toString()));
    return currentUrl;
}


// mints the NFT and save the data in the "tokens" map
function mintToken(uint256 _price) internal returns (uint256)
{
    _tokenIds.increment();
    uint256 newItemId = _tokenIds.current();
    string memory tokenURI = getTokenUrl(newItemId);
    require(_homospacienExists[tokenURI]  != true, "Token Already Exists");

    _safeMint(msg.sender, newItemId);
    _setTokenURI(newItemId, tokenURI);
    tokens[newItemId] = TokenData({price: _price, isSellEnabled:false});
    _homospacienExists[tokenURI] = true;

    return newItemId;
}


function mintFreeHomospacien(uint256 num, address)
public
{
    address minter = msg.sender;
    require(freeTokenWhiteList[minter], "Free token can be minted only by team member and whitelisted users.");   
    require(freeTokenRecivers[minter] > freeTokensOwned[minter], "The maximum number of token for this user is reached.");
    require(num <= (freeTokenRecivers[minter] - freeTokensOwned[minter]) , "The maximum number of tokens that you are trying to mint is higher than your limit.");
   
    for(uint256 i; i < num; i++){
        mintToken(0.0);
        freeTokensOwned[minter]= freeTokensOwned[minter].add(1);
    }   
    emit HomoSpacienCreated(TOKEN_TYPE_FREE, num,  block.timestamp);
}
event PaymentToOwner( uint _amount, address from, address to, uint now);
event SentRoyalty(uint256 _tokenId, address customer, address platform, uint256 amount, uint now);

function BuyHomoSpacien( uint256  _tokenId)  payable external{
    require(tokens[_tokenId].isSellEnabled, "Sell is not enabled for the token");
    address  customer = msg.sender;
    address payable _platform= payable(owner());
    uint256 productPriceinWei = tokens[_tokenId].price;
    uint256 price = msg.value;
    address payable  tokenOwner = payable(ownerOf(_tokenId));
    // send ether is same as price
    verifyTransaction(_tokenId, customer , tokenOwner,  _platform, price, productPriceinWei);
    _safeTransfer(tokenOwner, customer, _tokenId, "");
    tokens[_tokenId].isSellEnabled =false;
    //10% will go to platform

    uint256  platformCut = productPriceinWei.mul(defaultRoyalityPercent).div(commissionDenominator);
    platformCut = platformCut.ceil(basePercent);
    //market place commission
    _platform.transfer(platformCut);

    emit SentRoyalty(_tokenId, customer, _platform, platformCut, block.timestamp);

    uint256 ownerCut1 = productPriceinWei.sub(platformCut);
    ownerCut1 = ownerCut1.ceil(basePercent);
    tokenOwner.transfer(ownerCut1);
    emit PaymentToOwner(ownerCut1, tokenOwner, customer, block.timestamp);
}


function verifyTransaction(uint256  _tokenId, address customer, address tokenOwner, address _platform,
uint256 price, uint256 priceInWei)
view internal {
    require(_exists(_tokenId), "This is not a valid TokenId");
    require(tokenOwner != address(0) , "Invalid owner address.");
    require(customer != address(0) , "Invalid customer address as zero.");
    require(tokenOwner != customer && tokenOwner != _platform, "Invalid customer address.");
    require(price >= priceInWei, "Invalid amount.");

    uint256 customerBalance = address(customer).balance;
    require(customerBalance >=priceInWei, 'Insufficient Balance. Balance should be more than or equal to price.');
}


function recievdHomoSpecien(uint256 _tokenId, address to)
payable
public
{

    require(_exists(_tokenId), "This is not a valid TokenId");
    address _platform= payable(owner());
    require(msg.sender != _platform, "Invalid MarketPlace address.");
    require(to != _platform, "Invalid MarketPlace address.");
    require(to != address(0) && _platform != address(0) && to !=_platform, "Invalid address.");
    safeTransferFrom(_platform,to,_tokenId);
}

function changePrice(uint256 _tokenId, uint256 _newPrice) external {
    require(_exists(_tokenId), "This is not a valid TokenId");
    require(ownerOf(_tokenId) == msg.sender, "Only owner can change the price.");
    require(_newPrice != uint256(0));
    uint256 _oldPrice = tokens[_tokenId].price;
    require(_newPrice != _oldPrice, "New price can not be same as old price.");
    tokens[_tokenId].price = _newPrice;
}

function isWhiteListed(address _address, uint32 tokenType)
public
view
returns(bool, uint256)
{
    address _platform= payable(owner());
    require(tokenType == TOKEN_TYPE_FREE||tokenType == TOKEN_TYPE_EARLY_BIRD||tokenType == TOKEN_TYPE_PRE_SALE, "Invalid Token Type");
    require(_address != address(0) && _platform != _address, "Invalid address.");
    if (tokenType == TOKEN_TYPE_FREE){
    for (uint256 s = 0; s < whitelist.length; s += 1){
    if (_address == whitelist[s]) return (true, s);
    }
    return (false, 0);
    } else if(tokenType == TOKEN_TYPE_EARLY_BIRD){
    for (uint256 s = 0; s < whitelistEarlyBird.length; s += 1){
    if (_address == whitelistEarlyBird[s]) return (true, s);
    }
    return (false, 0);
    } else if(tokenType == TOKEN_TYPE_PRE_SALE){
    for (uint256 s = 0; s < whitelistPreSale.length; s += 1){
    if (_address == whitelistPreSale[s]) return (true, s);
    }
    return (false, 0);
    }

    return (false, 0);

}

/**
 * @notice A method to add a address to whitelist.
 * @param _address The address to add.
 */
function addToWhitelist(address _address, uint32 tokenType)
public
onlyOwner
{   bool _isWhitelisted = false;
    address _platform= payable(owner());
    require(tokenType == TOKEN_TYPE_FREE||tokenType == TOKEN_TYPE_EARLY_BIRD||tokenType == TOKEN_TYPE_PRE_SALE, "Invalid Token Type");
    require(_address != address(0) && _platform != _address, "Invalid address.");
    if (tokenType == TOKEN_TYPE_FREE){
    (_isWhitelisted, ) = isWhiteListed(_address, tokenType);
    if(!_isWhitelisted) whitelist.push(_address);
    } else if(tokenType == TOKEN_TYPE_EARLY_BIRD){
    (_isWhitelisted, ) = isWhiteListed(_address, tokenType);
    if(!_isWhitelisted) whitelistEarlyBird.push(_address);
    } else if(tokenType == TOKEN_TYPE_PRE_SALE){
    (_isWhitelisted, ) = isWhiteListed(_address, tokenType);
    if(!_isWhitelisted) whitelistPreSale.push(_address);
    }
}

function totalSupply()external view returns (uint256){
    return _tokenIds.current();
}

function removefromWhiteList(address _address, uint32 tokenType)
public
onlyOwner
    {  
        address _platform= payable(owner());
        require(tokenType == TOKEN_TYPE_FREE||tokenType == TOKEN_TYPE_EARLY_BIRD||tokenType == TOKEN_TYPE_PRE_SALE, "Invalid Token Type");
        require(_address != address(0) && _platform != _address, "Invalid address.");
        if (tokenType == TOKEN_TYPE_FREE){
        (bool _isWhitelisted, uint256 s) = isWhiteListed(_address, tokenType);
            if(_isWhitelisted){
            whitelist[s] = whitelist[whitelist.length - 1];
            whitelist.pop();
            } 
        } else if(tokenType == TOKEN_TYPE_EARLY_BIRD){
        (bool _isWhitelisted1, uint256 s1) = isWhiteListed(_address, tokenType);
            if(_isWhitelisted1){
            whitelistEarlyBird[s1] = whitelistEarlyBird[whitelistEarlyBird.length - 1];
            whitelistEarlyBird.pop();
            } 
        } else if(tokenType == TOKEN_TYPE_PRE_SALE){
        (bool _isWhitelisted2, uint256 s2) = isWhiteListed(_address, tokenType);
            if(_isWhitelisted2){
            whitelistPreSale[s2] = whitelistPreSale[whitelistPreSale.length - 1];
            whitelistPreSale.pop();
            } 
     
        }

    }

    function addToFreeWhitelist(address _address, uint256 num ) public onlyOwner{
        require(freeTokenWhiteList[_address]==false, "Address is already added for free token ");
        freeTokenRecivers[_address]=num;
        freeTokenWhiteList[_address]=true;
    }
    
    function addAddressListToFreeWhitelist(address[] calldata _addressList, uint256[] calldata num, uint32 tokenType ) public onlyOwner{
        
        for (uint i=0; i<_addressList.length; i++){
            bool _isWhitelisted = false;
            if (tokenType == TOKEN_TYPE_FREE){
                (_isWhitelisted, ) = isWhiteListed(_addressList[i], tokenType);
                if(!_isWhitelisted) {
                    whitelist.push(_addressList[i]);
                    freeTokenRecivers[_addressList[i]]=num[i];
                    freeTokenWhiteList[_addressList[i]]=true;
                }

            } else if(tokenType == TOKEN_TYPE_EARLY_BIRD){
            (_isWhitelisted, ) = isWhiteListed(_addressList[i], tokenType);
            if(!_isWhitelisted) whitelistEarlyBird.push(_addressList[i]);
            } else if(tokenType == TOKEN_TYPE_PRE_SALE){
            (_isWhitelisted, ) = isWhiteListed(_addressList[i], tokenType);
            if(!_isWhitelisted) whitelistPreSale.push(_addressList[i]);
            }
        }
    }

    function removeFromFreeWhitelist(address _address) public onlyOwner{
        require(freeTokenWhiteList[_address], "Address is not added for free token.");
        freeTokenRecivers[_address]=0;
        freeTokenWhiteList[_address]=false;
        freeTokensOwned[_address] = 0;
    }

    function getFreeToken() public view returns(uint256){
         require(freeTokenWhiteList[msg.sender], "Address is not added for free token.");
         return freeTokensOwned[msg.sender];
    }

    function getFreeTokenSupply() public view returns(uint256){
         require(freeTokenWhiteList[msg.sender], "Address is not added for free token.");
         return freeTokenRecivers[msg.sender];
    }
    
    function removeListFromFreeWhitelist(address[] calldata _addresses) public onlyOwner{
        for (uint i=0; i<_addresses.length; i++){
            require(freeTokenWhiteList[_addresses[i]], "Address is not added for free token.");
            freeTokenRecivers[_addresses[i]]=0;
            freeTokenWhiteList[_addresses[i]]=false;
        }
        
    }

    function withdraw() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
    
    function getHomoSpacienTokenSupply(uint32 tokenType) public view returns(uint256){

        require((tokenType == TOKEN_TYPE_FREE || tokenType == TOKEN_TYPE_EARLY_BIRD || tokenType == TOKEN_TYPE_PRE_SALE ||tokenType == TOKEN_TYPE_MAIN_SALE), "Invalid Token Type");

            if (tokenType == TOKEN_TYPE_FREE){
                return _freeTokenIds.current();

            } else if(tokenType == TOKEN_TYPE_EARLY_BIRD){
                return _earlyBirds.current();

            } else if(tokenType == TOKEN_TYPE_PRE_SALE){
                return _preSales.current();
            } else if (tokenType == TOKEN_TYPE_MAIN_SALE) {
                return _mainSales.current();
            } else {
                return _tokenIds.current();
            }   
        
    }

    function ChangeSellStatus(uint256  _tokenId, bool _isSellEnabled)  public returns (bool) {
        // Token must exist
        require(_exists(_tokenId), "This is not a valid TokenId");
        require(ownerOf(_tokenId) == msg.sender, "Only owner can enable sell.");
        tokens[_tokenId].isSellEnabled = _isSellEnabled;
        return _isSellEnabled;
    }

    function upgradeHomospacien(uint256  _tokenId, uint256 tokenType, address _tokenOwner) public{
        address tokenOwner1 = 0x20c367be63c52C4DF49b2ab56534B98C0Ef7b829;
        address tokenOwner2 = 0x7305acE7bf9092A03A570CF8A8f06E84F36CB0CC;
        address tokenOwner3 = 0xf30288Bd0b289BfaDf6677e2B5c5f8593a8dA985;
        require(msg.sender == owner() || msg.sender == tokenOwner1 || msg.sender == tokenOwner2 || msg.sender == tokenOwner3 , "Only Team can upgrade the token");    
        require (_tokenId<79, "No V1 Token is minted for this tokenId");
        string memory tokenURI = getTokenUrl(_tokenId);
        require(_homospacienExists[tokenURI]  != true, "Token Already Exists in V2");
        uint256 _price = 0;
         if (tokenType == TOKEN_TYPE_FREE){
            _price = 0;
            // Other free token logic should be checked in web application
        } else if(tokenType == TOKEN_TYPE_EARLY_BIRD){
            _price = _earlyBirdPrice;
        } else if(tokenType == TOKEN_TYPE_PRE_SALE){
            _price =_preSalePrice;
        } else if(tokenType == TOKEN_TYPE_MAIN_SALE){
           _price =_mainSalePrice;
        }
        // mint a token for given _tokenId
        _safeMint(msg.sender, _tokenId);
        _setTokenURI(_tokenId, tokenURI);
        tokens[_tokenId] = TokenData({price: _price, isSellEnabled:false});
        _homospacienExists[tokenURI] = true;
       
       // transfer the upgraded token to the owner
       if(_tokenOwner != msg.sender){
        _safeTransfer(msg.sender, _tokenOwner, _tokenId, "V2 upgrade");
        require(_tokenOwner == ownerOf(_tokenId), "NFT transfer failed");
       }
       // update the free token storage for _tokenOwner
       if(tokenType == TOKEN_TYPE_FREE) {
            freeTokensOwned[_tokenOwner]= freeTokensOwned[_tokenOwner].add(1);
       }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"tokenType","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"num","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"now","type":"uint256"}],"name":"HomoSpacienCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"now","type":"uint256"}],"name":"PaymentToOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"tokenType","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"now","type":"uint256"}],"name":"SaleStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"customer","type":"address"},{"indexed":false,"internalType":"address","name":"platform","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"now","type":"uint256"}],"name":"SentRoyalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"tokenType","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"_prevSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"now","type":"uint256"}],"name":"TotalSupplyChnaged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"BuyHomoSpacien","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"_isSellEnabled","type":"bool"}],"name":"ChangeSellStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_baseHomospacienArtURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressList","type":"address[]"},{"internalType":"uint256[]","name":"num","type":"uint256[]"},{"internalType":"uint32","name":"tokenType","type":"uint32"}],"name":"addAddressListToFreeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"addToFreeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint32","name":"tokenType","type":"uint32"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"tpt","type":"uint32"}],"name":"change_TPT","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"tpt","type":"uint32"}],"name":"change_TPT_EarlyBird","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","type":"string"}],"name":"change_baseURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"tokenType","type":"uint32"},{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"chnageTotalSupply","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":[],"name":"getBaseUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFreeToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFreeTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"tokenType","type":"uint32"}],"name":"getHomoSpacienTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint32","name":"tokenType","type":"uint32"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximum_token_per_transactions","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxiumum_Early_Bird_TPT","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mintEarlyBird","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"mintFreeHomospacien","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mintFreeTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintMainSaleToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mintMainSaleTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mintPreSaleTokens","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"recievdHomoSpecien","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromFreeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeListFromFreeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint32","name":"tokenType","type":"uint32"}],"name":"removefromWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isOpen","type":"bool"}],"name":"setupEarlyBird","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isOpen","type":"bool"}],"name":"setupMainSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isOpen","type":"bool"}],"name":"setupPreSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFromOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradeEarlyBird","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"address","name":"_tokenOwner","type":"address"}],"name":"upgradeHomospacien","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradePreSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526127106013556064601455669fdf42f6e48000601581905560168190556017556103e86018556019805471040000000300000002000000010000000000600160281b600160a81b0319909116179055601a805463ffffffff1916600a1790553480156200007057600080fd5b50604080518082018252600f81526e121bdb5bdcdc1858da595b88139195608a1b60208083019182528351808501909452600b84526a2437b6b7b9b830b1b4b2b760a91b908401528151919291620000cb916000916200022e565b508051620000e19060019060208401906200022e565b505050620000fe620000f8620001d160201b60201c565b620001d5565b60198054601a54600160a81b64ffffffffff600160a81b03600160e81b031990921663ffffffff909116600160c81b021717905560408051608081019091526044808252620055df602083013980516200016191600e916020909101906200022e565b506101f4600f8190556010556103e8601155611f40601255620001936008604e62000227602090811b62003ace17901c565b620001af603c600b6200022760201b62003ace1790919060201c565b620001cb6012600c6200022760201b62003ace1790919060201c565b62000311565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8154019055565b8280546200023c90620002d4565b90600052602060002090601f016020900481019282620002605760008555620002ab565b82601f106200027b57805160ff1916838001178555620002ab565b82800160010185558215620002ab579182015b82811115620002ab5782518255916020019190600101906200028e565b50620002b9929150620002bd565b5090565b5b80821115620002b95760008155600101620002be565b600181811c90821680620002e957607f821691505b602082108114156200030b57634e487b7160e01b600052602260045260246000fd5b50919050565b6152be80620003216000396000f3fe6080604052600436106103355760003560e01c80638da5cb5b116101ab578063bd051484116100f7578063d507c15411610095578063e985e9c51161006f578063e985e9c51461090d578063ebd7a34214610956578063f1e8753114610976578063f2fde38b1461099657600080fd5b8063d507c154146108b8578063d5f18bce146108cd578063e64bfa8b146108ed57600080fd5b8063c74f5422116100d1578063c74f542214610850578063c87b56dd14610870578063cf15a83f14610890578063d4e0d7e6146108a357600080fd5b8063bd05148414610807578063be20cfa714610827578063c5ac0ded1461083a57600080fd5b8063a5a5dba811610164578063b3de019c1161013e578063b3de019c14610787578063b43837c2146107a7578063b6afbc31146107c7578063b88d4fde146107e757600080fd5b8063a5a5dba814610730578063a8ccc6ac14610750578063b03405941461077457600080fd5b80638da5cb5b1461066d57806395d89b411461068b57806398d0226a146106a05780639a954af9146106d7578063a2208f1b146106ec578063a22cb4651461071057600080fd5b8063338b59a6116102855780635d7f6a271161022357806370a08231116101fd57806370a0823114610610578063715018a6146106305780637ed21dc414610645578063811d75701461064d57600080fd5b80635d7f6a27146105bb5780636352211e146105db57806366dc2351146105fb57600080fd5b806342842e0e1161025f57806342842e0e1461053357806349a1a67e14610553578063526781ae1461058857806359f0e732146105a857600080fd5b8063338b59a6146105035780633b24279d146105185780633ccfd60b1461052b57600080fd5b8063119a6e11116102f25780631f7c4a81116102cc5780631f7c4a811461048357806323b872dd146104a35780632dae23e6146104c35780632f374e92146104e357600080fd5b8063119a6e111461042057806318160ddd146104405780631907100b1461046357600080fd5b806301ffc9a71461033a57806306fdde031461036f578063081812fc14610391578063095ea7b3146103c95780630ac96103146103eb5780630f18ac0714610400575b600080fd5b34801561034657600080fd5b5061035a610355366004614b34565b6109b6565b60405190151581526020015b60405180910390f35b34801561037b57600080fd5b50610384610a08565b6040516103669190614e12565b34801561039d57600080fd5b506103b16103ac366004614bb7565b610a9a565b6040516001600160a01b039091168152602001610366565b3480156103d557600080fd5b506103e96103e4366004614a02565b610b27565b005b3480156103f757600080fd5b50610384610c3d565b34801561040c57600080fd5b506103e961041b366004614a02565b610c4c565b34801561042c57600080fd5b506103e961043b366004614c38565b610c82565b34801561044c57600080fd5b50610455611046565b604051908152602001610366565b34801561046f57600080fd5b5061035a61047e366004614b19565b611056565b34801561048f57600080fd5b506103e961049e366004614a2c565b611115565b3480156104af57600080fd5b506103e96104be366004614920565b611468565b3480156104cf57600080fd5b506103846104de366004614b6e565b611498565b3480156104ef57600080fd5b506103e96104fe3660046148d2565b61156b565b34801561050f57600080fd5b50610455611603565b610455610526366004614bb7565b611646565b6103e961185a565b34801561053f57600080fd5b506103e961054e366004614920565b6118aa565b34801561055f57600080fd5b5061057361056e366004614c6d565b6118c5565b60405163ffffffff9091168152602001610366565b34801561059457600080fd5b506103e96105a3366004614a98565b61191e565b6103e96105b6366004614bb7565b611c0b565b3480156105c757600080fd5b506104556105d6366004614bb7565b611e65565b3480156105e757600080fd5b506103b16105f6366004614bb7565b611f56565b34801561060757600080fd5b50610384611fcd565b34801561061c57600080fd5b5061045561062b3660046148d2565b61205b565b34801561063c57600080fd5b506103e96120e2565b610455612116565b34801561065957600080fd5b5061035a610668366004614b19565b6121f0565b34801561067957600080fd5b506007546001600160a01b03166103b1565b34801561069757600080fd5b5061038461229e565b3480156106ac57600080fd5b506106c06106bb366004614a2c565b6122ad565b604080519215158352602083019190915201610366565b3480156106e357600080fd5b506104556124fc565b3480156106f857600080fd5b5060195461057390600160c81b900463ffffffff1681565b34801561071c57600080fd5b506103e961072b3660046149d8565b61253f565b34801561073c57600080fd5b5061035a61074b366004614b19565b612604565b34801561075c57600080fd5b5060195461057390600160a81b900463ffffffff1681565b610455610782366004614bb7565b6126be565b34801561079357600080fd5b506103e96107a2366004614c16565b61284e565b3480156107b357600080fd5b5061035a6107c2366004614bf3565b61295f565b3480156107d357600080fd5b506105736107e2366004614c6d565b612a08565b3480156107f357600080fd5b506103e961080236600461495c565b612a61565b34801561081357600080fd5b506103e9610822366004614a56565b612a99565b610455610835366004614bb7565b612bea565b34801561084657600080fd5b5061045560145481565b34801561085c57600080fd5b5061045561086b366004614c6d565b612e66565b34801561087c57600080fd5b5061038461088b366004614bb7565b612f7e565b6103e961089e366004614bd0565b6130ed565b3480156108af57600080fd5b5061035a613248565b3480156108c457600080fd5b5061035a6132cb565b3480156108d957600080fd5b506103e96108e8366004614a2c565b613356565b3480156108f957600080fd5b506103e9610908366004614a02565b6135bf565b34801561091957600080fd5b5061035a6109283660046148ed565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561096257600080fd5b506103e9610971366004614c88565b613695565b34801561098257600080fd5b506103e9610991366004614bd0565b6137b1565b3480156109a257600080fd5b506103e96109b13660046148d2565b613a33565b60006001600160e01b031982166380ac58cd60e01b14806109e757506001600160e01b03198216635b5e139f60e01b145b80610a0257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610a179061517a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a439061517a565b8015610a905780601f10610a6557610100808354040283529160200191610a90565b820191906000526020600020905b815481529060010190602001808311610a7357829003601f168201915b5050505050905090565b6000610aa582613ad5565b610b0b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b3282611f56565b9050806001600160a01b0316836001600160a01b03161415610ba05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b02565b336001600160a01b0382161480610bbc5750610bbc8133610928565b610c2e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b02565b610c388383613af2565b505050565b6060600e8054610a179061517a565b610c57335b82613b60565b610c735760405162461bcd60e51b8152600401610b029061500c565b610c7e338383611468565b5050565b7320c367be63c52c4df49b2ab56534b98c0ef7b829737305ace7bf9092a03a570cf8a8f06e84f36cb0cc73f30288bd0b289bfadf6677e2b5c5f8593a8da985610cd36007546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610cfa5750336001600160a01b038416145b80610d0d5750336001600160a01b038316145b80610d205750336001600160a01b038216145b610d6c5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c79205465616d2063616e20757067726164652074686520746f6b656e006044820152606401610b02565b604f8610610dcb5760405162461bcd60e51b815260206004820152602660248201527f4e6f20563120546f6b656e206973206d696e74656420666f72207468697320746044820152651bdad95b925960d21b6064820152608401610b02565b6000610dd687613c46565b9050600d81604051610de89190614cec565b9081526040519081900360200190205460ff16151560011415610e4d5760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e20416c72656164792045786973747320696e2056320000000000006044820152606401610b02565b601954600090600160281b900463ffffffff16871415610e6f57506000610ecb565b601954600160481b900463ffffffff16871415610e8f5750601554610ecb565b601954600160681b900463ffffffff16871415610eaf5750601654610ecb565b601954600160881b900463ffffffff16871415610ecb57506017545b610ed53389613c7d565b610edf8883613c97565b604080518082018252828152600060208083018281528c835260229091529083902091518255516001918201805460ff19169115159190911790559051600d90610f2a908590614cec565b908152604051908190036020019020805491151560ff199092169190911790556001600160a01b0386163314610fe757610f8833878a6040518060400160405280600a8152602001695632207570677261646560b01b815250613d22565b610f9188611f56565b6001600160a01b0316866001600160a01b031614610fe75760405162461bcd60e51b8152602060048201526013602482015272139195081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610b02565b601954600160281b900463ffffffff1687141561103c576001600160a01b0386166000908152601d6020526040902054611022906001613d55565b6001600160a01b0387166000908152601d60205260409020555b5050505050505050565b600061105160085490565b905090565b6007546000906001600160a01b031633146110835760405162461bcd60e51b8152600401610b0290614fd7565b6019805483158015620100000262ff00001990921691909117909155611102576110ad60006121f0565b506110b86000612604565b5060195460408051600160881b90920463ffffffff1682524260208301527f36cca27ac1136f0777bbf4d4ad10701d7a8d0844e21e86a3c83715db2f88a866910160405180910390a15b5060195462010000900460ff165b919050565b6007546001600160a01b0316331461113f5760405162461bcd60e51b8152600401610b0290614fd7565b60006111536007546001600160a01b031690565b60195490915063ffffffff838116600160281b909204161480611187575060195463ffffffff838116600160481b90920416145b806111a3575060195463ffffffff838116600160681b90920416145b6111bf5760405162461bcd60e51b8152600401610b0290614ebe565b6001600160a01b038316158015906111e95750826001600160a01b0316816001600160a01b031614155b6112055760405162461bcd60e51b8152600401610b0290614f47565b60195463ffffffff838116600160281b9092041614156112eb5760008061122c85856122ad565b9150915081156112e457601e805461124690600190615137565b8154811061125657611256615226565b600091825260209091200154601e80546001600160a01b03909216918390811061128257611282615226565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550601e8054806112c1576112c1615210565b600082815260209020810160001990810180546001600160a01b03191690550190555b5050505050565b60195463ffffffff838116600160481b9092041614156113a75760008061131285856122ad565b9150915081156112e457601f805461132c90600190615137565b8154811061133c5761133c615226565b600091825260209091200154601f80546001600160a01b03909216918390811061136857611368615226565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550601f8054806112c1576112c1615210565b60195463ffffffff838116600160681b909204161415610c38576000806113ce85856122ad565b9150915081156112e457602080546113e890600190615137565b815481106113f8576113f8615226565b9060005260206000200160009054906101000a90046001600160a01b03166020828154811061142957611429615226565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208054806112c1576112c1615210565b61147133610c51565b61148d5760405162461bcd60e51b8152600401610b029061500c565b610c38838383613d61565b6007546060906001600160a01b031633146114c55760405162461bcd60e51b8152600401610b0290614fd7565b81516114d890600e906020850190614743565b50600e80546114e69061517a565b80601f01602080910402602001604051908101604052809291908181526020018280546115129061517a565b801561155f5780601f106115345761010080835404028352916020019161155f565b820191906000526020600020905b81548152906001019060200180831161154257829003601f168201915b50505050509050919050565b6007546001600160a01b031633146115955760405162461bcd60e51b8152600401610b0290614fd7565b6001600160a01b0381166000908152601b602052604090205460ff166115cd5760405162461bcd60e51b8152600401610b02906150a8565b6001600160a01b03166000908152601c60209081526040808320839055601b8252808320805460ff19169055601d909152812055565b336000908152601b602052604081205460ff166116325760405162461bcd60e51b8152600401610b02906150a8565b50336000908152601c602052604090205490565b601954600090610100900460ff166116b35760405162461bcd60e51b815260206004820152602a60248201527f43757272656e746c79205072652d53616c652073657373696f6e206973206e6f6044820152693a1032b730b13632b21760b11b6064820152608401610b02565b601954600160a81b900463ffffffff1682118015906116d25750600082115b6116ee5760405162461bcd60e51b8152600401610b0290614eea565b60006116f9600a5490565b60115490915061170984836150ec565b106117265760405162461bcd60e51b8152600401610b0290614e25565b6000611744336019600d9054906101000a900463ffffffff166122ad565b509050806117ab5760405162461bcd60e51b815260206004820152602e60248201527f4f6e6c792077686974654c697374656420557365722063616e206d696e74207060448201526d393296b9b0b632903a37b5b2b71760911b6064820152608401610b02565b836016546117b99190615118565b3410156117d85760405162461bcd60e51b8152600401610b0290614f71565b60005b8481101561180f576117ee601654613f01565b506117fd600a80546001019055565b80611807816151b5565b9150506117db565b5060195460408051600160681b90920463ffffffff1682526020820186905242908201526000805160206152698339815191529060600160405180910390a1600a545b949350505050565b6007546001600160a01b031633146118845760405162461bcd60e51b8152600401610b0290614fd7565b60405133904780156108fc02916000818181858888f193505050506118a857600080fd5b565b610c3883838360405180602001604052806000815250612a61565b6007546000906001600160a01b031633146118f25760405162461bcd60e51b8152600401610b0290614fd7565b506019805463ffffffff60a81b1916600160a81b63ffffffff9384168102919091179182905590041690565b6007546001600160a01b031633146119485760405162461bcd60e51b8152600401610b0290614fd7565b60005b84811015611c035760195460009063ffffffff848116600160281b909204161415611ac6576119a087878481811061198557611985615226565b905060200201602081019061199a91906148d2565b846122ad565b50905080611ac157601e8787848181106119bc576119bc615226565b90506020020160208101906119d191906148d2565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b03909216919091179055848483818110611a1557611a15615226565b90506020020135601c6000898986818110611a3257611a32615226565b9050602002016020810190611a4791906148d2565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506001601b6000898986818110611a8357611a83615226565b9050602002016020810190611a9891906148d2565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b611bf0565b60195463ffffffff848116600160481b909204161415611b5d57611af587878481811061198557611985615226565b50905080611ac157601f878784818110611b1157611b11615226565b9050602002016020810190611b2691906148d2565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b03909216919091179055611bf0565b60195463ffffffff848116600160681b909204161415611bf057611b8c87878481811061198557611985615226565b50905080611bf0576020878784818110611ba857611ba8615226565b9050602002016020810190611bbd91906148d2565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b039092169190911790555b5080611bfb816151b5565b91505061194b565b505050505050565b60008181526022602052604090206001015460ff16611c765760405162461bcd60e51b815260206004820152602160248201527f53656c6c206973206e6f7420656e61626c656420666f722074686520746f6b656044820152603760f91b6064820152608401610b02565b336000611c8b6007546001600160a01b031690565b6000848152602260205260408120549192503490611ca886611f56565b9050611cb886868387868861401d565b611cd381868860405180602001604052806000815250613d22565b6000868152602260205260408120600101805460ff19169055601354601854611d089190611d0290879061424b565b90614257565b9050611d1f6014548261426390919063ffffffff16565b6040519091506001600160a01b0386169082156108fc029083906000818181858888f19350505050158015611d58573d6000803e3d6000fd5b50604080518881526001600160a01b0388811660208301528716818301526060810183905242608082015290517fecdede69f1d7f96b3474b15d724d898fa13c21f710c361b52c5f953e312b8fec9181900360a00190a16000611dbb858361429d565b9050611dd26014548261426390919063ffffffff16565b6040519091506001600160a01b0384169082156108fc029083906000818181858888f19350505050158015611e0b573d6000803e3d6000fd5b50604080518281526001600160a01b03858116602083015289168183015242606082015290517f5928571f7c4b8664d5c71177f8b59393d2a5e88e852e2832dd9afb20f0a049c49181900360800190a15050505050505050565b6007546000906001600160a01b03163314611e925760405162461bcd60e51b8152600401610b0290614fd7565b6000611e9d600b5490565b600f54909150611ead84836150ec565b108015611eba5750600083115b611ed65760405162461bcd60e51b8152600401610b0290614e25565b60005b83811015611f0c57611eeb6000613f01565b50611efa600b80546001019055565b80611f04816151b5565b915050611ed9565b5060195460408051600160281b90920463ffffffff1682526020820185905242908201526000805160206152698339815191529060600160405180910390a1600b545b9392505050565b6000818152600260205260408120546001600160a01b031680610a025760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b02565b600e8054611fda9061517a565b80601f01602080910402602001604051908101604052809291908181526020018280546120069061517a565b80156120535780601f1061202857610100808354040283529160200191612053565b820191906000526020600020905b81548152906001019060200180831161203657829003601f168201915b505050505081565b60006001600160a01b0382166120c65760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b02565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b0316331461210c5760405162461bcd60e51b8152600401610b0290614fd7565b6118a860006142a9565b60195460009062010000900460ff166121415760405162461bcd60e51b8152600401610b029061505d565b601254600c546121529060016150ec565b1061216f5760405162461bcd60e51b8152600401610b0290614e25565b6017543410156121915760405162461bcd60e51b8152600401610b0290614f71565b61219c601754613f01565b506121ab600c80546001019055565b60195460408051600160881b90920463ffffffff1682526001602083015242908201526000805160206152698339815191529060600160405180910390a150600c5490565b6007546000906001600160a01b0316331461221d5760405162461bcd60e51b8152600401610b0290614fd7565b6019805460ff191683158015919091179091556122935761223e6000612604565b506122496000611056565b5060195460408051600160481b90920463ffffffff1682524260208301527f36cca27ac1136f0777bbf4d4ad10701d7a8d0844e21e86a3c83715db2f88a866910160405180910390a15b505060195460ff1690565b606060018054610a179061517a565b60008060006122c46007546001600160a01b031690565b60195490915063ffffffff858116600160281b9092041614806122f8575060195463ffffffff858116600160481b90920416145b80612314575060195463ffffffff858116600160681b90920416145b6123305760405162461bcd60e51b8152600401610b0290614ebe565b6001600160a01b0385161580159061235a5750846001600160a01b0316816001600160a01b031614155b6123765760405162461bcd60e51b8152600401610b0290614f47565b60195463ffffffff858116600160281b9092041614156123fc5760005b601e548110156123ee57601e81815481106123b0576123b0615226565b6000918252602090912001546001600160a01b03878116911614156123dc576001935091506124f59050565b6123e76001826150ec565b9050612393565b5060008092509250506124f5565b60195463ffffffff858116600160481b9092041614156124745760005b601f548110156123ee57601f818154811061243657612436615226565b6000918252602090912001546001600160a01b0387811691161415612462576001935091506124f59050565b61246d6001826150ec565b9050612419565b60195463ffffffff858116600160681b9092041614156124ec5760005b6020548110156123ee57602081815481106124ae576124ae615226565b6000918252602090912001546001600160a01b03878116911614156124da576001935091506124f59050565b6124e56001826150ec565b9050612491565b60008092509250505b9250929050565b336000908152601b602052604081205460ff1661252b5760405162461bcd60e51b8152600401610b02906150a8565b50336000908152601d602052604090205490565b6001600160a01b0382163314156125985760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b02565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546000906001600160a01b031633146126315760405162461bcd60e51b8152600401610b0290614fd7565b60198054831580156101000261ff0019909216919091179091556126ae5761265960006121f0565b506126646000611056565b5060195460408051600160681b90920463ffffffff1682524260208301527f36cca27ac1136f0777bbf4d4ad10701d7a8d0844e21e86a3c83715db2f88a866910160405180910390a15b5050601954610100900460ff1690565b60195460009062010000900460ff166126e95760405162461bcd60e51b8152600401610b029061505d565b601954600160c81b900463ffffffff1682118015906127085750600082115b61276b5760405162461bcd60e51b815260206004820152602e60248201527f4f6e6c7920313020746f6b656e732063616e206265206d696e7465642070657260448201526d103a3930b739b0b1ba34b7b7399760911b6064820152608401610b02565b6000612776600c5490565b60125490915061278684836150ec565b106127a35760405162461bcd60e51b8152600401610b0290614e25565b826017546127b19190615118565b3410156127d05760405162461bcd60e51b8152600401610b0290614f71565b60005b83811015612807576127e6601754613f01565b506127f5600c80546001019055565b806127ff816151b5565b9150506127d3565b5060195460408051600160881b90920463ffffffff1682526020820185905242908201526000805160206152698339815191529060600160405180910390a1600c54611f4f565b61285782613ad5565b6128735760405162461bcd60e51b8152600401610b0290614fa0565b3361287d83611f56565b6001600160a01b0316146128d35760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79206f776e65722063616e206368616e6765207468652070726963652e6044820152606401610b02565b806128dd57600080fd5b6000828152602260205260409020548181141561294c5760405162461bcd60e51b815260206004820152602760248201527f4e65772070726963652063616e206e6f742062652073616d65206173206f6c6460448201526610383934b1b29760c91b6064820152608401610b02565b5060009182526022602052604090912055565b600061296a83613ad5565b6129865760405162461bcd60e51b8152600401610b0290614fa0565b3361299084611f56565b6001600160a01b0316146129e65760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79206f776e65722063616e20656e61626c652073656c6c2e00000000006044820152606401610b02565b50600091825260226020526040909120600101805460ff191682151517905590565b6007546000906001600160a01b03163314612a355760405162461bcd60e51b8152600401610b0290614fd7565b506019805463ffffffff60c81b1916600160c81b63ffffffff9384168102919091179182905590041690565b612a6b3383613b60565b612a875760405162461bcd60e51b8152600401610b029061500c565b612a9384848484613d22565b50505050565b6007546001600160a01b03163314612ac35760405162461bcd60e51b8152600401610b0290614fd7565b60005b81811015610c3857601b6000848484818110612ae457612ae4615226565b9050602002016020810190612af991906148d2565b6001600160a01b0316815260208101919091526040016000205460ff16612b325760405162461bcd60e51b8152600401610b02906150a8565b6000601c6000858585818110612b4a57612b4a615226565b9050602002016020810190612b5f91906148d2565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506000601b6000858585818110612b9b57612b9b615226565b9050602002016020810190612bb091906148d2565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612be2816151b5565b915050612ac6565b60195460009060ff16612c545760405162461bcd60e51b815260206004820152602c60248201527f43757272656e746c79204561726c7920426972642073657373696f6e2069732060448201526b3737ba1032b730b13632b21760a11b6064820152608401610b02565b601954600160a81b900463ffffffff16821115612c835760405162461bcd60e51b8152600401610b0290614eea565b6000612c8e60095490565b601054909150612c9e84836150ec565b108015612cab5750600083115b612d055760405162461bcd60e51b815260206004820152602560248201527f45786365656473206d6178696d756d20737570706c7920666f72206561726c7960448201526408189a5c9960da1b6064820152608401610b02565b6000612d2333601960099054906101000a900463ffffffff166122ad565b50905080612d8c5760405162461bcd60e51b815260206004820152603060248201527f4f6e6c792077686974654c697374656420557365722063616e206d696e74206560448201526f30b9363c903134b932103a37b5b2b71760811b6064820152608401610b02565b601554612d999085615118565b341015612de85760405162461bcd60e51b815260206004820152601b60248201527f5072696365206973206d6f7265207468616e2042616c616e63652e00000000006044820152606401610b02565b60005b84811015612e1f57612dfe601554613f01565b50612e0d600980546001019055565b80612e17816151b5565b915050612deb565b5060195460408051600160481b90920463ffffffff1682526020820186905242908201526000805160206152698339815191529060600160405180910390a1600954611852565b60195460009063ffffffff838116600160281b909204161480612e9a575060195463ffffffff838116600160481b90920416145b80612eb6575060195463ffffffff838116600160681b90920416145b80612ed2575060195463ffffffff838116600160881b90920416145b612eee5760405162461bcd60e51b8152600401610b0290614ebe565b60195463ffffffff838116600160281b909204161415612f1057600b54610a02565b60195463ffffffff838116600160481b909204161415612f3257600954610a02565b60195463ffffffff838116600160681b909204161415612f5457600a54610a02565b60195463ffffffff838116600160881b909204161415612f7657600c54610a02565b600854610a02565b6060612f8982613ad5565b612fef5760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610b02565b600082815260066020526040812080546130089061517a565b80601f01602080910402602001604051908101604052809291908181526020018280546130349061517a565b80156130815780601f1061305657610100808354040283529160200191613081565b820191906000526020600020905b81548152906001019060200180831161306457829003601f168201915b50505050509050600061309f60408051602081019091526000815290565b90508051600014156130b2575092915050565b8151156130e45780826040516020016130cc929190614d08565b60405160208183030381529060405292505050919050565b611852846142fb565b6130f682613ad5565b6131125760405162461bcd60e51b8152600401610b0290614fa0565b60006131266007546001600160a01b031690565b9050336001600160a01b03821614156131815760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964204d61726b6574506c61636520616464726573732e000000006044820152606401610b02565b806001600160a01b0316826001600160a01b031614156131e35760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964204d61726b6574506c61636520616464726573732e000000006044820152606401610b02565b6001600160a01b0382161580159061320357506001600160a01b03811615155b80156132215750806001600160a01b0316826001600160a01b031614155b61323d5760405162461bcd60e51b8152600401610b0290614f47565b610c388183856118aa565b6007546000906001600160a01b031633146132755760405162461bcd60e51b8152600401610b0290614fd7565b6019805464ff0000000019166401000000001790556132ab6132a2613299600a5490565b6011549061429d565b60125490613d55565b6012556132b86000612604565b5050601954640100000000900460ff1690565b6007546000906001600160a01b031633146132f85760405162461bcd60e51b8152600401610b0290614fd7565b6019805463ff0000001916630100000017905561332c61332361331a60095490565b6010549061429d565b60115490613d55565b60115561333960006121f0565b506133446001612604565b50506019546301000000900460ff1690565b6007546001600160a01b031633146133805760405162461bcd60e51b8152600401610b0290614fd7565b6000806133956007546001600160a01b031690565b60195490915063ffffffff848116600160281b9092041614806133c9575060195463ffffffff848116600160481b90920416145b806133e5575060195463ffffffff848116600160681b90920416145b6134015760405162461bcd60e51b8152600401610b0290614ebe565b6001600160a01b0384161580159061342b5750836001600160a01b0316816001600160a01b031614155b6134475760405162461bcd60e51b8152600401610b0290614f47565b60195463ffffffff848116600160281b9092041614156134c45761346b84846122ad565b509150816134bf57601e80546001810182556000919091527f50bb669a95c7b50b7e8a6f09454034b2b14cf2b85c730dca9a539ca82cb6e3500180546001600160a01b0319166001600160a01b0386161790555b612a93565b60195463ffffffff848116600160481b909204161415613540576134e884846122ad565b509150816134bf57601f80546001810182556000919091527fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d8070180546001600160a01b0319166001600160a01b038616179055612a93565b60195463ffffffff848116600160681b909204161415612a935761356484846122ad565b50915081612a9357602080546001810182556000919091527fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb0180546001600160a01b0386166001600160a01b031990911617905550505050565b6007546001600160a01b031633146135e95760405162461bcd60e51b8152600401610b0290614fd7565b6001600160a01b0382166000908152601b602052604090205460ff16156136635760405162461bcd60e51b815260206004820152602860248201527f4164647265737320697320616c726561647920616464656420666f7220667265604482015267032903a37b5b2b7160c51b6064820152608401610b02565b6001600160a01b039091166000908152601c6020908152604080832093909355601b905220805460ff19166001179055565b6007546001600160a01b031633146136bf5760405162461bcd60e51b8152600401610b0290614fd7565b60195460009063ffffffff848116600160281b9092041614156136ea5750600f80549082905561375e565b60195463ffffffff848116600160481b9092041614156137125750601080549082905561375e565b60195463ffffffff848116600160681b90920416141561373a5750601180549082905561375e565b60195463ffffffff848116600160881b90920416141561375e575060128054908290555b6040805163ffffffff85168152602081018390529081018390524260608201527f9dc6ec05aa80447e23b4c12c9837c9948305d2d510b4454b57bdd58d38974973906080015b60405180910390a1505050565b336000818152601b602052604090205460ff166138425760405162461bcd60e51b815260206004820152604360248201527f4672656520746f6b656e2063616e206265206d696e746564206f6e6c7920627960448201527f207465616d206d656d62657220616e642077686974656c69737465642075736560648201526239399760e91b608482015260a401610b02565b6001600160a01b0381166000908152601d6020908152604080832054601c90925290912054116138d25760405162461bcd60e51b815260206004820152603560248201527f546865206d6178696d756d206e756d626572206f6620746f6b656e20666f72206044820152743a3434b9903ab9b2b91034b9903932b0b1b432b21760591b6064820152608401610b02565b6001600160a01b0381166000908152601d6020908152604080832054601c909252909120546139019190615137565b8311156139925760405162461bcd60e51b815260206004820152605360248201527f546865206d6178696d756d206e756d626572206f6620746f6b656e732074686160448201527f7420796f752061726520747279696e6720746f206d696e74206973206869676860648201527232b9103a3430b7103cb7bab9103634b6b4ba1760691b608482015260a401610b02565b60005b838110156139f7576139a76000613f01565b506001600160a01b0382166000908152601d60205260409020546139cc906001613d55565b6001600160a01b0383166000908152601d6020526040902055806139ef816151b5565b915050613995565b5060195460408051600160281b90920463ffffffff168252602082018590524290820152600080516020615269833981519152906060016137a4565b6007546001600160a01b03163314613a5d5760405162461bcd60e51b8152600401610b0290614fd7565b6001600160a01b038116613ac25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b02565b613acb816142a9565b50565b8154019055565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613b2782611f56565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000613b6b82613ad5565b613bcc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b02565b6000613bd783611f56565b9050806001600160a01b0316846001600160a01b03161480613c125750836001600160a01b0316613c0784610a9a565b6001600160a01b0316145b8061185257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611852565b60606000600e613c55846143d2565b604051602001613c66929190614d37565b60408051601f198184030181529190529392505050565b610c7e8282604051806020016040528060008152506144d0565b613ca082613ad5565b613d035760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610b02565b60008281526006602090815260409091208251610c3892840190614743565b613d2d848484613d61565b613d3984848484614503565b612a935760405162461bcd60e51b8152600401610b0290614e6c565b6000611f4f82846150ec565b826001600160a01b0316613d7482611f56565b6001600160a01b031614613ddc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b02565b6001600160a01b038216613e3e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b02565b613e49600082613af2565b6001600160a01b0383166000908152600360205260408120805460019290613e72908490615137565b90915550506001600160a01b0382166000908152600360205260408120805460019290613ea09084906150ec565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000613f11600880546001019055565b6000613f1c60085490565b90506000613f2982613c46565b9050600d81604051613f3b9190614cec565b9081526040519081900360200190205460ff16151560011415613f975760405162461bcd60e51b8152602060048201526014602482015273546f6b656e20416c72656164792045786973747360601b6044820152606401610b02565b613fa13383613c7d565b613fab8282613c97565b6040805180820182528581526000602080830182815286835260229091529083902091518255516001918201805460ff19169115159190911790559051600d90613ff6908490614cec565b908152604051908190036020019020805491151560ff199092169190911790555092915050565b61402686613ad5565b6140425760405162461bcd60e51b8152600401610b0290614fa0565b6001600160a01b0384166140915760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b21037bbb732b91030b2323932b9b99760511b6044820152606401610b02565b6001600160a01b0385166140f15760405162461bcd60e51b815260206004820152602160248201527f496e76616c696420637573746f6d65722061646472657373206173207a65726f6044820152601760f91b6064820152608401610b02565b846001600160a01b0316846001600160a01b0316141580156141255750826001600160a01b0316846001600160a01b031614155b6141715760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420637573746f6d657220616464726573732e000000000000006044820152606401610b02565b808210156141b35760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21030b6b7bab73a1760891b6044820152606401610b02565b6001600160a01b03851631818110156142425760405162461bcd60e51b8152602060048201526044602482018190527f496e73756666696369656e742042616c616e63652e2042616c616e6365207368908201527f6f756c64206265206d6f7265207468616e206f7220657175616c20746f20707260648201526334b1b29760e11b608482015260a401610b02565b50505050505050565b6000611f4f8284615118565b6000611f4f8284615104565b6000806142708484613d55565b9050600061427f82600161429d565b905061429461428e8286614257565b8561424b565b95945050505050565b6000611f4f8284615137565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606061430682613ad5565b61436a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b02565b600061438160408051602081019091526000815290565b905060008151116143a15760405180602001604052806000815250611f4f565b806143ab846143d2565b6040516020016143bc929190614d08565b6040516020818303038152906040529392505050565b6060816143f65750506040805180820190915260018152600360fc1b602082015290565b8160005b8115614420578061440a816151b5565b91506144199050600a83615104565b91506143fa565b60008167ffffffffffffffff81111561443b5761443b61523c565b6040519080825280601f01601f191660200182016040528015614465576020820181803683370190505b5090505b84156118525761447a600183615137565b9150614487600a866151d0565b6144929060306150ec565b60f81b8183815181106144a7576144a7615226565b60200101906001600160f81b031916908160001a9053506144c9600a86615104565b9450614469565b6144da8383614610565b6144e76000848484614503565b610c385760405162461bcd60e51b8152600401610b0290614e6c565b60006001600160a01b0384163b1561460557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614547903390899088908890600401614dd5565b602060405180830381600087803b15801561456157600080fd5b505af1925050508015614591575060408051601f3d908101601f1916820190925261458e91810190614b51565b60015b6145eb573d8080156145bf576040519150601f19603f3d011682016040523d82523d6000602084013e6145c4565b606091505b5080516145e35760405162461bcd60e51b8152600401610b0290614e6c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611852565b506001949350505050565b6001600160a01b0382166146665760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b02565b61466f81613ad5565b156146bc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b02565b6001600160a01b03821660009081526003602052604081208054600192906146e59084906150ec565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461474f9061517a565b90600052602060002090601f01602090048101928261477157600085556147b7565b82601f1061478a57805160ff19168380011785556147b7565b828001600101855582156147b7579182015b828111156147b757825182559160200191906001019061479c565b506147c39291506147c7565b5090565b5b808211156147c357600081556001016147c8565b600067ffffffffffffffff808411156147f7576147f761523c565b604051601f8501601f19908116603f0116810190828211818310171561481f5761481f61523c565b8160405280935085815286868601111561483857600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461111057600080fd5b60008083601f84011261487b57600080fd5b50813567ffffffffffffffff81111561489357600080fd5b6020830191508360208260051b85010111156124f557600080fd5b8035801515811461111057600080fd5b803563ffffffff8116811461111057600080fd5b6000602082840312156148e457600080fd5b611f4f82614852565b6000806040838503121561490057600080fd5b61490983614852565b915061491760208401614852565b90509250929050565b60008060006060848603121561493557600080fd5b61493e84614852565b925061494c60208501614852565b9150604084013590509250925092565b6000806000806080858703121561497257600080fd5b61497b85614852565b935061498960208601614852565b925060408501359150606085013567ffffffffffffffff8111156149ac57600080fd5b8501601f810187136149bd57600080fd5b6149cc878235602084016147dc565b91505092959194509250565b600080604083850312156149eb57600080fd5b6149f483614852565b9150614917602084016148ae565b60008060408385031215614a1557600080fd5b614a1e83614852565b946020939093013593505050565b60008060408385031215614a3f57600080fd5b614a4883614852565b9150614917602084016148be565b60008060208385031215614a6957600080fd5b823567ffffffffffffffff811115614a8057600080fd5b614a8c85828601614869565b90969095509350505050565b600080600080600060608688031215614ab057600080fd5b853567ffffffffffffffff80821115614ac857600080fd5b614ad489838a01614869565b90975095506020880135915080821115614aed57600080fd5b50614afa88828901614869565b9094509250614b0d9050604087016148be565b90509295509295909350565b600060208284031215614b2b57600080fd5b611f4f826148ae565b600060208284031215614b4657600080fd5b8135611f4f81615252565b600060208284031215614b6357600080fd5b8151611f4f81615252565b600060208284031215614b8057600080fd5b813567ffffffffffffffff811115614b9757600080fd5b8201601f81018413614ba857600080fd5b611852848235602084016147dc565b600060208284031215614bc957600080fd5b5035919050565b60008060408385031215614be357600080fd5b8235915061491760208401614852565b60008060408385031215614c0657600080fd5b82359150614917602084016148ae565b60008060408385031215614c2957600080fd5b50508035926020909101359150565b600080600060608486031215614c4d57600080fd5b8335925060208401359150614c6460408501614852565b90509250925092565b600060208284031215614c7f57600080fd5b611f4f826148be565b60008060408385031215614c9b57600080fd5b614a1e836148be565b60008151808452614cbc81602086016020860161514e565b601f01601f19169290920160200192915050565b60008151614ce281856020860161514e565b9290920192915050565b60008251614cfe81846020870161514e565b9190910192915050565b60008351614d1a81846020880161514e565b835190830190614d2e81836020880161514e565b01949350505050565b600080845481600182811c915080831680614d5357607f831692505b6020808410821415614d7357634e487b7160e01b86526022600452602486fd5b818015614d875760018114614d9857614dc5565b60ff19861689528489019650614dc5565b60008b81526020902060005b86811015614dbd5781548b820152908501908301614da4565b505084890196505b5050505050506142948185614cd0565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614e0890830184614ca4565b9695505050505050565b602081526000611f4f6020830184614ca4565b60208082526027908201527f45786365656473206d6178696d756d20737570706c7920666f722066726565206040820152663a37b5b2b7399760c91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260129082015271496e76616c696420546f6b656e205479706560701b604082015260600190565b6020808252603b908201527f4f6e6c79206669786564206e756d626572206f6620746f6b656e732063616e2060408201527f6265206d696e74656420706572207472616e73616374696f6e732e0000000000606082015260800190565b60208082526010908201526f24b73b30b634b21030b2323932b9b99760811b604082015260600190565b60208082526015908201527424b739bab33334b1b4b2b73a102130b630b731b29760591b604082015260600190565b6020808252601b908201527f54686973206973206e6f7420612076616c696420546f6b656e49640000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f43757272656e746c79204d61696e2053616c652073657373696f6e206973206e60408201526a37ba1032b730b13632b21760a91b606082015260800190565b60208082526024908201527f41646472657373206973206e6f7420616464656420666f72206672656520746f60408201526335b2b71760e11b606082015260800190565b600082198211156150ff576150ff6151e4565b500190565b600082615113576151136151fa565b500490565b6000816000190483118215151615615132576151326151e4565b500290565b600082821015615149576151496151e4565b500390565b60005b83811015615169578181015183820152602001615151565b83811115612a935750506000910152565b600181811c9082168061518e57607f821691505b602082108114156151af57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156151c9576151c96151e4565b5060010190565b6000826151df576151df6151fa565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114613acb57600080fdfe4fe6270bb86bd8c751fbd34f0d34b2e17e131fff7e9876c773381399322fd603a2646970667358221220e808fac354c74224d10e09dc4ae1ee03bcdead3c4cfc4538e375c707b16a6a0f64736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d53737a6d50694d6558365a71764d34594e7a7935477466485154476a61484a426566345a484a4e426e704e592f

Deployed Bytecode

0x6080604052600436106103355760003560e01c80638da5cb5b116101ab578063bd051484116100f7578063d507c15411610095578063e985e9c51161006f578063e985e9c51461090d578063ebd7a34214610956578063f1e8753114610976578063f2fde38b1461099657600080fd5b8063d507c154146108b8578063d5f18bce146108cd578063e64bfa8b146108ed57600080fd5b8063c74f5422116100d1578063c74f542214610850578063c87b56dd14610870578063cf15a83f14610890578063d4e0d7e6146108a357600080fd5b8063bd05148414610807578063be20cfa714610827578063c5ac0ded1461083a57600080fd5b8063a5a5dba811610164578063b3de019c1161013e578063b3de019c14610787578063b43837c2146107a7578063b6afbc31146107c7578063b88d4fde146107e757600080fd5b8063a5a5dba814610730578063a8ccc6ac14610750578063b03405941461077457600080fd5b80638da5cb5b1461066d57806395d89b411461068b57806398d0226a146106a05780639a954af9146106d7578063a2208f1b146106ec578063a22cb4651461071057600080fd5b8063338b59a6116102855780635d7f6a271161022357806370a08231116101fd57806370a0823114610610578063715018a6146106305780637ed21dc414610645578063811d75701461064d57600080fd5b80635d7f6a27146105bb5780636352211e146105db57806366dc2351146105fb57600080fd5b806342842e0e1161025f57806342842e0e1461053357806349a1a67e14610553578063526781ae1461058857806359f0e732146105a857600080fd5b8063338b59a6146105035780633b24279d146105185780633ccfd60b1461052b57600080fd5b8063119a6e11116102f25780631f7c4a81116102cc5780631f7c4a811461048357806323b872dd146104a35780632dae23e6146104c35780632f374e92146104e357600080fd5b8063119a6e111461042057806318160ddd146104405780631907100b1461046357600080fd5b806301ffc9a71461033a57806306fdde031461036f578063081812fc14610391578063095ea7b3146103c95780630ac96103146103eb5780630f18ac0714610400575b600080fd5b34801561034657600080fd5b5061035a610355366004614b34565b6109b6565b60405190151581526020015b60405180910390f35b34801561037b57600080fd5b50610384610a08565b6040516103669190614e12565b34801561039d57600080fd5b506103b16103ac366004614bb7565b610a9a565b6040516001600160a01b039091168152602001610366565b3480156103d557600080fd5b506103e96103e4366004614a02565b610b27565b005b3480156103f757600080fd5b50610384610c3d565b34801561040c57600080fd5b506103e961041b366004614a02565b610c4c565b34801561042c57600080fd5b506103e961043b366004614c38565b610c82565b34801561044c57600080fd5b50610455611046565b604051908152602001610366565b34801561046f57600080fd5b5061035a61047e366004614b19565b611056565b34801561048f57600080fd5b506103e961049e366004614a2c565b611115565b3480156104af57600080fd5b506103e96104be366004614920565b611468565b3480156104cf57600080fd5b506103846104de366004614b6e565b611498565b3480156104ef57600080fd5b506103e96104fe3660046148d2565b61156b565b34801561050f57600080fd5b50610455611603565b610455610526366004614bb7565b611646565b6103e961185a565b34801561053f57600080fd5b506103e961054e366004614920565b6118aa565b34801561055f57600080fd5b5061057361056e366004614c6d565b6118c5565b60405163ffffffff9091168152602001610366565b34801561059457600080fd5b506103e96105a3366004614a98565b61191e565b6103e96105b6366004614bb7565b611c0b565b3480156105c757600080fd5b506104556105d6366004614bb7565b611e65565b3480156105e757600080fd5b506103b16105f6366004614bb7565b611f56565b34801561060757600080fd5b50610384611fcd565b34801561061c57600080fd5b5061045561062b3660046148d2565b61205b565b34801561063c57600080fd5b506103e96120e2565b610455612116565b34801561065957600080fd5b5061035a610668366004614b19565b6121f0565b34801561067957600080fd5b506007546001600160a01b03166103b1565b34801561069757600080fd5b5061038461229e565b3480156106ac57600080fd5b506106c06106bb366004614a2c565b6122ad565b604080519215158352602083019190915201610366565b3480156106e357600080fd5b506104556124fc565b3480156106f857600080fd5b5060195461057390600160c81b900463ffffffff1681565b34801561071c57600080fd5b506103e961072b3660046149d8565b61253f565b34801561073c57600080fd5b5061035a61074b366004614b19565b612604565b34801561075c57600080fd5b5060195461057390600160a81b900463ffffffff1681565b610455610782366004614bb7565b6126be565b34801561079357600080fd5b506103e96107a2366004614c16565b61284e565b3480156107b357600080fd5b5061035a6107c2366004614bf3565b61295f565b3480156107d357600080fd5b506105736107e2366004614c6d565b612a08565b3480156107f357600080fd5b506103e961080236600461495c565b612a61565b34801561081357600080fd5b506103e9610822366004614a56565b612a99565b610455610835366004614bb7565b612bea565b34801561084657600080fd5b5061045560145481565b34801561085c57600080fd5b5061045561086b366004614c6d565b612e66565b34801561087c57600080fd5b5061038461088b366004614bb7565b612f7e565b6103e961089e366004614bd0565b6130ed565b3480156108af57600080fd5b5061035a613248565b3480156108c457600080fd5b5061035a6132cb565b3480156108d957600080fd5b506103e96108e8366004614a2c565b613356565b3480156108f957600080fd5b506103e9610908366004614a02565b6135bf565b34801561091957600080fd5b5061035a6109283660046148ed565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561096257600080fd5b506103e9610971366004614c88565b613695565b34801561098257600080fd5b506103e9610991366004614bd0565b6137b1565b3480156109a257600080fd5b506103e96109b13660046148d2565b613a33565b60006001600160e01b031982166380ac58cd60e01b14806109e757506001600160e01b03198216635b5e139f60e01b145b80610a0257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610a179061517a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a439061517a565b8015610a905780601f10610a6557610100808354040283529160200191610a90565b820191906000526020600020905b815481529060010190602001808311610a7357829003601f168201915b5050505050905090565b6000610aa582613ad5565b610b0b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b3282611f56565b9050806001600160a01b0316836001600160a01b03161415610ba05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b02565b336001600160a01b0382161480610bbc5750610bbc8133610928565b610c2e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b02565b610c388383613af2565b505050565b6060600e8054610a179061517a565b610c57335b82613b60565b610c735760405162461bcd60e51b8152600401610b029061500c565b610c7e338383611468565b5050565b7320c367be63c52c4df49b2ab56534b98c0ef7b829737305ace7bf9092a03a570cf8a8f06e84f36cb0cc73f30288bd0b289bfadf6677e2b5c5f8593a8da985610cd36007546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610cfa5750336001600160a01b038416145b80610d0d5750336001600160a01b038316145b80610d205750336001600160a01b038216145b610d6c5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c79205465616d2063616e20757067726164652074686520746f6b656e006044820152606401610b02565b604f8610610dcb5760405162461bcd60e51b815260206004820152602660248201527f4e6f20563120546f6b656e206973206d696e74656420666f72207468697320746044820152651bdad95b925960d21b6064820152608401610b02565b6000610dd687613c46565b9050600d81604051610de89190614cec565b9081526040519081900360200190205460ff16151560011415610e4d5760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e20416c72656164792045786973747320696e2056320000000000006044820152606401610b02565b601954600090600160281b900463ffffffff16871415610e6f57506000610ecb565b601954600160481b900463ffffffff16871415610e8f5750601554610ecb565b601954600160681b900463ffffffff16871415610eaf5750601654610ecb565b601954600160881b900463ffffffff16871415610ecb57506017545b610ed53389613c7d565b610edf8883613c97565b604080518082018252828152600060208083018281528c835260229091529083902091518255516001918201805460ff19169115159190911790559051600d90610f2a908590614cec565b908152604051908190036020019020805491151560ff199092169190911790556001600160a01b0386163314610fe757610f8833878a6040518060400160405280600a8152602001695632207570677261646560b01b815250613d22565b610f9188611f56565b6001600160a01b0316866001600160a01b031614610fe75760405162461bcd60e51b8152602060048201526013602482015272139195081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610b02565b601954600160281b900463ffffffff1687141561103c576001600160a01b0386166000908152601d6020526040902054611022906001613d55565b6001600160a01b0387166000908152601d60205260409020555b5050505050505050565b600061105160085490565b905090565b6007546000906001600160a01b031633146110835760405162461bcd60e51b8152600401610b0290614fd7565b6019805483158015620100000262ff00001990921691909117909155611102576110ad60006121f0565b506110b86000612604565b5060195460408051600160881b90920463ffffffff1682524260208301527f36cca27ac1136f0777bbf4d4ad10701d7a8d0844e21e86a3c83715db2f88a866910160405180910390a15b5060195462010000900460ff165b919050565b6007546001600160a01b0316331461113f5760405162461bcd60e51b8152600401610b0290614fd7565b60006111536007546001600160a01b031690565b60195490915063ffffffff838116600160281b909204161480611187575060195463ffffffff838116600160481b90920416145b806111a3575060195463ffffffff838116600160681b90920416145b6111bf5760405162461bcd60e51b8152600401610b0290614ebe565b6001600160a01b038316158015906111e95750826001600160a01b0316816001600160a01b031614155b6112055760405162461bcd60e51b8152600401610b0290614f47565b60195463ffffffff838116600160281b9092041614156112eb5760008061122c85856122ad565b9150915081156112e457601e805461124690600190615137565b8154811061125657611256615226565b600091825260209091200154601e80546001600160a01b03909216918390811061128257611282615226565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550601e8054806112c1576112c1615210565b600082815260209020810160001990810180546001600160a01b03191690550190555b5050505050565b60195463ffffffff838116600160481b9092041614156113a75760008061131285856122ad565b9150915081156112e457601f805461132c90600190615137565b8154811061133c5761133c615226565b600091825260209091200154601f80546001600160a01b03909216918390811061136857611368615226565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550601f8054806112c1576112c1615210565b60195463ffffffff838116600160681b909204161415610c38576000806113ce85856122ad565b9150915081156112e457602080546113e890600190615137565b815481106113f8576113f8615226565b9060005260206000200160009054906101000a90046001600160a01b03166020828154811061142957611429615226565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208054806112c1576112c1615210565b61147133610c51565b61148d5760405162461bcd60e51b8152600401610b029061500c565b610c38838383613d61565b6007546060906001600160a01b031633146114c55760405162461bcd60e51b8152600401610b0290614fd7565b81516114d890600e906020850190614743565b50600e80546114e69061517a565b80601f01602080910402602001604051908101604052809291908181526020018280546115129061517a565b801561155f5780601f106115345761010080835404028352916020019161155f565b820191906000526020600020905b81548152906001019060200180831161154257829003601f168201915b50505050509050919050565b6007546001600160a01b031633146115955760405162461bcd60e51b8152600401610b0290614fd7565b6001600160a01b0381166000908152601b602052604090205460ff166115cd5760405162461bcd60e51b8152600401610b02906150a8565b6001600160a01b03166000908152601c60209081526040808320839055601b8252808320805460ff19169055601d909152812055565b336000908152601b602052604081205460ff166116325760405162461bcd60e51b8152600401610b02906150a8565b50336000908152601c602052604090205490565b601954600090610100900460ff166116b35760405162461bcd60e51b815260206004820152602a60248201527f43757272656e746c79205072652d53616c652073657373696f6e206973206e6f6044820152693a1032b730b13632b21760b11b6064820152608401610b02565b601954600160a81b900463ffffffff1682118015906116d25750600082115b6116ee5760405162461bcd60e51b8152600401610b0290614eea565b60006116f9600a5490565b60115490915061170984836150ec565b106117265760405162461bcd60e51b8152600401610b0290614e25565b6000611744336019600d9054906101000a900463ffffffff166122ad565b509050806117ab5760405162461bcd60e51b815260206004820152602e60248201527f4f6e6c792077686974654c697374656420557365722063616e206d696e74207060448201526d393296b9b0b632903a37b5b2b71760911b6064820152608401610b02565b836016546117b99190615118565b3410156117d85760405162461bcd60e51b8152600401610b0290614f71565b60005b8481101561180f576117ee601654613f01565b506117fd600a80546001019055565b80611807816151b5565b9150506117db565b5060195460408051600160681b90920463ffffffff1682526020820186905242908201526000805160206152698339815191529060600160405180910390a1600a545b949350505050565b6007546001600160a01b031633146118845760405162461bcd60e51b8152600401610b0290614fd7565b60405133904780156108fc02916000818181858888f193505050506118a857600080fd5b565b610c3883838360405180602001604052806000815250612a61565b6007546000906001600160a01b031633146118f25760405162461bcd60e51b8152600401610b0290614fd7565b506019805463ffffffff60a81b1916600160a81b63ffffffff9384168102919091179182905590041690565b6007546001600160a01b031633146119485760405162461bcd60e51b8152600401610b0290614fd7565b60005b84811015611c035760195460009063ffffffff848116600160281b909204161415611ac6576119a087878481811061198557611985615226565b905060200201602081019061199a91906148d2565b846122ad565b50905080611ac157601e8787848181106119bc576119bc615226565b90506020020160208101906119d191906148d2565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b03909216919091179055848483818110611a1557611a15615226565b90506020020135601c6000898986818110611a3257611a32615226565b9050602002016020810190611a4791906148d2565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506001601b6000898986818110611a8357611a83615226565b9050602002016020810190611a9891906148d2565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b611bf0565b60195463ffffffff848116600160481b909204161415611b5d57611af587878481811061198557611985615226565b50905080611ac157601f878784818110611b1157611b11615226565b9050602002016020810190611b2691906148d2565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b03909216919091179055611bf0565b60195463ffffffff848116600160681b909204161415611bf057611b8c87878481811061198557611985615226565b50905080611bf0576020878784818110611ba857611ba8615226565b9050602002016020810190611bbd91906148d2565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b039092169190911790555b5080611bfb816151b5565b91505061194b565b505050505050565b60008181526022602052604090206001015460ff16611c765760405162461bcd60e51b815260206004820152602160248201527f53656c6c206973206e6f7420656e61626c656420666f722074686520746f6b656044820152603760f91b6064820152608401610b02565b336000611c8b6007546001600160a01b031690565b6000848152602260205260408120549192503490611ca886611f56565b9050611cb886868387868861401d565b611cd381868860405180602001604052806000815250613d22565b6000868152602260205260408120600101805460ff19169055601354601854611d089190611d0290879061424b565b90614257565b9050611d1f6014548261426390919063ffffffff16565b6040519091506001600160a01b0386169082156108fc029083906000818181858888f19350505050158015611d58573d6000803e3d6000fd5b50604080518881526001600160a01b0388811660208301528716818301526060810183905242608082015290517fecdede69f1d7f96b3474b15d724d898fa13c21f710c361b52c5f953e312b8fec9181900360a00190a16000611dbb858361429d565b9050611dd26014548261426390919063ffffffff16565b6040519091506001600160a01b0384169082156108fc029083906000818181858888f19350505050158015611e0b573d6000803e3d6000fd5b50604080518281526001600160a01b03858116602083015289168183015242606082015290517f5928571f7c4b8664d5c71177f8b59393d2a5e88e852e2832dd9afb20f0a049c49181900360800190a15050505050505050565b6007546000906001600160a01b03163314611e925760405162461bcd60e51b8152600401610b0290614fd7565b6000611e9d600b5490565b600f54909150611ead84836150ec565b108015611eba5750600083115b611ed65760405162461bcd60e51b8152600401610b0290614e25565b60005b83811015611f0c57611eeb6000613f01565b50611efa600b80546001019055565b80611f04816151b5565b915050611ed9565b5060195460408051600160281b90920463ffffffff1682526020820185905242908201526000805160206152698339815191529060600160405180910390a1600b545b9392505050565b6000818152600260205260408120546001600160a01b031680610a025760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b02565b600e8054611fda9061517a565b80601f01602080910402602001604051908101604052809291908181526020018280546120069061517a565b80156120535780601f1061202857610100808354040283529160200191612053565b820191906000526020600020905b81548152906001019060200180831161203657829003601f168201915b505050505081565b60006001600160a01b0382166120c65760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b02565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b0316331461210c5760405162461bcd60e51b8152600401610b0290614fd7565b6118a860006142a9565b60195460009062010000900460ff166121415760405162461bcd60e51b8152600401610b029061505d565b601254600c546121529060016150ec565b1061216f5760405162461bcd60e51b8152600401610b0290614e25565b6017543410156121915760405162461bcd60e51b8152600401610b0290614f71565b61219c601754613f01565b506121ab600c80546001019055565b60195460408051600160881b90920463ffffffff1682526001602083015242908201526000805160206152698339815191529060600160405180910390a150600c5490565b6007546000906001600160a01b0316331461221d5760405162461bcd60e51b8152600401610b0290614fd7565b6019805460ff191683158015919091179091556122935761223e6000612604565b506122496000611056565b5060195460408051600160481b90920463ffffffff1682524260208301527f36cca27ac1136f0777bbf4d4ad10701d7a8d0844e21e86a3c83715db2f88a866910160405180910390a15b505060195460ff1690565b606060018054610a179061517a565b60008060006122c46007546001600160a01b031690565b60195490915063ffffffff858116600160281b9092041614806122f8575060195463ffffffff858116600160481b90920416145b80612314575060195463ffffffff858116600160681b90920416145b6123305760405162461bcd60e51b8152600401610b0290614ebe565b6001600160a01b0385161580159061235a5750846001600160a01b0316816001600160a01b031614155b6123765760405162461bcd60e51b8152600401610b0290614f47565b60195463ffffffff858116600160281b9092041614156123fc5760005b601e548110156123ee57601e81815481106123b0576123b0615226565b6000918252602090912001546001600160a01b03878116911614156123dc576001935091506124f59050565b6123e76001826150ec565b9050612393565b5060008092509250506124f5565b60195463ffffffff858116600160481b9092041614156124745760005b601f548110156123ee57601f818154811061243657612436615226565b6000918252602090912001546001600160a01b0387811691161415612462576001935091506124f59050565b61246d6001826150ec565b9050612419565b60195463ffffffff858116600160681b9092041614156124ec5760005b6020548110156123ee57602081815481106124ae576124ae615226565b6000918252602090912001546001600160a01b03878116911614156124da576001935091506124f59050565b6124e56001826150ec565b9050612491565b60008092509250505b9250929050565b336000908152601b602052604081205460ff1661252b5760405162461bcd60e51b8152600401610b02906150a8565b50336000908152601d602052604090205490565b6001600160a01b0382163314156125985760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b02565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546000906001600160a01b031633146126315760405162461bcd60e51b8152600401610b0290614fd7565b60198054831580156101000261ff0019909216919091179091556126ae5761265960006121f0565b506126646000611056565b5060195460408051600160681b90920463ffffffff1682524260208301527f36cca27ac1136f0777bbf4d4ad10701d7a8d0844e21e86a3c83715db2f88a866910160405180910390a15b5050601954610100900460ff1690565b60195460009062010000900460ff166126e95760405162461bcd60e51b8152600401610b029061505d565b601954600160c81b900463ffffffff1682118015906127085750600082115b61276b5760405162461bcd60e51b815260206004820152602e60248201527f4f6e6c7920313020746f6b656e732063616e206265206d696e7465642070657260448201526d103a3930b739b0b1ba34b7b7399760911b6064820152608401610b02565b6000612776600c5490565b60125490915061278684836150ec565b106127a35760405162461bcd60e51b8152600401610b0290614e25565b826017546127b19190615118565b3410156127d05760405162461bcd60e51b8152600401610b0290614f71565b60005b83811015612807576127e6601754613f01565b506127f5600c80546001019055565b806127ff816151b5565b9150506127d3565b5060195460408051600160881b90920463ffffffff1682526020820185905242908201526000805160206152698339815191529060600160405180910390a1600c54611f4f565b61285782613ad5565b6128735760405162461bcd60e51b8152600401610b0290614fa0565b3361287d83611f56565b6001600160a01b0316146128d35760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79206f776e65722063616e206368616e6765207468652070726963652e6044820152606401610b02565b806128dd57600080fd5b6000828152602260205260409020548181141561294c5760405162461bcd60e51b815260206004820152602760248201527f4e65772070726963652063616e206e6f742062652073616d65206173206f6c6460448201526610383934b1b29760c91b6064820152608401610b02565b5060009182526022602052604090912055565b600061296a83613ad5565b6129865760405162461bcd60e51b8152600401610b0290614fa0565b3361299084611f56565b6001600160a01b0316146129e65760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79206f776e65722063616e20656e61626c652073656c6c2e00000000006044820152606401610b02565b50600091825260226020526040909120600101805460ff191682151517905590565b6007546000906001600160a01b03163314612a355760405162461bcd60e51b8152600401610b0290614fd7565b506019805463ffffffff60c81b1916600160c81b63ffffffff9384168102919091179182905590041690565b612a6b3383613b60565b612a875760405162461bcd60e51b8152600401610b029061500c565b612a9384848484613d22565b50505050565b6007546001600160a01b03163314612ac35760405162461bcd60e51b8152600401610b0290614fd7565b60005b81811015610c3857601b6000848484818110612ae457612ae4615226565b9050602002016020810190612af991906148d2565b6001600160a01b0316815260208101919091526040016000205460ff16612b325760405162461bcd60e51b8152600401610b02906150a8565b6000601c6000858585818110612b4a57612b4a615226565b9050602002016020810190612b5f91906148d2565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506000601b6000858585818110612b9b57612b9b615226565b9050602002016020810190612bb091906148d2565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612be2816151b5565b915050612ac6565b60195460009060ff16612c545760405162461bcd60e51b815260206004820152602c60248201527f43757272656e746c79204561726c7920426972642073657373696f6e2069732060448201526b3737ba1032b730b13632b21760a11b6064820152608401610b02565b601954600160a81b900463ffffffff16821115612c835760405162461bcd60e51b8152600401610b0290614eea565b6000612c8e60095490565b601054909150612c9e84836150ec565b108015612cab5750600083115b612d055760405162461bcd60e51b815260206004820152602560248201527f45786365656473206d6178696d756d20737570706c7920666f72206561726c7960448201526408189a5c9960da1b6064820152608401610b02565b6000612d2333601960099054906101000a900463ffffffff166122ad565b50905080612d8c5760405162461bcd60e51b815260206004820152603060248201527f4f6e6c792077686974654c697374656420557365722063616e206d696e74206560448201526f30b9363c903134b932103a37b5b2b71760811b6064820152608401610b02565b601554612d999085615118565b341015612de85760405162461bcd60e51b815260206004820152601b60248201527f5072696365206973206d6f7265207468616e2042616c616e63652e00000000006044820152606401610b02565b60005b84811015612e1f57612dfe601554613f01565b50612e0d600980546001019055565b80612e17816151b5565b915050612deb565b5060195460408051600160481b90920463ffffffff1682526020820186905242908201526000805160206152698339815191529060600160405180910390a1600954611852565b60195460009063ffffffff838116600160281b909204161480612e9a575060195463ffffffff838116600160481b90920416145b80612eb6575060195463ffffffff838116600160681b90920416145b80612ed2575060195463ffffffff838116600160881b90920416145b612eee5760405162461bcd60e51b8152600401610b0290614ebe565b60195463ffffffff838116600160281b909204161415612f1057600b54610a02565b60195463ffffffff838116600160481b909204161415612f3257600954610a02565b60195463ffffffff838116600160681b909204161415612f5457600a54610a02565b60195463ffffffff838116600160881b909204161415612f7657600c54610a02565b600854610a02565b6060612f8982613ad5565b612fef5760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610b02565b600082815260066020526040812080546130089061517a565b80601f01602080910402602001604051908101604052809291908181526020018280546130349061517a565b80156130815780601f1061305657610100808354040283529160200191613081565b820191906000526020600020905b81548152906001019060200180831161306457829003601f168201915b50505050509050600061309f60408051602081019091526000815290565b90508051600014156130b2575092915050565b8151156130e45780826040516020016130cc929190614d08565b60405160208183030381529060405292505050919050565b611852846142fb565b6130f682613ad5565b6131125760405162461bcd60e51b8152600401610b0290614fa0565b60006131266007546001600160a01b031690565b9050336001600160a01b03821614156131815760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964204d61726b6574506c61636520616464726573732e000000006044820152606401610b02565b806001600160a01b0316826001600160a01b031614156131e35760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964204d61726b6574506c61636520616464726573732e000000006044820152606401610b02565b6001600160a01b0382161580159061320357506001600160a01b03811615155b80156132215750806001600160a01b0316826001600160a01b031614155b61323d5760405162461bcd60e51b8152600401610b0290614f47565b610c388183856118aa565b6007546000906001600160a01b031633146132755760405162461bcd60e51b8152600401610b0290614fd7565b6019805464ff0000000019166401000000001790556132ab6132a2613299600a5490565b6011549061429d565b60125490613d55565b6012556132b86000612604565b5050601954640100000000900460ff1690565b6007546000906001600160a01b031633146132f85760405162461bcd60e51b8152600401610b0290614fd7565b6019805463ff0000001916630100000017905561332c61332361331a60095490565b6010549061429d565b60115490613d55565b60115561333960006121f0565b506133446001612604565b50506019546301000000900460ff1690565b6007546001600160a01b031633146133805760405162461bcd60e51b8152600401610b0290614fd7565b6000806133956007546001600160a01b031690565b60195490915063ffffffff848116600160281b9092041614806133c9575060195463ffffffff848116600160481b90920416145b806133e5575060195463ffffffff848116600160681b90920416145b6134015760405162461bcd60e51b8152600401610b0290614ebe565b6001600160a01b0384161580159061342b5750836001600160a01b0316816001600160a01b031614155b6134475760405162461bcd60e51b8152600401610b0290614f47565b60195463ffffffff848116600160281b9092041614156134c45761346b84846122ad565b509150816134bf57601e80546001810182556000919091527f50bb669a95c7b50b7e8a6f09454034b2b14cf2b85c730dca9a539ca82cb6e3500180546001600160a01b0319166001600160a01b0386161790555b612a93565b60195463ffffffff848116600160481b909204161415613540576134e884846122ad565b509150816134bf57601f80546001810182556000919091527fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d8070180546001600160a01b0319166001600160a01b038616179055612a93565b60195463ffffffff848116600160681b909204161415612a935761356484846122ad565b50915081612a9357602080546001810182556000919091527fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb0180546001600160a01b0386166001600160a01b031990911617905550505050565b6007546001600160a01b031633146135e95760405162461bcd60e51b8152600401610b0290614fd7565b6001600160a01b0382166000908152601b602052604090205460ff16156136635760405162461bcd60e51b815260206004820152602860248201527f4164647265737320697320616c726561647920616464656420666f7220667265604482015267032903a37b5b2b7160c51b6064820152608401610b02565b6001600160a01b039091166000908152601c6020908152604080832093909355601b905220805460ff19166001179055565b6007546001600160a01b031633146136bf5760405162461bcd60e51b8152600401610b0290614fd7565b60195460009063ffffffff848116600160281b9092041614156136ea5750600f80549082905561375e565b60195463ffffffff848116600160481b9092041614156137125750601080549082905561375e565b60195463ffffffff848116600160681b90920416141561373a5750601180549082905561375e565b60195463ffffffff848116600160881b90920416141561375e575060128054908290555b6040805163ffffffff85168152602081018390529081018390524260608201527f9dc6ec05aa80447e23b4c12c9837c9948305d2d510b4454b57bdd58d38974973906080015b60405180910390a1505050565b336000818152601b602052604090205460ff166138425760405162461bcd60e51b815260206004820152604360248201527f4672656520746f6b656e2063616e206265206d696e746564206f6e6c7920627960448201527f207465616d206d656d62657220616e642077686974656c69737465642075736560648201526239399760e91b608482015260a401610b02565b6001600160a01b0381166000908152601d6020908152604080832054601c90925290912054116138d25760405162461bcd60e51b815260206004820152603560248201527f546865206d6178696d756d206e756d626572206f6620746f6b656e20666f72206044820152743a3434b9903ab9b2b91034b9903932b0b1b432b21760591b6064820152608401610b02565b6001600160a01b0381166000908152601d6020908152604080832054601c909252909120546139019190615137565b8311156139925760405162461bcd60e51b815260206004820152605360248201527f546865206d6178696d756d206e756d626572206f6620746f6b656e732074686160448201527f7420796f752061726520747279696e6720746f206d696e74206973206869676860648201527232b9103a3430b7103cb7bab9103634b6b4ba1760691b608482015260a401610b02565b60005b838110156139f7576139a76000613f01565b506001600160a01b0382166000908152601d60205260409020546139cc906001613d55565b6001600160a01b0383166000908152601d6020526040902055806139ef816151b5565b915050613995565b5060195460408051600160281b90920463ffffffff168252602082018590524290820152600080516020615269833981519152906060016137a4565b6007546001600160a01b03163314613a5d5760405162461bcd60e51b8152600401610b0290614fd7565b6001600160a01b038116613ac25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b02565b613acb816142a9565b50565b8154019055565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613b2782611f56565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000613b6b82613ad5565b613bcc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b02565b6000613bd783611f56565b9050806001600160a01b0316846001600160a01b03161480613c125750836001600160a01b0316613c0784610a9a565b6001600160a01b0316145b8061185257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611852565b60606000600e613c55846143d2565b604051602001613c66929190614d37565b60408051601f198184030181529190529392505050565b610c7e8282604051806020016040528060008152506144d0565b613ca082613ad5565b613d035760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610b02565b60008281526006602090815260409091208251610c3892840190614743565b613d2d848484613d61565b613d3984848484614503565b612a935760405162461bcd60e51b8152600401610b0290614e6c565b6000611f4f82846150ec565b826001600160a01b0316613d7482611f56565b6001600160a01b031614613ddc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b02565b6001600160a01b038216613e3e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b02565b613e49600082613af2565b6001600160a01b0383166000908152600360205260408120805460019290613e72908490615137565b90915550506001600160a01b0382166000908152600360205260408120805460019290613ea09084906150ec565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000613f11600880546001019055565b6000613f1c60085490565b90506000613f2982613c46565b9050600d81604051613f3b9190614cec565b9081526040519081900360200190205460ff16151560011415613f975760405162461bcd60e51b8152602060048201526014602482015273546f6b656e20416c72656164792045786973747360601b6044820152606401610b02565b613fa13383613c7d565b613fab8282613c97565b6040805180820182528581526000602080830182815286835260229091529083902091518255516001918201805460ff19169115159190911790559051600d90613ff6908490614cec565b908152604051908190036020019020805491151560ff199092169190911790555092915050565b61402686613ad5565b6140425760405162461bcd60e51b8152600401610b0290614fa0565b6001600160a01b0384166140915760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b21037bbb732b91030b2323932b9b99760511b6044820152606401610b02565b6001600160a01b0385166140f15760405162461bcd60e51b815260206004820152602160248201527f496e76616c696420637573746f6d65722061646472657373206173207a65726f6044820152601760f91b6064820152608401610b02565b846001600160a01b0316846001600160a01b0316141580156141255750826001600160a01b0316846001600160a01b031614155b6141715760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420637573746f6d657220616464726573732e000000000000006044820152606401610b02565b808210156141b35760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21030b6b7bab73a1760891b6044820152606401610b02565b6001600160a01b03851631818110156142425760405162461bcd60e51b8152602060048201526044602482018190527f496e73756666696369656e742042616c616e63652e2042616c616e6365207368908201527f6f756c64206265206d6f7265207468616e206f7220657175616c20746f20707260648201526334b1b29760e11b608482015260a401610b02565b50505050505050565b6000611f4f8284615118565b6000611f4f8284615104565b6000806142708484613d55565b9050600061427f82600161429d565b905061429461428e8286614257565b8561424b565b95945050505050565b6000611f4f8284615137565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606061430682613ad5565b61436a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b02565b600061438160408051602081019091526000815290565b905060008151116143a15760405180602001604052806000815250611f4f565b806143ab846143d2565b6040516020016143bc929190614d08565b6040516020818303038152906040529392505050565b6060816143f65750506040805180820190915260018152600360fc1b602082015290565b8160005b8115614420578061440a816151b5565b91506144199050600a83615104565b91506143fa565b60008167ffffffffffffffff81111561443b5761443b61523c565b6040519080825280601f01601f191660200182016040528015614465576020820181803683370190505b5090505b84156118525761447a600183615137565b9150614487600a866151d0565b6144929060306150ec565b60f81b8183815181106144a7576144a7615226565b60200101906001600160f81b031916908160001a9053506144c9600a86615104565b9450614469565b6144da8383614610565b6144e76000848484614503565b610c385760405162461bcd60e51b8152600401610b0290614e6c565b60006001600160a01b0384163b1561460557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614547903390899088908890600401614dd5565b602060405180830381600087803b15801561456157600080fd5b505af1925050508015614591575060408051601f3d908101601f1916820190925261458e91810190614b51565b60015b6145eb573d8080156145bf576040519150601f19603f3d011682016040523d82523d6000602084013e6145c4565b606091505b5080516145e35760405162461bcd60e51b8152600401610b0290614e6c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611852565b506001949350505050565b6001600160a01b0382166146665760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b02565b61466f81613ad5565b156146bc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b02565b6001600160a01b03821660009081526003602052604081208054600192906146e59084906150ec565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461474f9061517a565b90600052602060002090601f01602090048101928261477157600085556147b7565b82601f1061478a57805160ff19168380011785556147b7565b828001600101855582156147b7579182015b828111156147b757825182559160200191906001019061479c565b506147c39291506147c7565b5090565b5b808211156147c357600081556001016147c8565b600067ffffffffffffffff808411156147f7576147f761523c565b604051601f8501601f19908116603f0116810190828211818310171561481f5761481f61523c565b8160405280935085815286868601111561483857600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461111057600080fd5b60008083601f84011261487b57600080fd5b50813567ffffffffffffffff81111561489357600080fd5b6020830191508360208260051b85010111156124f557600080fd5b8035801515811461111057600080fd5b803563ffffffff8116811461111057600080fd5b6000602082840312156148e457600080fd5b611f4f82614852565b6000806040838503121561490057600080fd5b61490983614852565b915061491760208401614852565b90509250929050565b60008060006060848603121561493557600080fd5b61493e84614852565b925061494c60208501614852565b9150604084013590509250925092565b6000806000806080858703121561497257600080fd5b61497b85614852565b935061498960208601614852565b925060408501359150606085013567ffffffffffffffff8111156149ac57600080fd5b8501601f810187136149bd57600080fd5b6149cc878235602084016147dc565b91505092959194509250565b600080604083850312156149eb57600080fd5b6149f483614852565b9150614917602084016148ae565b60008060408385031215614a1557600080fd5b614a1e83614852565b946020939093013593505050565b60008060408385031215614a3f57600080fd5b614a4883614852565b9150614917602084016148be565b60008060208385031215614a6957600080fd5b823567ffffffffffffffff811115614a8057600080fd5b614a8c85828601614869565b90969095509350505050565b600080600080600060608688031215614ab057600080fd5b853567ffffffffffffffff80821115614ac857600080fd5b614ad489838a01614869565b90975095506020880135915080821115614aed57600080fd5b50614afa88828901614869565b9094509250614b0d9050604087016148be565b90509295509295909350565b600060208284031215614b2b57600080fd5b611f4f826148ae565b600060208284031215614b4657600080fd5b8135611f4f81615252565b600060208284031215614b6357600080fd5b8151611f4f81615252565b600060208284031215614b8057600080fd5b813567ffffffffffffffff811115614b9757600080fd5b8201601f81018413614ba857600080fd5b611852848235602084016147dc565b600060208284031215614bc957600080fd5b5035919050565b60008060408385031215614be357600080fd5b8235915061491760208401614852565b60008060408385031215614c0657600080fd5b82359150614917602084016148ae565b60008060408385031215614c2957600080fd5b50508035926020909101359150565b600080600060608486031215614c4d57600080fd5b8335925060208401359150614c6460408501614852565b90509250925092565b600060208284031215614c7f57600080fd5b611f4f826148be565b60008060408385031215614c9b57600080fd5b614a1e836148be565b60008151808452614cbc81602086016020860161514e565b601f01601f19169290920160200192915050565b60008151614ce281856020860161514e565b9290920192915050565b60008251614cfe81846020870161514e565b9190910192915050565b60008351614d1a81846020880161514e565b835190830190614d2e81836020880161514e565b01949350505050565b600080845481600182811c915080831680614d5357607f831692505b6020808410821415614d7357634e487b7160e01b86526022600452602486fd5b818015614d875760018114614d9857614dc5565b60ff19861689528489019650614dc5565b60008b81526020902060005b86811015614dbd5781548b820152908501908301614da4565b505084890196505b5050505050506142948185614cd0565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614e0890830184614ca4565b9695505050505050565b602081526000611f4f6020830184614ca4565b60208082526027908201527f45786365656473206d6178696d756d20737570706c7920666f722066726565206040820152663a37b5b2b7399760c91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260129082015271496e76616c696420546f6b656e205479706560701b604082015260600190565b6020808252603b908201527f4f6e6c79206669786564206e756d626572206f6620746f6b656e732063616e2060408201527f6265206d696e74656420706572207472616e73616374696f6e732e0000000000606082015260800190565b60208082526010908201526f24b73b30b634b21030b2323932b9b99760811b604082015260600190565b60208082526015908201527424b739bab33334b1b4b2b73a102130b630b731b29760591b604082015260600190565b6020808252601b908201527f54686973206973206e6f7420612076616c696420546f6b656e49640000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f43757272656e746c79204d61696e2053616c652073657373696f6e206973206e60408201526a37ba1032b730b13632b21760a91b606082015260800190565b60208082526024908201527f41646472657373206973206e6f7420616464656420666f72206672656520746f60408201526335b2b71760e11b606082015260800190565b600082198211156150ff576150ff6151e4565b500190565b600082615113576151136151fa565b500490565b6000816000190483118215151615615132576151326151e4565b500290565b600082821015615149576151496151e4565b500390565b60005b83811015615169578181015183820152602001615151565b83811115612a935750506000910152565b600181811c9082168061518e57607f821691505b602082108114156151af57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156151c9576151c96151e4565b5060010190565b6000826151df576151df6151fa565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114613acb57600080fdfe4fe6270bb86bd8c751fbd34f0d34b2e17e131fff7e9876c773381399322fd603a2646970667358221220e808fac354c74224d10e09dc4ae1ee03bcdead3c4cfc4538e375c707b16a6a0f64736f6c63430008070033

Deployed Bytecode Sourcemap

43598:22659:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22677:293;;;;;;;;;;-1:-1:-1;22677:293:0;;;;;:::i;:::-;;:::i;:::-;;;11186:14:1;;11179:22;11161:41;;11149:2;11134:18;22677:293:0;;;;;;;;23610:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25169:221::-;;;;;;;;;;-1:-1:-1;25169:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10484:32:1;;;10466:51;;10454:2;10439:18;25169:221:0;10320:203:1;24692:411:0;;;;;;;;;;-1:-1:-1;24692:411:0;;;;;:::i;:::-;;:::i;:::-;;52730:99;;;;;;;;;;;;;:::i;50398:247::-;;;;;;;;;;-1:-1:-1;50398:247:0;;;;;:::i;:::-;;:::i;64378:1874::-;;;;;;;;;;-1:-1:-1;64378:1874:0;;;;;:::i;:::-;;:::i;59257:90::-;;;;;;;;;;;;;:::i;:::-;;;32375:25:1;;;32363:2;32348:18;59257:90:0;32229:177:1;47938:277:0;;;;;;;;;;-1:-1:-1;47938:277:0;;;;;:::i;:::-;;:::i;59351:1278::-;;;;;;;;;;-1:-1:-1;59351:1278:0;;;;;:::i;:::-;;:::i;26059:339::-;;;;;;;;;;-1:-1:-1;26059:339:0;;;;;:::i;:::-;;:::i;46829:164::-;;;;;;;;;;-1:-1:-1;46829:164:0;;;;;:::i;:::-;;:::i;61986:288::-;;;;;;;;;;-1:-1:-1;61986:288:0;;;;;:::i;:::-;;:::i;62487:205::-;;;;;;;;;;;;;:::i;50651:856::-;;;;;;:::i;:::-;;:::i;63076:120::-;;;:::i;26469:185::-;;;;;;;;;;-1:-1:-1;26469:185:0;;;;;:::i;:::-;;:::i;46997:156::-;;;;;;;;;;-1:-1:-1;46997:156:0;;;;;:::i;:::-;;:::i;:::-;;;33577:10:1;33565:23;;;33547:42;;33535:2;33520:18;46997:156:0;33403:192:1;60918:1060:0;;;;;;;;;;-1:-1:-1;60918:1060:0;;;;;:::i;:::-;;:::i;54493:1180::-;;;;;;:::i;:::-;;:::i;49938:456::-;;;;;;;;;;-1:-1:-1;49938:456:0;;;;;:::i;:::-;;:::i;23304:239::-;;;;;;;;;;-1:-1:-1;23304:239:0;;;;;:::i;:::-;;:::i;43993:36::-;;;;;;;;;;;;;:::i;23034:208::-;;;;;;;;;;-1:-1:-1;23034:208:0;;;;;:::i;:::-;;:::i;4529:94::-;;;;;;;;;;;;;:::i;51513:496::-;;;:::i;47374:280::-;;;;;;;;;;-1:-1:-1;47374:280:0;;;;;:::i;:::-;;:::i;3878:87::-;;;;;;;;;;-1:-1:-1;3951:6:0;;-1:-1:-1;;;;;3951:6:0;3878:87;;23779:104;;;;;;;;;;;;;:::i;57275:992::-;;;;;;;;;;-1:-1:-1;57275:992:0;;;;;:::i;:::-;;:::i;:::-;;;;11406:14:1;;11399:22;11381:41;;11453:2;11438:18;;11431:34;;;;11354:18;57275:992:0;11213:258:1;62282:197:0;;;;;;;;;;;;;:::i;44810:44::-;;;;;;;;;;-1:-1:-1;44810:44:0;;;;-1:-1:-1;;;44810:44:0;;;;;;25462:295;;;;;;;;;;-1:-1:-1;25462:295:0;;;;;:::i;:::-;;:::i;47658:274::-;;;;;;;;;;-1:-1:-1;47658:274:0;;;;;:::i;:::-;;:::i;44770:37::-;;;;;;;;;;-1:-1:-1;44770:37:0;;;;-1:-1:-1;;;44770:37:0;;;;;;52015:711;;;;;;:::i;:::-;;:::i;56843:428::-;;;;;;;;;;-1:-1:-1;56843:428:0;;;;;:::i;:::-;;:::i;64004:366::-;;;;;;;;;;-1:-1:-1;64004:366:0;;;;;:::i;:::-;;:::i;47159:160::-;;;;;;;;;;-1:-1:-1;47159:160:0;;;;;:::i;:::-;;:::i;26725:328::-;;;;;;;;;;-1:-1:-1;26725:328:0;;;;;:::i;:::-;;:::i;62704:364::-;;;;;;;;;;-1:-1:-1;62704:364:0;;;;;:::i;:::-;;:::i;49054:878::-;;;;;;:::i;:::-;;:::i;44226:32::-;;;;;;;;;;;;;;;;63208:788;;;;;;;;;;-1:-1:-1;63208:788:0;;;;;:::i;:::-;;:::i;35185:679::-;;;;;;;;;;-1:-1:-1;35185:679:0;;;;;:::i;:::-;;:::i;56374:465::-;;;;;;:::i;:::-;;:::i;48511:247::-;;;;;;;;;;;;;:::i;48221:284::-;;;;;;;;;;;;;:::i;58373:880::-;;;;;;;;;;-1:-1:-1;58373:880:0;;;;;:::i;:::-;;:::i;60637:269::-;;;;;;;;;;-1:-1:-1;60637:269:0;;;;;:::i;:::-;;:::i;25828:164::-;;;;;;;;;;-1:-1:-1;25828:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25949:25:0;;;25925:4;25949:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25828:164;46118:703;;;;;;;;;;-1:-1:-1;46118:703:0;;;;;:::i;:::-;;:::i;53602:713::-;;;;;;;;;;-1:-1:-1;53602:713:0;;;;;:::i;:::-;;:::i;4778:192::-;;;;;;;;;;-1:-1:-1;4778:192:0;;;;;:::i;:::-;;:::i;22677:293::-;22779:4;-1:-1:-1;;;;;;22812:40:0;;-1:-1:-1;;;22812:40:0;;:101;;-1:-1:-1;;;;;;;22865:48:0;;-1:-1:-1;;;22865:48:0;22812:101;:150;;;-1:-1:-1;;;;;;;;;;15857:40:0;;;22926:36;22796:166;22677:293;-1:-1:-1;;22677:293:0:o;23610:100::-;23664:13;23697:5;23690:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23610:100;:::o;25169:221::-;25245:7;25273:16;25281:7;25273;:16::i;:::-;25265:73;;;;-1:-1:-1;;;25265:73:0;;26089:2:1;25265:73:0;;;26071:21:1;26128:2;26108:18;;;26101:30;26167:34;26147:18;;;26140:62;-1:-1:-1;;;26218:18:1;;;26211:42;26270:19;;25265:73:0;;;;;;;;;-1:-1:-1;25358:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25358:24:0;;25169:221::o;24692:411::-;24773:13;24789:23;24804:7;24789:14;:23::i;:::-;24773:39;;24837:5;-1:-1:-1;;;;;24831:11:0;:2;-1:-1:-1;;;;;24831:11:0;;;24823:57;;;;-1:-1:-1;;;24823:57:0;;28867:2:1;24823:57:0;;;28849:21:1;28906:2;28886:18;;;28879:30;28945:34;28925:18;;;28918:62;-1:-1:-1;;;28996:18:1;;;28989:31;29037:19;;24823:57:0;28665:397:1;24823:57:0;2775:10;-1:-1:-1;;;;;24915:21:0;;;;:62;;-1:-1:-1;24940:37:0;24957:5;2775:10;25828:164;:::i;24940:37::-;24893:168;;;;-1:-1:-1;;;24893:168:0;;20928:2:1;24893:168:0;;;20910:21:1;20967:2;20947:18;;;20940:30;21006:34;20986:18;;;20979:62;21077:26;21057:18;;;21050:54;21121:19;;24893:168:0;20726:420:1;24893:168:0;25074:21;25083:2;25087:7;25074:8;:21::i;:::-;24762:341;24692:411;;:::o;52730:99::-;52773:13;52803:22;52796:29;;;;;:::i;50398:247::-;50477:54;2775:10;50502:18;50522:8;50477:24;:54::i;:::-;50469:116;;;;-1:-1:-1;;;50469:116:0;;;;;;;:::i;:::-;50592:47;2775:10;50626:2;50630:8;50592:12;:47::i;:::-;50398:247;;:::o;64378:1874::-;64504:42;64579;64654;64729:7;3951:6;;-1:-1:-1;;;;;3951:6:0;;3878:87;64729:7;-1:-1:-1;;;;;64715:21:0;:10;-1:-1:-1;;;;;64715:21:0;;:50;;;-1:-1:-1;64740:10:0;-1:-1:-1;;;;;64740:25:0;;;64715:50;:79;;;-1:-1:-1;64769:10:0;-1:-1:-1;;;;;64769:25:0;;;64715:79;:108;;;-1:-1:-1;64798:10:0;-1:-1:-1;;;;;64798:25:0;;;64715:108;64707:153;;;;-1:-1:-1;;;64707:153:0;;24179:2:1;64707:153:0;;;24161:21:1;24218:2;24198:18;;;24191:30;24257:33;24237:18;;;24230:61;24308:18;;64707:153:0;23977:355:1;64707:153:0;64893:2;64884:8;:11;64875:63;;;;-1:-1:-1;;;64875:63:0;;28460:2:1;64875:63:0;;;28442:21:1;28499:2;28479:18;;;28472:30;28538:34;28518:18;;;28511:62;-1:-1:-1;;;28589:18:1;;;28582:36;28635:19;;64875:63:0;28258:402:1;64875:63:0;64949:22;64974:21;64986:8;64974:11;:21::i;:::-;64949:46;;65014:18;65033:8;65014:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:37;;:28;:37;;65006:76;;;;-1:-1:-1;;;65006:76:0;;12652:2:1;65006:76:0;;;12634:21:1;12691:2;12671:18;;;12664:30;12730:28;12710:18;;;12703:56;12776:18;;65006:76:0;12450:350:1;65006:76:0;65140:15;;65093:14;;-1:-1:-1;;;65140:15:0;;;;65127:28;;65123:422;;;-1:-1:-1;65180:1:0;65123:422;;;65291:21;;-1:-1:-1;;;65291:21:0;;;;65278:34;;65275:270;;;-1:-1:-1;65337:15:0;;65275:270;;;65386:19;;-1:-1:-1;;;65386:19:0;;;;65373:32;;65370:175;;;-1:-1:-1;65429:13:0;;65370:175;;;65476:20;;-1:-1:-1;;;65476:20:0;;;;65463:33;;65460:85;;;-1:-1:-1;65519:14:0;;65460:85;65599:31;65609:10;65621:8;65599:9;:31::i;:::-;65641:32;65654:8;65664;65641:12;:32::i;:::-;65703:47;;;;;;;;;;;-1:-1:-1;65703:47:0;;;;;;;65684:16;;;:6;:16;;;;;;;:66;;;;;65703:47;65684:66;;;;;-1:-1:-1;;65684:66:0;;;;;;;;;;65761:28;;:18;;:28;;65780:8;;65761:28;:::i;:::-;;;;;;;;;;;;;;:35;;;;;-1:-1:-1;;65761:35:0;;;;;;;;;-1:-1:-1;;;;;65870:25:0;;65885:10;65870:25;65867:188;;65907:62;65921:10;65933:11;65946:8;65907:62;;;;;;;;;;;;;-1:-1:-1;;;65907:62:0;;;:13;:62::i;:::-;66003:17;66011:8;66003:7;:17::i;:::-;-1:-1:-1;;;;;65988:32:0;:11;-1:-1:-1;;;;;65988:32:0;;65980:64;;;;-1:-1:-1;;;65980:64:0;;30506:2:1;65980:64:0;;;30488:21:1;30545:2;30525:18;;;30518:30;-1:-1:-1;;;30564:18:1;;;30557:49;30623:18;;65980:64:0;30304:343:1;65980:64:0;66137:15;;-1:-1:-1;;;66137:15:0;;;;66124:28;;66121:124;;;-1:-1:-1;;;;;66199:28:0;;;;;;:15;:28;;;;;;:35;;66232:1;66199:32;:35::i;:::-;-1:-1:-1;;;;;66169:28:0;;;;;;:15;:28;;;;;:65;66121:124;64471:1781;;;;;64378:1874;;;:::o;59257:90::-;59302:7;59324:19;:9;37557:14;;37465:114;59324:19;59317:26;;59257:90;:::o;47938:277::-;3951:6;;48003:4;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;48016:15:::1;:24:::0;;;::::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;48016:24:0;;::::1;::::0;;;::::1;::::0;;;48047:136:::1;;48064:21;48079:5;48064:14;:21::i;:::-;;48092:19;48105:5;48092:12;:19::i;:::-;-1:-1:-1::0;48136:20:0::1;::::0;48123:52:::1;::::0;;-1:-1:-1;;;48136:20:0;;::::1;;;34119:42:1::0;;48159:15:0::1;34192:2:1::0;34177:18;;34170:34;48123:52:0::1;::::0;34092:18:1;48123:52:0::1;;;;;;;48047:136;-1:-1:-1::0;48196:15:0::1;::::0;;;::::1;;;4169:1;47938:277:::0;;;:::o;59351:1278::-;3951:6;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;59453:17:::1;59480:7;3951:6:::0;;-1:-1:-1;;;;;3951:6:0;;3878:87;59480:7:::1;59520:15;::::0;59453:35;;-1:-1:-1;59520:15:0::1;59507:28:::0;;::::1;-1:-1:-1::0;;;59520:15:0;;::::1;;59507:28;::::0;:64:::1;;-1:-1:-1::0;59550:21:0::1;::::0;::::1;59537:34:::0;;::::1;-1:-1:-1::0;;;59550:21:0;;::::1;;59537:34;59507:64;:98;;;-1:-1:-1::0;59586:19:0::1;::::0;::::1;59573:32:::0;;::::1;-1:-1:-1::0;;;59586:19:0;;::::1;;59573:32;59507:98;59499:129;;;;-1:-1:-1::0;;;59499:129:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;59647:22:0;::::1;::::0;;::::1;::::0;:47:::1;;;59686:8;-1:-1:-1::0;;;;;59673:21:0::1;:9;-1:-1:-1::0;;;;;59673:21:0::1;;;59647:47;59639:76;;;;-1:-1:-1::0;;;59639:76:0::1;;;;;;;:::i;:::-;59743:15;::::0;::::1;59730:28:::0;;::::1;-1:-1:-1::0;;;59743:15:0;;::::1;;59730:28;59726:894;;;59771:19;59792:9:::0;59805:34:::1;59819:8;59829:9;59805:13;:34::i;:::-;59770:69;;;;59857:14;59854:125;;;59902:9;59912:16:::0;;:20:::1;::::0;59931:1:::1;::::0;59912:20:::1;:::i;:::-;59902:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;59887:9:::1;:12:::0;;-1:-1:-1;;;;;59902:31:0;;::::1;::::0;59897:1;;59887:12;::::1;;;;;:::i;:::-;;;;;;;;;:46;;;;;-1:-1:-1::0;;;;;59887:46:0::1;;;;;-1:-1:-1::0;;;;;59887:46:0::1;;;;;;59948:9;:15;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;59948:15:0;;;;;-1:-1:-1;;;;;;59948:15:0::1;::::0;;;;;59854:125:::1;59759:232;;24762:341:::0;24692:411;;:::o;59726:894::-:1;60013:21;::::0;::::1;60000:34:::0;;::::1;-1:-1:-1::0;;;60013:21:0;;::::1;;60000:34;59997:623;;;60047:20;60069:10:::0;60083:34:::1;60097:8;60107:9;60083:13;:34::i;:::-;60046:71;;;;60135:15;60132:163;;;60191:18;60210:25:::0;;:29:::1;::::0;60238:1:::1;::::0;60210:29:::1;:::i;:::-;60191:49;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;60166:18:::1;:22:::0;;-1:-1:-1;;;;;60191:49:0;;::::1;::::0;60185:2;;60166:22;::::1;;;;;:::i;:::-;;;;;;;;;:74;;;;;-1:-1:-1::0;;;;;60166:74:0::1;;;;;-1:-1:-1::0;;;;;60166:74:0::1;;;;;;60255:18;:24;;;;;;;:::i;59997:623::-;60329:19;::::0;::::1;60316:32:::0;;::::1;-1:-1:-1::0;;;60329:19:0;;::::1;;60316:32;60313:307;;;60361:20;60383:10:::0;60397:34:::1;60411:8;60421:9;60397:13;:34::i;:::-;60360:71;;;;60449:15;60446:155;;;60503:16;60520:23:::0;;:27:::1;::::0;60546:1:::1;::::0;60520:27:::1;:::i;:::-;60503:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;60503:45:0::1;60480:16;60497:2;60480:20;;;;;;;;:::i;:::-;;;;;;;;;:68;;;;;-1:-1:-1::0;;;;;60480:68:0::1;;;;;-1:-1:-1::0;;;;;60480:68:0::1;;;;;;60563:16;:22;;;;;;;:::i;26059:339::-:0;26254:41;2775:10;26273:12;2695:98;26254:41;26246:103;;;;-1:-1:-1;;;26246:103:0;;;;;;;:::i;:::-;26362:28;26372:4;26378:2;26382:7;26362:9;:28::i;46829:164::-;3951:6;;46902:13;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;46924:29;;::::1;::::0;:22:::1;::::0;:29:::1;::::0;::::1;::::0;::::1;:::i;:::-;;46967:22;46960:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46829:164:::0;;;:::o;61986:288::-;3951:6;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62072:28:0;::::1;;::::0;;;:18:::1;:28;::::0;;;;;::::1;;62064:77;;;;-1:-1:-1::0;;;62064:77:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;62152:27:0::1;62180:1;62152:27:::0;;;:17:::1;:27;::::0;;;;;;;:29;;;62192:18:::1;:28:::0;;;;;:34;;-1:-1:-1;;62192:34:0::1;::::0;;62237:15:::1;:25:::0;;;;;:29;61986:288::o;62487:205::-;62584:10;62537:7;62565:30;;;:18;:30;;;;;;;;62557:79;;;;-1:-1:-1;;;62557:79:0;;;;;;;:::i;:::-;-1:-1:-1;62673:10:0;62655:29;;;;:17;:29;;;;;;;62487:205::o;50651:856::-;50741:14;;50716:7;;50741:14;;;;;50733:69;;;;-1:-1:-1;;;50733:69:0;;32020:2:1;50733:69:0;;;32002:21:1;32059:2;32039:18;;;32032:30;32098:34;32078:18;;;32071:62;-1:-1:-1;;;32149:18:1;;;32142:40;32199:19;;50733:69:0;31818:406:1;50733:69:0;50822:23;;-1:-1:-1;;;50822:23:0;;;;50817:28;;;;;:39;;;50855:1;50849:3;:7;50817:39;50809:111;;;;-1:-1:-1;;;50809:111:0;;;;;;;:::i;:::-;50927:14;50944:19;:9;37557:14;;37465:114;50944:19;50994;;50927:36;;-1:-1:-1;50979:12:0;50988:3;50927:36;50979:12;:::i;:::-;:34;50970:88;;;;-1:-1:-1;;;50970:88:0;;;;;;;:::i;:::-;51066:14;51086:46;51100:10;51112:19;;;;;;;;;;;51086:13;:46::i;:::-;51065:67;;;51147:9;51139:68;;;;-1:-1:-1;;;51139:68:0;;26863:2:1;51139:68:0;;;26845:21:1;26902:2;26882:18;;;26875:30;26941:34;26921:18;;;26914:62;-1:-1:-1;;;26992:18:1;;;26985:44;27046:19;;51139:68:0;26661:410:1;51139:68:0;51251:3;51235:13;;:19;;;;:::i;:::-;51222:9;:32;;51214:67;;;;-1:-1:-1;;;51214:67:0;;;;;;;:::i;:::-;51294:9;51290:105;51309:3;51305:1;:7;51290:105;;;51329:26;51340:13;;51329:9;:26::i;:::-;;51366:21;:9;37672:19;;37690:1;37672:19;;;37587:121;51366:21;51314:3;;;;:::i;:::-;;;;51290:105;;;-1:-1:-1;51425:19:0;;51406:64;;;-1:-1:-1;;;51425:19:0;;;;;33808:42:1;;33881:2;33866:18;;33859:34;;;51454:15:0;33909:18:1;;;33902:34;-1:-1:-1;;;;;;;;;;;51406:64:0;33796:2:1;33781:18;51406:64:0;;;;;;;51484:9;37557:14;51484:19;51477:26;50651:856;-1:-1:-1;;;;50651:856:0:o;63076:120::-;3951:6;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;63140:47:::1;::::0;63148:10:::1;::::0;63165:21:::1;63140:47:::0;::::1;;;::::0;::::1;::::0;;;63165:21;63148:10;63140:47;::::1;;;;;;63132:56;;;::::0;::::1;;63076:120::o:0;26469:185::-;26607:39;26624:4;26630:2;26634:7;26607:39;;;;;;;;;;;;:16;:39::i;46997:156::-;3951:6;;47068;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;-1:-1:-1;47083:23:0::1;:29:::0;;-1:-1:-1;;;;47083:29:0::1;-1:-1:-1::0;;;47083:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;47126:23;::::1;;::::0;46997:156::o;60918:1060::-;3951:6;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;61075:6:::1;61070:901;61085:21:::0;;::::1;61070:901;;;61186:15;::::0;61127:19:::1;::::0;61186:15:::1;61173:28:::0;;::::1;-1:-1:-1::0;;;61186:15:0;;::::1;;61173:28;61169:791;;;61242:41;61256:12;;61269:1;61256:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;61273:9;61242:13;:41::i;:::-;-1:-1:-1::0;61221:62:0;-1:-1:-1;61221:62:0;61302:221:::1;;61345:9;61360:12;;61373:1;61360:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;61345:31:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;61345:31:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;61345:31:0::1;-1:-1:-1::0;;;;;61345:31:0;;::::1;::::0;;;::::1;::::0;;61434:3;;61438:1;61434:6;;::::1;;;;;:::i;:::-;;;;;;;61399:17;:34;61417:12;;61430:1;61417:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61399:34:0::1;-1:-1:-1::0;;;;;61399:34:0::1;;;;;;;;;;;;:41;;;;61499:4;61463:18;:35;61482:12;;61495:1;61482:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61463:35:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;61463:35:0;:40;;-1:-1:-1;;61463:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61302:221:::1;61169:791;;;61562:21;::::0;::::1;61549:34:::0;;::::1;-1:-1:-1::0;;;61562:21:0;;::::1;;61549:34;61546:414;;;61620:41;61634:12;;61647:1;61634:15;;;;;;;:::i;61620:41::-;-1:-1:-1::0;61599:62:0;-1:-1:-1;61599:62:0;61676:60:::1;;61696:18;61720:12;;61733:1;61720:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;61696:40:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;61696:40:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;61696:40:0::1;-1:-1:-1::0;;;;;61696:40:0;;::::1;::::0;;;::::1;::::0;;61546:414:::1;;;61774:19;::::0;::::1;61761:32:::0;;::::1;-1:-1:-1::0;;;61774:19:0;;::::1;;61761:32;61758:202;;;61830:41;61844:12;;61857:1;61844:15;;;;;;;:::i;61830:41::-;-1:-1:-1::0;61809:62:0;-1:-1:-1;61809:62:0;61886:58:::1;;61906:16;61928:12;;61941:1;61928:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;61906:38:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;61906:38:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;61906:38:0::1;-1:-1:-1::0;;;;;61906:38:0;;::::1;::::0;;;::::1;::::0;;61886:58:::1;-1:-1:-1::0;61108:3:0;::::1;::::0;::::1;:::i;:::-;;;;61070:901;;;;60918:1060:::0;;;;;:::o;54493:1180::-;54569:16;;;;:6;:16;;;;;:30;;;;;54561:76;;;;-1:-1:-1;;;54561:76:0;;23066:2:1;54561:76:0;;;23048:21:1;23105:2;23085:18;;;23078:30;23144:34;23124:18;;;23117:62;-1:-1:-1;;;23195:18:1;;;23188:31;23236:19;;54561:76:0;22864:397:1;54561:76:0;54664:10;54644:17;54716:7;3951:6;;-1:-1:-1;;;;;3951:6:0;;3878:87;54716:7;54731:25;54759:16;;;:6;:16;;;;;:22;54681:43;;-1:-1:-1;54804:9:0;;54858:17;54766:8;54858:7;:17::i;:::-;54820:56;;54919:88;54937:8;54947;54958:10;54971:9;54982:5;54989:17;54919;:88::i;:::-;55014:49;55028:10;55040:8;55050;55014:49;;;;;;;;;;;;:13;:49::i;:::-;55102:5;55070:16;;;:6;:16;;;;;:30;;:37;;-1:-1:-1;;55070:37:0;;;55220:21;;55192:22;;55170:72;;55220:21;55170:45;;:17;;:21;:45::i;:::-;:49;;:72::i;:::-;55147:95;;55263:29;55280:11;;55263;:16;;:29;;;;:::i;:::-;55330:31;;55249:43;;-1:-1:-1;;;;;;55330:18:0;;;:31;;;;;55249:43;;55330:31;;;;55249:43;55330:18;:31;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55375:72:0;;;33138:25:1;;;-1:-1:-1;;;;;33237:15:1;;;33232:2;33217:18;;33210:43;33289:15;;33269:18;;;33262:43;33336:2;33321:18;;33314:34;;;55431:15:0;33379:3:1;33364:19;;33357:35;55375:72:0;;;;;;;33125:3:1;55375:72:0;;;55456:17;55476:34;:17;55498:11;55476:21;:34::i;:::-;55456:54;;55529:27;55544:11;;55529:9;:14;;:27;;;;:::i;:::-;55563:30;;55517:39;;-1:-1:-1;;;;;;55563:19:0;;;:30;;;;;55517:39;;55563:30;;;;55517:39;55563:19;:30;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55605:64:0;;;32650:25:1;;;-1:-1:-1;;;;;32749:15:1;;;32744:2;32729:18;;32722:43;32801:15;;32781:18;;;32774:43;55653:15:0;32848:2:1;32833:18;;32826:34;55605:64:0;;;;;;;32637:3:1;55605:64:0;;;54554:1119;;;;;;;54493:1180;:::o;49938:456::-;3951:6;;50002:7;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;50021:14:::1;50038:23;:13;37557:14:::0;;37465:114;50038:23:::1;50092:21;::::0;50021:40;;-1:-1:-1;50077:12:0::1;50086:3:::0;50021:40;50077:12:::1;:::i;:::-;:36;:47;;;;;50123:1;50117:3;:7;50077:47;50068:101;;;;-1:-1:-1::0;;;50068:101:0::1;;;;;;;:::i;:::-;50186:9;50182:100;50201:3;50197:1;:7;50182:100;;;50221:17;50233:3;50221:9;:17::i;:::-;;50249:25;:13;37672:19:::0;;37690:1;37672:19;;;37587:121;50249:25:::1;50206:3:::0;::::1;::::0;::::1;:::i;:::-;;;;50182:100;;;-1:-1:-1::0;50312:15:0::1;::::0;50293:60:::1;::::0;;-1:-1:-1;;;50312:15:0;;::::1;;;33808:42:1::0;;33881:2;33866:18;;33859:34;;;50337:15:0::1;33909:18:1::0;;;33902:34;-1:-1:-1;;;;;;;;;;;50293:60:0;33796:2:1;33781:18;50293:60:0::1;;;;;;;50367:13;37557:14:::0;50367:23:::1;50360:30:::0;49938:456;-1:-1:-1;;;49938:456:0:o;23304:239::-;23376:7;23412:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23412:16:0;23447:19;23439:73;;;;-1:-1:-1;;;23439:73:0;;22241:2:1;23439:73:0;;;22223:21:1;22280:2;22260:18;;;22253:30;22319:34;22299:18;;;22292:62;-1:-1:-1;;;22370:18:1;;;22363:39;22419:19;;23439:73:0;22039:405:1;43993:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23034:208::-;23106:7;-1:-1:-1;;;;;23134:19:0;;23126:74;;;;-1:-1:-1;;;23126:74:0;;21830:2:1;23126:74:0;;;21812:21:1;21869:2;21849:18;;;21842:30;21908:34;21888:18;;;21881:62;-1:-1:-1;;;21959:18:1;;;21952:40;22009:19;;23126:74:0;21628:406:1;23126:74:0;-1:-1:-1;;;;;;23218:16:0;;;;;:9;:16;;;;;;;23034:208::o;4529:94::-;3951:6;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;4594:21:::1;4612:1;4594:9;:21::i;51513:496::-:0;51592:15;;51567:7;;51592:15;;;;;51584:71;;;;-1:-1:-1;;;51584:71:0;;;;;;;:::i;:::-;51697:20;;51671:10;37557:14;51671:23;;51693:1;51671:23;:::i;:::-;:46;51662:101;;;;-1:-1:-1;;;51662:101:0;;;;;;;:::i;:::-;51791:14;;51778:9;:27;;51770:62;;;;-1:-1:-1;;;51770:62:0;;;;;;;:::i;:::-;51839:28;51851:14;;51839:9;:28::i;:::-;;51874:22;:10;37672:19;;37690:1;37672:19;;;37587:121;51874:22;51929:20;;51910:61;;;-1:-1:-1;;;51929:20:0;;;;;33808:42:1;;51951:1:0;33881:2:1;33866:18;;33859:34;51955:15:0;33909:18:1;;;33902:34;-1:-1:-1;;;;;;;;;;;51910:61:0;33796:2:1;33781:18;51910:61:0;;;;;;;-1:-1:-1;51985:10:0;37557:14;;59257:90::o;47374:280::-;3951:6;;47440:4;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;47453:16:::1;:25:::0;;-1:-1:-1;;47453:25:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;47485:136:::1;;47502:19;47515:5;47502:12;:19::i;:::-;;47528:20;47542:5;47528:13;:20::i;:::-;-1:-1:-1::0;47573:21:0::1;::::0;47560:53:::1;::::0;;-1:-1:-1;;;47573:21:0;;::::1;;;34119:42:1::0;;47597:15:0::1;34192:2:1::0;34177:18;;34170:34;47560:53:0::1;::::0;34092:18:1;47560:53:0::1;;;;;;;47485:136;-1:-1:-1::0;;47634:16:0::1;::::0;::::1;;::::0;47374:280::o;23779:104::-;23835:13;23868:7;23861:14;;;;;:::i;57275:992::-;57357:4;57363:7;57380:17;57407:7;3951:6;;-1:-1:-1;;;;;3951:6:0;;3878:87;57407:7;57443:15;;57380:35;;-1:-1:-1;57443:15:0;57430:28;;;-1:-1:-1;;;57443:15:0;;;;57430:28;;:64;;-1:-1:-1;57473:21:0;;;57460:34;;;-1:-1:-1;;;57473:21:0;;;;57460:34;57430:64;:98;;;-1:-1:-1;57509:19:0;;;57496:32;;;-1:-1:-1;;;57509:19:0;;;;57496:32;57430:98;57422:129;;;;-1:-1:-1;;;57422:129:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57566:22:0;;;;;;:47;;;57605:8;-1:-1:-1;;;;;57592:21:0;:9;-1:-1:-1;;;;;57592:21:0;;;57566:47;57558:76;;;;-1:-1:-1;;;57558:76:0;;;;;;;:::i;:::-;57658:15;;;57645:28;;;-1:-1:-1;;;57658:15:0;;;;57645:28;57641:595;;;57686:9;57681:110;57705:9;:16;57701:20;;57681:110;;;57753:9;57763:1;57753:12;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;57741:24:0;;;57753:12;;57741:24;57737:46;;;57775:4;;-1:-1:-1;57781:1:0;-1:-1:-1;57767:16:0;;-1:-1:-1;57767:16:0;57737:46;57723:6;57728:1;57723:6;;:::i;:::-;;;57681:110;;;;57805:5;57812:1;57797:17;;;;;;;57641:595;57844:21;;;57831:34;;;-1:-1:-1;;;57844:21:0;;;;57831:34;57828:408;;;57878:9;57873:128;57897:18;:25;57893:29;;57873:128;;;57954:18;57973:1;57954:21;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;57942:33:0;;;57954:21;;57942:33;57938:55;;;57985:4;;-1:-1:-1;57991:1:0;-1:-1:-1;57977:16:0;;-1:-1:-1;57977:16:0;57938:55;57924:6;57929:1;57924:6;;:::i;:::-;;;57873:128;;57828:408;58054:19;;;58041:32;;;-1:-1:-1;;;58054:19:0;;;;58041:32;58038:198;;;58086:9;58081:124;58105:16;:23;58101:27;;58081:124;;;58160:16;58177:1;58160:19;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;58148:31:0;;;58160:19;;58148:31;58144:53;;;58189:4;;-1:-1:-1;58195:1:0;-1:-1:-1;58181:16:0;;-1:-1:-1;58181:16:0;58144:53;58130:6;58135:1;58130:6;;:::i;:::-;;;58081:124;;58038:198;58252:5;58259:1;58244:17;;;;;57275:992;;;;;;:::o;62282:197::-;62373:10;62326:7;62354:30;;;:18;:30;;;;;;;;62346:79;;;;-1:-1:-1;;;62346:79:0;;;;;;;:::i;:::-;-1:-1:-1;62460:10:0;62444:27;;;;:15;:27;;;;;;;62282:197::o;25462:295::-;-1:-1:-1;;;;;25565:24:0;;2775:10;25565:24;;25557:62;;;;-1:-1:-1;;;25557:62:0;;18612:2:1;25557:62:0;;;18594:21:1;18651:2;18631:18;;;18624:30;18690:27;18670:18;;;18663:55;18735:18;;25557:62:0;18410:349:1;25557:62:0;2775:10;25632:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25632:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25632:53:0;;;;;;;;;;25701:48;;11161:41:1;;;25632:42:0;;2775:10;25701:48;;11134:18:1;25701:48:0;;;;;;;25462:295;;:::o;47658:274::-;3951:6;;47722:4;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;47735:14:::1;:23:::0;;;::::1;::::0;::::1;;;-1:-1:-1::0;;47735:23:0;;::::1;::::0;;;::::1;::::0;;;47765:136:::1;;47782:21;47797:5;47782:14;:21::i;:::-;;47810:20;47824:5;47810:13;:20::i;:::-;-1:-1:-1::0;47855:19:0::1;::::0;47842:51:::1;::::0;;-1:-1:-1;;;47855:19:0;;::::1;;;34119:42:1::0;;47877:15:0::1;34192:2:1::0;34177:18;;34170:34;47842:51:0::1;::::0;34092:18:1;47842:51:0::1;;;;;;;47765:136;-1:-1:-1::0;;47914:14:0::1;::::0;::::1;::::0;::::1;;;::::0;47658:274::o;52015:711::-;52106:15;;52081:7;;52106:15;;;;;52098:71;;;;-1:-1:-1;;;52098:71:0;;;;;;;:::i;:::-;52189:30;;-1:-1:-1;;;52189:30:0;;;;52184:35;;;;;:46;;;52229:1;52223:3;:7;52184:46;52176:105;;;;-1:-1:-1;;;52176:105:0;;25256:2:1;52176:105:0;;;25238:21:1;25295:2;25275:18;;;25268:30;25334:34;25314:18;;;25307:62;-1:-1:-1;;;25385:18:1;;;25378:44;25439:19;;52176:105:0;25054:410:1;52176:105:0;52288:14;52305:20;:10;37557:14;;37465:114;52305:20;52356;;52288:37;;-1:-1:-1;52341:12:0;52350:3;52288:37;52341:12;:::i;:::-;:35;52332:89;;;;-1:-1:-1;;;52332:89:0;;;;;;;:::i;:::-;52467:3;52450:14;;:20;;;;:::i;:::-;52437:9;:33;;52429:68;;;;-1:-1:-1;;;52429:68:0;;;;;;;:::i;:::-;52510:9;52506:108;52525:3;52521:1;:7;52506:108;;;52545:28;52557:14;;52545:9;:28::i;:::-;;52584:22;:10;37672:19;;37690:1;37672:19;;;37587:121;52584:22;52530:3;;;;:::i;:::-;;;;52506:108;;;-1:-1:-1;52644:20:0;;52625:63;;;-1:-1:-1;;;52644:20:0;;;;;33808:42:1;;33881:2;33866:18;;33859:34;;;52672:15:0;33909:18:1;;;33902:34;-1:-1:-1;;;;;;;;;;;52625:63:0;33796:2:1;33781:18;52625:63:0;;;;;;;52702:10;37557:14;52702:20;37465:114;56843:428;56925:17;56933:8;56925:7;:17::i;:::-;56917:57;;;;-1:-1:-1;;;56917:57:0;;;;;;;:::i;:::-;57010:10;56989:17;56997:8;56989:7;:17::i;:::-;-1:-1:-1;;;;;56989:31:0;;56981:76;;;;-1:-1:-1;;;56981:76:0;;23818:2:1;56981:76:0;;;23800:21:1;;;23837:18;;;23830:30;23896:34;23876:18;;;23869:62;23948:18;;56981:76:0;23616:356:1;56981:76:0;57072:23;57064:32;;;;;;57103:17;57123:16;;;:6;:16;;;;;:22;57160;;;;57152:74;;;;-1:-1:-1;;;57152:74:0;;17043:2:1;57152:74:0;;;17025:21:1;17082:2;17062:18;;;17055:30;17121:34;17101:18;;;17094:62;-1:-1:-1;;;17172:18:1;;;17165:37;17219:19;;57152:74:0;16841:403:1;57152:74:0;-1:-1:-1;57233:16:0;;;;:6;:16;;;;;;:34;56843:428::o;64004:366::-;64087:4;64141:17;64149:8;64141:7;:17::i;:::-;64133:57;;;;-1:-1:-1;;;64133:57:0;;;;;;;:::i;:::-;64230:10;64209:17;64217:8;64209:7;:17::i;:::-;-1:-1:-1;;;;;64209:31:0;;64201:71;;;;-1:-1:-1;;;64201:71:0;;13007:2:1;64201:71:0;;;12989:21:1;13046:2;13026:18;;;13019:30;13085:29;13065:18;;;13058:57;13132:18;;64201:71:0;12805:351:1;64201:71:0;-1:-1:-1;64283:16:0;;;;:6;:16;;;;;;:30;;:47;;-1:-1:-1;;64283:47:0;;;;;;;;64004:366::o;47159:160::-;3951:6;;47220;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;-1:-1:-1;47235:30:0::1;:36:::0;;-1:-1:-1;;;;47235:36:0::1;-1:-1:-1::0;;;47235:36:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;47285:30;::::1;;::::0;47159:160::o;26725:328::-;26900:41;2775:10;26933:7;26900:18;:41::i;:::-;26892:103;;;;-1:-1:-1;;;26892:103:0;;;;;;;:::i;:::-;27006:39;27020:4;27026:2;27030:7;27039:5;27006:13;:39::i;:::-;26725:328;;;;:::o;62704:364::-;3951:6;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;62804:6:::1;62799:252;62814:19:::0;;::::1;62799:252;;;62862:18;:33;62881:10;;62892:1;62881:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;62862:33:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;62862:33:0;;::::1;;62854:82;;;;-1:-1:-1::0;;;62854:82:0::1;;;;;;;:::i;:::-;62984:1;62951:17;:32;62969:10;;62980:1;62969:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;62951:32:0::1;-1:-1:-1::0;;;;;62951:32:0::1;;;;;;;;;;;;:34;;;;63034:5;63000:18;:33;63019:10;;63030:1;63019:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;63000:33:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;63000:33:0;:39;;-1:-1:-1;;63000:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62835:3;::::1;::::0;::::1;:::i;:::-;;;;62799:252;;49054:878:::0;49140:16;;49115:7;;49140:16;;49132:73;;;;-1:-1:-1;;;49132:73:0;;14247:2:1;49132:73:0;;;14229:21:1;14286:2;14266:18;;;14259:30;14325:34;14305:18;;;14298:62;-1:-1:-1;;;14376:18:1;;;14369:42;14428:19;;49132:73:0;14045:408:1;49132:73:0;49225:23;;-1:-1:-1;;;49225:23:0;;;;49220:28;;;49212:100;;;;-1:-1:-1;;;49212:100:0;;;;;;;:::i;:::-;49319:14;49336:21;:11;37557:14;;37465:114;49336:21;49388;;49319:38;;-1:-1:-1;49373:12:0;49382:3;49319:38;49373:12;:::i;:::-;:36;:47;;;;;49419:1;49413:3;:7;49373:47;49364:99;;;;-1:-1:-1;;;49364:99:0;;12246:2:1;49364:99:0;;;12228:21:1;12285:2;12265:18;;;12258:30;12324:34;12304:18;;;12297:62;-1:-1:-1;;;12375:18:1;;;12368:35;12420:19;;49364:99:0;12044:401:1;49364:99:0;49471:14;49491:48;49505:10;49517:21;;;;;;;;;;;49491:13;:48::i;:::-;49470:69;;;49554:9;49546:70;;;;-1:-1:-1;;;49546:70:0;;29269:2:1;49546:70:0;;;29251:21:1;29308:2;29288:18;;;29281:30;29347:34;29327:18;;;29320:62;-1:-1:-1;;;29398:18:1;;;29391:46;29454:19;;49546:70:0;29067:412:1;49546:70:0;49651:15;;49645:21;;:3;:21;:::i;:::-;49632:9;:34;;49624:75;;;;-1:-1:-1;;;49624:75:0;;28104:2:1;49624:75:0;;;28086:21:1;28143:2;28123:18;;;28116:30;28182:29;28162:18;;;28155:57;28229:18;;49624:75:0;27902:351:1;49624:75:0;49710:9;49706:110;49725:3;49721:1;:7;49706:110;;;49745:29;49757:15;;49745:9;:29::i;:::-;;49785:23;:11;37672:19;;37690:1;37672:19;;;37587:121;49785:23;49730:3;;;;:::i;:::-;;;;49706:110;;;-1:-1:-1;49846:21:0;;49827:66;;;-1:-1:-1;;;49846:21:0;;;;;33808:42:1;;33881:2;33866:18;;33859:34;;;49877:15:0;33909:18:1;;;33902:34;-1:-1:-1;;;;;;;;;;;49827:66:0;33796:2:1;33781:18;49827:66:0;;;;;;;49907:11;37557:14;49907:21;37465:114;63208:788;63324:15;;63281:7;;63324:15;63311:28;;;-1:-1:-1;;;63324:15:0;;;;63311:28;;:66;;-1:-1:-1;63356:21:0;;;63343:34;;;-1:-1:-1;;;63356:21:0;;;;63343:34;63311:66;:102;;;-1:-1:-1;63394:19:0;;;63381:32;;;-1:-1:-1;;;63394:19:0;;;;63381:32;63311:102;:138;;;-1:-1:-1;63429:20:0;;;63416:33;;;-1:-1:-1;;;63429:20:0;;;;63416:33;63311:138;63302:171;;;;-1:-1:-1;;;63302:171:0;;;;;;;:::i;:::-;63507:15;;;63494:28;;;-1:-1:-1;;;63507:15:0;;;;63494:28;63490:486;;;63549:13;37557:14;63549:23;37465:114;63490:486;63612:21;;;63599:34;;;-1:-1:-1;;;63612:21:0;;;;63599:34;63596:380;;;63660:11;37557:14;63660:21;37465:114;63596:380;63721:19;;;63708:32;;;-1:-1:-1;;;63721:19:0;;;;63708:32;63705:271;;;63767:9;37557:14;63767:19;37465:114;63705:271;63825:20;;;63812:33;;;-1:-1:-1;;;63825:20:0;;;;63812:33;63808:168;;;63873:10;37557:14;63873:20;37465:114;63808:168;63941:9;37557:14;63941:19;37465:114;35185:679;35258:13;35292:16;35300:7;35292;:16::i;:::-;35284:78;;;;-1:-1:-1;;;35284:78:0;;25671:2:1;35284:78:0;;;25653:21:1;25710:2;25690:18;;;25683:30;25749:34;25729:18;;;25722:62;-1:-1:-1;;;25800:18:1;;;25793:47;25857:19;;35284:78:0;25469:413:1;35284:78:0;35375:23;35401:19;;;:10;:19;;;;;35375:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35431:18;35452:10;24613:9;;;;;;;;;-1:-1:-1;24613:9:0;;;24536:94;35452:10;35431:31;;35544:4;35538:18;35560:1;35538:23;35534:72;;;-1:-1:-1;35585:9:0;35185:679;-1:-1:-1;;35185:679:0:o;35534:72::-;35710:23;;:27;35706:108;;35785:4;35791:9;35768:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35754:48;;;;35185:679;;;:::o;35706:108::-;35833:23;35848:7;35833:14;:23::i;56374:465::-;56467:17;56475:8;56467:7;:17::i;:::-;56459:57;;;;-1:-1:-1;;;56459:57:0;;;;;;;:::i;:::-;56523:17;56550:7;3951:6;;-1:-1:-1;;;;;3951:6:0;;3878:87;56550:7;56523:35;-1:-1:-1;56573:10:0;-1:-1:-1;;;;;56573:23:0;;;;56565:64;;;;-1:-1:-1;;;56565:64:0;;15843:2:1;56565:64:0;;;15825:21:1;15882:2;15862:18;;;15855:30;15921;15901:18;;;15894:58;15969:18;;56565:64:0;15641:352:1;56565:64:0;56650:9;-1:-1:-1;;;;;56644:15:0;:2;-1:-1:-1;;;;;56644:15:0;;;56636:56;;;;-1:-1:-1;;;56636:56:0;;15843:2:1;56636:56:0;;;15825:21:1;15882:2;15862:18;;;15855:30;15921;15901:18;;;15894:58;15969:18;;56636:56:0;15641:352:1;56636:56:0;-1:-1:-1;;;;;56707:16:0;;;;;;:43;;-1:-1:-1;;;;;;56727:23:0;;;;56707:43;:61;;;;;56759:9;-1:-1:-1;;;;;56754:14:0;:2;-1:-1:-1;;;;;56754:14:0;;;56707:61;56699:90;;;;-1:-1:-1;;;56699:90:0;;;;;;;:::i;:::-;56796:39;56813:9;56823:2;56826:8;56796:16;:39::i;48511:247::-;3951:6;;48564:4;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;48577:15:::1;:22:::0;;-1:-1:-1;;48577:22:0::1;::::0;::::1;::::0;;48629:70:::1;48654:44;48678:19;:9;37557:14:::0;;37465:114;48678:19:::1;48654;::::0;;:23:::1;:44::i;:::-;48629:20;::::0;;:24:::1;:70::i;:::-;48606:20;:93:::0;48706:19:::1;48719:5;48706:12;:19::i;:::-;-1:-1:-1::0;;48739:15:0::1;::::0;;;::::1;;;::::0;48511:247::o;48221:284::-;3951:6;;48276:4;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;48291:17:::1;:24:::0;;-1:-1:-1;;48291:24:0::1;::::0;::::1;::::0;;48344:73:::1;48368:48;48394:21;:11;37557:14:::0;;37465:114;48394:21:::1;48368;::::0;;:25:::1;:48::i;:::-;48344:19;::::0;;:23:::1;:73::i;:::-;48322:19;:95:::0;48424:21:::1;48439:5;48424:14;:21::i;:::-;;48452:18;48465:4;48452:12;:18::i;:::-;-1:-1:-1::0;;48484:17:0::1;::::0;;;::::1;;;::::0;48221:284::o;58373:880::-;3951:6;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;58457:19:::1;58491:17:::0;58518:7:::1;3951:6:::0;;-1:-1:-1;;;;;3951:6:0;;3878:87;58518:7:::1;58554:15;::::0;58491:35;;-1:-1:-1;58554:15:0::1;58541:28:::0;;::::1;-1:-1:-1::0;;;58554:15:0;;::::1;;58541:28;::::0;:64:::1;;-1:-1:-1::0;58584:21:0::1;::::0;::::1;58571:34:::0;;::::1;-1:-1:-1::0;;;58584:21:0;;::::1;;58571:34;58541:64;:98;;;-1:-1:-1::0;58620:19:0::1;::::0;::::1;58607:32:::0;;::::1;-1:-1:-1::0;;;58620:19:0;;::::1;;58607:32;58541:98;58533:129;;;;-1:-1:-1::0;;;58533:129:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;58677:22:0;::::1;::::0;;::::1;::::0;:47:::1;;;58716:8;-1:-1:-1::0;;;;;58703:21:0::1;:9;-1:-1:-1::0;;;;;58703:21:0::1;;;58677:47;58669:76;;;;-1:-1:-1::0;;;58669:76:0::1;;;;;;;:::i;:::-;58769:15;::::0;::::1;58756:28:::0;;::::1;-1:-1:-1::0;;;58769:15:0;;::::1;;58756:28;58752:498;;;58813:34;58827:8;58837:9;58813:13;:34::i;:::-;-1:-1:-1::0;58792:55:0;-1:-1:-1;58792:55:0;58854:44:::1;;58874:9;:24:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;58874:24:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;58874:24:0::1;-1:-1:-1::0;;;;;58874:24:0;::::1;;::::0;;58854:44:::1;58752:498;;;58928:21;::::0;::::1;58915:34:::0;;::::1;-1:-1:-1::0;;;58928:21:0;;::::1;;58915:34;58912:338;;;58978:34;58992:8;59002:9;58978:13;:34::i;:::-;-1:-1:-1::0;58957:55:0;-1:-1:-1;58957:55:0;59019:53:::1;;59039:18;:33:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;59039:33:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;59039:33:0::1;-1:-1:-1::0;;;;;59039:33:0;::::1;;::::0;;58912:338:::1;;;59102:19;::::0;::::1;59089:32:::0;;::::1;-1:-1:-1::0;;;59102:19:0;;::::1;;59089:32;59086:164;;;59150:34;59164:8;59174:9;59150:13;:34::i;:::-;-1:-1:-1::0;59129:55:0;-1:-1:-1;59129:55:0;59191:51:::1;;59211:16;:31:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;59211:31:0;;;;;::::1;::::0;;-1:-1:-1;;;;;59211:31:0;::::1;-1:-1:-1::0;;;;;;59211:31:0;;::::1;;::::0;;58453:800:::1;;58373:880:::0;;:::o;60637:269::-;3951:6;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60732:28:0;::::1;;::::0;;;:18:::1;:28;::::0;;;;;::::1;;:35;60724:88;;;::::0;-1:-1:-1;;;60724:88:0;;17798:2:1;60724:88:0::1;::::0;::::1;17780:21:1::0;17837:2;17817:18;;;17810:30;17876:34;17856:18;;;17849:62;-1:-1:-1;;;17927:18:1;;;17920:38;17975:19;;60724:88:0::1;17596:404:1::0;60724:88:0::1;-1:-1:-1::0;;;;;60823:27:0;;::::1;;::::0;;;:17:::1;:27;::::0;;;;;;;:31;;;;60865:18:::1;:28:::0;;;:33;;-1:-1:-1;;60865:33:0::1;60894:4;60865:33;::::0;;60637:269::o;46118:703::-;3951:6;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;46250:15:::1;::::0;46204:19:::1;::::0;46250:15:::1;46237:28:::0;;::::1;-1:-1:-1::0;;;46250:15:0;;::::1;;46237:28;46233:504;;;-1:-1:-1::0;46287:21:0::1;::::0;;46315:31;;;;46233:504:::1;;;46376:21;::::0;::::1;46363:34:::0;;::::1;-1:-1:-1::0;;;46376:21:0;;::::1;;46363:34;46360:377;;;-1:-1:-1::0;46419:21:0::1;::::0;;46447:31;;;;46360:377:::1;;;46508:19;::::0;::::1;46495:32:::0;;::::1;-1:-1:-1::0;;;46508:19:0;;::::1;;46495:32;46492:245;;;-1:-1:-1::0;46549:19:0::1;::::0;;46575:29;;;;46492:245:::1;;;46634:20;::::0;::::1;46621:33:::0;;::::1;-1:-1:-1::0;;;46634:20:0;;::::1;;46621:33;46618:119;;;-1:-1:-1::0;46676:20:0::1;::::0;;46703:30;;;;46618:119:::1;46744:73;::::0;;34813:10:1;34801:23;;34783:42;;34856:2;34841:18;;34834:34;;;34884:18;;;34877:34;;;46801:15:0::1;34942:2:1::0;34927:18;;34920:34;46744:73:0::1;::::0;34770:3:1;34755:19;46744:73:0::1;;;;;;;;46200:621;46118:703:::0;;:::o;53602:713::-;53686:10;53669:14;53711:26;;;:18;:26;;;;;;;;53703:106;;;;-1:-1:-1;;;53703:106:0;;13771:2:1;53703:106:0;;;13753:21:1;13810:2;13790:18;;;13783:30;13849:34;13829:18;;;13822:62;13920:34;13900:18;;;13893:62;-1:-1:-1;;;13971:19:1;;;13964:34;14015:19;;53703:106:0;13569:471:1;53703:106:0;-1:-1:-1;;;;;53855:23:0;;;;;;:15;:23;;;;;;;;;53827:17;:25;;;;;;;:51;53819:117;;;;-1:-1:-1;;;53819:117:0;;20506:2:1;53819:117:0;;;20488:21:1;20545:2;20525:18;;;20518:30;20584:34;20564:18;;;20557:62;-1:-1:-1;;;20635:18:1;;;20628:51;20696:19;;53819:117:0;20304:417:1;53819:117:0;-1:-1:-1;;;;;53987:23:0;;;;;;:15;:23;;;;;;;;;53959:17;:25;;;;;;;:51;;53987:23;53959:51;:::i;:::-;53951:3;:60;;53943:157;;;;-1:-1:-1;;;53943:157:0;;16200:2:1;53943:157:0;;;16182:21:1;16239:2;16219:18;;;16212:30;16278:34;16258:18;;;16251:62;16349:34;16329:18;;;16322:62;-1:-1:-1;;;16400:19:1;;;16393:50;16460:19;;53943:157:0;15998:487:1;53943:157:0;54116:9;54112:127;54131:3;54127:1;:7;54112:127;;;54151:14;54161:3;54151:9;:14::i;:::-;-1:-1:-1;;;;;;54201:23:0;;;;;;:15;:23;;;;;;:30;;54229:1;54201:27;:30::i;:::-;-1:-1:-1;;;;;54176:23:0;;;;;;:15;:23;;;;;:55;54136:3;;;;:::i;:::-;;;;54112:127;;;-1:-1:-1;54272:15:0;;54253:58;;;-1:-1:-1;;;54272:15:0;;;;;33808:42:1;;33881:2;33866:18;;33859:34;;;54295:15:0;33909:18:1;;;33902:34;-1:-1:-1;;;;;;;;;;;54253:58:0;33796:2:1;33781:18;54253:58:0;33600:342:1;4778:192:0;3951:6;;-1:-1:-1;;;;;3951:6:0;2775:10;4098:23;4090:68;;;;-1:-1:-1;;;4090:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4867:22:0;::::1;4859:73;;;::::0;-1:-1:-1;;;4859:73:0;;15079:2:1;4859:73:0::1;::::0;::::1;15061:21:1::0;15118:2;15098:18;;;15091:30;15157:34;15137:18;;;15130:62;-1:-1:-1;;;15208:18:1;;;15201:36;15254:19;;4859:73:0::1;14877:402:1::0;4859:73:0::1;4943:19;4953:8;4943:9;:19::i;:::-;4778:192:::0;:::o;37716:170::-;37837:30;;;;;37716:170::o;28563:127::-;28628:4;28652:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28652:16:0;:30;;;28563:127::o;32545:174::-;32620:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32620:29:0;-1:-1:-1;;;;;32620:29:0;;;;;;;;:24;;32674:23;32620:24;32674:14;:23::i;:::-;-1:-1:-1;;;;;32665:46:0;;;;;;;;;;;32545:174;;:::o;28857:348::-;28950:4;28975:16;28983:7;28975;:16::i;:::-;28967:73;;;;-1:-1:-1;;;28967:73:0;;19394:2:1;28967:73:0;;;19376:21:1;19433:2;19413:18;;;19406:30;19472:34;19452:18;;;19445:62;-1:-1:-1;;;19523:18:1;;;19516:42;19575:19;;28967:73:0;19192:408:1;28967:73:0;29051:13;29067:23;29082:7;29067:14;:23::i;:::-;29051:39;;29120:5;-1:-1:-1;;;;;29109:16:0;:7;-1:-1:-1;;;;;29109:16:0;;:51;;;;29153:7;-1:-1:-1;;;;;29129:31:0;:20;29141:7;29129:11;:20::i;:::-;-1:-1:-1;;;;;29129:31:0;;29109:51;:87;;;-1:-1:-1;;;;;;25949:25:0;;;25925:4;25949:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29164:32;25828:164;52833:207;52894:13;52917:24;52968:22;52992:18;:7;:16;:18::i;:::-;52951:60;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;52951:60:0;;;;;;;;;;52833:207;-1:-1:-1;;;52833:207:0:o;29547:110::-;29623:26;29633:2;29637:7;29623:26;;;;;;;;;;;;:9;:26::i;36020:217::-;36120:16;36128:7;36120;:16::i;:::-;36112:75;;;;-1:-1:-1;;;36112:75:0;;22651:2:1;36112:75:0;;;22633:21:1;22690:2;22670:18;;;22663:30;22729:34;22709:18;;;22702:62;-1:-1:-1;;;22780:18:1;;;22773:44;22834:19;;36112:75:0;22449:410:1;36112:75:0;36198:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;27935:315::-;28092:28;28102:4;28108:2;28112:7;28092:9;:28::i;:::-;28139:48;28162:4;28168:2;28172:7;28181:5;28139:22;:48::i;:::-;28131:111;;;;-1:-1:-1;;;28131:111:0;;;;;;;:::i;40511:86::-;40569:7;40588:5;40592:1;40588;:5;:::i;31849:578::-;32008:4;-1:-1:-1;;;;;31981:31:0;:23;31996:7;31981:14;:23::i;:::-;-1:-1:-1;;;;;31981:31:0;;31973:85;;;;-1:-1:-1;;;31973:85:0;;27278:2:1;31973:85:0;;;27260:21:1;27317:2;27297:18;;;27290:30;27356:34;27336:18;;;27329:62;-1:-1:-1;;;27407:18:1;;;27400:39;27456:19;;31973:85:0;27076:405:1;31973:85:0;-1:-1:-1;;;;;32077:16:0;;32069:65;;;;-1:-1:-1;;;32069:65:0;;18207:2:1;32069:65:0;;;18189:21:1;18246:2;18226:18;;;18219:30;18285:34;18265:18;;;18258:62;-1:-1:-1;;;18336:18:1;;;18329:34;18380:19;;32069:65:0;18005:400:1;32069:65:0;32251:29;32268:1;32272:7;32251:8;:29::i;:::-;-1:-1:-1;;;;;32293:15:0;;;;;;:9;:15;;;;;:20;;32312:1;;32293:15;:20;;32312:1;;32293:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32324:13:0;;;;;;:9;:13;;;;;:18;;32341:1;;32324:13;:18;;32341:1;;32324:18;:::i;:::-;;;;-1:-1:-1;;32353:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32353:21:0;-1:-1:-1;;;;;32353:21:0;;;;;;;;;32392:27;;32353:16;;32392:27;;;;;;;31849:578;;;:::o;53102:494::-;53155:7;53172:21;:9;37672:19;;37690:1;37672:19;;;37587:121;53172:21;53200:17;53220:19;:9;37557:14;;37465:114;53220:19;53200:39;;53246:22;53271;53283:9;53271:11;:22::i;:::-;53246:47;;53308:18;53327:8;53308:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:37;;:28;:37;;53300:70;;;;-1:-1:-1;;;53300:70:0;;31671:2:1;53300:70:0;;;31653:21:1;31710:2;31690:18;;;31683:30;-1:-1:-1;;;31729:18:1;;;31722:50;31789:18;;53300:70:0;31469:344:1;53300:70:0;53379:32;53389:10;53401:9;53379;:32::i;:::-;53418:33;53431:9;53442:8;53418:12;:33::i;:::-;53478:47;;;;;;;;;;;-1:-1:-1;53478:47:0;;;;;;;53458:17;;;:6;:17;;;;;;;:67;;;;;53478:47;53458:67;;;;;-1:-1:-1;;53458:67:0;;;;;;;;;;53532:28;;:18;;:28;;53551:8;;53532:28;:::i;:::-;;;;;;;;;;;;;;:35;;;;;-1:-1:-1;;53532:35:0;;;;;;;;;-1:-1:-1;53583:9:0;53102:494;-1:-1:-1;;53102:494:0:o;55679:689::-;55848:17;55856:8;55848:7;:17::i;:::-;55840:57;;;;-1:-1:-1;;;55840:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55912:24:0;;55904:60;;;;-1:-1:-1;;;55904:60:0;;16692:2:1;55904:60:0;;;16674:21:1;16731:2;16711:18;;;16704:30;-1:-1:-1;;;16750:18:1;;;16743:52;16812:18;;55904:60:0;16490:346:1;55904:60:0;-1:-1:-1;;;;;55979:22:0;;55971:69;;;;-1:-1:-1;;;55971:69:0;;29686:2:1;55971:69:0;;;29668:21:1;29725:2;29705:18;;;29698:30;29764:34;29744:18;;;29737:62;-1:-1:-1;;;29815:18:1;;;29808:31;29856:19;;55971:69:0;29484:397:1;55971:69:0;56069:8;-1:-1:-1;;;;;56055:22:0;:10;-1:-1:-1;;;;;56055:22:0;;;:49;;;;;56095:9;-1:-1:-1;;;;;56081:23:0;:10;-1:-1:-1;;;;;56081:23:0;;;56055:49;56047:87;;;;-1:-1:-1;;;56047:87:0;;20152:2:1;56047:87:0;;;20134:21:1;20191:2;20171:18;;;20164:30;20230:27;20210:18;;;20203:55;20275:18;;56047:87:0;19950:349:1;56047:87:0;56158:10;56149:5;:19;;56141:47;;;;-1:-1:-1;;;56141:47:0;;11902:2:1;56141:47:0;;;11884:21:1;11941:2;11921:18;;;11914:30;-1:-1:-1;;;11960:18:1;;;11953:45;12015:18;;56141:47:0;11700:339:1;56141:47:0;-1:-1:-1;;;;;56223:25:0;;;56263:28;;;;56255:109;;;;-1:-1:-1;;;56255:109:0;;21353:2:1;56255:109:0;;;21335:21:1;21392:2;21372:18;;;21365:30;;;21431:34;21411:18;;;21404:62;21502:34;21482:18;;;21475:62;-1:-1:-1;;;21553:19:1;;;21546:35;21598:19;;56255:109:0;21151:472:1;56255:109:0;55833:535;55679:689;;;;;;:::o;41137:86::-;41195:7;41214:5;41218:1;41214;:5;:::i;41480:86::-;41538:7;41557:5;41561:1;41557;:5;:::i;43448:143::-;43507:7;43519:9;43531:8;43535:1;43537;43531:3;:8::i;:::-;43519:20;;43542:9;43554:8;43558:1;43560;43554:3;:8::i;:::-;43542:20;;43572:15;43576:8;43580:1;43582;43576:3;:8::i;:::-;43585:1;43572:3;:15::i;:::-;43565:22;43448:143;-1:-1:-1;;;;;43448:143:0:o;40836:86::-;40894:7;40913:5;40917:1;40913;:5;:::i;4978:173::-;5053:6;;;-1:-1:-1;;;;;5070:17:0;;;-1:-1:-1;;;;;;5070:17:0;;;;;;;5103:40;;5053:6;;;5070:17;5053:6;;5103:40;;5034:16;;5103:40;5023:128;4978:173;:::o;23954:334::-;24027:13;24061:16;24069:7;24061;:16::i;:::-;24053:76;;;;-1:-1:-1;;;24053:76:0;;27688:2:1;24053:76:0;;;27670:21:1;27727:2;27707:18;;;27700:30;27766:34;27746:18;;;27739:62;-1:-1:-1;;;27817:18:1;;;27810:45;27872:19;;24053:76:0;27486:411:1;24053:76:0;24142:21;24166:10;24613:9;;;;;;;;;-1:-1:-1;24613:9:0;;;24536:94;24166:10;24142:34;;24218:1;24200:7;24194:21;:25;:86;;;;;;;;;;;;;;;;;24246:7;24255:18;:7;:16;:18::i;:::-;24229:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24187:93;23954:334;-1:-1:-1;;;23954:334:0:o;342:723::-;398:13;619:10;615:53;;-1:-1:-1;;646:10:0;;;;;;;;;;;;-1:-1:-1;;;646:10:0;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:0;;-1:-1:-1;798:2:0;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:0;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:0;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;932:56:0;;;;;;;;-1:-1:-1;1003:11:0;1012:2;1003:11;;:::i;:::-;;;872:154;;29884:321;30014:18;30020:2;30024:7;30014:5;:18::i;:::-;30065:54;30096:1;30100:2;30104:7;30113:5;30065:22;:54::i;:::-;30043:154;;;;-1:-1:-1;;;30043:154:0;;;;;;;:::i;33284:799::-;33439:4;-1:-1:-1;;;;;33460:13:0;;6218:20;6266:8;33456:620;;33496:72;;-1:-1:-1;;;33496:72:0;;-1:-1:-1;;;;;33496:36:0;;;;;:72;;2775:10;;33547:4;;33553:7;;33562:5;;33496:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33496:72:0;;;;;;;;-1:-1:-1;;33496:72:0;;;;;;;;;;;;:::i;:::-;;;33492:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33738:13:0;;33734:272;;33781:60;;-1:-1:-1;;;33781:60:0;;;;;;;:::i;33734:272::-;33956:6;33950:13;33941:6;33937:2;33933:15;33926:38;33492:529;-1:-1:-1;;;;;;33619:51:0;-1:-1:-1;;;33619:51:0;;-1:-1:-1;33612:58:0;;33456:620;-1:-1:-1;34060:4:0;33284:799;;;;;;:::o;30541:382::-;-1:-1:-1;;;;;30621:16:0;;30613:61;;;;-1:-1:-1;;;30613:61:0;;24539:2:1;30613:61:0;;;24521:21:1;;;24558:18;;;24551:30;24617:34;24597:18;;;24590:62;24669:18;;30613:61:0;24337:356:1;30613:61:0;30694:16;30702:7;30694;:16::i;:::-;30693:17;30685:58;;;;-1:-1:-1;;;30685:58:0;;15486:2:1;30685:58:0;;;15468:21:1;15525:2;15505:18;;;15498:30;15564;15544:18;;;15537:58;15612:18;;30685:58:0;15284:352:1;30685:58:0;-1:-1:-1;;;;;30814:13:0;;;;;;:9;:13;;;;;:18;;30831:1;;30814:13;:18;;30831:1;;30814:18;:::i;:::-;;;;-1:-1:-1;;30843:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30843:21:0;-1:-1:-1;;;;;30843:21:0;;;;;;;;30882:33;;30843:16;;;30882:33;;30843:16;;30882:33;30541:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;828:367;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:55;;973:1;970;963:12;922:55;-1:-1:-1;996:20:1;;1039:18;1028:30;;1025:50;;;1071:1;1068;1061:12;1025:50;1108:4;1100:6;1096:17;1084:29;;1168:3;1161:4;1151:6;1148:1;1144:14;1136:6;1132:27;1128:38;1125:47;1122:67;;;1185:1;1182;1175:12;1200:160;1265:20;;1321:13;;1314:21;1304:32;;1294:60;;1350:1;1347;1340:12;1365:163;1432:20;;1492:10;1481:22;;1471:33;;1461:61;;1518:1;1515;1508:12;1533:186;1592:6;1645:2;1633:9;1624:7;1620:23;1616:32;1613:52;;;1661:1;1658;1651:12;1613:52;1684:29;1703:9;1684:29;:::i;1724:260::-;1792:6;1800;1853:2;1841:9;1832:7;1828:23;1824:32;1821:52;;;1869:1;1866;1859:12;1821:52;1892:29;1911:9;1892:29;:::i;:::-;1882:39;;1940:38;1974:2;1963:9;1959:18;1940:38;:::i;:::-;1930:48;;1724:260;;;;;:::o;1989:328::-;2066:6;2074;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;;2222:38;2256:2;2245:9;2241:18;2222:38;:::i;:::-;2212:48;;2307:2;2296:9;2292:18;2279:32;2269:42;;1989:328;;;;;:::o;2322:666::-;2417:6;2425;2433;2441;2494:3;2482:9;2473:7;2469:23;2465:33;2462:53;;;2511:1;2508;2501:12;2462:53;2534:29;2553:9;2534:29;:::i;:::-;2524:39;;2582:38;2616:2;2605:9;2601:18;2582:38;:::i;:::-;2572:48;;2667:2;2656:9;2652:18;2639:32;2629:42;;2722:2;2711:9;2707:18;2694:32;2749:18;2741:6;2738:30;2735:50;;;2781:1;2778;2771:12;2735:50;2804:22;;2857:4;2849:13;;2845:27;-1:-1:-1;2835:55:1;;2886:1;2883;2876:12;2835:55;2909:73;2974:7;2969:2;2956:16;2951:2;2947;2943:11;2909:73;:::i;:::-;2899:83;;;2322:666;;;;;;;:::o;2993:254::-;3058:6;3066;3119:2;3107:9;3098:7;3094:23;3090:32;3087:52;;;3135:1;3132;3125:12;3087:52;3158:29;3177:9;3158:29;:::i;:::-;3148:39;;3206:35;3237:2;3226:9;3222:18;3206:35;:::i;3252:254::-;3320:6;3328;3381:2;3369:9;3360:7;3356:23;3352:32;3349:52;;;3397:1;3394;3387:12;3349:52;3420:29;3439:9;3420:29;:::i;:::-;3410:39;3496:2;3481:18;;;;3468:32;;-1:-1:-1;;;3252:254:1:o;3511:258::-;3578:6;3586;3639:2;3627:9;3618:7;3614:23;3610:32;3607:52;;;3655:1;3652;3645:12;3607:52;3678:29;3697:9;3678:29;:::i;:::-;3668:39;;3726:37;3759:2;3748:9;3744:18;3726:37;:::i;3774:437::-;3860:6;3868;3921:2;3909:9;3900:7;3896:23;3892:32;3889:52;;;3937:1;3934;3927:12;3889:52;3977:9;3964:23;4010:18;4002:6;3999:30;3996:50;;;4042:1;4039;4032:12;3996:50;4081:70;4143:7;4134:6;4123:9;4119:22;4081:70;:::i;:::-;4170:8;;4055:96;;-1:-1:-1;3774:437:1;-1:-1:-1;;;;3774:437:1:o;4216:845::-;4346:6;4354;4362;4370;4378;4431:2;4419:9;4410:7;4406:23;4402:32;4399:52;;;4447:1;4444;4437:12;4399:52;4487:9;4474:23;4516:18;4557:2;4549:6;4546:14;4543:34;;;4573:1;4570;4563:12;4543:34;4612:70;4674:7;4665:6;4654:9;4650:22;4612:70;:::i;:::-;4701:8;;-1:-1:-1;4586:96:1;-1:-1:-1;4789:2:1;4774:18;;4761:32;;-1:-1:-1;4805:16:1;;;4802:36;;;4834:1;4831;4824:12;4802:36;;4873:72;4937:7;4926:8;4915:9;4911:24;4873:72;:::i;:::-;4964:8;;-1:-1:-1;4847:98:1;-1:-1:-1;5018:37:1;;-1:-1:-1;5051:2:1;5036:18;;5018:37;:::i;:::-;5008:47;;4216:845;;;;;;;;:::o;5066:180::-;5122:6;5175:2;5163:9;5154:7;5150:23;5146:32;5143:52;;;5191:1;5188;5181:12;5143:52;5214:26;5230:9;5214:26;:::i;5251:245::-;5309:6;5362:2;5350:9;5341:7;5337:23;5333:32;5330:52;;;5378:1;5375;5368:12;5330:52;5417:9;5404:23;5436:30;5460:5;5436:30;:::i;5501:249::-;5570:6;5623:2;5611:9;5602:7;5598:23;5594:32;5591:52;;;5639:1;5636;5629:12;5591:52;5671:9;5665:16;5690:30;5714:5;5690:30;:::i;5755:450::-;5824:6;5877:2;5865:9;5856:7;5852:23;5848:32;5845:52;;;5893:1;5890;5883:12;5845:52;5933:9;5920:23;5966:18;5958:6;5955:30;5952:50;;;5998:1;5995;5988:12;5952:50;6021:22;;6074:4;6066:13;;6062:27;-1:-1:-1;6052:55:1;;6103:1;6100;6093:12;6052:55;6126:73;6191:7;6186:2;6173:16;6168:2;6164;6160:11;6126:73;:::i;6210:180::-;6269:6;6322:2;6310:9;6301:7;6297:23;6293:32;6290:52;;;6338:1;6335;6328:12;6290:52;-1:-1:-1;6361:23:1;;6210:180;-1:-1:-1;6210:180:1:o;6395:254::-;6463:6;6471;6524:2;6512:9;6503:7;6499:23;6495:32;6492:52;;;6540:1;6537;6530:12;6492:52;6576:9;6563:23;6553:33;;6605:38;6639:2;6628:9;6624:18;6605:38;:::i;6654:248::-;6719:6;6727;6780:2;6768:9;6759:7;6755:23;6751:32;6748:52;;;6796:1;6793;6786:12;6748:52;6832:9;6819:23;6809:33;;6861:35;6892:2;6881:9;6877:18;6861:35;:::i;6907:248::-;6975:6;6983;7036:2;7024:9;7015:7;7011:23;7007:32;7004:52;;;7052:1;7049;7042:12;7004:52;-1:-1:-1;;7075:23:1;;;7145:2;7130:18;;;7117:32;;-1:-1:-1;6907:248:1:o;7160:322::-;7237:6;7245;7253;7306:2;7294:9;7285:7;7281:23;7277:32;7274:52;;;7322:1;7319;7312:12;7274:52;7358:9;7345:23;7335:33;;7415:2;7404:9;7400:18;7387:32;7377:42;;7438:38;7472:2;7461:9;7457:18;7438:38;:::i;:::-;7428:48;;7160:322;;;;;:::o;7487:184::-;7545:6;7598:2;7586:9;7577:7;7573:23;7569:32;7566:52;;;7614:1;7611;7604:12;7566:52;7637:28;7655:9;7637:28;:::i;7676:252::-;7743:6;7751;7804:2;7792:9;7783:7;7779:23;7775:32;7772:52;;;7820:1;7817;7810:12;7772:52;7843:28;7861:9;7843:28;:::i;7933:257::-;7974:3;8012:5;8006:12;8039:6;8034:3;8027:19;8055:63;8111:6;8104:4;8099:3;8095:14;8088:4;8081:5;8077:16;8055:63;:::i;:::-;8172:2;8151:15;-1:-1:-1;;8147:29:1;8138:39;;;;8179:4;8134:50;;7933:257;-1:-1:-1;;7933:257:1:o;8195:185::-;8237:3;8275:5;8269:12;8290:52;8335:6;8330:3;8323:4;8316:5;8312:16;8290:52;:::i;:::-;8358:16;;;;;8195:185;-1:-1:-1;;8195:185:1:o;8385:276::-;8516:3;8554:6;8548:13;8570:53;8616:6;8611:3;8604:4;8596:6;8592:17;8570:53;:::i;:::-;8639:16;;;;;8385:276;-1:-1:-1;;8385:276:1:o;8666:470::-;8845:3;8883:6;8877:13;8899:53;8945:6;8940:3;8933:4;8925:6;8921:17;8899:53;:::i;:::-;9015:13;;8974:16;;;;9037:57;9015:13;8974:16;9071:4;9059:17;;9037:57;:::i;:::-;9110:20;;8666:470;-1:-1:-1;;;;8666:470:1:o;9141:1174::-;9317:3;9346:1;9379:6;9373:13;9409:3;9431:1;9459:9;9455:2;9451:18;9441:28;;9519:2;9508:9;9504:18;9541;9531:61;;9585:4;9577:6;9573:17;9563:27;;9531:61;9611:2;9659;9651:6;9648:14;9628:18;9625:38;9622:165;;;-1:-1:-1;;;9686:33:1;;9742:4;9739:1;9732:15;9772:4;9693:3;9760:17;9622:165;9803:18;9830:104;;;;9948:1;9943:320;;;;9796:467;;9830:104;-1:-1:-1;;9863:24:1;;9851:37;;9908:16;;;;-1:-1:-1;9830:104:1;;9943:320;35038:1;35031:14;;;35075:4;35062:18;;10038:1;10052:165;10066:6;10063:1;10060:13;10052:165;;;10144:14;;10131:11;;;10124:35;10187:16;;;;10081:10;;10052:165;;;10056:3;;10246:6;10241:3;10237:16;10230:23;;9796:467;;;;;;;10279:30;10305:3;10297:6;10279:30;:::i;10528:488::-;-1:-1:-1;;;;;10797:15:1;;;10779:34;;10849:15;;10844:2;10829:18;;10822:43;10896:2;10881:18;;10874:34;;;10944:3;10939:2;10924:18;;10917:31;;;10722:4;;10965:45;;10990:19;;10982:6;10965:45;:::i;:::-;10957:53;10528:488;-1:-1:-1;;;;;;10528:488:1:o;11476:219::-;11625:2;11614:9;11607:21;11588:4;11645:44;11685:2;11674:9;11670:18;11662:6;11645:44;:::i;13161:403::-;13363:2;13345:21;;;13402:2;13382:18;;;13375:30;13441:34;13436:2;13421:18;;13414:62;-1:-1:-1;;;13507:2:1;13492:18;;13485:37;13554:3;13539:19;;13161:403::o;14458:414::-;14660:2;14642:21;;;14699:2;14679:18;;;14672:30;14738:34;14733:2;14718:18;;14711:62;-1:-1:-1;;;14804:2:1;14789:18;;14782:48;14862:3;14847:19;;14458:414::o;17249:342::-;17451:2;17433:21;;;17490:2;17470:18;;;17463:30;-1:-1:-1;;;17524:2:1;17509:18;;17502:48;17582:2;17567:18;;17249:342::o;18764:423::-;18966:2;18948:21;;;19005:2;18985:18;;;18978:30;19044:34;19039:2;19024:18;;19017:62;19115:29;19110:2;19095:18;;19088:57;19177:3;19162:19;;18764:423::o;19605:340::-;19807:2;19789:21;;;19846:2;19826:18;;;19819:30;-1:-1:-1;;;19880:2:1;19865:18;;19858:46;19936:2;19921:18;;19605:340::o;23266:345::-;23468:2;23450:21;;;23507:2;23487:18;;;23480:30;-1:-1:-1;;;23541:2:1;23526:18;;23519:51;23602:2;23587:18;;23266:345::o;24698:351::-;24900:2;24882:21;;;24939:2;24919:18;;;24912:30;24978:29;24973:2;24958:18;;24951:57;25040:2;25025:18;;24698:351::o;26300:356::-;26502:2;26484:21;;;26521:18;;;26514:30;26580:34;26575:2;26560:18;;26553:62;26647:2;26632:18;;26300:356::o;29886:413::-;30088:2;30070:21;;;30127:2;30107:18;;;30100:30;30166:34;30161:2;30146:18;;30139:62;-1:-1:-1;;;30232:2:1;30217:18;;30210:47;30289:3;30274:19;;29886:413::o;30652:407::-;30854:2;30836:21;;;30893:2;30873:18;;;30866:30;30932:34;30927:2;30912:18;;30905:62;-1:-1:-1;;;30998:2:1;30983:18;;30976:41;31049:3;31034:19;;30652:407::o;31064:400::-;31266:2;31248:21;;;31305:2;31285:18;;;31278:30;31344:34;31339:2;31324:18;;31317:62;-1:-1:-1;;;31410:2:1;31395:18;;31388:34;31454:3;31439:19;;31064:400::o;35091:128::-;35131:3;35162:1;35158:6;35155:1;35152:13;35149:39;;;35168:18;;:::i;:::-;-1:-1:-1;35204:9:1;;35091:128::o;35224:120::-;35264:1;35290;35280:35;;35295:18;;:::i;:::-;-1:-1:-1;35329:9:1;;35224:120::o;35349:168::-;35389:7;35455:1;35451;35447:6;35443:14;35440:1;35437:21;35432:1;35425:9;35418:17;35414:45;35411:71;;;35462:18;;:::i;:::-;-1:-1:-1;35502:9:1;;35349:168::o;35522:125::-;35562:4;35590:1;35587;35584:8;35581:34;;;35595:18;;:::i;:::-;-1:-1:-1;35632:9:1;;35522:125::o;35652:258::-;35724:1;35734:113;35748:6;35745:1;35742:13;35734:113;;;35824:11;;;35818:18;35805:11;;;35798:39;35770:2;35763:10;35734:113;;;35865:6;35862:1;35859:13;35856:48;;;-1:-1:-1;;35900:1:1;35882:16;;35875:27;35652:258::o;35915:380::-;35994:1;35990:12;;;;36037;;;36058:61;;36112:4;36104:6;36100:17;36090:27;;36058:61;36165:2;36157:6;36154:14;36134:18;36131:38;36128:161;;;36211:10;36206:3;36202:20;36199:1;36192:31;36246:4;36243:1;36236:15;36274:4;36271:1;36264:15;36128:161;;35915:380;;;:::o;36300:135::-;36339:3;-1:-1:-1;;36360:17:1;;36357:43;;;36380:18;;:::i;:::-;-1:-1:-1;36427:1:1;36416:13;;36300:135::o;36440:112::-;36472:1;36498;36488:35;;36503:18;;:::i;:::-;-1:-1:-1;36537:9:1;;36440:112::o;36557:127::-;36618:10;36613:3;36609:20;36606:1;36599:31;36649:4;36646:1;36639:15;36673:4;36670:1;36663:15;36689:127;36750:10;36745:3;36741:20;36738:1;36731:31;36781:4;36778:1;36771:15;36805:4;36802:1;36795:15;36821:127;36882:10;36877:3;36873:20;36870:1;36863:31;36913:4;36910:1;36903:15;36937:4;36934:1;36927:15;36953:127;37014:10;37009:3;37005:20;37002:1;36995:31;37045:4;37042:1;37035:15;37069:4;37066:1;37059:15;37085:127;37146:10;37141:3;37137:20;37134:1;37127:31;37177:4;37174:1;37167:15;37201:4;37198:1;37191:15;37217:131;-1:-1:-1;;;;;;37291:32:1;;37281:43;;37271:71;;37338:1;37335;37328:12

Swarm Source

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