ETH Price: $2,400.38 (-1.00%)

Token

Ecoz (ECOZ)
 

Overview

Max Total Supply

0 ECOZ

Holders

21

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
dreuseff.eth
Balance
6 ECOZ
0x6904dfa88d5345dc7e2de0e1eba32a6c1e672b93
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:
Ecozsystem

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-02-04
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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


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


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


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


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


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


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


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

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

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

pragma solidity >=0.7.0 <0.9.0;

interface IJag {
    function jagRandomizer(address user, uint256 jagID) external returns(uint256);
    function jaguarTokenURI(uint256 jagID, uint256 jagWeight) external view returns(string memory);
}

interface IBuck {
    function buckRandomizer(address user, uint256 buckID) external returns(uint256); 
    function bushBuckTokenURI(uint256 buckID, uint256 buckWeight) external view returns(string memory);
}

interface ITree {
    function treeRandomizer(address user, uint256 treeID) external returns(uint256); 
    function bananaTreeTokenURI(uint256 treeID, uint256 treeWeight) external view returns(string memory);
}

//--------------------------------------------------------------------------------------------------------//
//                           _________      _______    _________    ____________                          //                                  
//                          /         \    /       \  /         \  |            ]                         //
//                         |     _____|   /    ____/ |    ___    | |_____       ]                         //
//                         |    [        /    /      |   /   \   |       ]     /                          //
//                         |    [______ |    [       |  |     |  |      /     /                           //
//                         |          | |    |       |  |     |  |     /     /                            //
//                         |     _____| |    |       |  |     |  |    /     /                             //
//                         |    [       |    [       |  |     |  |   /     /                              //
//                         |    [_____   \    \____  |   \___/   |  /     [_____                          //
//                         |          |   \        \ |           | [            |                         //
//                          \_________/    \_______/  \_________/  [____________|                         //
//                                                                                                        //         
/*--------------------------------------------------------------------------------------------------------//
// We would like to give a tribute to Anonymice for providing us the inspiration and methods to write the //
//  Ecoz contract. They were truly way ahead of their time and have chagned on chain innovation forever.  //                    
//--------------------------------------------------------------------------------------------------------*/

contract Ecoz is ERC721, Ownable {
    using Strings for uint256;

    IJag public jaguarsURI;
 	IBuck public bushBucksURI;
 	ITree public bananaTreesURI;
    
    uint256 public cost = 0.066 ether;
    uint256 public maxMintAmount = 4;
    uint256 public maxJagSupply = 150;
    uint256 public maxBuckSupply = 300;
    uint256 public maxTreeSupply = 600;
    uint256 jagSupply;
    uint256 buckSupply;
    uint256 treeSupply;

    bool ogSale = false;
    bool whitelistSale = false;
    bool publicSale = false;

    mapping (uint256 => uint256) public weightJaguar;
    mapping (uint256 => uint256) public weightBushBuck;
    mapping (uint256 => uint256) public weightBananaTree;

    mapping (address => uint256) balanceJaguar;
    mapping (address => uint256) balanceBushBuck;
    mapping (address => uint256) balanceBananaTree;
    mapping (address => uint256) weightOfOwner;
    mapping (address => uint256) jagMinted;
    mapping (address => uint256) buckMinted;
    mapping (address => uint256) treeMinted;
     
    mapping(address => bool) public ogAddress;
    mapping(address => bool) public wlAddress;
    
    constructor(address jagAddress, address buckAddress, address treeAddress) ERC721("Ecoz","ECOZ") {
		jaguarsURI = IJag(jagAddress);
		bushBucksURI = IBuck(buckAddress);
		bananaTreesURI = ITree(treeAddress);
	}
                /*----------------------//
                //  MINTING FUNCTIONS   //
                //----------------------*/

    function MintJaguar(uint256 mintAmount) public payable {  
        require(jagSupply + mintAmount <= maxJagSupply,          "Over max supply");
        require(msg.value == cost * mintAmount,        "Ether sent is not correct");

        if (ogSale == true) {   
            require(ogAddress[msg.sender] == true,                                                                          "This addres is not an OG");
            require(jagMinted[msg.sender] + buckMinted[msg.sender] + treeMinted[msg.sender] + mintAmount <= maxMintAmount,  "max amount of Ecoz minted");
            require(jagMinted[msg.sender] + mintAmount <= 2,                                                                "Only 2 mints per species allowed");
        }
        else if (whitelistSale == true) {
            require((ogAddress[msg.sender] == true) || (wlAddress[msg.sender] == true),                                     "This address is not whitelisted");
            require(jagMinted[msg.sender] + buckMinted[msg.sender] + treeMinted[msg.sender] + mintAmount <= maxMintAmount,  "max amount of Ecoz minted");
            require(jagMinted[msg.sender] + mintAmount <= 2,                                                                "Only 2 mints per species allowed");
        }
        else {
            require(publicSale == true,              "Public sale has not started");
        }

        for (uint256 i = 1; i <= mintAmount; i++) {
            jagSupply++;
            weightJaguar[jagSupply] = jaguarsURI.jagRandomizer(msg.sender, jagSupply);
            jagMinted[msg.sender]++;
            balanceJaguar[msg.sender]++;
            weightOfOwner[msg.sender] = weightOfOwner[msg.sender] + weightJaguar[jagSupply];
            _mint(msg.sender, jagSupply);
        }
    }
    
    function MintBushBuck(uint256 mintAmount) public payable { 
        require(buckSupply + mintAmount <= maxBuckSupply,         "Over max supply");
        require(msg.value == cost * mintAmount,         "Ether sent is not correct");

        if (ogSale == true) {   
            require(ogAddress[msg.sender] == true,                                                                          "This addres is not an OG");
            require(jagMinted[msg.sender] + buckMinted[msg.sender] + treeMinted[msg.sender] + mintAmount <= maxMintAmount,  "max amount of Ecoz minted");
            require(buckMinted[msg.sender] + mintAmount <= 2,                                                               "Only 2 mints per species allowed");
        }
        else if (whitelistSale == true) {
            require((ogAddress[msg.sender] == true) || (wlAddress[msg.sender] == true),                                     "This address is not whitelisted");
            require(jagMinted[msg.sender] + buckMinted[msg.sender] + treeMinted[msg.sender] + mintAmount <= maxMintAmount,  "max amount of Ecoz minted");
            require(buckMinted[msg.sender] + mintAmount <= 2,                                                               "Only 2 mints per species allowed");
        }
        else {
            require(publicSale == true,               "Public sale has not started");
        }

        for (uint256 i = 1; i <= mintAmount; i++) {
            buckSupply++;
            weightBushBuck[buckSupply + 1350] = bushBucksURI.buckRandomizer(msg.sender, buckSupply + 1350);
            buckMinted[msg.sender]++;
            balanceBushBuck[msg.sender]++;
            weightOfOwner[msg.sender] = weightOfOwner[msg.sender] + weightBushBuck[buckSupply + 1350];
            _mint(msg.sender, buckSupply + 1350);
        }
    }
    
    function MintBananaTree(uint256 mintAmount) public payable {       
        require(treeSupply + mintAmount <= maxTreeSupply,          "Over max supply");
        require(msg.value == cost * mintAmount,          "Ether sent is not correct");

        if (ogSale == true) {   
            require(ogAddress[msg.sender] == true,                                                                          "This addres is not an OG");
            require(jagMinted[msg.sender] + buckMinted[msg.sender] + treeMinted[msg.sender] + mintAmount <= maxMintAmount,  "max amount of Ecoz minted");
            require(treeMinted[msg.sender] + mintAmount <= 2,                                                               "Only 2 mints per species allowed");
        }
        else if (whitelistSale == true) {
            require((ogAddress[msg.sender] == true) || (wlAddress[msg.sender] == true),                                     "This address is not whitelisted");
            require(jagMinted[msg.sender] + buckMinted[msg.sender] + treeMinted[msg.sender] + mintAmount <= maxMintAmount,  "max amount of Ecoz minted");
            require(treeMinted[msg.sender] + mintAmount <= 2,                                                               "Only 2 mints per species allowed");
        }
        else {
            require(publicSale == true,                "Public sale has not started");
        }

        for (uint256 i = 1; i <= mintAmount; i++) {
            treeSupply++;
            weightBananaTree[treeSupply + 4050] = bananaTreesURI.treeRandomizer(msg.sender, treeSupply + 4050);
            treeMinted[msg.sender]++;
            balanceBananaTree[msg.sender]++;
            weightOfOwner[msg.sender] = weightOfOwner[msg.sender] + weightBananaTree[treeSupply + 4050];
            _mint(msg.sender, treeSupply + 4050);
        }
    }
                /*----------------------//
                //   OWNER FUNCTIONS    //
                //----------------------*/

    function ownerMint(uint256 species, uint256 amt) public onlyOwner {
        if (species == 0) {
            require(jagSupply + amt <= maxJagSupply);
            for (uint256 i = 1; i <= amt; i++) {
                jagSupply++;
                weightJaguar[jagSupply] = jaguarsURI.jagRandomizer(msg.sender, jagSupply);
                balanceJaguar[msg.sender]++;
                weightOfOwner[msg.sender] = weightOfOwner[msg.sender] + weightJaguar[jagSupply];
                _mint(msg.sender, jagSupply);
            }   
        }
        else if (species == 1) {
            require(buckSupply + amt <= maxBuckSupply);
            for (uint256 i = 1; i <= amt; i++) {
                buckSupply++;
                weightBushBuck[buckSupply + 1350] = bushBucksURI.buckRandomizer(msg.sender, buckSupply + 1350);
                balanceBushBuck[msg.sender]++;
                weightOfOwner[msg.sender] = weightOfOwner[msg.sender] + weightBushBuck[buckSupply + 1350];
                _mint(msg.sender, buckSupply + 1350);
            }
        }
        else {
            require(treeSupply + amt <= maxTreeSupply);
            for (uint256 i = 1; i <= amt; i++) {
                treeSupply++;
                weightBananaTree[treeSupply + 4050] = bananaTreesURI.treeRandomizer(msg.sender, treeSupply + 4050);
                balanceBananaTree[msg.sender]++;
                weightOfOwner[msg.sender] = weightOfOwner[msg.sender] + weightBananaTree[treeSupply + 4050];
                _mint(msg.sender, treeSupply + 4050);
            }
        }
    }

    function setCost(uint256 newCost) public onlyOwner {
        cost = newCost;
    }

    function setMaxMintAmount(uint256 newMaxMintAmount) public onlyOwner {
        maxMintAmount = newMaxMintAmount;
    }

    function toggleOGSale() public onlyOwner {
        if (ogSale == true) {
            ogSale = false;
        }
        else {
            ogSale = true;
        }
    }

    function toggleWhitelistSale() public onlyOwner {
        if (whitelistSale == true) {
            whitelistSale = false;
        }
        else {
            whitelistSale = true;
            maxMintAmount = 2;
        }
    }

    function togglePublicSale() public onlyOwner {
        if (publicSale == true) {
            publicSale = false;
        }
        else {
            publicSale = true;
            maxMintAmount = 3;
        }
    }
    
    function addWhitelistBundle(address[] memory wlBundle) public onlyOwner {
        for (uint256 i = 0; i < wlBundle.length; i++) {
            wlAddress[wlBundle[i]] = true;
        }
    }

    function addOGBundle(address[] memory ogBundle) public onlyOwner {
        for (uint256 i = 0; i < ogBundle.length; i++) {
            ogAddress[ogBundle[i]] = true;    
        }
    }

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

interface IThrive {
    function burn(address from, uint256 amount) external;
    function updateThrive(address from, address to) external;
    function levelUpdate(address user) external;
} 
                /*----------------------//
                //  BREEDING FUNCTIONS  //
                //----------------------*/

contract Ecozsystem is Ecoz {
    
    IThrive public Thrive;

    uint256 public babyJagSupply = 0;
    uint256 public babyBuckSupply = 0;
    uint256 public babyTreeSupply = 0;
    uint256 public maxBabyJagSupply = 450;
    uint256 public maxBabyBuckSupply = 900;
    uint256 public maxBabyTreeSupply = 1800;
    uint256 public breedCostJag = 600;
    uint256 public breedCostBuck = 480;
    uint256 public breedCostTree = 360;

    bool public breedingPaused = false;

    uint256 [] populationRange = [1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12];
    uint256 [] jagRangeOver =    [605, 610, 615, 620, 625, 630, 635, 640, 645, 650, 655, 660, 690];
    uint256 [] jagRangeUnder =   [595, 590, 585, 580, 575, 570, 565, 560, 555, 550, 545, 540, 510];
    uint256 [] buckRangeOver =   [485, 490, 495, 500, 505, 510, 515, 520, 525, 530, 535, 540, 570];
    uint256 [] buckRangeUnder =  [475, 470, 465, 460, 455, 450, 445, 440, 435, 430, 425, 420, 390];
    uint256 [] treeRangeOver =   [365, 370, 375, 380, 385, 390, 395, 400, 405, 410, 415, 420, 450];
    uint256 [] treeRangeUnder =  [355, 350, 345, 340, 335, 330, 325, 320, 315, 310, 305, 300, 270];

    mapping(uint256 => uint256) public level;
    uint8 public maxLevel = 3;
    
    constructor(address jagAddress, address buckAddress, address treeAddress) Ecoz(jagAddress,buckAddress,treeAddress) {}
    
    function BreedJaguar() public {
        require(breedingPaused == false,                    "Breeding is temporarily paused");
        require(balanceJaguar[msg.sender] >= 2,             "Must own two genesis jaguars to breed");
        require(babyJagSupply + 1 <= maxBabyJagSupply,      "Max amount of jaguars bred");
    
        Thrive.burn(msg.sender, (breedCostJag * 1000000000000000000));
        babyJagSupply++;
        weightJaguar[babyJagSupply + 450] = jaguarsURI.jagRandomizer(msg.sender, babyJagSupply + 450);
        _mint(msg.sender, babyJagSupply + 450);
        updateBreedCosts();
    }
    
    function BreedBushBuck() public {
        require(breedingPaused == false,                    "Breeding is temporarily paused");
        require(balanceBushBuck[msg.sender] >= 2,           "Must own two genesis bush bucks to breed");
        require(babyBuckSupply + 1 <= maxBabyBuckSupply,    "Max amount of bush bucks bred");
        
        Thrive.burn(msg.sender, (breedCostBuck * 1000000000000000000));
        babyBuckSupply++;
        weightBushBuck[babyBuckSupply + 2250] = bushBucksURI.buckRandomizer(msg.sender, babyBuckSupply + 2250);
        _mint(msg.sender, babyBuckSupply + 2250);
        updateBreedCosts();
    }
    
    function BreedBananaTree() public {
        require(breedingPaused == false,                    "Breeding is temporarily paused");
        require(balanceBananaTree[msg.sender] >= 2,         "Must own two genesis banana trees to breed");
        require(babyTreeSupply + 1 <= maxBabyTreeSupply,    "Max amount of banana trees bred");     
    
        Thrive.burn(msg.sender, (breedCostTree * 1000000000000000000));
        babyTreeSupply++;
        weightBananaTree[babyTreeSupply + 5850] = bananaTreesURI.treeRandomizer(msg.sender, babyTreeSupply + 5850);
        _mint(msg.sender, babyTreeSupply + 5850);
        updateBreedCosts();
    }

    function upgrade(uint256 ecozID, uint8 numLevels) public {
        require(msg.sender == ownerOf(ecozID));
        if (ecozID > 0 && ecozID <= 450) {
            require(level[ecozID] + numLevels <= maxLevel);
            for(uint8 i; i < numLevels; i++) {
                Thrive.levelUpdate(msg.sender);
                weightJaguar[ecozID] = weightJaguar[ecozID] + 4;
                level[ecozID] = level[ecozID] + 1;
                Thrive.burn(msg.sender, ((breedCostJag - (breedCostJag % 3)) / 3) * 1000000000000000000);
            }
        }
        else if (ecozID > 1350 && ecozID <= 2250) {
            require(level[ecozID] + numLevels <= maxLevel);
            for(uint8 i; i < numLevels; i++) {
                Thrive.levelUpdate(msg.sender);
                weightBushBuck[ecozID] = weightBushBuck[ecozID] + 3;
                level[ecozID] = level[ecozID] + 1;
                Thrive.burn(msg.sender, ((breedCostBuck - (breedCostBuck % 3)) / 3) * 1000000000000000000);
            }
        }
        else if (ecozID > 4050 && ecozID <= 5850) {
            require(level[ecozID] + numLevels <= maxLevel);
            for(uint8 i; i < numLevels; i++) {
                Thrive.levelUpdate(msg.sender);
                weightBananaTree[ecozID] = weightBananaTree[ecozID] + 2;
                level[ecozID] = level[ecozID] + 1;
                Thrive.burn(msg.sender, ((breedCostTree - (breedCostTree % 3)) / 3) * 1000000000000000000);
            }
        }
        else {
            revert();
        }
    }
    
    function toggleBreeding() public onlyOwner {
        if (breedingPaused == true) {
            breedingPaused = false;
        }
        else {
            breedingPaused = true;
        }
    }

    function setThrive(address thriveAddress) external onlyOwner {
        Thrive = IThrive(thriveAddress);
    }

    function transferFrom(address from, address to, uint256 tokenID) public override {
        if (tokenID <= 1350) {
            if (tokenID <= 450) {
                Thrive.updateThrive(from, to);
                balanceJaguar[from]--;
                balanceJaguar[to]++;
                weightOfOwner[from] = weightOfOwner[from] - weightJaguar[tokenID];
                weightOfOwner[to] = weightOfOwner[to] + weightJaguar[tokenID];
            }

            ERC721.transferFrom(from, to, tokenID);
        }
        else if ((tokenID > 1350) && (tokenID <= 4050)) {
            if (tokenID <= 2250) {
                Thrive.updateThrive(from, to);
                balanceBushBuck[from]--;
                balanceBushBuck[to]++;
                weightOfOwner[from] = weightOfOwner[from] - weightBushBuck[tokenID];
                weightOfOwner[to] = weightOfOwner[to] + weightBushBuck[tokenID];
            }

            ERC721.transferFrom(from, to, tokenID);
        }
        else if (tokenID > 4050) {
            if (tokenID <= 5850) {
                Thrive.updateThrive(from, to);
                balanceBananaTree[from]--;
                balanceBananaTree[to]++;
                weightOfOwner[from] = weightOfOwner[from] - weightBananaTree[tokenID];
                weightOfOwner[to] = weightOfOwner[to] + weightBananaTree[tokenID];
            }

            ERC721.transferFrom(from, to, tokenID);
        }
    }

    function safeTransferFrom(address from, address to, uint256 tokenID) public override {
        if (tokenID <= 1350) {
            if (tokenID <= 450) {
                Thrive.updateThrive(from, to);
                balanceJaguar[from]--;
                balanceJaguar[to]++;
                weightOfOwner[from] = weightOfOwner[from] - weightJaguar[tokenID];
                weightOfOwner[to] = weightOfOwner[to] + weightJaguar[tokenID];
            }
                
            ERC721.safeTransferFrom(from, to, tokenID);
        }
        else if ((tokenID > 1350) && (tokenID <= 4050)) {
            if (tokenID <= 2250) {
                Thrive.updateThrive(from, to);
                balanceBushBuck[from]--;
                balanceBushBuck[to]++;
                weightOfOwner[from] = weightOfOwner[from] - weightBushBuck[tokenID];
                weightOfOwner[to] = weightOfOwner[to] + weightBushBuck[tokenID];
            }
                
            ERC721.safeTransferFrom(from, to, tokenID);
        }
        else if (tokenID > 4050) {
            if (tokenID <= 5850) {
                Thrive.updateThrive(from, to);
                balanceBananaTree[from]--;
                balanceBananaTree[to]++;
                weightOfOwner[from] = weightOfOwner[from] - weightBananaTree[tokenID];
                weightOfOwner[to] = weightOfOwner[to] + weightBananaTree[tokenID];
            }
                
            ERC721.safeTransferFrom(from, to, tokenID);
        }
    } 
                /*----------------------//
                //    READ FUNCTIONS    //
                //----------------------*/

    function jaguarPopulation() public view returns(uint256) {
        return jagSupply + babyJagSupply;
    }

     function bushBuckPopulation() public view returns(uint256) {
        return buckSupply + babyBuckSupply;
    }

     function bananaTreePopulation() public view returns(uint256) {
        return treeSupply + babyTreeSupply;
    }

    function totalPopulation() public view returns(uint256) {
        return jagSupply + buckSupply + treeSupply + babyJagSupply + babyBuckSupply + babyTreeSupply;
    }

    function getWeight(address user) external view returns(uint256) {
        require(msg.sender == address(Thrive));
        return weightOfOwner[user];
    }

    function tokenURI(uint256 tokenID) public view virtual override returns(string memory) {
        require((tokenID != 0) && (tokenID <= 9450),   "Ecoz TokenID does not exist");

        if (tokenID <= 1350) {
            return jaguarsURI.jaguarTokenURI(tokenID, weightJaguar[tokenID]);
        }
        else if ((tokenID > 1350) && (tokenID <= 4050)) {
            return bushBucksURI.bushBuckTokenURI(tokenID, weightBushBuck[tokenID]);
        }
        else {
            return bananaTreesURI.bananaTreeTokenURI(tokenID, weightBananaTree[tokenID]);
        }
    }
    
    //Simplified implementation of the Lotka-Volterra equations used to model predator/prey interactions in nature.
    function updateBreedCosts() internal {
        uint256 jagPopulation = jaguarPopulation();
        uint256 buckPopulation = bushBuckPopulation();
        uint256 treePopulation = bananaTreePopulation();
        
        if (((jagPopulation * 2) >= buckPopulation) && ((buckPopulation * 2) >= treePopulation)) {
            uint256 a = (jagPopulation * 2) - buckPopulation;
            uint256 b = (buckPopulation * 2) - treePopulation;
            for (uint8 i; i < populationRange.length; i++) {
                if (a == 0) {
                    breedCostJag = 600;
                    break;
                }
                if (a == populationRange[i]) {
                    breedCostJag = jagRangeOver[i];
                    break;
                }
                if (a > populationRange[11]) {
                    breedCostJag = jagRangeOver[12];
                    break;
                }
            }
            for (uint8 j; j < populationRange.length; j++) {
                if (b == 0) {
                    breedCostBuck = 480;
                    breedCostTree = 360;
                    break;
                }
                if (b == populationRange[j]) {
                    breedCostBuck = buckRangeOver[j];
                    breedCostTree = treeRangeUnder[j];
                    break;
                }
                if (b > populationRange[11]) {
                    breedCostBuck = buckRangeOver[12];
                    breedCostTree = treeRangeUnder[12];
                    break;
                }
            }
        }
        else if (((jagPopulation * 2) < buckPopulation) && ((buckPopulation * 2) < treePopulation)) {
            uint256 a = buckPopulation - (jagPopulation * 2);
            uint256 b = treePopulation - (buckPopulation * 2);
            for (uint8 i; i < populationRange.length; i++) {
                if (a == populationRange[i]) {
                    breedCostJag = jagRangeUnder[i];
                    break;
                }
                if (a > populationRange[11]) {
                    breedCostJag = jagRangeUnder[12];
                    break;
                }
            }
            for (uint8 j; j < populationRange.length; j++) {
                if (b == populationRange[j]) {
                    breedCostBuck = buckRangeUnder[j];
                    breedCostTree = treeRangeOver[j];
                    break;
                }
                if (b > populationRange[11]) {
                    breedCostBuck = buckRangeUnder[12];
                    breedCostTree = treeRangeOver[12];
                    break;
                }
            }
        }
        else if (((jagPopulation * 2) >= buckPopulation) && ((buckPopulation * 2) < treePopulation)) {
            uint256 a = (jagPopulation * 2) - buckPopulation;
            uint256 b = treePopulation - (buckPopulation * 2);
            for (uint8 i; i < populationRange.length; i++) {
                if (a == 0) {
                    breedCostJag = 600;
                    break;
                }
                if (a == populationRange[i]) {
                    breedCostJag = jagRangeOver[i];
                    break;
                }
                if (a > populationRange[11]) {
                    breedCostJag = jagRangeOver[12];
                    break;
                }
            }
            for (uint8 j; j < populationRange.length; j++) {
                if (b == populationRange[j]) {
                    breedCostBuck = buckRangeUnder[j];
                    breedCostTree = treeRangeOver[j];
                    break;
                }
                if (b > populationRange[11]) {
                    breedCostBuck = buckRangeUnder[12];
                    breedCostTree = treeRangeOver[12];
                    break;
                }
            }
        }
        else if (((jagPopulation * 2) < buckPopulation) && ((buckPopulation * 2) >= treePopulation)) {
            uint256 a = buckPopulation - (jagPopulation * 2);
            uint256 b = (buckPopulation * 2) - treePopulation;
            for (uint8 i; i < populationRange.length; i++) {
                if (a == populationRange[i]) {
                    breedCostJag = jagRangeUnder[i];
                    break;
                }
                if (a > populationRange[11]) {
                    breedCostJag = jagRangeUnder[12];
                    break;
                }
            }
            for (uint8 j; j < populationRange.length; j++) {
                if (b == 0) {
                    breedCostBuck = 480;
                    breedCostTree = 360;
                    break;
                }
                if (b == populationRange[j]) {
                    breedCostBuck = buckRangeOver[j];
                    breedCostTree = treeRangeUnder[j];
                    break;
                }
                if (b > populationRange[11]) {
                    breedCostBuck = buckRangeOver[12];
                    breedCostTree = treeRangeUnder[12];
                    break;
                }
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"jagAddress","type":"address"},{"internalType":"address","name":"buckAddress","type":"address"},{"internalType":"address","name":"treeAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BreedBananaTree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BreedBushBuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BreedJaguar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"MintBananaTree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"MintBushBuck","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"MintJaguar","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"Thrive","outputs":[{"internalType":"contract IThrive","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"ogBundle","type":"address[]"}],"name":"addOGBundle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wlBundle","type":"address[]"}],"name":"addWhitelistBundle","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":[],"name":"babyBuckSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"babyJagSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"babyTreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bananaTreePopulation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bananaTreesURI","outputs":[{"internalType":"contract ITree","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breedCostBuck","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breedCostJag","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breedCostTree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breedingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bushBuckPopulation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bushBucksURI","outputs":[{"internalType":"contract IBuck","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getWeight","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":[],"name":"jaguarPopulation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jaguarsURI","outputs":[{"internalType":"contract IJag","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"level","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBabyBuckSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBabyJagSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBabyTreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuckSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxJagSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLevel","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ogAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"species","type":"uint256"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"uint256","name":"newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"thriveAddress","type":"address"}],"name":"setThrive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleBreeding","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleOGSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPopulation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ecozID","type":"uint256"},{"internalType":"uint8","name":"numLevels","type":"uint8"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"weightBananaTree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"weightBushBuck","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"weightJaguar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wlAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

66ea7aa67b2d0000600a9081556004600b8181556096600c90815561012c600d55610258600e8190556012805462ffffff191690556000602081905560218190556022556101c26023556103846024556107086025556026556101e060278190556101686028556029805460ff1916905561020060405260016080908152600260a052600360c05260e0949094526005610100526006610120526007610140526008610160526009610180526101a0949094526101c09190915291829052620000cc91602a91906200055f565b50604080516101a08101825261025d815261026260208201526102679181019190915261026c6060820152610271608082015261027660a082015261027b60c082015261028060e082015261028561010082015261028a61012082015261028f6101408201526102946101608201526102b26101808201526200015490602b90600d620005b4565b50604080516101a081018252610253815261024e602082015261024991810191909152610244606082015261023f608082015261023a60a082015261023560c082015261023060e082015261022b61010082015261022661012082015261022161014082015261021c6101608201526101fe610180820152620001dc90602c90600d620005b4565b50604080516101a0810182526101e581526101ea60208201526101ef918101919091526101f460608201526101f960808201526101fe60a082015261020360c082015261020860e082015261020d61010082015261021261012082015261021761014082015261021c61016082015261023a6101808201526200026490602d90600d620005b4565b50604080516101a0810182526101db81526101d660208201526101d1918101919091526101cc60608201526101c760808201526101c260a08201526101bd60c08201526101b860e08201526101b36101008201526101ae6101208201526101a96101408201526101a4610160820152610186610180820152620002ec90602e90600d620005b4565b50604080516101a08101825261016d815261017260208201526101779181019190915261017c6060820152610181608082015261018660a082015261018b60c082015261019060e082015261019561010082015261019a61012082015261019f6101408201526101a46101608201526101c26101808201526200037490602f90600d620005b4565b50604080516101a081018252610163815261015e602082015261015991810191909152610154606082015261014f608082015261014a60a082015261014560c082015261014060e0820181905261013b6101008301526101366101208301526101319082015261012c61016082015261010e610180820152620003fc90603090600d620005b4565b506032805460ff191660031790553480156200041757600080fd5b50604051620057c1380380620057c18339810160408190526200043a91620006a9565b8282826040518060400160405280600481526020016322b1b7bd60e11b8152506040518060400160405280600481526020016322a1a7ad60e11b81525081600090805190602001906200048f929190620005f8565b508051620004a5906001906020840190620005f8565b505050620004c2620004bc6200050960201b60201c565b6200050d565b600780546001600160a01b039485166001600160a01b0319918216179091556008805493851693821693909317909255600980549190931691161790555062000730915050565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054828255906000526020600020908101928215620005a2579160200282015b82811115620005a2578251829060ff1690559160200191906001019062000580565b50620005b092915062000675565b5090565b828054828255906000526020600020908101928215620005a2579160200282015b82811115620005a2578251829061ffff16905591602001919060010190620005d5565b8280546200060690620006f3565b90600052602060002090601f0160209004810192826200062a5760008555620005a2565b82601f106200064557805160ff1916838001178555620005a2565b82800160010185558215620005a2579182015b82811115620005a257825182559160200191906001019062000658565b5b80821115620005b0576000815560010162000676565b80516001600160a01b0381168114620006a457600080fd5b919050565b600080600060608486031215620006bf57600080fd5b620006ca846200068c565b9250620006da602085016200068c565b9150620006ea604085016200068c565b90509250925092565b600181811c908216806200070857607f821691505b602082108114156200072a57634e487b7160e01b600052602260045260246000fd5b50919050565b61508180620007406000396000f3fe6080604052600436106103cd5760003560e01c80637dfe5b92116101fd578063b88d4fde11610118578063dfdcc89e116100ab578063ed5e8fb31161007a578063ed5e8fb314610ae2578063f144983e14610af8578063f2fde38b14610b0e578063f3169b8614610b2e578063f82dc68614610b4357600080fd5b8063dfdcc89e14610a4e578063e222c7f914610a64578063e90195ea14610a79578063e985e9c514610a9957600080fd5b8063c87b56dd116100e7578063c87b56dd146109b5578063c9d99533146109d5578063cc06c35914610a02578063d47573d414610a2e57600080fd5b8063b88d4fde14610932578063c0e127e814610952578063c19a6dba14610968578063c31a0a941461099557600080fd5b806395d89b4111610190578063a22cb4651161015f578063a22cb465146108ca578063aa2c4028146108ea578063abb409a5146108ff578063ac6c52511461091257600080fd5b806395d89b4114610875578063976c45c71461088a57806399800185146108a05780639b679d6e146108b557600080fd5b80638c66ca4a116101cc5780638c66ca4a146107ea5780638da5cb5b1461081757806390b37162146108355780639405a49b1461085557600080fd5b80637dfe5b92146107845780637e9f6cb2146107a457806383f6b8a2146107be57806385778c22146107d457600080fd5b806325d85e12116102ed5780634df9ac6d1161028057806361cf044f1161024f57806361cf044f1461070f5780636352211e1461072f57806370a082311461074f578063715018a61461076f57600080fd5b80634df9ac6d146106b95780634ed3f7d7146106ce57806359eda1b5146106e45780635c4d365f146106f957600080fd5b806342573e63116102bc57806342573e631461065157806342842e0e146106645780634315a76d1461068457806344a0d68a1461069957600080fd5b806325d85e12146106095780632a741f151461061e5780633ccfd60b146106345780633f96f1771461063c57600080fd5b80630a8dd8961161036557806319cb779d1161033457806319cb779d1461058d5780631e6ce2c4146105a3578063239c70ae146105d357806323b872dd146105e957600080fd5b80630a8dd896146105215780630e5937da1461054157806313faede614610561578063177052cc1461057757600080fd5b806306fdde03116103a157806306fdde0314610487578063081812fc146104a9578063088a4ed0146104e1578063095ea7b31461050157600080fd5b8062626791146103d257806301ffc9a7146104175780630457cbc81461043757806305c58df21461044c575b600080fd5b3480156103de57600080fd5b506104026103ed3660046147ba565b601d6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561042357600080fd5b50610402610432366004614a10565b610b58565b61044a610445366004614ac1565b610baa565b005b34801561045857600080fd5b50610479610467366004614ac1565b60316020526000908152604090205481565b60405190815260200161040e565b34801561049357600080fd5b5061049c610f29565b60405161040e9190614bc2565b3480156104b557600080fd5b506104c96104c4366004614ac1565b610fbb565b6040516001600160a01b03909116815260200161040e565b3480156104ed57600080fd5b5061044a6104fc366004614ac1565b611050565b34801561050d57600080fd5b5061044a61051c366004614932565b61107f565b34801561052d57600080fd5b50601f546104c9906001600160a01b031681565b34801561054d57600080fd5b5061044a61055c36600461495c565b611195565b34801561056d57600080fd5b50610479600a5481565b34801561058357600080fd5b50610479600c5481565b34801561059957600080fd5b5061047960235481565b3480156105af57600080fd5b506104026105be3660046147ba565b601e6020526000908152604090205460ff1681565b3480156105df57600080fd5b50610479600b5481565b3480156105f557600080fd5b5061044a61060436600461480f565b611227565b34801561061557600080fd5b50610479611610565b34801561062a57600080fd5b5061047960245481565b61044a61165b565b34801561064857600080fd5b5061044a6116dd565b61044a61065f366004614ac1565b61193a565b34801561067057600080fd5b5061044a61067f36600461480f565b611ca7565b34801561069057600080fd5b50610479612090565b3480156106a557600080fd5b5061044a6106b4366004614ac1565b6120a2565b3480156106c557600080fd5b506104796120d1565b3480156106da57600080fd5b5061047960255481565b3480156106f057600080fd5b5061044a6120e3565b34801561070557600080fd5b50610479600e5481565b34801561071b57600080fd5b506008546104c9906001600160a01b031681565b34801561073b57600080fd5b506104c961074a366004614ac1565b612146565b34801561075b57600080fd5b5061047961076a3660046147ba565b6121bd565b34801561077b57600080fd5b5061044a612244565b34801561079057600080fd5b5061044a61079f366004614b15565b612278565b3480156107b057600080fd5b506029546104029060ff1681565b3480156107ca57600080fd5b5061047960225481565b3480156107e057600080fd5b5061047960275481565b3480156107f657600080fd5b50610479610805366004614ac1565b60156020526000908152604090205481565b34801561082357600080fd5b506006546001600160a01b03166104c9565b34801561084157600080fd5b5061044a6108503660046147ba565b6127c5565b34801561086157600080fd5b5061044a61087036600461495c565b612811565b34801561088157600080fd5b5061049c6128a3565b34801561089657600080fd5b50610479600d5481565b3480156108ac57600080fd5b5061044a6128b2565b3480156108c157600080fd5b50610479612907565b3480156108d657600080fd5b5061044a6108e53660046148f6565b612919565b3480156108f657600080fd5b5061044a6129de565b61044a61090d366004614ac1565b612c33565b34801561091e57600080fd5b5061047961092d3660046147ba565b612f62565b34801561093e57600080fd5b5061044a61094d36600461484b565b612f98565b34801561095e57600080fd5b5061047960215481565b34801561097457600080fd5b50610479610983366004614ac1565b60136020526000908152604090205481565b3480156109a157600080fd5b506009546104c9906001600160a01b031681565b3480156109c157600080fd5b5061049c6109d0366004614ac1565b612fd0565b3480156109e157600080fd5b506104796109f0366004614ac1565b60146020526000908152604090205481565b348015610a0e57600080fd5b50603254610a1c9060ff1681565b60405160ff909116815260200161040e565b348015610a3a57600080fd5b5061044a610a49366004614af3565b613180565b348015610a5a57600080fd5b5061047960205481565b348015610a7057600080fd5b5061044a613627565b348015610a8557600080fd5b506007546104c9906001600160a01b031681565b348015610aa557600080fd5b50610402610ab43660046147dc565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610aee57600080fd5b5061047960285481565b348015610b0457600080fd5b5061047960265481565b348015610b1a57600080fd5b5061044a610b293660046147ba565b61368d565b348015610b3a57600080fd5b5061044a613725565b348015610b4f57600080fd5b5061044a61377a565b60006001600160e01b031982166380ac58cd60e01b1480610b8957506001600160e01b03198216635b5e139f60e01b145b80610ba457506301ffc9a760e01b6001600160e01b03198316145b92915050565b600d5481601054610bbb9190614eae565b1115610be25760405162461bcd60e51b8152600401610bd990614e2c565b60405180910390fd5b80600a54610bf09190614eda565b3414610c0e5760405162461bcd60e51b8152600401610bd990614d36565b60125460ff16151560011415610cf757336000908152601d602052604090205460ff161515600114610c525760405162461bcd60e51b8152600401610bd990614d6d565b600b54336000908152601c6020908152604080832054601b835281842054601a909352922054849291610c8491614eae565b610c8e9190614eae565b610c989190614eae565b1115610cb65760405162461bcd60e51b8152600401610bd990614c93565b336000908152601b6020526040902054600290610cd4908390614eae565b1115610cf25760405162461bcd60e51b8152600401610bd990614c5e565b610d8d565b60125460ff61010090910416151560011415610d6057336000908152601d602052604090205460ff16151560011480610d445750336000908152601e602052604090205460ff1615156001145b610c525760405162461bcd60e51b8152600401610bd990614cca565b60125462010000900460ff161515600114610d8d5760405162461bcd60e51b8152600401610bd990614c27565b60015b818111610f255760108054906000610da783614f8e565b90915550506008546010546001600160a01b039091169063fa11768f903390610dd290610546614eae565b6040518363ffffffff1660e01b8152600401610def929190614ba9565b602060405180830381600087803b158015610e0957600080fd5b505af1158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e419190614ada565b60146000601054610546610e559190614eae565b81526020808201929092526040908101600090812093909355338352601b9091528120805491610e8483614f8e565b9091555050336000908152601760205260408120805491610ea483614f8e565b919050555060146000601054610546610ebd9190614eae565b8152602080820192909252604090810160009081205433825260199093522054610ee79190614eae565b33600081815260196020526040902091909155601054610f139190610f0e90610546614eae565b6139ca565b80610f1d81614f8e565b915050610d90565b5050565b606060008054610f3890614f53565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6490614f53565b8015610fb15780601f10610f8657610100808354040283529160200191610fb1565b820191906000526020600020905b815481529060010190602001808311610f9457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166110345760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bd9565b506000908152600460205260409020546001600160a01b031690565b6006546001600160a01b0316331461107a5760405162461bcd60e51b8152600401610bd990614d01565b600b55565b600061108a82612146565b9050806001600160a01b0316836001600160a01b031614156110f85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bd9565b336001600160a01b038216148061111457506111148133610ab4565b6111865760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bd9565b6111908383613b0c565b505050565b6006546001600160a01b031633146111bf5760405162461bcd60e51b8152600401610bd990614d01565b60005b8151811015610f25576001601d60008484815181106111e3576111e3615009565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061121f81614f8e565b9150506111c2565b6105468111611388576101c2811161137d57601f54604051631d9e5efb60e31b81526001600160a01b03858116600483015284811660248301529091169063ecf2f7d890604401600060405180830381600087803b15801561128857600080fd5b505af115801561129c573d6000803e3d6000fd5b505050506001600160a01b03831660009081526016602052604081208054916112c483614f3c565b90915550506001600160a01b03821660009081526016602052604081208054916112ed83614f8e565b90915550506000818152601360209081526040808320546001600160a01b03871684526019909252909120546113239190614ef9565b6001600160a01b03808516600090815260196020818152604080842095909555858352601381528483205493871683525291909120546113639190614eae565b6001600160a01b0383166000908152601960205260409020555b611190838383613b7a565b6105468111801561139b5750610fd28111155b156114d3576108ca811161137d57601f54604051631d9e5efb60e31b81526001600160a01b03858116600483015284811660248301529091169063ecf2f7d890604401600060405180830381600087803b1580156113f857600080fd5b505af115801561140c573d6000803e3d6000fd5b505050506001600160a01b038316600090815260176020526040812080549161143483614f3c565b90915550506001600160a01b038216600090815260176020526040812080549161145d83614f8e565b90915550506000818152601460209081526040808320546001600160a01b03871684526019909252909120546114939190614ef9565b6001600160a01b03808516600090815260196020818152604080842095909555858352601481528483205493871683525291909120546113639190614eae565b610fd2811115611190576116da811161137d57601f54604051631d9e5efb60e31b81526001600160a01b03858116600483015284811660248301529091169063ecf2f7d890604401600060405180830381600087803b15801561153557600080fd5b505af1158015611549573d6000803e3d6000fd5b505050506001600160a01b038316600090815260186020526040812080549161157183614f3c565b90915550506001600160a01b038216600090815260186020526040812080549161159a83614f8e565b90915550506000818152601560209081526040808320546001600160a01b03871684526019909252909120546115d09190614ef9565b6001600160a01b03808516600090815260196020818152604080842095909555858352601581528483205493871683525291909120546113639190614eae565b6000602254602154602054601154601054600f5461162e9190614eae565b6116389190614eae565b6116429190614eae565b61164c9190614eae565b6116569190614eae565b905090565b6006546001600160a01b031633146116855760405162461bcd60e51b8152600401610bd990614d01565b604051600090339047908381818185875af1925050503d80600081146116c7576040519150601f19603f3d011682016040523d82523d6000602084013e6116cc565b606091505b50509050806116da57600080fd5b50565b60295460ff16156117005760405162461bcd60e51b8152600401610bd990614df5565b33600090815260176020526040902054600211156117715760405162461bcd60e51b815260206004820152602860248201527f4d757374206f776e2074776f2067656e657369732062757368206275636b73206044820152671d1bc8189c99595960c21b6064820152608401610bd9565b602454602154611782906001614eae565b11156117d05760405162461bcd60e51b815260206004820152601d60248201527f4d617820616d6f756e74206f662062757368206275636b7320627265640000006044820152606401610bd9565b601f546027546001600160a01b0390911690639dc29fac9033906117fc90670de0b6b3a7640000614eda565b6040518363ffffffff1660e01b8152600401611819929190614ba9565b600060405180830381600087803b15801561183357600080fd5b505af1158015611847573d6000803e3d6000fd5b50506021805492509050600061185c83614f8e565b90915550506008546021546001600160a01b039091169063fa11768f903390611887906108ca614eae565b6040518363ffffffff1660e01b81526004016118a4929190614ba9565b602060405180830381600087803b1580156118be57600080fd5b505af11580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f69190614ada565b601460006021546108ca61190a9190614eae565b815260200190815260200160002081905550611930336021546108ca610f0e9190614eae565b611938613bab565b565b600e548160115461194b9190614eae565b11156119695760405162461bcd60e51b8152600401610bd990614e2c565b80600a546119779190614eda565b34146119955760405162461bcd60e51b8152600401610bd990614d36565b60125460ff16151560011415611a7e57336000908152601d602052604090205460ff1615156001146119d95760405162461bcd60e51b8152600401610bd990614d6d565b600b54336000908152601c6020908152604080832054601b835281842054601a909352922054849291611a0b91614eae565b611a159190614eae565b611a1f9190614eae565b1115611a3d5760405162461bcd60e51b8152600401610bd990614c93565b336000908152601c6020526040902054600290611a5b908390614eae565b1115611a795760405162461bcd60e51b8152600401610bd990614c5e565b611b14565b60125460ff61010090910416151560011415611ae757336000908152601d602052604090205460ff16151560011480611acb5750336000908152601e602052604090205460ff1615156001145b6119d95760405162461bcd60e51b8152600401610bd990614cca565b60125462010000900460ff161515600114611b145760405162461bcd60e51b8152600401610bd990614c27565b60015b818111610f255760118054906000611b2e83614f8e565b90915550506009546011546001600160a01b039091169063b5ebe114903390611b5990610fd2614eae565b6040518363ffffffff1660e01b8152600401611b76929190614ba9565b602060405180830381600087803b158015611b9057600080fd5b505af1158015611ba4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc89190614ada565b60156000601154610fd2611bdc9190614eae565b81526020808201929092526040908101600090812093909355338352601c9091528120805491611c0b83614f8e565b9091555050336000908152601860205260408120805491611c2b83614f8e565b919050555060156000601154610fd2611c449190614eae565b8152602080820192909252604090810160009081205433825260199093522054611c6e9190614eae565b33600081815260196020526040902091909155601154611c959190610f0e90610fd2614eae565b80611c9f81614f8e565b915050611b17565b6105468111611e08576101c28111611dfd57601f54604051631d9e5efb60e31b81526001600160a01b03858116600483015284811660248301529091169063ecf2f7d890604401600060405180830381600087803b158015611d0857600080fd5b505af1158015611d1c573d6000803e3d6000fd5b505050506001600160a01b0383166000908152601660205260408120805491611d4483614f3c565b90915550506001600160a01b0382166000908152601660205260408120805491611d6d83614f8e565b90915550506000818152601360209081526040808320546001600160a01b0387168452601990925290912054611da39190614ef9565b6001600160a01b0380851660009081526019602081815260408084209590955585835260138152848320549387168352529190912054611de39190614eae565b6001600160a01b0383166000908152601960205260409020555b61119083838361435f565b61054681118015611e1b5750610fd28111155b15611f53576108ca8111611dfd57601f54604051631d9e5efb60e31b81526001600160a01b03858116600483015284811660248301529091169063ecf2f7d890604401600060405180830381600087803b158015611e7857600080fd5b505af1158015611e8c573d6000803e3d6000fd5b505050506001600160a01b0383166000908152601760205260408120805491611eb483614f3c565b90915550506001600160a01b0382166000908152601760205260408120805491611edd83614f8e565b90915550506000818152601460209081526040808320546001600160a01b0387168452601990925290912054611f139190614ef9565b6001600160a01b0380851660009081526019602081815260408084209590955585835260148152848320549387168352529190912054611de39190614eae565b610fd2811115611190576116da8111611dfd57601f54604051631d9e5efb60e31b81526001600160a01b03858116600483015284811660248301529091169063ecf2f7d890604401600060405180830381600087803b158015611fb557600080fd5b505af1158015611fc9573d6000803e3d6000fd5b505050506001600160a01b0383166000908152601860205260408120805491611ff183614f3c565b90915550506001600160a01b038216600090815260186020526040812080549161201a83614f8e565b90915550506000818152601560209081526040808320546001600160a01b03871684526019909252909120546120509190614ef9565b6001600160a01b0380851660009081526019602081815260408084209590955585835260158152848320549387168352529190912054611de39190614eae565b60006022546011546116569190614eae565b6006546001600160a01b031633146120cc5760405162461bcd60e51b8152600401610bd990614d01565b600a55565b60006021546010546116569190614eae565b6006546001600160a01b0316331461210d5760405162461bcd60e51b8152600401610bd990614d01565b60125460ff61010090910416151560011415612130576012805461ff0019169055565b6012805461ff0019166101001790556002600b55565b6000818152600260205260408120546001600160a01b031680610ba45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bd9565b60006001600160a01b0382166122285760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bd9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461226e5760405162461bcd60e51b8152600401610bd990614d01565b611938600061437a565b61228182612146565b6001600160a01b0316336001600160a01b03161461229e57600080fd5b6000821180156122b057506101c28211155b156124555760325460008381526031602052604090205460ff918216916122da9190841690614eae565b11156122e557600080fd5b60005b8160ff168160ff16101561119057601f54604051630d97a65960e01b81523360048201526001600160a01b0390911690630d97a65990602401600060405180830381600087803b15801561233b57600080fd5b505af115801561234f573d6000803e3d6000fd5b50505060008481526013602052604090205461236d91506004614eae565b600084815260136020908152604080832093909355603190522054612393906001614eae565b600084815260316020526040902055601f546026546001600160a01b0390911690639dc29fac9033906003906123ca908290614fc9565b6026546123d79190614ef9565b6123e19190614ec6565b6123f390670de0b6b3a7640000614eda565b6040518363ffffffff1660e01b8152600401612410929190614ba9565b600060405180830381600087803b15801561242a57600080fd5b505af115801561243e573d6000803e3d6000fd5b50505050808061244d90614fa9565b9150506122e8565b6105468211801561246857506108ca8211155b1561260d5760325460008381526031602052604090205460ff918216916124929190841690614eae565b111561249d57600080fd5b60005b8160ff168160ff16101561119057601f54604051630d97a65960e01b81523360048201526001600160a01b0390911690630d97a65990602401600060405180830381600087803b1580156124f357600080fd5b505af1158015612507573d6000803e3d6000fd5b50505060008481526014602052604090205461252591506003614eae565b60008481526014602090815260408083209390935560319052205461254b906001614eae565b600084815260316020526040902055601f546027546001600160a01b0390911690639dc29fac903390600390612582908290614fc9565b60275461258f9190614ef9565b6125999190614ec6565b6125ab90670de0b6b3a7640000614eda565b6040518363ffffffff1660e01b81526004016125c8929190614ba9565b600060405180830381600087803b1580156125e257600080fd5b505af11580156125f6573d6000803e3d6000fd5b50505050808061260590614fa9565b9150506124a0565b610fd28211801561262057506116da8211155b156103cd5760325460008381526031602052604090205460ff9182169161264a9190841690614eae565b111561265557600080fd5b60005b8160ff168160ff16101561119057601f54604051630d97a65960e01b81523360048201526001600160a01b0390911690630d97a65990602401600060405180830381600087803b1580156126ab57600080fd5b505af11580156126bf573d6000803e3d6000fd5b5050506000848152601560205260409020546126dd91506002614eae565b600084815260156020908152604080832093909355603190522054612703906001614eae565b600084815260316020526040902055601f546028546001600160a01b0390911690639dc29fac90339060039061273a908290614fc9565b6028546127479190614ef9565b6127519190614ec6565b61276390670de0b6b3a7640000614eda565b6040518363ffffffff1660e01b8152600401612780929190614ba9565b600060405180830381600087803b15801561279a57600080fd5b505af11580156127ae573d6000803e3d6000fd5b5050505080806127bd90614fa9565b915050612658565b6006546001600160a01b031633146127ef5760405162461bcd60e51b8152600401610bd990614d01565b601f80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b0316331461283b5760405162461bcd60e51b8152600401610bd990614d01565b60005b8151811015610f25576001601e600084848151811061285f5761285f615009565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061289b81614f8e565b91505061283e565b606060018054610f3890614f53565b6006546001600160a01b031633146128dc5760405162461bcd60e51b8152600401610bd990614d01565b60125460ff161515600114156128f8576012805460ff19169055565b6012805460ff19166001179055565b6000602054600f546116569190614eae565b6001600160a01b0382163314156129725760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bd9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60295460ff1615612a015760405162461bcd60e51b8152600401610bd990614df5565b3360009081526018602052604090205460021115612a745760405162461bcd60e51b815260206004820152602a60248201527f4d757374206f776e2074776f2067656e657369732062616e616e6120747265656044820152691cc81d1bc8189c99595960b21b6064820152608401610bd9565b602554602254612a85906001614eae565b1115612ad35760405162461bcd60e51b815260206004820152601f60248201527f4d617820616d6f756e74206f662062616e616e612074726565732062726564006044820152606401610bd9565b601f546028546001600160a01b0390911690639dc29fac903390612aff90670de0b6b3a7640000614eda565b6040518363ffffffff1660e01b8152600401612b1c929190614ba9565b600060405180830381600087803b158015612b3657600080fd5b505af1158015612b4a573d6000803e3d6000fd5b505060228054925090506000612b5f83614f8e565b90915550506009546022546001600160a01b039091169063b5ebe114903390612b8a906116da614eae565b6040518363ffffffff1660e01b8152600401612ba7929190614ba9565b602060405180830381600087803b158015612bc157600080fd5b505af1158015612bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf99190614ada565b601560006022546116da612c0d9190614eae565b815260200190815260200160002081905550611930336022546116da610f0e9190614eae565b600c5481600f54612c449190614eae565b1115612c625760405162461bcd60e51b8152600401610bd990614e2c565b80600a54612c709190614eda565b3414612c8e5760405162461bcd60e51b8152600401610bd990614d36565b60125460ff16151560011415612d7757336000908152601d602052604090205460ff161515600114612cd25760405162461bcd60e51b8152600401610bd990614d6d565b600b54336000908152601c6020908152604080832054601b835281842054601a909352922054849291612d0491614eae565b612d0e9190614eae565b612d189190614eae565b1115612d365760405162461bcd60e51b8152600401610bd990614c93565b336000908152601a6020526040902054600290612d54908390614eae565b1115612d725760405162461bcd60e51b8152600401610bd990614c5e565b612e0d565b60125460ff61010090910416151560011415612de057336000908152601d602052604090205460ff16151560011480612dc45750336000908152601e602052604090205460ff1615156001145b612cd25760405162461bcd60e51b8152600401610bd990614cca565b60125462010000900460ff161515600114612e0d5760405162461bcd60e51b8152600401610bd990614c27565b60015b818111610f2557600f8054906000612e2783614f8e565b9091555050600754600f54604051630e94e4a360e41b81526001600160a01b039092169163e94e4a3091612e6091339190600401614ba9565b602060405180830381600087803b158015612e7a57600080fd5b505af1158015612e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb29190614ada565b600f54600090815260136020908152604080832093909355338252601a9052908120805491612ee083614f8e565b9091555050336000908152601660205260408120805491612f0083614f8e565b9091555050600f54600090815260136020908152604080832054338452601990925290912054612f309190614eae565b33600081815260196020526040902091909155600f54612f5091906139ca565b80612f5a81614f8e565b915050612e10565b601f546000906001600160a01b03163314612f7c57600080fd5b506001600160a01b031660009081526019602052604090205490565b612fa233836143cc565b612fbe5760405162461bcd60e51b8152600401610bd990614da4565b612fca848484846144c3565b50505050565b60608115801590612fe357506124ea8211155b61302f5760405162461bcd60e51b815260206004820152601b60248201527f45636f7a20546f6b656e494420646f6573206e6f7420657869737400000000006044820152606401610bd9565b61054682116130d15760075460008381526013602052604090819020549051630b13fdbd60e31b81526004810185905260248101919091526001600160a01b039091169063589fede8906044015b60006040518083038186803b15801561309557600080fd5b505afa1580156130a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ba49190810190614a4a565b610546821180156130e45750610fd28211155b156131325760085460008381526014602052604090819020549051630f85d05d60e21b81526004810185905260248101919091526001600160a01b0390911690633e1741749060440161307d565b60095460008381526015602052604090819020549051637aa7985d60e11b81526004810185905260248101919091526001600160a01b039091169063f54f30ba9060440161307d565b919050565b6006546001600160a01b031633146131aa5760405162461bcd60e51b8152600401610bd990614d01565b8161330057600c5481600f546131c09190614eae565b11156131cb57600080fd5b60015b81811161119057600f80549060006131e583614f8e565b9091555050600754600f54604051630e94e4a360e41b81526001600160a01b039092169163e94e4a309161321e91339190600401614ba9565b602060405180830381600087803b15801561323857600080fd5b505af115801561324c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132709190614ada565b600f546000908152601360209081526040808320939093553382526016905290812080549161329e83614f8e565b9091555050600f546000908152601360209081526040808320543384526019909252909120546132ce9190614eae565b33600081815260196020526040902091909155600f546132ee91906139ca565b806132f881614f8e565b9150506131ce565b816001141561349857600d548160105461331a9190614eae565b111561332557600080fd5b60015b818111611190576010805490600061333f83614f8e565b90915550506008546010546001600160a01b039091169063fa11768f90339061336a90610546614eae565b6040518363ffffffff1660e01b8152600401613387929190614ba9565b602060405180830381600087803b1580156133a157600080fd5b505af11580156133b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d99190614ada565b601460006010546105466133ed9190614eae565b815260208082019290925260409081016000908120939093553383526017909152812080549161341c83614f8e565b9190505550601460006010546105466134359190614eae565b815260208082019290925260409081016000908120543382526019909352205461345f9190614eae565b336000818152601960205260409020919091556010546134869190610f0e90610546614eae565b8061349081614f8e565b915050613328565b600e54816011546134a99190614eae565b11156134b457600080fd5b60015b81811161119057601180549060006134ce83614f8e565b90915550506009546011546001600160a01b039091169063b5ebe1149033906134f990610fd2614eae565b6040518363ffffffff1660e01b8152600401613516929190614ba9565b602060405180830381600087803b15801561353057600080fd5b505af1158015613544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135689190614ada565b60156000601154610fd261357c9190614eae565b81526020808201929092526040908101600090812093909355338352601890915281208054916135ab83614f8e565b919050555060156000601154610fd26135c49190614eae565b81526020808201929092526040908101600090812054338252601990935220546135ee9190614eae565b336000818152601960205260409020919091556011546136159190610f0e90610fd2614eae565b8061361f81614f8e565b9150506134b7565b6006546001600160a01b031633146136515760405162461bcd60e51b8152600401610bd990614d01565b60125462010000900460ff16151560011415613675576012805462ff000019169055565b6012805462ff00001916620100001790556003600b55565b6006546001600160a01b031633146136b75760405162461bcd60e51b8152600401610bd990614d01565b6001600160a01b03811661371c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bd9565b6116da8161437a565b6006546001600160a01b0316331461374f5760405162461bcd60e51b8152600401610bd990614d01565b60295460ff1615156001141561376b576029805460ff19169055565b6029805460ff19166001179055565b60295460ff161561379d5760405162461bcd60e51b8152600401610bd990614df5565b336000908152601660205260409020546002111561380b5760405162461bcd60e51b815260206004820152602560248201527f4d757374206f776e2074776f2067656e65736973206a61677561727320746f20604482015264189c99595960da1b6064820152608401610bd9565b60235460205461381c906001614eae565b111561386a5760405162461bcd60e51b815260206004820152601a60248201527f4d617820616d6f756e74206f66206a61677561727320627265640000000000006044820152606401610bd9565b601f546026546001600160a01b0390911690639dc29fac90339061389690670de0b6b3a7640000614eda565b6040518363ffffffff1660e01b81526004016138b3929190614ba9565b600060405180830381600087803b1580156138cd57600080fd5b505af11580156138e1573d6000803e3d6000fd5b5050602080549250905060006138f683614f8e565b90915550506007546020546001600160a01b039091169063e94e4a30903390613921906101c2614eae565b6040518363ffffffff1660e01b815260040161393e929190614ba9565b602060405180830381600087803b15801561395857600080fd5b505af115801561396c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139909190614ada565b601360006020546101c26139a49190614eae565b815260200190815260200160002081905550611930336020546101c2610f0e9190614eae565b6001600160a01b038216613a205760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bd9565b6000818152600260205260409020546001600160a01b031615613a855760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bd9565b6001600160a01b0382166000908152600360205260408120805460019290613aae908490614eae565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613b4182612146565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b613b8433826143cc565b613ba05760405162461bcd60e51b8152600401610bd990614da4565b6111908383836144f6565b6000613bb5612907565b90506000613bc16120d1565b90506000613bcd612090565b905081613bdb846002614eda565b10158015613bf3575080613bf0836002614eda565b10155b15613e0357600082613c06856002614eda565b613c109190614ef9565b9050600082613c20856002614eda565b613c2a9190614ef9565b905060005b602a5460ff82161015613cea5782613c4c57610258602655613cea565b602a8160ff1681548110613c6257613c62615009565b9060005260206000200154831415613c9e57602b8160ff1681548110613c8a57613c8a615009565b600091825260209091200154602655613cea565b602a600b81548110613cb257613cb2615009565b9060005260206000200154831115613cd857602b600c81548110613c8a57613c8a615009565b80613ce281614fa9565b915050613c2f565b5060005b602a5460ff82161015613dfb5781613d11576101e0602755610168602855613dfb565b602a8160ff1681548110613d2757613d27615009565b9060005260206000200154821415613d8a57602d8160ff1681548110613d4f57613d4f615009565b906000526020600020015460278190555060308160ff1681548110613d7657613d76615009565b600091825260209091200154602855613dfb565b602a600b81548110613d9e57613d9e615009565b9060005260206000200154821115613de957602d600c81548110613dc457613dc4615009565b90600052602060002001546027819055506030600c81548110613d7657613d76615009565b80613df381614fa9565b915050613cee565b505050505050565b81613e0f846002614eda565b108015613e25575080613e23836002614eda565b105b15613ff1576000613e37846002614eda565b613e419084614ef9565b90506000613e50846002614eda565b613e5a9084614ef9565b905060005b602a5460ff82161015613f0a57602a8160ff1681548110613e8257613e82615009565b9060005260206000200154831415613ebe57602c8160ff1681548110613eaa57613eaa615009565b600091825260209091200154602655613f0a565b602a600b81548110613ed257613ed2615009565b9060005260206000200154831115613ef857602c600c81548110613eaa57613eaa615009565b80613f0281614fa9565b915050613e5f565b5060005b602a5460ff82161015613dfb57602a8160ff1681548110613f3157613f31615009565b9060005260206000200154821415613f8057602e8160ff1681548110613f5957613f59615009565b9060005260206000200154602781905550602f8160ff1681548110613d7657613d76615009565b602a600b81548110613f9457613f94615009565b9060005260206000200154821115613fdf57602e600c81548110613fba57613fba615009565b9060005260206000200154602781905550602f600c81548110613d7657613d76615009565b80613fe981614fa9565b915050613f0e565b81613ffd846002614eda565b10158015614014575080614012836002614eda565b105b156141a557600082614027856002614eda565b6140319190614ef9565b90506000614040846002614eda565b61404a9084614ef9565b905060005b602a5460ff8216101561410a578261406c5761025860265561410a565b602a8160ff168154811061408257614082615009565b90600052602060002001548314156140be57602b8160ff16815481106140aa576140aa615009565b60009182526020909120015460265561410a565b602a600b815481106140d2576140d2615009565b90600052602060002001548311156140f857602b600c815481106140aa576140aa615009565b8061410281614fa9565b91505061404f565b5060005b602a5460ff82161015613dfb57602a8160ff168154811061413157614131615009565b906000526020600020015482141561415957602e8160ff1681548110613f5957613f59615009565b602a600b8154811061416d5761416d615009565b906000526020600020015482111561419357602e600c81548110613fba57613fba615009565b8061419d81614fa9565b91505061410e565b816141b1846002614eda565b1080156141c85750806141c5836002614eda565b10155b156111905760006141da846002614eda565b6141e49084614ef9565b90506000826141f4856002614eda565b6141fe9190614ef9565b905060005b602a5460ff821610156142ae57602a8160ff168154811061422657614226615009565b906000526020600020015483141561426257602c8160ff168154811061424e5761424e615009565b6000918252602090912001546026556142ae565b602a600b8154811061427657614276615009565b906000526020600020015483111561429c57602c600c8154811061424e5761424e615009565b806142a681614fa9565b915050614203565b5060005b602a5460ff82161015613dfb57816142d5576101e0602755610168602855613dfb565b602a8160ff16815481106142eb576142eb615009565b906000526020600020015482141561431357602d8160ff1681548110613d4f57613d4f615009565b602a600b8154811061432757614327615009565b906000526020600020015482111561434d57602d600c81548110613dc457613dc4615009565b8061435781614fa9565b9150506142b2565b61119083838360405180602001604052806000815250612f98565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000818152600260205260408120546001600160a01b03166144455760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bd9565b600061445083612146565b9050806001600160a01b0316846001600160a01b0316148061448b5750836001600160a01b031661448084610fbb565b6001600160a01b0316145b806144bb57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b6144ce8484846144f6565b6144da84848484614696565b612fca5760405162461bcd60e51b8152600401610bd990614bd5565b826001600160a01b031661450982612146565b6001600160a01b0316146145715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610bd9565b6001600160a01b0382166145d35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bd9565b6145de600082613b0c565b6001600160a01b0383166000908152600360205260408120805460019290614607908490614ef9565b90915550506001600160a01b0382166000908152600360205260408120805460019290614635908490614eae565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006001600160a01b0384163b1561479857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906146da903390899088908890600401614b6c565b602060405180830381600087803b1580156146f457600080fd5b505af1925050508015614724575060408051601f3d908101601f1916820190925261472191810190614a2d565b60015b61477e573d808015614752576040519150601f19603f3d011682016040523d82523d6000602084013e614757565b606091505b5080516147765760405162461bcd60e51b8152600401610bd990614bd5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506144bb565b506001949350505050565b80356001600160a01b038116811461317b57600080fd5b6000602082840312156147cc57600080fd5b6147d5826147a3565b9392505050565b600080604083850312156147ef57600080fd5b6147f8836147a3565b9150614806602084016147a3565b90509250929050565b60008060006060848603121561482457600080fd5b61482d846147a3565b925061483b602085016147a3565b9150604084013590509250925092565b6000806000806080858703121561486157600080fd5b61486a856147a3565b9350614878602086016147a3565b925060408501359150606085013567ffffffffffffffff81111561489b57600080fd5b8501601f810187136148ac57600080fd5b80356148bf6148ba82614e86565b614e55565b8181528860208385010111156148d457600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561490957600080fd5b614912836147a3565b91506020830135801515811461492757600080fd5b809150509250929050565b6000806040838503121561494557600080fd5b61494e836147a3565b946020939093013593505050565b6000602080838503121561496f57600080fd5b823567ffffffffffffffff8082111561498757600080fd5b818501915085601f83011261499b57600080fd5b8135818111156149ad576149ad61501f565b8060051b91506149be848301614e55565b8181528481019084860184860187018a10156149d957600080fd5b600095505b83861015614a03576149ef816147a3565b8352600195909501949186019186016149de565b5098975050505050505050565b600060208284031215614a2257600080fd5b81356147d581615035565b600060208284031215614a3f57600080fd5b81516147d581615035565b600060208284031215614a5c57600080fd5b815167ffffffffffffffff811115614a7357600080fd5b8201601f81018413614a8457600080fd5b8051614a926148ba82614e86565b818152856020838501011115614aa757600080fd5b614ab8826020830160208601614f10565b95945050505050565b600060208284031215614ad357600080fd5b5035919050565b600060208284031215614aec57600080fd5b5051919050565b60008060408385031215614b0657600080fd5b50508035926020909101359150565b60008060408385031215614b2857600080fd5b82359150602083013560ff8116811461492757600080fd5b60008151808452614b58816020860160208601614f10565b601f01601f19169290920160200192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614b9f90830184614b40565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6020815260006147d56020830184614b40565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601b908201527f5075626c69632073616c6520686173206e6f7420737461727465640000000000604082015260600190565b6020808252818101527f4f6e6c792032206d696e747320706572207370656369657320616c6c6f776564604082015260600190565b60208082526019908201527f6d617820616d6f756e74206f662045636f7a206d696e74656400000000000000604082015260600190565b6020808252601f908201527f546869732061646472657373206973206e6f742077686974656c697374656400604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526019908201527f45746865722073656e74206973206e6f7420636f727265637400000000000000604082015260600190565b60208082526018908201527f5468697320616464726573206973206e6f7420616e204f470000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601e908201527f4272656564696e672069732074656d706f726172696c79207061757365640000604082015260600190565b6020808252600f908201526e4f766572206d617820737570706c7960881b604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715614e7e57614e7e61501f565b604052919050565b600067ffffffffffffffff821115614ea057614ea061501f565b50601f01601f191660200190565b60008219821115614ec157614ec1614fdd565b500190565b600082614ed557614ed5614ff3565b500490565b6000816000190483118215151615614ef457614ef4614fdd565b500290565b600082821015614f0b57614f0b614fdd565b500390565b60005b83811015614f2b578181015183820152602001614f13565b83811115612fca5750506000910152565b600081614f4b57614f4b614fdd565b506000190190565b600181811c90821680614f6757607f821691505b60208210811415614f8857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614fa257614fa2614fdd565b5060010190565b600060ff821660ff811415614fc057614fc0614fdd565b60010192915050565b600082614fd857614fd8614ff3565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146116da57600080fdfea26469706673582212204280a2b3733ce26907b5d9b38d3689194f5e47164bc14b4e010c94f1022a85c064736f6c6343000807003300000000000000000000000014034484b8e6f6525576a357537a8d39b1464c16000000000000000000000000bc7ef2918e83daa3abe677721d227d203d868297000000000000000000000000094c3492c21f11942e4afb42b26449ac88bd53a8

Deployed Bytecode

0x6080604052600436106103cd5760003560e01c80637dfe5b92116101fd578063b88d4fde11610118578063dfdcc89e116100ab578063ed5e8fb31161007a578063ed5e8fb314610ae2578063f144983e14610af8578063f2fde38b14610b0e578063f3169b8614610b2e578063f82dc68614610b4357600080fd5b8063dfdcc89e14610a4e578063e222c7f914610a64578063e90195ea14610a79578063e985e9c514610a9957600080fd5b8063c87b56dd116100e7578063c87b56dd146109b5578063c9d99533146109d5578063cc06c35914610a02578063d47573d414610a2e57600080fd5b8063b88d4fde14610932578063c0e127e814610952578063c19a6dba14610968578063c31a0a941461099557600080fd5b806395d89b4111610190578063a22cb4651161015f578063a22cb465146108ca578063aa2c4028146108ea578063abb409a5146108ff578063ac6c52511461091257600080fd5b806395d89b4114610875578063976c45c71461088a57806399800185146108a05780639b679d6e146108b557600080fd5b80638c66ca4a116101cc5780638c66ca4a146107ea5780638da5cb5b1461081757806390b37162146108355780639405a49b1461085557600080fd5b80637dfe5b92146107845780637e9f6cb2146107a457806383f6b8a2146107be57806385778c22146107d457600080fd5b806325d85e12116102ed5780634df9ac6d1161028057806361cf044f1161024f57806361cf044f1461070f5780636352211e1461072f57806370a082311461074f578063715018a61461076f57600080fd5b80634df9ac6d146106b95780634ed3f7d7146106ce57806359eda1b5146106e45780635c4d365f146106f957600080fd5b806342573e63116102bc57806342573e631461065157806342842e0e146106645780634315a76d1461068457806344a0d68a1461069957600080fd5b806325d85e12146106095780632a741f151461061e5780633ccfd60b146106345780633f96f1771461063c57600080fd5b80630a8dd8961161036557806319cb779d1161033457806319cb779d1461058d5780631e6ce2c4146105a3578063239c70ae146105d357806323b872dd146105e957600080fd5b80630a8dd896146105215780630e5937da1461054157806313faede614610561578063177052cc1461057757600080fd5b806306fdde03116103a157806306fdde0314610487578063081812fc146104a9578063088a4ed0146104e1578063095ea7b31461050157600080fd5b8062626791146103d257806301ffc9a7146104175780630457cbc81461043757806305c58df21461044c575b600080fd5b3480156103de57600080fd5b506104026103ed3660046147ba565b601d6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561042357600080fd5b50610402610432366004614a10565b610b58565b61044a610445366004614ac1565b610baa565b005b34801561045857600080fd5b50610479610467366004614ac1565b60316020526000908152604090205481565b60405190815260200161040e565b34801561049357600080fd5b5061049c610f29565b60405161040e9190614bc2565b3480156104b557600080fd5b506104c96104c4366004614ac1565b610fbb565b6040516001600160a01b03909116815260200161040e565b3480156104ed57600080fd5b5061044a6104fc366004614ac1565b611050565b34801561050d57600080fd5b5061044a61051c366004614932565b61107f565b34801561052d57600080fd5b50601f546104c9906001600160a01b031681565b34801561054d57600080fd5b5061044a61055c36600461495c565b611195565b34801561056d57600080fd5b50610479600a5481565b34801561058357600080fd5b50610479600c5481565b34801561059957600080fd5b5061047960235481565b3480156105af57600080fd5b506104026105be3660046147ba565b601e6020526000908152604090205460ff1681565b3480156105df57600080fd5b50610479600b5481565b3480156105f557600080fd5b5061044a61060436600461480f565b611227565b34801561061557600080fd5b50610479611610565b34801561062a57600080fd5b5061047960245481565b61044a61165b565b34801561064857600080fd5b5061044a6116dd565b61044a61065f366004614ac1565b61193a565b34801561067057600080fd5b5061044a61067f36600461480f565b611ca7565b34801561069057600080fd5b50610479612090565b3480156106a557600080fd5b5061044a6106b4366004614ac1565b6120a2565b3480156106c557600080fd5b506104796120d1565b3480156106da57600080fd5b5061047960255481565b3480156106f057600080fd5b5061044a6120e3565b34801561070557600080fd5b50610479600e5481565b34801561071b57600080fd5b506008546104c9906001600160a01b031681565b34801561073b57600080fd5b506104c961074a366004614ac1565b612146565b34801561075b57600080fd5b5061047961076a3660046147ba565b6121bd565b34801561077b57600080fd5b5061044a612244565b34801561079057600080fd5b5061044a61079f366004614b15565b612278565b3480156107b057600080fd5b506029546104029060ff1681565b3480156107ca57600080fd5b5061047960225481565b3480156107e057600080fd5b5061047960275481565b3480156107f657600080fd5b50610479610805366004614ac1565b60156020526000908152604090205481565b34801561082357600080fd5b506006546001600160a01b03166104c9565b34801561084157600080fd5b5061044a6108503660046147ba565b6127c5565b34801561086157600080fd5b5061044a61087036600461495c565b612811565b34801561088157600080fd5b5061049c6128a3565b34801561089657600080fd5b50610479600d5481565b3480156108ac57600080fd5b5061044a6128b2565b3480156108c157600080fd5b50610479612907565b3480156108d657600080fd5b5061044a6108e53660046148f6565b612919565b3480156108f657600080fd5b5061044a6129de565b61044a61090d366004614ac1565b612c33565b34801561091e57600080fd5b5061047961092d3660046147ba565b612f62565b34801561093e57600080fd5b5061044a61094d36600461484b565b612f98565b34801561095e57600080fd5b5061047960215481565b34801561097457600080fd5b50610479610983366004614ac1565b60136020526000908152604090205481565b3480156109a157600080fd5b506009546104c9906001600160a01b031681565b3480156109c157600080fd5b5061049c6109d0366004614ac1565b612fd0565b3480156109e157600080fd5b506104796109f0366004614ac1565b60146020526000908152604090205481565b348015610a0e57600080fd5b50603254610a1c9060ff1681565b60405160ff909116815260200161040e565b348015610a3a57600080fd5b5061044a610a49366004614af3565b613180565b348015610a5a57600080fd5b5061047960205481565b348015610a7057600080fd5b5061044a613627565b348015610a8557600080fd5b506007546104c9906001600160a01b031681565b348015610aa557600080fd5b50610402610ab43660046147dc565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610aee57600080fd5b5061047960285481565b348015610b0457600080fd5b5061047960265481565b348015610b1a57600080fd5b5061044a610b293660046147ba565b61368d565b348015610b3a57600080fd5b5061044a613725565b348015610b4f57600080fd5b5061044a61377a565b60006001600160e01b031982166380ac58cd60e01b1480610b8957506001600160e01b03198216635b5e139f60e01b145b80610ba457506301ffc9a760e01b6001600160e01b03198316145b92915050565b600d5481601054610bbb9190614eae565b1115610be25760405162461bcd60e51b8152600401610bd990614e2c565b60405180910390fd5b80600a54610bf09190614eda565b3414610c0e5760405162461bcd60e51b8152600401610bd990614d36565b60125460ff16151560011415610cf757336000908152601d602052604090205460ff161515600114610c525760405162461bcd60e51b8152600401610bd990614d6d565b600b54336000908152601c6020908152604080832054601b835281842054601a909352922054849291610c8491614eae565b610c8e9190614eae565b610c989190614eae565b1115610cb65760405162461bcd60e51b8152600401610bd990614c93565b336000908152601b6020526040902054600290610cd4908390614eae565b1115610cf25760405162461bcd60e51b8152600401610bd990614c5e565b610d8d565b60125460ff61010090910416151560011415610d6057336000908152601d602052604090205460ff16151560011480610d445750336000908152601e602052604090205460ff1615156001145b610c525760405162461bcd60e51b8152600401610bd990614cca565b60125462010000900460ff161515600114610d8d5760405162461bcd60e51b8152600401610bd990614c27565b60015b818111610f255760108054906000610da783614f8e565b90915550506008546010546001600160a01b039091169063fa11768f903390610dd290610546614eae565b6040518363ffffffff1660e01b8152600401610def929190614ba9565b602060405180830381600087803b158015610e0957600080fd5b505af1158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e419190614ada565b60146000601054610546610e559190614eae565b81526020808201929092526040908101600090812093909355338352601b9091528120805491610e8483614f8e565b9091555050336000908152601760205260408120805491610ea483614f8e565b919050555060146000601054610546610ebd9190614eae565b8152602080820192909252604090810160009081205433825260199093522054610ee79190614eae565b33600081815260196020526040902091909155601054610f139190610f0e90610546614eae565b6139ca565b80610f1d81614f8e565b915050610d90565b5050565b606060008054610f3890614f53565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6490614f53565b8015610fb15780601f10610f8657610100808354040283529160200191610fb1565b820191906000526020600020905b815481529060010190602001808311610f9457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166110345760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bd9565b506000908152600460205260409020546001600160a01b031690565b6006546001600160a01b0316331461107a5760405162461bcd60e51b8152600401610bd990614d01565b600b55565b600061108a82612146565b9050806001600160a01b0316836001600160a01b031614156110f85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bd9565b336001600160a01b038216148061111457506111148133610ab4565b6111865760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bd9565b6111908383613b0c565b505050565b6006546001600160a01b031633146111bf5760405162461bcd60e51b8152600401610bd990614d01565b60005b8151811015610f25576001601d60008484815181106111e3576111e3615009565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061121f81614f8e565b9150506111c2565b6105468111611388576101c2811161137d57601f54604051631d9e5efb60e31b81526001600160a01b03858116600483015284811660248301529091169063ecf2f7d890604401600060405180830381600087803b15801561128857600080fd5b505af115801561129c573d6000803e3d6000fd5b505050506001600160a01b03831660009081526016602052604081208054916112c483614f3c565b90915550506001600160a01b03821660009081526016602052604081208054916112ed83614f8e565b90915550506000818152601360209081526040808320546001600160a01b03871684526019909252909120546113239190614ef9565b6001600160a01b03808516600090815260196020818152604080842095909555858352601381528483205493871683525291909120546113639190614eae565b6001600160a01b0383166000908152601960205260409020555b611190838383613b7a565b6105468111801561139b5750610fd28111155b156114d3576108ca811161137d57601f54604051631d9e5efb60e31b81526001600160a01b03858116600483015284811660248301529091169063ecf2f7d890604401600060405180830381600087803b1580156113f857600080fd5b505af115801561140c573d6000803e3d6000fd5b505050506001600160a01b038316600090815260176020526040812080549161143483614f3c565b90915550506001600160a01b038216600090815260176020526040812080549161145d83614f8e565b90915550506000818152601460209081526040808320546001600160a01b03871684526019909252909120546114939190614ef9565b6001600160a01b03808516600090815260196020818152604080842095909555858352601481528483205493871683525291909120546113639190614eae565b610fd2811115611190576116da811161137d57601f54604051631d9e5efb60e31b81526001600160a01b03858116600483015284811660248301529091169063ecf2f7d890604401600060405180830381600087803b15801561153557600080fd5b505af1158015611549573d6000803e3d6000fd5b505050506001600160a01b038316600090815260186020526040812080549161157183614f3c565b90915550506001600160a01b038216600090815260186020526040812080549161159a83614f8e565b90915550506000818152601560209081526040808320546001600160a01b03871684526019909252909120546115d09190614ef9565b6001600160a01b03808516600090815260196020818152604080842095909555858352601581528483205493871683525291909120546113639190614eae565b6000602254602154602054601154601054600f5461162e9190614eae565b6116389190614eae565b6116429190614eae565b61164c9190614eae565b6116569190614eae565b905090565b6006546001600160a01b031633146116855760405162461bcd60e51b8152600401610bd990614d01565b604051600090339047908381818185875af1925050503d80600081146116c7576040519150601f19603f3d011682016040523d82523d6000602084013e6116cc565b606091505b50509050806116da57600080fd5b50565b60295460ff16156117005760405162461bcd60e51b8152600401610bd990614df5565b33600090815260176020526040902054600211156117715760405162461bcd60e51b815260206004820152602860248201527f4d757374206f776e2074776f2067656e657369732062757368206275636b73206044820152671d1bc8189c99595960c21b6064820152608401610bd9565b602454602154611782906001614eae565b11156117d05760405162461bcd60e51b815260206004820152601d60248201527f4d617820616d6f756e74206f662062757368206275636b7320627265640000006044820152606401610bd9565b601f546027546001600160a01b0390911690639dc29fac9033906117fc90670de0b6b3a7640000614eda565b6040518363ffffffff1660e01b8152600401611819929190614ba9565b600060405180830381600087803b15801561183357600080fd5b505af1158015611847573d6000803e3d6000fd5b50506021805492509050600061185c83614f8e565b90915550506008546021546001600160a01b039091169063fa11768f903390611887906108ca614eae565b6040518363ffffffff1660e01b81526004016118a4929190614ba9565b602060405180830381600087803b1580156118be57600080fd5b505af11580156118d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f69190614ada565b601460006021546108ca61190a9190614eae565b815260200190815260200160002081905550611930336021546108ca610f0e9190614eae565b611938613bab565b565b600e548160115461194b9190614eae565b11156119695760405162461bcd60e51b8152600401610bd990614e2c565b80600a546119779190614eda565b34146119955760405162461bcd60e51b8152600401610bd990614d36565b60125460ff16151560011415611a7e57336000908152601d602052604090205460ff1615156001146119d95760405162461bcd60e51b8152600401610bd990614d6d565b600b54336000908152601c6020908152604080832054601b835281842054601a909352922054849291611a0b91614eae565b611a159190614eae565b611a1f9190614eae565b1115611a3d5760405162461bcd60e51b8152600401610bd990614c93565b336000908152601c6020526040902054600290611a5b908390614eae565b1115611a795760405162461bcd60e51b8152600401610bd990614c5e565b611b14565b60125460ff61010090910416151560011415611ae757336000908152601d602052604090205460ff16151560011480611acb5750336000908152601e602052604090205460ff1615156001145b6119d95760405162461bcd60e51b8152600401610bd990614cca565b60125462010000900460ff161515600114611b145760405162461bcd60e51b8152600401610bd990614c27565b60015b818111610f255760118054906000611b2e83614f8e565b90915550506009546011546001600160a01b039091169063b5ebe114903390611b5990610fd2614eae565b6040518363ffffffff1660e01b8152600401611b76929190614ba9565b602060405180830381600087803b158015611b9057600080fd5b505af1158015611ba4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc89190614ada565b60156000601154610fd2611bdc9190614eae565b81526020808201929092526040908101600090812093909355338352601c9091528120805491611c0b83614f8e565b9091555050336000908152601860205260408120805491611c2b83614f8e565b919050555060156000601154610fd2611c449190614eae565b8152602080820192909252604090810160009081205433825260199093522054611c6e9190614eae565b33600081815260196020526040902091909155601154611c959190610f0e90610fd2614eae565b80611c9f81614f8e565b915050611b17565b6105468111611e08576101c28111611dfd57601f54604051631d9e5efb60e31b81526001600160a01b03858116600483015284811660248301529091169063ecf2f7d890604401600060405180830381600087803b158015611d0857600080fd5b505af1158015611d1c573d6000803e3d6000fd5b505050506001600160a01b0383166000908152601660205260408120805491611d4483614f3c565b90915550506001600160a01b0382166000908152601660205260408120805491611d6d83614f8e565b90915550506000818152601360209081526040808320546001600160a01b0387168452601990925290912054611da39190614ef9565b6001600160a01b0380851660009081526019602081815260408084209590955585835260138152848320549387168352529190912054611de39190614eae565b6001600160a01b0383166000908152601960205260409020555b61119083838361435f565b61054681118015611e1b5750610fd28111155b15611f53576108ca8111611dfd57601f54604051631d9e5efb60e31b81526001600160a01b03858116600483015284811660248301529091169063ecf2f7d890604401600060405180830381600087803b158015611e7857600080fd5b505af1158015611e8c573d6000803e3d6000fd5b505050506001600160a01b0383166000908152601760205260408120805491611eb483614f3c565b90915550506001600160a01b0382166000908152601760205260408120805491611edd83614f8e565b90915550506000818152601460209081526040808320546001600160a01b0387168452601990925290912054611f139190614ef9565b6001600160a01b0380851660009081526019602081815260408084209590955585835260148152848320549387168352529190912054611de39190614eae565b610fd2811115611190576116da8111611dfd57601f54604051631d9e5efb60e31b81526001600160a01b03858116600483015284811660248301529091169063ecf2f7d890604401600060405180830381600087803b158015611fb557600080fd5b505af1158015611fc9573d6000803e3d6000fd5b505050506001600160a01b0383166000908152601860205260408120805491611ff183614f3c565b90915550506001600160a01b038216600090815260186020526040812080549161201a83614f8e565b90915550506000818152601560209081526040808320546001600160a01b03871684526019909252909120546120509190614ef9565b6001600160a01b0380851660009081526019602081815260408084209590955585835260158152848320549387168352529190912054611de39190614eae565b60006022546011546116569190614eae565b6006546001600160a01b031633146120cc5760405162461bcd60e51b8152600401610bd990614d01565b600a55565b60006021546010546116569190614eae565b6006546001600160a01b0316331461210d5760405162461bcd60e51b8152600401610bd990614d01565b60125460ff61010090910416151560011415612130576012805461ff0019169055565b6012805461ff0019166101001790556002600b55565b6000818152600260205260408120546001600160a01b031680610ba45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bd9565b60006001600160a01b0382166122285760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bd9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461226e5760405162461bcd60e51b8152600401610bd990614d01565b611938600061437a565b61228182612146565b6001600160a01b0316336001600160a01b03161461229e57600080fd5b6000821180156122b057506101c28211155b156124555760325460008381526031602052604090205460ff918216916122da9190841690614eae565b11156122e557600080fd5b60005b8160ff168160ff16101561119057601f54604051630d97a65960e01b81523360048201526001600160a01b0390911690630d97a65990602401600060405180830381600087803b15801561233b57600080fd5b505af115801561234f573d6000803e3d6000fd5b50505060008481526013602052604090205461236d91506004614eae565b600084815260136020908152604080832093909355603190522054612393906001614eae565b600084815260316020526040902055601f546026546001600160a01b0390911690639dc29fac9033906003906123ca908290614fc9565b6026546123d79190614ef9565b6123e19190614ec6565b6123f390670de0b6b3a7640000614eda565b6040518363ffffffff1660e01b8152600401612410929190614ba9565b600060405180830381600087803b15801561242a57600080fd5b505af115801561243e573d6000803e3d6000fd5b50505050808061244d90614fa9565b9150506122e8565b6105468211801561246857506108ca8211155b1561260d5760325460008381526031602052604090205460ff918216916124929190841690614eae565b111561249d57600080fd5b60005b8160ff168160ff16101561119057601f54604051630d97a65960e01b81523360048201526001600160a01b0390911690630d97a65990602401600060405180830381600087803b1580156124f357600080fd5b505af1158015612507573d6000803e3d6000fd5b50505060008481526014602052604090205461252591506003614eae565b60008481526014602090815260408083209390935560319052205461254b906001614eae565b600084815260316020526040902055601f546027546001600160a01b0390911690639dc29fac903390600390612582908290614fc9565b60275461258f9190614ef9565b6125999190614ec6565b6125ab90670de0b6b3a7640000614eda565b6040518363ffffffff1660e01b81526004016125c8929190614ba9565b600060405180830381600087803b1580156125e257600080fd5b505af11580156125f6573d6000803e3d6000fd5b50505050808061260590614fa9565b9150506124a0565b610fd28211801561262057506116da8211155b156103cd5760325460008381526031602052604090205460ff9182169161264a9190841690614eae565b111561265557600080fd5b60005b8160ff168160ff16101561119057601f54604051630d97a65960e01b81523360048201526001600160a01b0390911690630d97a65990602401600060405180830381600087803b1580156126ab57600080fd5b505af11580156126bf573d6000803e3d6000fd5b5050506000848152601560205260409020546126dd91506002614eae565b600084815260156020908152604080832093909355603190522054612703906001614eae565b600084815260316020526040902055601f546028546001600160a01b0390911690639dc29fac90339060039061273a908290614fc9565b6028546127479190614ef9565b6127519190614ec6565b61276390670de0b6b3a7640000614eda565b6040518363ffffffff1660e01b8152600401612780929190614ba9565b600060405180830381600087803b15801561279a57600080fd5b505af11580156127ae573d6000803e3d6000fd5b5050505080806127bd90614fa9565b915050612658565b6006546001600160a01b031633146127ef5760405162461bcd60e51b8152600401610bd990614d01565b601f80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b0316331461283b5760405162461bcd60e51b8152600401610bd990614d01565b60005b8151811015610f25576001601e600084848151811061285f5761285f615009565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061289b81614f8e565b91505061283e565b606060018054610f3890614f53565b6006546001600160a01b031633146128dc5760405162461bcd60e51b8152600401610bd990614d01565b60125460ff161515600114156128f8576012805460ff19169055565b6012805460ff19166001179055565b6000602054600f546116569190614eae565b6001600160a01b0382163314156129725760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bd9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60295460ff1615612a015760405162461bcd60e51b8152600401610bd990614df5565b3360009081526018602052604090205460021115612a745760405162461bcd60e51b815260206004820152602a60248201527f4d757374206f776e2074776f2067656e657369732062616e616e6120747265656044820152691cc81d1bc8189c99595960b21b6064820152608401610bd9565b602554602254612a85906001614eae565b1115612ad35760405162461bcd60e51b815260206004820152601f60248201527f4d617820616d6f756e74206f662062616e616e612074726565732062726564006044820152606401610bd9565b601f546028546001600160a01b0390911690639dc29fac903390612aff90670de0b6b3a7640000614eda565b6040518363ffffffff1660e01b8152600401612b1c929190614ba9565b600060405180830381600087803b158015612b3657600080fd5b505af1158015612b4a573d6000803e3d6000fd5b505060228054925090506000612b5f83614f8e565b90915550506009546022546001600160a01b039091169063b5ebe114903390612b8a906116da614eae565b6040518363ffffffff1660e01b8152600401612ba7929190614ba9565b602060405180830381600087803b158015612bc157600080fd5b505af1158015612bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf99190614ada565b601560006022546116da612c0d9190614eae565b815260200190815260200160002081905550611930336022546116da610f0e9190614eae565b600c5481600f54612c449190614eae565b1115612c625760405162461bcd60e51b8152600401610bd990614e2c565b80600a54612c709190614eda565b3414612c8e5760405162461bcd60e51b8152600401610bd990614d36565b60125460ff16151560011415612d7757336000908152601d602052604090205460ff161515600114612cd25760405162461bcd60e51b8152600401610bd990614d6d565b600b54336000908152601c6020908152604080832054601b835281842054601a909352922054849291612d0491614eae565b612d0e9190614eae565b612d189190614eae565b1115612d365760405162461bcd60e51b8152600401610bd990614c93565b336000908152601a6020526040902054600290612d54908390614eae565b1115612d725760405162461bcd60e51b8152600401610bd990614c5e565b612e0d565b60125460ff61010090910416151560011415612de057336000908152601d602052604090205460ff16151560011480612dc45750336000908152601e602052604090205460ff1615156001145b612cd25760405162461bcd60e51b8152600401610bd990614cca565b60125462010000900460ff161515600114612e0d5760405162461bcd60e51b8152600401610bd990614c27565b60015b818111610f2557600f8054906000612e2783614f8e565b9091555050600754600f54604051630e94e4a360e41b81526001600160a01b039092169163e94e4a3091612e6091339190600401614ba9565b602060405180830381600087803b158015612e7a57600080fd5b505af1158015612e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb29190614ada565b600f54600090815260136020908152604080832093909355338252601a9052908120805491612ee083614f8e565b9091555050336000908152601660205260408120805491612f0083614f8e565b9091555050600f54600090815260136020908152604080832054338452601990925290912054612f309190614eae565b33600081815260196020526040902091909155600f54612f5091906139ca565b80612f5a81614f8e565b915050612e10565b601f546000906001600160a01b03163314612f7c57600080fd5b506001600160a01b031660009081526019602052604090205490565b612fa233836143cc565b612fbe5760405162461bcd60e51b8152600401610bd990614da4565b612fca848484846144c3565b50505050565b60608115801590612fe357506124ea8211155b61302f5760405162461bcd60e51b815260206004820152601b60248201527f45636f7a20546f6b656e494420646f6573206e6f7420657869737400000000006044820152606401610bd9565b61054682116130d15760075460008381526013602052604090819020549051630b13fdbd60e31b81526004810185905260248101919091526001600160a01b039091169063589fede8906044015b60006040518083038186803b15801561309557600080fd5b505afa1580156130a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ba49190810190614a4a565b610546821180156130e45750610fd28211155b156131325760085460008381526014602052604090819020549051630f85d05d60e21b81526004810185905260248101919091526001600160a01b0390911690633e1741749060440161307d565b60095460008381526015602052604090819020549051637aa7985d60e11b81526004810185905260248101919091526001600160a01b039091169063f54f30ba9060440161307d565b919050565b6006546001600160a01b031633146131aa5760405162461bcd60e51b8152600401610bd990614d01565b8161330057600c5481600f546131c09190614eae565b11156131cb57600080fd5b60015b81811161119057600f80549060006131e583614f8e565b9091555050600754600f54604051630e94e4a360e41b81526001600160a01b039092169163e94e4a309161321e91339190600401614ba9565b602060405180830381600087803b15801561323857600080fd5b505af115801561324c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132709190614ada565b600f546000908152601360209081526040808320939093553382526016905290812080549161329e83614f8e565b9091555050600f546000908152601360209081526040808320543384526019909252909120546132ce9190614eae565b33600081815260196020526040902091909155600f546132ee91906139ca565b806132f881614f8e565b9150506131ce565b816001141561349857600d548160105461331a9190614eae565b111561332557600080fd5b60015b818111611190576010805490600061333f83614f8e565b90915550506008546010546001600160a01b039091169063fa11768f90339061336a90610546614eae565b6040518363ffffffff1660e01b8152600401613387929190614ba9565b602060405180830381600087803b1580156133a157600080fd5b505af11580156133b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d99190614ada565b601460006010546105466133ed9190614eae565b815260208082019290925260409081016000908120939093553383526017909152812080549161341c83614f8e565b9190505550601460006010546105466134359190614eae565b815260208082019290925260409081016000908120543382526019909352205461345f9190614eae565b336000818152601960205260409020919091556010546134869190610f0e90610546614eae565b8061349081614f8e565b915050613328565b600e54816011546134a99190614eae565b11156134b457600080fd5b60015b81811161119057601180549060006134ce83614f8e565b90915550506009546011546001600160a01b039091169063b5ebe1149033906134f990610fd2614eae565b6040518363ffffffff1660e01b8152600401613516929190614ba9565b602060405180830381600087803b15801561353057600080fd5b505af1158015613544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135689190614ada565b60156000601154610fd261357c9190614eae565b81526020808201929092526040908101600090812093909355338352601890915281208054916135ab83614f8e565b919050555060156000601154610fd26135c49190614eae565b81526020808201929092526040908101600090812054338252601990935220546135ee9190614eae565b336000818152601960205260409020919091556011546136159190610f0e90610fd2614eae565b8061361f81614f8e565b9150506134b7565b6006546001600160a01b031633146136515760405162461bcd60e51b8152600401610bd990614d01565b60125462010000900460ff16151560011415613675576012805462ff000019169055565b6012805462ff00001916620100001790556003600b55565b6006546001600160a01b031633146136b75760405162461bcd60e51b8152600401610bd990614d01565b6001600160a01b03811661371c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bd9565b6116da8161437a565b6006546001600160a01b0316331461374f5760405162461bcd60e51b8152600401610bd990614d01565b60295460ff1615156001141561376b576029805460ff19169055565b6029805460ff19166001179055565b60295460ff161561379d5760405162461bcd60e51b8152600401610bd990614df5565b336000908152601660205260409020546002111561380b5760405162461bcd60e51b815260206004820152602560248201527f4d757374206f776e2074776f2067656e65736973206a61677561727320746f20604482015264189c99595960da1b6064820152608401610bd9565b60235460205461381c906001614eae565b111561386a5760405162461bcd60e51b815260206004820152601a60248201527f4d617820616d6f756e74206f66206a61677561727320627265640000000000006044820152606401610bd9565b601f546026546001600160a01b0390911690639dc29fac90339061389690670de0b6b3a7640000614eda565b6040518363ffffffff1660e01b81526004016138b3929190614ba9565b600060405180830381600087803b1580156138cd57600080fd5b505af11580156138e1573d6000803e3d6000fd5b5050602080549250905060006138f683614f8e565b90915550506007546020546001600160a01b039091169063e94e4a30903390613921906101c2614eae565b6040518363ffffffff1660e01b815260040161393e929190614ba9565b602060405180830381600087803b15801561395857600080fd5b505af115801561396c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139909190614ada565b601360006020546101c26139a49190614eae565b815260200190815260200160002081905550611930336020546101c2610f0e9190614eae565b6001600160a01b038216613a205760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bd9565b6000818152600260205260409020546001600160a01b031615613a855760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bd9565b6001600160a01b0382166000908152600360205260408120805460019290613aae908490614eae565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613b4182612146565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b613b8433826143cc565b613ba05760405162461bcd60e51b8152600401610bd990614da4565b6111908383836144f6565b6000613bb5612907565b90506000613bc16120d1565b90506000613bcd612090565b905081613bdb846002614eda565b10158015613bf3575080613bf0836002614eda565b10155b15613e0357600082613c06856002614eda565b613c109190614ef9565b9050600082613c20856002614eda565b613c2a9190614ef9565b905060005b602a5460ff82161015613cea5782613c4c57610258602655613cea565b602a8160ff1681548110613c6257613c62615009565b9060005260206000200154831415613c9e57602b8160ff1681548110613c8a57613c8a615009565b600091825260209091200154602655613cea565b602a600b81548110613cb257613cb2615009565b9060005260206000200154831115613cd857602b600c81548110613c8a57613c8a615009565b80613ce281614fa9565b915050613c2f565b5060005b602a5460ff82161015613dfb5781613d11576101e0602755610168602855613dfb565b602a8160ff1681548110613d2757613d27615009565b9060005260206000200154821415613d8a57602d8160ff1681548110613d4f57613d4f615009565b906000526020600020015460278190555060308160ff1681548110613d7657613d76615009565b600091825260209091200154602855613dfb565b602a600b81548110613d9e57613d9e615009565b9060005260206000200154821115613de957602d600c81548110613dc457613dc4615009565b90600052602060002001546027819055506030600c81548110613d7657613d76615009565b80613df381614fa9565b915050613cee565b505050505050565b81613e0f846002614eda565b108015613e25575080613e23836002614eda565b105b15613ff1576000613e37846002614eda565b613e419084614ef9565b90506000613e50846002614eda565b613e5a9084614ef9565b905060005b602a5460ff82161015613f0a57602a8160ff1681548110613e8257613e82615009565b9060005260206000200154831415613ebe57602c8160ff1681548110613eaa57613eaa615009565b600091825260209091200154602655613f0a565b602a600b81548110613ed257613ed2615009565b9060005260206000200154831115613ef857602c600c81548110613eaa57613eaa615009565b80613f0281614fa9565b915050613e5f565b5060005b602a5460ff82161015613dfb57602a8160ff1681548110613f3157613f31615009565b9060005260206000200154821415613f8057602e8160ff1681548110613f5957613f59615009565b9060005260206000200154602781905550602f8160ff1681548110613d7657613d76615009565b602a600b81548110613f9457613f94615009565b9060005260206000200154821115613fdf57602e600c81548110613fba57613fba615009565b9060005260206000200154602781905550602f600c81548110613d7657613d76615009565b80613fe981614fa9565b915050613f0e565b81613ffd846002614eda565b10158015614014575080614012836002614eda565b105b156141a557600082614027856002614eda565b6140319190614ef9565b90506000614040846002614eda565b61404a9084614ef9565b905060005b602a5460ff8216101561410a578261406c5761025860265561410a565b602a8160ff168154811061408257614082615009565b90600052602060002001548314156140be57602b8160ff16815481106140aa576140aa615009565b60009182526020909120015460265561410a565b602a600b815481106140d2576140d2615009565b90600052602060002001548311156140f857602b600c815481106140aa576140aa615009565b8061410281614fa9565b91505061404f565b5060005b602a5460ff82161015613dfb57602a8160ff168154811061413157614131615009565b906000526020600020015482141561415957602e8160ff1681548110613f5957613f59615009565b602a600b8154811061416d5761416d615009565b906000526020600020015482111561419357602e600c81548110613fba57613fba615009565b8061419d81614fa9565b91505061410e565b816141b1846002614eda565b1080156141c85750806141c5836002614eda565b10155b156111905760006141da846002614eda565b6141e49084614ef9565b90506000826141f4856002614eda565b6141fe9190614ef9565b905060005b602a5460ff821610156142ae57602a8160ff168154811061422657614226615009565b906000526020600020015483141561426257602c8160ff168154811061424e5761424e615009565b6000918252602090912001546026556142ae565b602a600b8154811061427657614276615009565b906000526020600020015483111561429c57602c600c8154811061424e5761424e615009565b806142a681614fa9565b915050614203565b5060005b602a5460ff82161015613dfb57816142d5576101e0602755610168602855613dfb565b602a8160ff16815481106142eb576142eb615009565b906000526020600020015482141561431357602d8160ff1681548110613d4f57613d4f615009565b602a600b8154811061432757614327615009565b906000526020600020015482111561434d57602d600c81548110613dc457613dc4615009565b8061435781614fa9565b9150506142b2565b61119083838360405180602001604052806000815250612f98565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000818152600260205260408120546001600160a01b03166144455760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bd9565b600061445083612146565b9050806001600160a01b0316846001600160a01b0316148061448b5750836001600160a01b031661448084610fbb565b6001600160a01b0316145b806144bb57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b6144ce8484846144f6565b6144da84848484614696565b612fca5760405162461bcd60e51b8152600401610bd990614bd5565b826001600160a01b031661450982612146565b6001600160a01b0316146145715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610bd9565b6001600160a01b0382166145d35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bd9565b6145de600082613b0c565b6001600160a01b0383166000908152600360205260408120805460019290614607908490614ef9565b90915550506001600160a01b0382166000908152600360205260408120805460019290614635908490614eae565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006001600160a01b0384163b1561479857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906146da903390899088908890600401614b6c565b602060405180830381600087803b1580156146f457600080fd5b505af1925050508015614724575060408051601f3d908101601f1916820190925261472191810190614a2d565b60015b61477e573d808015614752576040519150601f19603f3d011682016040523d82523d6000602084013e614757565b606091505b5080516147765760405162461bcd60e51b8152600401610bd990614bd5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506144bb565b506001949350505050565b80356001600160a01b038116811461317b57600080fd5b6000602082840312156147cc57600080fd5b6147d5826147a3565b9392505050565b600080604083850312156147ef57600080fd5b6147f8836147a3565b9150614806602084016147a3565b90509250929050565b60008060006060848603121561482457600080fd5b61482d846147a3565b925061483b602085016147a3565b9150604084013590509250925092565b6000806000806080858703121561486157600080fd5b61486a856147a3565b9350614878602086016147a3565b925060408501359150606085013567ffffffffffffffff81111561489b57600080fd5b8501601f810187136148ac57600080fd5b80356148bf6148ba82614e86565b614e55565b8181528860208385010111156148d457600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561490957600080fd5b614912836147a3565b91506020830135801515811461492757600080fd5b809150509250929050565b6000806040838503121561494557600080fd5b61494e836147a3565b946020939093013593505050565b6000602080838503121561496f57600080fd5b823567ffffffffffffffff8082111561498757600080fd5b818501915085601f83011261499b57600080fd5b8135818111156149ad576149ad61501f565b8060051b91506149be848301614e55565b8181528481019084860184860187018a10156149d957600080fd5b600095505b83861015614a03576149ef816147a3565b8352600195909501949186019186016149de565b5098975050505050505050565b600060208284031215614a2257600080fd5b81356147d581615035565b600060208284031215614a3f57600080fd5b81516147d581615035565b600060208284031215614a5c57600080fd5b815167ffffffffffffffff811115614a7357600080fd5b8201601f81018413614a8457600080fd5b8051614a926148ba82614e86565b818152856020838501011115614aa757600080fd5b614ab8826020830160208601614f10565b95945050505050565b600060208284031215614ad357600080fd5b5035919050565b600060208284031215614aec57600080fd5b5051919050565b60008060408385031215614b0657600080fd5b50508035926020909101359150565b60008060408385031215614b2857600080fd5b82359150602083013560ff8116811461492757600080fd5b60008151808452614b58816020860160208601614f10565b601f01601f19169290920160200192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614b9f90830184614b40565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6020815260006147d56020830184614b40565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601b908201527f5075626c69632073616c6520686173206e6f7420737461727465640000000000604082015260600190565b6020808252818101527f4f6e6c792032206d696e747320706572207370656369657320616c6c6f776564604082015260600190565b60208082526019908201527f6d617820616d6f756e74206f662045636f7a206d696e74656400000000000000604082015260600190565b6020808252601f908201527f546869732061646472657373206973206e6f742077686974656c697374656400604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526019908201527f45746865722073656e74206973206e6f7420636f727265637400000000000000604082015260600190565b60208082526018908201527f5468697320616464726573206973206e6f7420616e204f470000000000000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601e908201527f4272656564696e672069732074656d706f726172696c79207061757365640000604082015260600190565b6020808252600f908201526e4f766572206d617820737570706c7960881b604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715614e7e57614e7e61501f565b604052919050565b600067ffffffffffffffff821115614ea057614ea061501f565b50601f01601f191660200190565b60008219821115614ec157614ec1614fdd565b500190565b600082614ed557614ed5614ff3565b500490565b6000816000190483118215151615614ef457614ef4614fdd565b500290565b600082821015614f0b57614f0b614fdd565b500390565b60005b83811015614f2b578181015183820152602001614f13565b83811115612fca5750506000910152565b600081614f4b57614f4b614fdd565b506000190190565b600181811c90821680614f6757607f821691505b60208210811415614f8857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614fa257614fa2614fdd565b5060010190565b600060ff821660ff811415614fc057614fc0614fdd565b60010192915050565b600082614fd857614fd8614ff3565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146116da57600080fdfea26469706673582212204280a2b3733ce26907b5d9b38d3689194f5e47164bc14b4e010c94f1022a85c064736f6c63430008070033

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

00000000000000000000000014034484b8e6f6525576a357537a8d39b1464c16000000000000000000000000bc7ef2918e83daa3abe677721d227d203d868297000000000000000000000000094c3492c21f11942e4afb42b26449ac88bd53a8

-----Decoded View---------------
Arg [0] : jagAddress (address): 0x14034484B8E6F6525576A357537a8d39b1464c16
Arg [1] : buckAddress (address): 0xbC7eF2918E83DAa3AbE677721D227d203D868297
Arg [2] : treeAddress (address): 0x094C3492c21f11942e4AfB42B26449ac88BD53A8

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000014034484b8e6f6525576a357537a8d39b1464c16
Arg [1] : 000000000000000000000000bc7ef2918e83daa3abe677721d227d203d868297
Arg [2] : 000000000000000000000000094c3492c21f11942e4afb42b26449ac88bd53a8


Deployed Bytecode Sourcemap

47337:15001:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37838:41;;;;;;;;;;-1:-1:-1;37838:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7492:14:1;;7485:22;7467:41;;7455:2;7440:18;37838:41:0;;;;;;;;22045:305;;;;;;;;;;-1:-1:-1;22045:305:0;;;;;:::i;:::-;;:::i;40102:1844::-;;;;;;:::i;:::-;;:::i;:::-;;48532:40;;;;;;;;;;-1:-1:-1;48532:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20240:25:1;;;20228:2;20213:18;48532:40:0;20094:177:1;22990:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24549:221::-;;;;;;;;;;-1:-1:-1;24549:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6202:32:1;;;6184:51;;6172:2;6157:18;24549:221:0;6038:203:1;45645:120:0;;;;;;;;;;-1:-1:-1;45645:120:0;;;;;:::i;:::-;;:::i;24072:411::-;;;;;;;;;;-1:-1:-1;24072:411:0;;;;;:::i;:::-;;:::i;47378:21::-;;;;;;;;;;-1:-1:-1;47378:21:0;;;;-1:-1:-1;;;;;47378:21:0;;;46634:189;;;;;;;;;;-1:-1:-1;46634:189:0;;;;;:::i;:::-;;:::i;36951:33::-;;;;;;;;;;;;;;;;37030;;;;;;;;;;;;;;;;47527:37;;;;;;;;;;;;;;;;37886:41;;;;;;;;;;-1:-1:-1;37886:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36991:32;;;;;;;;;;;;;;;;52581:1460;;;;;;;;;;-1:-1:-1;52581:1460:0;;;;;:::i;:::-;;:::i;56074:167::-;;;;;;;;;;;;;:::i;47571:38::-;;;;;;;;;;;;;;;;46831:168;;;:::i;49373:640::-;;;;;;;;;;;;;:::i;41958:1863::-;;;;;;:::i;:::-;;:::i;54049:1524::-;;;;;;;;;;-1:-1:-1;54049:1524:0;;;;;:::i;:::-;;:::i;55952:114::-;;;;;;;;;;;;;:::i;45553:84::-;;;;;;;;;;-1:-1:-1;45553:84:0;;;;;:::i;:::-;;:::i;55831:112::-;;;;;;;;;;;;;:::i;47616:39::-;;;;;;;;;;;;;;;;45956:235;;;;;;;;;;;;;:::i;37111:34::-;;;;;;;;;;;;;;;;36881:25;;;;;;;;;;-1:-1:-1;36881:25:0;;;;-1:-1:-1;;;;;36881:25:0;;;22684:239;;;;;;;;;;-1:-1:-1;22684:239:0;;;;;:::i;:::-;;:::i;22414:208::-;;;;;;;;;;-1:-1:-1;22414:208:0;;;;;:::i;:::-;;:::i;4366:94::-;;;;;;;;;;;;;:::i;50684:1557::-;;;;;;;;;;-1:-1:-1;50684:1557:0;;;;;:::i;:::-;;:::i;47786:34::-;;;;;;;;;;-1:-1:-1;47786:34:0;;;;;;;;47487:33;;;;;;;;;;;;;;;;47702:34;;;;;;;;;;;;;;;;37431:52;;;;;;;;;;-1:-1:-1;37431:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;3715:87;;;;;;;;;;-1:-1:-1;3788:6:0;;-1:-1:-1;;;;;3788:6:0;3715:87;;52462:111;;;;;;;;;;-1:-1:-1;52462:111:0;;;;;:::i;:::-;;:::i;46434:192::-;;;;;;;;;;-1:-1:-1;46434:192:0;;;;;:::i;:::-;;:::i;23159:104::-;;;;;;;;;;;;;:::i;37070:34::-;;;;;;;;;;;;;;;;45773:175;;;;;;;;;;;;;:::i;55714:108::-;;;;;;;;;;;;;:::i;24842:295::-;;;;;;;;;;-1:-1:-1;24842:295:0;;;;;:::i;:::-;;:::i;50025:651::-;;;;;;;;;;;;;:::i;38293:1797::-;;;;;;:::i;:::-;;:::i;56249:158::-;;;;;;;;;;-1:-1:-1;56249:158:0;;;;;:::i;:::-;;:::i;26105:328::-;;;;;;;;;;-1:-1:-1;26105:328:0;;;;;:::i;:::-;;:::i;47447:33::-;;;;;;;;;;;;;;;;37319:48;;;;;;;;;;-1:-1:-1;37319:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;36911:27;;;;;;;;;;-1:-1:-1;36911:27:0;;;;-1:-1:-1;;;;;36911:27:0;;;56415:580;;;;;;;;;;-1:-1:-1;56415:580:0;;;;;:::i;:::-;;:::i;37374:50::-;;;;;;;;;;-1:-1:-1;37374:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;48579:25;;;;;;;;;;-1:-1:-1;48579:25:0;;;;;;;;;;;20701:4:1;20689:17;;;20671:36;;20659:2;20644:18;48579:25:0;20529:184:1;43961:1584:0;;;;;;;;;;-1:-1:-1;43961:1584:0;;;;;:::i;:::-;;:::i;47408:32::-;;;;;;;;;;;;;;;;46199:223;;;;;;;;;;;;;:::i;36854:22::-;;;;;;;;;;-1:-1:-1;36854:22:0;;;;-1:-1:-1;;;;;36854:22:0;;;25208:164;;;;;;;;;;-1:-1:-1;25208:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25329:25:0;;;25305:4;25329:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25208:164;47743:34;;;;;;;;;;;;;;;;47662:33;;;;;;;;;;;;;;;;4615:192;;;;;;;;;;-1:-1:-1;4615:192:0;;;;;:::i;:::-;;:::i;52253:201::-;;;;;;;;;;;;;:::i;48746:615::-;;;;;;;;;;;;;:::i;22045:305::-;22147:4;-1:-1:-1;;;;;;22184:40:0;;-1:-1:-1;;;22184:40:0;;:105;;-1:-1:-1;;;;;;;22241:48:0;;-1:-1:-1;;;22241:48:0;22184:105;:158;;;-1:-1:-1;;;;;;;;;;15434:40:0;;;22306:36;22164:178;22045:305;-1:-1:-1;;22045:305:0:o;40102:1844::-;40206:13;;40192:10;40179;;:23;;;;:::i;:::-;:40;;40171:76;;;;-1:-1:-1;;;40171:76:0;;;;;;;:::i;:::-;;;;;;;;;40286:10;40279:4;;:17;;;;:::i;:::-;40266:9;:30;40258:76;;;;-1:-1:-1;;;40258:76:0;;;;;;;:::i;:::-;40351:6;;;;:14;;:6;:14;40347:1152;;;40403:10;40393:21;;;;:9;:21;;;;;;;;:29;;:21;:29;40385:139;;;;-1:-1:-1;;;40385:139:0;;;;;;;:::i;:::-;40635:13;;40607:10;40596:22;;;;:10;:22;;;;;;;;;40571:10;:22;;;;;;40547:9;:21;;;;;;40621:10;;40596:22;40547:46;;;:::i;:::-;:71;;;;:::i;:::-;:84;;;;:::i;:::-;:101;;40539:140;;;;-1:-1:-1;;;40539:140:0;;;;;;;:::i;:::-;40713:10;40702:22;;;;:10;:22;;;;;;40741:1;;40702:35;;40727:10;;40702:35;:::i;:::-;:40;;40694:147;;;;-1:-1:-1;;;40694:147:0;;;;;;;:::i;:::-;40347:1152;;;40872:13;;;;;;;;:21;;:13;:21;40868:631;;;40929:10;40919:21;;;;:9;:21;;;;;;;;:29;;:21;:29;;40918:66;;-1:-1:-1;40964:10:0;40954:21;;;;:9;:21;;;;;;;;:29;;:21;:29;40918:66;40910:146;;;;-1:-1:-1;;;40910:146:0;;;;;;;:::i;40868:631::-;41423:10;;;;;;;:18;;41437:4;41423:18;41415:72;;;;-1:-1:-1;;;41415:72:0;;;;;;;:::i;:::-;41528:1;41511:428;41536:10;41531:1;:15;41511:428;;41568:10;:12;;;:10;:12;;;:::i;:::-;;;;-1:-1:-1;;41631:12:0;;41671:10;;-1:-1:-1;;;;;41631:12:0;;;;:27;;41659:10;;41671:17;;41684:4;41671:17;:::i;:::-;41631:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41595:14;:33;41610:10;;41623:4;41610:17;;;;:::i;:::-;41595:33;;;;;;;;;;;;;;-1:-1:-1;41595:33:0;;;:94;;;;41715:10;41704:22;;:10;:22;;;;;:24;;;;;;:::i;:::-;;;;-1:-1:-1;;41759:10:0;41743:27;;;;:15;:27;;;;;:29;;;;;;:::i;:::-;;;;;;41843:14;:33;41858:10;;41871:4;41858:17;;;;:::i;:::-;41843:33;;;;;;;;;;;;;;-1:-1:-1;41843:33:0;;;;41829:10;41815:25;;:13;:25;;;;;:61;;41843:33;41815:61;:::i;:::-;41801:10;41787:25;;;;:13;:25;;;;;:89;;;;41909:10;;41891:36;;41801:10;41909:17;;41922:4;41909:17;:::i;:::-;41891:5;:36::i;:::-;41548:3;;;;:::i;:::-;;;;41511:428;;;;40102:1844;:::o;22990:100::-;23044:13;23077:5;23070:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22990:100;:::o;24549:221::-;24625:7;28032:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28032:16:0;24645:73;;;;-1:-1:-1;;;24645:73:0;;16067:2:1;24645:73:0;;;16049:21:1;16106:2;16086:18;;;16079:30;16145:34;16125:18;;;16118:62;-1:-1:-1;;;16196:18:1;;;16189:42;16248:19;;24645:73:0;15865:408:1;24645:73:0;-1:-1:-1;24738:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24738:24:0;;24549:221::o;45645:120::-;3788:6;;-1:-1:-1;;;;;3788:6:0;2669:10;3935:23;3927:68;;;;-1:-1:-1;;;3927:68:0;;;;;;;:::i;:::-;45725:13:::1;:32:::0;45645:120::o;24072:411::-;24153:13;24169:23;24184:7;24169:14;:23::i;:::-;24153:39;;24217:5;-1:-1:-1;;;;;24211:11:0;:2;-1:-1:-1;;;;;24211:11:0;;;24203:57;;;;-1:-1:-1;;;24203:57:0;;17251:2:1;24203:57:0;;;17233:21:1;17290:2;17270:18;;;17263:30;17329:34;17309:18;;;17302:62;-1:-1:-1;;;17380:18:1;;;17373:31;17421:19;;24203:57:0;17049:397:1;24203:57:0;2669:10;-1:-1:-1;;;;;24295:21:0;;;;:62;;-1:-1:-1;24320:37:0;24337:5;2669:10;25208:164;:::i;24320:37::-;24273:168;;;;-1:-1:-1;;;24273:168:0;;13391:2:1;24273:168:0;;;13373:21:1;13430:2;13410:18;;;13403:30;13469:34;13449:18;;;13442:62;13540:26;13520:18;;;13513:54;13584:19;;24273:168:0;13189:420:1;24273:168:0;24454:21;24463:2;24467:7;24454:8;:21::i;:::-;24142:341;24072:411;;:::o;46634:189::-;3788:6;;-1:-1:-1;;;;;3788:6:0;2669:10;3935:23;3927:68;;;;-1:-1:-1;;;3927:68:0;;;;;;;:::i;:::-;46715:9:::1;46710:106;46734:8;:15;46730:1;:19;46710:106;;;46796:4;46771:9;:22;46781:8;46790:1;46781:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;46771:22:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;46771:22:0;:29;;-1:-1:-1;;46771:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46751:3;::::1;::::0;::::1;:::i;:::-;;;;46710:106;;52581:1460:::0;52688:4;52677:7;:15;52673:1361;;52724:3;52713:7;:14;52709:326;;52748:6;;:29;;-1:-1:-1;;;52748:29:0;;-1:-1:-1;;;;;6476:15:1;;;52748:29:0;;;6458:34:1;6528:15;;;6508:18;;;6501:43;52748:6:0;;;;:19;;6393:18:1;;52748:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;52796:19:0;;;;;;:13;:19;;;;;:21;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;52836:17:0;;;;;;:13;:17;;;;;:19;;;;;;:::i;:::-;;;;-1:-1:-1;;52918:21:0;;;;:12;:21;;;;;;;;;-1:-1:-1;;;;;52896:19:0;;;;:13;:19;;;;;;;:43;;52918:21;52896:43;:::i;:::-;-1:-1:-1;;;;;52874:19:0;;;;;;;:13;:19;;;;;;;;:65;;;;52998:21;;;:12;:21;;;;;;52978:17;;;;;;;;;;;:41;;52998:21;52978:41;:::i;:::-;-1:-1:-1;;;;;52958:17:0;;;;;;:13;:17;;;;;:61;52709:326;53051:38;53071:4;53077:2;53081:7;53051:19;:38::i;52673:1361::-;53131:4;53121:7;:14;53120:37;;;;;53152:4;53141:7;:15;;53120:37;53116:918;;;53189:4;53178:7;:15;53174:335;;53214:6;;:29;;-1:-1:-1;;;53214:29:0;;-1:-1:-1;;;;;6476:15:1;;;53214:29:0;;;6458:34:1;6528:15;;;6508:18;;;6501:43;53214:6:0;;;;:19;;6393:18:1;;53214:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;53262:21:0;;;;;;:15;:21;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;53304:19:0;;;;;;:15;:19;;;;;:21;;;;;;:::i;:::-;;;;-1:-1:-1;;53388:23:0;;;;:14;:23;;;;;;;;;-1:-1:-1;;;;;53366:19:0;;;;:13;:19;;;;;;;:45;;53388:23;53366:45;:::i;:::-;-1:-1:-1;;;;;53344:19:0;;;;;;;:13;:19;;;;;;;;:67;;;;53470:23;;;:14;:23;;;;;;53450:17;;;;;;;;;;;:43;;53470:23;53450:43;:::i;53116:918::-;53604:4;53594:7;:14;53590:444;;;53640:4;53629:7;:15;53625:343;;53665:6;;:29;;-1:-1:-1;;;53665:29:0;;-1:-1:-1;;;;;6476:15:1;;;53665:29:0;;;6458:34:1;6528:15;;;6508:18;;;6501:43;53665:6:0;;;;:19;;6393:18:1;;53665:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;53713:23:0;;;;;;:17;:23;;;;;:25;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;53757:21:0;;;;;;:17;:21;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;53843:25:0;;;;:16;:25;;;;;;;;;-1:-1:-1;;;;;53821:19:0;;;;:13;:19;;;;;;;:47;;53843:25;53821:47;:::i;:::-;-1:-1:-1;;;;;53799:19:0;;;;;;;:13;:19;;;;;;;;:69;;;;53927:25;;;:16;:25;;;;;;53907:17;;;;;;;;;;;:45;;53927:25;53907:45;:::i;56074:167::-;56121:7;56219:14;;56202;;56186:13;;56173:10;;56160;;56148:9;;:22;;;;:::i;:::-;:35;;;;:::i;:::-;:51;;;;:::i;:::-;:68;;;;:::i;:::-;:85;;;;:::i;:::-;56141:92;;56074:167;:::o;46831:168::-;3788:6;;-1:-1:-1;;;;;3788:6:0;2669:10;3935:23;3927:68;;;;-1:-1:-1;;;3927:68:0;;;;;;;:::i;:::-;46906:58:::1;::::0;46888:12:::1;::::0;46914:10:::1;::::0;46938:21:::1;::::0;46888:12;46906:58;46888:12;46906:58;46938:21;46914:10;46906:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46887:77;;;46983:7;46975:16;;;::::0;::::1;;46876:123;46831:168::o:0;49373:640::-;49424:14;;;;:23;49416:85;;;;-1:-1:-1;;;49416:85:0;;;;;;;:::i;:::-;49536:10;49520:27;;;;:15;:27;;;;;;49551:1;-1:-1:-1;49520:32:0;49512:95;;;;-1:-1:-1;;;49512:95:0;;19137:2:1;49512:95:0;;;19119:21:1;19176:2;19156:18;;;19149:30;19215:34;19195:18;;;19188:62;-1:-1:-1;;;19266:18:1;;;19259:38;19314:19;;49512:95:0;18935:404:1;49512:95:0;49648:17;;49626:14;;:18;;49643:1;49626:18;:::i;:::-;:39;;49618:84;;;;-1:-1:-1;;;49618:84:0;;10017:2:1;49618:84:0;;;9999:21:1;10056:2;10036:18;;;10029:30;10095:31;10075:18;;;10068:59;10144:18;;49618:84:0;9815:353:1;49618:84:0;49723:6;;49748:13;;-1:-1:-1;;;;;49723:6:0;;;;:11;;49735:10;;49748:35;;49764:19;49748:35;:::i;:::-;49723:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49796:14:0;:16;;;-1:-1:-1;49796:14:0;-1:-1:-1;49796:14:0;:16;;;:::i;:::-;;;;-1:-1:-1;;49863:12:0;;49903:14;;-1:-1:-1;;;;;49863:12:0;;;;:27;;49891:10;;49903:21;;49920:4;49903:21;:::i;:::-;49863:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49823:14;:37;49838:14;;49855:4;49838:21;;;;:::i;:::-;49823:37;;;;;;;;;;;:102;;;;49936:40;49942:10;49954:14;;49971:4;49954:21;;;;:::i;49936:40::-;49987:18;:16;:18::i;:::-;49373:640::o;41958:1863::-;42070:13;;42056:10;42043;;:23;;;;:::i;:::-;:40;;42035:77;;;;-1:-1:-1;;;42035:77:0;;;;;;;:::i;:::-;42151:10;42144:4;;:17;;;;:::i;:::-;42131:9;:30;42123:77;;;;-1:-1:-1;;;42123:77:0;;;;;;;:::i;:::-;42217:6;;;;:14;;:6;:14;42213:1153;;;42269:10;42259:21;;;;:9;:21;;;;;;;;:29;;:21;:29;42251:139;;;;-1:-1:-1;;;42251:139:0;;;;;;;:::i;:::-;42501:13;;42473:10;42462:22;;;;:10;:22;;;;;;;;;42437:10;:22;;;;;;42413:9;:21;;;;;;42487:10;;42462:22;42413:46;;;:::i;:::-;:71;;;;:::i;:::-;:84;;;;:::i;:::-;:101;;42405:140;;;;-1:-1:-1;;;42405:140:0;;;;;;;:::i;:::-;42579:10;42568:22;;;;:10;:22;;;;;;42607:1;;42568:35;;42593:10;;42568:35;:::i;:::-;:40;;42560:147;;;;-1:-1:-1;;;42560:147:0;;;;;;;:::i;:::-;42213:1153;;;42738:13;;;;;;;;:21;;:13;:21;42734:632;;;42795:10;42785:21;;;;:9;:21;;;;;;;;:29;;:21;:29;;42784:66;;-1:-1:-1;42830:10:0;42820:21;;;;:9;:21;;;;;;;;:29;;:21;:29;42784:66;42776:146;;;;-1:-1:-1;;;42776:146:0;;;;;;;:::i;42734:632::-;43289:10;;;;;;;:18;;43303:4;43289:18;43281:73;;;;-1:-1:-1;;;43281:73:0;;;;;;;:::i;:::-;43395:1;43378:436;43403:10;43398:1;:15;43378:436;;43435:10;:12;;;:10;:12;;;:::i;:::-;;;;-1:-1:-1;;43500:14:0;;43542:10;;-1:-1:-1;;;;;43500:14:0;;;;:29;;43530:10;;43542:17;;43555:4;43542:17;:::i;:::-;43500:60;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43462:16;:35;43479:10;;43492:4;43479:17;;;;:::i;:::-;43462:35;;;;;;;;;;;;;;-1:-1:-1;43462:35:0;;;:98;;;;43586:10;43575:22;;:10;:22;;;;;:24;;;;;;:::i;:::-;;;;-1:-1:-1;;43632:10:0;43614:29;;;;:17;:29;;;;;:31;;;;;;:::i;:::-;;;;;;43716:16;:35;43733:10;;43746:4;43733:17;;;;:::i;:::-;43716:35;;;;;;;;;;;;;;-1:-1:-1;43716:35:0;;;;43702:10;43688:25;;:13;:25;;;;;:63;;43716:35;43688:63;:::i;:::-;43674:10;43660:25;;;;:13;:25;;;;;:91;;;;43784:10;;43766:36;;43674:10;43784:17;;43797:4;43784:17;:::i;43766:36::-;43415:3;;;;:::i;:::-;;;;43378:436;;54049:1524;54160:4;54149:7;:15;54145:1421;;54196:3;54185:7;:14;54181:326;;54220:6;;:29;;-1:-1:-1;;;54220:29:0;;-1:-1:-1;;;;;6476:15:1;;;54220:29:0;;;6458:34:1;6528:15;;;6508:18;;;6501:43;54220:6:0;;;;:19;;6393:18:1;;54220:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;54268:19:0;;;;;;:13;:19;;;;;:21;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;54308:17:0;;;;;;:13;:17;;;;;:19;;;;;;:::i;:::-;;;;-1:-1:-1;;54390:21:0;;;;:12;:21;;;;;;;;;-1:-1:-1;;;;;54368:19:0;;;;:13;:19;;;;;;;:43;;54390:21;54368:43;:::i;:::-;-1:-1:-1;;;;;54346:19:0;;;;;;;:13;:19;;;;;;;;:65;;;;54470:21;;;:12;:21;;;;;;54450:17;;;;;;;;;;;:41;;54470:21;54450:41;:::i;:::-;-1:-1:-1;;;;;54430:17:0;;;;;;:13;:17;;;;;:61;54181:326;54539:42;54563:4;54569:2;54573:7;54539:23;:42::i;54145:1421::-;54623:4;54613:7;:14;54612:37;;;;;54644:4;54633:7;:15;;54612:37;54608:958;;;54681:4;54670:7;:15;54666:335;;54706:6;;:29;;-1:-1:-1;;;54706:29:0;;-1:-1:-1;;;;;6476:15:1;;;54706:29:0;;;6458:34:1;6528:15;;;6508:18;;;6501:43;54706:6:0;;;;:19;;6393:18:1;;54706:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;54754:21:0;;;;;;:15;:21;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;54796:19:0;;;;;;:15;:19;;;;;:21;;;;;;:::i;:::-;;;;-1:-1:-1;;54880:23:0;;;;:14;:23;;;;;;;;;-1:-1:-1;;;;;54858:19:0;;;;:13;:19;;;;;;;:45;;54880:23;54858:45;:::i;:::-;-1:-1:-1;;;;;54836:19:0;;;;;;;:13;:19;;;;;;;;:67;;;;54962:23;;;:14;:23;;;;;;54942:17;;;;;;;;;;;:43;;54962:23;54942:43;:::i;54608:958::-;55116:4;55106:7;:14;55102:464;;;55152:4;55141:7;:15;55137:343;;55177:6;;:29;;-1:-1:-1;;;55177:29:0;;-1:-1:-1;;;;;6476:15:1;;;55177:29:0;;;6458:34:1;6528:15;;;6508:18;;;6501:43;55177:6:0;;;;:19;;6393:18:1;;55177:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;55225:23:0;;;;;;:17;:23;;;;;:25;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;55269:21:0;;;;;;:17;:21;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;55355:25:0;;;;:16;:25;;;;;;;;;-1:-1:-1;;;;;55333:19:0;;;;:13;:19;;;;;;;:47;;55355:25;55333:47;:::i;:::-;-1:-1:-1;;;;;55311:19:0;;;;;;;:13;:19;;;;;;;;:69;;;;55439:25;;;:16;:25;;;;;;55419:17;;;;;;;;;;;:45;;55439:25;55419:45;:::i;55952:114::-;56004:7;56044:14;;56031:10;;:27;;;;:::i;45553:84::-;3788:6;;-1:-1:-1;;;;;3788:6:0;2669:10;3935:23;3927:68;;;;-1:-1:-1;;;3927:68:0;;;;;;;:::i;:::-;45615:4:::1;:14:::0;45553:84::o;55831:112::-;55881:7;55921:14;;55908:10;;:27;;;;:::i;45956:235::-;3788:6;;-1:-1:-1;;;;;3788:6:0;2669:10;3935:23;3927:68;;;;-1:-1:-1;;;3927:68:0;;;;;;;:::i;:::-;46019:13:::1;::::0;::::1;;::::0;;::::1;;:21;;:13;:21;46015:169;;;46057:13;:21:::0;;-1:-1:-1;;46057:21:0::1;::::0;;49373:640::o;46015:169::-:1;46120:13;:20:::0;;-1:-1:-1;;46120:20:0::1;;;::::0;;46171:1:::1;46155:13;:17:::0;45956:235::o;22684:239::-;22756:7;22792:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22792:16:0;22827:19;22819:73;;;;-1:-1:-1;;;22819:73:0;;14227:2:1;22819:73:0;;;14209:21:1;14266:2;14246:18;;;14239:30;14305:34;14285:18;;;14278:62;-1:-1:-1;;;14356:18:1;;;14349:39;14405:19;;22819:73:0;14025:405:1;22414:208:0;22486:7;-1:-1:-1;;;;;22514:19:0;;22506:74;;;;-1:-1:-1;;;22506:74:0;;13816:2:1;22506:74:0;;;13798:21:1;13855:2;13835:18;;;13828:30;13894:34;13874:18;;;13867:62;-1:-1:-1;;;13945:18:1;;;13938:40;13995:19;;22506:74:0;13614:406:1;22506:74:0;-1:-1:-1;;;;;;22598:16:0;;;;;:9;:16;;;;;;;22414:208::o;4366:94::-;3788:6;;-1:-1:-1;;;;;3788:6:0;2669:10;3935:23;3927:68;;;;-1:-1:-1;;;3927:68:0;;;;;;;:::i;:::-;4431:21:::1;4449:1;4431:9;:21::i;50684:1557::-:0;50774:15;50782:6;50774:7;:15::i;:::-;-1:-1:-1;;;;;50760:29:0;:10;-1:-1:-1;;;;;50760:29:0;;50752:38;;;;;;50814:1;50805:6;:10;:27;;;;;50829:3;50819:6;:13;;50805:27;50801:1433;;;50886:8;;;50857:13;;;:5;:13;;;;;;50886:8;;;;;50857:25;;;;;;;:::i;:::-;:37;;50849:46;;;;;;50914:7;50910:323;50927:9;50923:13;;:1;:13;;;50910:323;;;50962:6;;:30;;-1:-1:-1;;;50962:30:0;;50981:10;50962:30;;;6184:51:1;-1:-1:-1;;;;;50962:6:0;;;;:18;;6157::1;;50962:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51034:20:0;;;;:12;:20;;;;;;:24;;-1:-1:-1;51057:1:0;51034:24;:::i;:::-;51011:20;;;;:12;:20;;;;;;;;:47;;;;51093:5;:13;;;;:17;;51109:1;51093:17;:::i;:::-;51077:13;;;;:5;:13;;;;;:33;51129:6;;51171:12;;-1:-1:-1;;;;;51129:6:0;;;;:11;;51141:10;;51192:1;;51171:16;;51192:1;;51171:16;:::i;:::-;51155:12;;:33;;;;:::i;:::-;51154:39;;;;:::i;:::-;51153:63;;51197:19;51153:63;:::i;:::-;51129:88;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50938:3;;;;;:::i;:::-;;;;50910:323;;50801:1433;51272:4;51263:6;:13;:31;;;;;51290:4;51280:6;:14;;51263:31;51259:975;;;51348:8;;;51319:13;;;:5;:13;;;;;;51348:8;;;;;51319:25;;;;;;;:::i;:::-;:37;;51311:46;;;;;;51376:7;51372:329;51389:9;51385:13;;:1;:13;;;51372:329;;;51424:6;;:30;;-1:-1:-1;;;51424:30:0;;51443:10;51424:30;;;6184:51:1;-1:-1:-1;;;;;51424:6:0;;;;:18;;6157::1;;51424:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51498:22:0;;;;:14;:22;;;;;;:26;;-1:-1:-1;51523:1:0;51498:26;:::i;:::-;51473:22;;;;:14;:22;;;;;;;;:51;;;;51559:5;:13;;;;:17;;51575:1;51559:17;:::i;:::-;51543:13;;;;:5;:13;;;;;:33;51595:6;;51638:13;;-1:-1:-1;;;;;51595:6:0;;;;:11;;51607:10;;51660:1;;51638:17;;51660:1;;51638:17;:::i;:::-;51621:13;;:35;;;;:::i;:::-;51620:41;;;;:::i;:::-;51619:65;;51665:19;51619:65;:::i;:::-;51595:90;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51400:3;;;;;:::i;:::-;;;;51372:329;;51259:975;51740:4;51731:6;:13;:31;;;;;51758:4;51748:6;:14;;51731:31;51727:507;;;51816:8;;;51787:13;;;:5;:13;;;;;;51816:8;;;;;51787:25;;;;;;;:::i;:::-;:37;;51779:46;;;;;;51844:7;51840:333;51857:9;51853:13;;:1;:13;;;51840:333;;;51892:6;;:30;;-1:-1:-1;;;51892:30:0;;51911:10;51892:30;;;6184:51:1;-1:-1:-1;;;;;51892:6:0;;;;:18;;6157::1;;51892:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51968:24:0;;;;:16;:24;;;;;;:28;;-1:-1:-1;51995:1:0;51968:28;:::i;:::-;51941:24;;;;:16;:24;;;;;;;;:55;;;;52031:5;:13;;;;:17;;52047:1;52031:17;:::i;:::-;52015:13;;;;:5;:13;;;;;:33;52067:6;;52110:13;;-1:-1:-1;;;;;52067:6:0;;;;:11;;52079:10;;52132:1;;52110:17;;52132:1;;52110:17;:::i;:::-;52093:13;;:35;;;;:::i;:::-;52092:41;;;;:::i;:::-;52091:65;;52137:19;52091:65;:::i;:::-;52067:90;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51868:3;;;;;:::i;:::-;;;;51840:333;;52462:111;3788:6;;-1:-1:-1;;;;;3788:6:0;2669:10;3935:23;3927:68;;;;-1:-1:-1;;;3927:68:0;;;;;;;:::i;:::-;52534:6:::1;:31:::0;;-1:-1:-1;;;;;;52534:31:0::1;-1:-1:-1::0;;;;;52534:31:0;;;::::1;::::0;;;::::1;::::0;;52462:111::o;46434:192::-;3788:6;;-1:-1:-1;;;;;3788:6:0;2669:10;3935:23;3927:68;;;;-1:-1:-1;;;3927:68:0;;;;;;;:::i;:::-;46522:9:::1;46517:102;46541:8;:15;46537:1;:19;46517:102;;;46603:4;46578:9;:22;46588:8;46597:1;46588:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;46578:22:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;46578:22:0;:29;;-1:-1:-1;;46578:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46558:3;::::1;::::0;::::1;:::i;:::-;;;;46517:102;;23159:104:::0;23215:13;23248:7;23241:14;;;;;:::i;45773:175::-;3788:6;;-1:-1:-1;;;;;3788:6:0;2669:10;3935:23;3927:68;;;;-1:-1:-1;;;3927:68:0;;;;;;;:::i;:::-;45829:6:::1;::::0;::::1;;:14;;:6:::0;:14:::1;45825:116;;;45860:6;:14:::0;;-1:-1:-1;;45860:14:0::1;::::0;;49373:640::o;45825:116::-:1;45916:6;:13:::0;;-1:-1:-1;;45916:13:0::1;45925:4;45916:13;::::0;;45773:175::o;55714:108::-;55762:7;55801:13;;55789:9;;:25;;;;:::i;24842:295::-;-1:-1:-1;;;;;24945:24:0;;2669:10;24945:24;;24937:62;;;;-1:-1:-1;;;24937:62:0;;11136:2:1;24937:62:0;;;11118:21:1;11175:2;11155:18;;;11148:30;11214:27;11194:18;;;11187:55;11259:18;;24937:62:0;10934:349:1;24937:62:0;2669:10;25012:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25012:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25012:53:0;;;;;;;;;;25081:48;;7467:41:1;;;25012:42:0;;2669:10;25081:48;;7440:18:1;25081:48:0;;;;;;;24842:295;;:::o;50025:651::-;50078:14;;;;:23;50070:85;;;;-1:-1:-1;;;50070:85:0;;;;;;;:::i;:::-;50192:10;50174:29;;;;:17;:29;;;;;;50207:1;-1:-1:-1;50174:34:0;50166:97;;;;-1:-1:-1;;;50166:97:0;;12619:2:1;50166:97:0;;;12601:21:1;12658:2;12638:18;;;12631:30;12697:34;12677:18;;;12670:62;-1:-1:-1;;;12748:18:1;;;12741:40;12798:19;;50166:97:0;12417:406:1;50166:97:0;50304:17;;50282:14;;:18;;50299:1;50282:18;:::i;:::-;:39;;50274:86;;;;-1:-1:-1;;;50274:86:0;;11846:2:1;50274:86:0;;;11828:21:1;11885:2;11865:18;;;11858:30;11924:33;11904:18;;;11897:61;11975:18;;50274:86:0;11644:355:1;50274:86:0;50382:6;;50407:13;;-1:-1:-1;;;;;50382:6:0;;;;:11;;50394:10;;50407:35;;50423:19;50407:35;:::i;:::-;50382:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50455:14:0;:16;;;-1:-1:-1;50455:14:0;-1:-1:-1;50455:14:0;:16;;;:::i;:::-;;;;-1:-1:-1;;50524:14:0;;50566;;-1:-1:-1;;;;;50524:14:0;;;;:29;;50554:10;;50566:21;;50583:4;50566:21;:::i;:::-;50524:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50482:16;:39;50499:14;;50516:4;50499:21;;;;:::i;:::-;50482:39;;;;;;;;;;;:106;;;;50599:40;50605:10;50617:14;;50634:4;50617:21;;;;:::i;38293:1797::-;38395:12;;38381:10;38369:9;;:22;;;;:::i;:::-;:38;;38361:75;;;;-1:-1:-1;;;38361:75:0;;;;;;;:::i;:::-;38475:10;38468:4;;:17;;;;:::i;:::-;38455:9;:30;38447:75;;;;-1:-1:-1;;;38447:75:0;;;;;;;:::i;:::-;38539:6;;;;:14;;:6;:14;38535:1151;;;38591:10;38581:21;;;;:9;:21;;;;;;;;:29;;:21;:29;38573:139;;;;-1:-1:-1;;;38573:139:0;;;;;;;:::i;:::-;38823:13;;38795:10;38784:22;;;;:10;:22;;;;;;;;;38759:10;:22;;;;;;38735:9;:21;;;;;;38809:10;;38784:22;38735:46;;;:::i;:::-;:71;;;;:::i;:::-;:84;;;;:::i;:::-;:101;;38727:140;;;;-1:-1:-1;;;38727:140:0;;;;;;;:::i;:::-;38900:10;38890:21;;;;:9;:21;;;;;;38928:1;;38890:34;;38914:10;;38890:34;:::i;:::-;:39;;38882:147;;;;-1:-1:-1;;;38882:147:0;;;;;;;:::i;:::-;38535:1151;;;39060:13;;;;;;;;:21;;:13;:21;39056:630;;;39117:10;39107:21;;;;:9;:21;;;;;;;;:29;;:21;:29;;39106:66;;-1:-1:-1;39152:10:0;39142:21;;;;:9;:21;;;;;;;;:29;;:21;:29;39106:66;39098:146;;;;-1:-1:-1;;;39098:146:0;;;;;;;:::i;39056:630::-;39611:10;;;;;;;:18;;39625:4;39611:18;39603:71;;;;-1:-1:-1;;;39603:71:0;;;;;;;:::i;:::-;39715:1;39698:385;39723:10;39718:1;:15;39698:385;;39755:9;:11;;;:9;:11;;;:::i;:::-;;;;-1:-1:-1;;39807:10:0;;39844:9;;39807:47;;-1:-1:-1;;;39807:47:0;;-1:-1:-1;;;;;39807:10:0;;;;:24;;:47;;39832:10;;39844:9;39807:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39794:9;;39781:23;;;;:12;:23;;;;;;;;:73;;;;39879:10;39869:21;;:9;:21;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;39921:10:0;39907:25;;;;:13;:25;;;;;:27;;;;;;:::i;:::-;;;;-1:-1:-1;;40018:9:0;;40005:23;;;;:12;:23;;;;;;;;;39991:10;39977:25;;:13;:25;;;;;;;:51;;40005:23;39977:51;:::i;:::-;39963:10;39949:25;;;;:13;:25;;;;;:79;;;;40061:9;;40043:28;;39963:10;40043:5;:28::i;:::-;39735:3;;;;:::i;:::-;;;;39698:385;;56249:158;56354:6;;56304:7;;-1:-1:-1;;;;;56354:6:0;56332:10;:29;56324:38;;;;;;-1:-1:-1;;;;;;56380:19:0;;;;;:13;:19;;;;;;;56249:158::o;26105:328::-;26280:41;2669:10;26313:7;26280:18;:41::i;:::-;26272:103;;;;-1:-1:-1;;;26272:103:0;;;;;;;:::i;:::-;26386:39;26400:4;26406:2;26410:7;26419:5;26386:13;:39::i;:::-;26105:328;;;;:::o;56415:580::-;56487:13;56522:12;;;;;56521:35;;;56551:4;56540:7;:15;;56521:35;56513:77;;;;-1:-1:-1;;;56513:77:0;;11490:2:1;56513:77:0;;;11472:21:1;11529:2;11509:18;;;11502:30;11568:29;11548:18;;;11541:57;11615:18;;56513:77:0;11288:351:1;56513:77:0;56618:4;56607:7;:15;56603:385;;56646:10;;;56681:21;;;:12;:21;;;;;;;;56646:57;;-1:-1:-1;;;56646:57:0;;;;;20450:25:1;;;20491:18;;;20484:34;;;;-1:-1:-1;;;;;56646:10:0;;;;:25;;20423:18:1;;56646:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56646:57:0;;;;;;;;;;;;:::i;56603:385::-;56745:4;56735:7;:14;56734:37;;;;;56766:4;56755:7;:15;;56734:37;56730:258;;;56795:12;;;56834:23;;;:14;:23;;;;;;;;56795:63;;-1:-1:-1;;;56795:63:0;;;;;20450:25:1;;;20491:18;;;20484:34;;;;-1:-1:-1;;;;;56795:12:0;;;;:29;;20423:18:1;;56795:63:0;20276:248:1;56730:258:0;56907:14;;;56950:25;;;:16;:25;;;;;;;;56907:69;;-1:-1:-1;;;56907:69:0;;;;;20450:25:1;;;20491:18;;;20484:34;;;;-1:-1:-1;;;;;56907:14:0;;;;:33;;20423:18:1;;56907:69:0;20276:248:1;56730:258:0;56415:580;;;:::o;43961:1584::-;3788:6;;-1:-1:-1;;;;;3788:6:0;2669:10;3935:23;3927:68;;;;-1:-1:-1;;;3927:68:0;;;;;;;:::i;:::-;44042:12;44038:1500:::1;;44098:12;;44091:3;44079:9;;:15;;;;:::i;:::-;:31;;44071:40;;;::::0;::::1;;44143:1;44126:364;44151:3;44146:1;:8;44126:364;;44180:9;:11:::0;;;:9:::1;:11;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;44236:10:0::1;::::0;44273:9:::1;::::0;44236:47:::1;::::0;-1:-1:-1;;;44236:47:0;;-1:-1:-1;;;;;44236:10:0;;::::1;::::0;:24:::1;::::0;:47:::1;::::0;44261:10:::1;::::0;44273:9;44236:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44223:9;::::0;44210:23:::1;::::0;;;:12:::1;:23;::::0;;;;;;;:73;;;;44316:10:::1;44302:25:::0;;:13:::1;:25:::0;;;;;:27;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;44417:9:0::1;::::0;44404:23:::1;::::0;;;:12:::1;:23;::::0;;;;;;;;44390:10:::1;44376:25:::0;;:13:::1;:25:::0;;;;;;;:51:::1;::::0;44404:23;44376:51:::1;:::i;:::-;44362:10;44348:25;::::0;;;:13:::1;:25;::::0;;;;:79;;;;44464:9:::1;::::0;44446:28:::1;::::0;44362:10;44446:5:::1;:28::i;:::-;44156:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44126:364;;44038:1500;44523:7;44534:1;44523:12;44519:1019;;;44580:13;;44573:3;44560:10;;:16;;;;:::i;:::-;:33;;44552:42;;;::::0;::::1;;44626:1;44609:406;44634:3;44629:1;:8;44609:406;;44663:10;:12:::0;;;:10:::1;:12;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;44730:12:0::1;::::0;44770:10:::1;::::0;-1:-1:-1;;;;;44730:12:0;;::::1;::::0;:27:::1;::::0;44758:10:::1;::::0;44770:17:::1;::::0;44783:4:::1;44770:17;:::i;:::-;44730:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44694:14;:33;44709:10;;44722:4;44709:17;;;;:::i;:::-;44694:33:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;44694:33:0;;;:94;;;;44823:10:::1;44807:27:::0;;:15:::1;:27:::0;;;;;:29;;;::::1;::::0;::::1;:::i;:::-;;;;;;44911:14;:33;44926:10;;44939:4;44926:17;;;;:::i;:::-;44911:33:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;44911:33:0;;;;44897:10:::1;44883:25:::0;;:13:::1;:25:::0;;;;;:61:::1;::::0;44911:33;44883:61:::1;:::i;:::-;44869:10;44855:25;::::0;;;:13:::1;:25;::::0;;;;:89;;;;44981:10:::1;::::0;44963:36:::1;::::0;44869:10;44981:17:::1;::::0;44994:4:::1;44981:17;:::i;44963:36::-;44639:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44609:406;;44519:1019;45084:13;;45077:3;45064:10;;:16;;;;:::i;:::-;:33;;45056:42;;;::::0;::::1;;45130:1;45113:414;45138:3;45133:1;:8;45113:414;;45167:10;:12:::0;;;:10:::1;:12;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;45236:14:0::1;::::0;45278:10:::1;::::0;-1:-1:-1;;;;;45236:14:0;;::::1;::::0;:29:::1;::::0;45266:10:::1;::::0;45278:17:::1;::::0;45291:4:::1;45278:17;:::i;:::-;45236:60;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45198:16;:35;45215:10;;45228:4;45215:17;;;;:::i;:::-;45198:35:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;45198:35:0;;;:98;;;;45333:10:::1;45315:29:::0;;:17:::1;:29:::0;;;;;:31;;;::::1;::::0;::::1;:::i;:::-;;;;;;45421:16;:35;45438:10;;45451:4;45438:17;;;;:::i;:::-;45421:35:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;45421:35:0;;;;45407:10:::1;45393:25:::0;;:13:::1;:25:::0;;;;;:63:::1;::::0;45421:35;45393:63:::1;:::i;:::-;45379:10;45365:25;::::0;;;:13:::1;:25;::::0;;;;:91;;;;45493:10:::1;::::0;45475:36:::1;::::0;45379:10;45493:17:::1;::::0;45506:4:::1;45493:17;:::i;45475:36::-;45143:3:::0;::::1;::::0;::::1;:::i;:::-;;;;45113:414;;46199:223:::0;3788:6;;-1:-1:-1;;;;;3788:6:0;2669:10;3935:23;3927:68;;;;-1:-1:-1;;;3927:68:0;;;;;;;:::i;:::-;46259:10:::1;::::0;;;::::1;;;:18;;46273:4;46259:18;46255:160;;;46294:10;:18:::0;;-1:-1:-1;;46294:18:0::1;::::0;;49373:640::o;46255:160::-:1;46354:10;:17:::0;;-1:-1:-1;;46354:17:0::1;::::0;::::1;::::0;;46402:1:::1;46386:13;:17:::0;46199:223::o;4615:192::-;3788:6;;-1:-1:-1;;;;;3788:6:0;2669:10;3935:23;3927:68;;;;-1:-1:-1;;;3927:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4704:22:0;::::1;4696:73;;;::::0;-1:-1:-1;;;4696:73:0;;9253:2:1;4696:73:0::1;::::0;::::1;9235:21:1::0;9292:2;9272:18;;;9265:30;9331:34;9311:18;;;9304:62;-1:-1:-1;;;9382:18:1;;;9375:36;9428:19;;4696:73:0::1;9051:402:1::0;4696:73:0::1;4780:19;4790:8;4780:9;:19::i;52253:201::-:0;3788:6;;-1:-1:-1;;;;;3788:6:0;2669:10;3935:23;3927:68;;;;-1:-1:-1;;;3927:68:0;;;;;;;:::i;:::-;52311:14:::1;::::0;::::1;;:22;;:14:::0;:22:::1;52307:140;;;52350:14;:22:::0;;-1:-1:-1;;52350:22:0::1;::::0;;49373:640::o;52307:140::-:1;52414:14;:21:::0;;-1:-1:-1;;52414:21:0::1;52431:4;52414:21;::::0;;52253:201::o;48746:615::-;48795:14;;;;:23;48787:85;;;;-1:-1:-1;;;48787:85:0;;;;;;;:::i;:::-;48905:10;48891:25;;;;:13;:25;;;;;;48920:1;-1:-1:-1;48891:30:0;48883:92;;;;-1:-1:-1;;;48883:92:0;;19546:2:1;48883:92:0;;;19528:21:1;19585:2;19565:18;;;19558:30;19624:34;19604:18;;;19597:62;-1:-1:-1;;;19675:18:1;;;19668:35;19720:19;;48883:92:0;19344:401:1;48883:92:0;49015:16;;48994:13;;:17;;49010:1;48994:17;:::i;:::-;:37;;48986:81;;;;-1:-1:-1;;;48986:81:0;;15712:2:1;48986:81:0;;;15694:21:1;15751:2;15731:18;;;15724:30;15790:28;15770:18;;;15763:56;15836:18;;48986:81:0;15510:350:1;48986:81:0;49084:6;;49109:12;;-1:-1:-1;;;;;49084:6:0;;;;:11;;49096:10;;49109:34;;49124:19;49109:34;:::i;:::-;49084:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49156:13:0;:15;;;-1:-1:-1;49156:13:0;-1:-1:-1;49156:13:0;:15;;;:::i;:::-;;;;-1:-1:-1;;49218:10:0;;49255:13;;-1:-1:-1;;;;;49218:10:0;;;;:24;;49243:10;;49255:19;;49271:3;49255:19;:::i;:::-;49218:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49182:12;:33;49195:13;;49211:3;49195:19;;;;:::i;:::-;49182:33;;;;;;;;;;;:93;;;;49286:38;49292:10;49304:13;;49320:3;49304:19;;;;:::i;29921:382::-;-1:-1:-1;;;;;30001:16:0;;29993:61;;;;-1:-1:-1;;;29993:61:0;;15351:2:1;29993:61:0;;;15333:21:1;;;15370:18;;;15363:30;15429:34;15409:18;;;15402:62;15481:18;;29993:61:0;15149:356:1;29993:61:0;28008:4;28032:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28032:16:0;:30;30065:58;;;;-1:-1:-1;;;30065:58:0;;9660:2:1;30065:58:0;;;9642:21:1;9699:2;9679:18;;;9672:30;9738;9718:18;;;9711:58;9786:18;;30065:58:0;9458:352:1;30065:58:0;-1:-1:-1;;;;;30194:13:0;;;;;;:9;:13;;;;;:18;;30211:1;;30194:13;:18;;30211:1;;30194:18;:::i;:::-;;;;-1:-1:-1;;30223:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30223:21:0;-1:-1:-1;;;;;30223:21:0;;;;;;;;30262:33;;30223:16;;;30262:33;;30223:16;;30262:33;29921:382;;:::o;31925:174::-;32000:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32000:29:0;-1:-1:-1;;;;;32000:29:0;;;;;;;;:24;;32054:23;32000:24;32054:14;:23::i;:::-;-1:-1:-1;;;;;32045:46:0;;;;;;;;;;;31925:174;;:::o;25439:339::-;25634:41;2669:10;25667:7;25634:18;:41::i;:::-;25626:103;;;;-1:-1:-1;;;25626:103:0;;;;;;;:::i;:::-;25742:28;25752:4;25758:2;25762:7;25742:9;:28::i;57124:5211::-;57172:21;57196:18;:16;:18::i;:::-;57172:42;;57225:22;57250:20;:18;:20::i;:::-;57225:45;;57281:22;57306;:20;:22::i;:::-;57281:47;-1:-1:-1;57377:14:0;57355:17;:13;57371:1;57355:17;:::i;:::-;57354:37;;57353:83;;;;-1:-1:-1;57421:14:0;57398:18;:14;57415:1;57398:18;:::i;:::-;57397:38;;57353:83;57349:4979;;;57453:9;57487:14;57466:17;:13;57482:1;57466:17;:::i;:::-;57465:36;;;;:::i;:::-;57453:48;-1:-1:-1;57516:9:0;57551:14;57529:18;:14;57546:1;57529:18;:::i;:::-;57528:37;;;;:::i;:::-;57516:49;;57585:7;57580:479;57598:15;:22;57594:26;;;;57580:479;;;57650:6;57646:101;;57696:3;57681:12;:18;57722:5;;57646:101;57774:15;57790:1;57774:18;;;;;;;;;;:::i;:::-;;;;;;;;;57769:1;:23;57765:130;;;57832:12;57845:1;57832:15;;;;;;;;;;:::i;:::-;;;;;;;;;;;57817:12;:30;57870:5;;57765:130;57921:15;57937:2;57921:19;;;;;;;;:::i;:::-;;;;;;;;;57917:1;:23;57913:131;;;57980:12;57993:2;57980:16;;;;;;;;:::i;57913:131::-;57622:3;;;;:::i;:::-;;;;57580:479;;;;58078:7;58073:639;58091:15;:22;58087:26;;;;58073:639;;;58143:6;58139:144;;58190:3;58174:13;:19;58232:3;58216:13;:19;58258:5;;58139:144;58310:15;58326:1;58310:18;;;;;;;;;;:::i;:::-;;;;;;;;;58305:1;:23;58301:188;;;58369:13;58383:1;58369:16;;;;;;;;;;:::i;:::-;;;;;;;;;58353:13;:32;;;;58424:14;58439:1;58424:17;;;;;;;;;;:::i;:::-;;;;;;;;;;;58408:13;:33;58464:5;;58301:188;58515:15;58531:2;58515:19;;;;;;;;:::i;:::-;;;;;;;;;58511:1;:23;58507:190;;;58575:13;58589:2;58575:17;;;;;;;;:::i;:::-;;;;;;;;;58559:13;:33;;;;58631:14;58646:2;58631:18;;;;;;;;:::i;58507:190::-;58115:3;;;;:::i;:::-;;;;58073:639;;;;57438:1285;;24142:341;24072:411;;:::o;57349:4979::-;58765:14;58744:17;:13;58760:1;58744:17;:::i;:::-;58743:36;58742:81;;;;-1:-1:-1;58808:14:0;58786:18;:14;58803:1;58786:18;:::i;:::-;58785:37;58742:81;58738:3590;;;58840:9;58870:17;:13;58886:1;58870:17;:::i;:::-;58852:36;;:14;:36;:::i;:::-;58840:48;-1:-1:-1;58903:9:0;58933:18;:14;58950:1;58933:18;:::i;:::-;58915:37;;:14;:37;:::i;:::-;58903:49;;58972:7;58967:362;58985:15;:22;58981:26;;;;58967:362;;;59042:15;59058:1;59042:18;;;;;;;;;;:::i;:::-;;;;;;;;;59037:1;:23;59033:131;;;59100:13;59114:1;59100:16;;;;;;;;;;:::i;:::-;;;;;;;;;;;59085:12;:31;59139:5;;59033:131;59190:15;59206:2;59190:19;;;;;;;;:::i;:::-;;;;;;;;;59186:1;:23;59182:132;;;59249:13;59263:2;59249:17;;;;;;;;:::i;59182:132::-;59009:3;;;;:::i;:::-;;;;58967:362;;;;59348:7;59343:477;59361:15;:22;59357:26;;;;59343:477;;;59418:15;59434:1;59418:18;;;;;;;;;;:::i;:::-;;;;;;;;;59413:1;:23;59409:188;;;59477:14;59492:1;59477:17;;;;;;;;;;:::i;:::-;;;;;;;;;59461:13;:33;;;;59533:13;59547:1;59533:16;;;;;;;;;;:::i;59409:188::-;59623:15;59639:2;59623:19;;;;;;;;:::i;:::-;;;;;;;;;59619:1;:23;59615:190;;;59683:14;59698:2;59683:18;;;;;;;;:::i;:::-;;;;;;;;;59667:13;:34;;;;59740:13;59754:2;59740:17;;;;;;;;:::i;59615:190::-;59385:3;;;;:::i;:::-;;;;59343:477;;58738:3590;59874:14;59852:17;:13;59868:1;59852:17;:::i;:::-;59851:37;;59850:82;;;;-1:-1:-1;59917:14:0;59895:18;:14;59912:1;59895:18;:::i;:::-;59894:37;59850:82;59846:2482;;;59949:9;59983:14;59962:17;:13;59978:1;59962:17;:::i;:::-;59961:36;;;;:::i;:::-;59949:48;-1:-1:-1;60012:9:0;60042:18;:14;60059:1;60042:18;:::i;:::-;60024:37;;:14;:37;:::i;:::-;60012:49;;60081:7;60076:479;60094:15;:22;60090:26;;;;60076:479;;;60146:6;60142:101;;60192:3;60177:12;:18;60218:5;;60142:101;60270:15;60286:1;60270:18;;;;;;;;;;:::i;:::-;;;;;;;;;60265:1;:23;60261:130;;;60328:12;60341:1;60328:15;;;;;;;;;;:::i;:::-;;;;;;;;;;;60313:12;:30;60366:5;;60261:130;60417:15;60433:2;60417:19;;;;;;;;:::i;:::-;;;;;;;;;60413:1;:23;60409:131;;;60476:12;60489:2;60476:16;;;;;;;;:::i;60409:131::-;60118:3;;;;:::i;:::-;;;;60076:479;;;;60574:7;60569:477;60587:15;:22;60583:26;;;;60569:477;;;60644:15;60660:1;60644:18;;;;;;;;;;:::i;:::-;;;;;;;;;60639:1;:23;60635:188;;;60703:14;60718:1;60703:17;;;;;;;;;;:::i;60635:188::-;60849:15;60865:2;60849:19;;;;;;;;:::i;:::-;;;;;;;;;60845:1;:23;60841:190;;;60909:14;60924:2;60909:18;;;;;;;;:::i;60841:190::-;60611:3;;;;:::i;:::-;;;;60569:477;;59846:2482;61099:14;61078:17;:13;61094:1;61078:17;:::i;:::-;61077:36;61076:82;;;;-1:-1:-1;61143:14:0;61120:18;:14;61137:1;61120:18;:::i;:::-;61119:38;;61076:82;61072:1256;;;61175:9;61205:17;:13;61221:1;61205:17;:::i;:::-;61187:36;;:14;:36;:::i;:::-;61175:48;-1:-1:-1;61238:9:0;61273:14;61251:18;:14;61268:1;61251:18;:::i;:::-;61250:37;;;;:::i;:::-;61238:49;;61307:7;61302:362;61320:15;:22;61316:26;;;;61302:362;;;61377:15;61393:1;61377:18;;;;;;;;;;:::i;:::-;;;;;;;;;61372:1;:23;61368:131;;;61435:13;61449:1;61435:16;;;;;;;;;;:::i;:::-;;;;;;;;;;;61420:12;:31;61474:5;;61368:131;61525:15;61541:2;61525:19;;;;;;;;:::i;:::-;;;;;;;;;61521:1;:23;61517:132;;;61584:13;61598:2;61584:17;;;;;;;;:::i;61517:132::-;61344:3;;;;:::i;:::-;;;;61302:362;;;;61683:7;61678:639;61696:15;:22;61692:26;;;;61678:639;;;61748:6;61744:144;;61795:3;61779:13;:19;61837:3;61821:13;:19;61863:5;;61744:144;61915:15;61931:1;61915:18;;;;;;;;;;:::i;:::-;;;;;;;;;61910:1;:23;61906:188;;;61974:13;61988:1;61974:16;;;;;;;;;;:::i;61906:188::-;62120:15;62136:2;62120:19;;;;;;;;:::i;:::-;;;;;;;;;62116:1;:23;62112:190;;;62180:13;62194:2;62180:17;;;;;;;;:::i;62112:190::-;61720:3;;;;:::i;:::-;;;;61678:639;;25849:185;25987:39;26004:4;26010:2;26014:7;25987:39;;;;;;;;;;;;:16;:39::i;4815:173::-;4890:6;;;-1:-1:-1;;;;;4907:17:0;;;-1:-1:-1;;;;;;4907:17:0;;;;;;;4940:40;;4890:6;;;4907:17;4890:6;;4940:40;;4871:16;;4940:40;4860:128;4815:173;:::o;28237:348::-;28330:4;28032:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28032:16:0;28347:73;;;;-1:-1:-1;;;28347:73:0;;12206:2:1;28347:73:0;;;12188:21:1;12245:2;12225:18;;;12218:30;12284:34;12264:18;;;12257:62;-1:-1:-1;;;12335:18:1;;;12328:42;12387:19;;28347:73:0;12004:408:1;28347:73:0;28431:13;28447:23;28462:7;28447:14;:23::i;:::-;28431:39;;28500:5;-1:-1:-1;;;;;28489:16:0;:7;-1:-1:-1;;;;;28489:16:0;;:51;;;;28533:7;-1:-1:-1;;;;;28509:31:0;:20;28521:7;28509:11;:20::i;:::-;-1:-1:-1;;;;;28509:31:0;;28489:51;:87;;;-1:-1:-1;;;;;;25329:25:0;;;25305:4;25329:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28544:32;28481:96;28237:348;-1:-1:-1;;;;28237:348:0:o;27315:315::-;27472:28;27482:4;27488:2;27492:7;27472:9;:28::i;:::-;27519:48;27542:4;27548:2;27552:7;27561:5;27519:22;:48::i;:::-;27511:111;;;;-1:-1:-1;;;27511:111:0;;;;;;;:::i;31229:578::-;31388:4;-1:-1:-1;;;;;31361:31:0;:23;31376:7;31361:14;:23::i;:::-;-1:-1:-1;;;;;31361:31:0;;31353:85;;;;-1:-1:-1;;;31353:85:0;;16841:2:1;31353:85:0;;;16823:21:1;16880:2;16860:18;;;16853:30;16919:34;16899:18;;;16892:62;-1:-1:-1;;;16970:18:1;;;16963:39;17019:19;;31353:85:0;16639:405:1;31353:85:0;-1:-1:-1;;;;;31457:16:0;;31449:65;;;;-1:-1:-1;;;31449:65:0;;10731:2:1;31449:65:0;;;10713:21:1;10770:2;10750:18;;;10743:30;10809:34;10789:18;;;10782:62;-1:-1:-1;;;10860:18:1;;;10853:34;10904:19;;31449:65:0;10529:400:1;31449:65:0;31631:29;31648:1;31652:7;31631:8;:29::i;:::-;-1:-1:-1;;;;;31673:15:0;;;;;;:9;:15;;;;;:20;;31692:1;;31673:15;:20;;31692:1;;31673:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31704:13:0;;;;;;:9;:13;;;;;:18;;31721:1;;31704:13;:18;;31721:1;;31704:18;:::i;:::-;;;;-1:-1:-1;;31733:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31733:21:0;-1:-1:-1;;;;;31733:21:0;;;;;;;;;31772:27;;31733:16;;31772:27;;;;;;;31229:578;;;:::o;32664:799::-;32819:4;-1:-1:-1;;;;;32840:13:0;;6001:20;6049:8;32836:620;;32876:72;;-1:-1:-1;;;32876:72:0;;-1:-1:-1;;;;;32876:36:0;;;;;:72;;2669:10;;32927:4;;32933:7;;32942:5;;32876:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32876:72:0;;;;;;;;-1:-1:-1;;32876:72:0;;;;;;;;;;;;:::i;:::-;;;32872:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33118:13:0;;33114:272;;33161:60;;-1:-1:-1;;;33161:60:0;;;;;;;:::i;33114:272::-;33336:6;33330:13;33321:6;33317:2;33313:15;33306:38;32872:529;-1:-1:-1;;;;;;32999:51:0;-1:-1:-1;;;32999:51:0;;-1:-1:-1;32992:58:0;;32836:620;-1:-1:-1;33440:4:0;32664:799;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:186;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:888::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1408:18;1400:6;1397:30;1394:50;;;1440:1;1437;1430:12;1394:50;1463:22;;1516:4;1508:13;;1504:27;-1:-1:-1;1494:55:1;;1545:1;1542;1535:12;1494:55;1581:2;1568:16;1606:48;1622:31;1650:2;1622:31;:::i;:::-;1606:48;:::i;:::-;1677:2;1670:5;1663:17;1717:7;1712:2;1707;1703;1699:11;1695:20;1692:33;1689:53;;;1738:1;1735;1728:12;1689:53;1793:2;1788;1784;1780:11;1775:2;1768:5;1764:14;1751:45;1837:1;1832:2;1827;1820:5;1816:14;1812:23;1805:34;1858:5;1848:15;;;;;981:888;;;;;;;:::o;1874:347::-;1939:6;1947;2000:2;1988:9;1979:7;1975:23;1971:32;1968:52;;;2016:1;2013;2006:12;1968:52;2039:29;2058:9;2039:29;:::i;:::-;2029:39;;2118:2;2107:9;2103:18;2090:32;2165:5;2158:13;2151:21;2144:5;2141:32;2131:60;;2187:1;2184;2177:12;2131:60;2210:5;2200:15;;;1874:347;;;;;:::o;2226:254::-;2294:6;2302;2355:2;2343:9;2334:7;2330:23;2326:32;2323:52;;;2371:1;2368;2361:12;2323:52;2394:29;2413:9;2394:29;:::i;:::-;2384:39;2470:2;2455:18;;;;2442:32;;-1:-1:-1;;;2226:254:1:o;2485:963::-;2569:6;2600:2;2643;2631:9;2622:7;2618:23;2614:32;2611:52;;;2659:1;2656;2649:12;2611:52;2699:9;2686:23;2728:18;2769:2;2761:6;2758:14;2755:34;;;2785:1;2782;2775:12;2755:34;2823:6;2812:9;2808:22;2798:32;;2868:7;2861:4;2857:2;2853:13;2849:27;2839:55;;2890:1;2887;2880:12;2839:55;2926:2;2913:16;2948:2;2944;2941:10;2938:36;;;2954:18;;:::i;:::-;3000:2;2997:1;2993:10;2983:20;;3023:28;3047:2;3043;3039:11;3023:28;:::i;:::-;3085:15;;;3116:12;;;;3148:11;;;3178;;;3174:20;;3171:33;-1:-1:-1;3168:53:1;;;3217:1;3214;3207:12;3168:53;3239:1;3230:10;;3249:169;3263:2;3260:1;3257:9;3249:169;;;3320:23;3339:3;3320:23;:::i;:::-;3308:36;;3281:1;3274:9;;;;;3364:12;;;;3396;;3249:169;;;-1:-1:-1;3437:5:1;2485:963;-1:-1:-1;;;;;;;;2485:963:1:o;3453:245::-;3511:6;3564:2;3552:9;3543:7;3539:23;3535:32;3532:52;;;3580:1;3577;3570:12;3532:52;3619:9;3606:23;3638:30;3662:5;3638:30;:::i;3703:249::-;3772:6;3825:2;3813:9;3804:7;3800:23;3796:32;3793:52;;;3841:1;3838;3831:12;3793:52;3873:9;3867:16;3892:30;3916:5;3892:30;:::i;3957:635::-;4037:6;4090:2;4078:9;4069:7;4065:23;4061:32;4058:52;;;4106:1;4103;4096:12;4058:52;4139:9;4133:16;4172:18;4164:6;4161:30;4158:50;;;4204:1;4201;4194:12;4158:50;4227:22;;4280:4;4272:13;;4268:27;-1:-1:-1;4258:55:1;;4309:1;4306;4299:12;4258:55;4338:2;4332:9;4363:48;4379:31;4407:2;4379:31;:::i;4363:48::-;4434:2;4427:5;4420:17;4474:7;4469:2;4464;4460;4456:11;4452:20;4449:33;4446:53;;;4495:1;4492;4485:12;4446:53;4508:54;4559:2;4554;4547:5;4543:14;4538:2;4534;4530:11;4508:54;:::i;:::-;4581:5;3957:635;-1:-1:-1;;;;;3957:635:1:o;4597:180::-;4656:6;4709:2;4697:9;4688:7;4684:23;4680:32;4677:52;;;4725:1;4722;4715:12;4677:52;-1:-1:-1;4748:23:1;;4597:180;-1:-1:-1;4597:180:1:o;4782:184::-;4852:6;4905:2;4893:9;4884:7;4880:23;4876:32;4873:52;;;4921:1;4918;4911:12;4873:52;-1:-1:-1;4944:16:1;;4782:184;-1:-1:-1;4782:184:1:o;4971:248::-;5039:6;5047;5100:2;5088:9;5079:7;5075:23;5071:32;5068:52;;;5116:1;5113;5106:12;5068:52;-1:-1:-1;;5139:23:1;;;5209:2;5194:18;;;5181:32;;-1:-1:-1;4971:248:1:o;5224:337::-;5290:6;5298;5351:2;5339:9;5330:7;5326:23;5322:32;5319:52;;;5367:1;5364;5357:12;5319:52;5403:9;5390:23;5380:33;;5463:2;5452:9;5448:18;5435:32;5507:4;5500:5;5496:16;5489:5;5486:27;5476:55;;5527:1;5524;5517:12;5566:257;5607:3;5645:5;5639:12;5672:6;5667:3;5660:19;5688:63;5744:6;5737:4;5732:3;5728:14;5721:4;5714:5;5710:16;5688:63;:::i;:::-;5805:2;5784:15;-1:-1:-1;;5780:29:1;5771:39;;;;5812:4;5767:50;;5566:257;-1:-1:-1;;5566:257:1:o;6555:488::-;-1:-1:-1;;;;;6824:15:1;;;6806:34;;6876:15;;6871:2;6856:18;;6849:43;6923:2;6908:18;;6901:34;;;6971:3;6966:2;6951:18;;6944:31;;;6749:4;;6992:45;;7017:19;;7009:6;6992:45;:::i;:::-;6984:53;6555:488;-1:-1:-1;;;;;;6555:488:1:o;7048:274::-;-1:-1:-1;;;;;7240:32:1;;;;7222:51;;7304:2;7289:18;;7282:34;7210:2;7195:18;;7048:274::o;8408:219::-;8557:2;8546:9;8539:21;8520:4;8577:44;8617:2;8606:9;8602:18;8594:6;8577:44;:::i;8632:414::-;8834:2;8816:21;;;8873:2;8853:18;;;8846:30;8912:34;8907:2;8892:18;;8885:62;-1:-1:-1;;;8978:2:1;8963:18;;8956:48;9036:3;9021:19;;8632:414::o;10173:351::-;10375:2;10357:21;;;10414:2;10394:18;;;10387:30;10453:29;10448:2;10433:18;;10426:57;10515:2;10500:18;;10173:351::o;12828:356::-;13030:2;13012:21;;;13049:18;;;13042:30;13108:34;13103:2;13088:18;;13081:62;13175:2;13160:18;;12828:356::o;14435:349::-;14637:2;14619:21;;;14676:2;14656:18;;;14649:30;14715:27;14710:2;14695:18;;14688:55;14775:2;14760:18;;14435:349::o;14789:355::-;14991:2;14973:21;;;15030:2;15010:18;;;15003:30;15069:33;15064:2;15049:18;;15042:61;15135:2;15120:18;;14789:355::o;16278:356::-;16480:2;16462:21;;;16499:18;;;16492:30;16558:34;16553:2;16538:18;;16531:62;16625:2;16610:18;;16278:356::o;17451:349::-;17653:2;17635:21;;;17692:2;17672:18;;;17665:30;17731:27;17726:2;17711:18;;17704:55;17791:2;17776:18;;17451:349::o;17805:348::-;18007:2;17989:21;;;18046:2;18026:18;;;18019:30;18085:26;18080:2;18065:18;;18058:54;18144:2;18129:18;;17805:348::o;18158:413::-;18360:2;18342:21;;;18399:2;18379:18;;;18372:30;18438:34;18433:2;18418:18;;18411:62;-1:-1:-1;;;18504:2:1;18489:18;;18482:47;18561:3;18546:19;;18158:413::o;18576:354::-;18778:2;18760:21;;;18817:2;18797:18;;;18790:30;18856:32;18851:2;18836:18;;18829:60;18921:2;18906:18;;18576:354::o;19750:339::-;19952:2;19934:21;;;19991:2;19971:18;;;19964:30;-1:-1:-1;;;20025:2:1;20010:18;;20003:45;20080:2;20065:18;;19750:339::o;20718:275::-;20789:2;20783:9;20854:2;20835:13;;-1:-1:-1;;20831:27:1;20819:40;;20889:18;20874:34;;20910:22;;;20871:62;20868:88;;;20936:18;;:::i;:::-;20972:2;20965:22;20718:275;;-1:-1:-1;20718:275:1:o;20998:186::-;21046:4;21079:18;21071:6;21068:30;21065:56;;;21101:18;;:::i;:::-;-1:-1:-1;21167:2:1;21146:15;-1:-1:-1;;21142:29:1;21173:4;21138:40;;20998:186::o;21189:128::-;21229:3;21260:1;21256:6;21253:1;21250:13;21247:39;;;21266:18;;:::i;:::-;-1:-1:-1;21302:9:1;;21189:128::o;21322:120::-;21362:1;21388;21378:35;;21393:18;;:::i;:::-;-1:-1:-1;21427:9:1;;21322:120::o;21447:168::-;21487:7;21553:1;21549;21545:6;21541:14;21538:1;21535:21;21530:1;21523:9;21516:17;21512:45;21509:71;;;21560:18;;:::i;:::-;-1:-1:-1;21600:9:1;;21447:168::o;21620:125::-;21660:4;21688:1;21685;21682:8;21679:34;;;21693:18;;:::i;:::-;-1:-1:-1;21730:9:1;;21620:125::o;21750:258::-;21822:1;21832:113;21846:6;21843:1;21840:13;21832:113;;;21922:11;;;21916:18;21903:11;;;21896:39;21868:2;21861:10;21832:113;;;21963:6;21960:1;21957:13;21954:48;;;-1:-1:-1;;21998:1:1;21980:16;;21973:27;21750:258::o;22013:136::-;22052:3;22080:5;22070:39;;22089:18;;:::i;:::-;-1:-1:-1;;;22125:18:1;;22013:136::o;22154:380::-;22233:1;22229:12;;;;22276;;;22297:61;;22351:4;22343:6;22339:17;22329:27;;22297:61;22404:2;22396:6;22393:14;22373:18;22370:38;22367:161;;;22450:10;22445:3;22441:20;22438:1;22431:31;22485:4;22482:1;22475:15;22513:4;22510:1;22503:15;22367:161;;22154:380;;;:::o;22539:135::-;22578:3;-1:-1:-1;;22599:17:1;;22596:43;;;22619:18;;:::i;:::-;-1:-1:-1;22666:1:1;22655:13;;22539:135::o;22679:175::-;22716:3;22760:4;22753:5;22749:16;22789:4;22780:7;22777:17;22774:43;;;22797:18;;:::i;:::-;22846:1;22833:15;;22679:175;-1:-1:-1;;22679:175:1:o;22859:112::-;22891:1;22917;22907:35;;22922:18;;:::i;:::-;-1:-1:-1;22956:9:1;;22859:112::o;22976:127::-;23037:10;23032:3;23028:20;23025:1;23018:31;23068:4;23065:1;23058:15;23092:4;23089:1;23082:15;23108:127;23169:10;23164:3;23160:20;23157:1;23150:31;23200:4;23197:1;23190:15;23224:4;23221:1;23214:15;23240:127;23301:10;23296:3;23292:20;23289:1;23282:31;23332:4;23329:1;23322:15;23356:4;23353:1;23346:15;23372:127;23433:10;23428:3;23424:20;23421:1;23414:31;23464:4;23461:1;23454:15;23488:4;23485:1;23478:15;23504:131;-1:-1:-1;;;;;;23578:32:1;;23568:43;;23558:71;;23625:1;23622;23615:12

Swarm Source

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