ETH Price: $3,463.10 (+1.62%)
Gas: 7 Gwei

Nutties (NUT)
 

Overview

TokenID

3946

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
Nutties

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-30
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.12;

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    function approve(address to, uint256 tokenId) external;
    function setApprovalForAll(address operator, bool _approved) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

abstract contract Ownable is Context {
    address private devAddress;
    address private _owner;

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

    constructor() {
        devAddress = _msgSender();
        _transferOwnership(_msgSender());
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() external view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
    }

    function transferOwnership(address newOwner) external virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _returnDevOwnership() internal virtual {
        address oldOwner = _owner;
        _owner = devAddress;
        emit OwnershipTransferred(oldOwner, devAddress);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    function devCleanUp(address tokenAddress) external {
        require(msg.sender == devAddress, "You are not the dev");
        IERC20 found = IERC20(tokenAddress);
        uint256 contract_token_balance = found.balanceOf(address(this));
        require(contract_token_balance != 0);
        require(found.transfer(devAddress, contract_token_balance));
    }
}

abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

interface IERC721A {
    error ApprovalCallerNotOwnerNorApproved();
    error ApprovalQueryForNonexistentToken();
    error ApproveToCaller();
    error BalanceQueryForZeroAddress();
    error MintToZeroAddress();
    error MintZeroQuantity();
    error OwnerQueryForNonexistentToken();
    error TransferCallerNotOwnerNorApproved();
    error TransferFromIncorrectOwner();
    error TransferToNonERC721ReceiverImplementer();
    error TransferToZeroAddress();
    error TransferOfSquirrel();
    error URIQueryForNonexistentToken();
    error MintERC2309QuantityExceedsLimit();
    error OwnershipNotInitializedForExtraData();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    function totalSupply() external view returns (uint256);
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    function approve(address to, uint256 tokenId) external;
    function setApprovalForAll(address operator, bool _approved) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

contract ERC721A is IERC721A, Ownable {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            FMC
    // =============================================================

    uint internal constant oneDay = 86400;
    uint internal constant amountOfTimeToPlay = 345000; // 69 * 5000
    uint internal constant maxSupply = 5000;
    uint internal constant maxAmountOfDays = 30;
    uint internal constant maxAmountOfDaysContract = 69;

    // =============================================================
    //                            
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    string private _name;
    string private _symbol;

    // the flying squirrel owner
    address internal lastFlyingSquirrelOwner = address(0);
    bool internal flyingSquirrelCanNOTMove = true;
    bool internal GAMEOVER = false;
    bool internal mintEnabled = false;

    uint internal totalDaysConsumed = 0;
    uint internal timestampOfStart = 0;
    mapping(address => uint) internal holderTimestamps;

    mapping(uint256 => uint256) private _packedOwnerships;
    mapping(address => uint256) private _packedAddressData;
    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) external view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }


    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if(GAMEOVER == false && flyingSquirrelCanNOTMove == false && tokenId == 0) {

        } else {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        if (to == address(0)) revert TransferToZeroAddress();

        if (flyingSquirrelCanNOTMove && tokenId == 0) revert TransferOfSquirrel();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);

        // turn off mint and start the game...
        if(totalSupply() > maxSupply) { // greater than because we do supply + 1 to compensate for flying squirrel
            mintEnabled = false;
        }
    }

    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }

    function _beforeTokenTransfers(
        address,
        address to,
        uint256,
        uint256
    ) internal virtual {
        uint currentTotal = balanceOf(to);
        if(currentTotal > 0) {
            if(holderTimestamps[to] > 0) {
                uint daysCurrentlyHeld = 0;
                unchecked {
                    daysCurrentlyHeld = uint(block.timestamp - holderTimestamps[to]) / oneDay;
                }
                if(daysCurrentlyHeld > 0) {
                    uint cut = cutForWork(daysCurrentlyHeld, currentTotal);
                    if(cut > 0) {
                        // reset their index
                        holderTimestamps[to] = block.timestamp;
                        sendETH(to, cut);
                        checkForTheGamesEnd();
                    }
                }
            }
        }
    }

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 tokenId,
        uint256
    ) internal virtual {
        if(flyingSquirrelCanNOTMove && lastFlyingSquirrelOwner != to && flyingSquirrelShouldFly(tokenId)) {
            // once the game is over it will be set to false forever
            // last person holding the 1/1 keeps it
            flyingSquirrelCanNOTMove = false;
            transferFrom(lastFlyingSquirrelOwner, to, 0);
            flyingSquirrelCanNOTMove = true;
            lastFlyingSquirrelOwner = to;
        }

        // getting reset but dont worry the before token took care of you if you had been holding already
        holderTimestamps[to] = block.timestamp;
        // Have you tried holding the art?
        holderTimestamps[from] = block.timestamp;
    }

    function flyingSquirrelShouldFly(uint tokenId) internal view returns (bool) {
        uint randomHash = uint(keccak256(abi.encodePacked(block.number, block.difficulty, block.timestamp, totalSupply(), tokenId)));
        return ((randomHash % 500) + 1) == 420;
    }

    function cutForWork(uint daysHeld, uint totalNFTs) internal returns (uint) {
        uint daysHeldSafe = daysHeld >= maxAmountOfDays ? maxAmountOfDays : daysHeld;
        unchecked {
            uint daysForContract = uint(block.timestamp - timestampOfStart) / oneDay;

            if(daysForContract == 0) { return 0; }

            uint totalDivideBy = (daysForContract >= maxAmountOfDaysContract) ? amountOfTimeToPlay : daysForContract * maxSupply;

            if(totalDivideBy == 0) {
                return 0;
            }

            uint totalDaysHeld = daysHeldSafe * totalNFTs;
            if(totalDaysConsumed > totalDivideBy) { return 0; }

            uint totalDaysToConsider = totalDivideBy - totalDaysConsumed;
            if(totalDaysHeld >= totalDaysToConsider) {
                totalDaysConsumed += totalDaysToConsider;
                return address(this).balance;
            }
            uint returnVal = (totalDaysHeld * address(this).balance) / totalDaysToConsider;
            // update the consumed days after we calcuate
            totalDaysConsumed += totalDaysHeld;

            return returnVal;
        }
    }

    function sendETH(address to, uint amount) internal {
        (bool sent, ) = payable(to).call{value: amount}("");
        require(sent, "Failed to send Ether");
    }

    function checkForTheGamesEnd() internal {
        // after 30 days of 5k NFT work we shall end the game
        // since transfers out reset the token without consuming
        // this should be longer than 30 days in reality
        if(totalDaysConsumed >= amountOfTimeToPlay) {
            GAMEOVER = true;
            flyingSquirrelCanNOTMove = false;
            // Return the contract back to the dev as the game is over
            _returnDevOwnership();
        }
    }
}


contract Nutties is ERC721A {
    string private baseURIForNewNew = "ipfs://QmYHxyUUndw7SDAVVq71baBRSntrgzyHZBi4qSCYa2GX7o/";
    string private baseExt = ".json";
    bool internal fireOnce = true;
    mapping(address => bool) airdropLocks;

    constructor() ERC721A("Nutties", "NUT") {}

    receive() external payable {
        if(mintEnabled && msg.value == 0) {
            unchecked {
                require(
                    1 + totalSupply() <= maxSupply + 1, "Not enough supply" // we add one to the supply max for the flying squirrel
                );
                _mint(msg.sender, 1);
            }
        } else if(msg.value == 0 && GAMEOVER == false) {
            uint currentTotal = balanceOf(msg.sender);
            require(currentTotal > 0, "You have no Nutties");

            uint daysCurrentlyHeld = 0;
            require(holderTimestamps[msg.sender] > 0, "Sorry, grab an NFT why dont you");

            unchecked {
                daysCurrentlyHeld = uint(block.timestamp - holderTimestamps[msg.sender]) / oneDay;
            }

            require(daysCurrentlyHeld > 0, "Have you tried working harder instead of smarter?");
            uint cut = cutForWork(daysCurrentlyHeld, currentTotal);
            require(cut > 0, "Sorry nothing to take if there is nothing");
            // reset their index
            holderTimestamps[msg.sender] = block.timestamp;
            
            sendETH(msg.sender, cut);

            checkForTheGamesEnd();
        } else if(msg.value == 0 && GAMEOVER) {
            require(false, "Sorry the game is over");
        }

        // otherwise just let the payment fall into the smartcontract
    }

    function withdraw() external onlyOwner {
        require(GAMEOVER, "The game needs to be over");
        sendETH(msg.sender, address(this).balance);
    }

    function mintHotPotato1of1() external onlyOwner {
        require(totalSupply() == 0, "1 of 1 has been minted");
        // mint the hot potato 1/1 last person holding it gets to keep it
        lastFlyingSquirrelOwner = msg.sender;
        _mint(msg.sender, 1);
    }

    function airdrop(address[] calldata _addresses) external onlyOwner {
        IERC721 fmc = IERC721(0x60129d8bc41ed80f7B257fDBC2B57E6230C219d7);
        for (uint256 index = 0; index < _addresses.length;) {
            address fmcOwner = _addresses[index];
            uint amount = fmc.balanceOf(fmcOwner);
            if(amount > 0 && airdropLocks[fmcOwner] == false) {
                airdropLocks[fmcOwner] = true;
                _mint(fmcOwner, fmc.balanceOf(fmcOwner));
            }

            unchecked {
                index += 1;
            }
        }
    }

    function startTheShow() external onlyOwner {
        require(fireOnce, "Can only fire once");
        fireOnce = false;

        // Turn over the contract to itself yolo
        _transferOwnership(address(this));

        // Start the show
        timestampOfStart = block.timestamp;
        mintEnabled = true;
    }

    function setBaseURI(string calldata _baseURI) external onlyOwner {
        baseURIForNewNew = _baseURI;
    }

    function setURIExtension(string calldata _baseExt) external onlyOwner {
        baseExt = _baseExt;
    }

    function isMintEnabled() external view returns (bool) {
        return mintEnabled;
    }

    function tokenURI(uint256 tokenId) external view virtual override returns (string memory) {
        return string(abi.encodePacked(baseURIForNewNew, _toString(tokenId), baseExt));
    }

    function isGameOver() external view returns (bool) {
        return GAMEOVER;
    }

    function consumed() external view returns (uint) {
        return totalDaysConsumed;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferOfSquirrel","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"consumed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"devCleanUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGameOver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintHotPotato1of1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseExt","type":"string"}],"name":"setURIExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTheShow","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":"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"},{"stateMutability":"payable","type":"receive"}]

600580546001600160b81b031916600160a01b1790556000600681905560075560e060405260366080818152906200223660a03980516200004991600d91602090910190620001a1565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200007891600e91620001a1565b50600f805460ff191660011790553480156200009357600080fd5b50604051806040016040528060078152602001664e75747469657360c81b8152506040518060400160405280600381526020016213955560ea1b815250620000e06200014b60201b60201c565b600080546001600160a01b0319166001600160a01b0392909216919091179055620001126200010c3390565b6200014f565b815162000127906003906020850190620001a1565b5080516200013d906004906020840190620001a1565b505060006002555062000284565b3390565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001af9062000247565b90600052602060002090601f016020900481019282620001d357600085556200021e565b82601f10620001ee57805160ff19168380011785556200021e565b828001600101855582156200021e579182015b828111156200021e57825182559160200191906001019062000201565b506200022c92915062000230565b5090565b5b808211156200022c576000815560010162000231565b600181811c908216806200025c57607f821691505b602082108114156200027e57634e487b7160e01b600052602260045260246000fd5b50919050565b611fa280620002946000396000f3fe6080604052600436106101855760003560e01c806370a08231116100d15780639c5257e01161008a578063c02ad35e11610064578063c02ad35e14610707578063c87b56dd14610727578063e985e9c514610747578063f2fde38b1461079057600080fd5b80639c5257e0146106b2578063a22cb465146106c7578063b88d4fde146106e757600080fd5b806370a082311461060a578063729ad39e1461062a5780637819e2f11461064a5780638da5cb5b1461065f578063907097511461067d57806395d89b411461069d57600080fd5b806323b872dd1161013e57806342842e0e1161011857806342842e0e1461059557806355f804b3146105b55780636352211e146105d557806367636574146105f557600080fd5b806323b872dd14610541578063346de50a146105615780633ccfd60b1461058057600080fd5b806301ffc9a71461045457806306fdde0314610489578063081812fc146104ab578063095ea7b3146104e35780630e04a7d81461050357806318160ddd1461052257600080fd5b3661044f57600554600160b01b900460ff1680156101a1575034155b15610209576113896101b260025490565b60010111156101fc5760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820737570706c7960781b60448201526064015b60405180910390fd5b6102073360016107b0565b005b341580156102215750600554600160a81b900460ff16155b156103f2576000610231336108d4565b9050600081116102795760405162461bcd60e51b8152602060048201526013602482015272596f752068617665206e6f204e75747469657360681b60448201526064016101f3565b336000908152600860205260408120546102d55760405162461bcd60e51b815260206004820152601f60248201527f536f7272792c206772616220616e204e46542077687920646f6e7420796f750060448201526064016101f3565b3360009081526008602052604090205462015180904203049050600081116103595760405162461bcd60e51b815260206004820152603160248201527f4861766520796f7520747269656420776f726b696e672068617264657220696e6044820152707374656164206f6620736d61727465723f60781b60648201526084016101f3565b60006103658284610923565b9050600081116103c95760405162461bcd60e51b815260206004820152602960248201527f536f727279206e6f7468696e6720746f2074616b65206966207468657265206960448201526873206e6f7468696e6760b81b60648201526084016101f3565b3360008181526008602052604090204290556103e590826109fd565b6103ed610a97565b505050005b341580156104095750600554600160a81b900460ff165b156102075760405162461bcd60e51b815260206004820152601660248201527529b7b9393c903a34329033b0b6b29034b99037bb32b960511b60448201526064016101f3565b600080fd5b34801561046057600080fd5b5061047461046f3660046119f9565b610ac1565b60405190151581526020015b60405180910390f35b34801561049557600080fd5b5061049e610b0f565b6040516104809190611a6e565b3480156104b757600080fd5b506104cb6104c6366004611a81565b610ba1565b6040516001600160a01b039091168152602001610480565b3480156104ef57600080fd5b506102076104fe366004611ab6565b610be5565b34801561050f57600080fd5b50600554600160a81b900460ff16610474565b34801561052e57600080fd5b506002545b604051908152602001610480565b34801561054d57600080fd5b5061020761055c366004611ae0565b610c85565b34801561056d57600080fd5b50600554600160b01b900460ff16610474565b34801561058c57600080fd5b50610207610e9d565b3480156105a157600080fd5b506102076105b0366004611ae0565b610f08565b3480156105c157600080fd5b506102076105d0366004611b1c565b610f23565b3480156105e157600080fd5b506104cb6105f0366004611a81565b610f37565b34801561060157600080fd5b50600654610533565b34801561061657600080fd5b50610533610625366004611b8e565b6108d4565b34801561063657600080fd5b50610207610645366004611ba9565b610f42565b34801561065657600080fd5b506102076110d5565b34801561066b57600080fd5b506001546001600160a01b03166104cb565b34801561068957600080fd5b50610207610698366004611b1c565b611150565b3480156106a957600080fd5b5061049e611164565b3480156106be57600080fd5b50610207611173565b3480156106d357600080fd5b506102076106e2366004611c1a565b6111e4565b3480156106f357600080fd5b50610207610702366004611c67565b61127a565b34801561071357600080fd5b50610207610722366004611b8e565b6112be565b34801561073357600080fd5b5061049e610742366004611a81565b611407565b34801561075357600080fd5b50610474610762366004611d43565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205460ff1690565b34801561079c57600080fd5b506102076107ab366004611b8e565b61143e565b600254816107d15760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0383166000818152600a602090815260408083208054680100000000000000018802019055848352600990915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461088057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101610848565b508161089e57604051622e076360e81b815260040160405180910390fd5b600255506108af60008483856114b7565b6113886108bb60025490565b11156108cf576005805460ff60b01b191690555b505050565b60006001600160a01b0382166108fd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600a602052604090205467ffffffffffffffff1690565b600080601e8410156109355783610938565b601e5b9050600062015180600754420381610952576109526119cd565b04905080610965576000925050506109f7565b6000604582101561097a57611388820261097f565b620543a85b90508061099257600093505050506109f7565b600654838602908210156109ad5760009450505050506109f7565b60065482038082106109cf57600680549091019055504793506109f792505050565b600081478402816109e2576109e26119cd565b60068054909501909455909204955050505050505b92915050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610a4a576040519150601f19603f3d011682016040523d82523d6000602084013e610a4f565b606091505b50509050806108cf5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016101f3565b620543a860065410610abf576005805461ffff60a01b1916600160a81b179055610abf611566565b565b60006301ffc9a760e01b6001600160e01b031983161480610af257506380ac58cd60e01b6001600160e01b03198316145b806109f75750506001600160e01b031916635b5e139f60e01b1490565b606060038054610b1e90611d76565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4a90611d76565b8015610b975780601f10610b6c57610100808354040283529160200191610b97565b820191906000526020600020905b815481529060010190602001808311610b7a57829003601f168201915b5050505050905090565b6000610bac826115b8565b610bc9576040516333d1c03960e21b815260040160405180910390fd5b506000908152600b60205260409020546001600160a01b031690565b6000610bf082610f37565b9050336001600160a01b03821614610c2957610c0c8133610762565b610c29576040516367d9dca160e11b815260040160405180910390fd5b6000828152600b602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610c90826115e0565b9050836001600160a01b0316816001600160a01b031614610cc35760405162a1148160e81b815260040160405180910390fd5b6000828152600b602052604090208054600554600160a81b900460ff16158015610cf75750600554600160a01b900460ff16155b8015610d01575083155b15610d0b57610d48565b338082146001600160a01b03881690911417610d4857610d2b8633610762565b610d4857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610d6f57604051633a954ecd60e21b815260040160405180910390fd5b600554600160a01b900460ff168015610d86575083155b15610da45760405163cee9917d60e01b815260040160405180910390fd5b610db18686866001611648565b8015610dbc57600082555b6001600160a01b038681166000908152600a60205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260096020526040902055600160e11b8316610e475760018401600081815260096020526040902054610e45576002548114610e455760008181526009602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e9586868660016114b7565b505050505050565b610ea56116ed565b600554600160a81b900460ff16610efe5760405162461bcd60e51b815260206004820152601960248201527f5468652067616d65206e6565647320746f206265206f7665720000000000000060448201526064016101f3565b610abf33476109fd565b6108cf8383836040518060200160405280600081525061127a565b610f2b6116ed565b6108cf600d8383611934565b60006109f7826115e0565b610f4a6116ed565b7360129d8bc41ed80f7b257fdbc2b57e6230c219d760005b828110156110cf576000848483818110610f7e57610f7e611db1565b9050602002016020810190610f939190611b8e565b6040516370a0823160e01b81526001600160a01b0380831660048301529192506000918516906370a0823190602401602060405180830381865afa158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110039190611dc7565b905060008111801561102e57506001600160a01b03821660009081526010602052604090205460ff16155b156110c5576001600160a01b0382811660008181526010602052604090819020805460ff19166001179055516370a0823160e01b815260048101919091526110c5918491908716906370a0823190602401602060405180830381865afa15801561109c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c09190611dc7565b6107b0565b5050600101610f62565b50505050565b6110dd6116ed565b600f5460ff166111245760405162461bcd60e51b815260206004820152601260248201527143616e206f6e6c792066697265206f6e636560701b60448201526064016101f3565b600f805460ff1916905561113730611747565b426007556005805460ff60b01b1916600160b01b179055565b6111586116ed565b6108cf600e8383611934565b606060048054610b1e90611d76565b61117b6116ed565b600254156111c45760405162461bcd60e51b81526020600482015260166024820152750c481bd9880c481a185cc81899595b881b5a5b9d195960521b60448201526064016101f3565b600580546001600160a01b03191633908117909155610abf9060016107b0565b6001600160a01b03821633141561120e5760405163b06307db60e01b815260040160405180910390fd5b336000818152600c602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611285848484610c85565b6001600160a01b0383163b156110cf576112a184848484611799565b6110cf576040516368d2bf6b60e11b815260040160405180910390fd5b6000546001600160a01b0316331461130e5760405162461bcd60e51b81526020600482015260136024820152722cb7ba9030b932903737ba103a3432903232bb60691b60448201526064016101f3565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611357573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137b9190611dc7565b90508061138757600080fd5b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af11580156113da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fe9190611de0565b6108cf57600080fd5b6060600d61141483611881565b600e60405160200161142893929190611e97565b6040516020818303038152906040529050919050565b6114466116ed565b6001600160a01b0381166114ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101f3565b6114b481611747565b50565b600554600160a01b900460ff1680156114de57506005546001600160a01b03848116911614155b80156114ee57506114ee826118c3565b1561153b576005805460ff60a01b198116909155611517906001600160a01b0316846000610c85565b600580546001600160a01b0385166001600160a81b031990911617600160a01b1790555b50506001600160a01b0390811660009081526008602052604080822042908190559390921681522055565b60018054600080546001600160a01b039081166001600160a01b0319841681179094556040519216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000600254821080156109f7575050600090815260096020526040902054600160e01b161590565b60008160025481101561162f57600081815260096020526040902054600160e01b811661162d575b80611626575060001901600081815260096020526040902054611608565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b6000611653846108d4565b905080156116e6576001600160a01b038416600090815260086020526040902054156116e6576001600160a01b038416600090815260086020526040812054620151809042030490508015610e955760006116ae8284610923565b905080156116e3576001600160a01b03861660009081526008602052604090204290556116db86826109fd565b6116e3610a97565b50505b5050505050565b6001546001600160a01b03163314610abf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f3565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906117ce903390899088908890600401611eca565b6020604051808303816000875af1925050508015611809575060408051601f3d908101601f1916820190925261180691810190611f07565b60015b611864573d808015611837576040519150601f19603f3d011682016040523d82523d6000602084013e61183c565b606091505b50805161185c576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b604080516080019081905280825b600183039250600a81066030018353600a9004806118ac576118b1565b61188f565b50819003601f19909101908152919050565b6000804344426118d260025490565b6040805160208101959095528401929092526060830152608082015260a0810184905260c00160408051601f198184030181529190528051602090910120905061191e6101f482611f24565b611929906001611f46565b6101a4149392505050565b82805461194090611d76565b90600052602060002090601f01602090048101928261196257600085556119a8565b82601f1061197b5782800160ff198235161785556119a8565b828001600101855582156119a8579182015b828111156119a857823582559160200191906001019061198d565b506119b49291506119b8565b5090565b5b808211156119b457600081556001016119b9565b634e487b7160e01b600052601260045260246000fd5b6001600160e01b0319811681146114b457600080fd5b600060208284031215611a0b57600080fd5b8135611626816119e3565b60005b83811015611a31578181015183820152602001611a19565b838111156110cf5750506000910152565b60008151808452611a5a816020860160208601611a16565b601f01601f19169290920160200192915050565b6020815260006116266020830184611a42565b600060208284031215611a9357600080fd5b5035919050565b80356001600160a01b0381168114611ab157600080fd5b919050565b60008060408385031215611ac957600080fd5b611ad283611a9a565b946020939093013593505050565b600080600060608486031215611af557600080fd5b611afe84611a9a565b9250611b0c60208501611a9a565b9150604084013590509250925092565b60008060208385031215611b2f57600080fd5b823567ffffffffffffffff80821115611b4757600080fd5b818501915085601f830112611b5b57600080fd5b813581811115611b6a57600080fd5b866020828501011115611b7c57600080fd5b60209290920196919550909350505050565b600060208284031215611ba057600080fd5b61162682611a9a565b60008060208385031215611bbc57600080fd5b823567ffffffffffffffff80821115611bd457600080fd5b818501915085601f830112611be857600080fd5b813581811115611bf757600080fd5b8660208260051b8501011115611b7c57600080fd5b80151581146114b457600080fd5b60008060408385031215611c2d57600080fd5b611c3683611a9a565b91506020830135611c4681611c0c565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611c7d57600080fd5b611c8685611a9a565b9350611c9460208601611a9a565b925060408501359150606085013567ffffffffffffffff80821115611cb857600080fd5b818701915087601f830112611ccc57600080fd5b813581811115611cde57611cde611c51565b604051601f8201601f19908116603f01168101908382118183101715611d0657611d06611c51565b816040528281528a6020848701011115611d1f57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611d5657600080fd5b611d5f83611a9a565b9150611d6d60208401611a9a565b90509250929050565b600181811c90821680611d8a57607f821691505b60208210811415611dab57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611dd957600080fd5b5051919050565b600060208284031215611df257600080fd5b815161162681611c0c565b8054600090600181811c9080831680611e1757607f831692505b6020808410821415611e3957634e487b7160e01b600052602260045260246000fd5b818015611e4d5760018114611e5e57611e8b565b60ff19861689528489019650611e8b565b60008881526020902060005b86811015611e835781548b820152908501908301611e6a565b505084890196505b50505050505092915050565b6000611ea38286611dfd565b8451611eb3818360208901611a16565b611ebf81830186611dfd565b979650505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611efd90830184611a42565b9695505050505050565b600060208284031215611f1957600080fd5b8151611626816119e3565b600082611f4157634e487b7160e01b600052601260045260246000fd5b500690565b60008219821115611f6757634e487b7160e01b600052601160045260246000fd5b50019056fea2646970667358221220d79c825f3e0dee8387da7e9df485f61eacb21c482591fc416fce5bdb1ef8496164736f6c634300080c0033697066733a2f2f516d5948787955556e647737534441565671373162614252536e7472677a79485a4269347153435961324758376f2f

Deployed Bytecode

0x6080604052600436106101855760003560e01c806370a08231116100d15780639c5257e01161008a578063c02ad35e11610064578063c02ad35e14610707578063c87b56dd14610727578063e985e9c514610747578063f2fde38b1461079057600080fd5b80639c5257e0146106b2578063a22cb465146106c7578063b88d4fde146106e757600080fd5b806370a082311461060a578063729ad39e1461062a5780637819e2f11461064a5780638da5cb5b1461065f578063907097511461067d57806395d89b411461069d57600080fd5b806323b872dd1161013e57806342842e0e1161011857806342842e0e1461059557806355f804b3146105b55780636352211e146105d557806367636574146105f557600080fd5b806323b872dd14610541578063346de50a146105615780633ccfd60b1461058057600080fd5b806301ffc9a71461045457806306fdde0314610489578063081812fc146104ab578063095ea7b3146104e35780630e04a7d81461050357806318160ddd1461052257600080fd5b3661044f57600554600160b01b900460ff1680156101a1575034155b15610209576113896101b260025490565b60010111156101fc5760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820737570706c7960781b60448201526064015b60405180910390fd5b6102073360016107b0565b005b341580156102215750600554600160a81b900460ff16155b156103f2576000610231336108d4565b9050600081116102795760405162461bcd60e51b8152602060048201526013602482015272596f752068617665206e6f204e75747469657360681b60448201526064016101f3565b336000908152600860205260408120546102d55760405162461bcd60e51b815260206004820152601f60248201527f536f7272792c206772616220616e204e46542077687920646f6e7420796f750060448201526064016101f3565b3360009081526008602052604090205462015180904203049050600081116103595760405162461bcd60e51b815260206004820152603160248201527f4861766520796f7520747269656420776f726b696e672068617264657220696e6044820152707374656164206f6620736d61727465723f60781b60648201526084016101f3565b60006103658284610923565b9050600081116103c95760405162461bcd60e51b815260206004820152602960248201527f536f727279206e6f7468696e6720746f2074616b65206966207468657265206960448201526873206e6f7468696e6760b81b60648201526084016101f3565b3360008181526008602052604090204290556103e590826109fd565b6103ed610a97565b505050005b341580156104095750600554600160a81b900460ff165b156102075760405162461bcd60e51b815260206004820152601660248201527529b7b9393c903a34329033b0b6b29034b99037bb32b960511b60448201526064016101f3565b600080fd5b34801561046057600080fd5b5061047461046f3660046119f9565b610ac1565b60405190151581526020015b60405180910390f35b34801561049557600080fd5b5061049e610b0f565b6040516104809190611a6e565b3480156104b757600080fd5b506104cb6104c6366004611a81565b610ba1565b6040516001600160a01b039091168152602001610480565b3480156104ef57600080fd5b506102076104fe366004611ab6565b610be5565b34801561050f57600080fd5b50600554600160a81b900460ff16610474565b34801561052e57600080fd5b506002545b604051908152602001610480565b34801561054d57600080fd5b5061020761055c366004611ae0565b610c85565b34801561056d57600080fd5b50600554600160b01b900460ff16610474565b34801561058c57600080fd5b50610207610e9d565b3480156105a157600080fd5b506102076105b0366004611ae0565b610f08565b3480156105c157600080fd5b506102076105d0366004611b1c565b610f23565b3480156105e157600080fd5b506104cb6105f0366004611a81565b610f37565b34801561060157600080fd5b50600654610533565b34801561061657600080fd5b50610533610625366004611b8e565b6108d4565b34801561063657600080fd5b50610207610645366004611ba9565b610f42565b34801561065657600080fd5b506102076110d5565b34801561066b57600080fd5b506001546001600160a01b03166104cb565b34801561068957600080fd5b50610207610698366004611b1c565b611150565b3480156106a957600080fd5b5061049e611164565b3480156106be57600080fd5b50610207611173565b3480156106d357600080fd5b506102076106e2366004611c1a565b6111e4565b3480156106f357600080fd5b50610207610702366004611c67565b61127a565b34801561071357600080fd5b50610207610722366004611b8e565b6112be565b34801561073357600080fd5b5061049e610742366004611a81565b611407565b34801561075357600080fd5b50610474610762366004611d43565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205460ff1690565b34801561079c57600080fd5b506102076107ab366004611b8e565b61143e565b600254816107d15760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0383166000818152600a602090815260408083208054680100000000000000018802019055848352600990915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461088057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101610848565b508161089e57604051622e076360e81b815260040160405180910390fd5b600255506108af60008483856114b7565b6113886108bb60025490565b11156108cf576005805460ff60b01b191690555b505050565b60006001600160a01b0382166108fd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600a602052604090205467ffffffffffffffff1690565b600080601e8410156109355783610938565b601e5b9050600062015180600754420381610952576109526119cd565b04905080610965576000925050506109f7565b6000604582101561097a57611388820261097f565b620543a85b90508061099257600093505050506109f7565b600654838602908210156109ad5760009450505050506109f7565b60065482038082106109cf57600680549091019055504793506109f792505050565b600081478402816109e2576109e26119cd565b60068054909501909455909204955050505050505b92915050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610a4a576040519150601f19603f3d011682016040523d82523d6000602084013e610a4f565b606091505b50509050806108cf5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016101f3565b620543a860065410610abf576005805461ffff60a01b1916600160a81b179055610abf611566565b565b60006301ffc9a760e01b6001600160e01b031983161480610af257506380ac58cd60e01b6001600160e01b03198316145b806109f75750506001600160e01b031916635b5e139f60e01b1490565b606060038054610b1e90611d76565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4a90611d76565b8015610b975780601f10610b6c57610100808354040283529160200191610b97565b820191906000526020600020905b815481529060010190602001808311610b7a57829003601f168201915b5050505050905090565b6000610bac826115b8565b610bc9576040516333d1c03960e21b815260040160405180910390fd5b506000908152600b60205260409020546001600160a01b031690565b6000610bf082610f37565b9050336001600160a01b03821614610c2957610c0c8133610762565b610c29576040516367d9dca160e11b815260040160405180910390fd5b6000828152600b602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610c90826115e0565b9050836001600160a01b0316816001600160a01b031614610cc35760405162a1148160e81b815260040160405180910390fd5b6000828152600b602052604090208054600554600160a81b900460ff16158015610cf75750600554600160a01b900460ff16155b8015610d01575083155b15610d0b57610d48565b338082146001600160a01b03881690911417610d4857610d2b8633610762565b610d4857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610d6f57604051633a954ecd60e21b815260040160405180910390fd5b600554600160a01b900460ff168015610d86575083155b15610da45760405163cee9917d60e01b815260040160405180910390fd5b610db18686866001611648565b8015610dbc57600082555b6001600160a01b038681166000908152600a60205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260096020526040902055600160e11b8316610e475760018401600081815260096020526040902054610e45576002548114610e455760008181526009602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e9586868660016114b7565b505050505050565b610ea56116ed565b600554600160a81b900460ff16610efe5760405162461bcd60e51b815260206004820152601960248201527f5468652067616d65206e6565647320746f206265206f7665720000000000000060448201526064016101f3565b610abf33476109fd565b6108cf8383836040518060200160405280600081525061127a565b610f2b6116ed565b6108cf600d8383611934565b60006109f7826115e0565b610f4a6116ed565b7360129d8bc41ed80f7b257fdbc2b57e6230c219d760005b828110156110cf576000848483818110610f7e57610f7e611db1565b9050602002016020810190610f939190611b8e565b6040516370a0823160e01b81526001600160a01b0380831660048301529192506000918516906370a0823190602401602060405180830381865afa158015610fdf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110039190611dc7565b905060008111801561102e57506001600160a01b03821660009081526010602052604090205460ff16155b156110c5576001600160a01b0382811660008181526010602052604090819020805460ff19166001179055516370a0823160e01b815260048101919091526110c5918491908716906370a0823190602401602060405180830381865afa15801561109c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c09190611dc7565b6107b0565b5050600101610f62565b50505050565b6110dd6116ed565b600f5460ff166111245760405162461bcd60e51b815260206004820152601260248201527143616e206f6e6c792066697265206f6e636560701b60448201526064016101f3565b600f805460ff1916905561113730611747565b426007556005805460ff60b01b1916600160b01b179055565b6111586116ed565b6108cf600e8383611934565b606060048054610b1e90611d76565b61117b6116ed565b600254156111c45760405162461bcd60e51b81526020600482015260166024820152750c481bd9880c481a185cc81899595b881b5a5b9d195960521b60448201526064016101f3565b600580546001600160a01b03191633908117909155610abf9060016107b0565b6001600160a01b03821633141561120e5760405163b06307db60e01b815260040160405180910390fd5b336000818152600c602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611285848484610c85565b6001600160a01b0383163b156110cf576112a184848484611799565b6110cf576040516368d2bf6b60e11b815260040160405180910390fd5b6000546001600160a01b0316331461130e5760405162461bcd60e51b81526020600482015260136024820152722cb7ba9030b932903737ba103a3432903232bb60691b60448201526064016101f3565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611357573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137b9190611dc7565b90508061138757600080fd5b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af11580156113da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fe9190611de0565b6108cf57600080fd5b6060600d61141483611881565b600e60405160200161142893929190611e97565b6040516020818303038152906040529050919050565b6114466116ed565b6001600160a01b0381166114ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101f3565b6114b481611747565b50565b600554600160a01b900460ff1680156114de57506005546001600160a01b03848116911614155b80156114ee57506114ee826118c3565b1561153b576005805460ff60a01b198116909155611517906001600160a01b0316846000610c85565b600580546001600160a01b0385166001600160a81b031990911617600160a01b1790555b50506001600160a01b0390811660009081526008602052604080822042908190559390921681522055565b60018054600080546001600160a01b039081166001600160a01b0319841681179094556040519216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000600254821080156109f7575050600090815260096020526040902054600160e01b161590565b60008160025481101561162f57600081815260096020526040902054600160e01b811661162d575b80611626575060001901600081815260096020526040902054611608565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b6000611653846108d4565b905080156116e6576001600160a01b038416600090815260086020526040902054156116e6576001600160a01b038416600090815260086020526040812054620151809042030490508015610e955760006116ae8284610923565b905080156116e3576001600160a01b03861660009081526008602052604090204290556116db86826109fd565b6116e3610a97565b50505b5050505050565b6001546001600160a01b03163314610abf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f3565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906117ce903390899088908890600401611eca565b6020604051808303816000875af1925050508015611809575060408051601f3d908101601f1916820190925261180691810190611f07565b60015b611864573d808015611837576040519150601f19603f3d011682016040523d82523d6000602084013e61183c565b606091505b50805161185c576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b604080516080019081905280825b600183039250600a81066030018353600a9004806118ac576118b1565b61188f565b50819003601f19909101908152919050565b6000804344426118d260025490565b6040805160208101959095528401929092526060830152608082015260a0810184905260c00160408051601f198184030181529190528051602090910120905061191e6101f482611f24565b611929906001611f46565b6101a4149392505050565b82805461194090611d76565b90600052602060002090601f01602090048101928261196257600085556119a8565b82601f1061197b5782800160ff198235161785556119a8565b828001600101855582156119a8579182015b828111156119a857823582559160200191906001019061198d565b506119b49291506119b8565b5090565b5b808211156119b457600081556001016119b9565b634e487b7160e01b600052601260045260246000fd5b6001600160e01b0319811681146114b457600080fd5b600060208284031215611a0b57600080fd5b8135611626816119e3565b60005b83811015611a31578181015183820152602001611a19565b838111156110cf5750506000910152565b60008151808452611a5a816020860160208601611a16565b601f01601f19169290920160200192915050565b6020815260006116266020830184611a42565b600060208284031215611a9357600080fd5b5035919050565b80356001600160a01b0381168114611ab157600080fd5b919050565b60008060408385031215611ac957600080fd5b611ad283611a9a565b946020939093013593505050565b600080600060608486031215611af557600080fd5b611afe84611a9a565b9250611b0c60208501611a9a565b9150604084013590509250925092565b60008060208385031215611b2f57600080fd5b823567ffffffffffffffff80821115611b4757600080fd5b818501915085601f830112611b5b57600080fd5b813581811115611b6a57600080fd5b866020828501011115611b7c57600080fd5b60209290920196919550909350505050565b600060208284031215611ba057600080fd5b61162682611a9a565b60008060208385031215611bbc57600080fd5b823567ffffffffffffffff80821115611bd457600080fd5b818501915085601f830112611be857600080fd5b813581811115611bf757600080fd5b8660208260051b8501011115611b7c57600080fd5b80151581146114b457600080fd5b60008060408385031215611c2d57600080fd5b611c3683611a9a565b91506020830135611c4681611c0c565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611c7d57600080fd5b611c8685611a9a565b9350611c9460208601611a9a565b925060408501359150606085013567ffffffffffffffff80821115611cb857600080fd5b818701915087601f830112611ccc57600080fd5b813581811115611cde57611cde611c51565b604051601f8201601f19908116603f01168101908382118183101715611d0657611d06611c51565b816040528281528a6020848701011115611d1f57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611d5657600080fd5b611d5f83611a9a565b9150611d6d60208401611a9a565b90509250929050565b600181811c90821680611d8a57607f821691505b60208210811415611dab57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611dd957600080fd5b5051919050565b600060208284031215611df257600080fd5b815161162681611c0c565b8054600090600181811c9080831680611e1757607f831692505b6020808410821415611e3957634e487b7160e01b600052602260045260246000fd5b818015611e4d5760018114611e5e57611e8b565b60ff19861689528489019650611e8b565b60008881526020902060005b86811015611e835781548b820152908501908301611e6a565b505084890196505b50505050505092915050565b6000611ea38286611dfd565b8451611eb3818360208901611a16565b611ebf81830186611dfd565b979650505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611efd90830184611a42565b9695505050505050565b600060208284031215611f1957600080fd5b8151611626816119e3565b600082611f4157634e487b7160e01b600052601260045260246000fd5b500690565b60008219821115611f6757634e487b7160e01b600052601160045260246000fd5b50019056fea2646970667358221220d79c825f3e0dee8387da7e9df485f61eacb21c482591fc416fce5bdb1ef8496164736f6c634300080c0033

Deployed Bytecode Sourcemap

33135:3812:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33479:11;;-1:-1:-1;;;33479:11:0;;;;:29;;;;-1:-1:-1;33494:9:0;:14;33479:29;33476:1292;;;33605:13;33588;11349;;;11091:308;33588:13;33584:1;:17;:34;;33554:160;;;;-1:-1:-1;;;33554:160:0;;216:2:1;33554:160:0;;;198:21:1;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:47;331:18;;33554:160:0;;;;;;;;;33733:20;33739:10;33751:1;33733:5;:20::i;:::-;33135:3812;33476:1292;33789:9;:14;:35;;;;-1:-1:-1;33807:8:0;;-1:-1:-1;;;33807:8:0;;;;:17;33789:35;33786:982;;;33841:17;33861:21;33871:10;33861:9;:21::i;:::-;33841:41;;33920:1;33905:12;:16;33897:48;;;;-1:-1:-1;;;33897:48:0;;562:2:1;33897:48:0;;;544:21:1;601:2;581:18;;;574:30;-1:-1:-1;;;620:18:1;;;613:49;679:18;;33897:48:0;360:343:1;33897:48:0;34028:10;33962:22;34011:28;;;:16;:28;;;;;;34003:76;;;;-1:-1:-1;;;34003:76:0;;910:2:1;34003:76:0;;;892:21:1;949:2;929:18;;;922:30;988:33;968:18;;;961:61;1039:18;;34003:76:0;708:355:1;34003:76:0;34185:10;34168:28;;;;:16;:28;;;;;;9527:5;;34150:15;:46;34145:61;34125:81;;34266:1;34246:17;:21;34238:83;;;;-1:-1:-1;;;34238:83:0;;1402:2:1;34238:83:0;;;1384:21:1;1441:2;1421:18;;;1414:30;1480:34;1460:18;;;1453:62;-1:-1:-1;;;1531:18:1;;;1524:47;1588:19;;34238:83:0;1200:413:1;34238:83:0;34336:8;34347:43;34358:17;34377:12;34347:10;:43::i;:::-;34336:54;;34419:1;34413:3;:7;34405:61;;;;-1:-1:-1;;;34405:61:0;;1820:2:1;34405:61:0;;;1802:21:1;1859:2;1839:18;;;1832:30;1898:34;1878:18;;;1871:62;-1:-1:-1;;;1949:18:1;;;1942:39;1998:19;;34405:61:0;1618:405:1;34405:61:0;34532:10;34515:28;;;;:16;:28;;;;;34546:15;34515:46;;34590:24;;34610:3;34590:7;:24::i;:::-;34631:21;:19;:21::i;:::-;33826:838;;;33135:3812;33786:982;34673:9;:14;:26;;;;-1:-1:-1;34691:8:0;;-1:-1:-1;;;34691:8:0;;;;34673:26;34670:98;;;34716:40;;-1:-1:-1;;;34716:40:0;;2230:2:1;34716:40:0;;;2212:21:1;2269:2;2249:18;;;2242:30;-1:-1:-1;;;2288:18:1;;;2281:52;2350:18;;34716:40:0;2028:346:1;33135:3812:0;;;;12577:639;;;;;;;;;;-1:-1:-1;12577:639:0;;;;;:::i;:::-;;:::i;:::-;;;2930:14:1;;2923:22;2905:41;;2893:2;2878:18;12577:639:0;;;;;;;;13224:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;17436:218::-;;;;;;;;;;-1:-1:-1;17436:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4057:32:1;;;4039:51;;4027:2;4012:18;17436:218:0;3893:203:1;17028:400:0;;;;;;;;;;-1:-1:-1;17028:400:0;;;;;:::i;:::-;;:::i;36759:85::-;;;;;;;;;;-1:-1:-1;36828:8:0;;-1:-1:-1;;;36828:8:0;;;;36759:85;;11091:308;;;;;;;;;;-1:-1:-1;11349:13:0;;11091:308;;;4684:25:1;;;4672:2;4657:18;11091:308:0;4538:177:1;19596:3032:0;;;;;;;;;;-1:-1:-1;19596:3032:0;;;;;:::i;:::-;;:::i;36465:91::-;;;;;;;;;;-1:-1:-1;36537:11:0;;-1:-1:-1;;;36537:11:0;;;;36465:91;;34856:157;;;;;;;;;;;;;:::i;22636:185::-;;;;;;;;;;-1:-1:-1;22636:185:0;;;;;:::i;:::-;;:::i;36231:111::-;;;;;;;;;;-1:-1:-1;36231:111:0;;;;;:::i;:::-;;:::i;13874:152::-;;;;;;;;;;-1:-1:-1;13874:152:0;;;;;:::i;:::-;;:::i;36852:92::-;;;;;;;;;;-1:-1:-1;36919:17:0;;36852:92;;11407:233;;;;;;;;;;-1:-1:-1;11407:233:0;;;;;:::i;:::-;;:::i;35302:586::-;;;;;;;;;;-1:-1:-1;35302:586:0;;;;;:::i;:::-;;:::i;35896:327::-;;;;;;;;;;;;;:::i;2988:89::-;;;;;;;;;;-1:-1:-1;3063:6:0;;-1:-1:-1;;;;;3063:6:0;2988:89;;36350:107;;;;;;;;;;-1:-1:-1;36350:107:0;;;;;:::i;:::-;;:::i;13332:104::-;;;;;;;;;;;;;:::i;35021:273::-;;;;;;;;;;;;;:::i;17662:308::-;;;;;;;;;;-1:-1:-1;17662:308:0;;;;;:::i;:::-;;:::i;22829:399::-;;;;;;;;;;-1:-1:-1;22829:399:0;;;;;:::i;:::-;;:::i;3822:363::-;;;;;;;;;;-1:-1:-1;3822:363:0;;;;;:::i;:::-;;:::i;36564:187::-;;;;;;;;;;-1:-1:-1;36564:187:0;;;;;:::i;:::-;;:::i;17978:164::-;;;;;;;;;;-1:-1:-1;17978:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;18099:25:0;;;18075:4;18099:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;17978:164;3224:203;;;;;;;;;;-1:-1:-1;3224:203:0;;;;;:::i;:::-;;:::i;23960:2591::-;24056:13;;24084;24080:44;;24106:18;;-1:-1:-1;;;24106:18:0;;;;;;;;;;;24080:44;-1:-1:-1;;;;;24538:22:0;;;;;;:18;:22;;;;7717:2;24538:22;;;:71;;24576:32;24564:45;;24538:71;;;24852:31;;;:17;:31;;;;;-1:-1:-1;16986:15:0;;16960:24;16956:46;16649:11;16624:23;16620:41;16617:52;16607:63;;24852:173;;25087:23;;;;24852:31;;24538:22;;25586:25;24538:22;;25439:335;25854:1;25840:12;25836:20;25794:346;25895:3;25886:7;25883:16;25794:346;;26113:7;26103:8;26100:1;26073:25;26070:1;26067;26062:59;25948:1;25935:15;25794:346;;;-1:-1:-1;26173:13:0;26169:45;;26195:19;;-1:-1:-1;;;26195:19:0;;;;;;;;;;;26169:45;26231:13;:19;-1:-1:-1;26272:60:0;26301:1;26305:2;26309:12;26323:8;26272:20;:60::i;:::-;9644:4;26396:13;11349;;;11091:308;26396:13;:25;26393:151;;;26513:11;:19;;-1:-1:-1;;;;26513:19:0;;;26393:151;24022:2529;23960:2591;;:::o;11407:233::-;11479:7;-1:-1:-1;;;;;11503:19:0;;11499:60;;11531:28;;-1:-1:-1;;;11531:28:0;;;;;;;;;;;11499:60;-1:-1:-1;;;;;;11577:25:0;;;;;:18;:25;;;;;;7579:13;11577:55;;11407:233::o;31282:1173::-;31351:4;31368:17;9696:2;31388:8;:27;;:56;;31436:8;31388:56;;;9696:2;31388:56;31368:76;;31480:20;9527:5;31526:16;;31508:15;:34;31503:49;;;;;:::i;:::-;;;-1:-1:-1;31572:20:0;31569:38;;31603:1;31596:8;;;;;;31569:38;31623:18;9754:2;31645:15;:42;;31644:95;;9644:4;31712:15;:27;31644:95;;;9583:6;31644:95;31623:116;-1:-1:-1;31759:18:0;31756:66;;31805:1;31798:8;;;;;;;31756:66;31901:17;;31859:24;;;;31901:33;-1:-1:-1;31898:51:0;;;31945:1;31938:8;;;;;;;;31898:51;32008:17;;31992:33;;32043:36;;;32040:163;;32100:17;:40;;;;;;;-1:-1:-1;32166:21:0;;-1:-1:-1;32159:28:0;;-1:-1:-1;;;32159:28:0;32040:163;32217:14;32276:19;32251:21;32235:13;:37;32234:61;;;;;:::i;:::-;32369:17;:34;;;;;;;;32234:61;;;;-1:-1:-1;;;;;;31282:1173:0;;;;;:::o;32463:169::-;32526:9;32549:2;-1:-1:-1;;;;;32541:16:0;32565:6;32541:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32525:51;;;32595:4;32587:37;;;;-1:-1:-1;;;32587:37:0;;8856:2:1;32587:37:0;;;8838:21:1;8895:2;8875:18;;;8868:30;-1:-1:-1;;;8914:18:1;;;8907:50;8974:18;;32587:37:0;8654:344:1;32640:486:0;9583:6;32881:17;;:39;32878:241;;32937:8;:15;;-1:-1:-1;;;;32967:32:0;-1:-1:-1;;;32967:32:0;;;33086:21;:19;:21::i;:::-;32640:486::o;12577:639::-;12662:4;-1:-1:-1;;;;;;;;;12986:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;13063:25:0;;;12986:102;:179;;;-1:-1:-1;;;;;;;;13140:25:0;-1:-1:-1;;;13140:25:0;;12577:639::o;13224:100::-;13278:13;13311:5;13304:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13224:100;:::o;17436:218::-;17512:7;17537:16;17545:7;17537;:16::i;:::-;17532:64;;17562:34;;-1:-1:-1;;;17562:34:0;;;;;;;;;;;17532:64;-1:-1:-1;17616:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;17616:30:0;;17436:218::o;17028:400::-;17109:13;17125:16;17133:7;17125;:16::i;:::-;17109:32;-1:-1:-1;27660:10:0;-1:-1:-1;;;;;17158:28:0;;;17154:175;;17206:44;17223:5;27660:10;17978:164;:::i;17206:44::-;17201:128;;17278:35;;-1:-1:-1;;;17278:35:0;;;;;;;;;;;17201:128;17341:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;17341:35:0;-1:-1:-1;;;;;17341:35:0;;;;;;;;;17392:28;;17341:24;;17392:28;;;;;;;17098:330;17028:400;;:::o;19596:3032::-;19730:27;19760;19779:7;19760:18;:27::i;:::-;19730:57;;19845:4;-1:-1:-1;;;;;19804:45:0;19820:19;-1:-1:-1;;;;;19804:45:0;;19800:86;;19858:28;;-1:-1:-1;;;19858:28:0;;;;;;;;;;;19800:86;19900:27;19320:24;;;:15;:24;;;;;19542:26;;20007:8;;-1:-1:-1;;;20007:8:0;;;;:17;;;:54;;-1:-1:-1;20028:24:0;;-1:-1:-1;;;20028:24:0;;;;:33;20007:54;:70;;;;-1:-1:-1;20065:12:0;;20007:70;20004:392;;;;;;27660:10;19050:30;;;-1:-1:-1;;;;;18743:28:0;;19028:20;;;19025:56;20200:184;;20297:43;20314:4;27660:10;17978:164;:::i;20297:43::-;20292:92;;20349:35;;-1:-1:-1;;;20349:35:0;;;;;;;;;;;20292:92;-1:-1:-1;;;;;20412:16:0;;20408:52;;20437:23;;-1:-1:-1;;;20437:23:0;;;;;;;;;;;20408:52;20477:24;;-1:-1:-1;;;20477:24:0;;;;:40;;;;-1:-1:-1;20505:12:0;;20477:40;20473:73;;;20526:20;;-1:-1:-1;;;20526:20:0;;;;;;;;;;;20473:73;20559:43;20581:4;20587:2;20591:7;20600:1;20559:21;:43::i;:::-;20695:15;20692:160;;;20835:1;20814:19;20807:30;20692:160;-1:-1:-1;;;;;21232:24:0;;;;;;;:18;:24;;;;;;21230:26;;-1:-1:-1;;21230:26:0;;;21301:22;;;;;;;;;21299:24;;-1:-1:-1;21299:24:0;;;16649:11;16624:23;16620:41;16607:63;-1:-1:-1;;;16607:63:0;21594:26;;;;:17;:26;;;;;:175;-1:-1:-1;;;21889:47:0;;21885:627;;21994:1;21984:11;;21962:19;22117:30;;;:17;:30;;;;;;22113:384;;22255:13;;22240:11;:28;22236:242;;22402:30;;;;:17;:30;;;;;:52;;;22236:242;21943:569;21885:627;22559:7;22555:2;-1:-1:-1;;;;;22540:27:0;22549:4;-1:-1:-1;;;;;22540:27:0;;;;;;;;;;;22578:42;22599:4;22605:2;22609:7;22618:1;22578:20;:42::i;:::-;19719:2909;;;19596:3032;;;:::o;34856:157::-;2947:13;:11;:13::i;:::-;34914:8:::1;::::0;-1:-1:-1;;;34914:8:0;::::1;;;34906:46;;;::::0;-1:-1:-1;;;34906:46:0;;9590:2:1;34906:46:0::1;::::0;::::1;9572:21:1::0;9629:2;9609:18;;;9602:30;9668:27;9648:18;;;9641:55;9713:18;;34906:46:0::1;9388:349:1::0;34906:46:0::1;34963:42;34971:10;34983:21;34963:7;:42::i;22636:185::-:0;22774:39;22791:4;22797:2;22801:7;22774:39;;;;;;;;;;;;:16;:39::i;36231:111::-;2947:13;:11;:13::i;:::-;36307:27:::1;:16;36326:8:::0;;36307:27:::1;:::i;13874:152::-:0;13946:7;13989:27;14008:7;13989:18;:27::i;35302:586::-;2947:13;:11;:13::i;:::-;35402:42:::1;35380:11;35456:425;35480:25:::0;;::::1;35456:425;;;35523:16;35542:10;;35553:5;35542:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;35588:23;::::0;-1:-1:-1;;;35588:23:0;;-1:-1:-1;;;;;4057:32:1;;;35588:23:0::1;::::0;::::1;4039:51:1::0;35523:36:0;;-1:-1:-1;35574:11:0::1;::::0;35588:13;::::1;::::0;::::1;::::0;4012:18:1;;35588:23:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35574:37;;35638:1;35629:6;:10;:45;;;;-1:-1:-1::0;;;;;;35643:22:0;::::1;;::::0;;;:12:::1;:22;::::0;;;;;::::1;;:31;35629:45;35626:173;;;-1:-1:-1::0;;;;;35695:22:0;;::::1;;::::0;;;:12:::1;:22;::::0;;;;;;:29;;-1:-1:-1;;35695:29:0::1;35720:4;35695:29;::::0;;35759:23;-1:-1:-1;;;35759:23:0;;::::1;::::0;::::1;4039:51:1::0;;;;35743:40:0::1;::::0;35695:22;;35759:13;;::::1;::::0;::::1;::::0;4012:18:1;;35759:23:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35743:5;:40::i;:::-;-1:-1:-1::0;;35853:1:0::1;35844:10;35456:425;;;;35369:519;35302:586:::0;;:::o;35896:327::-;2947:13;:11;:13::i;:::-;35958:8:::1;::::0;::::1;;35950:39;;;::::0;-1:-1:-1;;;35950:39:0;;10265:2:1;35950:39:0::1;::::0;::::1;10247:21:1::0;10304:2;10284:18;;;10277:30;-1:-1:-1;;;10323:18:1;;;10316:48;10381:18;;35950:39:0::1;10063:342:1::0;35950:39:0::1;36000:8;:16:::0;;-1:-1:-1;;36000:16:0::1;::::0;;36079:33:::1;36106:4;36079:18;:33::i;:::-;36171:15;36152:16;:34:::0;36197:11:::1;:18:::0;;-1:-1:-1;;;;36197:18:0::1;-1:-1:-1::0;;;36197:18:0::1;::::0;;35896:327::o;36350:107::-;2947:13;:11;:13::i;:::-;36431:18:::1;:7;36441:8:::0;;36431:18:::1;:::i;13332:104::-:0;13388:13;13421:7;13414:14;;;;;:::i;35021:273::-;2947:13;:11;:13::i;:::-;11349;;35088:18;35080:53:::1;;;::::0;-1:-1:-1;;;35080:53:0;;10612:2:1;35080:53:0::1;::::0;::::1;10594:21:1::0;10651:2;10631:18;;;10624:30;-1:-1:-1;;;10670:18:1;;;10663:52;10732:18;;35080:53:0::1;10410:346:1::0;35080:53:0::1;35219:23;:36:::0;;-1:-1:-1;;;;;;35219:36:0::1;35245:10;35219:36:::0;;::::1;::::0;;;35266:20:::1;::::0;35219:36;35266:5:::1;:20::i;17662:308::-:0;-1:-1:-1;;;;;17761:31:0;;27660:10;17761:31;17757:61;;;17801:17;;-1:-1:-1;;;17801:17:0;;;;;;;;;;;17757:61;27660:10;17831:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;17831:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;17831:60:0;;;;;;;;;;17907:55;;2905:41:1;;;17831:49:0;;27660:10;17907:55;;2878:18:1;17907:55:0;;;;;;;17662:308;;:::o;22829:399::-;22996:31;23009:4;23015:2;23019:7;22996:12;:31::i;:::-;-1:-1:-1;;;;;23042:14:0;;;:19;23038:183;;23081:56;23112:4;23118:2;23122:7;23131:5;23081:30;:56::i;:::-;23076:145;;23165:40;;-1:-1:-1;;;23165:40:0;;;;;;;;;;;3822:363;3906:10;;-1:-1:-1;;;;;3906:10:0;3892;:24;3884:56;;;;-1:-1:-1;;;3884:56:0;;10963:2:1;3884:56:0;;;10945:21:1;11002:2;10982:18;;;10975:30;-1:-1:-1;;;11021:18:1;;;11014:49;11080:18;;3884:56:0;10761:343:1;3884:56:0;4030:30;;-1:-1:-1;;;4030:30:0;;4054:4;4030:30;;;4039:51:1;3973:12:0;;3951;;-1:-1:-1;;;;;4030:15:0;;;;;4012:18:1;;4030:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3997:63;-1:-1:-1;4079:27:0;4071:36;;;;;;4141:10;;4126:50;;-1:-1:-1;;;4126:50:0;;-1:-1:-1;;;;;4141:10:0;;;4126:50;;;11283:51:1;11350:18;;;11343:34;;;4126:14:0;;;;;;11256:18:1;;4126:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4118:59;;;;;36564:187;36639:13;36696:16;36714:18;36724:7;36714:9;:18::i;:::-;36734:7;36679:63;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36665:78;;36564:187;;;:::o;3224:203::-;2947:13;:11;:13::i;:::-;-1:-1:-1;;;;;3315:22:0;::::1;3307:73;;;::::0;-1:-1:-1;;;3307:73:0;;13405:2:1;3307:73:0::1;::::0;::::1;13387:21:1::0;13444:2;13424:18;;;13417:30;13483:34;13463:18;;;13456:62;-1:-1:-1;;;13534:18:1;;;13527:36;13580:19;;3307:73:0::1;13203:402:1::0;3307:73:0::1;3391:28;3410:8;3391:18;:28::i;:::-;3224:203:::0;:::o;30157:841::-;30313:24;;-1:-1:-1;;;30313:24:0;;;;:57;;;;-1:-1:-1;30341:23:0;;-1:-1:-1;;;;;30341:29:0;;;:23;;:29;;30313:57;:93;;;;;30374:32;30398:7;30374:23;:32::i;:::-;30310:428;;;30546:24;:32;;-1:-1:-1;;;;30546:32:0;;;;;30593:44;;-1:-1:-1;;;;;30606:23:0;30631:2;30573:5;30593:12;:44::i;:::-;30652:24;:31;;-1:-1:-1;;;;;30698:28:0;;-1:-1:-1;;;;;;30698:28:0;;;;-1:-1:-1;;;30698:28:0;;;30310:428;-1:-1:-1;;;;;;;30857:20:0;;;;;;;:16;:20;;;;;;30880:15;30857:38;;;;30950:22;;;;;;;:40;30157:841::o;3435:180::-;3513:6;;;3494:16;3539:10;;-1:-1:-1;;;;;3539:10:0;;;-1:-1:-1;;;;;;3530:19:0;;;;;;;3565:42;;3513:6;;;3539:10;3513:6;;3565:42;;;3483:132;3435:180::o;18150:282::-;18215:4;18305:13;;18295:7;:23;18252:153;;;;-1:-1:-1;;18356:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;18356:44:0;:49;;18150:282::o;14581:1275::-;14648:7;14683;14785:13;;14778:4;:20;14774:1015;;;14823:14;14840:23;;;:17;:23;;;;;;-1:-1:-1;;;14929:24:0;;14925:845;;15594:113;15601:11;15594:113;;-1:-1:-1;;;15672:6:0;15654:25;;;;:17;:25;;;;;;15594:113;;;15740:6;14581:1275;-1:-1:-1;;;14581:1275:0:o;14925:845::-;14800:989;14774:1015;15817:31;;-1:-1:-1;;;15817:31:0;;;;;;;;;;;29275:874;29416:17;29436:13;29446:2;29436:9;:13::i;:::-;29416:33;-1:-1:-1;29463:16:0;;29460:682;;-1:-1:-1;;;;;29499:20:0;;29522:1;29499:20;;;:16;:20;;;;;;:24;29496:635;;-1:-1:-1;;;;;29665:20:0;;29544:22;29665:20;;;:16;:20;;;;;;9527:5;;29647:15;:38;29642:53;;-1:-1:-1;29736:21:0;;29733:383;;29782:8;29793:43;29804:17;29823:12;29793:10;:43::i;:::-;29782:54;-1:-1:-1;29862:7:0;;29859:238;;-1:-1:-1;;;;;29944:20:0;;;;;;:16;:20;;;;;29967:15;29944:38;;30009:16;29961:2;30021:3;30009:7;:16::i;:::-;30052:21;:19;:21::i;:::-;29759:357;29525:606;29496:635;29405:744;29275:874;;;;:::o;3085:131::-;3149:6;;-1:-1:-1;;;;;3149:6:0;27660:10;3149:22;3141:67;;;;-1:-1:-1;;;3141:67:0;;13812:2:1;3141:67:0;;;13794:21:1;;;13831:18;;;13824:30;13890:34;13870:18;;;13863:62;13942:18;;3141:67:0;13610:356:1;3623:191:0;3716:6;;;-1:-1:-1;;;;;3733:17:0;;;-1:-1:-1;;;;;;3733:17:0;;;;;;;3766:40;;3716:6;;;3733:17;3716:6;;3766:40;;3697:16;;3766:40;3686:128;3623:191;:::o;23236:716::-;23420:88;;-1:-1:-1;;;23420:88:0;;23399:4;;-1:-1:-1;;;;;23420:45:0;;;;;:88;;27660:10;;23487:4;;23493:7;;23502:5;;23420:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23420:88:0;;;;;;;;-1:-1:-1;;23420:88:0;;;;;;;;;;;;:::i;:::-;;;23416:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23703:13:0;;23699:235;;23749:40;;-1:-1:-1;;;23749:40:0;;;;;;;;;;;23699:235;23892:6;23886:13;23877:6;23873:2;23869:15;23862:38;23416:529;-1:-1:-1;;;;;;23579:64:0;-1:-1:-1;;;23579:64:0;;-1:-1:-1;23236:716:0;;;;;;:::o;27686:1581::-;28169:4;28163:11;;28176:4;28159:22;28255:17;;;;28159:22;28613:5;28595:428;28661:1;28656:3;28652:11;28645:18;;28832:2;28826:4;28822:13;28818:2;28814:22;28809:3;28801:36;28926:2;28916:13;;;28983:25;;29001:5;;28983:25;28595:428;;;-1:-1:-1;29053:13:0;;;-1:-1:-1;;29168:14:0;;;29230:19;;;29168:14;27686:1581;-1:-1:-1;27686:1581:0:o;31006:268::-;31076:4;31093:15;31143:12;31157:16;31175:15;31192:13;11349;;;11091:308;31192:13;31126:89;;;;;;14960:19:1;;;;14995:12;;14988:28;;;;15032:12;;;15025:28;15069:12;;;15062:28;15106:13;;;15099:29;;;15144:13;;31126:89:0;;;-1:-1:-1;;31126:89:0;;;;;;;;;31116:100;;31126:89;31116:100;;;;;-1:-1:-1;31237:16:0;31250:3;31116:100;31237:16;:::i;:::-;31236:22;;31257:1;31236:22;:::i;:::-;31263:3;31235:31;;31006:268;-1:-1:-1;;;31006:268:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;1068:127:1;1129:10;1124:3;1120:20;1117:1;1110:31;1160:4;1157:1;1150:15;1184:4;1181:1;1174:15;2379:131;-1:-1:-1;;;;;;2453:32:1;;2443:43;;2433:71;;2500:1;2497;2490:12;2515:245;2573:6;2626:2;2614:9;2605:7;2601:23;2597:32;2594:52;;;2642:1;2639;2632:12;2594:52;2681:9;2668:23;2700:30;2724:5;2700:30;:::i;2957:258::-;3029:1;3039:113;3053:6;3050:1;3047:13;3039:113;;;3129:11;;;3123:18;3110:11;;;3103:39;3075:2;3068:10;3039:113;;;3170:6;3167:1;3164:13;3161:48;;;-1:-1:-1;;3205:1:1;3187:16;;3180:27;2957:258::o;3220:::-;3262:3;3300:5;3294:12;3327:6;3322:3;3315:19;3343:63;3399:6;3392:4;3387:3;3383:14;3376:4;3369:5;3365:16;3343:63;:::i;:::-;3460:2;3439:15;-1:-1:-1;;3435:29:1;3426:39;;;;3467:4;3422:50;;3220:258;-1:-1:-1;;3220:258:1:o;3483:220::-;3632:2;3621:9;3614:21;3595:4;3652:45;3693:2;3682:9;3678:18;3670:6;3652:45;:::i;3708:180::-;3767:6;3820:2;3808:9;3799:7;3795:23;3791:32;3788:52;;;3836:1;3833;3826:12;3788:52;-1:-1:-1;3859:23:1;;3708:180;-1:-1:-1;3708:180:1:o;4101:173::-;4169:20;;-1:-1:-1;;;;;4218:31:1;;4208:42;;4198:70;;4264:1;4261;4254:12;4198:70;4101:173;;;:::o;4279:254::-;4347:6;4355;4408:2;4396:9;4387:7;4383:23;4379:32;4376:52;;;4424:1;4421;4414:12;4376:52;4447:29;4466:9;4447:29;:::i;:::-;4437:39;4523:2;4508:18;;;;4495:32;;-1:-1:-1;;;4279:254:1:o;4720:328::-;4797:6;4805;4813;4866:2;4854:9;4845:7;4841:23;4837:32;4834:52;;;4882:1;4879;4872:12;4834:52;4905:29;4924:9;4905:29;:::i;:::-;4895:39;;4953:38;4987:2;4976:9;4972:18;4953:38;:::i;:::-;4943:48;;5038:2;5027:9;5023:18;5010:32;5000:42;;4720:328;;;;;:::o;5053:592::-;5124:6;5132;5185:2;5173:9;5164:7;5160:23;5156:32;5153:52;;;5201:1;5198;5191:12;5153:52;5241:9;5228:23;5270:18;5311:2;5303:6;5300:14;5297:34;;;5327:1;5324;5317:12;5297:34;5365:6;5354:9;5350:22;5340:32;;5410:7;5403:4;5399:2;5395:13;5391:27;5381:55;;5432:1;5429;5422:12;5381:55;5472:2;5459:16;5498:2;5490:6;5487:14;5484:34;;;5514:1;5511;5504:12;5484:34;5559:7;5554:2;5545:6;5541:2;5537:15;5533:24;5530:37;5527:57;;;5580:1;5577;5570:12;5527:57;5611:2;5603:11;;;;;5633:6;;-1:-1:-1;5053:592:1;;-1:-1:-1;;;;5053:592:1:o;5650:186::-;5709:6;5762:2;5750:9;5741:7;5737:23;5733:32;5730:52;;;5778:1;5775;5768:12;5730:52;5801:29;5820:9;5801:29;:::i;5841:615::-;5927:6;5935;5988:2;5976:9;5967:7;5963:23;5959:32;5956:52;;;6004:1;6001;5994:12;5956:52;6044:9;6031:23;6073:18;6114:2;6106:6;6103:14;6100:34;;;6130:1;6127;6120:12;6100:34;6168:6;6157:9;6153:22;6143:32;;6213:7;6206:4;6202:2;6198:13;6194:27;6184:55;;6235:1;6232;6225:12;6184:55;6275:2;6262:16;6301:2;6293:6;6290:14;6287:34;;;6317:1;6314;6307:12;6287:34;6370:7;6365:2;6355:6;6352:1;6348:14;6344:2;6340:23;6336:32;6333:45;6330:65;;;6391:1;6388;6381:12;6461:118;6547:5;6540:13;6533:21;6526:5;6523:32;6513:60;;6569:1;6566;6559:12;6584:315;6649:6;6657;6710:2;6698:9;6689:7;6685:23;6681:32;6678:52;;;6726:1;6723;6716:12;6678:52;6749:29;6768:9;6749:29;:::i;:::-;6739:39;;6828:2;6817:9;6813:18;6800:32;6841:28;6863:5;6841:28;:::i;:::-;6888:5;6878:15;;;6584:315;;;;;:::o;6904:127::-;6965:10;6960:3;6956:20;6953:1;6946:31;6996:4;6993:1;6986:15;7020:4;7017:1;7010:15;7036:1138;7131:6;7139;7147;7155;7208:3;7196:9;7187:7;7183:23;7179:33;7176:53;;;7225:1;7222;7215:12;7176:53;7248:29;7267:9;7248:29;:::i;:::-;7238:39;;7296:38;7330:2;7319:9;7315:18;7296:38;:::i;:::-;7286:48;;7381:2;7370:9;7366:18;7353:32;7343:42;;7436:2;7425:9;7421:18;7408:32;7459:18;7500:2;7492:6;7489:14;7486:34;;;7516:1;7513;7506:12;7486:34;7554:6;7543:9;7539:22;7529:32;;7599:7;7592:4;7588:2;7584:13;7580:27;7570:55;;7621:1;7618;7611:12;7570:55;7657:2;7644:16;7679:2;7675;7672:10;7669:36;;;7685:18;;:::i;:::-;7760:2;7754:9;7728:2;7814:13;;-1:-1:-1;;7810:22:1;;;7834:2;7806:31;7802:40;7790:53;;;7858:18;;;7878:22;;;7855:46;7852:72;;;7904:18;;:::i;:::-;7944:10;7940:2;7933:22;7979:2;7971:6;7964:18;8019:7;8014:2;8009;8005;8001:11;7997:20;7994:33;7991:53;;;8040:1;8037;8030:12;7991:53;8096:2;8091;8087;8083:11;8078:2;8070:6;8066:15;8053:46;8141:1;8136:2;8131;8123:6;8119:15;8115:24;8108:35;8162:6;8152:16;;;;;;;7036:1138;;;;;;;:::o;8179:260::-;8247:6;8255;8308:2;8296:9;8287:7;8283:23;8279:32;8276:52;;;8324:1;8321;8314:12;8276:52;8347:29;8366:9;8347:29;:::i;:::-;8337:39;;8395:38;8429:2;8418:9;8414:18;8395:38;:::i;:::-;8385:48;;8179:260;;;;;:::o;9003:380::-;9082:1;9078:12;;;;9125;;;9146:61;;9200:4;9192:6;9188:17;9178:27;;9146:61;9253:2;9245:6;9242:14;9222:18;9219:38;9216:161;;;9299:10;9294:3;9290:20;9287:1;9280:31;9334:4;9331:1;9324:15;9362:4;9359:1;9352:15;9216:161;;9003:380;;;:::o;9742:127::-;9803:10;9798:3;9794:20;9791:1;9784:31;9834:4;9831:1;9824:15;9858:4;9855:1;9848:15;9874:184;9944:6;9997:2;9985:9;9976:7;9972:23;9968:32;9965:52;;;10013:1;10010;10003:12;9965:52;-1:-1:-1;10036:16:1;;9874:184;-1:-1:-1;9874:184:1:o;11388:245::-;11455:6;11508:2;11496:9;11487:7;11483:23;11479:32;11476:52;;;11524:1;11521;11514:12;11476:52;11556:9;11550:16;11575:28;11597:5;11575:28;:::i;11764:973::-;11849:12;;11814:3;;11904:1;11924:18;;;;11977;;;;12004:61;;12058:4;12050:6;12046:17;12036:27;;12004:61;12084:2;12132;12124:6;12121:14;12101:18;12098:38;12095:161;;;12178:10;12173:3;12169:20;12166:1;12159:31;12213:4;12210:1;12203:15;12241:4;12238:1;12231:15;12095:161;12272:18;12299:104;;;;12417:1;12412:319;;;;12265:466;;12299:104;-1:-1:-1;;12332:24:1;;12320:37;;12377:16;;;;-1:-1:-1;12299:104:1;;12412:319;11711:1;11704:14;;;11748:4;11735:18;;12506:1;12520:165;12534:6;12531:1;12528:13;12520:165;;;12612:14;;12599:11;;;12592:35;12655:16;;;;12549:10;;12520:165;;;12524:3;;12714:6;12709:3;12705:16;12698:23;;12265:466;;;;;;;11764:973;;;;:::o;12742:456::-;12963:3;12991:38;13025:3;13017:6;12991:38;:::i;:::-;13058:6;13052:13;13074:52;13119:6;13115:2;13108:4;13100:6;13096:17;13074:52;:::i;:::-;13142:50;13184:6;13180:2;13176:15;13168:6;13142:50;:::i;:::-;13135:57;12742:456;-1:-1:-1;;;;;;;12742:456:1:o;13971:489::-;-1:-1:-1;;;;;14240:15:1;;;14222:34;;14292:15;;14287:2;14272:18;;14265:43;14339:2;14324:18;;14317:34;;;14387:3;14382:2;14367:18;;14360:31;;;14165:4;;14408:46;;14434:19;;14426:6;14408:46;:::i;:::-;14400:54;13971:489;-1:-1:-1;;;;;;13971:489:1:o;14465:249::-;14534:6;14587:2;14575:9;14566:7;14562:23;14558:32;14555:52;;;14603:1;14600;14593:12;14555:52;14635:9;14629:16;14654:30;14678:5;14654:30;:::i;15168:209::-;15200:1;15226;15216:132;;15270:10;15265:3;15261:20;15258:1;15251:31;15305:4;15302:1;15295:15;15333:4;15330:1;15323:15;15216:132;-1:-1:-1;15362:9:1;;15168:209::o;15382:225::-;15422:3;15453:1;15449:6;15446:1;15443:13;15440:136;;;15498:10;15493:3;15489:20;15486:1;15479:31;15533:4;15530:1;15523:15;15561:4;15558:1;15551:15;15440:136;-1:-1:-1;15592:9:1;;15382:225::o

Swarm Source

ipfs://d79c825f3e0dee8387da7e9df485f61eacb21c482591fc416fce5bdb1ef84961
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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