ETH Price: $2,647.96 (-1.05%)

Token

Future Turtles - Genesis (FT)
 

Overview

Max Total Supply

2,017 FT

Holders

716

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
digidigi.eth
Balance
57 FT
0x938aca4E2C8a7Fc42A289de1872E453d47f183B7
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:
futureTurtles

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

░██████╗░██╗░░░██╗░█████╗░██╗░░░░░██╗███████╗██╗███████╗██████╗░  ██████╗░███████╗██╗░░░██╗░██████╗
██╔═══██╗██║░░░██║██╔══██╗██║░░░░░██║██╔════╝██║██╔════╝██╔══██╗  ██╔══██╗██╔════╝██║░░░██║██╔════╝
██║██╗██║██║░░░██║███████║██║░░░░░██║█████╗░░██║█████╗░░██║░░██║  ██║░░██║█████╗░░╚██╗░██╔╝╚█████╗░
╚██████╔╝██║░░░██║██╔══██║██║░░░░░██║██╔══╝░░██║██╔══╝░░██║░░██║  ██║░░██║██╔══╝░░░╚████╔╝░░╚═══██╗
░╚═██╔═╝░╚██████╔╝██║░░██║███████╗██║██║░░░░░██║███████╗██████╔╝  ██████╔╝███████╗░░╚██╔╝░░██████╔╝
░░░╚═╝░░░░╚═════╝░╚═╝░░╚═╝╚══════╝╚═╝╚═╝░░░░░╚═╝╚══════╝╚═════╝░  ╚═════╝░╚══════╝░░░╚═╝░░░╚═════╝░
*/
//------------------------------------------------------------------------------
// Author: orion (@OrionDevStar)
//------------------------------------------------------------------------------

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/Turtle.sol


pragma solidity ^0.8.2;


//------------------------------------------------------------------------------
/*

░██████╗░██╗░░░██╗░█████╗░██╗░░░░░██╗███████╗██╗███████╗██████╗░  ██████╗░███████╗██╗░░░██╗░██████╗
██╔═══██╗██║░░░██║██╔══██╗██║░░░░░██║██╔════╝██║██╔════╝██╔══██╗  ██╔══██╗██╔════╝██║░░░██║██╔════╝
██║██╗██║██║░░░██║███████║██║░░░░░██║█████╗░░██║█████╗░░██║░░██║  ██║░░██║█████╗░░╚██╗░██╔╝╚█████╗░
╚██████╔╝██║░░░██║██╔══██║██║░░░░░██║██╔══╝░░██║██╔══╝░░██║░░██║  ██║░░██║██╔══╝░░░╚████╔╝░░╚═══██╗
░╚═██╔═╝░╚██████╔╝██║░░██║███████╗██║██║░░░░░██║███████╗██████╔╝  ██████╔╝███████╗░░╚██╔╝░░██████╔╝
░░░╚═╝░░░░╚═════╝░╚═╝░░╚═╝╚══════╝╚═╝╚═╝░░░░░╚═╝╚══════╝╚═════╝░  ╚═════╝░╚══════╝░░░╚═╝░░░╚═════╝░
*/
//------------------------------------------------------------------------------
// Author: orion (@OrionDevStar)
//------------------------------------------------------------------------------



contract futureTurtles is ERC721, Ownable {
  using Strings for uint256;
  using ECDSA for bytes32;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefixStage1 = "";
  string public uriPrefixStage2 = "";
  string public uriPrefixStage3 = "";
  string public uriPrefixStage4 = "";
  string public uriSuffix = ".json";
  string public hiddenMetadataUri;
  
  uint256 public QD = 8 ether;
  uint256 public presalecost = 0.068 ether;
  uint256 public publiccost = 0.098 ether;
  uint256 public supplyStage1 = 4995;
  uint256 public supplyStage2 = 2000;
  uint256 public supplyStage3 = 2000;
  uint256 public supplyStage4 = 1000;

  uint256 public maxPresale1 = 1000;
  uint256 public maxPresale2 = 5200;
  uint256 public maxPresale3 = 7200;
  uint256 public maxPresale4 = 9100;

  uint256 public especialSupply = 5;
  uint256 public maxMintAmountPresale = 5;
  uint256 public maxMintAmountProject = 100;
  uint256 public releasePhase = 1;

  bool public revealed1 = false;
  bool public revealed2 = false;
  bool public revealed3 = false;
  bool public revealed4 = false;

  bool public isPresale = true;

  address internal SIGNER;

  address[] internal payees;

  uint256[] internal payeesShares;

  mapping(address => uint256) public mintBalances;

  constructor(address[] memory _payees, uint256[] memory _shares, string memory _hiddenMetadataUri, address _SIGNER) 
        ERC721("Future Turtles - Genesis", "FT") {
    hiddenMetadataUri = _hiddenMetadataUri;
    payees = _payees;
    payeesShares = _shares;
    supply._value = especialSupply;
    SIGNER = _SIGNER;
  }

  //modifier
  modifier mintCompliance(uint256 _mintAmount)  {
    require(_mintAmount > 0, "Invalid mint amount!");
    require(supply.current() + _mintAmount <= maxSupply(), "Max supply exceeded!");
    _;
  }

  //internal
  function _checkHash(bytes32 _hash, bytes memory _signature, address _account ) internal view returns (bool) {
      bytes32 senderHash = _senderMessageHash();
      if (senderHash != _hash) {
          return false;
      }
      return _hash.recover(_signature) == _account;
  }   

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

  function _senderMessageHash() internal view returns (bytes32) {
      bytes32 message = keccak256(
          abi.encodePacked(
              "\x19Ethereum Signed Message:\n32",
              keccak256(abi.encodePacked(address(this), msg.sender))
          )
      );
      return message;
  }

  //external
  function setHiddenMetadataUri(string memory _hiddenMetadataUri) external onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }    

  function updateRelease(uint256 _releasePhase) external onlyOwner {
      releasePhase = _releasePhase;
  } 

  function setIsPresale() external onlyOwner {
    isPresale = !isPresale;
  }  

  function setRevealed1() external onlyOwner {
    revealed1 = !revealed1;
  }  

  function setRevealed2() external onlyOwner {
    revealed2 = !revealed2;
  }  

  function setRevealed3() external onlyOwner {
    revealed3 = !revealed3;
  }  

  function setRevealed4() external onlyOwner {
    revealed4 = !revealed4;
  }      

  function setSigner(address _address) external onlyOwner {
    SIGNER = _address;
  } 

  function setUriPrefixStage1(string memory _uriPrefix) external onlyOwner {
    uriPrefixStage1 = _uriPrefix;
  }

  function setUriPrefixStage2(string memory _uriPrefix) external onlyOwner {
    uriPrefixStage2 = _uriPrefix;
  }

  function setUriPrefixStage3(string memory _uriPrefix) external onlyOwner {
    uriPrefixStage3 = _uriPrefix;
  }

  function setUriPrefixStage4(string memory _uriPrefix) external onlyOwner {
    uriPrefixStage4 = _uriPrefix;
  }      

  function setUriSuffix(string memory _uriSuffix) external onlyOwner {
    uriSuffix = _uriSuffix;
  }  

  function withdrawAll() external payable onlyOwner {
      if(QD > 0){
      uint256 QDvalue;
        if (address(this).balance < QD) {
            QDvalue = address(this).balance;
            QD -= address(this).balance;
        } else {
            QDvalue = QD;
            QD = 0;
        }
        (bool qd, ) = payable(0x89a31e7658510Cfd960067cb97ddcc7Ece3c70C0).call{value: QDvalue}("");
        require(qd);      
      } else {
        for (uint256 i = 0; i < payees.length; i++) {     
          (bool os, ) = payable(payees[i]).call{value: address(this).balance*payeesShares[i]/100}("");
          require(os);
        }
      }      
  }

  //public
  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!isPresale, "Presale only.");
    require(msg.value >= publiccost * _mintAmount, "Insufficient funds!");
    _mintLoop(msg.sender, _mintAmount);
  }

  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    require(_mintAmount + mintBalances[msg.sender] <= maxMintAmountProject, "Invalid mint amount!");
    _mintLoop(_receiver, _mintAmount);
    mintBalances[msg.sender] += _mintAmount;
  }

  function airdropEspecials(address[] memory _receivers, uint256 inicialId) public onlyOwner {
    for (uint256 i = 0; i < _receivers.length; i++) {
      _safeMint(_receivers[i], inicialId);
      inicialId ++;
    }
  }

  function presaleMint(uint256 _mintAmount, bytes32 _hash, bytes memory _signature) public payable mintCompliance(_mintAmount) {
    require(isPresale, "Presale off.");
    require(_mintAmount + mintBalances[msg.sender] <= maxMintAmountPresale, "Invalid mint amount!");
    require(_checkHash(_hash, _signature, SIGNER), "Address is not on Presale List");
    require(msg.value >= presalecost * _mintAmount, "Insufficient funds!");
    uint256 maxPresale = releasePhase == 1 ? maxPresale1 : 
                         releasePhase == 2 ? maxPresale2 : 
                         releasePhase == 3 ? maxPresale3 : 
                         releasePhase == 4 ? maxPresale4 : 
                         0;
    require(supply.current() + _mintAmount <= maxPresale, "Max presale supply exceeded!");
    _mintLoop(msg.sender, _mintAmount);
    mintBalances[msg.sender] += _mintAmount;
  }

  function maxSupply() public view  returns(uint256) {
    return releasePhase == 1 ? supplyStage1 :
                releasePhase == 2 ? supplyStage1 + supplyStage2 :
                releasePhase == 3 ? supplyStage1 + supplyStage2 + supplyStage3 :
                releasePhase == 4 ? supplyStage1 + supplyStage2 + supplyStage3 + supplyStage4 : 
                0;
  }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory)
  {
    require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");


    uint256 stage = _tokenId <= supplyStage1+especialSupply ? 1 :
                    _tokenId <= supplyStage2+supplyStage1+especialSupply ? 2 :
                    _tokenId <= supplyStage3+supplyStage2+supplyStage1+especialSupply ? 3 :
                    _tokenId <= supplyStage4+supplyStage3+supplyStage2+supplyStage1+especialSupply ? 4 :
                    0;
    string memory currentBaseURI =  stage == 1 ? uriPrefixStage1 :
                                    stage == 2 ? uriPrefixStage2 :
                                    stage == 3 ? uriPrefixStage3 :
                                    stage == 4 ? uriPrefixStage4 :
                                    " ";
    if ((revealed1 == false && stage == 1) || (revealed2 == false && stage == 2) || (revealed3 == false && stage == 3) || (revealed4 == false && stage == 4)) {
      return hiddenMetadataUri;
    }

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

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }

  function walletOfOwner(address _owner) public view returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply()) {
      address currentTokenOwner = ownerOf(currentTokenId);
      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;
        ownedTokenIndex++;
      }
      currentTokenId++;
    }

    return ownedTokenIds;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_shares","type":"uint256[]"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"},{"internalType":"address","name":"_SIGNER","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":"QD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_receivers","type":"address[]"},{"internalType":"uint256","name":"inicialId","type":"uint256"}],"name":"airdropEspecials","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"especialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountProject","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresale1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresale2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresale3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresale4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalecost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publiccost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releasePhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed3","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed4","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setIsPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefixStage1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefixStage2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefixStage3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefixStage4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyStage1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyStage2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyStage3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyStage4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_releasePhase","type":"uint256"}],"name":"updateRelease","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefixStage1","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriPrefixStage2","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriPrefixStage3","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriPrefixStage4","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60a06040819052600060808190526200001b91600891620002be565b506040805160208101918290526000908190526200003c91600991620002be565b506040805160208101918290526000908190526200005d91600a91620002be565b506040805160208101918290526000908190526200007e91600b91620002be565b5060408051808201909152600580825264173539b7b760d91b6020909201918252620000ad91600c91620002be565b50676f05b59d3b200000600e5566f195a3c4ba0000600f5567015c2a7b13fd00006010556113836011556107d060128190556013556103e86014819055601555611450601655611c2060175561238c60185560056019819055601a556064601b556001601c55601d805464ffffffffff19166401000000001790553480156200013557600080fd5b5060405162003c7e38038062003c7e833981016040819052620001589162000525565b604080518082018252601881527f46757475726520547572746c6573202d2047656e657369730000000000000000602080830191825283518085019094526002845261119560f21b908401528151919291620001b791600091620002be565b508051620001cd906001906020840190620002be565b505050620001ea620001e46200026860201b60201c565b6200026c565b8151620001ff90600d906020850190620002be565b5083516200021590601e9060208701906200034d565b5082516200022b90601f906020860190620003a5565b50601954600755601d80546001600160a01b039092166501000000000002600160281b600160c81b031990921691909117905550620006e2915050565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620002cc906200068f565b90600052602060002090601f016020900481019282620002f057600085556200033b565b82601f106200030b57805160ff19168380011785556200033b565b828001600101855582156200033b579182015b828111156200033b5782518255916020019190600101906200031e565b5062000349929150620003e2565b5090565b8280548282559060005260206000209081019282156200033b579160200282015b828111156200033b57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200036e565b8280548282559060005260206000209081019282156200033b57916020028201828111156200033b5782518255916020019190600101906200031e565b5b80821115620003495760008155600101620003e3565b80516001600160a01b03811681146200041157600080fd5b919050565b600082601f8301126200042857600080fd5b81516020620004416200043b8362000669565b62000636565b80838252828201915082860187848660051b89010111156200046257600080fd5b60005b85811015620004835781518452928401929084019060010162000465565b5090979650505050505050565b600082601f830112620004a257600080fd5b81516001600160401b03811115620004be57620004be620006cc565b6020620004d4601f8301601f1916820162000636565b8281528582848701011115620004e957600080fd5b60005b8381101562000509578581018301518282018401528201620004ec565b838111156200051b5760008385840101525b5095945050505050565b600080600080608085870312156200053c57600080fd5b84516001600160401b03808211156200055457600080fd5b818701915087601f8301126200056957600080fd5b815160206200057c6200043b8362000669565b8083825282820191508286018c848660051b89010111156200059d57600080fd5b600096505b84871015620005cb57620005b681620003f9565b835260019690960195918301918301620005a2565b50918a0151919850909350505080821115620005e657600080fd5b620005f48883890162000416565b945060408701519150808211156200060b57600080fd5b506200061a8782880162000490565b9250506200062b60608601620003f9565b905092959194509250565b604051601f8201601f191681016001600160401b0381118282101715620006615762000661620006cc565b604052919050565b60006001600160401b03821115620006855762000685620006cc565b5060051b60200190565b600181811c90821680620006a457607f821691505b60208210811415620006c657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61358c80620006f26000396000f3fe6080604052600436106103c35760003560e01c806385547a69116101f2578063bc56602f1161010d578063da89e64e116100a0578063e985e9c51161006f578063e985e9c514610a2d578063efbd73f414610a76578063f2fde38b14610a96578063ff69072014610ab657600080fd5b8063da89e64e146109c3578063e0e091c5146109d8578063e42b30a9146109ed578063e976f3e114610a0d57600080fd5b8063d1c2b213116100dc578063d1c2b2131461096d578063d4ad268414610982578063d5abeb0114610998578063d8e28a98146109ad57600080fd5b8063bc56602f146108f9578063bf55171114610925578063bf9b7c8d1461093a578063c87b56dd1461094d57600080fd5b8063a45ba8e711610185578063b29c736d11610154578063b29c736d14610882578063b88d4fde146108a3578063b890b055146108c3578063ba92d98e146108e357600080fd5b8063a45ba8e71461082c578063a592185914610841578063a826cbe614610857578063a9515cbb1461086c57600080fd5b80639cd3f851116101c15780639cd3f851146107ba578063a0712d68146107da578063a22cb465146107ed578063a45801a21461080d57600080fd5b806385547a69146107455780638da5cb5b1461076557806395364a841461078357806395d89b41146107a557600080fd5b806346c9f267116102e25780636e74d2751161027557806371e86eed1161024457806371e86eed146106fc5780637c45c16f146107115780637effc03214610727578063853828b61461073d57600080fd5b80636e74d2751461069c57806370a08231146106b257806370ea5d1a146106d2578063715018a6146106e757600080fd5b80636352211e116102b15780636352211e146106265780636519f6cb146106465780636875b7461461065c5780636c19e7831461067c57600080fd5b806346c9f267146105c75780634fdd43cb146105dc5780635503a0e8146105fc5780635a0996771461061157600080fd5b806333c8405f1161035a5780633ebba305116103295780633ebba3051461054e57806342842e0e14610564578063430b21d614610584578063438b63001461059a57600080fd5b806333c8405f146104f2578063378b69eb146105085780633c327377146105225780633de37b491461053857600080fd5b806316ba10e01161039657806316ba10e01461047957806318160ddd146104995780631e387cb0146104bc57806323b872dd146104d257600080fd5b806301ffc9a7146103c857806306fdde03146103fd578063081812fc1461041f578063095ea7b314610457575b600080fd5b3480156103d457600080fd5b506103e86103e3366004612fe2565b610ad6565b60405190151581526020015b60405180910390f35b34801561040957600080fd5b50610412610b28565b6040516103f49190613262565b34801561042b57600080fd5b5061043f61043a366004613065565b610bba565b6040516001600160a01b0390911681526020016103f4565b34801561046357600080fd5b50610477610472366004612efe565b610c54565b005b34801561048557600080fd5b5061047761049436600461301c565b610d6a565b3480156104a557600080fd5b506104ae610dab565b6040519081526020016103f4565b3480156104c857600080fd5b506104ae60115481565b3480156104de57600080fd5b506104776104ed366004612e1e565b610dbb565b3480156104fe57600080fd5b506104ae60135481565b34801561051457600080fd5b50601d546103e89060ff1681565b34801561052e57600080fd5b506104ae601b5481565b34801561054457600080fd5b506104ae60155481565b34801561055a57600080fd5b506104ae601c5481565b34801561057057600080fd5b5061047761057f366004612e1e565b610dec565b34801561059057600080fd5b506104ae600f5481565b3480156105a657600080fd5b506105ba6105b5366004612dd0565b610e07565b6040516103f4919061321e565b3480156105d357600080fd5b50610477610eed565b3480156105e857600080fd5b506104776105f736600461301c565b610f2b565b34801561060857600080fd5b50610412610f68565b34801561061d57600080fd5b50610477610ff6565b34801561063257600080fd5b5061043f610641366004613065565b611041565b34801561065257600080fd5b506104ae60105481565b34801561066857600080fd5b50610477610677366004613065565b6110b8565b34801561068857600080fd5b50610477610697366004612dd0565b6110e7565b3480156106a857600080fd5b506104ae60145481565b3480156106be57600080fd5b506104ae6106cd366004612dd0565b611141565b3480156106de57600080fd5b506104776111c8565b3480156106f357600080fd5b5061047761120f565b34801561070857600080fd5b50610477611245565b34801561071d57600080fd5b506104ae600e5481565b34801561073357600080fd5b506104ae601a5481565b61047761128e565b34801561075157600080fd5b50610477610760366004612f28565b611437565b34801561077157600080fd5b506006546001600160a01b031661043f565b34801561078f57600080fd5b50601d546103e890640100000000900460ff1681565b3480156107b157600080fd5b506104126114b0565b3480156107c657600080fd5b506104776107d536600461301c565b6114bf565b6104776107e8366004613065565b6114fc565b3480156107f957600080fd5b50610477610808366004612ec2565b6115ff565b34801561081957600080fd5b50601d546103e890610100900460ff1681565b34801561083857600080fd5b5061041261160a565b34801561084d57600080fd5b506104ae60175481565b34801561086357600080fd5b50610412611617565b34801561087857600080fd5b506104ae60165481565b34801561088e57600080fd5b50601d546103e8906301000000900460ff1681565b3480156108af57600080fd5b506104776108be366004612e5a565b611624565b3480156108cf57600080fd5b50601d546103e89062010000900460ff1681565b3480156108ef57600080fd5b506104ae60195481565b34801561090557600080fd5b506104ae610914366004612dd0565b602080526000908152604090205481565b34801561093157600080fd5b5061041261165c565b6104776109483660046130a1565b611669565b34801561095957600080fd5b50610412610968366004613065565b6118ec565b34801561097957600080fd5b50610412611d12565b34801561098e57600080fd5b506104ae60125481565b3480156109a457600080fd5b506104ae611d1f565b3480156109b957600080fd5b506104ae60185481565b3480156109cf57600080fd5b50610477611da3565b3480156109e457600080fd5b50610412611df0565b3480156109f957600080fd5b50610477610a0836600461301c565b611dfd565b348015610a1957600080fd5b50610477610a2836600461301c565b611e3a565b348015610a3957600080fd5b506103e8610a48366004612deb565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a8257600080fd5b50610477610a9136600461307e565b611e77565b348015610aa257600080fd5b50610477610ab1366004612dd0565b611f68565b348015610ac257600080fd5b50610477610ad136600461301c565b612000565b60006001600160e01b031982166380ac58cd60e01b1480610b0757506001600160e01b03198216635b5e139f60e01b145b80610b2257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610b3790613468565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6390613468565b8015610bb05780601f10610b8557610100808354040283529160200191610bb0565b820191906000526020600020905b815481529060010190602001808311610b9357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c385760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c5f82611041565b9050806001600160a01b0316836001600160a01b03161415610ccd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c2f565b336001600160a01b0382161480610ce95750610ce98133610a48565b610d5b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c2f565b610d65838361203d565b505050565b6006546001600160a01b03163314610d945760405162461bcd60e51b8152600401610c2f906132f5565b8051610da790600c906020840190612ca3565b5050565b6000610db660075490565b905090565b610dc533826120ab565b610de15760405162461bcd60e51b8152600401610c2f90613358565b610d6583838361219e565b610d6583838360405180602001604052806000815250611624565b60606000610e1483611141565b905060008167ffffffffffffffff811115610e3157610e3161352a565b604051908082528060200260200182016040528015610e5a578160200160208202803683370190505b509050600160005b8381108015610e785750610e74611d1f565b8211155b15610ee3576000610e8883611041565b9050866001600160a01b0316816001600160a01b03161415610ed05782848381518110610eb757610eb7613514565b602090810291909101015281610ecc816134a3565b9250505b82610eda816134a3565b93505050610e62565b5090949350505050565b6006546001600160a01b03163314610f175760405162461bcd60e51b8152600401610c2f906132f5565b601d805460ff19811660ff90911615179055565b6006546001600160a01b03163314610f555760405162461bcd60e51b8152600401610c2f906132f5565b8051610da790600d906020840190612ca3565b600c8054610f7590613468565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa190613468565b8015610fee5780601f10610fc357610100808354040283529160200191610fee565b820191906000526020600020905b815481529060010190602001808311610fd157829003601f168201915b505050505081565b6006546001600160a01b031633146110205760405162461bcd60e51b8152600401610c2f906132f5565b601d805463ff00000019811663010000009182900460ff1615909102179055565b6000818152600260205260408120546001600160a01b031680610b225760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c2f565b6006546001600160a01b031633146110e25760405162461bcd60e51b8152600401610c2f906132f5565b601c55565b6006546001600160a01b031633146111115760405162461bcd60e51b8152600401610c2f906132f5565b601d80546001600160a01b03909216650100000000000265010000000000600160c81b0319909216919091179055565b60006001600160a01b0382166111ac5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c2f565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146111f25760405162461bcd60e51b8152600401610c2f906132f5565b601d805461ff001981166101009182900460ff1615909102179055565b6006546001600160a01b031633146112395760405162461bcd60e51b8152600401610c2f906132f5565b611243600061233e565b565b6006546001600160a01b0316331461126f5760405162461bcd60e51b8152600401610c2f906132f5565b601d805462ff0000198116620100009182900460ff1615909102179055565b6006546001600160a01b031633146112b85760405162461bcd60e51b8152600401610c2f906132f5565b600e5415611360576000600e544710156112ec5747905047600e60008282546112e19190613425565b909155506112f79050565b50600e805460009091555b6040516000907389a31e7658510cfd960067cb97ddcc7ece3c70c09083908381818185875af1925050503d806000811461134d576040519150601f19603f3d011682016040523d82523d6000602084013e611352565b606091505b5050905080610da757600080fd5b60005b601e54811015611434576000601e828154811061138257611382613514565b600091825260209091200154601f80546001600160a01b039092169160649190859081106113b2576113b2613514565b9060005260206000200154476113c89190613406565b6113d291906133f2565b604051600081818185875af1925050503d806000811461140e576040519150601f19603f3d011682016040523d82523d6000602084013e611413565b606091505b505090508061142157600080fd5b508061142c816134a3565b915050611363565b50565b6006546001600160a01b031633146114615760405162461bcd60e51b8152600401610c2f906132f5565b60005b8251811015610d655761149083828151811061148257611482613514565b602002602001015183612390565b8161149a816134a3565b92505080806114a8906134a3565b915050611464565b606060018054610b3790613468565b6006546001600160a01b031633146114e95760405162461bcd60e51b8152600401610c2f906132f5565b8051610da7906009906020840190612ca3565b806000811161151d5760405162461bcd60e51b8152600401610c2f906132c7565b611525611d1f565b8161152f60075490565b61153991906133da565b11156115575760405162461bcd60e51b8152600401610c2f9061332a565b601d54640100000000900460ff16156115a25760405162461bcd60e51b815260206004820152600d60248201526c283932b9b0b6329037b7363c9760991b6044820152606401610c2f565b816010546115b09190613406565b3410156115f55760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610c2f565b610da733836123aa565b610da73383836123e7565b600d8054610f7590613468565b600b8054610f7590613468565b61162e33836120ab565b61164a5760405162461bcd60e51b8152600401610c2f90613358565b611656848484846124b6565b50505050565b600a8054610f7590613468565b826000811161168a5760405162461bcd60e51b8152600401610c2f906132c7565b611692611d1f565b8161169c60075490565b6116a691906133da565b11156116c45760405162461bcd60e51b8152600401610c2f9061332a565b601d54640100000000900460ff1661170d5760405162461bcd60e51b815260206004820152600c60248201526b283932b9b0b6329037b3331760a11b6044820152606401610c2f565b601a5433600090815260208052604090205461172990866133da565b11156117475760405162461bcd60e51b8152600401610c2f906132c7565b6117678383601d60059054906101000a90046001600160a01b03166124e9565b6117b35760405162461bcd60e51b815260206004820152601e60248201527f41646472657373206973206e6f74206f6e2050726573616c65204c69737400006044820152606401610c2f565b83600f546117c19190613406565b3410156118065760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610c2f565b6000601c5460011461184f57601c5460021461184757601c5460031461183f57601c54600414611837576000611853565b601854611853565b601754611853565b601654611853565b6015545b9050808561186060075490565b61186a91906133da565b11156118b85760405162461bcd60e51b815260206004820152601c60248201527f4d61782070726573616c6520737570706c7920657863656564656421000000006044820152606401610c2f565b6118c233866123aa565b336000908152602080526040812080548792906118e09084906133da565b90915550505050505050565b6000818152600260205260409020546060906001600160a01b031661196b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c2f565b600060195460115461197d91906133da565b831115611a335760195460115460125461199791906133da565b6119a191906133da565b831115611a2c576019546011546012546013546119be91906133da565b6119c891906133da565b6119d291906133da565b831115611a25576019546011546012546013546014546119f291906133da565b6119fc91906133da565b611a0691906133da565b611a1091906133da565b831115611a1e576000611a36565b6004611a36565b6003611a36565b6002611a36565b60015b60ff169050600081600114611b265781600214611b195781600314611b0c5781600414611a7c57604051806040016040528060018152602001600160fd1b815250611bb2565b600b8054611a8990613468565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab590613468565b8015611b025780601f10611ad757610100808354040283529160200191611b02565b820191906000526020600020905b815481529060010190602001808311611ae557829003601f168201915b5050505050611bb2565b600a8054611a8990613468565b60098054611a8990613468565b60088054611b3390613468565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5f90613468565b8015611bac5780601f10611b8157610100808354040283529160200191611bac565b820191906000526020600020905b815481529060010190602001808311611b8f57829003601f168201915b50505050505b601d5490915060ff16158015611bc85750816001145b80611be65750601d54610100900460ff16158015611be65750816002145b80611c055750601d5462010000900460ff16158015611c055750816003145b80611c255750601d546301000000900460ff16158015611c255750816004145b15611cbe57600d8054611c3790613468565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6390613468565b8015611cb05780601f10611c8557610100808354040283529160200191611cb0565b820191906000526020600020905b815481529060010190602001808311611c9357829003601f168201915b505050505092505050919050565b6000815111611cdc5760405180602001604052806000815250611d0a565b80611ce6856125b8565b600c604051602001611cfa9392919061311d565b6040516020818303038152906040525b949350505050565b60098054610f7590613468565b6000601c54600114611d9c57601c54600214611d8c57601c54600314611d7957601c54600414611d4f5750600090565b601454601354601254601154611d6591906133da565b611d6f91906133da565b610db691906133da565b601354601254601154611d6f91906133da565b601254601154610db691906133da565b5060115490565b6006546001600160a01b03163314611dcd5760405162461bcd60e51b8152600401610c2f906132f5565b601d805464ff000000001981166401000000009182900460ff1615909102179055565b60088054610f7590613468565b6006546001600160a01b03163314611e275760405162461bcd60e51b8152600401610c2f906132f5565b8051610da7906008906020840190612ca3565b6006546001600160a01b03163314611e645760405162461bcd60e51b8152600401610c2f906132f5565b8051610da790600a906020840190612ca3565b8160008111611e985760405162461bcd60e51b8152600401610c2f906132c7565b611ea0611d1f565b81611eaa60075490565b611eb491906133da565b1115611ed25760405162461bcd60e51b8152600401610c2f9061332a565b6006546001600160a01b03163314611efc5760405162461bcd60e51b8152600401610c2f906132f5565b601b54336000908152602080526040902054611f1890856133da565b1115611f365760405162461bcd60e51b8152600401610c2f906132c7565b611f4082846123aa565b33600090815260208052604081208054859290611f5e9084906133da565b9091555050505050565b6006546001600160a01b03163314611f925760405162461bcd60e51b8152600401610c2f906132f5565b6001600160a01b038116611ff75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c2f565b6114348161233e565b6006546001600160a01b0316331461202a5760405162461bcd60e51b8152600401610c2f906132f5565b8051610da790600b906020840190612ca3565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061207282611041565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166121245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c2f565b600061212f83611041565b9050806001600160a01b0316846001600160a01b0316148061216a5750836001600160a01b031661215f84610bba565b6001600160a01b0316145b80611d0a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611d0a565b826001600160a01b03166121b182611041565b6001600160a01b0316146122195760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c2f565b6001600160a01b03821661227b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c2f565b61228660008261203d565b6001600160a01b03831660009081526003602052604081208054600192906122af908490613425565b90915550506001600160a01b03821660009081526003602052604081208054600192906122dd9084906133da565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610da78282604051806020016040528060008152506126b6565b60005b81811015610d65576123c3600780546001019055565b6123d5836123d060075490565b612390565b806123df816134a3565b9150506123ad565b816001600160a01b0316836001600160a01b031614156124495760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c2f565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6124c184848461219e565b6124cd848484846126e9565b6116565760405162461bcd60e51b8152600401610c2f90613275565b60008061257c6040805130606090811b6bffffffffffffffffffffffff199081166020808501919091523390921b166034830152825160288184030181526048830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060688401526084808401919091528351808403909101815260a4909201909252805191012090565b905084811461258f5760009150506125b1565b6001600160a01b0383166125a386866127f6565b6001600160a01b0316149150505b9392505050565b6060816125dc5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561260657806125f0816134a3565b91506125ff9050600a836133f2565b91506125e0565b60008167ffffffffffffffff8111156126215761262161352a565b6040519080825280601f01601f19166020018201604052801561264b576020820181803683370190505b5090505b8415611d0a57612660600183613425565b915061266d600a866134be565b6126789060306133da565b60f81b81838151811061268d5761268d613514565b60200101906001600160f81b031916908160001a9053506126af600a866133f2565b945061264f565b6126c0838361281a565b6126cd60008484846126e9565b610d655760405162461bcd60e51b8152600401610c2f90613275565b60006001600160a01b0384163b156127eb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061272d9033908990889088906004016131e1565b602060405180830381600087803b15801561274757600080fd5b505af1925050508015612777575060408051601f3d908101601f1916820190925261277491810190612fff565b60015b6127d1573d8080156127a5576040519150601f19603f3d011682016040523d82523d6000602084013e6127aa565b606091505b5080516127c95760405162461bcd60e51b8152600401610c2f90613275565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d0a565b506001949350505050565b6000806000612805858561295c565b91509150612812816129cc565b509392505050565b6001600160a01b0382166128705760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c2f565b6000818152600260205260409020546001600160a01b0316156128d55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c2f565b6001600160a01b03821660009081526003602052604081208054600192906128fe9084906133da565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000808251604114156129935760208301516040840151606085015160001a61298787828585612b87565b945094505050506129c5565b8251604014156129bd57602083015160408401516129b2868383612c74565b9350935050506129c5565b506000905060025b9250929050565b60008160048111156129e0576129e06134fe565b14156129e95750565b60018160048111156129fd576129fd6134fe565b1415612a4b5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c2f565b6002816004811115612a5f57612a5f6134fe565b1415612aad5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c2f565b6003816004811115612ac157612ac16134fe565b1415612b1a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610c2f565b6004816004811115612b2e57612b2e6134fe565b14156114345760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610c2f565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612bbe5750600090506003612c6b565b8460ff16601b14158015612bd657508460ff16601c14155b15612be75750600090506004612c6b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c3b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c6457600060019250925050612c6b565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612c9587828885612b87565b935093505050935093915050565b828054612caf90613468565b90600052602060002090601f016020900481019282612cd15760008555612d17565b82601f10612cea57805160ff1916838001178555612d17565b82800160010185558215612d17579182015b82811115612d17578251825591602001919060010190612cfc565b50612d23929150612d27565b5090565b5b80821115612d235760008155600101612d28565b600067ffffffffffffffff831115612d5657612d5661352a565b612d69601f8401601f19166020016133a9565b9050828152838383011115612d7d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612dab57600080fd5b919050565b600082601f830112612dc157600080fd5b6125b183833560208501612d3c565b600060208284031215612de257600080fd5b6125b182612d94565b60008060408385031215612dfe57600080fd5b612e0783612d94565b9150612e1560208401612d94565b90509250929050565b600080600060608486031215612e3357600080fd5b612e3c84612d94565b9250612e4a60208501612d94565b9150604084013590509250925092565b60008060008060808587031215612e7057600080fd5b612e7985612d94565b9350612e8760208601612d94565b925060408501359150606085013567ffffffffffffffff811115612eaa57600080fd5b612eb687828801612db0565b91505092959194509250565b60008060408385031215612ed557600080fd5b612ede83612d94565b915060208301358015158114612ef357600080fd5b809150509250929050565b60008060408385031215612f1157600080fd5b612f1a83612d94565b946020939093013593505050565b60008060408385031215612f3b57600080fd5b823567ffffffffffffffff80821115612f5357600080fd5b818501915085601f830112612f6757600080fd5b8135602082821115612f7b57612f7b61352a565b8160051b9250612f8c8184016133a9565b8281528181019085830185870184018b1015612fa757600080fd5b600096505b84871015612fd157612fbd81612d94565b835260019690960195918301918301612fac565b509997909101359750505050505050565b600060208284031215612ff457600080fd5b81356125b181613540565b60006020828403121561301157600080fd5b81516125b181613540565b60006020828403121561302e57600080fd5b813567ffffffffffffffff81111561304557600080fd5b8201601f8101841361305657600080fd5b611d0a84823560208401612d3c565b60006020828403121561307757600080fd5b5035919050565b6000806040838503121561309157600080fd5b82359150612e1560208401612d94565b6000806000606084860312156130b657600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156130db57600080fd5b6130e786828701612db0565b9150509250925092565b6000815180845261310981602086016020860161343c565b601f01601f19169290920160200192915050565b6000845160206131308285838a0161343c565b8551918401916131438184848a0161343c565b8554920191600090600181811c908083168061316057607f831692505b85831081141561317e57634e487b7160e01b85526022600452602485fd5b80801561319257600181146131a3576131d0565b60ff198516885283880195506131d0565b60008b81526020902060005b858110156131c85781548a8201529084019088016131af565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613214908301846130f1565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156132565783518352928401929184019160010161323a565b50909695505050505050565b6020815260006125b160208301846130f1565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156133d2576133d261352a565b604052919050565b600082198211156133ed576133ed6134d2565b500190565b600082613401576134016134e8565b500490565b6000816000190483118215151615613420576134206134d2565b500290565b600082821015613437576134376134d2565b500390565b60005b8381101561345757818101518382015260200161343f565b838111156116565750506000910152565b600181811c9082168061347c57607f821691505b6020821081141561349d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156134b7576134b76134d2565b5060010190565b6000826134cd576134cd6134e8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461143457600080fdfea2646970667358221220d63d7e0fcc55e14861eaf68a3204f5a6d1756b3b06925a3e1951df50a0b51d5a64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000f0b1ffb154d1d4bdea3a09c35320cfa27884e4ec000000000000000000000000000000000000000000000000000000000000000300000000000000000000000029c41b7a4a91a78668d1b45e5c3eea2381d4135b000000000000000000000000d7bbd423ef411b38ab36be93bdf84cc72dbcb86400000000000000000000000089a31e7658510cfd960067cb97ddcc7ece3c70c00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d57426b66446f386d5731373357617747723753454e41573374674e535241486859357742615750474c4332370000000000000000000000

Deployed Bytecode

0x6080604052600436106103c35760003560e01c806385547a69116101f2578063bc56602f1161010d578063da89e64e116100a0578063e985e9c51161006f578063e985e9c514610a2d578063efbd73f414610a76578063f2fde38b14610a96578063ff69072014610ab657600080fd5b8063da89e64e146109c3578063e0e091c5146109d8578063e42b30a9146109ed578063e976f3e114610a0d57600080fd5b8063d1c2b213116100dc578063d1c2b2131461096d578063d4ad268414610982578063d5abeb0114610998578063d8e28a98146109ad57600080fd5b8063bc56602f146108f9578063bf55171114610925578063bf9b7c8d1461093a578063c87b56dd1461094d57600080fd5b8063a45ba8e711610185578063b29c736d11610154578063b29c736d14610882578063b88d4fde146108a3578063b890b055146108c3578063ba92d98e146108e357600080fd5b8063a45ba8e71461082c578063a592185914610841578063a826cbe614610857578063a9515cbb1461086c57600080fd5b80639cd3f851116101c15780639cd3f851146107ba578063a0712d68146107da578063a22cb465146107ed578063a45801a21461080d57600080fd5b806385547a69146107455780638da5cb5b1461076557806395364a841461078357806395d89b41146107a557600080fd5b806346c9f267116102e25780636e74d2751161027557806371e86eed1161024457806371e86eed146106fc5780637c45c16f146107115780637effc03214610727578063853828b61461073d57600080fd5b80636e74d2751461069c57806370a08231146106b257806370ea5d1a146106d2578063715018a6146106e757600080fd5b80636352211e116102b15780636352211e146106265780636519f6cb146106465780636875b7461461065c5780636c19e7831461067c57600080fd5b806346c9f267146105c75780634fdd43cb146105dc5780635503a0e8146105fc5780635a0996771461061157600080fd5b806333c8405f1161035a5780633ebba305116103295780633ebba3051461054e57806342842e0e14610564578063430b21d614610584578063438b63001461059a57600080fd5b806333c8405f146104f2578063378b69eb146105085780633c327377146105225780633de37b491461053857600080fd5b806316ba10e01161039657806316ba10e01461047957806318160ddd146104995780631e387cb0146104bc57806323b872dd146104d257600080fd5b806301ffc9a7146103c857806306fdde03146103fd578063081812fc1461041f578063095ea7b314610457575b600080fd5b3480156103d457600080fd5b506103e86103e3366004612fe2565b610ad6565b60405190151581526020015b60405180910390f35b34801561040957600080fd5b50610412610b28565b6040516103f49190613262565b34801561042b57600080fd5b5061043f61043a366004613065565b610bba565b6040516001600160a01b0390911681526020016103f4565b34801561046357600080fd5b50610477610472366004612efe565b610c54565b005b34801561048557600080fd5b5061047761049436600461301c565b610d6a565b3480156104a557600080fd5b506104ae610dab565b6040519081526020016103f4565b3480156104c857600080fd5b506104ae60115481565b3480156104de57600080fd5b506104776104ed366004612e1e565b610dbb565b3480156104fe57600080fd5b506104ae60135481565b34801561051457600080fd5b50601d546103e89060ff1681565b34801561052e57600080fd5b506104ae601b5481565b34801561054457600080fd5b506104ae60155481565b34801561055a57600080fd5b506104ae601c5481565b34801561057057600080fd5b5061047761057f366004612e1e565b610dec565b34801561059057600080fd5b506104ae600f5481565b3480156105a657600080fd5b506105ba6105b5366004612dd0565b610e07565b6040516103f4919061321e565b3480156105d357600080fd5b50610477610eed565b3480156105e857600080fd5b506104776105f736600461301c565b610f2b565b34801561060857600080fd5b50610412610f68565b34801561061d57600080fd5b50610477610ff6565b34801561063257600080fd5b5061043f610641366004613065565b611041565b34801561065257600080fd5b506104ae60105481565b34801561066857600080fd5b50610477610677366004613065565b6110b8565b34801561068857600080fd5b50610477610697366004612dd0565b6110e7565b3480156106a857600080fd5b506104ae60145481565b3480156106be57600080fd5b506104ae6106cd366004612dd0565b611141565b3480156106de57600080fd5b506104776111c8565b3480156106f357600080fd5b5061047761120f565b34801561070857600080fd5b50610477611245565b34801561071d57600080fd5b506104ae600e5481565b34801561073357600080fd5b506104ae601a5481565b61047761128e565b34801561075157600080fd5b50610477610760366004612f28565b611437565b34801561077157600080fd5b506006546001600160a01b031661043f565b34801561078f57600080fd5b50601d546103e890640100000000900460ff1681565b3480156107b157600080fd5b506104126114b0565b3480156107c657600080fd5b506104776107d536600461301c565b6114bf565b6104776107e8366004613065565b6114fc565b3480156107f957600080fd5b50610477610808366004612ec2565b6115ff565b34801561081957600080fd5b50601d546103e890610100900460ff1681565b34801561083857600080fd5b5061041261160a565b34801561084d57600080fd5b506104ae60175481565b34801561086357600080fd5b50610412611617565b34801561087857600080fd5b506104ae60165481565b34801561088e57600080fd5b50601d546103e8906301000000900460ff1681565b3480156108af57600080fd5b506104776108be366004612e5a565b611624565b3480156108cf57600080fd5b50601d546103e89062010000900460ff1681565b3480156108ef57600080fd5b506104ae60195481565b34801561090557600080fd5b506104ae610914366004612dd0565b602080526000908152604090205481565b34801561093157600080fd5b5061041261165c565b6104776109483660046130a1565b611669565b34801561095957600080fd5b50610412610968366004613065565b6118ec565b34801561097957600080fd5b50610412611d12565b34801561098e57600080fd5b506104ae60125481565b3480156109a457600080fd5b506104ae611d1f565b3480156109b957600080fd5b506104ae60185481565b3480156109cf57600080fd5b50610477611da3565b3480156109e457600080fd5b50610412611df0565b3480156109f957600080fd5b50610477610a0836600461301c565b611dfd565b348015610a1957600080fd5b50610477610a2836600461301c565b611e3a565b348015610a3957600080fd5b506103e8610a48366004612deb565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a8257600080fd5b50610477610a9136600461307e565b611e77565b348015610aa257600080fd5b50610477610ab1366004612dd0565b611f68565b348015610ac257600080fd5b50610477610ad136600461301c565b612000565b60006001600160e01b031982166380ac58cd60e01b1480610b0757506001600160e01b03198216635b5e139f60e01b145b80610b2257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610b3790613468565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6390613468565b8015610bb05780601f10610b8557610100808354040283529160200191610bb0565b820191906000526020600020905b815481529060010190602001808311610b9357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c385760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c5f82611041565b9050806001600160a01b0316836001600160a01b03161415610ccd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c2f565b336001600160a01b0382161480610ce95750610ce98133610a48565b610d5b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c2f565b610d65838361203d565b505050565b6006546001600160a01b03163314610d945760405162461bcd60e51b8152600401610c2f906132f5565b8051610da790600c906020840190612ca3565b5050565b6000610db660075490565b905090565b610dc533826120ab565b610de15760405162461bcd60e51b8152600401610c2f90613358565b610d6583838361219e565b610d6583838360405180602001604052806000815250611624565b60606000610e1483611141565b905060008167ffffffffffffffff811115610e3157610e3161352a565b604051908082528060200260200182016040528015610e5a578160200160208202803683370190505b509050600160005b8381108015610e785750610e74611d1f565b8211155b15610ee3576000610e8883611041565b9050866001600160a01b0316816001600160a01b03161415610ed05782848381518110610eb757610eb7613514565b602090810291909101015281610ecc816134a3565b9250505b82610eda816134a3565b93505050610e62565b5090949350505050565b6006546001600160a01b03163314610f175760405162461bcd60e51b8152600401610c2f906132f5565b601d805460ff19811660ff90911615179055565b6006546001600160a01b03163314610f555760405162461bcd60e51b8152600401610c2f906132f5565b8051610da790600d906020840190612ca3565b600c8054610f7590613468565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa190613468565b8015610fee5780601f10610fc357610100808354040283529160200191610fee565b820191906000526020600020905b815481529060010190602001808311610fd157829003601f168201915b505050505081565b6006546001600160a01b031633146110205760405162461bcd60e51b8152600401610c2f906132f5565b601d805463ff00000019811663010000009182900460ff1615909102179055565b6000818152600260205260408120546001600160a01b031680610b225760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c2f565b6006546001600160a01b031633146110e25760405162461bcd60e51b8152600401610c2f906132f5565b601c55565b6006546001600160a01b031633146111115760405162461bcd60e51b8152600401610c2f906132f5565b601d80546001600160a01b03909216650100000000000265010000000000600160c81b0319909216919091179055565b60006001600160a01b0382166111ac5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c2f565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146111f25760405162461bcd60e51b8152600401610c2f906132f5565b601d805461ff001981166101009182900460ff1615909102179055565b6006546001600160a01b031633146112395760405162461bcd60e51b8152600401610c2f906132f5565b611243600061233e565b565b6006546001600160a01b0316331461126f5760405162461bcd60e51b8152600401610c2f906132f5565b601d805462ff0000198116620100009182900460ff1615909102179055565b6006546001600160a01b031633146112b85760405162461bcd60e51b8152600401610c2f906132f5565b600e5415611360576000600e544710156112ec5747905047600e60008282546112e19190613425565b909155506112f79050565b50600e805460009091555b6040516000907389a31e7658510cfd960067cb97ddcc7ece3c70c09083908381818185875af1925050503d806000811461134d576040519150601f19603f3d011682016040523d82523d6000602084013e611352565b606091505b5050905080610da757600080fd5b60005b601e54811015611434576000601e828154811061138257611382613514565b600091825260209091200154601f80546001600160a01b039092169160649190859081106113b2576113b2613514565b9060005260206000200154476113c89190613406565b6113d291906133f2565b604051600081818185875af1925050503d806000811461140e576040519150601f19603f3d011682016040523d82523d6000602084013e611413565b606091505b505090508061142157600080fd5b508061142c816134a3565b915050611363565b50565b6006546001600160a01b031633146114615760405162461bcd60e51b8152600401610c2f906132f5565b60005b8251811015610d655761149083828151811061148257611482613514565b602002602001015183612390565b8161149a816134a3565b92505080806114a8906134a3565b915050611464565b606060018054610b3790613468565b6006546001600160a01b031633146114e95760405162461bcd60e51b8152600401610c2f906132f5565b8051610da7906009906020840190612ca3565b806000811161151d5760405162461bcd60e51b8152600401610c2f906132c7565b611525611d1f565b8161152f60075490565b61153991906133da565b11156115575760405162461bcd60e51b8152600401610c2f9061332a565b601d54640100000000900460ff16156115a25760405162461bcd60e51b815260206004820152600d60248201526c283932b9b0b6329037b7363c9760991b6044820152606401610c2f565b816010546115b09190613406565b3410156115f55760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610c2f565b610da733836123aa565b610da73383836123e7565b600d8054610f7590613468565b600b8054610f7590613468565b61162e33836120ab565b61164a5760405162461bcd60e51b8152600401610c2f90613358565b611656848484846124b6565b50505050565b600a8054610f7590613468565b826000811161168a5760405162461bcd60e51b8152600401610c2f906132c7565b611692611d1f565b8161169c60075490565b6116a691906133da565b11156116c45760405162461bcd60e51b8152600401610c2f9061332a565b601d54640100000000900460ff1661170d5760405162461bcd60e51b815260206004820152600c60248201526b283932b9b0b6329037b3331760a11b6044820152606401610c2f565b601a5433600090815260208052604090205461172990866133da565b11156117475760405162461bcd60e51b8152600401610c2f906132c7565b6117678383601d60059054906101000a90046001600160a01b03166124e9565b6117b35760405162461bcd60e51b815260206004820152601e60248201527f41646472657373206973206e6f74206f6e2050726573616c65204c69737400006044820152606401610c2f565b83600f546117c19190613406565b3410156118065760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610c2f565b6000601c5460011461184f57601c5460021461184757601c5460031461183f57601c54600414611837576000611853565b601854611853565b601754611853565b601654611853565b6015545b9050808561186060075490565b61186a91906133da565b11156118b85760405162461bcd60e51b815260206004820152601c60248201527f4d61782070726573616c6520737570706c7920657863656564656421000000006044820152606401610c2f565b6118c233866123aa565b336000908152602080526040812080548792906118e09084906133da565b90915550505050505050565b6000818152600260205260409020546060906001600160a01b031661196b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c2f565b600060195460115461197d91906133da565b831115611a335760195460115460125461199791906133da565b6119a191906133da565b831115611a2c576019546011546012546013546119be91906133da565b6119c891906133da565b6119d291906133da565b831115611a25576019546011546012546013546014546119f291906133da565b6119fc91906133da565b611a0691906133da565b611a1091906133da565b831115611a1e576000611a36565b6004611a36565b6003611a36565b6002611a36565b60015b60ff169050600081600114611b265781600214611b195781600314611b0c5781600414611a7c57604051806040016040528060018152602001600160fd1b815250611bb2565b600b8054611a8990613468565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab590613468565b8015611b025780601f10611ad757610100808354040283529160200191611b02565b820191906000526020600020905b815481529060010190602001808311611ae557829003601f168201915b5050505050611bb2565b600a8054611a8990613468565b60098054611a8990613468565b60088054611b3390613468565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5f90613468565b8015611bac5780601f10611b8157610100808354040283529160200191611bac565b820191906000526020600020905b815481529060010190602001808311611b8f57829003601f168201915b50505050505b601d5490915060ff16158015611bc85750816001145b80611be65750601d54610100900460ff16158015611be65750816002145b80611c055750601d5462010000900460ff16158015611c055750816003145b80611c255750601d546301000000900460ff16158015611c255750816004145b15611cbe57600d8054611c3790613468565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6390613468565b8015611cb05780601f10611c8557610100808354040283529160200191611cb0565b820191906000526020600020905b815481529060010190602001808311611c9357829003601f168201915b505050505092505050919050565b6000815111611cdc5760405180602001604052806000815250611d0a565b80611ce6856125b8565b600c604051602001611cfa9392919061311d565b6040516020818303038152906040525b949350505050565b60098054610f7590613468565b6000601c54600114611d9c57601c54600214611d8c57601c54600314611d7957601c54600414611d4f5750600090565b601454601354601254601154611d6591906133da565b611d6f91906133da565b610db691906133da565b601354601254601154611d6f91906133da565b601254601154610db691906133da565b5060115490565b6006546001600160a01b03163314611dcd5760405162461bcd60e51b8152600401610c2f906132f5565b601d805464ff000000001981166401000000009182900460ff1615909102179055565b60088054610f7590613468565b6006546001600160a01b03163314611e275760405162461bcd60e51b8152600401610c2f906132f5565b8051610da7906008906020840190612ca3565b6006546001600160a01b03163314611e645760405162461bcd60e51b8152600401610c2f906132f5565b8051610da790600a906020840190612ca3565b8160008111611e985760405162461bcd60e51b8152600401610c2f906132c7565b611ea0611d1f565b81611eaa60075490565b611eb491906133da565b1115611ed25760405162461bcd60e51b8152600401610c2f9061332a565b6006546001600160a01b03163314611efc5760405162461bcd60e51b8152600401610c2f906132f5565b601b54336000908152602080526040902054611f1890856133da565b1115611f365760405162461bcd60e51b8152600401610c2f906132c7565b611f4082846123aa565b33600090815260208052604081208054859290611f5e9084906133da565b9091555050505050565b6006546001600160a01b03163314611f925760405162461bcd60e51b8152600401610c2f906132f5565b6001600160a01b038116611ff75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c2f565b6114348161233e565b6006546001600160a01b0316331461202a5760405162461bcd60e51b8152600401610c2f906132f5565b8051610da790600b906020840190612ca3565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061207282611041565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166121245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c2f565b600061212f83611041565b9050806001600160a01b0316846001600160a01b0316148061216a5750836001600160a01b031661215f84610bba565b6001600160a01b0316145b80611d0a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611d0a565b826001600160a01b03166121b182611041565b6001600160a01b0316146122195760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c2f565b6001600160a01b03821661227b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c2f565b61228660008261203d565b6001600160a01b03831660009081526003602052604081208054600192906122af908490613425565b90915550506001600160a01b03821660009081526003602052604081208054600192906122dd9084906133da565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610da78282604051806020016040528060008152506126b6565b60005b81811015610d65576123c3600780546001019055565b6123d5836123d060075490565b612390565b806123df816134a3565b9150506123ad565b816001600160a01b0316836001600160a01b031614156124495760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c2f565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6124c184848461219e565b6124cd848484846126e9565b6116565760405162461bcd60e51b8152600401610c2f90613275565b60008061257c6040805130606090811b6bffffffffffffffffffffffff199081166020808501919091523390921b166034830152825160288184030181526048830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060688401526084808401919091528351808403909101815260a4909201909252805191012090565b905084811461258f5760009150506125b1565b6001600160a01b0383166125a386866127f6565b6001600160a01b0316149150505b9392505050565b6060816125dc5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561260657806125f0816134a3565b91506125ff9050600a836133f2565b91506125e0565b60008167ffffffffffffffff8111156126215761262161352a565b6040519080825280601f01601f19166020018201604052801561264b576020820181803683370190505b5090505b8415611d0a57612660600183613425565b915061266d600a866134be565b6126789060306133da565b60f81b81838151811061268d5761268d613514565b60200101906001600160f81b031916908160001a9053506126af600a866133f2565b945061264f565b6126c0838361281a565b6126cd60008484846126e9565b610d655760405162461bcd60e51b8152600401610c2f90613275565b60006001600160a01b0384163b156127eb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061272d9033908990889088906004016131e1565b602060405180830381600087803b15801561274757600080fd5b505af1925050508015612777575060408051601f3d908101601f1916820190925261277491810190612fff565b60015b6127d1573d8080156127a5576040519150601f19603f3d011682016040523d82523d6000602084013e6127aa565b606091505b5080516127c95760405162461bcd60e51b8152600401610c2f90613275565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d0a565b506001949350505050565b6000806000612805858561295c565b91509150612812816129cc565b509392505050565b6001600160a01b0382166128705760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c2f565b6000818152600260205260409020546001600160a01b0316156128d55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c2f565b6001600160a01b03821660009081526003602052604081208054600192906128fe9084906133da565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000808251604114156129935760208301516040840151606085015160001a61298787828585612b87565b945094505050506129c5565b8251604014156129bd57602083015160408401516129b2868383612c74565b9350935050506129c5565b506000905060025b9250929050565b60008160048111156129e0576129e06134fe565b14156129e95750565b60018160048111156129fd576129fd6134fe565b1415612a4b5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c2f565b6002816004811115612a5f57612a5f6134fe565b1415612aad5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c2f565b6003816004811115612ac157612ac16134fe565b1415612b1a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610c2f565b6004816004811115612b2e57612b2e6134fe565b14156114345760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610c2f565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612bbe5750600090506003612c6b565b8460ff16601b14158015612bd657508460ff16601c14155b15612be75750600090506004612c6b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c3b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c6457600060019250925050612c6b565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612c9587828885612b87565b935093505050935093915050565b828054612caf90613468565b90600052602060002090601f016020900481019282612cd15760008555612d17565b82601f10612cea57805160ff1916838001178555612d17565b82800160010185558215612d17579182015b82811115612d17578251825591602001919060010190612cfc565b50612d23929150612d27565b5090565b5b80821115612d235760008155600101612d28565b600067ffffffffffffffff831115612d5657612d5661352a565b612d69601f8401601f19166020016133a9565b9050828152838383011115612d7d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612dab57600080fd5b919050565b600082601f830112612dc157600080fd5b6125b183833560208501612d3c565b600060208284031215612de257600080fd5b6125b182612d94565b60008060408385031215612dfe57600080fd5b612e0783612d94565b9150612e1560208401612d94565b90509250929050565b600080600060608486031215612e3357600080fd5b612e3c84612d94565b9250612e4a60208501612d94565b9150604084013590509250925092565b60008060008060808587031215612e7057600080fd5b612e7985612d94565b9350612e8760208601612d94565b925060408501359150606085013567ffffffffffffffff811115612eaa57600080fd5b612eb687828801612db0565b91505092959194509250565b60008060408385031215612ed557600080fd5b612ede83612d94565b915060208301358015158114612ef357600080fd5b809150509250929050565b60008060408385031215612f1157600080fd5b612f1a83612d94565b946020939093013593505050565b60008060408385031215612f3b57600080fd5b823567ffffffffffffffff80821115612f5357600080fd5b818501915085601f830112612f6757600080fd5b8135602082821115612f7b57612f7b61352a565b8160051b9250612f8c8184016133a9565b8281528181019085830185870184018b1015612fa757600080fd5b600096505b84871015612fd157612fbd81612d94565b835260019690960195918301918301612fac565b509997909101359750505050505050565b600060208284031215612ff457600080fd5b81356125b181613540565b60006020828403121561301157600080fd5b81516125b181613540565b60006020828403121561302e57600080fd5b813567ffffffffffffffff81111561304557600080fd5b8201601f8101841361305657600080fd5b611d0a84823560208401612d3c565b60006020828403121561307757600080fd5b5035919050565b6000806040838503121561309157600080fd5b82359150612e1560208401612d94565b6000806000606084860312156130b657600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156130db57600080fd5b6130e786828701612db0565b9150509250925092565b6000815180845261310981602086016020860161343c565b601f01601f19169290920160200192915050565b6000845160206131308285838a0161343c565b8551918401916131438184848a0161343c565b8554920191600090600181811c908083168061316057607f831692505b85831081141561317e57634e487b7160e01b85526022600452602485fd5b80801561319257600181146131a3576131d0565b60ff198516885283880195506131d0565b60008b81526020902060005b858110156131c85781548a8201529084019088016131af565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613214908301846130f1565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156132565783518352928401929184019160010161323a565b50909695505050505050565b6020815260006125b160208301846130f1565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156133d2576133d261352a565b604052919050565b600082198211156133ed576133ed6134d2565b500190565b600082613401576134016134e8565b500490565b6000816000190483118215151615613420576134206134d2565b500290565b600082821015613437576134376134d2565b500390565b60005b8381101561345757818101518382015260200161343f565b838111156116565750506000910152565b600181811c9082168061347c57607f821691505b6020821081141561349d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156134b7576134b76134d2565b5060010190565b6000826134cd576134cd6134e8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461143457600080fdfea2646970667358221220d63d7e0fcc55e14861eaf68a3204f5a6d1756b3b06925a3e1951df50a0b51d5a64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000f0b1ffb154d1d4bdea3a09c35320cfa27884e4ec000000000000000000000000000000000000000000000000000000000000000300000000000000000000000029c41b7a4a91a78668d1b45e5c3eea2381d4135b000000000000000000000000d7bbd423ef411b38ab36be93bdf84cc72dbcb86400000000000000000000000089a31e7658510cfd960067cb97ddcc7ece3c70c00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d57426b66446f386d5731373357617747723753454e41573374674e535241486859357742615750474c4332370000000000000000000000

-----Decoded View---------------
Arg [0] : _payees (address[]): 0x29C41b7a4A91A78668d1B45E5c3eea2381D4135B,0xD7Bbd423ef411B38ab36bE93bDF84Cc72DbCB864,0x89a31e7658510Cfd960067cb97ddcc7Ece3c70C0
Arg [1] : _shares (uint256[]): 94,2,4
Arg [2] : _hiddenMetadataUri (string): ipfs://QmWBkfDo8mW173WawGr7SENAW3tgNSRAHhY5wBaWPGLC27
Arg [3] : _SIGNER (address): 0xf0B1Ffb154d1D4BDEA3A09c35320Cfa27884e4EC

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [3] : 000000000000000000000000f0b1ffb154d1d4bdea3a09c35320cfa27884e4ec
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 00000000000000000000000029c41b7a4a91a78668d1b45e5c3eea2381d4135b
Arg [6] : 000000000000000000000000d7bbd423ef411b38ab36be93bdf84cc72dbcb864
Arg [7] : 00000000000000000000000089a31e7658510cfd960067cb97ddcc7ece3c70c0
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 000000000000000000000000000000000000000000000000000000000000005e
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [13] : 697066733a2f2f516d57426b66446f386d5731373357617747723753454e4157
Arg [14] : 3374674e535241486859357742615750474c4332370000000000000000000000


Deployed Bytecode Sourcemap

51486:8803:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36892:305;;;;;;;;;;-1:-1:-1;36892:305:0;;;;;:::i;:::-;;:::i;:::-;;;9902:14:1;;9895:22;9877:41;;9865:2;9850:18;36892:305:0;;;;;;;;37837:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39396:221::-;;;;;;;;;;-1:-1:-1;39396:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8563:32:1;;;8545:51;;8533:2;8518:18;39396:221:0;8399:203:1;38919:411:0;;;;;;;;;;-1:-1:-1;38919:411:0;;;;;:::i;:::-;;:::i;:::-;;55496:102;;;;;;;;;;-1:-1:-1;55496:102:0;;;;;:::i;:::-;;:::i;59575:89::-;;;;;;;;;;;;;:::i;:::-;;;21048:25:1;;;21036:2;21021:18;59575:89:0;20902:177:1;52026:34:0;;;;;;;;;;;;;;;;40146:339;;;;;;;;;;-1:-1:-1;40146:339:0;;;;;:::i;:::-;;:::i;52104:34::-;;;;;;;;;;;;;;;;52504:29;;;;;;;;;;-1:-1:-1;52504:29:0;;;;;;;;52420:41;;;;;;;;;;;;;;;;52184:33;;;;;;;;;;;;;;;;52466:31;;;;;;;;;;;;;;;;40556:185;;;;;;;;;;-1:-1:-1;40556:185:0;;;;;:::i;:::-;;:::i;51937:40::-;;;;;;;;;;;;;;;;59670:616;;;;;;;;;;-1:-1:-1;59670:616:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;54569:78::-;;;;;;;;;;;;;:::i;54224:134::-;;;;;;;;;;-1:-1:-1;54224:134:0;;;;;:::i;:::-;;:::i;51827:33::-;;;;;;;;;;;;;:::i;54827:78::-;;;;;;;;;;;;;:::i;37531:239::-;;;;;;;;;;-1:-1:-1;37531:239:0;;;;;:::i;:::-;;:::i;51982:39::-;;;;;;;;;;;;;;;;54368:108;;;;;;;;;;-1:-1:-1;54368:108:0;;;;;:::i;:::-;;:::i;54917:86::-;;;;;;;;;;-1:-1:-1;54917:86:0;;;;;:::i;:::-;;:::i;52143:34::-;;;;;;;;;;;;;;;;37261:208;;;;;;;;;;-1:-1:-1;37261:208:0;;;;;:::i;:::-;;:::i;54655:78::-;;;;;;;;;;;;;:::i;17880:103::-;;;;;;;;;;;;;:::i;54741:78::-;;;;;;;;;;;;;:::i;51905:27::-;;;;;;;;;;;;;;;;52376:39;;;;;;;;;;;;;;;;55606:666;;;:::i;56849:224::-;;;;;;;;;;-1:-1:-1;56849:224:0;;;;;:::i;:::-;;:::i;17229:87::-;;;;;;;;;;-1:-1:-1;17302:6:0;;-1:-1:-1;;;;;17302:6:0;17229:87;;52642:28;;;;;;;;;;-1:-1:-1;52642:28:0;;;;;;;;;;;38006:104;;;;;;;;;;;;;:::i;55130:114::-;;;;;;;;;;-1:-1:-1;55130:114:0;;;;;:::i;:::-;;:::i;56290:244::-;;;;;;:::i;:::-;;:::i;39689:155::-;;;;;;;;;;-1:-1:-1;39689:155:0;;;;;:::i;:::-;;:::i;52538:29::-;;;;;;;;;;-1:-1:-1;52538:29:0;;;;;;;;;;;51865:31;;;;;;;;;;;;;:::i;52260:33::-;;;;;;;;;;;;;;;;51788:34;;;;;;;;;;;;;:::i;52222:33::-;;;;;;;;;;;;;;;;52606:29;;;;;;;;;;-1:-1:-1;52606:29:0;;;;;;;;;;;40812:328;;;;;;;;;;-1:-1:-1;40812:328:0;;;;;:::i;:::-;;:::i;52572:29::-;;;;;;;;;;-1:-1:-1;52572:29:0;;;;;;;;;;;52338:33;;;;;;;;;;;;;;;;52777:47;;;;;;;;;;-1:-1:-1;52777:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;51749:34;;;;;;;;;;;;;:::i;57079:890::-;;;;;;:::i;:::-;;:::i;58352:1217::-;;;;;;;;;;-1:-1:-1;58352:1217:0;;;;;:::i;:::-;;:::i;51710:34::-;;;;;;;;;;;;;:::i;52065:::-;;;;;;;;;;;;;;;;57975:371;;;;;;;;;;;;;:::i;52298:33::-;;;;;;;;;;;;;;;;54483:78;;;;;;;;;;;;;:::i;51671:34::-;;;;;;;;;;;;;:::i;55010:114::-;;;;;;;;;;-1:-1:-1;55010:114:0;;;;;:::i;:::-;;:::i;55250:::-;;;;;;;;;;-1:-1:-1;55250:114:0;;;;;:::i;:::-;;:::i;39915:164::-;;;;;;;;;;-1:-1:-1;39915:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;40036:25:0;;;40012:4;40036:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;39915:164;56540:303;;;;;;;;;;-1:-1:-1;56540:303:0;;;;;:::i;:::-;;:::i;18138:201::-;;;;;;;;;;-1:-1:-1;18138:201:0;;;;;:::i;:::-;;:::i;55370:114::-;;;;;;;;;;-1:-1:-1;55370:114:0;;;;;:::i;:::-;;:::i;36892:305::-;36994:4;-1:-1:-1;;;;;;37031:40:0;;-1:-1:-1;;;37031:40:0;;:105;;-1:-1:-1;;;;;;;37088:48:0;;-1:-1:-1;;;37088:48:0;37031:105;:158;;;-1:-1:-1;;;;;;;;;;29770:40:0;;;37153:36;37011:178;36892:305;-1:-1:-1;;36892:305:0:o;37837:100::-;37891:13;37924:5;37917:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37837:100;:::o;39396:221::-;39472:7;42739:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42739:16:0;39492:73;;;;-1:-1:-1;;;39492:73:0;;17628:2:1;39492:73:0;;;17610:21:1;17667:2;17647:18;;;17640:30;17706:34;17686:18;;;17679:62;-1:-1:-1;;;17757:18:1;;;17750:42;17809:19;;39492:73:0;;;;;;;;;-1:-1:-1;39585:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;39585:24:0;;39396:221::o;38919:411::-;39000:13;39016:23;39031:7;39016:14;:23::i;:::-;39000:39;;39064:5;-1:-1:-1;;;;;39058:11:0;:2;-1:-1:-1;;;;;39058:11:0;;;39050:57;;;;-1:-1:-1;;;39050:57:0;;19228:2:1;39050:57:0;;;19210:21:1;19267:2;19247:18;;;19240:30;19306:34;19286:18;;;19279:62;-1:-1:-1;;;19357:18:1;;;19350:31;19398:19;;39050:57:0;19026:397:1;39050:57:0;16033:10;-1:-1:-1;;;;;39142:21:0;;;;:62;;-1:-1:-1;39167:37:0;39184:5;16033:10;39915:164;:::i;39167:37::-;39120:168;;;;-1:-1:-1;;;39120:168:0;;14920:2:1;39120:168:0;;;14902:21:1;14959:2;14939:18;;;14932:30;14998:34;14978:18;;;14971:62;15069:26;15049:18;;;15042:54;15113:19;;39120:168:0;14718:420:1;39120:168:0;39301:21;39310:2;39314:7;39301:8;:21::i;:::-;38989:341;38919:411;;:::o;55496:102::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;55570:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;55496:102:::0;:::o;59575:89::-;59619:7;59642:16;:6;3083:14;;2991:114;59642:16;59635:23;;59575:89;:::o;40146:339::-;40341:41;16033:10;40374:7;40341:18;:41::i;:::-;40333:103;;;;-1:-1:-1;;;40333:103:0;;;;;;;:::i;:::-;40449:28;40459:4;40465:2;40469:7;40449:9;:28::i;40556:185::-;40694:39;40711:4;40717:2;40721:7;40694:39;;;;;;;;;;;;:16;:39::i;59670:616::-;59730:16;59758:23;59784:17;59794:6;59784:9;:17::i;:::-;59758:43;;59808:30;59855:15;59841:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59841:30:0;-1:-1:-1;59808:63:0;-1:-1:-1;59903:1:0;59878:22;59947:305;59972:15;59954;:33;:66;;;;;60009:11;:9;:11::i;:::-;59991:14;:29;;59954:66;59947:305;;;60031:25;60059:23;60067:14;60059:7;:23::i;:::-;60031:51;;60116:6;-1:-1:-1;;;;;60095:27:0;:17;-1:-1:-1;;;;;60095:27:0;;60091:129;;;60168:14;60135:13;60149:15;60135:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;60193:17;;;;:::i;:::-;;;;60091:129;60228:16;;;;:::i;:::-;;;;60022:230;59947:305;;;-1:-1:-1;60267:13:0;;59670:616;-1:-1:-1;;;;59670:616:0:o;54569:78::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;54632:9:::1;::::0;;-1:-1:-1;;54619:22:0;::::1;54632:9;::::0;;::::1;54631:10;54619:22;::::0;;54569:78::o;54224:134::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;54314:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;51827:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54827:78::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;54890:9:::1;::::0;;-1:-1:-1;;54877:22:0;::::1;54890:9:::0;;;;::::1;;;54889:10;54877:22:::0;;::::1;;::::0;;54827:78::o;37531:239::-;37603:7;37639:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37639:16:0;37674:19;37666:73;;;;-1:-1:-1;;;37666:73:0;;16097:2:1;37666:73:0;;;16079:21:1;16136:2;16116:18;;;16109:30;16175:34;16155:18;;;16148:62;-1:-1:-1;;;16226:18:1;;;16219:39;16275:19;;37666:73:0;15895:405:1;54368:108:0;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;54442:12:::1;:28:::0;54368:108::o;54917:86::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;54980:6:::1;:17:::0;;-1:-1:-1;;;;;54980:17:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;54980:17:0;;::::1;::::0;;;::::1;::::0;;54917:86::o;37261:208::-;37333:7;-1:-1:-1;;;;;37361:19:0;;37353:74;;;;-1:-1:-1;;;37353:74:0;;15686:2:1;37353:74:0;;;15668:21:1;15725:2;15705:18;;;15698:30;15764:34;15744:18;;;15737:62;-1:-1:-1;;;15815:18:1;;;15808:40;15865:19;;37353:74:0;15484:406:1;37353:74:0;-1:-1:-1;;;;;;37445:16:0;;;;;:9;:16;;;;;;;37261:208::o;54655:78::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;54718:9:::1;::::0;;-1:-1:-1;;54705:22:0;::::1;54718:9;::::0;;;::::1;;;54717:10;54705:22:::0;;::::1;;::::0;;54655:78::o;17880:103::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;17945:30:::1;17972:1;17945:18;:30::i;:::-;17880:103::o:0;54741:78::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;54804:9:::1;::::0;;-1:-1:-1;;54791:22:0;::::1;54804:9:::0;;;;::::1;;;54803:10;54791:22:::0;;::::1;;::::0;;54741:78::o;55606:666::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;55668:2:::1;::::0;:6;55665:596:::1;;55684:15;55738:2;;55714:21;:26;55710:198;;;55767:21;55757:31;;55809:21;55803:2;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;55710:198:0::1;::::0;-1:-1:-1;55710:198:0::1;;-1:-1:-1::0;55873:2:0::1;::::0;;55895:1:::1;55890:6:::0;;;55710:198:::1;55932:76;::::0;55919:7:::1;::::0;55940:42:::1;::::0;55996:7;;55919;55932:76;55919:7;55932:76;55996:7;55940:42;55932:76:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55918:90;;;56027:2;56019:11;;;::::0;::::1;55665:596;56068:9;56063:189;56087:6;:13:::0;56083:17;::::1;56063:189;;;56126:7;56147:6;56154:1;56147:9;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;56192:12:::1;:15:::0;;-1:-1:-1;;;;;56147:9:0;;::::1;::::0;56208:3:::1;::::0;56192:12;56205:1;;56192:15;::::1;;;;;:::i;:::-;;;;;;;;;56170:21;:37;;;;:::i;:::-;:41;;;;:::i;:::-;56139:77;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56125:91;;;56237:2;56229:11;;;::::0;::::1;;-1:-1:-1::0;56102:3:0;::::1;::::0;::::1;:::i;:::-;;;;56063:189;;;;55606:666::o:0;56849:224::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;56952:9:::1;56947:121;56971:10;:17;56967:1;:21;56947:121;;;57004:35;57014:10;57025:1;57014:13;;;;;;;;:::i;:::-;;;;;;;57029:9;57004;:35::i;:::-;57048:12:::0;::::1;::::0;::::1;:::i;:::-;;;;56990:3;;;;;:::i;:::-;;;;56947:121;;38006:104:::0;38062:13;38095:7;38088:14;;;;;:::i;55130:114::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;55210:28;;::::1;::::0;:15:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;56290:244::-:0;56355:11;53255:1;53241:11;:15;53233:48;;;;-1:-1:-1;;;53233:48:0;;;;;;;:::i;:::-;53330:11;:9;:11::i;:::-;53315;53296:16;:6;3083:14;;2991:114;53296:16;:30;;;;:::i;:::-;:45;;53288:78;;;;-1:-1:-1;;;53288:78:0;;;;;;;:::i;:::-;56384:9:::1;::::0;;;::::1;;;56383:10;56375:36;;;::::0;-1:-1:-1;;;56375:36:0;;14578:2:1;56375:36:0::1;::::0;::::1;14560:21:1::0;14617:2;14597:18;;;14590:30;-1:-1:-1;;;14636:18:1;;;14629:43;14689:18;;56375:36:0::1;14376:337:1::0;56375:36:0::1;56452:11;56439:10;;:24;;;;:::i;:::-;56426:9;:37;;56418:69;;;::::0;-1:-1:-1;;;56418:69:0;;20756:2:1;56418:69:0::1;::::0;::::1;20738:21:1::0;20795:2;20775:18;;;20768:30;-1:-1:-1;;;20814:18:1;;;20807:49;20873:18;;56418:69:0::1;20554:343:1::0;56418:69:0::1;56494:34;56504:10;56516:11;56494:9;:34::i;39689:155::-:0;39784:52;16033:10;39817:8;39827;39784:18;:52::i;51865:31::-;;;;;;;:::i;51788:34::-;;;;;;;:::i;40812:328::-;40987:41;16033:10;41020:7;40987:18;:41::i;:::-;40979:103;;;;-1:-1:-1;;;40979:103:0;;;;;;;:::i;:::-;41093:39;41107:4;41113:2;41117:7;41126:5;41093:13;:39::i;:::-;40812:328;;;;:::o;51749:34::-;;;;;;;:::i;57079:890::-;57191:11;53255:1;53241:11;:15;53233:48;;;;-1:-1:-1;;;53233:48:0;;;;;;;:::i;:::-;53330:11;:9;:11::i;:::-;53315;53296:16;:6;3083:14;;2991:114;53296:16;:30;;;;:::i;:::-;:45;;53288:78;;;;-1:-1:-1;;;53288:78:0;;;;;;;:::i;:::-;57219:9:::1;::::0;;;::::1;;;57211:34;;;::::0;-1:-1:-1;;;57211:34:0;;15345:2:1;57211:34:0::1;::::0;::::1;15327:21:1::0;15384:2;15364:18;;;15357:30;-1:-1:-1;;;15403:18:1;;;15396:42;15455:18;;57211:34:0::1;15143:336:1::0;57211:34:0::1;57302:20;::::0;57287:10:::1;57274:24;::::0;;;:12:::1;:24:::0;;;;;;57260:38:::1;::::0;:11;:38:::1;:::i;:::-;:62;;57252:95;;;;-1:-1:-1::0;;;57252:95:0::1;;;;;;;:::i;:::-;57362:37;57373:5;57380:10;57392:6;;;;;;;;;-1:-1:-1::0;;;;;57392:6:0::1;57362:10;:37::i;:::-;57354:80;;;::::0;-1:-1:-1;;;57354:80:0;;19630:2:1;57354:80:0::1;::::0;::::1;19612:21:1::0;19669:2;19649:18;;;19642:30;19708:32;19688:18;;;19681:60;19758:18;;57354:80:0::1;19428:354:1::0;57354:80:0::1;57476:11;57462;;:25;;;;:::i;:::-;57449:9;:38;;57441:70;;;::::0;-1:-1:-1;;;57441:70:0;;20756:2:1;57441:70:0::1;::::0;::::1;20738:21:1::0;20795:2;20775:18;;;20768:30;-1:-1:-1;;;20814:18:1;;;20807:49;20873:18;;57441:70:0::1;20554:343:1::0;57441:70:0::1;57518:18;57539:12;;57555:1;57539:17;:245;;57600:12;;57616:1;57600:17;:184;;57661:12;;57677:1;57661:17;:123;;57722:12;;57738:1;57722:17;:62;;57783:1;57539:245;;57722:62;57742:11;;57539:245;;57661:123;57681:11;;57539:245;;57600:184;57620:11;;57539:245;;;57559:11;;57539:245;57518:266;;57833:10;57818:11;57799:16;:6;3083:14:::0;;2991:114;57799:16:::1;:30;;;;:::i;:::-;:44;;57791:85;;;::::0;-1:-1:-1;;;57791:85:0;;16507:2:1;57791:85:0::1;::::0;::::1;16489:21:1::0;16546:2;16526:18;;;16519:30;16585;16565:18;;;16558:58;16633:18;;57791:85:0::1;16305:352:1::0;57791:85:0::1;57883:34;57893:10;57905:11;57883:9;:34::i;:::-;57937:10;57924:24;::::0;;;:12:::1;:24:::0;;;;;:39;;57952:11;;57924:24;:39:::1;::::0;57952:11;;57924:39:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;57079:890:0:o;58352:1217::-;42715:4;42739:16;;;:7;:16;;;;;;58426:13;;-1:-1:-1;;;;;42739:16:0;58451:77;;;;-1:-1:-1;;;58451:77:0;;18812:2:1;58451:77:0;;;18794:21:1;18851:2;18831:18;;;18824:30;18890:34;18870:18;;;18863:62;-1:-1:-1;;;18941:18:1;;;18934:45;18996:19;;58451:77:0;18610:411:1;58451:77:0;58539:13;58580:14;;58567:12;;:27;;;;:::i;:::-;58555:8;:39;;:347;;58660:14;;58647:12;;58634;;:25;;;;:::i;:::-;:40;;;;:::i;:::-;58622:8;:52;;:280;;58753:14;;58740:12;;58727;;58714;;:25;;;;:::i;:::-;:38;;;;:::i;:::-;:53;;;;:::i;:::-;58702:8;:65;;:200;;58859:14;;58846:12;;58833;;58820;;58807;;:25;;;;:::i;:::-;:38;;;;:::i;:::-;:51;;;;:::i;:::-;:66;;;;:::i;:::-;58795:8;:78;;:107;;58901:1;58555:347;;58795:107;58876:1;58555:347;;58702:200;58770:1;58555:347;;58622:280;58677:1;58555:347;;;58597:1;58555:347;58539:363;;;;58909:28;58941:5;58950:1;58941:10;:275;;59009:5;59018:1;59009:10;:207;;59077:5;59086:1;59077:10;:139;;59145:5;59154:1;59145:10;:71;;;;;;;;;;;;;;;-1:-1:-1;;;59145:71:0;;;58941:275;;59145:71;59158:15;59145:71;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58941:275;;59077:139;59090:15;59077:139;;;;;:::i;59009:207::-;59022:15;59009:207;;;;;:::i;58941:275::-;58954:15;58941:275;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59228:9;;58909:307;;-1:-1:-1;59228:9:0;;:18;;;:32;;;59250:5;59259:1;59250:10;59228:32;59227:72;;;-1:-1:-1;59266:9:0;;;;;;;:18;;;:32;;;59288:5;59297:1;59288:10;59266:32;59227:110;;;-1:-1:-1;59304:9:0;;;;;;;:18;;;:32;;;59326:5;59335:1;59326:10;59304:32;59227:148;;;-1:-1:-1;59342:9:0;;;;;;;:18;;;:32;;;59364:5;59373:1;59364:10;59342:32;59223:195;;;59393:17;59386:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58352:1217;;;:::o;59223:195::-;59464:1;59439:14;59433:28;:32;:130;;;;;;;;;;;;;;;;;59501:14;59517:19;:8;:17;:19::i;:::-;59538:9;59484:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59433:130;59426:137;58352:1217;-1:-1:-1;;;;58352:1217:0:o;51710:34::-;;;;;;;:::i;57975:371::-;58017:7;58040:12;;58056:1;58040:17;:300;;58092:12;;58108:1;58092:17;:248;;58159:12;;58175:1;58159:17;:181;;58241:12;;58257:1;58241:17;:99;;-1:-1:-1;58339:1:0;;59575:89::o;58241:99::-;58306:12;;58291;;58276;;58261;;:27;;;;:::i;:::-;:42;;;;:::i;:::-;:57;;;;:::i;58159:181::-;58209:12;;58194;;58179;;:27;;;;:::i;58092:248::-;58127:12;;58112;;:27;;;;:::i;58040:300::-;-1:-1:-1;58060:12:0;;;57975:371::o;54483:78::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;54546:9:::1;::::0;;-1:-1:-1;;54533:22:0;::::1;54546:9:::0;;;;::::1;;;54545:10;54533:22:::0;;::::1;;::::0;;54483:78::o;51671:34::-;;;;;;;:::i;55010:114::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;55090:28;;::::1;::::0;:15:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;55250:114::-:0;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;55330:28;;::::1;::::0;:15:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;56540:303::-:0;56626:11;53255:1;53241:11;:15;53233:48;;;;-1:-1:-1;;;53233:48:0;;;;;;;:::i;:::-;53330:11;:9;:11::i;:::-;53315;53296:16;:6;3083:14;;2991:114;53296:16;:30;;;;:::i;:::-;:45;;53288:78;;;;-1:-1:-1;;;53288:78:0;;;;;;;:::i;:::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23:::1;17441:68;;;;-1:-1:-1::0;;;17441:68:0::1;;;;;;;:::i;:::-;56706:20:::2;::::0;56691:10:::2;56678:24;::::0;;;:12:::2;:24:::0;;;;;;56664:38:::2;::::0;:11;:38:::2;:::i;:::-;:62;;56656:95;;;;-1:-1:-1::0;;;56656:95:0::2;;;;;;;:::i;:::-;56758:33;56768:9;56779:11;56758:9;:33::i;:::-;56811:10;56798:24;::::0;;;:12:::2;:24:::0;;;;;:39;;56826:11;;56798:24;:39:::2;::::0;56826:11;;56798:39:::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;56540:303:0:o;18138:201::-;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18227:22:0;::::1;18219:73;;;::::0;-1:-1:-1;;;18219:73:0;;11890:2:1;18219:73:0::1;::::0;::::1;11872:21:1::0;11929:2;11909:18;;;11902:30;11968:34;11948:18;;;11941:62;-1:-1:-1;;;12019:18:1;;;12012:36;12065:19;;18219:73:0::1;11688:402:1::0;18219:73:0::1;18303:28;18322:8;18303:18;:28::i;55370:114::-:0;17302:6;;-1:-1:-1;;;;;17302:6:0;16033:10;17449:23;17441:68;;;;-1:-1:-1;;;17441:68:0;;;;;;;:::i;:::-;55450:28;;::::1;::::0;:15:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;46632:174::-:0;46707:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;46707:29:0;-1:-1:-1;;;;;46707:29:0;;;;;;;;:24;;46761:23;46707:24;46761:14;:23::i;:::-;-1:-1:-1;;;;;46752:46:0;;;;;;;;;;;46632:174;;:::o;42944:348::-;43037:4;42739:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42739:16:0;43054:73;;;;-1:-1:-1;;;43054:73:0;;14165:2:1;43054:73:0;;;14147:21:1;14204:2;14184:18;;;14177:30;14243:34;14223:18;;;14216:62;-1:-1:-1;;;14294:18:1;;;14287:42;14346:19;;43054:73:0;13963:408:1;43054:73:0;43138:13;43154:23;43169:7;43154:14;:23::i;:::-;43138:39;;43207:5;-1:-1:-1;;;;;43196:16:0;:7;-1:-1:-1;;;;;43196:16:0;;:51;;;;43240:7;-1:-1:-1;;;;;43216:31:0;:20;43228:7;43216:11;:20::i;:::-;-1:-1:-1;;;;;43216:31:0;;43196:51;:87;;;-1:-1:-1;;;;;;40036:25:0;;;40012:4;40036:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;43251:32;39915:164;45936:578;46095:4;-1:-1:-1;;;;;46068:31:0;:23;46083:7;46068:14;:23::i;:::-;-1:-1:-1;;;;;46068:31:0;;46060:85;;;;-1:-1:-1;;;46060:85:0;;18402:2:1;46060:85:0;;;18384:21:1;18441:2;18421:18;;;18414:30;18480:34;18460:18;;;18453:62;-1:-1:-1;;;18531:18:1;;;18524:39;18580:19;;46060:85:0;18200:405:1;46060:85:0;-1:-1:-1;;;;;46164:16:0;;46156:65;;;;-1:-1:-1;;;46156:65:0;;13003:2:1;46156:65:0;;;12985:21:1;13042:2;13022:18;;;13015:30;13081:34;13061:18;;;13054:62;-1:-1:-1;;;13132:18:1;;;13125:34;13176:19;;46156:65:0;12801:400:1;46156:65:0;46338:29;46355:1;46359:7;46338:8;:29::i;:::-;-1:-1:-1;;;;;46380:15:0;;;;;;:9;:15;;;;;:20;;46399:1;;46380:15;:20;;46399:1;;46380:20;:::i;:::-;;;;-1:-1:-1;;;;;;;46411:13:0;;;;;;:9;:13;;;;;:18;;46428:1;;46411:13;:18;;46428:1;;46411:18;:::i;:::-;;;;-1:-1:-1;;46440:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;46440:21:0;-1:-1:-1;;;;;46440:21:0;;;;;;;;;46479:27;;46440:16;;46479:27;;;;;;;45936:578;;;:::o;18499:191::-;18592:6;;;-1:-1:-1;;;;;18609:17:0;;;-1:-1:-1;;;;;;18609:17:0;;;;;;;18642:40;;18592:6;;;18609:17;18592:6;;18642:40;;18573:16;;18642:40;18562:128;18499:191;:::o;43634:110::-;43710:26;43720:2;43724:7;43710:26;;;;;;;;;;;;:9;:26::i;53694:204::-;53774:9;53769:124;53793:11;53789:1;:15;53769:124;;;53820:18;:6;3202:19;;3220:1;3202:19;;;3113:127;53820:18;53847:38;53857:9;53868:16;:6;3083:14;;2991:114;53868:16;53847:9;:38::i;:::-;53806:3;;;;:::i;:::-;;;;53769:124;;46948:315;47103:8;-1:-1:-1;;;;;47094:17:0;:5;-1:-1:-1;;;;;47094:17:0;;;47086:55;;;;-1:-1:-1;;;47086:55:0;;13408:2:1;47086:55:0;;;13390:21:1;13447:2;13427:18;;;13420:30;13486:27;13466:18;;;13459:55;13531:18;;47086:55:0;13206:349:1;47086:55:0;-1:-1:-1;;;;;47152:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;47152:46:0;;;;;;;;;;47214:41;;9877::1;;;47214::0;;9850:18:1;47214:41:0;;;;;;;46948:315;;;:::o;42022:::-;42179:28;42189:4;42195:2;42199:7;42179:9;:28::i;:::-;42226:48;42249:4;42255:2;42259:7;42268:5;42226:22;:48::i;:::-;42218:111;;;;-1:-1:-1;;;42218:111:0;;;;;;;:::i;53400:285::-;53502:4;53517:18;53538:20;54109:43;;;54134:4;6161:2:1;6157:15;;;-1:-1:-1;;6153:24:1;;;54109:43:0;;;;6141:37:1;;;;54141:10:0;6212:15:1;;;6208:24;6194:12;;;6187:46;54109:43:0;;;;;;;;;6249:12:1;;;54109:43:0;;54099:54;;;;;;8046:66:1;54015:151:0;;;8034:79:1;8129:12;;;;8122:28;;;;54015:151:0;;;;;;;;;;8166:12:1;;;;54015:151:0;;;53993:182;;;;;;53904:300;53538:20;53517:41;;53585:5;53571:10;:19;53567:60;;53612:5;53605:12;;;;;53567:60;-1:-1:-1;;;;;53642:37:0;;:25;:5;53656:10;53642:13;:25::i;:::-;-1:-1:-1;;;;;53642:37:0;;53635:44;;;53400:285;;;;;;:::o;3949:723::-;4005:13;4226:10;4222:53;;-1:-1:-1;;4253:10:0;;;;;;;;;;;;-1:-1:-1;;;4253:10:0;;;;;3949:723::o;4222:53::-;4300:5;4285:12;4341:78;4348:9;;4341:78;;4374:8;;;;:::i;:::-;;-1:-1:-1;4397:10:0;;-1:-1:-1;4405:2:0;4397:10;;:::i;:::-;;;4341:78;;;4429:19;4461:6;4451:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4451:17:0;;4429:39;;4479:154;4486:10;;4479:154;;4513:11;4523:1;4513:11;;:::i;:::-;;-1:-1:-1;4582:10:0;4590:2;4582:5;:10;:::i;:::-;4569:24;;:2;:24;:::i;:::-;4556:39;;4539:6;4546;4539:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4539:56:0;;;;;;;;-1:-1:-1;4610:11:0;4619:2;4610:11;;:::i;:::-;;;4479:154;;43971:321;44101:18;44107:2;44111:7;44101:5;:18::i;:::-;44152:54;44183:1;44187:2;44191:7;44200:5;44152:22;:54::i;:::-;44130:154;;;;-1:-1:-1;;;44130:154:0;;;;;;;:::i;47828:799::-;47983:4;-1:-1:-1;;;;;48004:13:0;;19840:20;19888:8;48000:620;;48040:72;;-1:-1:-1;;;48040:72:0;;-1:-1:-1;;;;;48040:36:0;;;;;:72;;16033:10;;48091:4;;48097:7;;48106:5;;48040:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48040:72:0;;;;;;;;-1:-1:-1;;48040:72:0;;;;;;;;;;;;:::i;:::-;;;48036:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48282:13:0;;48278:272;;48325:60;;-1:-1:-1;;;48325:60:0;;;;;;;:::i;48278:272::-;48500:6;48494:13;48485:6;48481:2;48477:15;48470:38;48036:529;-1:-1:-1;;;;;;48163:51:0;-1:-1:-1;;;48163:51:0;;-1:-1:-1;48156:58:0;;48000:620;-1:-1:-1;48604:4:0;47828:799;;;;;;:::o;10110:231::-;10188:7;10209:17;10228:18;10250:27;10261:4;10267:9;10250:10;:27::i;:::-;10208:69;;;;10288:18;10300:5;10288:11;:18::i;:::-;-1:-1:-1;10324:9:0;10110:231;-1:-1:-1;;;10110:231:0:o;44628:382::-;-1:-1:-1;;;;;44708:16:0;;44700:61;;;;-1:-1:-1;;;44700:61:0;;17267:2:1;44700:61:0;;;17249:21:1;;;17286:18;;;17279:30;17345:34;17325:18;;;17318:62;17397:18;;44700:61:0;17065:356:1;44700:61:0;42715:4;42739:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42739:16:0;:30;44772:58;;;;-1:-1:-1;;;44772:58:0;;12297:2:1;44772:58:0;;;12279:21:1;12336:2;12316:18;;;12309:30;12375;12355:18;;;12348:58;12423:18;;44772:58:0;12095:352:1;44772:58:0;-1:-1:-1;;;;;44901:13:0;;;;;;:9;:13;;;;;:18;;44918:1;;44901:13;:18;;44918:1;;44901:18;:::i;:::-;;;;-1:-1:-1;;44930:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;44930:21:0;-1:-1:-1;;;;;44930:21:0;;;;;;;;44969:33;;44930:16;;;44969:33;;44930:16;;44969:33;44628:382;;:::o;8000:1308::-;8081:7;8090:12;8315:9;:16;8335:2;8315:22;8311:990;;;8611:4;8596:20;;8590:27;8661:4;8646:20;;8640:27;8719:4;8704:20;;8698:27;8354:9;8690:36;8762:25;8773:4;8690:36;8590:27;8640;8762:10;:25::i;:::-;8755:32;;;;;;;;;8311:990;8809:9;:16;8829:2;8809:22;8805:496;;;9084:4;9069:20;;9063:27;9135:4;9120:20;;9114:27;9177:23;9188:4;9063:27;9114;9177:10;:23::i;:::-;9170:30;;;;;;;;8805:496;-1:-1:-1;9249:1:0;;-1:-1:-1;9253:35:0;8805:496;8000:1308;;;;;:::o;6271:643::-;6349:20;6340:5;:29;;;;;;;;:::i;:::-;;6336:571;;;6271:643;:::o;6336:571::-;6447:29;6438:5;:38;;;;;;;;:::i;:::-;;6434:473;;;6493:34;;-1:-1:-1;;;6493:34:0;;10758:2:1;6493:34:0;;;10740:21:1;10797:2;10777:18;;;10770:30;10836:26;10816:18;;;10809:54;10880:18;;6493:34:0;10556:348:1;6434:473:0;6558:35;6549:5;:44;;;;;;;;:::i;:::-;;6545:362;;;6610:41;;-1:-1:-1;;;6610:41:0;;11111:2:1;6610:41:0;;;11093:21:1;11150:2;11130:18;;;11123:30;11189:33;11169:18;;;11162:61;11240:18;;6610:41:0;10909:355:1;6545:362:0;6682:30;6673:5;:39;;;;;;;;:::i;:::-;;6669:238;;;6729:44;;-1:-1:-1;;;6729:44:0;;13762:2:1;6729:44:0;;;13744:21:1;13801:2;13781:18;;;13774:30;13840:34;13820:18;;;13813:62;-1:-1:-1;;;13891:18:1;;;13884:32;13933:19;;6729:44:0;13560:398:1;6669:238:0;6804:30;6795:5;:39;;;;;;;;:::i;:::-;;6791:116;;;6851:44;;-1:-1:-1;;;6851:44:0;;16864:2:1;6851:44:0;;;16846:21:1;16903:2;16883:18;;;16876:30;16942:34;16922:18;;;16915:62;-1:-1:-1;;;16993:18:1;;;16986:32;17035:19;;6851:44:0;16662:398:1;11609:1632:0;11740:7;;12674:66;12661:79;;12657:163;;;-1:-1:-1;12773:1:0;;-1:-1:-1;12777:30:0;12757:51;;12657:163;12834:1;:7;;12839:2;12834:7;;:18;;;;;12845:1;:7;;12850:2;12845:7;;12834:18;12830:102;;;-1:-1:-1;12885:1:0;;-1:-1:-1;12889:30:0;12869:51;;12830:102;13046:24;;;13029:14;13046:24;;;;;;;;;10156:25:1;;;10229:4;10217:17;;10197:18;;;10190:45;;;;10251:18;;;10244:34;;;10294:18;;;10287:34;;;13046:24:0;;10128:19:1;;13046:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13046:24:0;;-1:-1:-1;;13046:24:0;;;-1:-1:-1;;;;;;;13085:20:0;;13081:103;;13138:1;13142:29;13122:50;;;;;;;13081:103;13204:6;-1:-1:-1;13212:20:0;;-1:-1:-1;11609:1632:0;;;;;;;;:::o;10604:391::-;10718:7;;-1:-1:-1;;;;;10819:75:0;;10921:3;10917:12;;;10931:2;10913:21;10962:25;10973:4;10913:21;10982:1;10819:75;10962:10;:25::i;:::-;10955:32;;;;;;10604:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:220::-;645:5;698:3;691:4;683:6;679:17;675:27;665:55;;716:1;713;706:12;665:55;738:79;813:3;804:6;791:20;784:4;776:6;772:17;738:79;:::i;828:186::-;887:6;940:2;928:9;919:7;915:23;911:32;908:52;;;956:1;953;946:12;908:52;979:29;998:9;979:29;:::i;1019:260::-;1087:6;1095;1148:2;1136:9;1127:7;1123:23;1119:32;1116:52;;;1164:1;1161;1154:12;1116:52;1187:29;1206:9;1187:29;:::i;:::-;1177:39;;1235:38;1269:2;1258:9;1254:18;1235:38;:::i;:::-;1225:48;;1019:260;;;;;:::o;1284:328::-;1361:6;1369;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;;1517:38;1551:2;1540:9;1536:18;1517:38;:::i;:::-;1507:48;;1602:2;1591:9;1587:18;1574:32;1564:42;;1284:328;;;;;:::o;1617:537::-;1712:6;1720;1728;1736;1789:3;1777:9;1768:7;1764:23;1760:33;1757:53;;;1806:1;1803;1796:12;1757:53;1829:29;1848:9;1829:29;:::i;:::-;1819:39;;1877:38;1911:2;1900:9;1896:18;1877:38;:::i;:::-;1867:48;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;2044:18;2036:6;2033:30;2030:50;;;2076:1;2073;2066:12;2030:50;2099:49;2140:7;2131:6;2120:9;2116:22;2099:49;:::i;:::-;2089:59;;;1617:537;;;;;;;:::o;2159:347::-;2224:6;2232;2285:2;2273:9;2264:7;2260:23;2256:32;2253:52;;;2301:1;2298;2291:12;2253:52;2324:29;2343:9;2324:29;:::i;:::-;2314:39;;2403:2;2392:9;2388:18;2375:32;2450:5;2443:13;2436:21;2429:5;2426:32;2416:60;;2472:1;2469;2462:12;2416:60;2495:5;2485:15;;;2159:347;;;;;:::o;2511:254::-;2579:6;2587;2640:2;2628:9;2619:7;2615:23;2611:32;2608:52;;;2656:1;2653;2646:12;2608:52;2679:29;2698:9;2679:29;:::i;:::-;2669:39;2755:2;2740:18;;;;2727:32;;-1:-1:-1;;;2511:254:1:o;2770:1033::-;2863:6;2871;2924:2;2912:9;2903:7;2899:23;2895:32;2892:52;;;2940:1;2937;2930:12;2892:52;2980:9;2967:23;3009:18;3050:2;3042:6;3039:14;3036:34;;;3066:1;3063;3056:12;3036:34;3104:6;3093:9;3089:22;3079:32;;3149:7;3142:4;3138:2;3134:13;3130:27;3120:55;;3171:1;3168;3161:12;3120:55;3207:2;3194:16;3229:4;3252:2;3248;3245:10;3242:36;;;3258:18;;:::i;:::-;3304:2;3301:1;3297:10;3287:20;;3327:28;3351:2;3347;3343:11;3327:28;:::i;:::-;3389:15;;;3420:12;;;;3452:11;;;3482;;;3478:20;;3475:33;-1:-1:-1;3472:53:1;;;3521:1;3518;3511:12;3472:53;3543:1;3534:10;;3553:169;3567:2;3564:1;3561:9;3553:169;;;3624:23;3643:3;3624:23;:::i;:::-;3612:36;;3585:1;3578:9;;;;;3668:12;;;;3700;;3553:169;;;-1:-1:-1;3741:5:1;3778:18;;;;3765:32;;-1:-1:-1;;;;;;;2770:1033:1:o;3808:245::-;3866:6;3919:2;3907:9;3898:7;3894:23;3890:32;3887:52;;;3935:1;3932;3925:12;3887:52;3974:9;3961:23;3993:30;4017:5;3993:30;:::i;4058:249::-;4127:6;4180:2;4168:9;4159:7;4155:23;4151:32;4148:52;;;4196:1;4193;4186:12;4148:52;4228:9;4222:16;4247:30;4271:5;4247:30;:::i;4312:450::-;4381:6;4434:2;4422:9;4413:7;4409:23;4405:32;4402:52;;;4450:1;4447;4440:12;4402:52;4490:9;4477:23;4523:18;4515:6;4512:30;4509:50;;;4555:1;4552;4545:12;4509:50;4578:22;;4631:4;4623:13;;4619:27;-1:-1:-1;4609:55:1;;4660:1;4657;4650:12;4609:55;4683:73;4748:7;4743:2;4730:16;4725:2;4721;4717:11;4683:73;:::i;4767:180::-;4826:6;4879:2;4867:9;4858:7;4854:23;4850:32;4847:52;;;4895:1;4892;4885:12;4847:52;-1:-1:-1;4918:23:1;;4767:180;-1:-1:-1;4767:180:1:o;4952:254::-;5020:6;5028;5081:2;5069:9;5060:7;5056:23;5052:32;5049:52;;;5097:1;5094;5087:12;5049:52;5133:9;5120:23;5110:33;;5162:38;5196:2;5185:9;5181:18;5162:38;:::i;5211:456::-;5297:6;5305;5313;5366:2;5354:9;5345:7;5341:23;5337:32;5334:52;;;5382:1;5379;5372:12;5334:52;5418:9;5405:23;5395:33;;5475:2;5464:9;5460:18;5447:32;5437:42;;5530:2;5519:9;5515:18;5502:32;5557:18;5549:6;5546:30;5543:50;;;5589:1;5586;5579:12;5543:50;5612:49;5653:7;5644:6;5633:9;5629:22;5612:49;:::i;:::-;5602:59;;;5211:456;;;;;:::o;5672:257::-;5713:3;5751:5;5745:12;5778:6;5773:3;5766:19;5794:63;5850:6;5843:4;5838:3;5834:14;5827:4;5820:5;5816:16;5794:63;:::i;:::-;5911:2;5890:15;-1:-1:-1;;5886:29:1;5877:39;;;;5918:4;5873:50;;5672:257;-1:-1:-1;;5672:257:1:o;6272:1527::-;6496:3;6534:6;6528:13;6560:4;6573:51;6617:6;6612:3;6607:2;6599:6;6595:15;6573:51;:::i;:::-;6687:13;;6646:16;;;;6709:55;6687:13;6646:16;6731:15;;;6709:55;:::i;:::-;6853:13;;6786:20;;;6826:1;;6913;6935:18;;;;6988;;;;7015:93;;7093:4;7083:8;7079:19;7067:31;;7015:93;7156:2;7146:8;7143:16;7123:18;7120:40;7117:167;;;-1:-1:-1;;;7183:33:1;;7239:4;7236:1;7229:15;7269:4;7190:3;7257:17;7117:167;7300:18;7327:110;;;;7451:1;7446:328;;;;7293:481;;7327:110;-1:-1:-1;;7362:24:1;;7348:39;;7407:20;;;;-1:-1:-1;7327:110:1;;7446:328;21437:1;21430:14;;;21474:4;21461:18;;7541:1;7555:169;7569:8;7566:1;7563:15;7555:169;;;7651:14;;7636:13;;;7629:37;7694:16;;;;7586:10;;7555:169;;;7559:3;;7755:8;7748:5;7744:20;7737:27;;7293:481;-1:-1:-1;7790:3:1;;6272:1527;-1:-1:-1;;;;;;;;;;;6272:1527:1:o;8607:488::-;-1:-1:-1;;;;;8876:15:1;;;8858:34;;8928:15;;8923:2;8908:18;;8901:43;8975:2;8960:18;;8953:34;;;9023:3;9018:2;9003:18;;8996:31;;;8801:4;;9044:45;;9069:19;;9061:6;9044:45;:::i;:::-;9036:53;8607:488;-1:-1:-1;;;;;;8607:488:1:o;9100:632::-;9271:2;9323:21;;;9393:13;;9296:18;;;9415:22;;;9242:4;;9271:2;9494:15;;;;9468:2;9453:18;;;9242:4;9537:169;9551:6;9548:1;9545:13;9537:169;;;9612:13;;9600:26;;9681:15;;;;9646:12;;;;9573:1;9566:9;9537:169;;;-1:-1:-1;9723:3:1;;9100:632;-1:-1:-1;;;;;;9100:632:1:o;10332:219::-;10481:2;10470:9;10463:21;10444:4;10501:44;10541:2;10530:9;10526:18;10518:6;10501:44;:::i;11269:414::-;11471:2;11453:21;;;11510:2;11490:18;;;11483:30;11549:34;11544:2;11529:18;;11522:62;-1:-1:-1;;;11615:2:1;11600:18;;11593:48;11673:3;11658:19;;11269:414::o;12452:344::-;12654:2;12636:21;;;12693:2;12673:18;;;12666:30;-1:-1:-1;;;12727:2:1;12712:18;;12705:50;12787:2;12772:18;;12452:344::o;17839:356::-;18041:2;18023:21;;;18060:18;;;18053:30;18119:34;18114:2;18099:18;;18092:62;18186:2;18171:18;;17839:356::o;19787:344::-;19989:2;19971:21;;;20028:2;20008:18;;;20001:30;-1:-1:-1;;;20062:2:1;20047:18;;20040:50;20122:2;20107:18;;19787:344::o;20136:413::-;20338:2;20320:21;;;20377:2;20357:18;;;20350:30;20416:34;20411:2;20396:18;;20389:62;-1:-1:-1;;;20482:2:1;20467:18;;20460:47;20539:3;20524:19;;20136:413::o;21084:275::-;21155:2;21149:9;21220:2;21201:13;;-1:-1:-1;;21197:27:1;21185:40;;21255:18;21240:34;;21276:22;;;21237:62;21234:88;;;21302:18;;:::i;:::-;21338:2;21331:22;21084:275;;-1:-1:-1;21084:275:1:o;21490:128::-;21530:3;21561:1;21557:6;21554:1;21551:13;21548:39;;;21567:18;;:::i;:::-;-1:-1:-1;21603:9:1;;21490:128::o;21623:120::-;21663:1;21689;21679:35;;21694:18;;:::i;:::-;-1:-1:-1;21728:9:1;;21623:120::o;21748:168::-;21788:7;21854:1;21850;21846:6;21842:14;21839:1;21836:21;21831:1;21824:9;21817:17;21813:45;21810:71;;;21861:18;;:::i;:::-;-1:-1:-1;21901:9:1;;21748:168::o;21921:125::-;21961:4;21989:1;21986;21983:8;21980:34;;;21994:18;;:::i;:::-;-1:-1:-1;22031:9:1;;21921:125::o;22051:258::-;22123:1;22133:113;22147:6;22144:1;22141:13;22133:113;;;22223:11;;;22217:18;22204:11;;;22197:39;22169:2;22162:10;22133:113;;;22264:6;22261:1;22258:13;22255:48;;;-1:-1:-1;;22299:1:1;22281:16;;22274:27;22051:258::o;22314:380::-;22393:1;22389:12;;;;22436;;;22457:61;;22511:4;22503:6;22499:17;22489:27;;22457:61;22564:2;22556:6;22553:14;22533:18;22530:38;22527:161;;;22610:10;22605:3;22601:20;22598:1;22591:31;22645:4;22642:1;22635:15;22673:4;22670:1;22663:15;22527:161;;22314:380;;;:::o;22699:135::-;22738:3;-1:-1:-1;;22759:17:1;;22756:43;;;22779:18;;:::i;:::-;-1:-1:-1;22826:1:1;22815:13;;22699:135::o;22839:112::-;22871:1;22897;22887:35;;22902:18;;:::i;:::-;-1:-1:-1;22936:9:1;;22839:112::o;22956:127::-;23017:10;23012:3;23008:20;23005:1;22998:31;23048:4;23045:1;23038:15;23072:4;23069:1;23062:15;23088:127;23149:10;23144:3;23140:20;23137:1;23130:31;23180:4;23177:1;23170:15;23204:4;23201:1;23194:15;23220:127;23281:10;23276:3;23272:20;23269:1;23262:31;23312:4;23309:1;23302:15;23336:4;23333:1;23326:15;23352:127;23413:10;23408:3;23404:20;23401:1;23394:31;23444:4;23441:1;23434:15;23468:4;23465:1;23458:15;23484:127;23545:10;23540:3;23536:20;23533:1;23526:31;23576:4;23573:1;23566:15;23600:4;23597:1;23590:15;23616:131;-1:-1:-1;;;;;;23690:32:1;;23680:43;;23670:71;;23737:1;23734;23727:12

Swarm Source

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