ETH Price: $2,994.06 (-2.01%)
Gas: 2 Gwei

Token

AthleteHero Shoeboxes (AHS)
 

Overview

Max Total Supply

404 AHS

Holders

367

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
laascold.eth
Balance
1 AHS
0xec1729cf062c343751e7d1e07724e7ee31510c42
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AthleteHero

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-28
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


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

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

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

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

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _burn(tokenId);
    }
}

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: athletehero_shoebox.sol


pragma solidity 0.8.17;

//          _   _     _      _       _    _                
//     /\  | | | |   | |    | |     | |  | |               
//    /  \ | |_| |__ | | ___| |_ ___| |__| | ___ _ __ ___  
//   / /\ \| __| '_ \| |/ _ \ __/ _ \  __  |/ _ \ '__/ _ \ 
//  / ____ \ |_| | | | |  __/ ||  __/ |  | |  __/ | | (_) |
// /_/    \_\__|_| |_|_|\___|\__\___|_|  |_|\___|_|  \___/ 







interface InterfaceAthleteHero {
    function getOwnerOf(uint256 tokenId) external view returns (address owner);
	function getTokenIds(address _owner) external view returns (uint[] memory);
}

/// @custom:security-contact [email protected]
contract AthleteHero is ERC721, ERC721Enumerable, Pausable, Ownable, ERC721Burnable, ReentrancyGuard {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    string baseURI;
	uint256 public cost = 0 ether;
	uint256 public costWhitelist = 0 ether;
	uint256 public maxSupply = 1000;
	uint256 public maxMintAmount = 1;
	bool public pauseGeneralMint = false;
	bool public pauseWhitelistMint = true;
	mapping(address => uint8) private whitelist;

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI
	) ERC721(_name,_symbol) {
        setBaseURI(_initBaseURI);
        _tokenIdCounter.increment();
	}

    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
	
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    
	
    function pausedGeneralMint(bool _pauseValue) public onlyOwner {
        pauseGeneralMint = _pauseValue;
    }
	
    function pausedWhitelistMint(bool _pauseValue) public onlyOwner {
        pauseWhitelistMint = _pauseValue;
    }
	
    function setSupply(uint256 _newMaxSupply,uint256 _newMaxAmount) public onlyOwner {
        maxSupply = _newMaxSupply;
        maxMintAmount = _newMaxAmount;
    }
	
    function setCost(uint256 _cost,uint256 _costWhitelist) public onlyOwner {
        cost = _cost;
        costWhitelist = _costWhitelist;
    }
	
    function addWhiteList(address[] calldata addresses,uint[] calldata mintAmounts) external onlyOwner {
        for (uint i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0),"Can't add for zero address!");
                whitelist[addresses[i]] =  uint8(mintAmounts[i]);
        }
    }

    function ownerMint(address to,uint256 _mintAmount) public onlyOwner nonReentrant {
        require(to != address(0),"Can't mint for zero address!");
        uint256 supply = totalSupply();
       for (uint256 i = 1; i <= _mintAmount; i++) {
              _safeMint(to, supply + i);
       }
    }
	
    function mint(uint256 _mintAmount) public payable nonReentrant whenNotPaused {
       uint256 supply = totalSupply();
       require(!pauseGeneralMint,"Minting is not avaliable!");
       require(_mintAmount > 0,"Mint amount must be more than zero!");
	   require(ERC721.balanceOf(msg.sender) < maxMintAmount,"You have already minted your max amount.");
       require(_mintAmount <= maxMintAmount,string(abi.encodePacked("You are not allowed to mint more than ",Strings.toString(maxMintAmount),".")));
       require(supply + _mintAmount <= maxSupply,"Purchase would exceed max supply of NFTs.");
       if (msg.sender != owner()) {
              require(msg.value >= cost * _mintAmount,"You did not send enough ether.");
       }
       for (uint256 i = 1; i <= _mintAmount; i++) {
              _safeMint(msg.sender, supply + i);
       }
    }
	
    function mintWhitelist(uint256 _mintAmount) public payable nonReentrant whenNotPaused {
       uint256 supply = totalSupply();
       require(!pauseWhitelistMint,"Minting is not avaliable!");
       require(_mintAmount > 0,"Mint amount must be more than zero!");
	   require(ERC721.balanceOf(msg.sender) < maxMintAmount,"You have already minted your max amount.");
	   require(_mintAmount <= whitelist[msg.sender],"You are not allowed to mint, or you are trying to mint more than you are allowed.");
       require(_mintAmount <= maxMintAmount,string(abi.encodePacked("You are not allowed to mint more than ",Strings.toString(maxMintAmount),".")));
       require(supply + _mintAmount <= maxSupply,"Purchase would exceed max supply of NFTs.");
       if (msg.sender != owner()) {
              require(msg.value >= costWhitelist * _mintAmount,"You did not send enough ether.");
       }
       for (uint256 i = 1; i <= _mintAmount; i++) {
              _safeMint(msg.sender, supply + i);
       }
	   whitelist[msg.sender] = uint8(whitelist[msg.sender]) - uint8(_mintAmount);
    }
    
    function tokenURI(uint256 tokenId) public view override returns (string memory) 
    {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

		string memory _tokenId = Strings.toString(tokenId);

        if (bytes(baseURI).length == 0) {
            return _tokenId;
        }
		
        if (bytes(_tokenId).length > 0) {
            return string(abi.encodePacked(baseURI, _tokenId, ".json"));
        }

        return super.tokenURI(tokenId);
    }
	
	function getOwnerOf(uint256 tokenId) external view returns (address owner) {
        return (ownerOf(tokenId));
    }
	
	function getTokenIds(address _owner) external view returns (uint[] memory) {
        uint[] memory _tokensOfOwner = new uint[](ERC721.balanceOf(_owner));
        uint i;

        for (i=0;i<ERC721.balanceOf(_owner);i++){
            _tokensOfOwner[i] = ERC721Enumerable.tokenOfOwnerByIndex(_owner, i);
        }
        return (_tokensOfOwner);
    }    

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        whenNotPaused
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"}],"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"mintAmounts","type":"uint256[]"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintWhitelist","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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseGeneralMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseWhitelistMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_pauseValue","type":"bool"}],"name":"pausedGeneralMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pauseValue","type":"bool"}],"name":"pausedWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_costWhitelist","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"},{"internalType":"uint256","name":"_newMaxAmount","type":"uint256"}],"name":"setSupply","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600e819055600f556103e860105560016011556012805461ffff19166101001790553480156200003557600080fd5b50604051620030383803806200303883398101604081905262000058916200026a565b828260006200006883826200038a565b5060016200007782826200038a565b5050600a805460ff19169055506200008f33620000bf565b6001600b556200009f8162000119565b620000b6600c6200013560201b620015881760201c565b50505062000456565b600a80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001236200013e565b600d6200013182826200038a565b5050565b80546001019055565b600a546001600160a01b03610100909104163314620001a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001cd57600080fd5b81516001600160401b0380821115620001ea57620001ea620001a5565b604051601f8301601f19908116603f01168101908282118183101715620002155762000215620001a5565b816040528381526020925086838588010111156200023257600080fd5b600091505b8382101562000256578582018301518183018401529082019062000237565b600093810190920192909252949350505050565b6000806000606084860312156200028057600080fd5b83516001600160401b03808211156200029857600080fd5b620002a687838801620001bb565b94506020860151915080821115620002bd57600080fd5b620002cb87838801620001bb565b93506040860151915080821115620002e257600080fd5b50620002f186828701620001bb565b9150509250925092565b600181811c908216806200031057607f821691505b6020821081036200033157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200038557600081815260208120601f850160051c81016020861015620003605750805b601f850160051c820191505b8181101562000381578281556001016200036c565b5050505b505050565b81516001600160401b03811115620003a657620003a6620001a5565b620003be81620003b78454620002fb565b8462000337565b602080601f831160018114620003f65760008415620003dd5750858301515b600019600386901b1c1916600185901b17855562000381565b600085815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b5085821015620004465787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612bd280620004666000396000f3fe6080604052600436106102305760003560e01c80635c975abb1161012e578063a0712d68116100ab578063d004b0361161006f578063d004b03614610644578063d5abeb0114610671578063e985e9c514610687578063f2fde38b146106d0578063fc784d49146106f057600080fd5b8063a0712d68146105b1578063a0d41d9f146105c4578063a22cb465146105e4578063b88d4fde14610604578063c87b56dd1461062457600080fd5b80637a4172c6116100f25780637a4172c6146105235780638363871014610543578063897dd5ef146105635780638da5cb5b1461057957806395d89b411461059c57600080fd5b80635c975abb146104965780636352211e146104ae57806370a08231146104ce578063715018a6146104ee5780637696e0881461050357600080fd5b80632f745c59116101bc57806342966c681161018057806342966c68146104035780634618163e14610423578063484b973c146104365780634f6ccce71461045657806355f804b31461047657600080fd5b80632f745c591461037557806335ac3bcc146103955780633886a196146103b45780633ccfd60b146103ce57806342842e0e146103e357600080fd5b8063095ea7b311610203578063095ea7b3146102e657806313faede61461030657806318160ddd1461032a578063239c70ae1461033f57806323b872dd1461035557600080fd5b806301ffc9a71461023557806306fdde031461026a57806307021ec91461028c578063081812fc146102ae575b600080fd5b34801561024157600080fd5b5061025561025036600461220e565b610710565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061027f610721565b604051610261919061227b565b34801561029857600080fd5b506102ac6102a73660046122a3565b6107b3565b005b3480156102ba57600080fd5b506102ce6102c93660046122be565b6107d5565b6040516001600160a01b039091168152602001610261565b3480156102f257600080fd5b506102ac6103013660046122ee565b6107fc565b34801561031257600080fd5b5061031c600e5481565b604051908152602001610261565b34801561033657600080fd5b5060085461031c565b34801561034b57600080fd5b5061031c60115481565b34801561036157600080fd5b506102ac610370366004612318565b610916565b34801561038157600080fd5b5061031c6103903660046122ee565b610948565b3480156103a157600080fd5b5060125461025590610100900460ff1681565b3480156103c057600080fd5b506012546102559060ff1681565b3480156103da57600080fd5b506102ac6109de565b3480156103ef57600080fd5b506102ac6103fe366004612318565b610a19565b34801561040f57600080fd5b506102ac61041e3660046122be565b610a34565b6102ac6104313660046122be565b610a65565b34801561044257600080fd5b506102ac6104513660046122ee565b610d59565b34801561046257600080fd5b5061031c6104713660046122be565b610e20565b34801561048257600080fd5b506102ac6104913660046123e0565b610eb3565b3480156104a257600080fd5b50600a5460ff16610255565b3480156104ba57600080fd5b506102ce6104c93660046122be565b610ec7565b3480156104da57600080fd5b5061031c6104e9366004612429565b610f27565b3480156104fa57600080fd5b506102ac610fad565b34801561050f57600080fd5b506102ac61051e366004612444565b610fc1565b34801561052f57600080fd5b506102ac61053e3660046122a3565b610fd4565b34801561054f57600080fd5b506102ce61055e3660046122be565b610fef565b34801561056f57600080fd5b5061031c600f5481565b34801561058557600080fd5b50600a5461010090046001600160a01b03166102ce565b3480156105a857600080fd5b5061027f610ffa565b6102ac6105bf3660046122be565b611009565b3480156105d057600080fd5b506102ac6105df3660046124b2565b611212565b3480156105f057600080fd5b506102ac6105ff36600461251e565b61132c565b34801561061057600080fd5b506102ac61061f366004612551565b611337565b34801561063057600080fd5b5061027f61063f3660046122be565b61136f565b34801561065057600080fd5b5061066461065f366004612429565b61145b565b60405161026191906125cd565b34801561067d57600080fd5b5061031c60105481565b34801561069357600080fd5b506102556106a2366004612611565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106dc57600080fd5b506102ac6106eb366004612429565b6114ff565b3480156106fc57600080fd5b506102ac61070b366004612444565b611575565b600061071b82611591565b92915050565b6060600080546107309061263b565b80601f016020809104026020016040519081016040528092919081815260200182805461075c9061263b565b80156107a95780601f1061077e576101008083540402835291602001916107a9565b820191906000526020600020905b81548152906001019060200180831161078c57829003601f168201915b5050505050905090565b6107bb6115b6565b601280549115156101000261ff0019909216919091179055565b60006107e082611616565b506000908152600460205260409020546001600160a01b031690565b600061080782610ec7565b9050806001600160a01b0316836001600160a01b0316036108795760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610895575061089581336106a2565b6109075760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610870565b6109118383611675565b505050565b610921335b826116e3565b61093d5760405162461bcd60e51b815260040161087090612675565b610911838383611762565b600061095383610f27565b82106109b55760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610870565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6109e66115b6565b6040514790339082156108fc029083906000818181858888f19350505050158015610a15573d6000803e3d6000fd5b5050565b61091183838360405180602001604052806000815250611337565b610a3d3361091b565b610a595760405162461bcd60e51b815260040161087090612675565b610a6281611909565b50565b6002600b5403610a875760405162461bcd60e51b8152600401610870906126c3565b6002600b55610a946119b0565b6000610a9f60085490565b601254909150610100900460ff1615610af65760405162461bcd60e51b81526020600482015260196024820152784d696e74696e67206973206e6f74206176616c6961626c652160381b6044820152606401610870565b60008211610b165760405162461bcd60e51b8152600401610870906126fa565b601154610b2233610f27565b10610b3f5760405162461bcd60e51b81526004016108709061273d565b3360009081526013602052604090205460ff16821115610be15760405162461bcd60e51b815260206004820152605160248201527f596f7520617265206e6f7420616c6c6f77656420746f206d696e742c206f722060448201527f796f752061726520747279696e6720746f206d696e74206d6f7265207468616e606482015270103cb7ba9030b9329030b63637bbb2b21760791b608482015260a401610870565b601154821115610bf26011546119f6565b604051602001610c029190612785565b60405160208183030381529060405290610c2f5760405162461bcd60e51b8152600401610870919061227b565b50601054610c3d83836127fa565b1115610c5b5760405162461bcd60e51b81526004016108709061280d565b600a5461010090046001600160a01b03166001600160a01b0316336001600160a01b031614610ce15781600f54610c929190612856565b341015610ce15760405162461bcd60e51b815260206004820152601e60248201527f596f7520646964206e6f742073656e6420656e6f7567682065746865722e00006044820152606401610870565b60015b828111610d1057610cfe33610cf983856127fa565b611af7565b80610d088161286d565b915050610ce4565b5033600090815260136020526040902054610d2f90839060ff16612886565b336000908152601360205260409020805460ff191660ff9290921691909117905550506001600b55565b610d616115b6565b6002600b5403610d835760405162461bcd60e51b8152600401610870906126c3565b6002600b556001600160a01b038216610dde5760405162461bcd60e51b815260206004820152601c60248201527f43616e2774206d696e7420666f72207a65726f206164647265737321000000006044820152606401610870565b6000610de960085490565b905060015b828111610e1557610e0384610cf983856127fa565b80610e0d8161286d565b915050610dee565b50506001600b555050565b6000610e2b60085490565b8210610e8e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610870565b60088281548110610ea157610ea161289f565b90600052602060002001549050919050565b610ebb6115b6565b600d610a158282612903565b6000818152600260205260408120546001600160a01b03168061071b5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610870565b60006001600160a01b038216610f915760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610870565b506001600160a01b031660009081526003602052604090205490565b610fb56115b6565b610fbf6000611b11565b565b610fc96115b6565b600e91909155600f55565b610fdc6115b6565b6012805460ff1916911515919091179055565b600061071b82610ec7565b6060600180546107309061263b565b6002600b540361102b5760405162461bcd60e51b8152600401610870906126c3565b6002600b556110386119b0565b600061104360085490565b60125490915060ff16156110955760405162461bcd60e51b81526020600482015260196024820152784d696e74696e67206973206e6f74206176616c6961626c652160381b6044820152606401610870565b600082116110b55760405162461bcd60e51b8152600401610870906126fa565b6011546110c133610f27565b106110de5760405162461bcd60e51b81526004016108709061273d565b6011548211156110ef6011546119f6565b6040516020016110ff9190612785565b6040516020818303038152906040529061112c5760405162461bcd60e51b8152600401610870919061227b565b5060105461113a83836127fa565b11156111585760405162461bcd60e51b81526004016108709061280d565b600a5461010090046001600160a01b03166001600160a01b0316336001600160a01b0316146111de5781600e5461118f9190612856565b3410156111de5760405162461bcd60e51b815260206004820152601e60248201527f596f7520646964206e6f742073656e6420656e6f7567682065746865722e00006044820152606401610870565b60015b828111611208576111f633610cf983856127fa565b806112008161286d565b9150506111e1565b50506001600b5550565b61121a6115b6565b60005b838110156113255760008585838181106112395761123961289f565b905060200201602081019061124e9190612429565b6001600160a01b0316036112a45760405162461bcd60e51b815260206004820152601b60248201527f43616e27742061646420666f72207a65726f20616464726573732100000000006044820152606401610870565b8282828181106112b6576112b661289f565b90506020020135601360008787858181106112d3576112d361289f565b90506020020160208101906112e89190612429565b6001600160a01b031681526020810191909152604001600020805460ff191660ff929092169190911790558061131d8161286d565b91505061121d565b5050505050565b610a15338383611b6b565b61134133836116e3565b61135d5760405162461bcd60e51b815260040161087090612675565b61136984848484611c39565b50505050565b6000818152600260205260409020546060906001600160a01b03166113f05760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610870565b60006113fb836119f6565b9050600d805461140a9061263b565b90506000036114195792915050565b80511561144b57600d816040516020016114349291906129c3565b604051602081830303815290604052915050919050565b61145483611c6c565b9392505050565b6060600061146883610f27565b67ffffffffffffffff81111561148057611480612354565b6040519080825280602002602001820160405280156114a9578160200160208202803683370190505b50905060005b6114b884610f27565b8110156114f8576114c98482610948565b8282815181106114db576114db61289f565b6020908102919091010152806114f08161286d565b9150506114af565b5092915050565b6115076115b6565b6001600160a01b03811661156c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610870565b610a6281611b11565b61157d6115b6565b601091909155601155565b80546001019055565b60006001600160e01b0319821663780e9d6360e01b148061071b575061071b82611cbc565b600a546001600160a01b03610100909104163314610fbf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b6000818152600260205260409020546001600160a01b0316610a625760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610870565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906116aa82610ec7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806116ef83610ec7565b9050806001600160a01b0316846001600160a01b0316148061173657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061175a5750836001600160a01b031661174f846107d5565b6001600160a01b0316145b949350505050565b826001600160a01b031661177582610ec7565b6001600160a01b0316146117d95760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610870565b6001600160a01b03821661183b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610870565b611846838383611d0c565b611851600082611675565b6001600160a01b038316600090815260036020526040812080546001929061187a908490612a5a565b90915550506001600160a01b03821660009081526003602052604081208054600192906118a89084906127fa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061191482610ec7565b905061192281600084611d0c565b61192d600083611675565b6001600160a01b0381166000908152600360205260408120805460019290611956908490612a5a565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600a5460ff1615610fbf5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610870565b606081600003611a1d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a475780611a318161286d565b9150611a409050600a83612a83565b9150611a21565b60008167ffffffffffffffff811115611a6257611a62612354565b6040519080825280601f01601f191660200182016040528015611a8c576020820181803683370190505b5090505b841561175a57611aa1600183612a5a565b9150611aae600a86612a97565b611ab99060306127fa565b60f81b818381518110611ace57611ace61289f565b60200101906001600160f81b031916908160001a905350611af0600a86612a83565b9450611a90565b610a15828260405180602001604052806000815250611d1f565b600a80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611bcc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610870565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611c44848484611762565b611c5084848484611d52565b6113695760405162461bcd60e51b815260040161087090612aab565b6060611c7782611616565b6000611c81611e53565b90506000815111611ca15760405180602001604052806000815250611454565b80611cab846119f6565b604051602001611434929190612afd565b60006001600160e01b031982166380ac58cd60e01b1480611ced57506001600160e01b03198216635b5e139f60e01b145b8061071b57506301ffc9a760e01b6001600160e01b031983161461071b565b611d146119b0565b610911838383611e62565b611d298383611f1a565b611d366000848484611d52565b6109115760405162461bcd60e51b815260040161087090612aab565b60006001600160a01b0384163b15611e4857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d96903390899088908890600401612b2c565b6020604051808303816000875af1925050508015611dd1575060408051601f3d908101601f19168201909252611dce91810190612b69565b60015b611e2e573d808015611dff576040519150601f19603f3d011682016040523d82523d6000602084013e611e04565b606091505b508051600003611e265760405162461bcd60e51b815260040161087090612aab565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061175a565b506001949350505050565b6060600d80546107309061263b565b6001600160a01b038316611ebd57611eb881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611ee0565b816001600160a01b0316836001600160a01b031614611ee057611ee08382612068565b6001600160a01b038216611ef75761091181612105565b826001600160a01b0316826001600160a01b0316146109115761091182826121b4565b6001600160a01b038216611f705760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610870565b6000818152600260205260409020546001600160a01b031615611fd55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610870565b611fe160008383611d0c565b6001600160a01b038216600090815260036020526040812080546001929061200a9084906127fa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161207584610f27565b61207f9190612a5a565b6000838152600760205260409020549091508082146120d2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061211790600190612a5a565b6000838152600960205260408120546008805493945090928490811061213f5761213f61289f565b9060005260206000200154905080600883815481106121605761216061289f565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061219857612198612b86565b6001900381819060005260206000200160009055905550505050565b60006121bf83610f27565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114610a6257600080fd5b60006020828403121561222057600080fd5b8135611454816121f8565b60005b8381101561224657818101518382015260200161222e565b50506000910152565b6000815180845261226781602086016020860161222b565b601f01601f19169290920160200192915050565b602081526000611454602083018461224f565b8035801515811461229e57600080fd5b919050565b6000602082840312156122b557600080fd5b6114548261228e565b6000602082840312156122d057600080fd5b5035919050565b80356001600160a01b038116811461229e57600080fd5b6000806040838503121561230157600080fd5b61230a836122d7565b946020939093013593505050565b60008060006060848603121561232d57600080fd5b612336846122d7565b9250612344602085016122d7565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561238557612385612354565b604051601f8501601f19908116603f011681019082821181831017156123ad576123ad612354565b816040528093508581528686860111156123c657600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156123f257600080fd5b813567ffffffffffffffff81111561240957600080fd5b8201601f8101841361241a57600080fd5b61175a8482356020840161236a565b60006020828403121561243b57600080fd5b611454826122d7565b6000806040838503121561245757600080fd5b50508035926020909101359150565b60008083601f84011261247857600080fd5b50813567ffffffffffffffff81111561249057600080fd5b6020830191508360208260051b85010111156124ab57600080fd5b9250929050565b600080600080604085870312156124c857600080fd5b843567ffffffffffffffff808211156124e057600080fd5b6124ec88838901612466565b9096509450602087013591508082111561250557600080fd5b5061251287828801612466565b95989497509550505050565b6000806040838503121561253157600080fd5b61253a836122d7565b91506125486020840161228e565b90509250929050565b6000806000806080858703121561256757600080fd5b612570856122d7565b935061257e602086016122d7565b925060408501359150606085013567ffffffffffffffff8111156125a157600080fd5b8501601f810187136125b257600080fd5b6125c18782356020840161236a565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b81811015612605578351835292840192918401916001016125e9565b50909695505050505050565b6000806040838503121561262457600080fd5b61262d836122d7565b9150612548602084016122d7565b600181811c9082168061264f57607f821691505b60208210810361266f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526023908201527f4d696e7420616d6f756e74206d757374206265206d6f7265207468616e207a65604082015262726f2160e81b606082015260800190565b60208082526028908201527f596f75206861766520616c7265616479206d696e74656420796f7572206d61786040820152671030b6b7bab73a1760c11b606082015260800190565b7f596f7520617265206e6f7420616c6c6f77656420746f206d696e74206d6f72658152650103a3430b7160d51b6020820152600082516127cc81602685016020870161222b565b601760f91b6026939091019283015250602701919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561071b5761071b6127e4565b60208082526029908201527f507572636861736520776f756c6420657863656564206d617820737570706c796040820152681037b31027232a399760b91b606082015260800190565b808202811582820484141761071b5761071b6127e4565b60006001820161287f5761287f6127e4565b5060010190565b60ff828116828216039081111561071b5761071b6127e4565b634e487b7160e01b600052603260045260246000fd5b601f82111561091157600081815260208120601f850160051c810160208610156128dc5750805b601f850160051c820191505b818110156128fb578281556001016128e8565b505050505050565b815167ffffffffffffffff81111561291d5761291d612354565b6129318161292b845461263b565b846128b5565b602080601f831160018114612966576000841561294e5750858301515b600019600386901b1c1916600185901b1785556128fb565b600085815260208120601f198616915b8281101561299557888601518255948401946001909101908401612976565b50858210156129b35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008084546129d18161263b565b600182811680156129e957600181146129fe57612a2d565b60ff1984168752821515830287019450612a2d565b8860005260208060002060005b85811015612a245781548a820152908401908201612a0b565b50505082870194505b505050508351612a4181836020880161222b565b64173539b7b760d91b9101908152600501949350505050565b8181038181111561071b5761071b6127e4565b634e487b7160e01b600052601260045260246000fd5b600082612a9257612a92612a6d565b500490565b600082612aa657612aa6612a6d565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008351612b0f81846020880161222b565b835190830190612b2381836020880161222b565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b5f9083018461224f565b9695505050505050565b600060208284031215612b7b57600080fd5b8151611454816121f8565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220826f9ec3df73c362f9f95154ed35a3555546abb811c986dbba75e9b39947498c64736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000154174686c6574654865726f2053686f65626f786573000000000000000000000000000000000000000000000000000000000000000000000000000000000000034148530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f6d6574612e6174686c6574656865726f2e636f6d2f73686f65626f782f6a736f6e2f00000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102305760003560e01c80635c975abb1161012e578063a0712d68116100ab578063d004b0361161006f578063d004b03614610644578063d5abeb0114610671578063e985e9c514610687578063f2fde38b146106d0578063fc784d49146106f057600080fd5b8063a0712d68146105b1578063a0d41d9f146105c4578063a22cb465146105e4578063b88d4fde14610604578063c87b56dd1461062457600080fd5b80637a4172c6116100f25780637a4172c6146105235780638363871014610543578063897dd5ef146105635780638da5cb5b1461057957806395d89b411461059c57600080fd5b80635c975abb146104965780636352211e146104ae57806370a08231146104ce578063715018a6146104ee5780637696e0881461050357600080fd5b80632f745c59116101bc57806342966c681161018057806342966c68146104035780634618163e14610423578063484b973c146104365780634f6ccce71461045657806355f804b31461047657600080fd5b80632f745c591461037557806335ac3bcc146103955780633886a196146103b45780633ccfd60b146103ce57806342842e0e146103e357600080fd5b8063095ea7b311610203578063095ea7b3146102e657806313faede61461030657806318160ddd1461032a578063239c70ae1461033f57806323b872dd1461035557600080fd5b806301ffc9a71461023557806306fdde031461026a57806307021ec91461028c578063081812fc146102ae575b600080fd5b34801561024157600080fd5b5061025561025036600461220e565b610710565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061027f610721565b604051610261919061227b565b34801561029857600080fd5b506102ac6102a73660046122a3565b6107b3565b005b3480156102ba57600080fd5b506102ce6102c93660046122be565b6107d5565b6040516001600160a01b039091168152602001610261565b3480156102f257600080fd5b506102ac6103013660046122ee565b6107fc565b34801561031257600080fd5b5061031c600e5481565b604051908152602001610261565b34801561033657600080fd5b5060085461031c565b34801561034b57600080fd5b5061031c60115481565b34801561036157600080fd5b506102ac610370366004612318565b610916565b34801561038157600080fd5b5061031c6103903660046122ee565b610948565b3480156103a157600080fd5b5060125461025590610100900460ff1681565b3480156103c057600080fd5b506012546102559060ff1681565b3480156103da57600080fd5b506102ac6109de565b3480156103ef57600080fd5b506102ac6103fe366004612318565b610a19565b34801561040f57600080fd5b506102ac61041e3660046122be565b610a34565b6102ac6104313660046122be565b610a65565b34801561044257600080fd5b506102ac6104513660046122ee565b610d59565b34801561046257600080fd5b5061031c6104713660046122be565b610e20565b34801561048257600080fd5b506102ac6104913660046123e0565b610eb3565b3480156104a257600080fd5b50600a5460ff16610255565b3480156104ba57600080fd5b506102ce6104c93660046122be565b610ec7565b3480156104da57600080fd5b5061031c6104e9366004612429565b610f27565b3480156104fa57600080fd5b506102ac610fad565b34801561050f57600080fd5b506102ac61051e366004612444565b610fc1565b34801561052f57600080fd5b506102ac61053e3660046122a3565b610fd4565b34801561054f57600080fd5b506102ce61055e3660046122be565b610fef565b34801561056f57600080fd5b5061031c600f5481565b34801561058557600080fd5b50600a5461010090046001600160a01b03166102ce565b3480156105a857600080fd5b5061027f610ffa565b6102ac6105bf3660046122be565b611009565b3480156105d057600080fd5b506102ac6105df3660046124b2565b611212565b3480156105f057600080fd5b506102ac6105ff36600461251e565b61132c565b34801561061057600080fd5b506102ac61061f366004612551565b611337565b34801561063057600080fd5b5061027f61063f3660046122be565b61136f565b34801561065057600080fd5b5061066461065f366004612429565b61145b565b60405161026191906125cd565b34801561067d57600080fd5b5061031c60105481565b34801561069357600080fd5b506102556106a2366004612611565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106dc57600080fd5b506102ac6106eb366004612429565b6114ff565b3480156106fc57600080fd5b506102ac61070b366004612444565b611575565b600061071b82611591565b92915050565b6060600080546107309061263b565b80601f016020809104026020016040519081016040528092919081815260200182805461075c9061263b565b80156107a95780601f1061077e576101008083540402835291602001916107a9565b820191906000526020600020905b81548152906001019060200180831161078c57829003601f168201915b5050505050905090565b6107bb6115b6565b601280549115156101000261ff0019909216919091179055565b60006107e082611616565b506000908152600460205260409020546001600160a01b031690565b600061080782610ec7565b9050806001600160a01b0316836001600160a01b0316036108795760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610895575061089581336106a2565b6109075760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610870565b6109118383611675565b505050565b610921335b826116e3565b61093d5760405162461bcd60e51b815260040161087090612675565b610911838383611762565b600061095383610f27565b82106109b55760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610870565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6109e66115b6565b6040514790339082156108fc029083906000818181858888f19350505050158015610a15573d6000803e3d6000fd5b5050565b61091183838360405180602001604052806000815250611337565b610a3d3361091b565b610a595760405162461bcd60e51b815260040161087090612675565b610a6281611909565b50565b6002600b5403610a875760405162461bcd60e51b8152600401610870906126c3565b6002600b55610a946119b0565b6000610a9f60085490565b601254909150610100900460ff1615610af65760405162461bcd60e51b81526020600482015260196024820152784d696e74696e67206973206e6f74206176616c6961626c652160381b6044820152606401610870565b60008211610b165760405162461bcd60e51b8152600401610870906126fa565b601154610b2233610f27565b10610b3f5760405162461bcd60e51b81526004016108709061273d565b3360009081526013602052604090205460ff16821115610be15760405162461bcd60e51b815260206004820152605160248201527f596f7520617265206e6f7420616c6c6f77656420746f206d696e742c206f722060448201527f796f752061726520747279696e6720746f206d696e74206d6f7265207468616e606482015270103cb7ba9030b9329030b63637bbb2b21760791b608482015260a401610870565b601154821115610bf26011546119f6565b604051602001610c029190612785565b60405160208183030381529060405290610c2f5760405162461bcd60e51b8152600401610870919061227b565b50601054610c3d83836127fa565b1115610c5b5760405162461bcd60e51b81526004016108709061280d565b600a5461010090046001600160a01b03166001600160a01b0316336001600160a01b031614610ce15781600f54610c929190612856565b341015610ce15760405162461bcd60e51b815260206004820152601e60248201527f596f7520646964206e6f742073656e6420656e6f7567682065746865722e00006044820152606401610870565b60015b828111610d1057610cfe33610cf983856127fa565b611af7565b80610d088161286d565b915050610ce4565b5033600090815260136020526040902054610d2f90839060ff16612886565b336000908152601360205260409020805460ff191660ff9290921691909117905550506001600b55565b610d616115b6565b6002600b5403610d835760405162461bcd60e51b8152600401610870906126c3565b6002600b556001600160a01b038216610dde5760405162461bcd60e51b815260206004820152601c60248201527f43616e2774206d696e7420666f72207a65726f206164647265737321000000006044820152606401610870565b6000610de960085490565b905060015b828111610e1557610e0384610cf983856127fa565b80610e0d8161286d565b915050610dee565b50506001600b555050565b6000610e2b60085490565b8210610e8e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610870565b60088281548110610ea157610ea161289f565b90600052602060002001549050919050565b610ebb6115b6565b600d610a158282612903565b6000818152600260205260408120546001600160a01b03168061071b5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610870565b60006001600160a01b038216610f915760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610870565b506001600160a01b031660009081526003602052604090205490565b610fb56115b6565b610fbf6000611b11565b565b610fc96115b6565b600e91909155600f55565b610fdc6115b6565b6012805460ff1916911515919091179055565b600061071b82610ec7565b6060600180546107309061263b565b6002600b540361102b5760405162461bcd60e51b8152600401610870906126c3565b6002600b556110386119b0565b600061104360085490565b60125490915060ff16156110955760405162461bcd60e51b81526020600482015260196024820152784d696e74696e67206973206e6f74206176616c6961626c652160381b6044820152606401610870565b600082116110b55760405162461bcd60e51b8152600401610870906126fa565b6011546110c133610f27565b106110de5760405162461bcd60e51b81526004016108709061273d565b6011548211156110ef6011546119f6565b6040516020016110ff9190612785565b6040516020818303038152906040529061112c5760405162461bcd60e51b8152600401610870919061227b565b5060105461113a83836127fa565b11156111585760405162461bcd60e51b81526004016108709061280d565b600a5461010090046001600160a01b03166001600160a01b0316336001600160a01b0316146111de5781600e5461118f9190612856565b3410156111de5760405162461bcd60e51b815260206004820152601e60248201527f596f7520646964206e6f742073656e6420656e6f7567682065746865722e00006044820152606401610870565b60015b828111611208576111f633610cf983856127fa565b806112008161286d565b9150506111e1565b50506001600b5550565b61121a6115b6565b60005b838110156113255760008585838181106112395761123961289f565b905060200201602081019061124e9190612429565b6001600160a01b0316036112a45760405162461bcd60e51b815260206004820152601b60248201527f43616e27742061646420666f72207a65726f20616464726573732100000000006044820152606401610870565b8282828181106112b6576112b661289f565b90506020020135601360008787858181106112d3576112d361289f565b90506020020160208101906112e89190612429565b6001600160a01b031681526020810191909152604001600020805460ff191660ff929092169190911790558061131d8161286d565b91505061121d565b5050505050565b610a15338383611b6b565b61134133836116e3565b61135d5760405162461bcd60e51b815260040161087090612675565b61136984848484611c39565b50505050565b6000818152600260205260409020546060906001600160a01b03166113f05760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610870565b60006113fb836119f6565b9050600d805461140a9061263b565b90506000036114195792915050565b80511561144b57600d816040516020016114349291906129c3565b604051602081830303815290604052915050919050565b61145483611c6c565b9392505050565b6060600061146883610f27565b67ffffffffffffffff81111561148057611480612354565b6040519080825280602002602001820160405280156114a9578160200160208202803683370190505b50905060005b6114b884610f27565b8110156114f8576114c98482610948565b8282815181106114db576114db61289f565b6020908102919091010152806114f08161286d565b9150506114af565b5092915050565b6115076115b6565b6001600160a01b03811661156c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610870565b610a6281611b11565b61157d6115b6565b601091909155601155565b80546001019055565b60006001600160e01b0319821663780e9d6360e01b148061071b575061071b82611cbc565b600a546001600160a01b03610100909104163314610fbf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610870565b6000818152600260205260409020546001600160a01b0316610a625760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610870565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906116aa82610ec7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806116ef83610ec7565b9050806001600160a01b0316846001600160a01b0316148061173657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061175a5750836001600160a01b031661174f846107d5565b6001600160a01b0316145b949350505050565b826001600160a01b031661177582610ec7565b6001600160a01b0316146117d95760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610870565b6001600160a01b03821661183b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610870565b611846838383611d0c565b611851600082611675565b6001600160a01b038316600090815260036020526040812080546001929061187a908490612a5a565b90915550506001600160a01b03821660009081526003602052604081208054600192906118a89084906127fa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061191482610ec7565b905061192281600084611d0c565b61192d600083611675565b6001600160a01b0381166000908152600360205260408120805460019290611956908490612a5a565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600a5460ff1615610fbf5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610870565b606081600003611a1d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a475780611a318161286d565b9150611a409050600a83612a83565b9150611a21565b60008167ffffffffffffffff811115611a6257611a62612354565b6040519080825280601f01601f191660200182016040528015611a8c576020820181803683370190505b5090505b841561175a57611aa1600183612a5a565b9150611aae600a86612a97565b611ab99060306127fa565b60f81b818381518110611ace57611ace61289f565b60200101906001600160f81b031916908160001a905350611af0600a86612a83565b9450611a90565b610a15828260405180602001604052806000815250611d1f565b600a80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611bcc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610870565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611c44848484611762565b611c5084848484611d52565b6113695760405162461bcd60e51b815260040161087090612aab565b6060611c7782611616565b6000611c81611e53565b90506000815111611ca15760405180602001604052806000815250611454565b80611cab846119f6565b604051602001611434929190612afd565b60006001600160e01b031982166380ac58cd60e01b1480611ced57506001600160e01b03198216635b5e139f60e01b145b8061071b57506301ffc9a760e01b6001600160e01b031983161461071b565b611d146119b0565b610911838383611e62565b611d298383611f1a565b611d366000848484611d52565b6109115760405162461bcd60e51b815260040161087090612aab565b60006001600160a01b0384163b15611e4857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d96903390899088908890600401612b2c565b6020604051808303816000875af1925050508015611dd1575060408051601f3d908101601f19168201909252611dce91810190612b69565b60015b611e2e573d808015611dff576040519150601f19603f3d011682016040523d82523d6000602084013e611e04565b606091505b508051600003611e265760405162461bcd60e51b815260040161087090612aab565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061175a565b506001949350505050565b6060600d80546107309061263b565b6001600160a01b038316611ebd57611eb881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611ee0565b816001600160a01b0316836001600160a01b031614611ee057611ee08382612068565b6001600160a01b038216611ef75761091181612105565b826001600160a01b0316826001600160a01b0316146109115761091182826121b4565b6001600160a01b038216611f705760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610870565b6000818152600260205260409020546001600160a01b031615611fd55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610870565b611fe160008383611d0c565b6001600160a01b038216600090815260036020526040812080546001929061200a9084906127fa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161207584610f27565b61207f9190612a5a565b6000838152600760205260409020549091508082146120d2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061211790600190612a5a565b6000838152600960205260408120546008805493945090928490811061213f5761213f61289f565b9060005260206000200154905080600883815481106121605761216061289f565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061219857612198612b86565b6001900381819060005260206000200160009055905550505050565b60006121bf83610f27565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114610a6257600080fd5b60006020828403121561222057600080fd5b8135611454816121f8565b60005b8381101561224657818101518382015260200161222e565b50506000910152565b6000815180845261226781602086016020860161222b565b601f01601f19169290920160200192915050565b602081526000611454602083018461224f565b8035801515811461229e57600080fd5b919050565b6000602082840312156122b557600080fd5b6114548261228e565b6000602082840312156122d057600080fd5b5035919050565b80356001600160a01b038116811461229e57600080fd5b6000806040838503121561230157600080fd5b61230a836122d7565b946020939093013593505050565b60008060006060848603121561232d57600080fd5b612336846122d7565b9250612344602085016122d7565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561238557612385612354565b604051601f8501601f19908116603f011681019082821181831017156123ad576123ad612354565b816040528093508581528686860111156123c657600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156123f257600080fd5b813567ffffffffffffffff81111561240957600080fd5b8201601f8101841361241a57600080fd5b61175a8482356020840161236a565b60006020828403121561243b57600080fd5b611454826122d7565b6000806040838503121561245757600080fd5b50508035926020909101359150565b60008083601f84011261247857600080fd5b50813567ffffffffffffffff81111561249057600080fd5b6020830191508360208260051b85010111156124ab57600080fd5b9250929050565b600080600080604085870312156124c857600080fd5b843567ffffffffffffffff808211156124e057600080fd5b6124ec88838901612466565b9096509450602087013591508082111561250557600080fd5b5061251287828801612466565b95989497509550505050565b6000806040838503121561253157600080fd5b61253a836122d7565b91506125486020840161228e565b90509250929050565b6000806000806080858703121561256757600080fd5b612570856122d7565b935061257e602086016122d7565b925060408501359150606085013567ffffffffffffffff8111156125a157600080fd5b8501601f810187136125b257600080fd5b6125c18782356020840161236a565b91505092959194509250565b6020808252825182820181905260009190848201906040850190845b81811015612605578351835292840192918401916001016125e9565b50909695505050505050565b6000806040838503121561262457600080fd5b61262d836122d7565b9150612548602084016122d7565b600181811c9082168061264f57607f821691505b60208210810361266f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526023908201527f4d696e7420616d6f756e74206d757374206265206d6f7265207468616e207a65604082015262726f2160e81b606082015260800190565b60208082526028908201527f596f75206861766520616c7265616479206d696e74656420796f7572206d61786040820152671030b6b7bab73a1760c11b606082015260800190565b7f596f7520617265206e6f7420616c6c6f77656420746f206d696e74206d6f72658152650103a3430b7160d51b6020820152600082516127cc81602685016020870161222b565b601760f91b6026939091019283015250602701919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561071b5761071b6127e4565b60208082526029908201527f507572636861736520776f756c6420657863656564206d617820737570706c796040820152681037b31027232a399760b91b606082015260800190565b808202811582820484141761071b5761071b6127e4565b60006001820161287f5761287f6127e4565b5060010190565b60ff828116828216039081111561071b5761071b6127e4565b634e487b7160e01b600052603260045260246000fd5b601f82111561091157600081815260208120601f850160051c810160208610156128dc5750805b601f850160051c820191505b818110156128fb578281556001016128e8565b505050505050565b815167ffffffffffffffff81111561291d5761291d612354565b6129318161292b845461263b565b846128b5565b602080601f831160018114612966576000841561294e5750858301515b600019600386901b1c1916600185901b1785556128fb565b600085815260208120601f198616915b8281101561299557888601518255948401946001909101908401612976565b50858210156129b35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008084546129d18161263b565b600182811680156129e957600181146129fe57612a2d565b60ff1984168752821515830287019450612a2d565b8860005260208060002060005b85811015612a245781548a820152908401908201612a0b565b50505082870194505b505050508351612a4181836020880161222b565b64173539b7b760d91b9101908152600501949350505050565b8181038181111561071b5761071b6127e4565b634e487b7160e01b600052601260045260246000fd5b600082612a9257612a92612a6d565b500490565b600082612aa657612aa6612a6d565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008351612b0f81846020880161222b565b835190830190612b2381836020880161222b565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b5f9083018461224f565b9695505050505050565b600060208284031215612b7b57600080fd5b8151611454816121f8565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220826f9ec3df73c362f9f95154ed35a3555546abb811c986dbba75e9b39947498c64736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000154174686c6574654865726f2053686f65626f786573000000000000000000000000000000000000000000000000000000000000000000000000000000000000034148530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a68747470733a2f2f6d6574612e6174686c6574656865726f2e636f6d2f73686f65626f782f6a736f6e2f00000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): AthleteHero Shoeboxes
Arg [1] : _symbol (string): AHS
Arg [2] : _initBaseURI (string): https://meta.athletehero.com/shoebox/json/

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [4] : 4174686c6574654865726f2053686f65626f7865730000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 4148530000000000000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000002a
Arg [8] : 68747470733a2f2f6d6574612e6174686c6574656865726f2e636f6d2f73686f
Arg [9] : 65626f782f6a736f6e2f00000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

54523:5737:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59896:212;;;;;;;;;;-1:-1:-1;59896:212:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;59896:212:0;;;;;;;;33623:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;55592:115::-;;;;;;;;;;-1:-1:-1;55592:115:0;;;;;:::i;:::-;;:::i;:::-;;35136:171;;;;;;;;;;-1:-1:-1;35136:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2047:32:1;;;2029:51;;2017:2;2002:18;35136:171:0;1883:203:1;34653:417:0;;;;;;;;;;-1:-1:-1;34653:417:0;;;;;:::i;:::-;;:::i;54740:29::-;;;;;;;;;;;;;;;;;;;2674:25:1;;;2662:2;2647:18;54740:29:0;2528:177:1;48317:113:0;;;;;;;;;;-1:-1:-1;48405:10:0;:17;48317:113;;54850:32;;;;;;;;;;;;;;;;35836:336;;;;;;;;;;-1:-1:-1;35836:336:0;;;;;:::i;:::-;;:::i;47985:256::-;;;;;;;;;;-1:-1:-1;47985:256:0;;;;;:::i;:::-;;:::i;54926:37::-;;;;;;;;;;-1:-1:-1;54926:37:0;;;;;;;;;;;54886:36;;;;;;;;;;-1:-1:-1;54886:36:0;;;;;;;;60114:143;;;;;;;;;;;;;:::i;36243:185::-;;;;;;;;;;-1:-1:-1;36243:185:0;;;;;:::i;:::-;;:::i;46416:243::-;;;;;;;;;;-1:-1:-1;46416:243:0;;;;;:::i;:::-;;:::i;57551:1096::-;;;;;;:::i;:::-;;:::i;56371:302::-;;;;;;;;;;-1:-1:-1;56371:302:0;;;;;:::i;:::-;;:::i;48507:233::-;;;;;;;;;;-1:-1:-1;48507:233:0;;;;;:::i;:::-;;:::i;55351:104::-;;;;;;;;;;-1:-1:-1;55351:104:0;;;;;:::i;:::-;;:::i;11987:86::-;;;;;;;;;;-1:-1:-1;12058:7:0;;;;11987:86;;33334:222;;;;;;;;;;-1:-1:-1;33334:222:0;;;;;:::i;:::-;;:::i;33065:207::-;;;;;;;;;;-1:-1:-1;33065:207:0;;;;;:::i;:::-;;:::i;9497:103::-;;;;;;;;;;;;;:::i;55890:144::-;;;;;;;;;;-1:-1:-1;55890:144:0;;;;;:::i;:::-;;:::i;55472:111::-;;;;;;;;;;-1:-1:-1;55472:111:0;;;;;:::i;:::-;;:::i;59166:119::-;;;;;;;;;;-1:-1:-1;59166:119:0;;;;;:::i;:::-;;:::i;54773:38::-;;;;;;;;;;;;;;;;8849:87;;;;;;;;;;-1:-1:-1;8922:6:0;;;;;-1:-1:-1;;;;;8922:6:0;8849:87;;33792:104;;;;;;;;;;;;;:::i;56682:860::-;;;;;;:::i;:::-;;:::i;56043:320::-;;;;;;;;;;-1:-1:-1;56043:320:0;;;;;:::i;:::-;;:::i;35379:155::-;;;;;;;;;;-1:-1:-1;35379:155:0;;;;;:::i;:::-;;:::i;36499:323::-;;;;;;;;;;-1:-1:-1;36499:323:0;;;;;:::i;:::-;;:::i;58659:501::-;;;;;;;;;;-1:-1:-1;58659:501:0;;;;;:::i;:::-;;:::i;59291:358::-;;;;;;;;;;-1:-1:-1;59291:358:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;54815:31::-;;;;;;;;;;;;;;;;35605:164;;;;;;;;;;-1:-1:-1;35605:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;35726:25:0;;;35702:4;35726:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;35605:164;9755:201;;;;;;;;;;-1:-1:-1;9755:201:0;;;;;:::i;:::-;;:::i;55716:165::-;;;;;;;;;;-1:-1:-1;55716:165:0;;;;;:::i;:::-;;:::i;59896:212::-;60035:4;60064:36;60088:11;60064:23;:36::i;:::-;60057:43;59896:212;-1:-1:-1;;59896:212:0:o;33623:100::-;33677:13;33710:5;33703:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33623:100;:::o;55592:115::-;8735:13;:11;:13::i;:::-;55667:18:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;55667:32:0;;::::1;::::0;;;::::1;::::0;;55592:115::o;35136:171::-;35212:7;35232:23;35247:7;35232:14;:23::i;:::-;-1:-1:-1;35275:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;35275:24:0;;35136:171::o;34653:417::-;34734:13;34750:23;34765:7;34750:14;:23::i;:::-;34734:39;;34798:5;-1:-1:-1;;;;;34792:11:0;:2;-1:-1:-1;;;;;34792:11:0;;34784:57;;;;-1:-1:-1;;;34784:57:0;;8282:2:1;34784:57:0;;;8264:21:1;8321:2;8301:18;;;8294:30;8360:34;8340:18;;;8333:62;-1:-1:-1;;;8411:18:1;;;8404:31;8452:19;;34784:57:0;;;;;;;;;7480:10;-1:-1:-1;;;;;34876:21:0;;;;:62;;-1:-1:-1;34901:37:0;34918:5;7480:10;35605:164;:::i;34901:37::-;34854:174;;;;-1:-1:-1;;;34854:174:0;;8684:2:1;34854:174:0;;;8666:21:1;8723:2;8703:18;;;8696:30;8762:34;8742:18;;;8735:62;8833:32;8813:18;;;8806:60;8883:19;;34854:174:0;8482:426:1;34854:174:0;35041:21;35050:2;35054:7;35041:8;:21::i;:::-;34723:347;34653:417;;:::o;35836:336::-;36031:41;7480:10;36050:12;36064:7;36031:18;:41::i;:::-;36023:100;;;;-1:-1:-1;;;36023:100:0;;;;;;;:::i;:::-;36136:28;36146:4;36152:2;36156:7;36136:9;:28::i;47985:256::-;48082:7;48118:23;48135:5;48118:16;:23::i;:::-;48110:5;:31;48102:87;;;;-1:-1:-1;;;48102:87:0;;9530:2:1;48102:87:0;;;9512:21:1;9569:2;9549:18;;;9542:30;9608:34;9588:18;;;9581:62;-1:-1:-1;;;9659:18:1;;;9652:41;9710:19;;48102:87:0;9328:407:1;48102:87:0;-1:-1:-1;;;;;;48207:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;47985:256::o;60114:143::-;8735:13;:11;:13::i;:::-;60212:37:::1;::::0;60180:21:::1;::::0;60220:10:::1;::::0;60212:37;::::1;;;::::0;60180:21;;60162:15:::1;60212:37:::0;60162:15;60212:37;60180:21;60220:10;60212:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;60151:106;60114:143::o:0;36243:185::-;36381:39;36398:4;36404:2;36408:7;36381:39;;;;;;;;;;;;:16;:39::i;46416:243::-;46534:41;7480:10;46553:12;7400:98;46534:41;46526:100;;;;-1:-1:-1;;;46526:100:0;;;;;;;:::i;:::-;46637:14;46643:7;46637:5;:14::i;:::-;46416:243;:::o;57551:1096::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;11592:19:::1;:17;:19::i;:::-;57647:14:::2;57664:13;48405:10:::0;:17;;48317:113;57664:13:::2;57696:18;::::0;57647:30;;-1:-1:-1;57696:18:0::2;::::0;::::2;;;57695:19;57687:56;;;::::0;-1:-1:-1;;;57687:56:0;;10302:2:1;57687:56:0::2;::::0;::::2;10284:21:1::0;10341:2;10321:18;;;10314:30;-1:-1:-1;;;10360:18:1;;;10353:55;10425:18;;57687:56:0::2;10100:349:1::0;57687:56:0::2;57775:1;57761:11;:15;57753:62;;;;-1:-1:-1::0;;;57753:62:0::2;;;;;;;:::i;:::-;57861:13;;57830:28;57847:10;57830:16;:28::i;:::-;:44;57822:96;;;;-1:-1:-1::0;;;57822:96:0::2;;;;;;;:::i;:::-;57958:10;57948:21;::::0;;;:9:::2;:21;::::0;;;;;::::2;;57933:36:::0;::::2;;57925:129;;;::::0;-1:-1:-1;;;57925:129:0;;11469:2:1;57925:129:0::2;::::0;::::2;11451:21:1::0;11508:2;11488:18;;;11481:30;11547:34;11527:18;;;11520:62;11618:34;11598:18;;;11591:62;-1:-1:-1;;;11669:19:1;;;11662:48;11727:19;;57925:129:0::2;11267:485:1::0;57925:129:0::2;58087:13;;58072:11;:28;;58166:31;58183:13;;58166:16;:31::i;:::-;58108:94;;;;;;;;:::i;:::-;;;;;;;;;;;;;58064:140;;;;;-1:-1:-1::0;;;58064:140:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;58246:9:0::2;::::0;58222:20:::2;58231:11:::0;58222:6;:20:::2;:::i;:::-;:33;;58214:86;;;;-1:-1:-1::0;;;58214:86:0::2;;;;;;;:::i;:::-;8922:6:::0;;;;;-1:-1:-1;;;;;8922:6:0;-1:-1:-1;;;;;58314:21:0::2;:10;-1:-1:-1::0;;;;;58314:21:0::2;;58310:137;;58391:11;58375:13;;:27;;;;:::i;:::-;58362:9;:40;;58354:82;;;::::0;-1:-1:-1;;;58354:82:0;;13465:2:1;58354:82:0::2;::::0;::::2;13447:21:1::0;13504:2;13484:18;;;13477:30;13543:32;13523:18;;;13516:60;13593:18;;58354:82:0::2;13263:354:1::0;58354:82:0::2;58473:1;58456:104;58481:11;58476:1;:16;58456:104;;58516:33;58526:10;58538;58547:1:::0;58538:6;:10:::2;:::i;:::-;58516:9;:33::i;:::-;58494:3:::0;::::2;::::0;::::2;:::i;:::-;;;;58456:104;;;-1:-1:-1::0;58606:10:0::2;58596:21;::::0;;;:9:::2;:21;::::0;;;;;58590:49:::2;::::0;58627:11;;58596:21:::2;;58590:49;:::i;:::-;58576:10;58566:21;::::0;;;:9:::2;:21;::::0;;;;:73;;-1:-1:-1;;58566:73:0::2;;::::0;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;2722:7:0;:22;57551:1096::o;56371:302::-;8735:13;:11;:13::i;:::-;1812:1:::1;2410:7;;:19:::0;2402:63:::1;;;;-1:-1:-1::0;;;2402:63:0::1;;;;;;;:::i;:::-;1812:1;2543:7;:18:::0;-1:-1:-1;;;;;56471:16:0;::::2;56463:56;;;::::0;-1:-1:-1;;;56463:56:0;;14120:2:1;56463:56:0::2;::::0;::::2;14102:21:1::0;14159:2;14139:18;;;14132:30;14198;14178:18;;;14171:58;14246:18;;56463:56:0::2;13918:352:1::0;56463:56:0::2;56530:14;56547:13;48405:10:::0;:17;;48317:113;56547:13:::2;56530:30:::0;-1:-1:-1;56587:1:0::2;56570:96;56595:11;56590:1;:16;56570:96;;56630:25;56640:2:::0;56644:10:::2;56653:1:::0;56644:6;:10:::2;:::i;56630:25::-;56608:3:::0;::::2;::::0;::::2;:::i;:::-;;;;56570:96;;;-1:-1:-1::0;;1768:1:0::1;2722:7;:22:::0;-1:-1:-1;;56371:302:0:o;48507:233::-;48582:7;48618:30;48405:10;:17;;48317:113;48618:30;48610:5;:38;48602:95;;;;-1:-1:-1;;;48602:95:0;;14477:2:1;48602:95:0;;;14459:21:1;14516:2;14496:18;;;14489:30;14555:34;14535:18;;;14528:62;-1:-1:-1;;;14606:18:1;;;14599:42;14658:19;;48602:95:0;14275:408:1;48602:95:0;48715:10;48726:5;48715:17;;;;;;;;:::i;:::-;;;;;;;;;48708:24;;48507:233;;;:::o;55351:104::-;8735:13;:11;:13::i;:::-;55426:7:::1;:21;55436:11:::0;55426:7;:21:::1;:::i;33334:222::-:0;33406:7;33442:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33442:16:0;;33469:56;;;;-1:-1:-1;;;33469:56:0;;17226:2:1;33469:56:0;;;17208:21:1;17265:2;17245:18;;;17238:30;-1:-1:-1;;;17284:18:1;;;17277:54;17348:18;;33469:56:0;17024:348:1;33065:207:0;33137:7;-1:-1:-1;;;;;33165:19:0;;33157:73;;;;-1:-1:-1;;;33157:73:0;;17579:2:1;33157:73:0;;;17561:21:1;17618:2;17598:18;;;17591:30;17657:34;17637:18;;;17630:62;-1:-1:-1;;;17708:18:1;;;17701:39;17757:19;;33157:73:0;17377:405:1;33157:73:0;-1:-1:-1;;;;;;33248:16:0;;;;;:9;:16;;;;;;;33065:207::o;9497:103::-;8735:13;:11;:13::i;:::-;9562:30:::1;9589:1;9562:18;:30::i;:::-;9497:103::o:0;55890:144::-;8735:13;:11;:13::i;:::-;55973:4:::1;:12:::0;;;;55996:13:::1;:30:::0;55890:144::o;55472:111::-;8735:13;:11;:13::i;:::-;55545:16:::1;:30:::0;;-1:-1:-1;;55545:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55472:111::o;59166:119::-;59226:13;59260:16;59268:7;59260;:16::i;33792:104::-;33848:13;33881:7;33874:14;;;;;:::i;56682:860::-;1812:1;2410:7;;:19;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:7;:18;11592:19:::1;:17;:19::i;:::-;56769:14:::2;56786:13;48405:10:::0;:17;;48317:113;56786:13:::2;56818:16;::::0;56769:30;;-1:-1:-1;56818:16:0::2;;56817:17;56809:54;;;::::0;-1:-1:-1;;;56809:54:0;;10302:2:1;56809:54:0::2;::::0;::::2;10284:21:1::0;10341:2;10321:18;;;10314:30;-1:-1:-1;;;10360:18:1;;;10353:55;10425:18;;56809:54:0::2;10100:349:1::0;56809:54:0::2;56895:1;56881:11;:15;56873:62;;;;-1:-1:-1::0;;;56873:62:0::2;;;;;;;:::i;:::-;56981:13;;56950:28;56967:10;56950:16;:28::i;:::-;:44;56942:96;;;;-1:-1:-1::0;;;56942:96:0::2;;;;;;;:::i;:::-;57071:13;;57056:11;:28;;57150:31;57167:13;;57150:16;:31::i;:::-;57092:94;;;;;;;;:::i;:::-;;;;;;;;;;;;;57048:140;;;;;-1:-1:-1::0;;;57048:140:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;57230:9:0::2;::::0;57206:20:::2;57215:11:::0;57206:6;:20:::2;:::i;:::-;:33;;57198:86;;;;-1:-1:-1::0;;;57198:86:0::2;;;;;;;:::i;:::-;8922:6:::0;;;;;-1:-1:-1;;;;;8922:6:0;-1:-1:-1;;;;;57298:21:0::2;:10;-1:-1:-1::0;;;;;57298:21:0::2;;57294:128;;57366:11;57359:4;;:18;;;;:::i;:::-;57346:9;:31;;57338:73;;;::::0;-1:-1:-1;;;57338:73:0;;13465:2:1;57338:73:0::2;::::0;::::2;13447:21:1::0;13504:2;13484:18;;;13477:30;13543:32;13523:18;;;13516:60;13593:18;;57338:73:0::2;13263:354:1::0;57338:73:0::2;57448:1;57431:104;57456:11;57451:1;:16;57431:104;;57491:33;57501:10;57513;57522:1:::0;57513:6;:10:::2;:::i;57491:33::-;57469:3:::0;::::2;::::0;::::2;:::i;:::-;;;;57431:104;;;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;56682:860:0:o;56043:320::-;8735:13;:11;:13::i;:::-;56158:6:::1;56153:203;56170:20:::0;;::::1;56153:203;;;56244:1;56220:9:::0;;56230:1;56220:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56220:26:0::1;::::0;56212:65:::1;;;::::0;-1:-1:-1;;;56212:65:0;;17989:2:1;56212:65:0::1;::::0;::::1;17971:21:1::0;18028:2;18008:18;;;18001:30;18067:29;18047:18;;;18040:57;18114:18;;56212:65:0::1;17787:351:1::0;56212:65:0::1;56329:11;;56341:1;56329:14;;;;;;;:::i;:::-;;;;;;;56296:9;:23;56306:9;;56316:1;56306:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56296:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;56296:23:0;:48;;-1:-1:-1;;56296:48:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;56192:3;::::1;::::0;::::1;:::i;:::-;;;;56153:203;;;;56043:320:::0;;;;:::o;35379:155::-;35474:52;7480:10;35507:8;35517;35474:18;:52::i;36499:323::-;36673:41;7480:10;36706:7;36673:18;:41::i;:::-;36665:100;;;;-1:-1:-1;;;36665:100:0;;;;;;;:::i;:::-;36776:38;36790:4;36796:2;36800:7;36809:4;36776:13;:38::i;:::-;36499:323;;;;:::o;58659:501::-;38394:4;38418:16;;;:7;:16;;;;;;58724:13;;-1:-1:-1;;;;;38418:16:0;58756:78;;;;-1:-1:-1;;;58756:78:0;;18345:2:1;58756:78:0;;;18327:21:1;18384:2;18364:18;;;18357:30;18423:34;18403:18;;;18396:62;-1:-1:-1;;;18474:18:1;;;18467:47;18531:19;;58756:78:0;18143:413:1;58756:78:0;58841:22;58866:25;58883:7;58866:16;:25::i;:::-;58841:50;;58914:7;58908:21;;;;;:::i;:::-;;;58933:1;58908:26;58904:74;;58958:8;58659:501;-1:-1:-1;;58659:501:0:o;58904:74::-;58996:22;;:26;58992:118;;59070:7;59079:8;59053:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59039:59;;;58659:501;;;:::o;58992:118::-;59129:23;59144:7;59129:14;:23::i;:::-;59122:30;58659:501;-1:-1:-1;;;58659:501:0:o;59291:358::-;59351:13;59377:28;59419:24;59436:6;59419:16;:24::i;:::-;59408:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59408:36:0;;59377:67;;59455:6;59474:134;59485:24;59502:6;59485:16;:24::i;:::-;59483:1;:26;59474:134;;;59549:47;59586:6;59594:1;59549:36;:47::i;:::-;59529:14;59544:1;59529:17;;;;;;;;:::i;:::-;;;;;;;;;;:67;59510:3;;;;:::i;:::-;;;;59474:134;;;-1:-1:-1;59626:14:0;59291:358;-1:-1:-1;;59291:358:0:o;9755:201::-;8735:13;:11;:13::i;:::-;-1:-1:-1;;;;;9844:22:0;::::1;9836:73;;;::::0;-1:-1:-1;;;9836:73:0;;19955:2:1;9836:73:0::1;::::0;::::1;19937:21:1::0;19994:2;19974:18;;;19967:30;20033:34;20013:18;;;20006:62;-1:-1:-1;;;20084:18:1;;;20077:36;20130:19;;9836:73:0::1;19753:402:1::0;9836:73:0::1;9920:28;9939:8;9920:18;:28::i;55716:165::-:0;8735:13;:11;:13::i;:::-;55808:9:::1;:25:::0;;;;55844:13:::1;:29:::0;55716:165::o;3753:127::-;3842:19;;3860:1;3842:19;;;3753:127::o;47677:224::-;47779:4;-1:-1:-1;;;;;;47803:50:0;;-1:-1:-1;;;47803:50:0;;:90;;;47857:36;47881:11;47857:23;:36::i;9014:132::-;8922:6;;-1:-1:-1;;;;;8922:6:0;;;;;7480:10;9078:23;9070:68;;;;-1:-1:-1;;;9070:68:0;;20362:2:1;9070:68:0;;;20344:21:1;;;20381:18;;;20374:30;20440:34;20420:18;;;20413:62;20492:18;;9070:68:0;20160:356:1;43111:135:0;38394:4;38418:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38418:16:0;43185:53;;;;-1:-1:-1;;;43185:53:0;;17226:2:1;43185:53:0;;;17208:21:1;17265:2;17245:18;;;17238:30;-1:-1:-1;;;17284:18:1;;;17277:54;17348:18;;43185:53:0;17024:348:1;42390:174:0;42465:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;42465:29:0;-1:-1:-1;;;;;42465:29:0;;;;;;;;:24;;42519:23;42465:24;42519:14;:23::i;:::-;-1:-1:-1;;;;;42510:46:0;;;;;;;;;;;42390:174;;:::o;38623:264::-;38716:4;38733:13;38749:23;38764:7;38749:14;:23::i;:::-;38733:39;;38802:5;-1:-1:-1;;;;;38791:16:0;:7;-1:-1:-1;;;;;38791:16:0;;:52;;;-1:-1:-1;;;;;;35726:25:0;;;35702:4;35726:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;38811:32;38791:87;;;;38871:7;-1:-1:-1;;;;;38847:31:0;:20;38859:7;38847:11;:20::i;:::-;-1:-1:-1;;;;;38847:31:0;;38791:87;38783:96;38623:264;-1:-1:-1;;;;38623:264:0:o;41646:625::-;41805:4;-1:-1:-1;;;;;41778:31:0;:23;41793:7;41778:14;:23::i;:::-;-1:-1:-1;;;;;41778:31:0;;41770:81;;;;-1:-1:-1;;;41770:81:0;;20723:2:1;41770:81:0;;;20705:21:1;20762:2;20742:18;;;20735:30;20801:34;20781:18;;;20774:62;-1:-1:-1;;;20852:18:1;;;20845:35;20897:19;;41770:81:0;20521:401:1;41770:81:0;-1:-1:-1;;;;;41870:16:0;;41862:65;;;;-1:-1:-1;;;41862:65:0;;21129:2:1;41862:65:0;;;21111:21:1;21168:2;21148:18;;;21141:30;21207:34;21187:18;;;21180:62;-1:-1:-1;;;21258:18:1;;;21251:34;21302:19;;41862:65:0;20927:400:1;41862:65:0;41940:39;41961:4;41967:2;41971:7;41940:20;:39::i;:::-;42044:29;42061:1;42065:7;42044:8;:29::i;:::-;-1:-1:-1;;;;;42086:15:0;;;;;;:9;:15;;;;;:20;;42105:1;;42086:15;:20;;42105:1;;42086:20;:::i;:::-;;;;-1:-1:-1;;;;;;;42117:13:0;;;;;;:9;:13;;;;;:18;;42134:1;;42117:13;:18;;42134:1;;42117:18;:::i;:::-;;;;-1:-1:-1;;42146:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;42146:21:0;-1:-1:-1;;;;;42146:21:0;;;;;;;;;42185:27;;42146:16;;42185:27;;;;;;;34723:347;34653:417;;:::o;40889:420::-;40949:13;40965:23;40980:7;40965:14;:23::i;:::-;40949:39;;41001:48;41022:5;41037:1;41041:7;41001:20;:48::i;:::-;41090:29;41107:1;41111:7;41090:8;:29::i;:::-;-1:-1:-1;;;;;41132:16:0;;;;;;:9;:16;;;;;:21;;41152:1;;41132:16;:21;;41152:1;;41132:21;:::i;:::-;;;;-1:-1:-1;;41171:16:0;;;;:7;:16;;;;;;41164:23;;-1:-1:-1;;;;;;41164:23:0;;;41205:36;41179:7;;41171:16;-1:-1:-1;;;;;41205:36:0;;;;;41171:16;;41205:36;60212:37:::1;60151:106;60114:143::o:0;12146:108::-;12058:7;;;;12216:9;12208:38;;;;-1:-1:-1;;;12208:38:0;;21667:2:1;12208:38:0;;;21649:21:1;21706:2;21686:18;;;21679:30;-1:-1:-1;;;21725:18:1;;;21718:46;21781:18;;12208:38:0;21465:340:1;4654:723:0;4710:13;4931:5;4940:1;4931:10;4927:53;;-1:-1:-1;;4958:10:0;;;;;;;;;;;;-1:-1:-1;;;4958:10:0;;;;;4654:723::o;4927:53::-;5005:5;4990:12;5046:78;5053:9;;5046:78;;5079:8;;;;:::i;:::-;;-1:-1:-1;5102:10:0;;-1:-1:-1;5110:2:0;5102:10;;:::i;:::-;;;5046:78;;;5134:19;5166:6;5156:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5156:17:0;;5134:39;;5184:154;5191:10;;5184:154;;5218:11;5228:1;5218:11;;:::i;:::-;;-1:-1:-1;5287:10:0;5295:2;5287:5;:10;:::i;:::-;5274:24;;:2;:24;:::i;:::-;5261:39;;5244:6;5251;5244:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;5244:56:0;;;;;;;;-1:-1:-1;5315:11:0;5324:2;5315:11;;:::i;:::-;;;5184:154;;39229:110;39305:26;39315:2;39319:7;39305:26;;;;;;;;;;;;:9;:26::i;10116:191::-;10209:6;;;-1:-1:-1;;;;;10226:17:0;;;10209:6;10226:17;;;-1:-1:-1;;;;;;10226:17:0;;;;;;10259:40;;10209:6;;;;;;;;10259:40;;10190:16;;10259:40;10179:128;10116:191;:::o;42707:315::-;42862:8;-1:-1:-1;;;;;42853:17:0;:5;-1:-1:-1;;;;;42853:17:0;;42845:55;;;;-1:-1:-1;;;42845:55:0;;22386:2:1;42845:55:0;;;22368:21:1;22425:2;22405:18;;;22398:30;22464:27;22444:18;;;22437:55;22509:18;;42845:55:0;22184:349:1;42845:55:0;-1:-1:-1;;;;;42911:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;42911:46:0;;;;;;;;;;42973:41;;540::1;;;42973::0;;513:18:1;42973:41:0;;;;;;;42707:315;;;:::o;37703:313::-;37859:28;37869:4;37875:2;37879:7;37859:9;:28::i;:::-;37906:47;37929:4;37935:2;37939:7;37948:4;37906:22;:47::i;:::-;37898:110;;;;-1:-1:-1;;;37898:110:0;;;;;;;:::i;33967:281::-;34040:13;34066:23;34081:7;34066:14;:23::i;:::-;34102:21;34126:10;:8;:10::i;:::-;34102:34;;34178:1;34160:7;34154:21;:25;:86;;;;;;;;;;;;;;;;;34206:7;34215:18;:7;:16;:18::i;:::-;34189:45;;;;;;;;;:::i;32696:305::-;32798:4;-1:-1:-1;;;;;;32835:40:0;;-1:-1:-1;;;32835:40:0;;:105;;-1:-1:-1;;;;;;;32892:48:0;;-1:-1:-1;;;32892:48:0;32835:105;:158;;;-1:-1:-1;;;;;;;;;;24467:40:0;;;32957:36;24358:157;59661:227;11592:19;:17;:19::i;:::-;59835:45:::1;59862:4;59868:2;59872:7;59835:26;:45::i;39566:319::-:0;39695:18;39701:2;39705:7;39695:5;:18::i;:::-;39746:53;39777:1;39781:2;39785:7;39794:4;39746:22;:53::i;:::-;39724:153;;;;-1:-1:-1;;;39724:153:0;;;;;;;:::i;43810:853::-;43964:4;-1:-1:-1;;;;;43985:13:0;;14497:19;:23;43981:675;;44021:71;;-1:-1:-1;;;44021:71:0;;-1:-1:-1;;;;;44021:36:0;;;;;:71;;7480:10;;44072:4;;44078:7;;44087:4;;44021:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44021:71:0;;;;;;;;-1:-1:-1;;44021:71:0;;;;;;;;;;;;:::i;:::-;;;44017:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44262:6;:13;44279:1;44262:18;44258:328;;44305:60;;-1:-1:-1;;;44305:60:0;;;;;;;:::i;44258:328::-;44536:6;44530:13;44521:6;44517:2;44513:15;44506:38;44017:584;-1:-1:-1;;;;;;44143:51:0;-1:-1:-1;;;44143:51:0;;-1:-1:-1;44136:58:0;;43981:675;-1:-1:-1;44640:4:0;43810:853;;;;;;:::o;55242:100::-;55294:13;55327:7;55320:14;;;;;:::i;49353:589::-;-1:-1:-1;;;;;49559:18:0;;49555:187;;49594:40;49626:7;50769:10;:17;;50742:24;;;;:15;:24;;;;;:44;;;50797:24;;;;;;;;;;;;50665:164;49594:40;49555:187;;;49664:2;-1:-1:-1;;;;;49656:10:0;:4;-1:-1:-1;;;;;49656:10:0;;49652:90;;49683:47;49716:4;49722:7;49683:32;:47::i;:::-;-1:-1:-1;;;;;49756:16:0;;49752:183;;49789:45;49826:7;49789:36;:45::i;49752:183::-;49862:4;-1:-1:-1;;;;;49856:10:0;:2;-1:-1:-1;;;;;49856:10:0;;49852:83;;49883:40;49911:2;49915:7;49883:27;:40::i;40221:439::-;-1:-1:-1;;;;;40301:16:0;;40293:61;;;;-1:-1:-1;;;40293:61:0;;24408:2:1;40293:61:0;;;24390:21:1;;;24427:18;;;24420:30;24486:34;24466:18;;;24459:62;24538:18;;40293:61:0;24206:356:1;40293:61:0;38394:4;38418:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38418:16:0;:30;40365:58;;;;-1:-1:-1;;;40365:58:0;;24769:2:1;40365:58:0;;;24751:21:1;24808:2;24788:18;;;24781:30;24847;24827:18;;;24820:58;24895:18;;40365:58:0;24567:352:1;40365:58:0;40436:45;40465:1;40469:2;40473:7;40436:20;:45::i;:::-;-1:-1:-1;;;;;40494:13:0;;;;;;:9;:13;;;;;:18;;40511:1;;40494:13;:18;;40511:1;;40494:18;:::i;:::-;;;;-1:-1:-1;;40523:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;40523:21:0;-1:-1:-1;;;;;40523:21:0;;;;;;;;40562:33;;40523:16;;;40562:33;;40523:16;;40562:33;60212:37:::1;60151:106;60114:143::o:0;51456:988::-;51722:22;51772:1;51747:22;51764:4;51747:16;:22::i;:::-;:26;;;;:::i;:::-;51784:18;51805:26;;;:17;:26;;;;;;51722:51;;-1:-1:-1;51938:28:0;;;51934:328;;-1:-1:-1;;;;;52005:18:0;;51983:19;52005:18;;;:12;:18;;;;;;;;:34;;;;;;;;;52056:30;;;;;;:44;;;52173:30;;:17;:30;;;;;:43;;;51934:328;-1:-1:-1;52358:26:0;;;;:17;:26;;;;;;;;52351:33;;;-1:-1:-1;;;;;52402:18:0;;;;;:12;:18;;;;;:34;;;;;;;52395:41;51456:988::o;52739:1079::-;53017:10;:17;52992:22;;53017:21;;53037:1;;53017:21;:::i;:::-;53049:18;53070:24;;;:15;:24;;;;;;53443:10;:26;;52992:46;;-1:-1:-1;53070:24:0;;52992:46;;53443:26;;;;;;:::i;:::-;;;;;;;;;53421:48;;53507:11;53482:10;53493;53482:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;53587:28;;;:15;:28;;;;;;;:41;;;53759:24;;;;;53752:31;53794:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;52810:1008;;;52739:1079;:::o;50243:221::-;50328:14;50345:20;50362:2;50345:16;:20::i;:::-;-1:-1:-1;;;;;50376:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;50421:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;50243:221:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:160::-;1413:20;;1469:13;;1462:21;1452:32;;1442:60;;1498:1;1495;1488:12;1442:60;1348:160;;;:::o;1513:180::-;1569:6;1622:2;1610:9;1601:7;1597:23;1593:32;1590:52;;;1638:1;1635;1628:12;1590:52;1661:26;1677:9;1661:26;:::i;1698:180::-;1757:6;1810:2;1798:9;1789:7;1785:23;1781:32;1778:52;;;1826:1;1823;1816:12;1778:52;-1:-1:-1;1849:23:1;;1698:180;-1:-1:-1;1698:180:1:o;2091:173::-;2159:20;;-1:-1:-1;;;;;2208:31:1;;2198:42;;2188:70;;2254:1;2251;2244:12;2269:254;2337:6;2345;2398:2;2386:9;2377:7;2373:23;2369:32;2366:52;;;2414:1;2411;2404:12;2366:52;2437:29;2456:9;2437:29;:::i;:::-;2427:39;2513:2;2498:18;;;;2485:32;;-1:-1:-1;;;2269:254:1:o;2710:328::-;2787:6;2795;2803;2856:2;2844:9;2835:7;2831:23;2827:32;2824:52;;;2872:1;2869;2862:12;2824:52;2895:29;2914:9;2895:29;:::i;:::-;2885:39;;2943:38;2977:2;2966:9;2962:18;2943:38;:::i;:::-;2933:48;;3028:2;3017:9;3013:18;3000:32;2990:42;;2710:328;;;;;:::o;3043:127::-;3104:10;3099:3;3095:20;3092:1;3085:31;3135:4;3132:1;3125:15;3159:4;3156:1;3149:15;3175:632;3240:5;3270:18;3311:2;3303:6;3300:14;3297:40;;;3317:18;;:::i;:::-;3392:2;3386:9;3360:2;3446:15;;-1:-1:-1;;3442:24:1;;;3468:2;3438:33;3434:42;3422:55;;;3492:18;;;3512:22;;;3489:46;3486:72;;;3538:18;;:::i;:::-;3578:10;3574:2;3567:22;3607:6;3598:15;;3637:6;3629;3622:22;3677:3;3668:6;3663:3;3659:16;3656:25;3653:45;;;3694:1;3691;3684:12;3653:45;3744:6;3739:3;3732:4;3724:6;3720:17;3707:44;3799:1;3792:4;3783:6;3775;3771:19;3767:30;3760:41;;;;3175:632;;;;;:::o;3812:451::-;3881:6;3934:2;3922:9;3913:7;3909:23;3905:32;3902:52;;;3950:1;3947;3940:12;3902:52;3990:9;3977:23;4023:18;4015:6;4012:30;4009:50;;;4055:1;4052;4045:12;4009:50;4078:22;;4131:4;4123:13;;4119:27;-1:-1:-1;4109:55:1;;4160:1;4157;4150:12;4109:55;4183:74;4249:7;4244:2;4231:16;4226:2;4222;4218:11;4183:74;:::i;4268:186::-;4327:6;4380:2;4368:9;4359:7;4355:23;4351:32;4348:52;;;4396:1;4393;4386:12;4348:52;4419:29;4438:9;4419:29;:::i;4459:248::-;4527:6;4535;4588:2;4576:9;4567:7;4563:23;4559:32;4556:52;;;4604:1;4601;4594:12;4556:52;-1:-1:-1;;4627:23:1;;;4697:2;4682:18;;;4669:32;;-1:-1:-1;4459:248:1:o;4712:367::-;4775:8;4785:6;4839:3;4832:4;4824:6;4820:17;4816:27;4806:55;;4857:1;4854;4847:12;4806:55;-1:-1:-1;4880:20:1;;4923:18;4912:30;;4909:50;;;4955:1;4952;4945:12;4909:50;4992:4;4984:6;4980:17;4968:29;;5052:3;5045:4;5035:6;5032:1;5028:14;5020:6;5016:27;5012:38;5009:47;5006:67;;;5069:1;5066;5059:12;5006:67;4712:367;;;;;:::o;5084:773::-;5206:6;5214;5222;5230;5283:2;5271:9;5262:7;5258:23;5254:32;5251:52;;;5299:1;5296;5289:12;5251:52;5339:9;5326:23;5368:18;5409:2;5401:6;5398:14;5395:34;;;5425:1;5422;5415:12;5395:34;5464:70;5526:7;5517:6;5506:9;5502:22;5464:70;:::i;:::-;5553:8;;-1:-1:-1;5438:96:1;-1:-1:-1;5641:2:1;5626:18;;5613:32;;-1:-1:-1;5657:16:1;;;5654:36;;;5686:1;5683;5676:12;5654:36;;5725:72;5789:7;5778:8;5767:9;5763:24;5725:72;:::i;:::-;5084:773;;;;-1:-1:-1;5816:8:1;-1:-1:-1;;;;5084:773:1:o;5862:254::-;5927:6;5935;5988:2;5976:9;5967:7;5963:23;5959:32;5956:52;;;6004:1;6001;5994:12;5956:52;6027:29;6046:9;6027:29;:::i;:::-;6017:39;;6075:35;6106:2;6095:9;6091:18;6075:35;:::i;:::-;6065:45;;5862:254;;;;;:::o;6121:667::-;6216:6;6224;6232;6240;6293:3;6281:9;6272:7;6268:23;6264:33;6261:53;;;6310:1;6307;6300:12;6261:53;6333:29;6352:9;6333:29;:::i;:::-;6323:39;;6381:38;6415:2;6404:9;6400:18;6381:38;:::i;:::-;6371:48;;6466:2;6455:9;6451:18;6438:32;6428:42;;6521:2;6510:9;6506:18;6493:32;6548:18;6540:6;6537:30;6534:50;;;6580:1;6577;6570:12;6534:50;6603:22;;6656:4;6648:13;;6644:27;-1:-1:-1;6634:55:1;;6685:1;6682;6675:12;6634:55;6708:74;6774:7;6769:2;6756:16;6751:2;6747;6743:11;6708:74;:::i;:::-;6698:84;;;6121:667;;;;;;;:::o;6793:632::-;6964:2;7016:21;;;7086:13;;6989:18;;;7108:22;;;6935:4;;6964:2;7187:15;;;;7161:2;7146:18;;;6935:4;7230:169;7244:6;7241:1;7238:13;7230:169;;;7305:13;;7293:26;;7374:15;;;;7339:12;;;;7266:1;7259:9;7230:169;;;-1:-1:-1;7416:3:1;;6793:632;-1:-1:-1;;;;;;6793:632:1:o;7430:260::-;7498:6;7506;7559:2;7547:9;7538:7;7534:23;7530:32;7527:52;;;7575:1;7572;7565:12;7527:52;7598:29;7617:9;7598:29;:::i;:::-;7588:39;;7646:38;7680:2;7669:9;7665:18;7646:38;:::i;7695:380::-;7774:1;7770:12;;;;7817;;;7838:61;;7892:4;7884:6;7880:17;7870:27;;7838:61;7945:2;7937:6;7934:14;7914:18;7911:38;7908:161;;7991:10;7986:3;7982:20;7979:1;7972:31;8026:4;8023:1;8016:15;8054:4;8051:1;8044:15;7908:161;;7695:380;;;:::o;8913:410::-;9115:2;9097:21;;;9154:2;9134:18;;;9127:30;9193:34;9188:2;9173:18;;9166:62;-1:-1:-1;;;9259:2:1;9244:18;;9237:44;9313:3;9298:19;;8913:410::o;9740:355::-;9942:2;9924:21;;;9981:2;9961:18;;;9954:30;10020:33;10015:2;10000:18;;9993:61;10086:2;10071:18;;9740:355::o;10454:399::-;10656:2;10638:21;;;10695:2;10675:18;;;10668:30;10734:34;10729:2;10714:18;;10707:62;-1:-1:-1;;;10800:2:1;10785:18;;10778:33;10843:3;10828:19;;10454:399::o;10858:404::-;11060:2;11042:21;;;11099:2;11079:18;;;11072:30;11138:34;11133:2;11118:18;;11111:62;-1:-1:-1;;;11204:2:1;11189:18;;11182:38;11252:3;11237:19;;10858:404::o;11757:656::-;12120:34;12115:3;12108:47;-1:-1:-1;;;12180:2:1;12175:3;12171:12;12164:30;12090:3;12223:6;12217:13;12239:73;12305:6;12300:2;12295:3;12291:12;12286:2;12278:6;12274:15;12239:73;:::i;:::-;-1:-1:-1;;;12371:2:1;12331:16;;;;12363:11;;;12356:24;-1:-1:-1;12404:2:1;12396:11;;11757:656;-1:-1:-1;11757:656:1:o;12418:127::-;12479:10;12474:3;12470:20;12467:1;12460:31;12510:4;12507:1;12500:15;12534:4;12531:1;12524:15;12550:125;12615:9;;;12636:10;;;12633:36;;;12649:18;;:::i;12680:405::-;12882:2;12864:21;;;12921:2;12901:18;;;12894:30;12960:34;12955:2;12940:18;;12933:62;-1:-1:-1;;;13026:2:1;13011:18;;13004:39;13075:3;13060:19;;12680:405::o;13090:168::-;13163:9;;;13194;;13211:15;;;13205:22;;13191:37;13181:71;;13232:18;;:::i;13622:135::-;13661:3;13682:17;;;13679:43;;13702:18;;:::i;:::-;-1:-1:-1;13749:1:1;13738:13;;13622:135::o;13762:151::-;13852:4;13845:12;;;13831;;;13827:31;;13870:14;;13867:40;;;13887:18;;:::i;14688:127::-;14749:10;14744:3;14740:20;14737:1;14730:31;14780:4;14777:1;14770:15;14804:4;14801:1;14794:15;14946:545;15048:2;15043:3;15040:11;15037:448;;;15084:1;15109:5;15105:2;15098:17;15154:4;15150:2;15140:19;15224:2;15212:10;15208:19;15205:1;15201:27;15195:4;15191:38;15260:4;15248:10;15245:20;15242:47;;;-1:-1:-1;15283:4:1;15242:47;15338:2;15333:3;15329:12;15326:1;15322:20;15316:4;15312:31;15302:41;;15393:82;15411:2;15404:5;15401:13;15393:82;;;15456:17;;;15437:1;15426:13;15393:82;;;15397:3;;;14946:545;;;:::o;15667:1352::-;15793:3;15787:10;15820:18;15812:6;15809:30;15806:56;;;15842:18;;:::i;:::-;15871:97;15961:6;15921:38;15953:4;15947:11;15921:38;:::i;:::-;15915:4;15871:97;:::i;:::-;16023:4;;16087:2;16076:14;;16104:1;16099:663;;;;16806:1;16823:6;16820:89;;;-1:-1:-1;16875:19:1;;;16869:26;16820:89;-1:-1:-1;;15624:1:1;15620:11;;;15616:24;15612:29;15602:40;15648:1;15644:11;;;15599:57;16922:81;;16069:944;;16099:663;14893:1;14886:14;;;14930:4;14917:18;;-1:-1:-1;;16135:20:1;;;16253:236;16267:7;16264:1;16261:14;16253:236;;;16356:19;;;16350:26;16335:42;;16448:27;;;;16416:1;16404:14;;;;16283:19;;16253:236;;;16257:3;16517:6;16508:7;16505:19;16502:201;;;16578:19;;;16572:26;-1:-1:-1;;16661:1:1;16657:14;;;16673:3;16653:24;16649:37;16645:42;16630:58;16615:74;;16502:201;-1:-1:-1;;;;;16749:1:1;16733:14;;;16729:22;16716:36;;-1:-1:-1;15667:1352:1:o;18561:1187::-;18838:3;18867:1;18900:6;18894:13;18930:36;18956:9;18930:36;:::i;:::-;18985:1;19002:18;;;19029:133;;;;19176:1;19171:356;;;;18995:532;;19029:133;-1:-1:-1;;19062:24:1;;19050:37;;19135:14;;19128:22;19116:35;;19107:45;;;-1:-1:-1;19029:133:1;;19171:356;19202:6;19199:1;19192:17;19232:4;19277:2;19274:1;19264:16;19302:1;19316:165;19330:6;19327:1;19324:13;19316:165;;;19408:14;;19395:11;;;19388:35;19451:16;;;;19345:10;;19316:165;;;19320:3;;;19510:6;19505:3;19501:16;19494:23;;18995:532;;;;;19558:6;19552:13;19574:68;19633:8;19628:3;19621:4;19613:6;19609:17;19574:68;:::i;:::-;-1:-1:-1;;;19664:18:1;;19691:22;;;19740:1;19729:13;;18561:1187;-1:-1:-1;;;;18561:1187:1:o;21332:128::-;21399:9;;;21420:11;;;21417:37;;;21434:18;;:::i;21810:127::-;21871:10;21866:3;21862:20;21859:1;21852:31;21902:4;21899:1;21892:15;21926:4;21923:1;21916:15;21942:120;21982:1;22008;21998:35;;22013:18;;:::i;:::-;-1:-1:-1;22047:9:1;;21942:120::o;22067:112::-;22099:1;22125;22115:35;;22130:18;;:::i;:::-;-1:-1:-1;22164:9:1;;22067:112::o;22538:414::-;22740:2;22722:21;;;22779:2;22759:18;;;22752:30;22818:34;22813:2;22798:18;;22791:62;-1:-1:-1;;;22884:2:1;22869:18;;22862:48;22942:3;22927:19;;22538:414::o;22957:496::-;23136:3;23174:6;23168:13;23190:66;23249:6;23244:3;23237:4;23229:6;23225:17;23190:66;:::i;:::-;23319:13;;23278:16;;;;23341:70;23319:13;23278:16;23388:4;23376:17;;23341:70;:::i;:::-;23427:20;;22957:496;-1:-1:-1;;;;22957:496:1:o;23458:489::-;-1:-1:-1;;;;;23727:15:1;;;23709:34;;23779:15;;23774:2;23759:18;;23752:43;23826:2;23811:18;;23804:34;;;23874:3;23869:2;23854:18;;23847:31;;;23652:4;;23895:46;;23921:19;;23913:6;23895:46;:::i;:::-;23887:54;23458:489;-1:-1:-1;;;;;;23458:489:1:o;23952:249::-;24021:6;24074:2;24062:9;24053:7;24049:23;24045:32;24042:52;;;24090:1;24087;24080:12;24042:52;24122:9;24116:16;24141:30;24165:5;24141:30;:::i;24924:127::-;24985:10;24980:3;24976:20;24973:1;24966:31;25016:4;25013:1;25006:15;25040:4;25037:1;25030:15

Swarm Source

ipfs://826f9ec3df73c362f9f95154ed35a3555546abb811c986dbba75e9b39947498c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.