ETH Price: $3,491.49 (+1.04%)

Token

Snowmen (Snowmen)
 

Overview

Max Total Supply

1,999 Snowmen

Holders

896

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Snowmen
0x29f85e55429de927531fd525d2d4cb4f7088b76c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Beware, the snowman. He brings the cold.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Snowmen

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 8 of 8: Snowmen.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.6;

import "./ERC721AQueryable.sol";
import "./Ownable.sol";
import "./ReentrancyGuard.sol";

interface APileOfSnow {
    function balanceOf(address owner) external view returns (uint256 balance);
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
    function melt(uint256 tokenId) external;
}

contract Snowmen is ERC721AQueryable, Ownable, ReentrancyGuard {
    uint256 public maxSupply = 2000;
    uint256 public tokensNeeded = 3;
    uint256 public minTokenNeeded = 2;
    uint256 public basePrice = 0.0025 ether;

    bool private mintOpen = false;

    string internal baseTokenURI = "";

    APileOfSnow private immutable APileOfSnowContract;

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }
    
    constructor(address _APileOfSnowAddress) ERC721A("Snowmen", "Snowmen") {
        APileOfSnowContract = APileOfSnow(_APileOfSnowAddress);
    }

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

    function toggleMint() external onlyOwner {
        mintOpen = !mintOpen;
    }

    function setBasePrice(uint newBasePrice) external onlyOwner {
        basePrice = newBasePrice;
    }

    function setMinTokenNeeded(uint newMinTokenNeeded) external onlyOwner {
        minTokenNeeded = newMinTokenNeeded;
    }

    function setMaxSupply(uint newSupply) external onlyOwner {
        maxSupply = newSupply;
    }

    function setBaseTokenURI(string calldata _uri) external onlyOwner {
        baseTokenURI = _uri;
    }

    function _baseURI() internal view override returns (string memory) {
        return baseTokenURI;
    }

    function mintAdmin(address to, uint qty) external onlyOwner {
        _mintTo(to, qty);
    }

    function mint() external payable callerIsUser nonReentrant {
        require(mintOpen, "Sale not active");
        _mintCheck();
    }

    function _mintCheck() internal {
        uint256 totalOwned = APileOfSnowContract.balanceOf(_msgSender());
        
        require(totalOwned >= minTokenNeeded, "Not enough piles, need at least 2.");
        require(1 + totalSupply() < maxSupply, "Exceeds Total Supply");

        require(msg.value >= getPayableAmount(_msgSender()), "Incorrect ETH amount");

        uint256 maxBurn = (totalOwned >= tokensNeeded ? tokensNeeded : totalOwned);
        uint256 burnQty = (maxBurn >= minTokenNeeded ? maxBurn : minTokenNeeded);

        if (burnQty > 0) {
            uint256[] memory tokens;
            tokens = APileOfSnowContract.tokensOfOwner(_msgSender());
            for (uint256 i = 0; i < tokens.length && i < burnQty; i++) {
                APileOfSnowContract.melt(tokens[i]);
            }
        }
        _mintTo(_msgSender(), 1);
    }

    function getPayableAmount(address _wallet) public view returns (uint256)
    {
        uint256 totalOwned = APileOfSnowContract.balanceOf(_wallet);
        uint256 maxBuy = (totalOwned < minTokenNeeded ? 0 : (totalOwned > tokensNeeded ? 0 : tokensNeeded - (totalOwned > minTokenNeeded ? totalOwned : minTokenNeeded)));

        return maxBuy * basePrice;
    }

    function _mintTo(address to, uint qty) internal {
        require(qty + totalSupply() < maxSupply, "Exceeds Total Supply");
        _mint(to, qty);
    }
	
    function totalBurned() external view returns (uint256) {
        return _totalBurned();
    }
	
    function mintedBySender() external view returns (uint256) {
        return _numberMinted(_msgSender());
    }
	
    function burnedByOwner(address owner) external view returns (uint256) {
        return _numberBurned(owner);
    }
    
	function melt(uint256 tokenId) external {
        _burn(tokenId, true);
	}

    function withdraw() external onlyOwner {
        payable(_msgSender()).transfer(address(this).balance);
    }
}

File 1 of 8: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 2 of 8: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // 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 maximum `quantity` that can be minted with `_mintERC2309`.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

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

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        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;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    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 ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    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);
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    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))
        }
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    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))
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // 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 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        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)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    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) = _getApprovedAddress(tokenId);

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

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

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

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

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

        _beforeTokenTransfers(from, address(0), 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), 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, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _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))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        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;
    }

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    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;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred.
     * This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred.
     * This includes minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 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: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

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

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

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

File 3 of 8: ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721AQueryable.sol';
import './ERC721A.sol';

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *   - `extraData` = `0`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *   - `extraData` = `<Extra data when token was burned>`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     *   - `extraData` = `<Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

File 4 of 8: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of 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 through `_extraData`.
        uint24 extraData;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            IERC165
    // ==============================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

    // ==============================
    //        IERC721Metadata
    // ==============================

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

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

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

    // ==============================
    //            IERC2309
    // ==============================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

File 5 of 8: IERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

File 6 of 8: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 7 of 8: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_APileOfSnowAddress","type":"address"}],"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":"InvalidQueryRange","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":"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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"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":"basePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"burnedByOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getPayableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"melt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minTokenNeeded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintedBySender","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBasePrice","type":"uint256"}],"name":"setBasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinTokenNeeded","type":"uint256"}],"name":"setMinTokenNeeded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensNeeded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]

6107d0600a556003600b556002600c556608e1bc9bf04000600d55600e805460ff1916905560c0604052600060a0908152600f906200003f9082620001df565b503480156200004d57600080fd5b50604051620028b9380380620028b98339810160408190526200007091620002ab565b60408051808201825260078082526629b737bbb6b2b760c91b6020808401829052845180860190955291845290830152906002620000af8382620001df565b506003620000be8282620001df565b5050600160005550620000d133620000e8565b60016009556001600160a01b0316608052620002dd565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200016557607f821691505b6020821081036200018657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001da57600081815260208120601f850160051c81016020861015620001b55750805b601f850160051c820191505b81811015620001d657828155600101620001c1565b5050505b505050565b81516001600160401b03811115620001fb57620001fb6200013a565b62000213816200020c845462000150565b846200018c565b602080601f8311600181146200024b5760008415620002325750858301515b600019600386901b1c1916600185901b178555620001d6565b600085815260208120601f198616915b828110156200027c578886015182559484019460019091019084016200025b565b50858210156200029b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620002be57600080fd5b81516001600160a01b0381168114620002d657600080fd5b9392505050565b6080516125ab6200030e600039600081816109f201528181611513015281816116ee015261179b01526125ab6000f3fe6080604052600436106102255760003560e01c806380490f9911610123578063c3a71999116100ab578063d89135cd1161006f578063d89135cd1461064a578063de4b32621461065f578063e985e9c51461067f578063efe0d269146106c8578063f2fde38b146106e857600080fd5b8063c3a71999146105c9578063c7876ea4146105e9578063c87b56dd146105ff578063d3dd5fe01461061f578063d5abeb011461063457600080fd5b806395d89b41116100f257806395d89b411461052757806399a2557a1461053c578063a22cb4651461055c578063b88d4fde1461057c578063c23dc68f1461059c57600080fd5b806380490f991461048d5780638462151c146104bc5780638c83ed33146104e95780638da5cb5b1461050957600080fd5b80633ccfd60b116101b157806361def6941161017557806361def694146104025780636352211e146104185780636f8b44b01461043857806370a0823114610458578063715018a61461047857600080fd5b80633ccfd60b1461036a57806342842e0e1461037f578063488fc5081461039f5780634b6742a3146103b55780635bbb2177146103d557600080fd5b80631249c58b116101f85780631249c58b146102db57806318160ddd146102e35780631c6567491461030a57806323b872dd1461032a57806330176e131461034a57600080fd5b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b9575b600080fd5b34801561023657600080fd5b5061024a610245366004611dbb565b610708565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027461075a565b6040516102569190611e28565b34801561028d57600080fd5b506102a161029c366004611e3b565b6107ec565b6040516001600160a01b039091168152602001610256565b3480156102c557600080fd5b506102d96102d4366004611e70565b610830565b005b6102d96108d0565b3480156102ef57600080fd5b5060015460005403600019015b604051908152602001610256565b34801561031657600080fd5b506102fc610325366004611e9a565b6109ce565b34801561033657600080fd5b506102d9610345366004611eb5565b610aba565b34801561035657600080fd5b506102d9610365366004611ef1565b610c5d565b34801561037657600080fd5b506102d9610c99565b34801561038b57600080fd5b506102d961039a366004611eb5565b610cf2565b3480156103ab57600080fd5b506102fc600c5481565b3480156103c157600080fd5b506102d96103d0366004611e3b565b610d0d565b3480156103e157600080fd5b506103f56103f0366004611f62565b610d3c565b6040516102569190612000565b34801561040e57600080fd5b506102fc600b5481565b34801561042457600080fd5b506102a1610433366004611e3b565b610e07565b34801561044457600080fd5b506102d9610453366004611e3b565b610e12565b34801561046457600080fd5b506102fc610473366004611e9a565b610e41565b34801561048457600080fd5b506102d9610e8f565b34801561049957600080fd5b503360009081526005602052604090819020546001600160401b03911c166102fc565b3480156104c857600080fd5b506104dc6104d7366004611e9a565b610eca565b6040516102569190612042565b3480156104f557600080fd5b506102d9610504366004611e3b565b610fd2565b34801561051557600080fd5b506008546001600160a01b03166102a1565b34801561053357600080fd5b50610274610fdd565b34801561054857600080fd5b506104dc61055736600461207a565b610fec565b34801561056857600080fd5b506102d96105773660046120ad565b611173565b34801561058857600080fd5b506102d961059736600461212f565b611208565b3480156105a857600080fd5b506105bc6105b7366004611e3b565b611252565b60405161025691906121ee565b3480156105d557600080fd5b506102d96105e4366004611e70565b6112da565b3480156105f557600080fd5b506102fc600d5481565b34801561060b57600080fd5b5061027461061a366004611e3b565b611312565b34801561062b57600080fd5b506102d9611395565b34801561064057600080fd5b506102fc600a5481565b34801561065657600080fd5b506102fc6113d3565b34801561066b57600080fd5b506102d961067a366004611e3b565b6113de565b34801561068b57600080fd5b5061024a61069a3660046121fc565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106d457600080fd5b506102fc6106e3366004611e9a565b61140d565b3480156106f457600080fd5b506102d9610703366004611e9a565b61143a565b60006301ffc9a760e01b6001600160e01b03198316148061073957506380ac58cd60e01b6001600160e01b03198316145b806107545750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546107699061222f565b80601f01602080910402602001604051908101604052809291908181526020018280546107959061222f565b80156107e25780601f106107b7576101008083540402835291602001916107e2565b820191906000526020600020905b8154815290600101906020018083116107c557829003601f168201915b5050505050905090565b60006107f7826114d2565b610814576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061083b82610e07565b9050336001600160a01b0382161461087457610857813361069a565b610874576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233146109245760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b6002600954036109765760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161091b565b6002600955600e5460ff166109bf5760405162461bcd60e51b815260206004820152600f60248201526e53616c65206e6f742061637469766560881b604482015260640161091b565b6109c7611507565b6001600955565b6040516370a0823160e01b81526001600160a01b03828116600483015260009182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d9190612269565b90506000600c548210610a9f57600b548211610a9857600c548211610a8457600c54610a86565b815b600b54610a939190612298565b610aa2565b6000610aa2565b60005b9050600d5481610ab291906122ab565b949350505050565b6000610ac582611853565b9050836001600160a01b0316816001600160a01b031614610af85760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054610b248187335b6001600160a01b039081169116811491141790565b610b4f57610b32863361069a565b610b4f57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610b7657604051633a954ecd60e21b815260040160405180910390fd5b8015610b8157600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610c1357600184016000818152600460205260408120549003610c11576000548114610c115760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b03163314610c875760405162461bcd60e51b815260040161091b906122ca565b600f610c94828483612345565b505050565b6008546001600160a01b03163314610cc35760405162461bcd60e51b815260040161091b906122ca565b60405133904780156108fc02916000818181858888f19350505050158015610cef573d6000803e3d6000fd5b50565b610c9483838360405180602001604052806000815250611208565b6008546001600160a01b03163314610d375760405162461bcd60e51b815260040161091b906122ca565b600c55565b6060816000816001600160401b03811115610d5957610d596120e9565b604051908082528060200260200182016040528015610dab57816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610d775790505b50905060005b828114610dfe57610dd9868683818110610dcd57610dcd612405565b90506020020135611252565b828281518110610deb57610deb612405565b6020908102919091010152600101610db1565b50949350505050565b600061075482611853565b6008546001600160a01b03163314610e3c5760405162461bcd60e51b815260040161091b906122ca565b600a55565b60006001600160a01b038216610e6a576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314610eb95760405162461bcd60e51b815260040161091b906122ca565b610ec360006118c2565b565b905090565b60606000806000610eda85610e41565b90506000816001600160401b03811115610ef657610ef66120e9565b604051908082528060200260200182016040528015610f1f578160200160208202803683370190505b509050610f4c60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614610fc657610f5f81611914565b91508160400151610fbe5781516001600160a01b031615610f7f57815194505b876001600160a01b0316856001600160a01b031603610fbe5780838780600101985081518110610fb157610fb1612405565b6020026020010181815250505b600101610f4f565b50909695505050505050565b610cef816001611950565b6060600380546107699061222f565b606081831061100e57604051631960ccad60e11b815260040160405180910390fd5b60008061101a60005490565b9050600185101561102a57600194505b80841115611036578093505b600061104187610e41565b905084861015611060578585038181101561105a578091505b50611064565b5060005b6000816001600160401b0381111561107e5761107e6120e9565b6040519080825280602002602001820160405280156110a7578160200160208202803683370190505b509050816000036110bd57935061116c92505050565b60006110c888611252565b9050600081604001516110d9575080515b885b8881141580156110eb5750848714155b15611160576110f981611914565b925082604001516111585782516001600160a01b03161561111957825191505b8a6001600160a01b0316826001600160a01b031603611158578084888060010199508151811061114b5761114b612405565b6020026020010181815250505b6001016110db565b50505092835250909150505b9392505050565b336001600160a01b0383160361119c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611213848484610aba565b6001600160a01b0383163b1561124c5761122f84848484611a9a565b61124c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260018310806112ab57506000548310155b156112b65792915050565b6112bf83611914565b90508060400151156112d15792915050565b61116c83611b85565b6008546001600160a01b031633146113045760405162461bcd60e51b815260040161091b906122ca565b61130e8282611bba565b5050565b606061131d826114d2565b61133a57604051630a14c4b560e41b815260040160405180910390fd5b6000611344611c20565b90508051600003611364576040518060200160405280600081525061116c565b8061136e84611c2f565b60405160200161137f92919061241b565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146113bf5760405162461bcd60e51b815260040161091b906122ca565b600e805460ff19811660ff90911615179055565b6000610ec560015490565b6008546001600160a01b031633146114085760405162461bcd60e51b815260040161091b906122ca565b600d55565b6000610754826001600160a01b031660009081526005602052604090205460801c6001600160401b031690565b6008546001600160a01b031633146114645760405162461bcd60e51b815260040161091b906122ca565b6001600160a01b0381166114c95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161091b565b610cef816118c2565b6000816001111580156114e6575060005482105b8015610754575050600090815260046020526040902054600160e01b161590565b60006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561157d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a19190612269565b9050600c548110156116005760405162461bcd60e51b815260206004820152602260248201527f4e6f7420656e6f7567682070696c65732c206e656564206174206c6561737420604482015261191760f11b606482015260840161091b565b600a54600154600054036000190161161990600161244a565b1061165d5760405162461bcd60e51b81526020600482015260146024820152734578636565647320546f74616c20537570706c7960601b604482015260640161091b565b611666336109ce565b3410156116ac5760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0811551208185b5bdd5b9d60621b604482015260640161091b565b6000600b548210156116be57816116c2565b600b545b90506000600c548210156116d857600c546116da565b815b905080156118485760606001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016638462151c336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381865afa158015611758573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611780919081019061245d565b905060005b81518110801561179457508281105b15611845577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c83ed338383815181106117da576117da612405565b60200260200101516040518263ffffffff1660e01b815260040161180091815260200190565b600060405180830381600087803b15801561181a57600080fd5b505af115801561182e573d6000803e3d6000fd5b50505050808061183d90612502565b915050611785565b50505b610c94336001611bba565b600081806001116118a9576000548110156118a95760008181526004602052604081205490600160e01b821690036118a7575b8060000361116c575060001901600081815260046020526040902054611886565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051608081018252600080825260208201819052918101829052606081019190915260008281526004602052604090205461075490611c7e565b600061195b83611853565b90508060008061197986600090815260066020526040902080549091565b9150915084156119b95761198e818433610b0f565b6119b95761199c833361069a565b6119b957604051632ce44b5f60e11b815260040160405180910390fd5b80156119c457600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260046020526040812091909155600160e11b85169003611a5257600186016000818152600460205260408120549003611a50576000548114611a505760008181526004602052604090208590555b505b60405186906000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050600180548101905550505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611acf90339089908890889060040161251b565b6020604051808303816000875af1925050508015611b0a575060408051601f3d908101601f19168201909252611b0791810190612558565b60015b611b68573d808015611b38576040519150601f19603f3d011682016040523d82523d6000602084013e611b3d565b606091505b508051600003611b60576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b604080516080810182526000808252602082018190529181018290526060810191909152610754611bb583611853565b611c7e565b600a546001546000540360001901611bd2908361244a565b10611c165760405162461bcd60e51b81526020600482015260146024820152734578636565647320546f74616c20537570706c7960601b604482015260640161091b565b61130e8282611cc5565b6060600f80546107699061222f565b604080516080810191829052607f0190826030600a8206018353600a90045b8015611c6c57600183039250600a81066030018353600a9004611c4e565b50819003601f19909101908152919050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b6000546001600160a01b038316611cee57604051622e076360e81b815260040160405180910390fd5b81600003611d0f5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600081815260056020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260046020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611d595760005550505050565b6001600160e01b031981168114610cef57600080fd5b600060208284031215611dcd57600080fd5b813561116c81611da5565b60005b83811015611df3578181015183820152602001611ddb565b50506000910152565b60008151808452611e14816020860160208601611dd8565b601f01601f19169290920160200192915050565b60208152600061116c6020830184611dfc565b600060208284031215611e4d57600080fd5b5035919050565b80356001600160a01b0381168114611e6b57600080fd5b919050565b60008060408385031215611e8357600080fd5b611e8c83611e54565b946020939093013593505050565b600060208284031215611eac57600080fd5b61116c82611e54565b600080600060608486031215611eca57600080fd5b611ed384611e54565b9250611ee160208501611e54565b9150604084013590509250925092565b60008060208385031215611f0457600080fd5b82356001600160401b0380821115611f1b57600080fd5b818501915085601f830112611f2f57600080fd5b813581811115611f3e57600080fd5b866020828501011115611f5057600080fd5b60209290920196919550909350505050565b60008060208385031215611f7557600080fd5b82356001600160401b0380821115611f8c57600080fd5b818501915085601f830112611fa057600080fd5b813581811115611faf57600080fd5b8660208260051b8501011115611f5057600080fd5b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015610fc65761202f838551611fc4565b928401926080929092019160010161201c565b6020808252825182820181905260009190848201906040850190845b81811015610fc65783518352928401929184019160010161205e565b60008060006060848603121561208f57600080fd5b61209884611e54565b95602085013595506040909401359392505050565b600080604083850312156120c057600080fd5b6120c983611e54565b9150602083013580151581146120de57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612127576121276120e9565b604052919050565b6000806000806080858703121561214557600080fd5b61214e85611e54565b9350602061215d818701611e54565b93506040860135925060608601356001600160401b038082111561218057600080fd5b818801915088601f83011261219457600080fd5b8135818111156121a6576121a66120e9565b6121b8601f8201601f191685016120ff565b915080825289848285010111156121ce57600080fd5b808484018584013760008482840101525080935050505092959194509250565b608081016107548284611fc4565b6000806040838503121561220f57600080fd5b61221883611e54565b915061222660208401611e54565b90509250929050565b600181811c9082168061224357607f821691505b60208210810361226357634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561227b57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561075457610754612282565b60008160001904831182151516156122c5576122c5612282565b500290565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610c9457600081815260208120601f850160051c810160208610156123265750805b601f850160051c820191505b81811015610c5557828155600101612332565b6001600160401b0383111561235c5761235c6120e9565b6123708361236a835461222f565b836122ff565b6000601f8411600181146123a4576000851561238c5750838201355b600019600387901b1c1916600186901b1783556123fe565b600083815260209020601f19861690835b828110156123d557868501358255602094850194600190920191016123b5565b50868210156123f25760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b634e487b7160e01b600052603260045260246000fd5b6000835161242d818460208801611dd8565b835190830190612441818360208801611dd8565b01949350505050565b8082018082111561075457610754612282565b6000602080838503121561247057600080fd5b82516001600160401b038082111561248757600080fd5b818501915085601f83011261249b57600080fd5b8151818111156124ad576124ad6120e9565b8060051b91506124be8483016120ff565b81815291830184019184810190888411156124d857600080fd5b938501935b838510156124f6578451825293850193908501906124dd565b98975050505050505050565b60006001820161251457612514612282565b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061254e90830184611dfc565b9695505050505050565b60006020828403121561256a57600080fd5b815161116c81611da556fea264697066735822122027177a7407779a0850891fb10fd419a3c26c001d2ea4daf91343ce25d27d234864736f6c63430008100033000000000000000000000000c9fba54b933fabec28ee4da7401f79be973e67f2

Deployed Bytecode

0x6080604052600436106102255760003560e01c806380490f9911610123578063c3a71999116100ab578063d89135cd1161006f578063d89135cd1461064a578063de4b32621461065f578063e985e9c51461067f578063efe0d269146106c8578063f2fde38b146106e857600080fd5b8063c3a71999146105c9578063c7876ea4146105e9578063c87b56dd146105ff578063d3dd5fe01461061f578063d5abeb011461063457600080fd5b806395d89b41116100f257806395d89b411461052757806399a2557a1461053c578063a22cb4651461055c578063b88d4fde1461057c578063c23dc68f1461059c57600080fd5b806380490f991461048d5780638462151c146104bc5780638c83ed33146104e95780638da5cb5b1461050957600080fd5b80633ccfd60b116101b157806361def6941161017557806361def694146104025780636352211e146104185780636f8b44b01461043857806370a0823114610458578063715018a61461047857600080fd5b80633ccfd60b1461036a57806342842e0e1461037f578063488fc5081461039f5780634b6742a3146103b55780635bbb2177146103d557600080fd5b80631249c58b116101f85780631249c58b146102db57806318160ddd146102e35780631c6567491461030a57806323b872dd1461032a57806330176e131461034a57600080fd5b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b9575b600080fd5b34801561023657600080fd5b5061024a610245366004611dbb565b610708565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027461075a565b6040516102569190611e28565b34801561028d57600080fd5b506102a161029c366004611e3b565b6107ec565b6040516001600160a01b039091168152602001610256565b3480156102c557600080fd5b506102d96102d4366004611e70565b610830565b005b6102d96108d0565b3480156102ef57600080fd5b5060015460005403600019015b604051908152602001610256565b34801561031657600080fd5b506102fc610325366004611e9a565b6109ce565b34801561033657600080fd5b506102d9610345366004611eb5565b610aba565b34801561035657600080fd5b506102d9610365366004611ef1565b610c5d565b34801561037657600080fd5b506102d9610c99565b34801561038b57600080fd5b506102d961039a366004611eb5565b610cf2565b3480156103ab57600080fd5b506102fc600c5481565b3480156103c157600080fd5b506102d96103d0366004611e3b565b610d0d565b3480156103e157600080fd5b506103f56103f0366004611f62565b610d3c565b6040516102569190612000565b34801561040e57600080fd5b506102fc600b5481565b34801561042457600080fd5b506102a1610433366004611e3b565b610e07565b34801561044457600080fd5b506102d9610453366004611e3b565b610e12565b34801561046457600080fd5b506102fc610473366004611e9a565b610e41565b34801561048457600080fd5b506102d9610e8f565b34801561049957600080fd5b503360009081526005602052604090819020546001600160401b03911c166102fc565b3480156104c857600080fd5b506104dc6104d7366004611e9a565b610eca565b6040516102569190612042565b3480156104f557600080fd5b506102d9610504366004611e3b565b610fd2565b34801561051557600080fd5b506008546001600160a01b03166102a1565b34801561053357600080fd5b50610274610fdd565b34801561054857600080fd5b506104dc61055736600461207a565b610fec565b34801561056857600080fd5b506102d96105773660046120ad565b611173565b34801561058857600080fd5b506102d961059736600461212f565b611208565b3480156105a857600080fd5b506105bc6105b7366004611e3b565b611252565b60405161025691906121ee565b3480156105d557600080fd5b506102d96105e4366004611e70565b6112da565b3480156105f557600080fd5b506102fc600d5481565b34801561060b57600080fd5b5061027461061a366004611e3b565b611312565b34801561062b57600080fd5b506102d9611395565b34801561064057600080fd5b506102fc600a5481565b34801561065657600080fd5b506102fc6113d3565b34801561066b57600080fd5b506102d961067a366004611e3b565b6113de565b34801561068b57600080fd5b5061024a61069a3660046121fc565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156106d457600080fd5b506102fc6106e3366004611e9a565b61140d565b3480156106f457600080fd5b506102d9610703366004611e9a565b61143a565b60006301ffc9a760e01b6001600160e01b03198316148061073957506380ac58cd60e01b6001600160e01b03198316145b806107545750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546107699061222f565b80601f01602080910402602001604051908101604052809291908181526020018280546107959061222f565b80156107e25780601f106107b7576101008083540402835291602001916107e2565b820191906000526020600020905b8154815290600101906020018083116107c557829003601f168201915b5050505050905090565b60006107f7826114d2565b610814576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061083b82610e07565b9050336001600160a01b0382161461087457610857813361069a565b610874576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233146109245760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b6002600954036109765760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161091b565b6002600955600e5460ff166109bf5760405162461bcd60e51b815260206004820152600f60248201526e53616c65206e6f742061637469766560881b604482015260640161091b565b6109c7611507565b6001600955565b6040516370a0823160e01b81526001600160a01b03828116600483015260009182917f000000000000000000000000c9fba54b933fabec28ee4da7401f79be973e67f216906370a0823190602401602060405180830381865afa158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d9190612269565b90506000600c548210610a9f57600b548211610a9857600c548211610a8457600c54610a86565b815b600b54610a939190612298565b610aa2565b6000610aa2565b60005b9050600d5481610ab291906122ab565b949350505050565b6000610ac582611853565b9050836001600160a01b0316816001600160a01b031614610af85760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054610b248187335b6001600160a01b039081169116811491141790565b610b4f57610b32863361069a565b610b4f57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610b7657604051633a954ecd60e21b815260040160405180910390fd5b8015610b8157600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610c1357600184016000818152600460205260408120549003610c11576000548114610c115760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b03163314610c875760405162461bcd60e51b815260040161091b906122ca565b600f610c94828483612345565b505050565b6008546001600160a01b03163314610cc35760405162461bcd60e51b815260040161091b906122ca565b60405133904780156108fc02916000818181858888f19350505050158015610cef573d6000803e3d6000fd5b50565b610c9483838360405180602001604052806000815250611208565b6008546001600160a01b03163314610d375760405162461bcd60e51b815260040161091b906122ca565b600c55565b6060816000816001600160401b03811115610d5957610d596120e9565b604051908082528060200260200182016040528015610dab57816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610d775790505b50905060005b828114610dfe57610dd9868683818110610dcd57610dcd612405565b90506020020135611252565b828281518110610deb57610deb612405565b6020908102919091010152600101610db1565b50949350505050565b600061075482611853565b6008546001600160a01b03163314610e3c5760405162461bcd60e51b815260040161091b906122ca565b600a55565b60006001600160a01b038216610e6a576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314610eb95760405162461bcd60e51b815260040161091b906122ca565b610ec360006118c2565b565b905090565b60606000806000610eda85610e41565b90506000816001600160401b03811115610ef657610ef66120e9565b604051908082528060200260200182016040528015610f1f578160200160208202803683370190505b509050610f4c60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614610fc657610f5f81611914565b91508160400151610fbe5781516001600160a01b031615610f7f57815194505b876001600160a01b0316856001600160a01b031603610fbe5780838780600101985081518110610fb157610fb1612405565b6020026020010181815250505b600101610f4f565b50909695505050505050565b610cef816001611950565b6060600380546107699061222f565b606081831061100e57604051631960ccad60e11b815260040160405180910390fd5b60008061101a60005490565b9050600185101561102a57600194505b80841115611036578093505b600061104187610e41565b905084861015611060578585038181101561105a578091505b50611064565b5060005b6000816001600160401b0381111561107e5761107e6120e9565b6040519080825280602002602001820160405280156110a7578160200160208202803683370190505b509050816000036110bd57935061116c92505050565b60006110c888611252565b9050600081604001516110d9575080515b885b8881141580156110eb5750848714155b15611160576110f981611914565b925082604001516111585782516001600160a01b03161561111957825191505b8a6001600160a01b0316826001600160a01b031603611158578084888060010199508151811061114b5761114b612405565b6020026020010181815250505b6001016110db565b50505092835250909150505b9392505050565b336001600160a01b0383160361119c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611213848484610aba565b6001600160a01b0383163b1561124c5761122f84848484611a9a565b61124c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260018310806112ab57506000548310155b156112b65792915050565b6112bf83611914565b90508060400151156112d15792915050565b61116c83611b85565b6008546001600160a01b031633146113045760405162461bcd60e51b815260040161091b906122ca565b61130e8282611bba565b5050565b606061131d826114d2565b61133a57604051630a14c4b560e41b815260040160405180910390fd5b6000611344611c20565b90508051600003611364576040518060200160405280600081525061116c565b8061136e84611c2f565b60405160200161137f92919061241b565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146113bf5760405162461bcd60e51b815260040161091b906122ca565b600e805460ff19811660ff90911615179055565b6000610ec560015490565b6008546001600160a01b031633146114085760405162461bcd60e51b815260040161091b906122ca565b600d55565b6000610754826001600160a01b031660009081526005602052604090205460801c6001600160401b031690565b6008546001600160a01b031633146114645760405162461bcd60e51b815260040161091b906122ca565b6001600160a01b0381166114c95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161091b565b610cef816118c2565b6000816001111580156114e6575060005482105b8015610754575050600090815260046020526040902054600160e01b161590565b60006001600160a01b037f000000000000000000000000c9fba54b933fabec28ee4da7401f79be973e67f2166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561157d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a19190612269565b9050600c548110156116005760405162461bcd60e51b815260206004820152602260248201527f4e6f7420656e6f7567682070696c65732c206e656564206174206c6561737420604482015261191760f11b606482015260840161091b565b600a54600154600054036000190161161990600161244a565b1061165d5760405162461bcd60e51b81526020600482015260146024820152734578636565647320546f74616c20537570706c7960601b604482015260640161091b565b611666336109ce565b3410156116ac5760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0811551208185b5bdd5b9d60621b604482015260640161091b565b6000600b548210156116be57816116c2565b600b545b90506000600c548210156116d857600c546116da565b815b905080156118485760606001600160a01b037f000000000000000000000000c9fba54b933fabec28ee4da7401f79be973e67f216638462151c336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381865afa158015611758573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611780919081019061245d565b905060005b81518110801561179457508281105b15611845577f000000000000000000000000c9fba54b933fabec28ee4da7401f79be973e67f26001600160a01b0316638c83ed338383815181106117da576117da612405565b60200260200101516040518263ffffffff1660e01b815260040161180091815260200190565b600060405180830381600087803b15801561181a57600080fd5b505af115801561182e573d6000803e3d6000fd5b50505050808061183d90612502565b915050611785565b50505b610c94336001611bba565b600081806001116118a9576000548110156118a95760008181526004602052604081205490600160e01b821690036118a7575b8060000361116c575060001901600081815260046020526040902054611886565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051608081018252600080825260208201819052918101829052606081019190915260008281526004602052604090205461075490611c7e565b600061195b83611853565b90508060008061197986600090815260066020526040902080549091565b9150915084156119b95761198e818433610b0f565b6119b95761199c833361069a565b6119b957604051632ce44b5f60e11b815260040160405180910390fd5b80156119c457600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260046020526040812091909155600160e11b85169003611a5257600186016000818152600460205260408120549003611a50576000548114611a505760008181526004602052604090208590555b505b60405186906000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050600180548101905550505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611acf90339089908890889060040161251b565b6020604051808303816000875af1925050508015611b0a575060408051601f3d908101601f19168201909252611b0791810190612558565b60015b611b68573d808015611b38576040519150601f19603f3d011682016040523d82523d6000602084013e611b3d565b606091505b508051600003611b60576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b604080516080810182526000808252602082018190529181018290526060810191909152610754611bb583611853565b611c7e565b600a546001546000540360001901611bd2908361244a565b10611c165760405162461bcd60e51b81526020600482015260146024820152734578636565647320546f74616c20537570706c7960601b604482015260640161091b565b61130e8282611cc5565b6060600f80546107699061222f565b604080516080810191829052607f0190826030600a8206018353600a90045b8015611c6c57600183039250600a81066030018353600a9004611c4e565b50819003601f19909101908152919050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b6000546001600160a01b038316611cee57604051622e076360e81b815260040160405180910390fd5b81600003611d0f5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600081815260056020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260046020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611d595760005550505050565b6001600160e01b031981168114610cef57600080fd5b600060208284031215611dcd57600080fd5b813561116c81611da5565b60005b83811015611df3578181015183820152602001611ddb565b50506000910152565b60008151808452611e14816020860160208601611dd8565b601f01601f19169290920160200192915050565b60208152600061116c6020830184611dfc565b600060208284031215611e4d57600080fd5b5035919050565b80356001600160a01b0381168114611e6b57600080fd5b919050565b60008060408385031215611e8357600080fd5b611e8c83611e54565b946020939093013593505050565b600060208284031215611eac57600080fd5b61116c82611e54565b600080600060608486031215611eca57600080fd5b611ed384611e54565b9250611ee160208501611e54565b9150604084013590509250925092565b60008060208385031215611f0457600080fd5b82356001600160401b0380821115611f1b57600080fd5b818501915085601f830112611f2f57600080fd5b813581811115611f3e57600080fd5b866020828501011115611f5057600080fd5b60209290920196919550909350505050565b60008060208385031215611f7557600080fd5b82356001600160401b0380821115611f8c57600080fd5b818501915085601f830112611fa057600080fd5b813581811115611faf57600080fd5b8660208260051b8501011115611f5057600080fd5b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015610fc65761202f838551611fc4565b928401926080929092019160010161201c565b6020808252825182820181905260009190848201906040850190845b81811015610fc65783518352928401929184019160010161205e565b60008060006060848603121561208f57600080fd5b61209884611e54565b95602085013595506040909401359392505050565b600080604083850312156120c057600080fd5b6120c983611e54565b9150602083013580151581146120de57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612127576121276120e9565b604052919050565b6000806000806080858703121561214557600080fd5b61214e85611e54565b9350602061215d818701611e54565b93506040860135925060608601356001600160401b038082111561218057600080fd5b818801915088601f83011261219457600080fd5b8135818111156121a6576121a66120e9565b6121b8601f8201601f191685016120ff565b915080825289848285010111156121ce57600080fd5b808484018584013760008482840101525080935050505092959194509250565b608081016107548284611fc4565b6000806040838503121561220f57600080fd5b61221883611e54565b915061222660208401611e54565b90509250929050565b600181811c9082168061224357607f821691505b60208210810361226357634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561227b57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561075457610754612282565b60008160001904831182151516156122c5576122c5612282565b500290565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610c9457600081815260208120601f850160051c810160208610156123265750805b601f850160051c820191505b81811015610c5557828155600101612332565b6001600160401b0383111561235c5761235c6120e9565b6123708361236a835461222f565b836122ff565b6000601f8411600181146123a4576000851561238c5750838201355b600019600387901b1c1916600186901b1783556123fe565b600083815260209020601f19861690835b828110156123d557868501358255602094850194600190920191016123b5565b50868210156123f25760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b634e487b7160e01b600052603260045260246000fd5b6000835161242d818460208801611dd8565b835190830190612441818360208801611dd8565b01949350505050565b8082018082111561075457610754612282565b6000602080838503121561247057600080fd5b82516001600160401b038082111561248757600080fd5b818501915085601f83011261249b57600080fd5b8151818111156124ad576124ad6120e9565b8060051b91506124be8483016120ff565b81815291830184019184810190888411156124d857600080fd5b938501935b838510156124f6578451825293850193908501906124dd565b98975050505050505050565b60006001820161251457612514612282565b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061254e90830184611dfc565b9695505050505050565b60006020828403121561256a57600080fd5b815161116c81611da556fea264697066735822122027177a7407779a0850891fb10fd419a3c26c001d2ea4daf91343ce25d27d234864736f6c63430008100033

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

000000000000000000000000c9fba54b933fabec28ee4da7401f79be973e67f2

-----Decoded View---------------
Arg [0] : _APileOfSnowAddress (address): 0xC9FBA54b933FAbEc28EE4Da7401f79be973e67f2

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c9fba54b933fabec28ee4da7401f79be973e67f2


Deployed Bytecode Sourcemap

396:3638:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5821:615:1;;;;;;;;;;-1:-1:-1;5821:615:1;;;;;:::i;:::-;;:::i;:::-;;;565:14:8;;558:22;540:41;;528:2;513:18;5821:615:1;;;;;;;;11468:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;13414:204::-;;;;;;;;;;-1:-1:-1;13414:204:1;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:8;;;1679:51;;1667:2;1652:18;13414:204:1;1533:203:8;12962:386:1;;;;;;;;;;-1:-1:-1;12962:386:1;;;;;:::i;:::-;;:::i;:::-;;1925:137:7;;;:::i;4875:315:1:-;;;;;;;;;;-1:-1:-1;1145:1:7;5141:12:1;4928:7;5125:13;:28;-1:-1:-1;;5125:46:1;4875:315;;;2324:25:8;;;2312:2;2297:18;4875:315:1;2178:177:8;2948:366:7;;;;;;;;;;-1:-1:-1;2948:366:7;;;;;:::i;:::-;;:::i;22679:2800:1:-;;;;;;;;;;-1:-1:-1;22679:2800:1;;;;;:::i;:::-;;:::i;1597:104:7:-;;;;;;;;;;-1:-1:-1;1597:104:7;;;;;:::i;:::-;;:::i;3920:111::-;;;;;;;;;;;;;:::i;14304:185:1:-;;;;;;;;;;-1:-1:-1;14304:185:1;;;;;:::i;:::-;;:::i;542:33:7:-;;;;;;;;;;;;;;;;1361:123;;;;;;;;;;-1:-1:-1;1361:123:7;;;;;:::i;:::-;;:::i;1662:513:2:-;;;;;;;;;;-1:-1:-1;1662:513:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;504:31:7:-;;;;;;;;;;;;;;;;11257:144:1;;;;;;;;;;-1:-1:-1;11257:144:1;;;;;:::i;:::-;;:::i;1492:97:7:-;;;;;;;;;;-1:-1:-1;1492:97:7;;;;;:::i;:::-;;:::i;6500:224:1:-;;;;;;;;;;-1:-1:-1;6500:224:1;;;;;:::i;:::-;;:::i;1714:103:5:-;;;;;;;;;;;;;:::i;3591:111:7:-;;;;;;;;;;-1:-1:-1;33862:10:1;3640:7:7;6895:25:1;;;:18;:25;;1192:2;6895:25;;;;;-1:-1:-1;;;;;6895:49:1;;6894:80;3591:111:7;;5442:879:2;;;;;;;;;;-1:-1:-1;5442:879:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3836:76:7:-;;;;;;;;;;-1:-1:-1;3836:76:7;;;;;:::i;:::-;;:::i;1063:87:5:-;;;;;;;;;;-1:-1:-1;1136:6:5;;-1:-1:-1;;;;;1136:6:5;1063:87;;11637:104:1;;;;;;;;;;;;;:::i;2551:2454:2:-;;;;;;;;;;-1:-1:-1;2551:2454:2;;;;;:::i;:::-;;:::i;13690:308:1:-;;;;;;;;;;-1:-1:-1;13690:308:1;;;;;:::i;:::-;;:::i;14560:399::-;;;;;;;;;;-1:-1:-1;14560:399:1;;;;;:::i;:::-;;:::i;1091:418:2:-;;;;;;;;;;-1:-1:-1;1091:418:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1822:95:7:-;;;;;;;;;;-1:-1:-1;1822:95:7;;;;;:::i;:::-;;:::i;582:39::-;;;;;;;;;;;;;;;;11812:318:1;;;;;;;;;;-1:-1:-1;11812:318:1;;;;;:::i;:::-;;:::i;1162:80:7:-;;;;;;;;;;;;;:::i;466:31::-;;;;;;;;;;;;;;;;3487:95;;;;;;;;;;;;;:::i;1250:103::-;;;;;;;;;;-1:-1:-1;1250:103:7;;;;;:::i;:::-;;:::i;14069:164:1:-;;;;;;;;;;-1:-1:-1;14069:164:1;;;;;:::i;:::-;-1:-1:-1;;;;;14190:25:1;;;14166:4;14190:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;14069:164;3711:116:7;;;;;;;;;;-1:-1:-1;3711:116:7;;;;;:::i;:::-;;:::i;1972:201:5:-;;;;;;;;;;-1:-1:-1;1972:201:5;;;;;:::i;:::-;;:::i;5821:615:1:-;5906:4;-1:-1:-1;;;;;;;;;6206:25:1;;;;:102;;-1:-1:-1;;;;;;;;;;6283:25:1;;;6206:102;:179;;;-1:-1:-1;;;;;;;;;;6360:25:1;;;6206:179;6186:199;5821:615;-1:-1:-1;;5821:615:1:o;11468:100::-;11522:13;11555:5;11548:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11468:100;:::o;13414:204::-;13482:7;13507:16;13515:7;13507;:16::i;:::-;13502:64;;13532:34;;-1:-1:-1;;;13532:34:1;;;;;;;;;;;13502:64;-1:-1:-1;13586:24:1;;;;:15;:24;;;;;;-1:-1:-1;;;;;13586:24:1;;13414:204::o;12962:386::-;13035:13;13051:16;13059:7;13051;:16::i;:::-;13035:32;-1:-1:-1;33862:10:1;-1:-1:-1;;;;;13084:28:1;;;13080:175;;13132:44;13149:5;33862:10;14069:164;:::i;13132:44::-;13127:128;;13204:35;;-1:-1:-1;;;13204:35:1;;;;;;;;;;;13127:128;13267:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;13267:29:1;-1:-1:-1;;;;;13267:29:1;;;;;;;;;13312:28;;13267:24;;13312:28;;;;;;;13024:324;12962:386;;:::o;1925:137:7:-;811:9;824:10;811:23;803:66;;;;-1:-1:-1;;;803:66:7;;9022:2:8;803:66:7;;;9004:21:8;9061:2;9041:18;;;9034:30;9100:32;9080:18;;;9073:60;9150:18;;803:66:7;;;;;;;;;1778:1:6::1;2376:7;;:19:::0;2368:63:::1;;;::::0;-1:-1:-1;;;2368:63:6;;9381:2:8;2368:63:6::1;::::0;::::1;9363:21:8::0;9420:2;9400:18;;;9393:30;9459:33;9439:18;;;9432:61;9510:18;;2368:63:6::1;9179:355:8::0;2368:63:6::1;1778:1;2509:7;:18:::0;2003:8:7::2;::::0;::::2;;1995:36;;;::::0;-1:-1:-1;;;1995:36:7;;9741:2:8;1995:36:7::2;::::0;::::2;9723:21:8::0;9780:2;9760:18;;;9753:30;-1:-1:-1;;;9799:18:8;;;9792:45;9854:18;;1995:36:7::2;9539:339:8::0;1995:36:7::2;2042:12;:10;:12::i;:::-;1734:1:6::1;2688:7;:22:::0;1925:137:7:o;2948:366::-;3058:38;;-1:-1:-1;;;3058:38:7;;-1:-1:-1;;;;;1697:32:8;;;3058:38:7;;;1679:51:8;3012:7:7;;;;3058:19;:29;;;;1652:18:8;;3058:38:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3037:59;;3107:14;3138;;3125:10;:27;:142;;3173:12;;3160:10;:25;:106;;3221:14;;3208:10;:27;:57;;3251:14;;3208:57;;;3238:10;3208:57;3192:12;;:74;;;;:::i;:::-;3125:142;;3160:106;3188:1;3125:142;;;3155:1;3125:142;3107:161;;3297:9;;3288:6;:18;;;;:::i;:::-;3281:25;2948:366;-1:-1:-1;;;;2948:366:7:o;22679:2800:1:-;22813:27;22843;22862:7;22843:18;:27::i;:::-;22813:57;;22928:4;-1:-1:-1;;;;;22887:45:1;22903:19;-1:-1:-1;;;;;22887:45:1;;22883:86;;22941:28;;-1:-1:-1;;;22941:28:1;;;;;;;;;;;22883:86;22983:27;21409:21;;;21236:15;21451:4;21444:36;21533:4;21517:21;;21623:26;;23167:62;21623:26;23203:4;33862:10;23209:19;-1:-1:-1;;;;;22228:31:1;;;22074:26;;22355:19;;22376:30;;22352:55;;21780:645;23167:62;23162:174;;23249:43;23266:4;33862:10;14069:164;:::i;23249:43::-;23244:92;;23301:35;;-1:-1:-1;;;23301:35:1;;;;;;;;;;;23244:92;-1:-1:-1;;;;;23353:16:1;;23349:52;;23378:23;;-1:-1:-1;;;23378:23:1;;;;;;;;;;;23349:52;23550:15;23547:160;;;23690:1;23669:19;23662:30;23547:160;-1:-1:-1;;;;;24085:24:1;;;;;;;:18;:24;;;;;;24083:26;;-1:-1:-1;;24083:26:1;;;24154:22;;;;;;;;;24152:24;;-1:-1:-1;24152:24:1;;;11156:11;11132:22;11128:40;11115:62;-1:-1:-1;;;11115:62:1;24447:26;;;;:17;:26;;;;;:174;;;;-1:-1:-1;;;24741:46:1;;:51;;24737:626;;24845:1;24835:11;;24813:19;24968:30;;;:17;:30;;;;;;:35;;24964:384;;25106:13;;25091:11;:28;25087:242;;25253:30;;;;:17;:30;;;;;:52;;;25087:242;24794:569;24737:626;25410:7;25406:2;-1:-1:-1;;;;;25391:27:1;25400:4;-1:-1:-1;;;;;25391:27:1;;;;;;;;;;;25429:42;22802:2677;;;22679:2800;;;:::o;1597:104:7:-;1136:6:5;;-1:-1:-1;;;;;1136:6:5;33862:10:1;1283:23:5;1275:68;;;;-1:-1:-1;;;1275:68:5;;;;;;;:::i;:::-;1674:12:7::1;:19;1689:4:::0;;1674:12;:19:::1;:::i;:::-;;1597:104:::0;;:::o;3920:111::-;1136:6:5;;-1:-1:-1;;;;;1136:6:5;33862:10:1;1283:23:5;1275:68;;;;-1:-1:-1;;;1275:68:5;;;;;;;:::i;:::-;3970:53:7::1;::::0;33862:10:1;;4001:21:7::1;3970:53:::0;::::1;;;::::0;::::1;::::0;;;4001:21;33862:10:1;3970:53:7;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;3920:111::o:0;14304:185:1:-;14442:39;14459:4;14465:2;14469:7;14442:39;;;;;;;;;;;;:16;:39::i;1361:123:7:-;1136:6:5;;-1:-1:-1;;;;;1136:6:5;33862:10:1;1283:23:5;1275:68;;;;-1:-1:-1;;;1275:68:5;;;;;;;:::i;:::-;1442:14:7::1;:34:::0;1361:123::o;1662:513:2:-;1801:23;1889:8;1864:22;1889:8;-1:-1:-1;;;;;1955:36:2;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1955:36:2;;-1:-1:-1;;1955:36:2;;;;;;;;;;;;1918:73;;2010:9;2005:123;2026:14;2021:1;:19;2005:123;;2081:32;2101:8;;2110:1;2101:11;;;;;;;:::i;:::-;;;;;;;2081:19;:32::i;:::-;2065:10;2076:1;2065:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;2042:3;;2005:123;;;-1:-1:-1;2148:10:2;1662:513;-1:-1:-1;;;;1662:513:2:o;11257:144:1:-;11321:7;11364:27;11383:7;11364:18;:27::i;1492:97:7:-;1136:6:5;;-1:-1:-1;;;;;1136:6:5;33862:10:1;1283:23:5;1275:68;;;;-1:-1:-1;;;1275:68:5;;;;;;;:::i;:::-;1560:9:7::1;:21:::0;1492:97::o;6500:224:1:-;6564:7;-1:-1:-1;;;;;6588:19:1;;6584:60;;6616:28;;-1:-1:-1;;;6616:28:1;;;;;;;;;;;6584:60;-1:-1:-1;;;;;;6662:25:1;;;;;:18;:25;;;;;;-1:-1:-1;;;;;6662:54:1;;6500:224::o;1714:103:5:-;1136:6;;-1:-1:-1;;;;;1136:6:5;33862:10:1;1283:23:5;1275:68;;;;-1:-1:-1;;;1275:68:5;;;;;;;:::i;:::-;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;3667:27:7:-;3660:34;;3591:111;:::o;5442:879:2:-;5520:16;5572:19;5605:25;5644:22;5669:16;5679:5;5669:9;:16::i;:::-;5644:41;;5699:25;5741:14;-1:-1:-1;;;;;5727:29:2;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5727:29:2;;5699:57;;5770:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5770:31:2;1145:1:7;5815:461:2;5864:14;5849:11;:29;5815:461;;5915:15;5928:1;5915:12;:15::i;:::-;5903:27;;5952:9;:16;;;5992:8;5948:71;6040:14;;-1:-1:-1;;;;;6040:28:2;;6036:109;;6112:14;;;-1:-1:-1;6036:109:2;6187:5;-1:-1:-1;;;;;6166:26:2;:17;-1:-1:-1;;;;;6166:26:2;;6162:100;;6242:1;6216:8;6225:13;;;;;;6216:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;6162:100;5880:3;;5815:461;;;-1:-1:-1;6296:8:2;;5442:879;-1:-1:-1;;;;;;5442:879:2:o;3836:76:7:-;3887:20;3893:7;3902:4;3887:5;:20::i;11637:104:1:-;11693:13;11726:7;11719:14;;;;;:::i;2551:2454:2:-;2690:16;2755:4;2746:5;:13;2742:45;;2768:19;;-1:-1:-1;;;2768:19:2;;;;;;;;;;;2742:45;2801:19;2834:17;2854:14;4617:7:1;4644:13;;4570:95;2854:14:2;2834:34;-1:-1:-1;1145:1:7;2944:5:2;:23;2940:85;;;1145:1:7;2987:23:2;;2940:85;3099:9;3092:4;:16;3088:71;;;3135:9;3128:16;;3088:71;3172:25;3200:16;3210:5;3200:9;:16::i;:::-;3172:44;;3391:4;3383:5;:12;3379:271;;;3437:12;;;3471:31;;;3467:109;;;3546:11;3526:31;;3467:109;3397:193;3379:271;;;-1:-1:-1;3634:1:2;3379:271;3663:25;3705:17;-1:-1:-1;;;;;3691:32:2;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3691:32:2;;3663:60;;3741:17;3762:1;3741:22;3737:76;;3790:8;-1:-1:-1;3783:15:2;;-1:-1:-1;;;3783:15:2;3737:76;3954:31;3988:26;4008:5;3988:19;:26::i;:::-;3954:60;;4028:25;4270:9;:16;;;4265:90;;-1:-1:-1;4326:14:2;;4265:90;4385:5;4368:467;4397:4;4392:1;:9;;:45;;;;;4420:17;4405:11;:32;;4392:45;4368:467;;;4474:15;4487:1;4474:12;:15::i;:::-;4462:27;;4511:9;:16;;;4551:8;4507:71;4599:14;;-1:-1:-1;;;;;4599:28:2;;4595:109;;4671:14;;;-1:-1:-1;4595:109:2;4746:5;-1:-1:-1;;;;;4725:26:2;:17;-1:-1:-1;;;;;4725:26:2;;4721:100;;4801:1;4775:8;4784:13;;;;;;4775:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;4721:100;4439:3;;4368:467;;;-1:-1:-1;;;4917:29:2;;;-1:-1:-1;4924:8:2;;-1:-1:-1;;2551:2454:2;;;;;;:::o;13690:308:1:-;33862:10;-1:-1:-1;;;;;13789:31:1;;;13785:61;;13829:17;;-1:-1:-1;;;13829:17:1;;;;;;;;;;;13785:61;33862:10;13859:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;13859:49:1;;;;;;;;;;;;:60;;-1:-1:-1;;13859:60:1;;;;;;;;;;13935:55;;540:41:8;;;13859:49:1;;33862:10;13935:55;;513:18:8;13935:55:1;;;;;;;13690:308;;:::o;14560:399::-;14727:31;14740:4;14746:2;14750:7;14727:12;:31::i;:::-;-1:-1:-1;;;;;14773:14:1;;;:19;14769:183;;14812:56;14843:4;14849:2;14853:7;14862:5;14812:30;:56::i;:::-;14807:145;;14896:40;;-1:-1:-1;;;14896:40:1;;;;;;;;;;;14807:145;14560:399;;;;:::o;1091:418:2:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1145:1:7;1253:7:2;:25;:54;;;-1:-1:-1;4617:7:1;4644:13;1282:7:2;:25;;1253:54;1249:101;;;1330:9;1091:418;-1:-1:-1;;1091:418:2:o;1249:101::-;1371:21;1384:7;1371:12;:21::i;:::-;1359:33;;1406:9;:16;;;1402:63;;;1445:9;1091:418;-1:-1:-1;;1091:418:2:o;1402:63::-;1481:21;1494:7;1481:12;:21::i;1822:95:7:-;1136:6:5;;-1:-1:-1;;;;;1136:6:5;33862:10:1;1283:23:5;1275:68;;;;-1:-1:-1;;;1275:68:5;;;;;;;:::i;:::-;1893:16:7::1;1901:2;1905:3;1893:7;:16::i;:::-;1822:95:::0;;:::o;11812:318:1:-;11885:13;11916:16;11924:7;11916;:16::i;:::-;11911:59;;11941:29;;-1:-1:-1;;;11941:29:1;;;;;;;;;;;11911:59;11983:21;12007:10;:8;:10::i;:::-;11983:34;;12041:7;12035:21;12060:1;12035:26;:87;;;;;;;;;;;;;;;;;12088:7;12097:18;12107:7;12097:9;:18::i;:::-;12071:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12028:94;11812:318;-1:-1:-1;;;11812:318:1:o;1162:80:7:-;1136:6:5;;-1:-1:-1;;;;;1136:6:5;33862:10:1;1283:23:5;1275:68;;;;-1:-1:-1;;;1275:68:5;;;;;;;:::i;:::-;1226:8:7::1;::::0;;-1:-1:-1;;1214:20:7;::::1;1226:8;::::0;;::::1;1225:9;1214:20;::::0;;1162:80::o;3487:95::-;3533:7;3560:14;5729:12:1;;;5655:94;1250:103:7;1136:6:5;;-1:-1:-1;;;;;1136:6:5;33862:10:1;1283:23:5;1275:68;;;;-1:-1:-1;;;1275:68:5;;;;;;;:::i;:::-;1321:9:7::1;:24:::0;1250:103::o;3711:116::-;3772:7;3799:20;3813:5;-1:-1:-1;;;;;7169:25:1;7141:7;7169:25;;;:18;:25;;;;;;1318:3;7169:49;-1:-1:-1;;;;;7168:80:1;;7080:176;1972:201:5;1136:6;;-1:-1:-1;;;;;1136:6:5;33862:10:1;1283:23:5;1275:68;;;;-1:-1:-1;;;1275:68:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;2061:22:5;::::1;2053:73;;;::::0;-1:-1:-1;;;2053:73:5;;13764:2:8;2053:73:5::1;::::0;::::1;13746:21:8::0;13803:2;13783:18;;;13776:30;13842:34;13822:18;;;13815:62;-1:-1:-1;;;13893:18:8;;;13886:36;13939:19;;2053:73:5::1;13562:402:8::0;2053:73:5::1;2137:28;2156:8;2137:18;:28::i;15214:273:1:-:0;15271:4;15327:7;1145:1:7;15308:26:1;;:66;;;;;15361:13;;15351:7;:23;15308:66;:152;;;;-1:-1:-1;;15412:26:1;;;;:17;:26;;;;;;-1:-1:-1;;;15412:43:1;:48;;15214:273::o;2070:870:7:-;2112:18;-1:-1:-1;;;;;2133:19:7;:29;;33862:10:1;2133:43:7;;-1:-1:-1;;;;;;2133:43:7;;;;;;;-1:-1:-1;;;;;1697:32:8;;;2133:43:7;;;1679:51:8;1652:18;;2133:43:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2112:64;;2219:14;;2205:10;:28;;2197:75;;;;-1:-1:-1;;;2197:75:7;;14171:2:8;2197:75:7;;;14153:21:8;14210:2;14190:18;;;14183:30;14249:34;14229:18;;;14222:62;-1:-1:-1;;;14300:18:8;;;14293:32;14342:19;;2197:75:7;13969:398:8;2197:75:7;2311:9;;1145:1;5141:12:1;4928:7;5125:13;:28;-1:-1:-1;;5125:46:1;2291:17:7;;:1;:17;:::i;:::-;:29;2283:62;;;;-1:-1:-1;;;2283:62:7;;14704:2:8;2283:62:7;;;14686:21:8;14743:2;14723:18;;;14716:30;-1:-1:-1;;;14762:18:8;;;14755:50;14822:18;;2283:62:7;14502:344:8;2283:62:7;2379:30;33862:10:1;2948:366:7;:::i;2379:30::-;2366:9;:43;;2358:76;;;;-1:-1:-1;;;2358:76:7;;15053:2:8;2358:76:7;;;15035:21:8;15092:2;15072:18;;;15065:30;-1:-1:-1;;;15111:18:8;;;15104:50;15171:18;;2358:76:7;14851:344:8;2358:76:7;2447:15;2480:12;;2466:10;:26;;:54;;2510:10;2466:54;;;2495:12;;2466:54;2447:74;;2532:15;2562:14;;2551:7;:25;;:52;;2589:14;;2551:52;;;2579:7;2551:52;2532:72;-1:-1:-1;2621:11:7;;2617:281;;2649:23;-1:-1:-1;;;;;2696:19:7;:33;;33862:10:1;2696:47:7;;-1:-1:-1;;;;;;2696:47:7;;;;;;;-1:-1:-1;;;;;1697:32:8;;;2696:47:7;;;1679:51:8;1652:18;;2696:47:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2696:47:7;;;;;;;;;;;;:::i;:::-;2687:56;;2763:9;2758:129;2782:6;:13;2778:1;:17;:32;;;;;2803:7;2799:1;:11;2778:32;2758:129;;;2836:19;-1:-1:-1;;;;;2836:24:7;;2861:6;2868:1;2861:9;;;;;;;;:::i;:::-;;;;;;;2836:35;;;;;;;;;;;;;2324:25:8;;2312:2;2297:18;;2178:177;2836:35:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2812:3;;;;;:::i;:::-;;;;2758:129;;;;2634:264;2617:281;2908:24;33862:10:1;2930:1:7;2908:7;:24::i;8174:1129:1:-;8241:7;8276;;1145:1:7;8325:23:1;8321:915;;8378:13;;8371:4;:20;8367:869;;;8416:14;8433:23;;;:17;:23;;;;;;;-1:-1:-1;;;8522:23:1;;:28;;8518:699;;9041:113;9048:6;9058:1;9048:11;9041:113;;-1:-1:-1;;;9119:6:1;9101:25;;;;:17;:25;;;;;;9041:113;;8518:699;8393:843;8367:869;9264:31;;-1:-1:-1;;;9264:31:1;;;;;;;;;;;2333:191:5;2426:6;;;-1:-1:-1;;;;;2443:17:5;;;-1:-1:-1;;;;;;2443:17:5;;;;;;;2476:40;;2426:6;;;2443:17;2426:6;;2476:40;;2407:16;;2476:40;2396:128;2333:191;:::o;9851:153:1:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9971:24:1;;;;:17;:24;;;;;;9952:44;;:18;:44::i;25875:3063::-;25955:27;25985;26004:7;25985:18;:27::i;:::-;25955:57;-1:-1:-1;25955:57:1;26025:12;;26147:28;26167:7;21110:27;21409:21;;;21236:15;21451:4;21444:36;21533:4;21517:21;;21623:26;;21517:21;;21015:652;26147:28;26090:85;;;;26192:13;26188:310;;;26313:62;26332:15;26349:4;33862:10;26355:19;33775:105;26313:62;26308:178;;26399:43;26416:4;33862:10;14069:164;:::i;26399:43::-;26394:92;;26451:35;;-1:-1:-1;;;26451:35:1;;;;;;;;;;;26394:92;26654:15;26651:160;;;26794:1;26773:19;26766:30;26651:160;-1:-1:-1;;;;;27412:24:1;;;;;;:18;:24;;;;;:59;;27440:31;27412:59;;;11156:11;11132:22;11128:40;11115:62;-1:-1:-1;;;11115:62:1;27709:26;;;;:17;:26;;;;;:203;;;;-1:-1:-1;;;28032:46:1;;:51;;28028:626;;28136:1;28126:11;;28104:19;28259:30;;;:17;:30;;;;;;:35;;28255:384;;28397:13;;28382:11;:28;28378:242;;28544:30;;;;:17;:30;;;;;:52;;;28378:242;28085:569;28028:626;28682:35;;28709:7;;28705:1;;-1:-1:-1;;;;;28682:35:1;;;;;28705:1;;28682:35;-1:-1:-1;;28905:12:1;:14;;;;;;-1:-1:-1;;;;25875:3063:1:o;29430:716::-;29614:88;;-1:-1:-1;;;29614:88:1;;29593:4;;-1:-1:-1;;;;;29614:45:1;;;;;:88;;33862:10;;29681:4;;29687:7;;29696:5;;29614:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29614:88:1;;;;;;;;-1:-1:-1;;29614:88:1;;;;;;;;;;;;:::i;:::-;;;29610:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29897:6;:13;29914:1;29897:18;29893:235;;29943:40;;-1:-1:-1;;;29943:40:1;;;;;;;;;;;29893:235;30086:6;30080:13;30071:6;30067:2;30063:15;30056:38;29610:529;-1:-1:-1;;;;;;29773:64:1;-1:-1:-1;;;29773:64:1;;-1:-1:-1;29430:716:1;;;;;;:::o;10507:158::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10610:47:1;10629:27;10648:7;10629:18;:27::i;:::-;10610:18;:47::i;3322:156:7:-;3411:9;;1145:1;5141:12:1;4928:7;5125:13;:28;-1:-1:-1;;5125:46:1;3389:19:7;;:3;:19;:::i;:::-;:31;3381:64;;;;-1:-1:-1;;;3381:64:7;;14704:2:8;3381:64:7;;;14686:21:8;14743:2;14723:18;;;14716:30;-1:-1:-1;;;14762:18:8;;;14755:50;14822:18;;3381:64:7;14502:344:8;3381:64:7;3456:14;3462:2;3466:3;3456:5;:14::i;1709:105::-;1761:13;1794:12;1787:19;;;;;:::i;33986:1960:1:-;34455:4;34449:11;;34462:3;34445:21;;34540:17;;;;35236:11;;;35115:5;35368:2;35382;35372:13;;35364:22;35236:11;35351:36;35423:2;35413:13;;35007:697;35442:4;35007:697;;;35633:1;35628:3;35624:11;35617:18;;35684:2;35678:4;35674:13;35670:2;35666:22;35661:3;35653:36;35537:2;35527:13;;35007:697;;;-1:-1:-1;35734:13:1;;;-1:-1:-1;;35849:12:1;;;35909:19;;;35849:12;33986:1960;-1:-1:-1;33986:1960:1:o;9397:363::-;-1:-1:-1;;;;;;;;;;;;;9507:41:1;;;;1709:3;9593:32;;;-1:-1:-1;;;;;9559:67:1;-1:-1:-1;;;9559:67:1;-1:-1:-1;;;9656:23:1;;:28;;-1:-1:-1;;;9637:47:1;;;;2226:3;9724:27;;;;-1:-1:-1;;;9695:57:1;-1:-1:-1;9397:363:1:o;17045:1529::-;17110:20;17133:13;-1:-1:-1;;;;;17161:16:1;;17157:48;;17186:19;;-1:-1:-1;;;17186:19:1;;;;;;;;;;;17157:48;17220:8;17232:1;17220:13;17216:44;;17242:18;;-1:-1:-1;;;17242:18:1;;;;;;;;;;;17216:44;-1:-1:-1;;;;;17748:22:1;;;;;;:18;:22;;1192:2;17748:22;;:70;;17786:31;17774:44;;17748:70;;;11156:11;11132:22;11128:40;-1:-1:-1;12866:15:1;;12841:23;12837:45;11125:51;11115:62;18061:31;;;;:17;:31;;;;;:173;18079:12;18310:23;;;18348:101;18375:35;;18400:9;;;;;-1:-1:-1;;;;;18375:35:1;;;18392:1;;18375:35;;18392:1;;18375:35;18444:3;18434:7;:13;18348:101;;18465:13;:19;-1:-1:-1;1674:19:7::1;1597:104:::0;;:::o;14:131:8:-;-1:-1:-1;;;;;;88:32:8;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:8;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:8;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:8:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:8;;1348:180;-1:-1:-1;1348:180:8:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:8;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:8:o;2360:186::-;2419:6;2472:2;2460:9;2451:7;2447:23;2443:32;2440:52;;;2488:1;2485;2478:12;2440:52;2511:29;2530:9;2511:29;:::i;2551:328::-;2628:6;2636;2644;2697:2;2685:9;2676:7;2672:23;2668:32;2665:52;;;2713:1;2710;2703:12;2665:52;2736:29;2755:9;2736:29;:::i;:::-;2726:39;;2784:38;2818:2;2807:9;2803:18;2784:38;:::i;:::-;2774:48;;2869:2;2858:9;2854:18;2841:32;2831:42;;2551:328;;;;;:::o;2884:592::-;2955:6;2963;3016:2;3004:9;2995:7;2991:23;2987:32;2984:52;;;3032:1;3029;3022:12;2984:52;3072:9;3059:23;-1:-1:-1;;;;;3142:2:8;3134:6;3131:14;3128:34;;;3158:1;3155;3148:12;3128:34;3196:6;3185:9;3181:22;3171:32;;3241:7;3234:4;3230:2;3226:13;3222:27;3212:55;;3263:1;3260;3253:12;3212:55;3303:2;3290:16;3329:2;3321:6;3318:14;3315:34;;;3345:1;3342;3335:12;3315:34;3390:7;3385:2;3376:6;3372:2;3368:15;3364:24;3361:37;3358:57;;;3411:1;3408;3401:12;3358:57;3442:2;3434:11;;;;;3464:6;;-1:-1:-1;2884:592:8;;-1:-1:-1;;;;2884:592:8:o;3481:615::-;3567:6;3575;3628:2;3616:9;3607:7;3603:23;3599:32;3596:52;;;3644:1;3641;3634:12;3596:52;3684:9;3671:23;-1:-1:-1;;;;;3754:2:8;3746:6;3743:14;3740:34;;;3770:1;3767;3760:12;3740:34;3808:6;3797:9;3793:22;3783:32;;3853:7;3846:4;3842:2;3838:13;3834:27;3824:55;;3875:1;3872;3865:12;3824:55;3915:2;3902:16;3941:2;3933:6;3930:14;3927:34;;;3957:1;3954;3947:12;3927:34;4010:7;4005:2;3995:6;3992:1;3988:14;3984:2;3980:23;3976:32;3973:45;3970:65;;;4031:1;4028;4021:12;4101:349;4185:12;;-1:-1:-1;;;;;4181:38:8;4169:51;;4273:4;4262:16;;;4256:23;-1:-1:-1;;;;;4252:48:8;4236:14;;;4229:72;4364:4;4353:16;;;4347:23;4340:31;4333:39;4317:14;;;4310:63;4426:4;4415:16;;;4409:23;4434:8;4405:38;4389:14;;4382:62;4101:349::o;4455:724::-;4690:2;4742:21;;;4812:13;;4715:18;;;4834:22;;;4661:4;;4690:2;4913:15;;;;4887:2;4872:18;;;4661:4;4956:197;4970:6;4967:1;4964:13;4956:197;;;5019:52;5067:3;5058:6;5052:13;5019:52;:::i;:::-;5128:15;;;;5100:4;5091:14;;;;;4992:1;4985:9;4956:197;;5184:632;5355:2;5407:21;;;5477:13;;5380:18;;;5499:22;;;5326:4;;5355:2;5578:15;;;;5552:2;5537:18;;;5326:4;5621:169;5635:6;5632:1;5629:13;5621:169;;;5696:13;;5684:26;;5765:15;;;;5730:12;;;;5657:1;5650:9;5621:169;;5821:322;5898:6;5906;5914;5967:2;5955:9;5946:7;5942:23;5938:32;5935:52;;;5983:1;5980;5973:12;5935:52;6006:29;6025:9;6006:29;:::i;:::-;5996:39;6082:2;6067:18;;6054:32;;-1:-1:-1;6133:2:8;6118:18;;;6105:32;;5821:322;-1:-1:-1;;;5821:322:8:o;6148:347::-;6213:6;6221;6274:2;6262:9;6253:7;6249:23;6245:32;6242:52;;;6290:1;6287;6280:12;6242:52;6313:29;6332:9;6313:29;:::i;:::-;6303:39;;6392:2;6381:9;6377:18;6364:32;6439:5;6432:13;6425:21;6418:5;6415:32;6405:60;;6461:1;6458;6451:12;6405:60;6484:5;6474:15;;;6148:347;;;;;:::o;6500:127::-;6561:10;6556:3;6552:20;6549:1;6542:31;6592:4;6589:1;6582:15;6616:4;6613:1;6606:15;6632:275;6703:2;6697:9;6768:2;6749:13;;-1:-1:-1;;6745:27:8;6733:40;;-1:-1:-1;;;;;6788:34:8;;6824:22;;;6785:62;6782:88;;;6850:18;;:::i;:::-;6886:2;6879:22;6632:275;;-1:-1:-1;6632:275:8:o;6912:980::-;7007:6;7015;7023;7031;7084:3;7072:9;7063:7;7059:23;7055:33;7052:53;;;7101:1;7098;7091:12;7052:53;7124:29;7143:9;7124:29;:::i;:::-;7114:39;;7172:2;7193:38;7227:2;7216:9;7212:18;7193:38;:::i;:::-;7183:48;;7278:2;7267:9;7263:18;7250:32;7240:42;;7333:2;7322:9;7318:18;7305:32;-1:-1:-1;;;;;7397:2:8;7389:6;7386:14;7383:34;;;7413:1;7410;7403:12;7383:34;7451:6;7440:9;7436:22;7426:32;;7496:7;7489:4;7485:2;7481:13;7477:27;7467:55;;7518:1;7515;7508:12;7467:55;7554:2;7541:16;7576:2;7572;7569:10;7566:36;;;7582:18;;:::i;:::-;7624:53;7667:2;7648:13;;-1:-1:-1;;7644:27:8;7640:36;;7624:53;:::i;:::-;7611:66;;7700:2;7693:5;7686:17;7740:7;7735:2;7730;7726;7722:11;7718:20;7715:33;7712:53;;;7761:1;7758;7751:12;7712:53;7816:2;7811;7807;7803:11;7798:2;7791:5;7787:14;7774:45;7860:1;7855:2;7850;7843:5;7839:14;7835:23;7828:34;;7881:5;7871:15;;;;;6912:980;;;;;;;:::o;7897:268::-;8095:3;8080:19;;8108:51;8084:9;8141:6;8108:51;:::i;8170:260::-;8238:6;8246;8299:2;8287:9;8278:7;8274:23;8270:32;8267:52;;;8315:1;8312;8305:12;8267:52;8338:29;8357:9;8338:29;:::i;:::-;8328:39;;8386:38;8420:2;8409:9;8405:18;8386:38;:::i;:::-;8376:48;;8170:260;;;;;:::o;8435:380::-;8514:1;8510:12;;;;8557;;;8578:61;;8632:4;8624:6;8620:17;8610:27;;8578:61;8685:2;8677:6;8674:14;8654:18;8651:38;8648:161;;8731:10;8726:3;8722:20;8719:1;8712:31;8766:4;8763:1;8756:15;8794:4;8791:1;8784:15;8648:161;;8435:380;;;:::o;9883:184::-;9953:6;10006:2;9994:9;9985:7;9981:23;9977:32;9974:52;;;10022:1;10019;10012:12;9974:52;-1:-1:-1;10045:16:8;;9883:184;-1:-1:-1;9883:184:8:o;10072:127::-;10133:10;10128:3;10124:20;10121:1;10114:31;10164:4;10161:1;10154:15;10188:4;10185:1;10178:15;10204:128;10271:9;;;10292:11;;;10289:37;;;10306:18;;:::i;10337:168::-;10377:7;10443:1;10439;10435:6;10431:14;10428:1;10425:21;10420:1;10413:9;10406:17;10402:45;10399:71;;;10450:18;;:::i;:::-;-1:-1:-1;10490:9:8;;10337:168::o;10510:356::-;10712:2;10694:21;;;10731:18;;;10724:30;10790:34;10785:2;10770:18;;10763:62;10857:2;10842:18;;10510:356::o;10997:545::-;11099:2;11094:3;11091:11;11088:448;;;11135:1;11160:5;11156:2;11149:17;11205:4;11201:2;11191:19;11275:2;11263:10;11259:19;11256:1;11252:27;11246:4;11242:38;11311:4;11299:10;11296:20;11293:47;;;-1:-1:-1;11334:4:8;11293:47;11389:2;11384:3;11380:12;11377:1;11373:20;11367:4;11363:31;11353:41;;11444:82;11462:2;11455:5;11452:13;11444:82;;;11507:17;;;11488:1;11477:13;11444:82;;11718:1206;-1:-1:-1;;;;;11837:3:8;11834:27;11831:53;;;11864:18;;:::i;:::-;11893:94;11983:3;11943:38;11975:4;11969:11;11943:38;:::i;:::-;11937:4;11893:94;:::i;:::-;12013:1;12038:2;12033:3;12030:11;12055:1;12050:616;;;;12710:1;12727:3;12724:93;;;-1:-1:-1;12783:19:8;;;12770:33;12724:93;-1:-1:-1;;11675:1:8;11671:11;;;11667:24;11663:29;11653:40;11699:1;11695:11;;;11650:57;12830:78;;12023:895;;12050:616;10944:1;10937:14;;;10981:4;10968:18;;-1:-1:-1;;12086:17:8;;;12187:9;12209:229;12223:7;12220:1;12217:14;12209:229;;;12312:19;;;12299:33;12284:49;;12419:4;12404:20;;;;12372:1;12360:14;;;;12239:12;12209:229;;;12213:3;12466;12457:7;12454:16;12451:159;;;12590:1;12586:6;12580:3;12574;12571:1;12567:11;12563:21;12559:34;12555:39;12542:9;12537:3;12533:19;12520:33;12516:79;12508:6;12501:95;12451:159;;;12653:1;12647:3;12644:1;12640:11;12636:19;12630:4;12623:33;12023:895;;;11718:1206;;;:::o;12929:127::-;12990:10;12985:3;12981:20;12978:1;12971:31;13021:4;13018:1;13011:15;13045:4;13042:1;13035:15;13061:496;13240:3;13278:6;13272:13;13294:66;13353:6;13348:3;13341:4;13333:6;13329:17;13294:66;:::i;:::-;13423:13;;13382:16;;;;13445:70;13423:13;13382:16;13492:4;13480:17;;13445:70;:::i;:::-;13531:20;;13061:496;-1:-1:-1;;;;13061:496:8:o;14372:125::-;14437:9;;;14458:10;;;14455:36;;;14471:18;;:::i;15200:936::-;15295:6;15326:2;15369;15357:9;15348:7;15344:23;15340:32;15337:52;;;15385:1;15382;15375:12;15337:52;15418:9;15412:16;-1:-1:-1;;;;;15488:2:8;15480:6;15477:14;15474:34;;;15504:1;15501;15494:12;15474:34;15542:6;15531:9;15527:22;15517:32;;15587:7;15580:4;15576:2;15572:13;15568:27;15558:55;;15609:1;15606;15599:12;15558:55;15638:2;15632:9;15660:2;15656;15653:10;15650:36;;;15666:18;;:::i;:::-;15712:2;15709:1;15705:10;15695:20;;15735:28;15759:2;15755;15751:11;15735:28;:::i;:::-;15797:15;;;15867:11;;;15863:20;;;15828:12;;;;15895:19;;;15892:39;;;15927:1;15924;15917:12;15892:39;15951:11;;;;15971:135;15987:6;15982:3;15979:15;15971:135;;;16053:10;;16041:23;;16004:12;;;;16084;;;;15971:135;;;16125:5;15200:936;-1:-1:-1;;;;;;;;15200:936:8:o;16141:135::-;16180:3;16201:17;;;16198:43;;16221:18;;:::i;:::-;-1:-1:-1;16268:1:8;16257:13;;16141:135::o;16281:489::-;-1:-1:-1;;;;;16550:15:8;;;16532:34;;16602:15;;16597:2;16582:18;;16575:43;16649:2;16634:18;;16627:34;;;16697:3;16692:2;16677:18;;16670:31;;;16475:4;;16718:46;;16744:19;;16736:6;16718:46;:::i;:::-;16710:54;16281:489;-1:-1:-1;;;;;;16281:489:8:o;16775:249::-;16844:6;16897:2;16885:9;16876:7;16872:23;16868:32;16865:52;;;16913:1;16910;16903:12;16865:52;16945:9;16939:16;16964:30;16988:5;16964:30;:::i

Swarm Source

ipfs://27177a7407779a0850891fb10fd419a3c26c001d2ea4daf91343ce25d27d2348
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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