ETH Price: $3,690.73 (+3.40%)

8SIAN (8SIAN)
 

Overview

TokenID

7000

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

8,888 NFTs of beautiful, Asian women painstakingly-crafted where even the most intricate details are steeped in historical significance.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
_8SIAN_

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 2021-12-25
*/

// SPDX-License-Identifier: MIT
/*
 ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄        ▄ 
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░▌      ▐░▌
▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀▀▀  ▀▀▀▀█░█▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌▐░▌░▌     ▐░▌
▐░▌       ▐░▌▐░▌               ▐░▌     ▐░▌       ▐░▌▐░▌▐░▌    ▐░▌
▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄▄▄      ▐░▌     ▐░█▄▄▄▄▄▄▄█░▌▐░▌ ▐░▌   ▐░▌
 ▐░░░░░░░░░▌ ▐░░░░░░░░░░░▌     ▐░▌     ▐░░░░░░░░░░░▌▐░▌  ▐░▌  ▐░▌
▐░█▀▀▀▀▀▀▀█░▌ ▀▀▀▀▀▀▀▀▀█░▌     ▐░▌     ▐░█▀▀▀▀▀▀▀█░▌▐░▌   ▐░▌ ▐░▌
▐░▌       ▐░▌          ▐░▌     ▐░▌     ▐░▌       ▐░▌▐░▌    ▐░▌▐░▌
▐░█▄▄▄▄▄▄▄█░▌ ▄▄▄▄▄▄▄▄▄█░▌ ▄▄▄▄█░█▄▄▄▄ ▐░▌       ▐░▌▐░▌     ▐░▐░▌
▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░▌       ▐░▌▐░▌      ▐░░▌
 ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀         ▀  ▀        ▀▀ 
                                                                                         
                      By Devko.dev#7286                              
 */
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;
    }
}

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.7;

contract _8SIAN_ is ERC721, Ownable {

    using Strings for uint256;
    using Counters for Counters.Counter;
    using ECDSA for bytes32;

    string private _tokenBaseURI = "https://gateway.pinata.cloud/ipfs/QmZhoKWASbhqCyCLHQfTs6bhe3uRhZWKPLwvgNUmowJ2NP/";
    uint256 public M_8SIAN_TEAM_RESERVE = 888;
    uint256 public M_8SIAN_FREE_CLAIM_RESERVE = 888;
    uint256 public M_8SIAN_PUBLIC = 7112;
    uint256 public M_8SIAN_MAX = M_8SIAN_FREE_CLAIM_RESERVE + M_8SIAN_TEAM_RESERVE + M_8SIAN_PUBLIC;
    uint256 public M_8SIAN_PRICE = 0.088 ether;
    uint256 public M_8SIAN_PER_MINT = 5;
    mapping(address => uint256) public CLAIMERS_LIST;
    mapping(address => uint256) public PRIVATE_MINT_LIST;

    address private PRIVATE_SIGNER = 0xB1b9B90F65Cde3cA10bf469D16A7BC5Ef4Ccd48e;
    string private constant PRESALE_SIG_WORD = "8SIAN_M_PRESALE";

    uint256 public claimTokensMinted;
    uint256 public publicTokensMinted;
    uint256 public teamTokensMinted;

    bool public privateLive;
    bool public claimFreeLive;
    bool public publicLive;

    Counters.Counter private _tokensMinted;

    constructor() ERC721("8SIAN", "8SIAN") {}
    
    function matchAddresSigner(bytes memory signature, string memory extraWord, uint256 allowedQuantity) private view returns(bool) {
         bytes32 hash = keccak256(abi.encodePacked(
            "\x19Ethereum Signed Message:\n32",
            keccak256(abi.encodePacked(msg.sender, PRESALE_SIG_WORD, extraWord, allowedQuantity)))
          );
        return PRIVATE_SIGNER == hash.recover(signature);
    }   

    function gift(address[] calldata receivers) external onlyOwner {
        require(teamTokensMinted + receivers.length <= M_8SIAN_TEAM_RESERVE, "EXCEED_TEAM_RESERVE");
        require(_tokensMinted.current() + receivers.length <= M_8SIAN_MAX, "EXCEED_MAX");
        for (uint256 i = 0; i < receivers.length; i++) {
            teamTokensMinted++;
            _tokensMinted.increment();
            _safeMint(receivers[i], _tokensMinted.current());
        }
    }

    function founderMint(uint256 tokenQuantity) external onlyOwner {
        require(teamTokensMinted + tokenQuantity <= M_8SIAN_TEAM_RESERVE, "EXCEED_TEAM_RESERVE");
        require(_tokensMinted.current() + tokenQuantity <= M_8SIAN_MAX, "EXCEED_MAX");
        for(uint256 i = 0; i < tokenQuantity; i++) {
            teamTokensMinted++;
            _tokensMinted.increment();
            _safeMint(msg.sender, _tokensMinted.current());
        }
    }

    function privateMint(bytes memory signature, uint256 tokenQuantity, uint256 allowedQuantity) external payable {
        require(privateLive, "MINT_CLOSED");
        require(matchAddresSigner(signature, "TYPE-PRIVATE", allowedQuantity), "DIRECT_MINT_DISALLOWED");
        require(publicTokensMinted + tokenQuantity <= M_8SIAN_PUBLIC, "EXCEED_PUBLIC");
        require(_tokensMinted.current() + tokenQuantity <= M_8SIAN_MAX, "EXCEED_MAX");
        require(PRIVATE_MINT_LIST[msg.sender] + tokenQuantity <= allowedQuantity, "EXCEED_PER_WALLET");
        require(M_8SIAN_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");

        for (uint256 i = 0; i < tokenQuantity; i++) {
            publicTokensMinted++;
            PRIVATE_MINT_LIST[msg.sender]++;
            _tokensMinted.increment();
            _safeMint(msg.sender, _tokensMinted.current());
        }
    }

    function claim(bytes memory signature, uint256 tokenQuantity, uint256 allowedQuantity) external {
        require(claimFreeLive, "MINT_CLOSED");
        require(matchAddresSigner(signature, "TYPE-FREE", allowedQuantity), "DIRECT_MINT_DISALLOWED");
        require(claimTokensMinted + tokenQuantity <= M_8SIAN_FREE_CLAIM_RESERVE, "EXCEED_FREE_CLAIM_RESERVE");
        require(_tokensMinted.current() + tokenQuantity <= M_8SIAN_MAX, "EXCEED_MAX");
        require(CLAIMERS_LIST[msg.sender] + tokenQuantity <= allowedQuantity, "EXCEED_PER_WALLET");

        for (uint256 i = 0; i < tokenQuantity; i++) {
            claimTokensMinted++;
            CLAIMERS_LIST[msg.sender]++;
            _tokensMinted.increment();
            _safeMint(msg.sender, _tokensMinted.current());
        }
    }

    function mint(uint256 tokenQuantity) external payable {
        require(publicLive, "MINT_CLOSED");
        require(publicTokensMinted + tokenQuantity <= M_8SIAN_PUBLIC, "EXCEED_PUBLIC");
        require(_tokensMinted.current() + tokenQuantity <= M_8SIAN_MAX, "EXCEED_MAX");
        require(tokenQuantity <= M_8SIAN_PER_MINT, "EXCEED_PER_MINT");
        require(M_8SIAN_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");

        for (uint256 i = 0; i < tokenQuantity; i++) {
            publicTokensMinted++;
            _tokensMinted.increment();
            _safeMint(msg.sender, _tokensMinted.current());
        }
    }
 
    function withdraw() external onlyOwner {
        uint256 currentBalance = address(this).balance;
        Address.sendValue(payable(0xc640E8B617F71E32f4c664Ea30921dAbF7870144), currentBalance * 220/ 1000);
        Address.sendValue(payable(0xe72441A43Ed985a9E3D43c11a7FcE93Dd282FF03), currentBalance * 170/ 1000);
        Address.sendValue(payable(0x683E1164Cf26875710737c77fBbE9AF8abCcd0AD), currentBalance * 165/ 1000);
        Address.sendValue(payable(0xb53b491e917Eefe9c4d713870B9a08D630670245), currentBalance * 150/ 1000);           
        Address.sendValue(payable(0x11111F01570EeAA3e5a2Fd51f4A2f127661B9834), currentBalance * 80 / 1000);
        Address.sendValue(payable(0xE9D0BD5520af8c9ad20e12801315117dE9958149), currentBalance * 50 / 1000);
        Address.sendValue(payable(0x9178bCf3A4C25B9A321EDFE7360fA587f7bD10fd), currentBalance * 50 / 1000);
        Address.sendValue(payable(0x15A294789F34F91b03ec8a005fd27b13005f302e), currentBalance * 50 / 1000);
        Address.sendValue(payable(0xeD9C842645D9a2Bb66d4EAC77857768071384447), currentBalance * 25 / 1000);
        Address.sendValue(payable(0xc0F030eac8b588817f8dA16b9a2CDCcc6451B25c), currentBalance * 10 / 1000);
        Address.sendValue(payable(0x3329904219aF8Da1B86576C64b68eBe59D28c037), currentBalance * 10 / 1000);
        Address.sendValue(payable(0x506046F99A9932540fa5938fa4aE3a6Ff20E1f65), currentBalance * 10 / 1000);
        Address.sendValue(payable(0xf0d78074a1ED1c4CAEce0cECfE81DC9010A77FB9), address(this).balance);
    }

    function withdrawB() external onlyOwner {
        uint256 currentBalance = address(this).balance;
        payable(0xc640E8B617F71E32f4c664Ea30921dAbF7870144).transfer(currentBalance * 220/ 1000);
        payable(0xe72441A43Ed985a9E3D43c11a7FcE93Dd282FF03).transfer(currentBalance * 170/ 1000);
        payable(0x683E1164Cf26875710737c77fBbE9AF8abCcd0AD).transfer(currentBalance * 165/ 1000);
        payable(0xb53b491e917Eefe9c4d713870B9a08D630670245).transfer(currentBalance * 150/ 1000);           
        payable(0x11111F01570EeAA3e5a2Fd51f4A2f127661B9834).transfer(currentBalance * 80 / 1000);
        payable(0xE9D0BD5520af8c9ad20e12801315117dE9958149).transfer(currentBalance * 50 / 1000);
        payable(0x9178bCf3A4C25B9A321EDFE7360fA587f7bD10fd).transfer(currentBalance * 50 / 1000);
        payable(0x15A294789F34F91b03ec8a005fd27b13005f302e).transfer(currentBalance * 50 / 1000);
        payable(0xeD9C842645D9a2Bb66d4EAC77857768071384447).transfer(currentBalance * 25 / 1000);
        payable(0xc0F030eac8b588817f8dA16b9a2CDCcc6451B25c).transfer(currentBalance * 10 / 1000);
        payable(0x3329904219aF8Da1B86576C64b68eBe59D28c037).transfer(currentBalance * 10 / 1000);
        payable(0x506046F99A9932540fa5938fa4aE3a6Ff20E1f65).transfer(currentBalance * 10 / 1000);
        payable(0xf0d78074a1ED1c4CAEce0cECfE81DC9010A77FB9).transfer(address(this).balance);
    }
    
    function togglePrivateMintStatus() external onlyOwner {
        privateLive = !privateLive;
    }

    function togglePublicMintStatus() external onlyOwner {
        publicLive = !publicLive;
    }

    function toggleClaimFreeMintStatus() external onlyOwner {
        claimFreeLive = !claimFreeLive;
    }

    function setPrice(uint256 newPrice) external onlyOwner {
        M_8SIAN_PRICE = newPrice;
    }

    function setTeamReserve(uint256 newCount) external onlyOwner {
        M_8SIAN_TEAM_RESERVE = newCount;
    }

    function setFreeClaimReserve(uint256 newCount) external onlyOwner {
        M_8SIAN_FREE_CLAIM_RESERVE = newCount;
    }

    function setPublic(uint256 newCount) external onlyOwner {
        M_8SIAN_PUBLIC = newCount;
    }
    
    function setMax(uint256 newCount) external onlyOwner {
        M_8SIAN_MAX = newCount;
    }
    
    function setBaseURI(string calldata URI) external onlyOwner {
        _tokenBaseURI = URI;
    }
    
    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        require(_exists(tokenId), "Cannot query non-existent token");
        return string(abi.encodePacked(_tokenBaseURI, tokenId.toString()));
    }

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

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"CLAIMERS_LIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"M_8SIAN_FREE_CLAIM_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"M_8SIAN_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"M_8SIAN_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"M_8SIAN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"M_8SIAN_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"M_8SIAN_TEAM_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"PRIVATE_MINT_LIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"},{"internalType":"uint256","name":"allowedQuantity","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFreeLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"founderMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"},{"internalType":"uint256","name":"allowedQuantity","type":"uint256"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCount","type":"uint256"}],"name":"setFreeClaimReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCount","type":"uint256"}],"name":"setMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCount","type":"uint256"}],"name":"setPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCount","type":"uint256"}],"name":"setTeamReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleClaimFreeMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePrivateMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101006040526051608081815290620036ad60a03980516200002a9160079160209091019062000175565b50610378600855610378600955611bc8600a55600a546008546009546200005291906200021b565b6200005e91906200021b565b600b55670138a388a43c0000600c556005600d55601080546001600160a01b03191673b1b9b90f65cde3ca10bf469d16a7bc5ef4ccd48e179055348015620000a557600080fd5b506040805180820182526005808252641c29a4a0a760d91b602080840182815285518087019096529285528401528151919291620000e69160009162000175565b508051620000fc90600190602084019062000175565b50505062000119620001136200011f60201b60201c565b62000123565b6200027f565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001839062000242565b90600052602060002090601f016020900481019282620001a75760008555620001f2565b82601f10620001c257805160ff1916838001178555620001f2565b82800160010185558215620001f2579182015b82811115620001f2578251825591602001919060010190620001d5565b506200020092915062000204565b5090565b5b8082111562000200576000815560010162000205565b600082198211156200023d57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200025757607f821691505b602082108114156200027957634e487b7160e01b600052602260045260246000fd5b50919050565b61341e806200028f6000396000f3fe60806040526004361061028c5760003560e01c806370a082311161015a578063a22cb465116100c1578063cd3c6c261161007a578063cd3c6c2614610752578063e5da932a14610767578063e985e9c51461077c578063f2fde38b146107c5578063f42202e8146107e5578063f8bc26c41461080557600080fd5b8063a22cb4651461069c578063adcf2611146106bc578063b6ba3fcd146106d2578063b7f751d8146106f2578063b88d4fde14610712578063c87b56dd1461073257600080fd5b806397f5ec671161011357806397f5ec671461061f5780639a2db9c4146106345780639f9eba451461064a578063a0712d6814610660578063a0cd313a14610673578063a1ee0cba1461068957600080fd5b806370a082311461057d578063715018a61461059d5780638da5cb5b146105b257806391b7f5ed146105d057806395d89b41146105f057806397283d2f1461060557600080fd5b806331440f31116101fe57806342842e0e116101b757806342842e0e146104c55780634543d1a4146104e55780634f3a6747146104fb578063506296081461051057806355f804b31461053d5780636352211e1461055d57600080fd5b806331440f311461042557806331845f7d1461043b5780633a37fa241461045b5780633ccfd60b1461047b5780633f59e84614610490578063424d995d146104af57600080fd5b806318160ddd1161025057806318160ddd146103695780631fe9eabc1461038c57806320e2ed3b146103ac57806322cb1ec8146103c257806323b872dd146103d857806328fabd7f146103f857600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b314610327578063163e1e611461034957600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102b86102b3366004612eb5565b610825565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e2610877565b6040516102c49190613138565b3480156102fb57600080fd5b5061030f61030a366004612f9d565b610909565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b50610347610342366004612e16565b6109a3565b005b34801561035557600080fd5b50610347610364366004612e40565b610ab9565b34801561037557600080fd5b5061037e610be4565b6040519081526020016102c4565b34801561039857600080fd5b506103476103a7366004612f9d565b610bf4565b3480156103b857600080fd5b5061037e60085481565b3480156103ce57600080fd5b5061037e60135481565b3480156103e457600080fd5b506103476103f3366004612d36565b610c23565b34801561040457600080fd5b5061037e610413366004612ce1565b600e6020526000908152604090205481565b34801561043157600080fd5b5061037e60125481565b34801561044757600080fd5b50610347610456366004612f9d565b610c54565b34801561046757600080fd5b50610347610476366004612f9d565b610c83565b34801561048757600080fd5b50610347610cb2565b34801561049c57600080fd5b506014546102b890610100900460ff1681565b3480156104bb57600080fd5b5061037e600c5481565b3480156104d157600080fd5b506103476104e0366004612d36565b610ed5565b3480156104f157600080fd5b5061037e600b5481565b34801561050757600080fd5b50610347610ef0565b34801561051c57600080fd5b5061037e61052b366004612ce1565b600f6020526000908152604090205481565b34801561054957600080fd5b50610347610558366004612f3d565b610f37565b34801561056957600080fd5b5061030f610578366004612f9d565b610f6d565b34801561058957600080fd5b5061037e610598366004612ce1565b610fe4565b3480156105a957600080fd5b5061034761106b565b3480156105be57600080fd5b506006546001600160a01b031661030f565b3480156105dc57600080fd5b506103476105eb366004612f9d565b6110a1565b3480156105fc57600080fd5b506102e26110d0565b34801561061157600080fd5b506014546102b89060ff1681565b34801561062b57600080fd5b506103476110df565b34801561064057600080fd5b5061037e600a5481565b34801561065657600080fd5b5061037e600d5481565b61034761066e366004612f9d565b611128565b34801561067f57600080fd5b5061037e60115481565b610347610697366004612eef565b6112b9565b3480156106a857600080fd5b506103476106b7366004612dda565b6114f5565b3480156106c857600080fd5b5061037e60095481565b3480156106de57600080fd5b506103476106ed366004612eef565b611500565b3480156106fe57600080fd5b506014546102b89062010000900460ff1681565b34801561071e57600080fd5b5061034761072d366004612d72565b6116f8565b34801561073e57600080fd5b506102e261074d366004612f9d565b61172a565b34801561075e57600080fd5b506103476117c3565b34801561077357600080fd5b50610347611c5a565b34801561078857600080fd5b506102b8610797366004612d03565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107d157600080fd5b506103476107e0366004612ce1565b611c98565b3480156107f157600080fd5b50610347610800366004612f9d565b611d30565b34801561081157600080fd5b50610347610820366004612f9d565b611e31565b60006001600160e01b031982166380ac58cd60e01b148061085657506001600160e01b03198216635b5e139f60e01b145b8061087157506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610886906132fa565b80601f01602080910402602001604051908101604052809291908181526020018280546108b2906132fa565b80156108ff5780601f106108d4576101008083540402835291602001916108ff565b820191906000526020600020905b8154815290600101906020018083116108e257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109875760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109ae82610f6d565b9050806001600160a01b0316836001600160a01b03161415610a1c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161097e565b336001600160a01b0382161480610a385750610a388133610797565b610aaa5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161097e565b610ab48383611e60565b505050565b6006546001600160a01b03163314610ae35760405162461bcd60e51b815260040161097e906131c2565b600854601354610af490839061326c565b1115610b385760405162461bcd60e51b81526020600482015260136024820152724558434545445f5445414d5f5245534552564560681b604482015260640161097e565b600b5481610b4560155490565b610b4f919061326c565b1115610b6d5760405162461bcd60e51b815260040161097e906131f7565b60005b81811015610ab45760138054906000610b8883613335565b9190505550610b9b601580546001019055565b610bd2838383818110610bb057610bb06133a6565b9050602002016020810190610bc59190612ce1565b601554611ece565b611ece565b80610bdc81613335565b915050610b70565b6000610bef60155490565b905090565b6006546001600160a01b03163314610c1e5760405162461bcd60e51b815260040161097e906131c2565b600b55565b610c2d3382611ee8565b610c495760405162461bcd60e51b815260040161097e9061321b565b610ab4838383611fdf565b6006546001600160a01b03163314610c7e5760405162461bcd60e51b815260040161097e906131c2565b600a55565b6006546001600160a01b03163314610cad5760405162461bcd60e51b815260040161097e906131c2565b600855565b6006546001600160a01b03163314610cdc5760405162461bcd60e51b815260040161097e906131c2565b47610d1273c640e8b617f71e32f4c664ea30921dabf78701446103e8610d038460dc613298565b610d0d9190613284565b61217f565b610d3873e72441a43ed985a9e3d43c11a7fce93dd282ff036103e8610d038460aa613298565b610d5e73683e1164cf26875710737c77fbbe9af8abccd0ad6103e8610d038460a5613298565b610d8473b53b491e917eefe9c4d713870b9a08d6306702456103e8610d03846096613298565b610daa7311111f01570eeaa3e5a2fd51f4a2f127661b98346103e8610d03846050613298565b610dd073e9d0bd5520af8c9ad20e12801315117de99581496103e8610d03846032613298565b610df6739178bcf3a4c25b9a321edfe7360fa587f7bd10fd6103e8610d03846032613298565b610e1c7315a294789f34f91b03ec8a005fd27b13005f302e6103e8610d03846032613298565b610e4273ed9c842645d9a2bb66d4eac778577680713844476103e8610d03846019613298565b610e6873c0f030eac8b588817f8da16b9a2cdccc6451b25c6103e8610d0384600a613298565b610e8e733329904219af8da1b86576c64b68ebe59d28c0376103e8610d0384600a613298565b610eb473506046f99a9932540fa5938fa4ae3a6ff20e1f656103e8610d0384600a613298565b610ed273f0d78074a1ed1c4caece0cecfe81dc9010a77fb94761217f565b50565b610ab4838383604051806020016040528060008152506116f8565b6006546001600160a01b03163314610f1a5760405162461bcd60e51b815260040161097e906131c2565b6014805461ff001981166101009182900460ff1615909102179055565b6006546001600160a01b03163314610f615760405162461bcd60e51b815260040161097e906131c2565b610ab460078383612b9f565b6000818152600260205260408120546001600160a01b0316806108715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161097e565b60006001600160a01b03821661104f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161097e565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146110955760405162461bcd60e51b815260040161097e906131c2565b61109f6000612298565b565b6006546001600160a01b031633146110cb5760405162461bcd60e51b815260040161097e906131c2565b600c55565b606060018054610886906132fa565b6006546001600160a01b031633146111095760405162461bcd60e51b815260040161097e906131c2565b6014805462ff0000198116620100009182900460ff1615909102179055565b60145462010000900460ff166111505760405162461bcd60e51b815260040161097e9061319d565b600a5481601254611161919061326c565b111561119f5760405162461bcd60e51b815260206004820152600d60248201526c4558434545445f5055424c494360981b604482015260640161097e565b600b54816111ac60155490565b6111b6919061326c565b11156111d45760405162461bcd60e51b815260040161097e906131f7565b600d548111156112185760405162461bcd60e51b815260206004820152600f60248201526e115610d1515117d4115497d3525395608a1b604482015260640161097e565b3481600c546112279190613298565b11156112685760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b604482015260640161097e565b60005b818110156112b5576012805490600061128383613335565b9190505550611296601580546001019055565b6112a333610bcd60155490565b806112ad81613335565b91505061126b565b5050565b60145460ff166112db5760405162461bcd60e51b815260040161097e9061319d565b61130a836040518060400160405280600c81526020016b545950452d5052495641544560a01b815250836122ea565b61134f5760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b604482015260640161097e565b600a5482601254611360919061326c565b111561139e5760405162461bcd60e51b815260206004820152600d60248201526c4558434545445f5055424c494360981b604482015260640161097e565b600b54826113ab60155490565b6113b5919061326c565b11156113d35760405162461bcd60e51b815260040161097e906131f7565b336000908152600f602052604090205481906113f090849061326c565b11156114325760405162461bcd60e51b8152602060048201526011602482015270115610d1515117d4115497d5d053131155607a1b604482015260640161097e565b3482600c546114419190613298565b11156114825760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b604482015260640161097e565b60005b828110156114ef576012805490600061149d83613335565b9091555050336000908152600f602052604081208054916114bd83613335565b91905055506114d0601580546001019055565b6114dd33610bcd60155490565b806114e781613335565b915050611485565b50505050565b6112b53383836123b2565b601454610100900460ff166115275760405162461bcd60e51b815260040161097e9061319d565b6115538360405180604001604052806009815260200168545950452d4652454560b81b815250836122ea565b6115985760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b604482015260640161097e565b600954826011546115a9919061326c565b11156115f75760405162461bcd60e51b815260206004820152601960248201527f4558434545445f465245455f434c41494d5f5245534552564500000000000000604482015260640161097e565b600b548261160460155490565b61160e919061326c565b111561162c5760405162461bcd60e51b815260040161097e906131f7565b336000908152600e6020526040902054819061164990849061326c565b111561168b5760405162461bcd60e51b8152602060048201526011602482015270115610d1515117d4115497d5d053131155607a1b604482015260640161097e565b60005b828110156114ef57601180549060006116a683613335565b9091555050336000908152600e602052604081208054916116c683613335565b91905055506116d9601580546001019055565b6116e633610bcd60155490565b806116f081613335565b91505061168e565b6117023383611ee8565b61171e5760405162461bcd60e51b815260040161097e9061321b565b6114ef84848484612481565b6000818152600260205260409020546060906001600160a01b03166117915760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00604482015260640161097e565b600761179c836124b4565b6040516020016117ad929190613054565b6040516020818303038152906040529050919050565b6006546001600160a01b031633146117ed5760405162461bcd60e51b815260040161097e906131c2565b4773c640e8b617f71e32f4c664ea30921dabf78701446108fc6103e86118148460dc613298565b61181e9190613284565b6040518115909202916000818181858888f19350505050158015611846573d6000803e3d6000fd5b5073e72441a43ed985a9e3d43c11a7fce93dd282ff036108fc6103e861186d8460aa613298565b6118779190613284565b6040518115909202916000818181858888f1935050505015801561189f573d6000803e3d6000fd5b5073683e1164cf26875710737c77fbbe9af8abccd0ad6108fc6103e86118c68460a5613298565b6118d09190613284565b6040518115909202916000818181858888f193505050501580156118f8573d6000803e3d6000fd5b5073b53b491e917eefe9c4d713870b9a08d6306702456108fc6103e861191f846096613298565b6119299190613284565b6040518115909202916000818181858888f19350505050158015611951573d6000803e3d6000fd5b507311111f01570eeaa3e5a2fd51f4a2f127661b98346108fc6103e8611978846050613298565b6119829190613284565b6040518115909202916000818181858888f193505050501580156119aa573d6000803e3d6000fd5b5073e9d0bd5520af8c9ad20e12801315117de99581496108fc6103e86119d1846032613298565b6119db9190613284565b6040518115909202916000818181858888f19350505050158015611a03573d6000803e3d6000fd5b50739178bcf3a4c25b9a321edfe7360fa587f7bd10fd6108fc6103e8611a2a846032613298565b611a349190613284565b6040518115909202916000818181858888f19350505050158015611a5c573d6000803e3d6000fd5b507315a294789f34f91b03ec8a005fd27b13005f302e6108fc6103e8611a83846032613298565b611a8d9190613284565b6040518115909202916000818181858888f19350505050158015611ab5573d6000803e3d6000fd5b5073ed9c842645d9a2bb66d4eac778577680713844476108fc6103e8611adc846019613298565b611ae69190613284565b6040518115909202916000818181858888f19350505050158015611b0e573d6000803e3d6000fd5b5073c0f030eac8b588817f8da16b9a2cdccc6451b25c6108fc6103e8611b3584600a613298565b611b3f9190613284565b6040518115909202916000818181858888f19350505050158015611b67573d6000803e3d6000fd5b50733329904219af8da1b86576c64b68ebe59d28c0376108fc6103e8611b8e84600a613298565b611b989190613284565b6040518115909202916000818181858888f19350505050158015611bc0573d6000803e3d6000fd5b5073506046f99a9932540fa5938fa4ae3a6ff20e1f656108fc6103e8611be784600a613298565b611bf19190613284565b6040518115909202916000818181858888f19350505050158015611c19573d6000803e3d6000fd5b5060405173f0d78074a1ed1c4caece0cecfe81dc9010a77fb9904780156108fc02916000818181858888f193505050501580156112b5573d6000803e3d6000fd5b6006546001600160a01b03163314611c845760405162461bcd60e51b815260040161097e906131c2565b6014805460ff19811660ff90911615179055565b6006546001600160a01b03163314611cc25760405162461bcd60e51b815260040161097e906131c2565b6001600160a01b038116611d275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097e565b610ed281612298565b6006546001600160a01b03163314611d5a5760405162461bcd60e51b815260040161097e906131c2565b60085481601354611d6b919061326c565b1115611daf5760405162461bcd60e51b81526020600482015260136024820152724558434545445f5445414d5f5245534552564560681b604482015260640161097e565b600b5481611dbc60155490565b611dc6919061326c565b1115611de45760405162461bcd60e51b815260040161097e906131f7565b60005b818110156112b55760138054906000611dff83613335565b9190505550611e12601580546001019055565b611e1f33610bcd60155490565b80611e2981613335565b915050611de7565b6006546001600160a01b03163314611e5b5760405162461bcd60e51b815260040161097e906131c2565b600955565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e9582610f6d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6112b58282604051806020016040528060008152506125b2565b6000818152600260205260408120546001600160a01b0316611f615760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161097e565b6000611f6c83610f6d565b9050806001600160a01b0316846001600160a01b03161480611fa75750836001600160a01b0316611f9c84610909565b6001600160a01b0316145b80611fd757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ff282610f6d565b6001600160a01b03161461205a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161097e565b6001600160a01b0382166120bc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161097e565b6120c7600082611e60565b6001600160a01b03831660009081526003602052604081208054600192906120f09084906132b7565b90915550506001600160a01b038216600090815260036020526040812080546001929061211e90849061326c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b804710156121cf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161097e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461221c576040519150601f19603f3d011682016040523d82523d6000602084013e612221565b606091505b5050905080610ab45760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161097e565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080336040518060400160405280600f81526020016e385349414e5f4d5f50524553414c4560881b815250858560405160200161232b9493929190612ffe565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f198184030181529190528051602090910120905061239881866125e5565b6010546001600160a01b0391821691161495945050505050565b816001600160a01b0316836001600160a01b031614156124145760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161097e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61248c848484611fdf565b61249884848484612609565b6114ef5760405162461bcd60e51b815260040161097e9061314b565b6060816124d85750506040805180820190915260018152600360fc1b602082015290565b8160005b811561250257806124ec81613335565b91506124fb9050600a83613284565b91506124dc565b60008167ffffffffffffffff81111561251d5761251d6133bc565b6040519080825280601f01601f191660200182016040528015612547576020820181803683370190505b5090505b8415611fd75761255c6001836132b7565b9150612569600a86613350565b61257490603061326c565b60f81b818381518110612589576125896133a6565b60200101906001600160f81b031916908160001a9053506125ab600a86613284565b945061254b565b6125bc8383612716565b6125c96000848484612609565b610ab45760405162461bcd60e51b815260040161097e9061314b565b60008060006125f48585612858565b91509150612601816128c8565b509392505050565b60006001600160a01b0384163b1561270b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061264d9033908990889088906004016130fb565b602060405180830381600087803b15801561266757600080fd5b505af1925050508015612697575060408051601f3d908101601f1916820190925261269491810190612ed2565b60015b6126f1573d8080156126c5576040519150601f19603f3d011682016040523d82523d6000602084013e6126ca565b606091505b5080516126e95760405162461bcd60e51b815260040161097e9061314b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611fd7565b506001949350505050565b6001600160a01b03821661276c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161097e565b6000818152600260205260409020546001600160a01b0316156127d15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161097e565b6001600160a01b03821660009081526003602052604081208054600192906127fa90849061326c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008082516041141561288f5760208301516040840151606085015160001a61288387828585612a83565b945094505050506128c1565b8251604014156128b957602083015160408401516128ae868383612b70565b9350935050506128c1565b506000905060025b9250929050565b60008160048111156128dc576128dc613390565b14156128e55750565b60018160048111156128f9576128f9613390565b14156129475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161097e565b600281600481111561295b5761295b613390565b14156129a95760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161097e565b60038160048111156129bd576129bd613390565b1415612a165760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161097e565b6004816004811115612a2a57612a2a613390565b1415610ed25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161097e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612aba5750600090506003612b67565b8460ff16601b14158015612ad257508460ff16601c14155b15612ae35750600090506004612b67565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612b37573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612b6057600060019250925050612b67565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612b9187828885612a83565b935093505050935093915050565b828054612bab906132fa565b90600052602060002090601f016020900481019282612bcd5760008555612c13565b82601f10612be65782800160ff19823516178555612c13565b82800160010185558215612c13579182015b82811115612c13578235825591602001919060010190612bf8565b50612c1f929150612c23565b5090565b5b80821115612c1f5760008155600101612c24565b80356001600160a01b0381168114612c4f57600080fd5b919050565b600082601f830112612c6557600080fd5b813567ffffffffffffffff80821115612c8057612c806133bc565b604051601f8301601f19908116603f01168101908282118183101715612ca857612ca86133bc565b81604052838152866020858801011115612cc157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215612cf357600080fd5b612cfc82612c38565b9392505050565b60008060408385031215612d1657600080fd5b612d1f83612c38565b9150612d2d60208401612c38565b90509250929050565b600080600060608486031215612d4b57600080fd5b612d5484612c38565b9250612d6260208501612c38565b9150604084013590509250925092565b60008060008060808587031215612d8857600080fd5b612d9185612c38565b9350612d9f60208601612c38565b925060408501359150606085013567ffffffffffffffff811115612dc257600080fd5b612dce87828801612c54565b91505092959194509250565b60008060408385031215612ded57600080fd5b612df683612c38565b915060208301358015158114612e0b57600080fd5b809150509250929050565b60008060408385031215612e2957600080fd5b612e3283612c38565b946020939093013593505050565b60008060208385031215612e5357600080fd5b823567ffffffffffffffff80821115612e6b57600080fd5b818501915085601f830112612e7f57600080fd5b813581811115612e8e57600080fd5b8660208260051b8501011115612ea357600080fd5b60209290920196919550909350505050565b600060208284031215612ec757600080fd5b8135612cfc816133d2565b600060208284031215612ee457600080fd5b8151612cfc816133d2565b600080600060608486031215612f0457600080fd5b833567ffffffffffffffff811115612f1b57600080fd5b612f2786828701612c54565b9660208601359650604090950135949350505050565b60008060208385031215612f5057600080fd5b823567ffffffffffffffff80821115612f6857600080fd5b818501915085601f830112612f7c57600080fd5b813581811115612f8b57600080fd5b866020828501011115612ea357600080fd5b600060208284031215612faf57600080fd5b5035919050565b60008151808452612fce8160208601602086016132ce565b601f01601f19169290920160200192915050565b60008151612ff48185602086016132ce565b9290920192915050565b6bffffffffffffffffffffffff198560601b168152600084516130288160148501602089016132ce565b84519083019061303f8160148401602089016132ce565b01601481019390935250506034019392505050565b600080845481600182811c91508083168061307057607f831692505b602080841082141561309057634e487b7160e01b86526022600452602486fd5b8180156130a457600181146130b5576130e2565b60ff198616895284890196506130e2565b60008b81526020902060005b868110156130da5781548b8201529085019083016130c1565b505084890196505b5050505050506130f28185612fe2565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061312e90830184612fb6565b9695505050505050565b602081526000612cfc6020830184612fb6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600b908201526a1352539517d0d313d4d15160aa1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600a908201526908ab0868a8a88be9a82b60b31b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561327f5761327f613364565b500190565b6000826132935761329361337a565b500490565b60008160001904831182151516156132b2576132b2613364565b500290565b6000828210156132c9576132c9613364565b500390565b60005b838110156132e95781810151838201526020016132d1565b838111156114ef5750506000910152565b600181811c9082168061330e57607f821691505b6020821081141561332f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561334957613349613364565b5060010190565b60008261335f5761335f61337a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610ed257600080fdfea26469706673582212200ea2d2fe54c6a6d3142bc90152d5136da5b24037179f3c039eb70864be1b6ad764736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5a686f4b5741536268714379434c485166547336626865337552685a574b504c7776674e556d6f774a324e502f

Deployed Bytecode

0x60806040526004361061028c5760003560e01c806370a082311161015a578063a22cb465116100c1578063cd3c6c261161007a578063cd3c6c2614610752578063e5da932a14610767578063e985e9c51461077c578063f2fde38b146107c5578063f42202e8146107e5578063f8bc26c41461080557600080fd5b8063a22cb4651461069c578063adcf2611146106bc578063b6ba3fcd146106d2578063b7f751d8146106f2578063b88d4fde14610712578063c87b56dd1461073257600080fd5b806397f5ec671161011357806397f5ec671461061f5780639a2db9c4146106345780639f9eba451461064a578063a0712d6814610660578063a0cd313a14610673578063a1ee0cba1461068957600080fd5b806370a082311461057d578063715018a61461059d5780638da5cb5b146105b257806391b7f5ed146105d057806395d89b41146105f057806397283d2f1461060557600080fd5b806331440f31116101fe57806342842e0e116101b757806342842e0e146104c55780634543d1a4146104e55780634f3a6747146104fb578063506296081461051057806355f804b31461053d5780636352211e1461055d57600080fd5b806331440f311461042557806331845f7d1461043b5780633a37fa241461045b5780633ccfd60b1461047b5780633f59e84614610490578063424d995d146104af57600080fd5b806318160ddd1161025057806318160ddd146103695780631fe9eabc1461038c57806320e2ed3b146103ac57806322cb1ec8146103c257806323b872dd146103d857806328fabd7f146103f857600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b314610327578063163e1e611461034957600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102b86102b3366004612eb5565b610825565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e2610877565b6040516102c49190613138565b3480156102fb57600080fd5b5061030f61030a366004612f9d565b610909565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b50610347610342366004612e16565b6109a3565b005b34801561035557600080fd5b50610347610364366004612e40565b610ab9565b34801561037557600080fd5b5061037e610be4565b6040519081526020016102c4565b34801561039857600080fd5b506103476103a7366004612f9d565b610bf4565b3480156103b857600080fd5b5061037e60085481565b3480156103ce57600080fd5b5061037e60135481565b3480156103e457600080fd5b506103476103f3366004612d36565b610c23565b34801561040457600080fd5b5061037e610413366004612ce1565b600e6020526000908152604090205481565b34801561043157600080fd5b5061037e60125481565b34801561044757600080fd5b50610347610456366004612f9d565b610c54565b34801561046757600080fd5b50610347610476366004612f9d565b610c83565b34801561048757600080fd5b50610347610cb2565b34801561049c57600080fd5b506014546102b890610100900460ff1681565b3480156104bb57600080fd5b5061037e600c5481565b3480156104d157600080fd5b506103476104e0366004612d36565b610ed5565b3480156104f157600080fd5b5061037e600b5481565b34801561050757600080fd5b50610347610ef0565b34801561051c57600080fd5b5061037e61052b366004612ce1565b600f6020526000908152604090205481565b34801561054957600080fd5b50610347610558366004612f3d565b610f37565b34801561056957600080fd5b5061030f610578366004612f9d565b610f6d565b34801561058957600080fd5b5061037e610598366004612ce1565b610fe4565b3480156105a957600080fd5b5061034761106b565b3480156105be57600080fd5b506006546001600160a01b031661030f565b3480156105dc57600080fd5b506103476105eb366004612f9d565b6110a1565b3480156105fc57600080fd5b506102e26110d0565b34801561061157600080fd5b506014546102b89060ff1681565b34801561062b57600080fd5b506103476110df565b34801561064057600080fd5b5061037e600a5481565b34801561065657600080fd5b5061037e600d5481565b61034761066e366004612f9d565b611128565b34801561067f57600080fd5b5061037e60115481565b610347610697366004612eef565b6112b9565b3480156106a857600080fd5b506103476106b7366004612dda565b6114f5565b3480156106c857600080fd5b5061037e60095481565b3480156106de57600080fd5b506103476106ed366004612eef565b611500565b3480156106fe57600080fd5b506014546102b89062010000900460ff1681565b34801561071e57600080fd5b5061034761072d366004612d72565b6116f8565b34801561073e57600080fd5b506102e261074d366004612f9d565b61172a565b34801561075e57600080fd5b506103476117c3565b34801561077357600080fd5b50610347611c5a565b34801561078857600080fd5b506102b8610797366004612d03565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107d157600080fd5b506103476107e0366004612ce1565b611c98565b3480156107f157600080fd5b50610347610800366004612f9d565b611d30565b34801561081157600080fd5b50610347610820366004612f9d565b611e31565b60006001600160e01b031982166380ac58cd60e01b148061085657506001600160e01b03198216635b5e139f60e01b145b8061087157506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610886906132fa565b80601f01602080910402602001604051908101604052809291908181526020018280546108b2906132fa565b80156108ff5780601f106108d4576101008083540402835291602001916108ff565b820191906000526020600020905b8154815290600101906020018083116108e257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109875760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109ae82610f6d565b9050806001600160a01b0316836001600160a01b03161415610a1c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161097e565b336001600160a01b0382161480610a385750610a388133610797565b610aaa5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161097e565b610ab48383611e60565b505050565b6006546001600160a01b03163314610ae35760405162461bcd60e51b815260040161097e906131c2565b600854601354610af490839061326c565b1115610b385760405162461bcd60e51b81526020600482015260136024820152724558434545445f5445414d5f5245534552564560681b604482015260640161097e565b600b5481610b4560155490565b610b4f919061326c565b1115610b6d5760405162461bcd60e51b815260040161097e906131f7565b60005b81811015610ab45760138054906000610b8883613335565b9190505550610b9b601580546001019055565b610bd2838383818110610bb057610bb06133a6565b9050602002016020810190610bc59190612ce1565b601554611ece565b611ece565b80610bdc81613335565b915050610b70565b6000610bef60155490565b905090565b6006546001600160a01b03163314610c1e5760405162461bcd60e51b815260040161097e906131c2565b600b55565b610c2d3382611ee8565b610c495760405162461bcd60e51b815260040161097e9061321b565b610ab4838383611fdf565b6006546001600160a01b03163314610c7e5760405162461bcd60e51b815260040161097e906131c2565b600a55565b6006546001600160a01b03163314610cad5760405162461bcd60e51b815260040161097e906131c2565b600855565b6006546001600160a01b03163314610cdc5760405162461bcd60e51b815260040161097e906131c2565b47610d1273c640e8b617f71e32f4c664ea30921dabf78701446103e8610d038460dc613298565b610d0d9190613284565b61217f565b610d3873e72441a43ed985a9e3d43c11a7fce93dd282ff036103e8610d038460aa613298565b610d5e73683e1164cf26875710737c77fbbe9af8abccd0ad6103e8610d038460a5613298565b610d8473b53b491e917eefe9c4d713870b9a08d6306702456103e8610d03846096613298565b610daa7311111f01570eeaa3e5a2fd51f4a2f127661b98346103e8610d03846050613298565b610dd073e9d0bd5520af8c9ad20e12801315117de99581496103e8610d03846032613298565b610df6739178bcf3a4c25b9a321edfe7360fa587f7bd10fd6103e8610d03846032613298565b610e1c7315a294789f34f91b03ec8a005fd27b13005f302e6103e8610d03846032613298565b610e4273ed9c842645d9a2bb66d4eac778577680713844476103e8610d03846019613298565b610e6873c0f030eac8b588817f8da16b9a2cdccc6451b25c6103e8610d0384600a613298565b610e8e733329904219af8da1b86576c64b68ebe59d28c0376103e8610d0384600a613298565b610eb473506046f99a9932540fa5938fa4ae3a6ff20e1f656103e8610d0384600a613298565b610ed273f0d78074a1ed1c4caece0cecfe81dc9010a77fb94761217f565b50565b610ab4838383604051806020016040528060008152506116f8565b6006546001600160a01b03163314610f1a5760405162461bcd60e51b815260040161097e906131c2565b6014805461ff001981166101009182900460ff1615909102179055565b6006546001600160a01b03163314610f615760405162461bcd60e51b815260040161097e906131c2565b610ab460078383612b9f565b6000818152600260205260408120546001600160a01b0316806108715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161097e565b60006001600160a01b03821661104f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161097e565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146110955760405162461bcd60e51b815260040161097e906131c2565b61109f6000612298565b565b6006546001600160a01b031633146110cb5760405162461bcd60e51b815260040161097e906131c2565b600c55565b606060018054610886906132fa565b6006546001600160a01b031633146111095760405162461bcd60e51b815260040161097e906131c2565b6014805462ff0000198116620100009182900460ff1615909102179055565b60145462010000900460ff166111505760405162461bcd60e51b815260040161097e9061319d565b600a5481601254611161919061326c565b111561119f5760405162461bcd60e51b815260206004820152600d60248201526c4558434545445f5055424c494360981b604482015260640161097e565b600b54816111ac60155490565b6111b6919061326c565b11156111d45760405162461bcd60e51b815260040161097e906131f7565b600d548111156112185760405162461bcd60e51b815260206004820152600f60248201526e115610d1515117d4115497d3525395608a1b604482015260640161097e565b3481600c546112279190613298565b11156112685760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b604482015260640161097e565b60005b818110156112b5576012805490600061128383613335565b9190505550611296601580546001019055565b6112a333610bcd60155490565b806112ad81613335565b91505061126b565b5050565b60145460ff166112db5760405162461bcd60e51b815260040161097e9061319d565b61130a836040518060400160405280600c81526020016b545950452d5052495641544560a01b815250836122ea565b61134f5760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b604482015260640161097e565b600a5482601254611360919061326c565b111561139e5760405162461bcd60e51b815260206004820152600d60248201526c4558434545445f5055424c494360981b604482015260640161097e565b600b54826113ab60155490565b6113b5919061326c565b11156113d35760405162461bcd60e51b815260040161097e906131f7565b336000908152600f602052604090205481906113f090849061326c565b11156114325760405162461bcd60e51b8152602060048201526011602482015270115610d1515117d4115497d5d053131155607a1b604482015260640161097e565b3482600c546114419190613298565b11156114825760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b604482015260640161097e565b60005b828110156114ef576012805490600061149d83613335565b9091555050336000908152600f602052604081208054916114bd83613335565b91905055506114d0601580546001019055565b6114dd33610bcd60155490565b806114e781613335565b915050611485565b50505050565b6112b53383836123b2565b601454610100900460ff166115275760405162461bcd60e51b815260040161097e9061319d565b6115538360405180604001604052806009815260200168545950452d4652454560b81b815250836122ea565b6115985760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b604482015260640161097e565b600954826011546115a9919061326c565b11156115f75760405162461bcd60e51b815260206004820152601960248201527f4558434545445f465245455f434c41494d5f5245534552564500000000000000604482015260640161097e565b600b548261160460155490565b61160e919061326c565b111561162c5760405162461bcd60e51b815260040161097e906131f7565b336000908152600e6020526040902054819061164990849061326c565b111561168b5760405162461bcd60e51b8152602060048201526011602482015270115610d1515117d4115497d5d053131155607a1b604482015260640161097e565b60005b828110156114ef57601180549060006116a683613335565b9091555050336000908152600e602052604081208054916116c683613335565b91905055506116d9601580546001019055565b6116e633610bcd60155490565b806116f081613335565b91505061168e565b6117023383611ee8565b61171e5760405162461bcd60e51b815260040161097e9061321b565b6114ef84848484612481565b6000818152600260205260409020546060906001600160a01b03166117915760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00604482015260640161097e565b600761179c836124b4565b6040516020016117ad929190613054565b6040516020818303038152906040529050919050565b6006546001600160a01b031633146117ed5760405162461bcd60e51b815260040161097e906131c2565b4773c640e8b617f71e32f4c664ea30921dabf78701446108fc6103e86118148460dc613298565b61181e9190613284565b6040518115909202916000818181858888f19350505050158015611846573d6000803e3d6000fd5b5073e72441a43ed985a9e3d43c11a7fce93dd282ff036108fc6103e861186d8460aa613298565b6118779190613284565b6040518115909202916000818181858888f1935050505015801561189f573d6000803e3d6000fd5b5073683e1164cf26875710737c77fbbe9af8abccd0ad6108fc6103e86118c68460a5613298565b6118d09190613284565b6040518115909202916000818181858888f193505050501580156118f8573d6000803e3d6000fd5b5073b53b491e917eefe9c4d713870b9a08d6306702456108fc6103e861191f846096613298565b6119299190613284565b6040518115909202916000818181858888f19350505050158015611951573d6000803e3d6000fd5b507311111f01570eeaa3e5a2fd51f4a2f127661b98346108fc6103e8611978846050613298565b6119829190613284565b6040518115909202916000818181858888f193505050501580156119aa573d6000803e3d6000fd5b5073e9d0bd5520af8c9ad20e12801315117de99581496108fc6103e86119d1846032613298565b6119db9190613284565b6040518115909202916000818181858888f19350505050158015611a03573d6000803e3d6000fd5b50739178bcf3a4c25b9a321edfe7360fa587f7bd10fd6108fc6103e8611a2a846032613298565b611a349190613284565b6040518115909202916000818181858888f19350505050158015611a5c573d6000803e3d6000fd5b507315a294789f34f91b03ec8a005fd27b13005f302e6108fc6103e8611a83846032613298565b611a8d9190613284565b6040518115909202916000818181858888f19350505050158015611ab5573d6000803e3d6000fd5b5073ed9c842645d9a2bb66d4eac778577680713844476108fc6103e8611adc846019613298565b611ae69190613284565b6040518115909202916000818181858888f19350505050158015611b0e573d6000803e3d6000fd5b5073c0f030eac8b588817f8da16b9a2cdccc6451b25c6108fc6103e8611b3584600a613298565b611b3f9190613284565b6040518115909202916000818181858888f19350505050158015611b67573d6000803e3d6000fd5b50733329904219af8da1b86576c64b68ebe59d28c0376108fc6103e8611b8e84600a613298565b611b989190613284565b6040518115909202916000818181858888f19350505050158015611bc0573d6000803e3d6000fd5b5073506046f99a9932540fa5938fa4ae3a6ff20e1f656108fc6103e8611be784600a613298565b611bf19190613284565b6040518115909202916000818181858888f19350505050158015611c19573d6000803e3d6000fd5b5060405173f0d78074a1ed1c4caece0cecfe81dc9010a77fb9904780156108fc02916000818181858888f193505050501580156112b5573d6000803e3d6000fd5b6006546001600160a01b03163314611c845760405162461bcd60e51b815260040161097e906131c2565b6014805460ff19811660ff90911615179055565b6006546001600160a01b03163314611cc25760405162461bcd60e51b815260040161097e906131c2565b6001600160a01b038116611d275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097e565b610ed281612298565b6006546001600160a01b03163314611d5a5760405162461bcd60e51b815260040161097e906131c2565b60085481601354611d6b919061326c565b1115611daf5760405162461bcd60e51b81526020600482015260136024820152724558434545445f5445414d5f5245534552564560681b604482015260640161097e565b600b5481611dbc60155490565b611dc6919061326c565b1115611de45760405162461bcd60e51b815260040161097e906131f7565b60005b818110156112b55760138054906000611dff83613335565b9190505550611e12601580546001019055565b611e1f33610bcd60155490565b80611e2981613335565b915050611de7565b6006546001600160a01b03163314611e5b5760405162461bcd60e51b815260040161097e906131c2565b600955565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e9582610f6d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6112b58282604051806020016040528060008152506125b2565b6000818152600260205260408120546001600160a01b0316611f615760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161097e565b6000611f6c83610f6d565b9050806001600160a01b0316846001600160a01b03161480611fa75750836001600160a01b0316611f9c84610909565b6001600160a01b0316145b80611fd757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ff282610f6d565b6001600160a01b03161461205a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161097e565b6001600160a01b0382166120bc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161097e565b6120c7600082611e60565b6001600160a01b03831660009081526003602052604081208054600192906120f09084906132b7565b90915550506001600160a01b038216600090815260036020526040812080546001929061211e90849061326c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b804710156121cf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161097e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461221c576040519150601f19603f3d011682016040523d82523d6000602084013e612221565b606091505b5050905080610ab45760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161097e565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080336040518060400160405280600f81526020016e385349414e5f4d5f50524553414c4560881b815250858560405160200161232b9493929190612ffe565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f198184030181529190528051602090910120905061239881866125e5565b6010546001600160a01b0391821691161495945050505050565b816001600160a01b0316836001600160a01b031614156124145760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161097e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61248c848484611fdf565b61249884848484612609565b6114ef5760405162461bcd60e51b815260040161097e9061314b565b6060816124d85750506040805180820190915260018152600360fc1b602082015290565b8160005b811561250257806124ec81613335565b91506124fb9050600a83613284565b91506124dc565b60008167ffffffffffffffff81111561251d5761251d6133bc565b6040519080825280601f01601f191660200182016040528015612547576020820181803683370190505b5090505b8415611fd75761255c6001836132b7565b9150612569600a86613350565b61257490603061326c565b60f81b818381518110612589576125896133a6565b60200101906001600160f81b031916908160001a9053506125ab600a86613284565b945061254b565b6125bc8383612716565b6125c96000848484612609565b610ab45760405162461bcd60e51b815260040161097e9061314b565b60008060006125f48585612858565b91509150612601816128c8565b509392505050565b60006001600160a01b0384163b1561270b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061264d9033908990889088906004016130fb565b602060405180830381600087803b15801561266757600080fd5b505af1925050508015612697575060408051601f3d908101601f1916820190925261269491810190612ed2565b60015b6126f1573d8080156126c5576040519150601f19603f3d011682016040523d82523d6000602084013e6126ca565b606091505b5080516126e95760405162461bcd60e51b815260040161097e9061314b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611fd7565b506001949350505050565b6001600160a01b03821661276c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161097e565b6000818152600260205260409020546001600160a01b0316156127d15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161097e565b6001600160a01b03821660009081526003602052604081208054600192906127fa90849061326c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008082516041141561288f5760208301516040840151606085015160001a61288387828585612a83565b945094505050506128c1565b8251604014156128b957602083015160408401516128ae868383612b70565b9350935050506128c1565b506000905060025b9250929050565b60008160048111156128dc576128dc613390565b14156128e55750565b60018160048111156128f9576128f9613390565b14156129475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161097e565b600281600481111561295b5761295b613390565b14156129a95760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161097e565b60038160048111156129bd576129bd613390565b1415612a165760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161097e565b6004816004811115612a2a57612a2a613390565b1415610ed25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161097e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612aba5750600090506003612b67565b8460ff16601b14158015612ad257508460ff16601c14155b15612ae35750600090506004612b67565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612b37573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612b6057600060019250925050612b67565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612b9187828885612a83565b935093505050935093915050565b828054612bab906132fa565b90600052602060002090601f016020900481019282612bcd5760008555612c13565b82601f10612be65782800160ff19823516178555612c13565b82800160010185558215612c13579182015b82811115612c13578235825591602001919060010190612bf8565b50612c1f929150612c23565b5090565b5b80821115612c1f5760008155600101612c24565b80356001600160a01b0381168114612c4f57600080fd5b919050565b600082601f830112612c6557600080fd5b813567ffffffffffffffff80821115612c8057612c806133bc565b604051601f8301601f19908116603f01168101908282118183101715612ca857612ca86133bc565b81604052838152866020858801011115612cc157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215612cf357600080fd5b612cfc82612c38565b9392505050565b60008060408385031215612d1657600080fd5b612d1f83612c38565b9150612d2d60208401612c38565b90509250929050565b600080600060608486031215612d4b57600080fd5b612d5484612c38565b9250612d6260208501612c38565b9150604084013590509250925092565b60008060008060808587031215612d8857600080fd5b612d9185612c38565b9350612d9f60208601612c38565b925060408501359150606085013567ffffffffffffffff811115612dc257600080fd5b612dce87828801612c54565b91505092959194509250565b60008060408385031215612ded57600080fd5b612df683612c38565b915060208301358015158114612e0b57600080fd5b809150509250929050565b60008060408385031215612e2957600080fd5b612e3283612c38565b946020939093013593505050565b60008060208385031215612e5357600080fd5b823567ffffffffffffffff80821115612e6b57600080fd5b818501915085601f830112612e7f57600080fd5b813581811115612e8e57600080fd5b8660208260051b8501011115612ea357600080fd5b60209290920196919550909350505050565b600060208284031215612ec757600080fd5b8135612cfc816133d2565b600060208284031215612ee457600080fd5b8151612cfc816133d2565b600080600060608486031215612f0457600080fd5b833567ffffffffffffffff811115612f1b57600080fd5b612f2786828701612c54565b9660208601359650604090950135949350505050565b60008060208385031215612f5057600080fd5b823567ffffffffffffffff80821115612f6857600080fd5b818501915085601f830112612f7c57600080fd5b813581811115612f8b57600080fd5b866020828501011115612ea357600080fd5b600060208284031215612faf57600080fd5b5035919050565b60008151808452612fce8160208601602086016132ce565b601f01601f19169290920160200192915050565b60008151612ff48185602086016132ce565b9290920192915050565b6bffffffffffffffffffffffff198560601b168152600084516130288160148501602089016132ce565b84519083019061303f8160148401602089016132ce565b01601481019390935250506034019392505050565b600080845481600182811c91508083168061307057607f831692505b602080841082141561309057634e487b7160e01b86526022600452602486fd5b8180156130a457600181146130b5576130e2565b60ff198616895284890196506130e2565b60008b81526020902060005b868110156130da5781548b8201529085019083016130c1565b505084890196505b5050505050506130f28185612fe2565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061312e90830184612fb6565b9695505050505050565b602081526000612cfc6020830184612fb6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600b908201526a1352539517d0d313d4d15160aa1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600a908201526908ab0868a8a88be9a82b60b31b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561327f5761327f613364565b500190565b6000826132935761329361337a565b500490565b60008160001904831182151516156132b2576132b2613364565b500290565b6000828210156132c9576132c9613364565b500390565b60005b838110156132e95781810151838201526020016132d1565b838111156114ef5750506000910152565b600181811c9082168061330e57607f821691505b6020821081141561332f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561334957613349613364565b5060010190565b60008261335f5761335f61337a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610ed257600080fdfea26469706673582212200ea2d2fe54c6a6d3142bc90152d5136da5b24037179f3c039eb70864be1b6ad764736f6c63430008070033

Deployed Bytecode Sourcemap

47639:9253:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35172:305;;;;;;;;;;-1:-1:-1;35172:305:0;;;;;:::i;:::-;;:::i;:::-;;;8997:14:1;;8990:22;8972:41;;8960:2;8945:18;35172:305:0;;;;;;;;36117:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37676:221::-;;;;;;;;;;-1:-1:-1;37676:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8295:32:1;;;8277:51;;8265:2;8250:18;37676:221:0;8131:203:1;37199:411:0;;;;;;;;;;-1:-1:-1;37199:411:0;;;;;:::i;:::-;;:::i;:::-;;49250:469;;;;;;;;;;-1:-1:-1;49250:469:0;;;;;:::i;:::-;;:::i;56750:102::-;;;;;;;;;;;;;:::i;:::-;;;21536:25:1;;;21524:2;21509:18;56750:102:0;21390:177:1;56282:94:0;;;;;;;;;;-1:-1:-1;56282:94:0;;;;;:::i;:::-;;:::i;47911:41::-;;;;;;;;;;;;;;;;48595:31;;;;;;;;;;;;;;;;38426:339;;;;;;;;;;-1:-1:-1;38426:339:0;;;;;:::i;:::-;;:::i;48249:48::-;;;;;;;;;;-1:-1:-1;48249:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;48555:33;;;;;;;;;;;;;;;;56170:100;;;;;;;;;;-1:-1:-1;56170:100:0;;;;;:::i;:::-;;:::i;55921:111::-;;;;;;;;;;-1:-1:-1;55921:111:0;;;;;:::i;:::-;;:::i;52546:1527::-;;;;;;;;;;;;;:::i;48665:25::-;;;;;;;;;;-1:-1:-1;48665:25:0;;;;;;;;;;;48158:42;;;;;;;;;;;;;;;;38836:185;;;;;;;;;;-1:-1:-1;38836:185:0;;;;;:::i;:::-;;:::i;48056:95::-;;;;;;;;;;;;;;;;55702:105;;;;;;;;;;;;;:::i;48304:52::-;;;;;;;;;;-1:-1:-1;48304:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;56388:98;;;;;;;;;;-1:-1:-1;56388:98:0;;;;;:::i;:::-;;:::i;35811:239::-;;;;;;;;;;-1:-1:-1;35811:239:0;;;;;:::i;:::-;;:::i;35541:208::-;;;;;;;;;;-1:-1:-1;35541:208:0;;;;;:::i;:::-;;:::i;17126:103::-;;;;;;;;;;;;;:::i;16475:87::-;;;;;;;;;;-1:-1:-1;16548:6:0;;-1:-1:-1;;;;;16548:6:0;16475:87;;55815:98;;;;;;;;;;-1:-1:-1;55815:98:0;;;;;:::i;:::-;;:::i;36286:104::-;;;;;;;;;;;;;:::i;48635:23::-;;;;;;;;;;-1:-1:-1;48635:23:0;;;;;;;;55598:96;;;;;;;;;;;;;:::i;48013:36::-;;;;;;;;;;;;;;;;48207:35;;;;;;;;;;;;;;;;51895:642;;;;;;:::i;:::-;;:::i;48516:32::-;;;;;;;;;;;;;;;;50192:885;;;;;;:::i;:::-;;:::i;37969:155::-;;;;;;;;;;-1:-1:-1;37969:155:0;;;;;:::i;:::-;;:::i;47959:47::-;;;;;;;;;;;;;;;;51085:802;;;;;;;;;;-1:-1:-1;51085:802:0;;;;;:::i;:::-;;:::i;48697:22::-;;;;;;;;;;-1:-1:-1;48697:22:0;;;;;;;;;;;39092:328;;;;;;;;;;-1:-1:-1;39092:328:0;;;;;:::i;:::-;;:::i;56498:244::-;;;;;;;;;;-1:-1:-1;56498:244:0;;;;;:::i;:::-;;:::i;54081:1398::-;;;;;;;;;;;;;:::i;55491:99::-;;;;;;;;;;;;;:::i;38195:164::-;;;;;;;;;;-1:-1:-1;38195:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;38316:25:0;;;38292:4;38316:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;38195:164;17384:201;;;;;;;;;;-1:-1:-1;17384:201:0;;;;;:::i;:::-;;:::i;49727:457::-;;;;;;;;;;-1:-1:-1;49727:457:0;;;;;:::i;:::-;;:::i;56040:122::-;;;;;;;;;;-1:-1:-1;56040:122:0;;;;;:::i;:::-;;:::i;35172:305::-;35274:4;-1:-1:-1;;;;;;35311:40:0;;-1:-1:-1;;;35311:40:0;;:105;;-1:-1:-1;;;;;;;35368:48:0;;-1:-1:-1;;;35368:48:0;35311:105;:158;;;-1:-1:-1;;;;;;;;;;28482:40:0;;;35433:36;35291:178;35172:305;-1:-1:-1;;35172:305:0:o;36117:100::-;36171:13;36204:5;36197:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36117:100;:::o;37676:221::-;37752:7;41019:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41019:16:0;37772:73;;;;-1:-1:-1;;;37772:73:0;;17154:2:1;37772:73:0;;;17136:21:1;17193:2;17173:18;;;17166:30;17232:34;17212:18;;;17205:62;-1:-1:-1;;;17283:18:1;;;17276:42;17335:19;;37772:73:0;;;;;;;;;-1:-1:-1;37865:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37865:24:0;;37676:221::o;37199:411::-;37280:13;37296:23;37311:7;37296:14;:23::i;:::-;37280:39;;37344:5;-1:-1:-1;;;;;37338:11:0;:2;-1:-1:-1;;;;;37338:11:0;;;37330:57;;;;-1:-1:-1;;;37330:57:0;;19044:2:1;37330:57:0;;;19026:21:1;19083:2;19063:18;;;19056:30;19122:34;19102:18;;;19095:62;-1:-1:-1;;;19173:18:1;;;19166:31;19214:19;;37330:57:0;18842:397:1;37330:57:0;15395:10;-1:-1:-1;;;;;37422:21:0;;;;:62;;-1:-1:-1;37447:37:0;37464:5;15395:10;38195:164;:::i;37447:37::-;37400:168;;;;-1:-1:-1;;;37400:168:0;;14800:2:1;37400:168:0;;;14782:21:1;14839:2;14819:18;;;14812:30;14878:34;14858:18;;;14851:62;14949:26;14929:18;;;14922:54;14993:19;;37400:168:0;14598:420:1;37400:168:0;37581:21;37590:2;37594:7;37581:8;:21::i;:::-;37269:341;37199:411;;:::o;49250:469::-;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;49371:20:::1;::::0;49332:16:::1;::::0;:35:::1;::::0;49351:9;;49332:35:::1;:::i;:::-;:59;;49324:91;;;::::0;-1:-1:-1;;;49324:91:0;;20545:2:1;49324:91:0::1;::::0;::::1;20527:21:1::0;20584:2;20564:18;;;20557:30;-1:-1:-1;;;20603:18:1;;;20596:49;20662:18;;49324:91:0::1;20343:343:1::0;49324:91:0::1;49480:11;::::0;49460:9;49434:23:::1;:13;2803:14:::0;;2711:114;49434:23:::1;:42;;;;:::i;:::-;:57;;49426:80;;;;-1:-1:-1::0;;;49426:80:0::1;;;;;;;:::i;:::-;49522:9;49517:195;49537:20:::0;;::::1;49517:195;;;49579:16;:18:::0;;;:16:::1;:18;::::0;::::1;:::i;:::-;;;;;;49612:25;:13;2922:19:::0;;2940:1;2922:19;;;2833:127;49612:25:::1;49652:48;49662:9;;49672:1;49662:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;49676:13;2803:14:::0;49652:9:::1;:48::i;49676:23::-;49652:9;:48::i;:::-;49559:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49517:195;;56750:102:::0;56794:7;56821:23;:13;2803:14;;2711:114;56821:23;56814:30;;56750:102;:::o;56282:94::-;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;56346:11:::1;:22:::0;56282:94::o;38426:339::-;38621:41;15395:10;38654:7;38621:18;:41::i;:::-;38613:103;;;;-1:-1:-1;;;38613:103:0;;;;;;;:::i;:::-;38729:28;38739:4;38745:2;38749:7;38729:9;:28::i;56170:100::-;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;56237:14:::1;:25:::0;56170:100::o;55921:111::-;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;55993:20:::1;:31:::0;55921:111::o;52546:1527::-;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;52621:21:::1;52653:98;52679:42;52746:4;52724:20;52621:21:::0;52741:3:::1;52724:20;:::i;:::-;:26;;;;:::i;:::-;52653:17;:98::i;:::-;52762;52788:42;52855:4;52833:20;:14:::0;52850:3:::1;52833:20;:::i;52762:98::-;52871;52897:42;52964:4;52942:20;:14:::0;52959:3:::1;52942:20;:::i;52871:98::-;52980;53006:42;53073:4;53051:20;:14:::0;53068:3:::1;53051:20;:::i;52980:98::-;53100;53126:42;53193:4;53171:19;:14:::0;53188:2:::1;53171:19;:::i;53100:98::-;53209;53235:42;53302:4;53280:19;:14:::0;53297:2:::1;53280:19;:::i;53209:98::-;53318;53344:42;53411:4;53389:19;:14:::0;53406:2:::1;53389:19;:::i;53318:98::-;53427;53453:42;53520:4;53498:19;:14:::0;53515:2:::1;53498:19;:::i;53427:98::-;53536;53562:42;53629:4;53607:19;:14:::0;53624:2:::1;53607:19;:::i;53536:98::-;53645;53671:42;53738:4;53716:19;:14:::0;53733:2:::1;53716:19;:::i;53645:98::-;53754;53780:42;53847:4;53825:19;:14:::0;53842:2:::1;53825:19;:::i;53754:98::-;53863;53889:42;53956:4;53934:19;:14:::0;53951:2:::1;53934:19;:::i;53863:98::-;53972:93;53998:42;54043:21;53972:17;:93::i;:::-;52585:1488;52546:1527::o:0;38836:185::-;38974:39;38991:4;38997:2;39001:7;38974:39;;;;;;;;;;;;:16;:39::i;55702:105::-;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;55786:13:::1;::::0;;-1:-1:-1;;55769:30:0;::::1;55786:13;::::0;;;::::1;;;55785:14;55769:30:::0;;::::1;;::::0;;55702:105::o;56388:98::-;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;56459:19:::1;:13;56475:3:::0;;56459:19:::1;:::i;35811:239::-:0;35883:7;35919:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35919:16:0;35954:19;35946:73;;;;-1:-1:-1;;;35946:73:0;;15636:2:1;35946:73:0;;;15618:21:1;15675:2;15655:18;;;15648:30;15714:34;15694:18;;;15687:62;-1:-1:-1;;;15765:18:1;;;15758:39;15814:19;;35946:73:0;15434:405:1;35541:208:0;35613:7;-1:-1:-1;;;;;35641:19:0;;35633:74;;;;-1:-1:-1;;;35633:74:0;;15225:2:1;35633:74:0;;;15207:21:1;15264:2;15244:18;;;15237:30;15303:34;15283:18;;;15276:62;-1:-1:-1;;;15354:18:1;;;15347:40;15404:19;;35633:74:0;15023:406:1;35633:74:0;-1:-1:-1;;;;;;35725:16:0;;;;;:9;:16;;;;;;;35541:208::o;17126:103::-;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;17191:30:::1;17218:1;17191:18;:30::i;:::-;17126:103::o:0;55815:98::-;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;55881:13:::1;:24:::0;55815:98::o;36286:104::-;36342:13;36375:7;36368:14;;;;;:::i;55598:96::-;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;55676:10:::1;::::0;;-1:-1:-1;;55662:24:0;::::1;55676:10:::0;;;;::::1;;;55675:11;55662:24:::0;;::::1;;::::0;;55598:96::o;51895:642::-;51968:10;;;;;;;51960:34;;;;-1:-1:-1;;;51960:34:0;;;;;;;:::i;:::-;52051:14;;52034:13;52013:18;;:34;;;;:::i;:::-;:52;;52005:78;;;;-1:-1:-1;;;52005:78:0;;19446:2:1;52005:78:0;;;19428:21:1;19485:2;19465:18;;;19458:30;-1:-1:-1;;;19504:18:1;;;19497:43;19557:18;;52005:78:0;19244:337:1;52005:78:0;52145:11;;52128:13;52102:23;:13;2803:14;;2711:114;52102:23;:39;;;;:::i;:::-;:54;;52094:77;;;;-1:-1:-1;;;52094:77:0;;;;;;;:::i;:::-;52207:16;;52190:13;:33;;52182:61;;;;-1:-1:-1;;;52182:61:0;;16046:2:1;52182:61:0;;;16028:21:1;16085:2;16065:18;;;16058:30;-1:-1:-1;;;16104:18:1;;;16097:45;16159:18;;52182:61:0;15844:339:1;52182:61:0;52295:9;52278:13;52262;;:29;;;;:::i;:::-;:42;;52254:71;;;;-1:-1:-1;;;52254:71:0;;21247:2:1;52254:71:0;;;21229:21:1;21286:2;21266:18;;;21259:30;-1:-1:-1;;;21305:18:1;;;21298:46;21361:18;;52254:71:0;21045:340:1;52254:71:0;52343:9;52338:192;52362:13;52358:1;:17;52338:192;;;52397:18;:20;;;:18;:20;;;:::i;:::-;;;;;;52432:25;:13;2922:19;;2940:1;2922:19;;;2833:127;52432:25;52472:46;52482:10;52494:23;:13;2803:14;;2711:114;52472:46;52377:3;;;;:::i;:::-;;;;52338:192;;;;51895:642;:::o;50192:885::-;50321:11;;;;50313:35;;;;-1:-1:-1;;;50313:35:0;;;;;;;:::i;:::-;50367:61;50385:9;50367:61;;;;;;;;;;;;;-1:-1:-1;;;50367:61:0;;;50412:15;50367:17;:61::i;:::-;50359:96;;;;-1:-1:-1;;;50359:96:0;;10206:2:1;50359:96:0;;;10188:21:1;10245:2;10225:18;;;10218:30;-1:-1:-1;;;10264:18:1;;;10257:52;10326:18;;50359:96:0;10004:346:1;50359:96:0;50512:14;;50495:13;50474:18;;:34;;;;:::i;:::-;:52;;50466:78;;;;-1:-1:-1;;;50466:78:0;;19446:2:1;50466:78:0;;;19428:21:1;19485:2;19465:18;;;19458:30;-1:-1:-1;;;19504:18:1;;;19497:43;19557:18;;50466:78:0;19244:337:1;50466:78:0;50606:11;;50589:13;50563:23;:13;2803:14;;2711:114;50563:23;:39;;;;:::i;:::-;:54;;50555:77;;;;-1:-1:-1;;;50555:77:0;;;;;;;:::i;:::-;50669:10;50651:29;;;;:17;:29;;;;;;50700:15;;50651:45;;50683:13;;50651:45;:::i;:::-;:64;;50643:94;;;;-1:-1:-1;;;50643:94:0;;18338:2:1;50643:94:0;;;18320:21:1;18377:2;18357:18;;;18350:30;-1:-1:-1;;;18396:18:1;;;18389:47;18453:18;;50643:94:0;18136:341:1;50643:94:0;50789:9;50772:13;50756;;:29;;;;:::i;:::-;:42;;50748:71;;;;-1:-1:-1;;;50748:71:0;;21247:2:1;50748:71:0;;;21229:21:1;21286:2;21266:18;;;21259:30;-1:-1:-1;;;21305:18:1;;;21298:46;21361:18;;50748:71:0;21045:340:1;50748:71:0;50837:9;50832:238;50856:13;50852:1;:17;50832:238;;;50891:18;:20;;;:18;:20;;;:::i;:::-;;;;-1:-1:-1;;50944:10:0;50926:29;;;;:17;:29;;;;;:31;;;;;;:::i;:::-;;;;;;50972:25;:13;2922:19;;2940:1;2922:19;;;2833:127;50972:25;51012:46;51022:10;51034:23;:13;2803:14;;2711:114;51012:46;50871:3;;;;:::i;:::-;;;;50832:238;;;;50192:885;;;:::o;37969:155::-;38064:52;15395:10;38097:8;38107;38064:18;:52::i;51085:802::-;51200:13;;;;;;;51192:37;;;;-1:-1:-1;;;51192:37:0;;;;;;;:::i;:::-;51248:58;51266:9;51248:58;;;;;;;;;;;;;-1:-1:-1;;;51248:58:0;;;51290:15;51248:17;:58::i;:::-;51240:93;;;;-1:-1:-1;;;51240:93:0;;10206:2:1;51240:93:0;;;10188:21:1;10245:2;10225:18;;;10218:30;-1:-1:-1;;;10264:18:1;;;10257:52;10326:18;;51240:93:0;10004:346:1;51240:93:0;51389:26;;51372:13;51352:17;;:33;;;;:::i;:::-;:63;;51344:101;;;;-1:-1:-1;;;51344:101:0;;20893:2:1;51344:101:0;;;20875:21:1;20932:2;20912:18;;;20905:30;20971:27;20951:18;;;20944:55;21016:18;;51344:101:0;20691:349:1;51344:101:0;51507:11;;51490:13;51464:23;:13;2803:14;;2711:114;51464:23;:39;;;;:::i;:::-;:54;;51456:77;;;;-1:-1:-1;;;51456:77:0;;;;;;;:::i;:::-;51566:10;51552:25;;;;:13;:25;;;;;;51597:15;;51552:41;;51580:13;;51552:41;:::i;:::-;:60;;51544:90;;;;-1:-1:-1;;;51544:90:0;;18338:2:1;51544:90:0;;;18320:21:1;18377:2;18357:18;;;18350:30;-1:-1:-1;;;18396:18:1;;;18389:47;18453:18;;51544:90:0;18136:341:1;51544:90:0;51652:9;51647:233;51671:13;51667:1;:17;51647:233;;;51706:17;:19;;;:17;:19;;;:::i;:::-;;;;-1:-1:-1;;51754:10:0;51740:25;;;;:13;:25;;;;;:27;;;;;;:::i;:::-;;;;;;51782:25;:13;2922:19;;2940:1;2922:19;;;2833:127;51782:25;51822:46;51832:10;51844:23;:13;2803:14;;2711:114;51822:46;51686:3;;;;:::i;:::-;;;;51647:233;;39092:328;39267:41;15395:10;39300:7;39267:18;:41::i;:::-;39259:103;;;;-1:-1:-1;;;39259:103:0;;;;;;;:::i;:::-;39373:39;39387:4;39393:2;39397:7;39406:5;39373:13;:39::i;56498:244::-;40995:4;41019:16;;;:7;:16;;;;;;56571:13;;-1:-1:-1;;;;;41019:16:0;56597:60;;;;-1:-1:-1;;;56597:60:0;;18684:2:1;56597:60:0;;;18666:21:1;18723:2;18703:18;;;18696:30;18762:33;18742:18;;;18735:61;18813:18;;56597:60:0;18482:355:1;56597:60:0;56699:13;56714:18;:7;:16;:18::i;:::-;56682:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56668:66;;56498:244;;;:::o;54081:1398::-;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;54157:21:::1;54197:42;54189:88;54272:4;54250:20;54157:21:::0;54267:3:::1;54250:20;:::i;:::-;:26;;;;:::i;:::-;54189:88;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;54296:42:0::1;54288:88;54371:4;54349:20;:14:::0;54366:3:::1;54349:20;:::i;:::-;:26;;;;:::i;:::-;54288:88;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;54395:42:0::1;54387:88;54470:4;54448:20;:14:::0;54465:3:::1;54448:20;:::i;:::-;:26;;;;:::i;:::-;54387:88;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;54494:42:0::1;54486:88;54569:4;54547:20;:14:::0;54564:3:::1;54547:20;:::i;:::-;:26;;;;:::i;:::-;54486:88;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;54604:42:0::1;54596:88;54679:4;54657:19;:14:::0;54674:2:::1;54657:19;:::i;:::-;:26;;;;:::i;:::-;54596:88;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;54703:42:0::1;54695:88;54778:4;54756:19;:14:::0;54773:2:::1;54756:19;:::i;:::-;:26;;;;:::i;:::-;54695:88;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;54802:42:0::1;54794:88;54877:4;54855:19;:14:::0;54872:2:::1;54855:19;:::i;:::-;:26;;;;:::i;:::-;54794:88;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;54901:42:0::1;54893:88;54976:4;54954:19;:14:::0;54971:2:::1;54954:19;:::i;:::-;:26;;;;:::i;:::-;54893:88;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;55000:42:0::1;54992:88;55075:4;55053:19;:14:::0;55070:2:::1;55053:19;:::i;:::-;:26;;;;:::i;:::-;54992:88;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;55099:42:0::1;55091:88;55174:4;55152:19;:14:::0;55169:2:::1;55152:19;:::i;:::-;:26;;;;:::i;:::-;55091:88;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;55198:42:0::1;55190:88;55273:4;55251:19;:14:::0;55268:2:::1;55251:19;:::i;:::-;:26;;;;:::i;:::-;55190:88;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;55297:42:0::1;55289:88;55372:4;55350:19;:14:::0;55367:2:::1;55350:19;:::i;:::-;:26;;;;:::i;:::-;55289:88;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;55388:83:0::1;::::0;55396:42:::1;::::0;55449:21:::1;55388:83:::0;::::1;;;::::0;::::1;::::0;;;55449:21;55396:42;55388:83;::::1;;;;;;;;;;;;;::::0;::::1;;;;55491:99:::0;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;55571:11:::1;::::0;;-1:-1:-1;;55556:26:0;::::1;55571:11;::::0;;::::1;55570:12;55556:26;::::0;;55491:99::o;17384:201::-;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17473:22:0;::::1;17465:73;;;::::0;-1:-1:-1;;;17465:73:0;;11336:2:1;17465:73:0::1;::::0;::::1;11318:21:1::0;11375:2;11355:18;;;11348:30;11414:34;11394:18;;;11387:62;-1:-1:-1;;;11465:18:1;;;11458:36;11511:19;;17465:73:0::1;11134:402:1::0;17465:73:0::1;17549:28;17568:8;17549:18;:28::i;49727:457::-:0;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;49845:20:::1;;49828:13;49809:16;;:32;;;;:::i;:::-;:56;;49801:88;;;::::0;-1:-1:-1;;;49801:88:0;;20545:2:1;49801:88:0::1;::::0;::::1;20527:21:1::0;20584:2;20564:18;;;20557:30;-1:-1:-1;;;20603:18:1;;;20596:49;20662:18;;49801:88:0::1;20343:343:1::0;49801:88:0::1;49951:11;;49934:13;49908:23;:13;2803:14:::0;;2711:114;49908:23:::1;:39;;;;:::i;:::-;:54;;49900:77;;;;-1:-1:-1::0;;;49900:77:0::1;;;;;;;:::i;:::-;49992:9;49988:189;50011:13;50007:1;:17;49988:189;;;50046:16;:18:::0;;;:16:::1;:18;::::0;::::1;:::i;:::-;;;;;;50079:25;:13;2922:19:::0;;2940:1;2922:19;;;2833:127;50079:25:::1;50119:46;50129:10;50141:23;:13;2803:14:::0;;2711:114;50119:46:::1;50026:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49988:189;;56040:122:::0;16548:6;;-1:-1:-1;;;;;16548:6:0;15395:10;16695:23;16687:68;;;;-1:-1:-1;;;16687:68:0;;;;;;;:::i;:::-;56117:26:::1;:37:::0;56040:122::o;44912:174::-;44987:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;44987:29:0;-1:-1:-1;;;;;44987:29:0;;;;;;;;:24;;45041:23;44987:24;45041:14;:23::i;:::-;-1:-1:-1;;;;;45032:46:0;;;;;;;;;;;44912:174;;:::o;41914:110::-;41990:26;42000:2;42004:7;41990:26;;;;;;;;;;;;:9;:26::i;41224:348::-;41317:4;41019:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41019:16:0;41334:73;;;;-1:-1:-1;;;41334:73:0;;14387:2:1;41334:73:0;;;14369:21:1;14426:2;14406:18;;;14399:30;14465:34;14445:18;;;14438:62;-1:-1:-1;;;14516:18:1;;;14509:42;14568:19;;41334:73:0;14185:408:1;41334:73:0;41418:13;41434:23;41449:7;41434:14;:23::i;:::-;41418:39;;41487:5;-1:-1:-1;;;;;41476:16:0;:7;-1:-1:-1;;;;;41476:16:0;;:51;;;;41520:7;-1:-1:-1;;;;;41496:31:0;:20;41508:7;41496:11;:20::i;:::-;-1:-1:-1;;;;;41496:31:0;;41476:51;:87;;;-1:-1:-1;;;;;;38316:25:0;;;38292:4;38316:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;41531:32;41468:96;41224:348;-1:-1:-1;;;;41224:348:0:o;44216:578::-;44375:4;-1:-1:-1;;;;;44348:31:0;:23;44363:7;44348:14;:23::i;:::-;-1:-1:-1;;;;;44348:31:0;;44340:85;;;;-1:-1:-1;;;44340:85:0;;17928:2:1;44340:85:0;;;17910:21:1;17967:2;17947:18;;;17940:30;18006:34;17986:18;;;17979:62;-1:-1:-1;;;18057:18:1;;;18050:39;18106:19;;44340:85:0;17726:405:1;44340:85:0;-1:-1:-1;;;;;44444:16:0;;44436:65;;;;-1:-1:-1;;;44436:65:0;;12440:2:1;44436:65:0;;;12422:21:1;12479:2;12459:18;;;12452:30;12518:34;12498:18;;;12491:62;-1:-1:-1;;;12569:18:1;;;12562:34;12613:19;;44436:65:0;12238:400:1;44436:65:0;44618:29;44635:1;44639:7;44618:8;:29::i;:::-;-1:-1:-1;;;;;44660:15:0;;;;;;:9;:15;;;;;:20;;44679:1;;44660:15;:20;;44679:1;;44660:20;:::i;:::-;;;;-1:-1:-1;;;;;;;44691:13:0;;;;;;:9;:13;;;;;:18;;44708:1;;44691:13;:18;;44708:1;;44691:18;:::i;:::-;;;;-1:-1:-1;;44720:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;44720:21:0;-1:-1:-1;;;;;44720:21:0;;;;;;;;;44759:27;;44720:16;;44759:27;;;;;;;44216:578;;;:::o;19973:317::-;20088:6;20063:21;:31;;20055:73;;;;-1:-1:-1;;;20055:73:0;;14029:2:1;20055:73:0;;;14011:21:1;14068:2;14048:18;;;14041:30;14107:31;14087:18;;;14080:59;14156:18;;20055:73:0;13827:353:1;20055:73:0;20142:12;20160:9;-1:-1:-1;;;;;20160:14:0;20182:6;20160:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20141:52;;;20212:7;20204:78;;;;-1:-1:-1;;;20204:78:0;;13199:2:1;20204:78:0;;;13181:21:1;13238:2;13218:18;;;13211:30;13277:34;13257:18;;;13250:62;13348:28;13328:18;;;13321:56;13394:19;;20204:78:0;12997:422:1;17745:191:0;17838:6;;;-1:-1:-1;;;;;17855:17:0;;;-1:-1:-1;;;;;;17855:17:0;;;;;;;17888:40;;17838:6;;;17855:17;17838:6;;17888:40;;17819:16;;17888:40;17808:128;17745:191;:::o;48828:411::-;48950:4;48968:12;49100:10;49112:16;;;;;;;;;;;;;-1:-1:-1;;;49112:16:0;;;49130:9;49141:15;49083:74;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;49083:74:0;;;;;;;;;;49073:85;;49083:74;49073:85;;;;7778:66:1;48993:166:0;;;7766:79:1;;;;7861:12;;;7854:28;7898:12;;48993:166:0;;;-1:-1:-1;;48993:166:0;;;;;;;;;48983:189;;48993:166;48983:189;;;;;-1:-1:-1;49208:23:0;48983:189;49221:9;49208:12;:23::i;:::-;49190:14;;-1:-1:-1;;;;;49190:41:0;;;:14;;:41;;48828:411;-1:-1:-1;;;;;48828:411:0:o;45228:315::-;45383:8;-1:-1:-1;;;;;45374:17:0;:5;-1:-1:-1;;;;;45374:17:0;;;45366:55;;;;-1:-1:-1;;;45366:55:0;;12845:2:1;45366:55:0;;;12827:21:1;12884:2;12864:18;;;12857:30;12923:27;12903:18;;;12896:55;12968:18;;45366:55:0;12643:349:1;45366:55:0;-1:-1:-1;;;;;45432:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;45432:46:0;;;;;;;;;;45494:41;;8972::1;;;45494::0;;8945:18:1;45494:41:0;;;;;;;45228:315;;;:::o;40302:::-;40459:28;40469:4;40475:2;40479:7;40459:9;:28::i;:::-;40506:48;40529:4;40535:2;40539:7;40548:5;40506:22;:48::i;:::-;40498:111;;;;-1:-1:-1;;;40498:111:0;;;;;;;:::i;3557:723::-;3613:13;3834:10;3830:53;;-1:-1:-1;;3861:10:0;;;;;;;;;;;;-1:-1:-1;;;3861:10:0;;;;;3557:723::o;3830:53::-;3908:5;3893:12;3949:78;3956:9;;3949:78;;3982:8;;;;:::i;:::-;;-1:-1:-1;4005:10:0;;-1:-1:-1;4013:2:0;4005:10;;:::i;:::-;;;3949:78;;;4037:19;4069:6;4059:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4059:17:0;;4037:39;;4087:154;4094:10;;4087:154;;4121:11;4131:1;4121:11;;:::i;:::-;;-1:-1:-1;4190:10:0;4198:2;4190:5;:10;:::i;:::-;4177:24;;:2;:24;:::i;:::-;4164:39;;4147:6;4154;4147:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4147:56:0;;;;;;;;-1:-1:-1;4218:11:0;4227:2;4218:11;;:::i;:::-;;;4087:154;;42251:321;42381:18;42387:2;42391:7;42381:5;:18::i;:::-;42432:54;42463:1;42467:2;42471:7;42480:5;42432:22;:54::i;:::-;42410:154;;;;-1:-1:-1;;;42410:154:0;;;;;;;:::i;9584:231::-;9662:7;9683:17;9702:18;9724:27;9735:4;9741:9;9724:10;:27::i;:::-;9682:69;;;;9762:18;9774:5;9762:11;:18::i;:::-;-1:-1:-1;9798:9:0;9584:231;-1:-1:-1;;;9584:231:0:o;46108:799::-;46263:4;-1:-1:-1;;;;;46284:13:0;;18974:20;19022:8;46280:620;;46320:72;;-1:-1:-1;;;46320:72:0;;-1:-1:-1;;;;;46320:36:0;;;;;:72;;15395:10;;46371:4;;46377:7;;46386:5;;46320:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46320:72:0;;;;;;;;-1:-1:-1;;46320:72:0;;;;;;;;;;;;:::i;:::-;;;46316:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46562:13:0;;46558:272;;46605:60;;-1:-1:-1;;;46605:60:0;;;;;;;:::i;46558:272::-;46780:6;46774:13;46765:6;46761:2;46757:15;46750:38;46316:529;-1:-1:-1;;;;;;46443:51:0;-1:-1:-1;;;46443:51:0;;-1:-1:-1;46436:58:0;;46280:620;-1:-1:-1;46884:4:0;46108:799;;;;;;:::o;42908:382::-;-1:-1:-1;;;;;42988:16:0;;42980:61;;;;-1:-1:-1;;;42980:61:0;;16793:2:1;42980:61:0;;;16775:21:1;;;16812:18;;;16805:30;16871:34;16851:18;;;16844:62;16923:18;;42980:61:0;16591:356:1;42980:61:0;40995:4;41019:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41019:16:0;:30;43052:58;;;;-1:-1:-1;;;43052:58:0;;11743:2:1;43052:58:0;;;11725:21:1;11782:2;11762:18;;;11755:30;11821;11801:18;;;11794:58;11869:18;;43052:58:0;11541:352:1;43052:58:0;-1:-1:-1;;;;;43181:13:0;;;;;;:9;:13;;;;;:18;;43198:1;;43181:13;:18;;43198:1;;43181:18;:::i;:::-;;;;-1:-1:-1;;43210:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;43210:21:0;-1:-1:-1;;;;;43210:21:0;;;;;;;;43249:33;;43210:16;;;43249:33;;43210:16;;43249:33;42908:382;;:::o;7474:1308::-;7555:7;7564:12;7789:9;:16;7809:2;7789:22;7785:990;;;8085:4;8070:20;;8064:27;8135:4;8120:20;;8114:27;8193:4;8178:20;;8172:27;7828:9;8164:36;8236:25;8247:4;8164:36;8064:27;8114;8236:10;:25::i;:::-;8229:32;;;;;;;;;7785:990;8283:9;:16;8303:2;8283:22;8279:496;;;8558:4;8543:20;;8537:27;8609:4;8594:20;;8588:27;8651:23;8662:4;8537:27;8588;8651:10;:23::i;:::-;8644:30;;;;;;;;8279:496;-1:-1:-1;8723:1:0;;-1:-1:-1;8727:35:0;8279:496;7474:1308;;;;;:::o;5745:643::-;5823:20;5814:5;:29;;;;;;;;:::i;:::-;;5810:571;;;5745:643;:::o;5810:571::-;5921:29;5912:5;:38;;;;;;;;:::i;:::-;;5908:473;;;5967:34;;-1:-1:-1;;;5967:34:0;;9853:2:1;5967:34:0;;;9835:21:1;9892:2;9872:18;;;9865:30;9931:26;9911:18;;;9904:54;9975:18;;5967:34:0;9651:348:1;5908:473:0;6032:35;6023:5;:44;;;;;;;;:::i;:::-;;6019:362;;;6084:41;;-1:-1:-1;;;6084:41:0;;10557:2:1;6084:41:0;;;10539:21:1;10596:2;10576:18;;;10569:30;10635:33;10615:18;;;10608:61;10686:18;;6084:41:0;10355:355:1;6019:362:0;6156:30;6147:5;:39;;;;;;;;:::i;:::-;;6143:238;;;6203:44;;-1:-1:-1;;;6203:44:0;;13626:2:1;6203:44:0;;;13608:21:1;13665:2;13645:18;;;13638:30;13704:34;13684:18;;;13677:62;-1:-1:-1;;;13755:18:1;;;13748:32;13797:19;;6203:44:0;13424:398:1;6143:238:0;6278:30;6269:5;:39;;;;;;;;:::i;:::-;;6265:116;;;6325:44;;-1:-1:-1;;;6325:44:0;;16390:2:1;6325:44:0;;;16372:21:1;16429:2;16409:18;;;16402:30;16468:34;16448:18;;;16441:62;-1:-1:-1;;;16519:18:1;;;16512:32;16561:19;;6325:44:0;16188:398:1;11083:1632:0;11214:7;;12148:66;12135:79;;12131:163;;;-1:-1:-1;12247:1:0;;-1:-1:-1;12251:30:0;12231:51;;12131:163;12308:1;:7;;12313:2;12308:7;;:18;;;;;12319:1;:7;;12324:2;12319:7;;12308:18;12304:102;;;-1:-1:-1;12359:1:0;;-1:-1:-1;12363:30:0;12343:51;;12304:102;12520:24;;;12503:14;12520:24;;;;;;;;;9251:25:1;;;9324:4;9312:17;;9292:18;;;9285:45;;;;9346:18;;;9339:34;;;9389:18;;;9382:34;;;12520:24:0;;9223:19:1;;12520:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12520:24:0;;-1:-1:-1;;12520:24:0;;;-1:-1:-1;;;;;;;12559:20:0;;12555:103;;12612:1;12616:29;12596:50;;;;;;;12555:103;12678:6;-1:-1:-1;12686:20:0;;-1:-1:-1;11083:1632:0;;;;;;;;:::o;10078:391::-;10192:7;;-1:-1:-1;;;;;10293:75:0;;10395:3;10391:12;;;10405:2;10387:21;10436:25;10447:4;10387:21;10456:1;10293:75;10436:10;:25::i;:::-;10429:32;;;;;;10078:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:718::-;234:5;287:3;280:4;272:6;268:17;264:27;254:55;;305:1;302;295:12;254:55;341:6;328:20;367:18;404:2;400;397:10;394:36;;;410:18;;:::i;:::-;485:2;479:9;453:2;539:13;;-1:-1:-1;;535:22:1;;;559:2;531:31;527:40;515:53;;;583:18;;;603:22;;;580:46;577:72;;;629:18;;:::i;:::-;669:10;665:2;658:22;704:2;696:6;689:18;750:3;743:4;738:2;730:6;726:15;722:26;719:35;716:55;;;767:1;764;757:12;716:55;831:2;824:4;816:6;812:17;805:4;797:6;793:17;780:54;878:1;871:4;866:2;858:6;854:15;850:26;843:37;898:6;889:15;;;;;;192:718;;;;:::o;915:186::-;974:6;1027:2;1015:9;1006:7;1002:23;998:32;995:52;;;1043:1;1040;1033:12;995:52;1066:29;1085:9;1066:29;:::i;:::-;1056:39;915:186;-1:-1:-1;;;915:186:1:o;1106:260::-;1174:6;1182;1235:2;1223:9;1214:7;1210:23;1206:32;1203:52;;;1251:1;1248;1241:12;1203:52;1274:29;1293:9;1274:29;:::i;:::-;1264:39;;1322:38;1356:2;1345:9;1341:18;1322:38;:::i;:::-;1312:48;;1106:260;;;;;:::o;1371:328::-;1448:6;1456;1464;1517:2;1505:9;1496:7;1492:23;1488:32;1485:52;;;1533:1;1530;1523:12;1485:52;1556:29;1575:9;1556:29;:::i;:::-;1546:39;;1604:38;1638:2;1627:9;1623:18;1604:38;:::i;:::-;1594:48;;1689:2;1678:9;1674:18;1661:32;1651:42;;1371:328;;;;;:::o;1704:537::-;1799:6;1807;1815;1823;1876:3;1864:9;1855:7;1851:23;1847:33;1844:53;;;1893:1;1890;1883:12;1844:53;1916:29;1935:9;1916:29;:::i;:::-;1906:39;;1964:38;1998:2;1987:9;1983:18;1964:38;:::i;:::-;1954:48;;2049:2;2038:9;2034:18;2021:32;2011:42;;2104:2;2093:9;2089:18;2076:32;2131:18;2123:6;2120:30;2117:50;;;2163:1;2160;2153:12;2117:50;2186:49;2227:7;2218:6;2207:9;2203:22;2186:49;:::i;:::-;2176:59;;;1704:537;;;;;;;:::o;2246:347::-;2311:6;2319;2372:2;2360:9;2351:7;2347:23;2343:32;2340:52;;;2388:1;2385;2378:12;2340:52;2411:29;2430:9;2411:29;:::i;:::-;2401:39;;2490:2;2479:9;2475:18;2462:32;2537:5;2530:13;2523:21;2516:5;2513:32;2503:60;;2559:1;2556;2549:12;2503:60;2582:5;2572:15;;;2246:347;;;;;:::o;2598:254::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2766:29;2785:9;2766:29;:::i;:::-;2756:39;2842:2;2827:18;;;;2814:32;;-1:-1:-1;;;2598:254:1:o;2857:615::-;2943:6;2951;3004:2;2992:9;2983:7;2979:23;2975:32;2972:52;;;3020:1;3017;3010:12;2972:52;3060:9;3047:23;3089:18;3130:2;3122:6;3119:14;3116:34;;;3146:1;3143;3136:12;3116:34;3184:6;3173:9;3169:22;3159:32;;3229:7;3222:4;3218:2;3214:13;3210:27;3200:55;;3251:1;3248;3241:12;3200:55;3291:2;3278:16;3317:2;3309:6;3306:14;3303:34;;;3333:1;3330;3323:12;3303:34;3386:7;3381:2;3371:6;3368:1;3364:14;3360:2;3356:23;3352:32;3349:45;3346:65;;;3407:1;3404;3397:12;3346:65;3438:2;3430:11;;;;;3460:6;;-1:-1:-1;2857:615:1;;-1:-1:-1;;;;2857:615:1:o;3477:245::-;3535:6;3588:2;3576:9;3567:7;3563:23;3559:32;3556:52;;;3604:1;3601;3594:12;3556:52;3643:9;3630:23;3662:30;3686:5;3662:30;:::i;3727:249::-;3796:6;3849:2;3837:9;3828:7;3824:23;3820:32;3817:52;;;3865:1;3862;3855:12;3817:52;3897:9;3891:16;3916:30;3940:5;3916:30;:::i;3981:456::-;4067:6;4075;4083;4136:2;4124:9;4115:7;4111:23;4107:32;4104:52;;;4152:1;4149;4142:12;4104:52;4192:9;4179:23;4225:18;4217:6;4214:30;4211:50;;;4257:1;4254;4247:12;4211:50;4280:49;4321:7;4312:6;4301:9;4297:22;4280:49;:::i;:::-;4270:59;4376:2;4361:18;;4348:32;;-1:-1:-1;4427:2:1;4412:18;;;4399:32;;3981:456;-1:-1:-1;;;;3981:456:1:o;4442:592::-;4513:6;4521;4574:2;4562:9;4553:7;4549:23;4545:32;4542:52;;;4590:1;4587;4580:12;4542:52;4630:9;4617:23;4659:18;4700:2;4692:6;4689:14;4686:34;;;4716:1;4713;4706:12;4686:34;4754:6;4743:9;4739:22;4729:32;;4799:7;4792:4;4788:2;4784:13;4780:27;4770:55;;4821:1;4818;4811:12;4770:55;4861:2;4848:16;4887:2;4879:6;4876:14;4873:34;;;4903:1;4900;4893:12;4873:34;4948:7;4943:2;4934:6;4930:2;4926:15;4922:24;4919:37;4916:57;;;4969:1;4966;4959:12;5039:180;5098:6;5151:2;5139:9;5130:7;5126:23;5122:32;5119:52;;;5167:1;5164;5157:12;5119:52;-1:-1:-1;5190:23:1;;5039:180;-1:-1:-1;5039:180:1:o;5224:257::-;5265:3;5303:5;5297:12;5330:6;5325:3;5318:19;5346:63;5402:6;5395:4;5390:3;5386:14;5379:4;5372:5;5368:16;5346:63;:::i;:::-;5463:2;5442:15;-1:-1:-1;;5438:29:1;5429:39;;;;5470:4;5425:50;;5224:257;-1:-1:-1;;5224:257:1:o;5486:185::-;5528:3;5566:5;5560:12;5581:52;5626:6;5621:3;5614:4;5607:5;5603:16;5581:52;:::i;:::-;5649:16;;;;;5486:185;-1:-1:-1;;5486:185:1:o;5676:676::-;5966:26;5962:31;5953:6;5949:2;5945:15;5941:53;5936:3;5929:66;5911:3;6024:6;6018:13;6040:62;6095:6;6090:2;6085:3;6081:12;6074:4;6066:6;6062:17;6040:62;:::i;:::-;6162:13;;6121:16;;;;6184:63;6162:13;6233:2;6225:11;;6218:4;6206:17;;6184:63;:::i;:::-;6266:17;6307:2;6299:11;;6292:27;;;;-1:-1:-1;;6343:2:1;6335:11;;;-1:-1:-1;;;5676:676:1:o;6357:1174::-;6533:3;6562:1;6595:6;6589:13;6625:3;6647:1;6675:9;6671:2;6667:18;6657:28;;6735:2;6724:9;6720:18;6757;6747:61;;6801:4;6793:6;6789:17;6779:27;;6747:61;6827:2;6875;6867:6;6864:14;6844:18;6841:38;6838:165;;;-1:-1:-1;;;6902:33:1;;6958:4;6955:1;6948:15;6988:4;6909:3;6976:17;6838:165;7019:18;7046:104;;;;7164:1;7159:320;;;;7012:467;;7046:104;-1:-1:-1;;7079:24:1;;7067:37;;7124:16;;;;-1:-1:-1;7046:104:1;;7159:320;21645:1;21638:14;;;21682:4;21669:18;;7254:1;7268:165;7282:6;7279:1;7276:13;7268:165;;;7360:14;;7347:11;;;7340:35;7403:16;;;;7297:10;;7268:165;;;7272:3;;7462:6;7457:3;7453:16;7446:23;;7012:467;;;;;;;7495:30;7521:3;7513:6;7495:30;:::i;:::-;7488:37;6357:1174;-1:-1:-1;;;;;6357:1174:1:o;8339:488::-;-1:-1:-1;;;;;8608:15:1;;;8590:34;;8660:15;;8655:2;8640:18;;8633:43;8707:2;8692:18;;8685:34;;;8755:3;8750:2;8735:18;;8728:31;;;8533:4;;8776:45;;8801:19;;8793:6;8776:45;:::i;:::-;8768:53;8339:488;-1:-1:-1;;;;;;8339:488:1:o;9427:219::-;9576:2;9565:9;9558:21;9539:4;9596:44;9636:2;9625:9;9621:18;9613:6;9596:44;:::i;10715:414::-;10917:2;10899:21;;;10956:2;10936:18;;;10929:30;10995:34;10990:2;10975:18;;10968:62;-1:-1:-1;;;11061:2:1;11046:18;;11039:48;11119:3;11104:19;;10715:414::o;11898:335::-;12100:2;12082:21;;;12139:2;12119:18;;;12112:30;-1:-1:-1;;;12173:2:1;12158:18;;12151:41;12224:2;12209:18;;11898:335::o;17365:356::-;17567:2;17549:21;;;17586:18;;;17579:30;17645:34;17640:2;17625:18;;17618:62;17712:2;17697:18;;17365:356::o;19586:334::-;19788:2;19770:21;;;19827:2;19807:18;;;19800:30;-1:-1:-1;;;19861:2:1;19846:18;;19839:40;19911:2;19896:18;;19586:334::o;19925:413::-;20127:2;20109:21;;;20166:2;20146:18;;;20139:30;20205:34;20200:2;20185:18;;20178:62;-1:-1:-1;;;20271:2:1;20256:18;;20249:47;20328:3;20313:19;;19925:413::o;21698:128::-;21738:3;21769:1;21765:6;21762:1;21759:13;21756:39;;;21775:18;;:::i;:::-;-1:-1:-1;21811:9:1;;21698:128::o;21831:120::-;21871:1;21897;21887:35;;21902:18;;:::i;:::-;-1:-1:-1;21936:9:1;;21831:120::o;21956:168::-;21996:7;22062:1;22058;22054:6;22050:14;22047:1;22044:21;22039:1;22032:9;22025:17;22021:45;22018:71;;;22069:18;;:::i;:::-;-1:-1:-1;22109:9:1;;21956:168::o;22129:125::-;22169:4;22197:1;22194;22191:8;22188:34;;;22202:18;;:::i;:::-;-1:-1:-1;22239:9:1;;22129:125::o;22259:258::-;22331:1;22341:113;22355:6;22352:1;22349:13;22341:113;;;22431:11;;;22425:18;22412:11;;;22405:39;22377:2;22370:10;22341:113;;;22472:6;22469:1;22466:13;22463:48;;;-1:-1:-1;;22507:1:1;22489:16;;22482:27;22259:258::o;22522:380::-;22601:1;22597:12;;;;22644;;;22665:61;;22719:4;22711:6;22707:17;22697:27;;22665:61;22772:2;22764:6;22761:14;22741:18;22738:38;22735:161;;;22818:10;22813:3;22809:20;22806:1;22799:31;22853:4;22850:1;22843:15;22881:4;22878:1;22871:15;22735:161;;22522:380;;;:::o;22907:135::-;22946:3;-1:-1:-1;;22967:17:1;;22964:43;;;22987:18;;:::i;:::-;-1:-1:-1;23034:1:1;23023:13;;22907:135::o;23047:112::-;23079:1;23105;23095:35;;23110:18;;:::i;:::-;-1:-1:-1;23144:9:1;;23047:112::o;23164:127::-;23225:10;23220:3;23216:20;23213:1;23206:31;23256:4;23253:1;23246:15;23280:4;23277:1;23270:15;23296:127;23357:10;23352:3;23348:20;23345:1;23338:31;23388:4;23385:1;23378:15;23412:4;23409:1;23402:15;23428:127;23489:10;23484:3;23480:20;23477:1;23470:31;23520:4;23517:1;23510:15;23544:4;23541:1;23534:15;23560:127;23621:10;23616:3;23612:20;23609:1;23602:31;23652:4;23649:1;23642:15;23676:4;23673:1;23666:15;23692:127;23753:10;23748:3;23744:20;23741:1;23734:31;23784:4;23781:1;23774:15;23808:4;23805:1;23798:15;23824:131;-1:-1:-1;;;;;;23898:32:1;;23888:43;;23878:71;;23945:1;23942;23935:12

Swarm Source

ipfs://0ea2d2fe54c6a6d3142bc90152d5136da5b24037179f3c039eb70864be1b6ad7
Loading...
Loading
Loading...
Loading
[ 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.