ETH Price: $2,664.61 (+0.83%)

Token

FluffyFucks Koalas (FFXg2.0)
 

Overview

Max Total Supply

1,212 FFXg2.0

Holders

210

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 FFXg2.0
0xAaC4548a187Ab30269a64BbF16116D453A784143
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
FluffyNextGen

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
petersburg EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-18
*/

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


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.0.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();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

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

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

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @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 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`
    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 auxillary 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 auxillary 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;
        assembly { // Cast aux without masking.
            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;
    }

    /**
     * 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 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, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

        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-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(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.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) 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 or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @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.
     */
    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 or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

    /**
     * @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 _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

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

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // 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 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: erc721a/contracts/extensions/IERC721AQueryable.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @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: erc721a/contracts/extensions/ERC721AQueryable.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @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`
     *
     * 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) public view 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[] memory tokenIds) external view 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 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 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: contracts/FluffyFucksReborn.sol



pragma solidity >=0.7.0 <0.9.0;




contract FluffyFucksReborn is ERC721AQueryable, Ownable {
  using Strings for uint256;

  string public uriPrefix = ""; //http://www.site.com/data/
  string public uriSuffix = ".json";

  string public _contractURI = "";

  uint256 public maxSupply = 6061;

  bool public paused = false;

  constructor() ERC721A("Fluffy Fucks", "FFXv2") {
  }

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

  function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner {
    require(!paused, "The contract is paused!");
    require(totalSupply() + _mintAmount < maxSupply, "Max supply exceeded!");
    _safeMint(_receiver, _mintAmount);
  }

  function mintForAddressMultiple(address[] calldata addresses, uint256[] calldata amount) public onlyOwner
  {
    require(!paused, "The contract is paused!");
    require(addresses.length == amount.length, "Address and amount length mismatch");

    for (uint256 i; i < addresses.length; ++i)
    {
      _safeMint(addresses[i], amount[i]);
    }

    require(totalSupply() < maxSupply, "Max supply exceeded!");
  }

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

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

  function contractURI()
  public
  view
  returns (string memory)
  {
        return bytes(_contractURI).length > 0
          ? string(abi.encodePacked(_contractURI))
          : "";
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

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

  function setContractURI(string memory newContractURI) public onlyOwner {
    _contractURI = newContractURI;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function withdraw() public onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }

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

}

// File: contracts/FluffyStaker.sol


pragma solidity >=0.8.0 <0.9.0;




contract FluffyStaker is IERC721Receiver, ReentrancyGuard {
    address public ownerAddress;
    bool public active = true;

    mapping(uint256 => address) staked;

    FluffyFucksReborn public ffxr;

    constructor()
    {
        ownerAddress = msg.sender;
    }

    fallback() external payable nonReentrant 
    {
        revert();
    }
    receive() external payable nonReentrant 
    {
        revert();
    }

    /**
     * on token received
     */
    function onERC721Received
    (
        address /*operator*/,
        address from, 
        uint256 tokenId, 
        bytes calldata /*data*/
    ) 
        public
        override
        onlyFromFluffyContract(msg.sender)
        returns(bytes4) 
    {
        staked[tokenId] = from;
        return IERC721Receiver.onERC721Received.selector;
    }

    /**
     * ADMIN ONLY
    */

    function setFluffyAddress(address contractAddress)
        public
        onlyOwner
    {
        ffxr = FluffyFucksReborn(contractAddress);
    }

    function restoreOddball(uint256 tokenId, address restoreTo)
        public
        onlyOwner
    {
        require(staked[tokenId] == address(0x0), "Token has a known owner.");
        ffxr.safeTransferFrom(address(this), restoreTo, tokenId);
    }

    function forceUnstake(uint256 tokenId)
        public
        onlyOwner
    {
        _forceUnstake(tokenId);
    }

    function forceUnstakeBatch(uint256[] calldata tokenIds)
        public
        onlyOwner
    {
        for(uint256 i = 0; i < tokenIds.length; ++i) {
            _forceUnstake(tokenIds[i]);
        }
    }

    function forceUnstakeAll()
        public
        onlyOwner
    {
        uint256[] memory tokens = ffxr.tokensOfOwner(address(this));
        for(uint256 i = 0; i < tokens.length; ++i) {
            _forceUnstake(tokens[i]);
        }
    }

    function _forceUnstake(uint256 tokenId)
        private
        onlyOwner
    {
        if(staked[tokenId] != address(0x0)) {
            ffxr.safeTransferFrom(address(this), staked[tokenId], tokenId);
            staked[tokenId] = address(0x0);
        }
    }

    function toggleActive(bool setTo) 
        public
        onlyOwner
    {
        active = setTo;
    }

    /**
     * LOOKUPS
     */

    function tokenStaker(uint256 tokenId) 
        public 
        view
        returns(address) 
    {
        return staked[tokenId];
    }

    function tokenStakers(uint256[] calldata tokenIds)
        public
        view
        returns(address[] memory)
    {
        address[] memory stakers = new address[](tokenIds.length);
        for(uint256 i = 0; i < tokenIds.length; ++i) {
            stakers[i] = staked[tokenIds[i]];
        }
        return stakers;
    }

    function allTokenStakers()
        isFluffyContractSet
        public 
        view
        returns (uint256[] memory, address[] memory)
    {
        uint256[] memory tokens = ffxr.tokensOfOwner(address(this));

        uint256[] memory stakedTokens;
        address[] memory stakers;
        
        uint256 count = 0;
        for(uint256 i = 0; i < tokens.length; ++i) {
            if (staked[tokens[i]] != address(0x0)) {
                ++count;
            }
        }

        stakedTokens = new uint256[](count);
        stakers = new address[](count);
        count = 0;

        for(uint256 i = 0; i < tokens.length; ++i) {
            stakedTokens[count] = tokens[i];
            stakers[count] = staked[tokens[i]];
            count++;
        }

        return (stakedTokens, stakers);
    }

    function totalStaked()
        isFluffyContractSet
        public
        view
        returns (uint256 count)
    {
        uint256[] memory tokens = ffxr.tokensOfOwner(address(this));
        count = 0;
        for (uint256 i = 0; i < tokens.length; i++) {
            if (staked[tokens[i]] != address(0x0)) {
                ++count;
            }
        }
    }

    function tokensStakedByAddress(address ogOwner)
        public
        view
        returns(uint256[] memory tokenIds)
    {
        uint256[] memory tokens = ffxr.tokensOfOwner(address(this));
        uint256 owned = 0;
        for (uint256 i = 0; i < tokens.length; ++i) {
            if (ogOwner == staked[tokens[i]]) {
                ++owned;
            }
        }

        tokenIds = new uint256[](owned);
        owned = 0;
        for (uint256 i = 0; i < tokens.length; ++i) {
            if (ogOwner == staked[tokens[i]]) {
                tokenIds[owned] = tokens[i];
                ++owned;
            }
        }
    }

    function isStakingEnabled()
        public
        view
        returns (bool)
    {
        return this.isStakingEnabled(msg.sender);
    }

    function isStakingEnabled(address send)
        public
        view
        returns (bool)
    {
        return ffxr.isApprovedForAll(send, address(this));
    }

    function oddballTokensThatShouldNotBeHere()
        public
        view
        returns (uint256[] memory tokenIds)
    {
        uint256 count = 0;
        uint256[] memory tokens = ffxr.tokensOfOwner(address(this));
        for(uint256 i = 0; i < tokens.length; ++i) {
            if (staked[tokens[i]] == address(0x0)) {
                ++count;
            }
        }

        tokenIds = new uint256[](count);
        count = 0;
        for(uint256 i = 0; i < tokens.length; ++i) {
            if (staked[tokens[i]] == address(0x0)) {
                tokenIds[count] = tokens[i];
                ++count;
            }
        }
    }

    /**
     * STAKING
     */

    function stakeBatch(uint256[] calldata tokenIds)
        isStakingActive
        isApproved(msg.sender)
        external
    {
        for (uint256 i = 0; i < tokenIds.length; ++i) {
            _stake(tokenIds[i]);
        }
    }

    function stake(uint256 tokenId)
        isStakingActive
        isApproved(msg.sender)
        external
    {
        _stake(tokenId);
    }

    function _stake(uint256 tokenId)
        isFluffyContractSet
        private
    {
        ffxr.safeTransferFrom(msg.sender, address(this), tokenId);
    }

    /**
     * UNSTAKING
     */

    function unstakeBatch(uint256[] calldata tokenIds)
        external
    {
        for (uint256 i = 0; i < tokenIds.length; ++i) {
            _unstake(tokenIds[i]);
        }
    }

    function unstake(uint256 tokenId)
        external
    {
        _unstake(tokenId);
    }

    function _unstake(uint256 tokenId)
        isFluffyContractSet
        onlyOriginalTokenOwner(tokenId)
        private
    {
        ffxr.safeTransferFrom(address(this), staked[tokenId], tokenId);
        staked[tokenId] = address(0x0);
    }

    /**
     * MODIFIERS
     */
    modifier onlyOriginalTokenOwner(uint256 tokenId)
    {
        require(msg.sender == staked[tokenId], "You are not tokens original owner");
        _;
    }

    modifier onlyOwner()
    {
        require(msg.sender == ownerAddress, "You are not owner.");
        _;
    }

    modifier onlyFromFluffyContract(address sentFromAddress)
    {
        require(sentFromAddress == address(ffxr), "Not sent from Fluffy contract.");
        _;
    }

    modifier isFluffyContractSet()
    {
        require(address(ffxr) != address(0x0), "Fluffy address is not set");
        _;
    }

    modifier isApproved(address send)
    {
        require(this.isStakingEnabled(send), "You have not approved FluffyStaker.");
        _;
    }

    modifier isStakingActive()
    {
        require(active, "Staking is not active.");
        _;
    }
}
// File: contracts/FluffyNextGen.sol

/**
 * SPDX-License-Identifier: UNLICENSED
 */

pragma solidity >=0.8.0 <0.9.0;








contract FluffyNextGen is ERC721AQueryable, Ownable, ReentrancyGuard
{
    FluffyFucksReborn public ffxr;
    bool public paused = true;
    bool public holderWlMintOpen = false;
    bool public publicMintOpen = false;
    uint256 public supply = 1212;
    uint256 public teamSupply = 30;
    uint256 public defaultMaxPerWallet = 5;
    uint256 public price = 0.0069 ether;
    bytes32 public merkleRoot;
    
    string private contractMetadataUrl;
    string private tokenMetadataUrlRoot;
    mapping(address => uint256) private addressHasMinted;
    mapping(address => uint256) private stakerHasMintedFree;

    mapping(address => uint256) private stakerSnapshot;

    /**
     * CONSTRUCTOR
     */

    constructor () ERC721A("FluffyFucks Koalas", "FFXg2.0")
    {
        deploySnapshot();
    }

    /**
     * MINTING
     */

    // team mint
    function teamMint(uint256 _quantity)
        public
        onlyOwner
        nonReentrant
        supplyExists(_quantity)
    {
        require(addressHasMinted[msg.sender] + _quantity <= teamSupply);
        _safeMint(msg.sender, _quantity);
        addressHasMinted[msg.sender] += _quantity;
    }

    // mint
    function mint(
        uint256 _quantity,
        uint256 _freeMints,
        bytes32[] calldata _proof
    )
        public
        payable
        isMintingOpen
        nonReentrant
        supplyExists(_quantity + _freeMints)
    {
        require(_quantity + _freeMints > 0, "No point minting nothing.");

        // checking if person is an active staker
        if(stakerSnapshot[msg.sender] > 0) {
            return stakerMint(stakerSnapshot[msg.sender], msg.sender, _quantity, _freeMints, msg.value);
        }

        require(_quantity > 0, "No point minting no fluffs.");

        // checking if person is an active holder
        uint256 balance = ffxr.balanceOf(msg.sender);
        if (balance > 0) {
            return holderMint(msg.sender, _quantity, msg.value);
        }

        // checking if person is whitelisted
        if (isAddressWhitelisted(msg.sender, _proof)) {
            return whitelistMint(msg.sender, _quantity, msg.value);
        }

        // defaulting to public mint
        return publicMint(msg.sender, _quantity, msg.value);
    }

    // staker mint
    function stakerMint(uint256 _numberStaked, address _minter, uint256 _quantity, uint256 _freeMints, uint256 _payment)
        private
        hasFunds(_quantity, _payment)
    {
        (uint256 maxFreeMints, uint256 maxMinted) = howManyCanStakerMint(_numberStaked);
        require(_freeMints + stakerHasMintedFree[_minter] <= maxFreeMints, "You cannot mint this many free mints.");
        require(_quantity + _freeMints + addressHasMinted[_minter] <= maxMinted, "You cannot mint this many fluffs.");
        _safeMint(_minter, _quantity + _freeMints);
        addressHasMinted[_minter] += _quantity + _freeMints;
        stakerHasMintedFree[_minter] += _freeMints;
    }

    // whitelist mint
    function whitelistMint(address _minter, uint256 _quantity, uint256 _payment)
        private
        isHolderWlMintOpen
        hasFunds(_quantity, _payment)
        canMintAmount(_minter, _quantity)
    {
        _safeMint(_minter, _quantity);
        addressHasMinted[_minter] += _quantity;
    }

    // holder mint
    function holderMint(address _minter, uint256 _quantity, uint256 _payment)
        private
        isHolderWlMintOpen
        hasFunds(_quantity, _payment)
        canMintAmount(_minter, _quantity)
    {
        _safeMint(_minter, _quantity);
        addressHasMinted[_minter] += _quantity;
    }

    // public mint
    function publicMint(address _minter, uint256 _quantity, uint256 _payment)
        private
        isPublicMintOpen
        hasFunds(_quantity, _payment)
        canMintAmount(_minter, _quantity)
    {
        _safeMint(_minter, _quantity);
        addressHasMinted[_minter] += _quantity;
    }

    /**
     * GETTERS AND SETTERS
     */

    function setPaused(bool _paused) 
        public
        onlyOwner
    {
        paused = _paused;
    }

    function setPublicMintOpen(bool _publicOpen)
        public
        onlyOwner
    {
        publicMintOpen = _publicOpen;
    }

    function setHolderWlMintOpen(bool _holdWlOpen)
        public
        onlyOwner
    {
        holderWlMintOpen = _holdWlOpen;
    }

    function setFluffyContract(address _contract)
        public
        onlyOwner
    {
        ffxr = FluffyFucksReborn(_contract);
    }

    function setMerkleRoot(bytes32 _merkle)
        public
        onlyOwner
    {
        merkleRoot = _merkle;
    }

    function setContractMetadataUrl(string calldata _metadataUrl)
        public
        onlyOwner
    {
        contractMetadataUrl = _metadataUrl;
    }

    function setTokenMetadataUrlRoot(string calldata _tokenMetadataRoot)
        public
        onlyOwner
    {
        tokenMetadataUrlRoot = _tokenMetadataRoot;
    }

    /**
     * VIEWS
     */

    function howManyCanSomeoneMint(address _minter)
        public
        view
        returns(uint256 freeMints, uint256 maxMints)
    {
        if(stakerSnapshot[_minter] > 1) {
            (freeMints, maxMints) = howManyCanStakerMint(stakerSnapshot[_minter]);
            return (
                freeMints - stakerHasMintedFree[_minter],
                maxMints - addressHasMinted[_minter]
            );
        } else {
            return (0, defaultMaxPerWallet - addressHasMinted[_minter]);
        }
    }

    function howManyCanStakerMint(uint256 _staked)
        public
        pure
        returns(uint256 freeMints, uint256 maxMints)
    {
        if (_staked == 0) {
            // 0 staked
            return (0, 0);
        } else if (_staked == 1) {
            // 1 staked
            return (0, 5);
        } else if (_staked < 10) {
            // less than 10
            return (_staked / 2, 5);
        } else if (_staked < 20) {
            // less than 20
            return (_staked / 2, 10);
        } else if (_staked < 40) {
            // less than 40
            return (10, 20);
        } else if (_staked < 69) {
            // less than 69
            return (20, 40);
        } else {
            // 69 or more
            return (35, 69);
        }
    }

    function isAddressWhitelisted(address _minter, bytes32[] calldata _proof)
        private
        view
        returns(bool)
    {
        return MerkleProof.verify(_proof, merkleRoot, keccak256(abi.encodePacked(_minter)));
    }

    /**
     * MODIFIERS
     */

    modifier isMintingOpen()
    {
        require(paused == false, "Minting is not active.");
        _;
    }

    modifier isPublicMintOpen()
    {
        require(publicMintOpen, "Public mint is not open.");
        _;
    }

    modifier isHolderWlMintOpen()
    {
        require(holderWlMintOpen, "Holder and Whitelist mint is not open.");
        _;
    }

    modifier supplyExists(uint256 _quantity)
    {
        require(_totalMinted() + _quantity <= supply, "This would exceed minting supply.");
        _;
    }

    modifier hasFunds(uint256 _quantity, uint256 _payment)
    {
        require(_quantity * price <= _payment, "You do not have enough money to mint.");
        _;
    }

    modifier canMintAmount(address _minter, uint256 _quantity)
    {
        require(addressHasMinted[_minter] + _quantity <= defaultMaxPerWallet, "You cannot mint this many");
        _;
    }

    /**
     * CONTRACT STUFF
     */

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

    function withdraw() 
        public 
        onlyOwner 
        nonReentrant
    {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }

        function contractURI()
        public
        view
        returns(string memory)
    {
        return contractMetadataUrl;
    }

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

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

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

    /**
     * SNAPSHOT
     */
    function deploySnapshot()
        private
    {
        stakerSnapshot[0x0066A1C2137Ee60fEc2ac1f51E26DCd78Ae0f42d] = 6;
        stakerSnapshot[0x0071e278144a040EE373331d1c3d9e6fD3BB7339] = 2;
        stakerSnapshot[0x01850e6686a222edc136f11C93D824cDa433e364] = 4;
        stakerSnapshot[0x0287E8dfC37544995fb75af20fdaB57c74f4860D] = 2;
        stakerSnapshot[0x045e6833Fa2B7BBd1a6cfc3CC2630A6e20Ff9E87] = 6;
        stakerSnapshot[0x06E5D82B5A8dF0435CE8046bc15290594bC0c710] = 2;
        stakerSnapshot[0x07035d0e0cFb5e89218be943507694526A4EBE54] = 4;
        stakerSnapshot[0x074DB7F6c8dbD545e53411795B182529f494779A] = 2;
        stakerSnapshot[0x08132a6899DdcfD77bAA15990D96f6645a9390da] = 2;
        stakerSnapshot[0x08834D1ac96cb6D533C5a742511C759EE83B0d61] = 8;
        stakerSnapshot[0x08e6c66Ce1fdEE6004a63B06cA0Ff324b8aa5826] = 2;
        stakerSnapshot[0x090459ae119b904A0808568E763A4f5556B49FE0] = 2;
        stakerSnapshot[0x0945BE11418b180Ec8DfE0447a9bE1c15FB1BeaD] = 2;
        stakerSnapshot[0x09Cb303EcAba558422d63B7392d095C7ffE37D36] = 2;
        stakerSnapshot[0x0aAB45d1B9C821EBfd03a77117c12355e8739c85] = 13;
        stakerSnapshot[0x0bC8801f28baf3F5cEbA2bC3f0Cdfcaf37C2846e] = 6;
        stakerSnapshot[0x0bE9F7f7a5d1e19311989bbE307c4796A534d6E8] = 4;
        stakerSnapshot[0x0c4DB5ECb43303d925EDa8F11Fe592D59d3C6cC3] = 7;
        stakerSnapshot[0x0C645D0c6Ec9ec7DDe5BB8f5E655e11775f44277] = 2;
        stakerSnapshot[0x0d47A223Fd09C174184131a9a539562b4a026E57] = 4;
        stakerSnapshot[0x0dd201E9243320cb0651AcdCb134e086f4582645] = 2;
        stakerSnapshot[0x0DfAb02678695f56E9373aA072A59fbDA5938a49] = 2;
        stakerSnapshot[0x0E96cC0F0001Ab39659d48050d5e5A4361330a4B] = 2;
        stakerSnapshot[0x1059650DC09681949F7686974F61D95c2135B091] = 2;
        stakerSnapshot[0x105c9EF0a0531a3B1B692508EFe7994880d942B7] = 4;
        stakerSnapshot[0x106aBAfcD4C1F615eBF14EFDD7e52EDFb33217aB] = 2;
        stakerSnapshot[0x134aed007F8935746749Ab25bD3CE88231BF555a] = 2;
        stakerSnapshot[0x139734BaAd745912286B55cE07a6D113C19A9AD9] = 2;
        stakerSnapshot[0x142875238256444be2243b01CBe613B0Fac3f64E] = 2;
        stakerSnapshot[0x14573a0484D8639e024264e0159905AC1eB9B453] = 2;
        stakerSnapshot[0x15384d0578CFcBA6C9E29777599871c8E0878513] = 4;
        stakerSnapshot[0x167f12fEFB578f29bEd2585e84ae6C5A72fF21Cd] = 2;
        stakerSnapshot[0x169eB0789887fedA30DcBD91b4002089A98Ab241] = 2;
        stakerSnapshot[0x190237dcED5114bD6c482772ce20faD0Be407b4A] = 6;
        stakerSnapshot[0x1a2f95a9dc750b581632C567a2d7B96650D6e019] = 6;
        stakerSnapshot[0x1Ba3a102D292e988E8eE55d30ad98e5B4BdA32dc] = 2;
        stakerSnapshot[0x1E50CA5bfc75d6B4af207503E3A6D4A4c5ec05cd] = 4;
        stakerSnapshot[0x205BBBE1b5EE65efFe19c5DD59b84AD1413BBB77] = 4;
        stakerSnapshot[0x2129bCA7cA8B37956ec24c5b7411fd5424370DBF] = 15;
        stakerSnapshot[0x2245Ec2b9773e5B6A457F883c3183374Fe4D0864] = 4;
        stakerSnapshot[0x23f3c4dD6297A36A2140d5478188D9e773D3Ac9E] = 2;
        stakerSnapshot[0x252723A88a9c2279E998D4eD363DB120553C715C] = 5;
        stakerSnapshot[0x252d74d7d69f5cC3Bb2Cd2fdbE3b37DC1F1edC2f] = 4;
        stakerSnapshot[0x2581F074fDA1454a2869862D61429Dd5871cE4DA] = 2;
        stakerSnapshot[0x25A1Cfac8c9eADAB7c12FB59d54144593Aa96436] = 4;
        stakerSnapshot[0x2735B84B6AfB1328EA7809ce212589C5175D71Fb] = 2;
        stakerSnapshot[0x2760F7d38377AcF2Fc26c08915B4669eBeE1420A] = 4;
        stakerSnapshot[0x27f0A1677a3185d360ac5985f3BbC766ca34b00E] = 14;
        stakerSnapshot[0x29adfe4efD359939322493eD8B386d45877E7749] = 8;
        stakerSnapshot[0x2A9a201B97305F52E3771ACDbFbaDc015fbD155F] = 2;
        stakerSnapshot[0x2b604baEe38Fd5d9eF2b236e4d8462C27A66aD5d] = 2;
        stakerSnapshot[0x2bEcCB8975aEee773b03a3CB29a81304D5AC6122] = 2;
        stakerSnapshot[0x2c82C2B69d7B56EE7f475d1320e362e87b51Ae4d] = 6;
        stakerSnapshot[0x2FE38f5092E76b27e278bf2417e2a56375bB6b8B] = 8;
        stakerSnapshot[0x3020136b9958642cf8E3972E06DB21F3884DF56A] = 2;
        stakerSnapshot[0x31aBDFd780A044b034270862F46853d1e34Dd6aE] = 2;
        stakerSnapshot[0x31B685C06590d72c67609C2d940C41C79966D2E3] = 6;
        stakerSnapshot[0x31e4662AAE7529E0A95BeD463c48d8B398cfAB73] = 12;
        stakerSnapshot[0x34A0c4799a177a95EA6611aEbf377639f551eaa3] = 33;
        stakerSnapshot[0x3578234C0FD2d531E84eEc84CAbf64FF5B246c30] = 2;
        stakerSnapshot[0x3609840fb53EBEa9F39c2c97e4A39438a825a89e] = 20;
        stakerSnapshot[0x36214d560aaa853d5c0853920FFe27779803419D] = 7;
        stakerSnapshot[0x362DC61A04cb099aB6b912DB07e0D6270342f16D] = 25;
        stakerSnapshot[0x3765A89463A19D5c2413544808Cb8b537Ac406eF] = 2;
        stakerSnapshot[0x37FFe79d00C8c33E3f9622ac940e46BFa56d70a7] = 5;
        stakerSnapshot[0x39E121297240Ac7F72E7487D799a0fC06422e216] = 2;
        stakerSnapshot[0x3A410941d1A1f9d6d09a2F479Be991C237DD2A68] = 2;
        stakerSnapshot[0x3a95e5407E32A1CC7f6923F3297aF09D2279bBDC] = 2;
        stakerSnapshot[0x3Aa17002F448bee09284dDe391A595E51DCd8c39] = 5;
        stakerSnapshot[0x3cbE9F5d49a2b92FA49cc01B4547C0860Bae4f99] = 2;
        stakerSnapshot[0x3ccc9E75E6C63fcb68E30B81A3bc3209dB09A9f9] = 8;
        stakerSnapshot[0x3d5A925EeD67A613778d7Ad9254aB75241348EBc] = 6;
        stakerSnapshot[0x3E311f18653300f9441aC0D886DFF51e1278aAEB] = 3;
        stakerSnapshot[0x3E6D9477BA6b136bAb6FA4BE2E40373de2eC704F] = 2;
        stakerSnapshot[0x3ec6d18f4A52dd8dBCb013eE920f935738C6223C] = 79;
        stakerSnapshot[0x3eC8A6f383Fdda0A21996b4233946717f9EacB26] = 2;
        stakerSnapshot[0x3eddd4CC257564889Ba377f5Fdb9e827e9503F96] = 2;
        stakerSnapshot[0x3Ff0df7EC6Ab47725272691a030c22a59bc87B1D] = 2;
        stakerSnapshot[0x419D36f006Ba8933fFb99B5BC8d189505c0836d3] = 2;
        stakerSnapshot[0x42B83becC570F4e2D9b40544d59984541Aa52168] = 2;
        stakerSnapshot[0x433eE230C45Fd079E60CF5d428b76Caa0055558c] = 22;
        stakerSnapshot[0x434eD1DecDE9dCB0ca6c9E5c29C95D22f085400F] = 1;
        stakerSnapshot[0x4526E96ceDb7A4F570944c37A544B0E44b946ea4] = 69;
        stakerSnapshot[0x46A8E8B740292775F036da3Bd279f1994864bf53] = 2;
        stakerSnapshot[0x46bE8E0a5e919E1A174978636B6be161b21E2f1A] = 6;
        stakerSnapshot[0x47e44738be0732119E0687EaA3BC18F5c8e58399] = 2;
        stakerSnapshot[0x47F740c1Ea213A267B483640c1C3aEC8B262f25e] = 26;
        stakerSnapshot[0x48ec7Fe34E0C7843133c0e7571c2f17AB8C7bf32] = 4;
        stakerSnapshot[0x49a15aD9eCa0d7aDc9dABe42869DFc304C26FD53] = 2;
        stakerSnapshot[0x4aC3728c8C2CCAAf89784ea9C9Ae886A9a30B56c] = 6;
        stakerSnapshot[0x4ae0e898A9E0deE985E7f35F5630e2eDe0cD6216] = 4;
        stakerSnapshot[0x4bf1fF6D70a2ECe1cBA5Bb18FDC2444f3D40Aa1d] = 2;
        stakerSnapshot[0x4C0aCA1031913e3C0cA7A1147F39A8588E04c55d] = 2;
        stakerSnapshot[0x4C981C345e9047524f793e8b5E15f2089320842b] = 2;
        stakerSnapshot[0x4Ce8BDc18e257dB9ea29D11E290DfbA99431dDd9] = 7;
        stakerSnapshot[0x4F4567044DE8f48A70e9e17Bd80fFA3F8e80C836] = 4;
        stakerSnapshot[0x4f56215bFB5E76fA6849Ae3FdEf417C19cD9AA23] = 4;
        stakerSnapshot[0x4F94eE0B6d2a31cb9BeFEEF2d95bF19F3a63E7Dd] = 4;
        stakerSnapshot[0x535FF5ACFeE41Fd02F01667dDd25772D8f8A231D] = 1;
        stakerSnapshot[0x53965cd7992BC61b4807Aa7aCe3Bec0062c90dE2] = 2;
        stakerSnapshot[0x542B659331442eAcFE2EF1a135F31aF1c107FE3A] = 4;
        stakerSnapshot[0x5615bCb489147674E6bceb3Cda97342B654aBA81] = 3;
        stakerSnapshot[0x5709D86f9946D93a2e1c6b2B6C15D6e25F37B19B] = 3;
        stakerSnapshot[0x57140a5EC315C7193DeFA29356B1cBd9a1393435] = 7;
        stakerSnapshot[0x575543b79Ab9913FA322295e322B08ef6C023a88] = 2;
        stakerSnapshot[0x5758bc7DcBcb32E6eBDa8Fe951E5a588e8a7A097] = 2;
        stakerSnapshot[0x578D7d391B4F34E35B4ca669F6a1dC18c04bB451] = 2;
        stakerSnapshot[0x581ddECBf2E27a06A069D67Fc7fb185eFB3c3d5f] = 3;
        stakerSnapshot[0x584a1d14920A49C8d19110636A2b435670CAf367] = 1;
        stakerSnapshot[0x5970F4d785A81b774D58330f47cD470fc3599848] = 3;
        stakerSnapshot[0x59b8130B9b1Aa6313776649B17326AA668f7b7a6] = 6;
        stakerSnapshot[0x5A512866D6E2a5d34BcdA0C4a28e207D2a310B60] = 2;
        stakerSnapshot[0x5C55F7eD0CDfE0928b19CA0B076C26F98080a136] = 2;
        stakerSnapshot[0x5Da07C2959C9815FEcEaC21FD7547C7E684c2431] = 2;
        stakerSnapshot[0x5DF596aa9315cd8B56e5C1213762F5b482Cb8aDA] = 1;
        stakerSnapshot[0x5f5B53E9e65CEbDc9085A73B017451f79B9d0158] = 2;
        stakerSnapshot[0x5fa19516d4A9AB74B89CeBc4E739f9AbdF69d7Bd] = 4;
        stakerSnapshot[0x5FDC2E1c58308289d8dD719Db2f952258e28ec96] = 1;
        stakerSnapshot[0x600cFB1736626C03dF54964ef481861eD092A7a0] = 2;
        stakerSnapshot[0x60cF1FCb21F08E538B16B0579009EF35107fDd53] = 1;
        stakerSnapshot[0x612E900a95Cd662D6c7434ECcCaA92C5CDf05F25] = 12;
        stakerSnapshot[0x61D7f4Dd8b5D8E9416fE8Fd81224171cAA32112b] = 2;
        stakerSnapshot[0x62e0C4336370184873224EC5ebeE4B6567d5602d] = 2;
        stakerSnapshot[0x62E725f096666Ef2f05fF3AAF4d0b042b3Eef5B8] = 7;
        stakerSnapshot[0x63E80354A787f7C876eb3C862BC93e36fCC1F310] = 4;
        stakerSnapshot[0x64Bc737b1A030aaC323c073f11939DB7b9e8F347] = 10;
        stakerSnapshot[0x6576082983708D32418d7abe400E2Df4360aa550] = 1;
        stakerSnapshot[0x657C61B33779B526BBbd6d5A24D82a569717dCeE] = 3;
        stakerSnapshot[0x668ca185c3cDfA625115b0A5b0d35BCDADfe0327] = 81;
        stakerSnapshot[0x6868B90BA68E48b3571928A7727201B9efE1D374] = 30;
        stakerSnapshot[0x68E9D76F37bE57387CF6b9E1835b04CC957aa2E7] = 20;
        stakerSnapshot[0x695f28D97aDF81DE4C8081aEf62d16d7B60fD35B] = 10;
        stakerSnapshot[0x697Dc0e8A3b3e3758f59f32BE847b2290823dBC1] = 42;
        stakerSnapshot[0x698f345481Fc1007C5094D8495b01DF375E4E4a7] = 2;
        stakerSnapshot[0x69B2803c04fec9505113038E1F91257A337DF63e] = 2;
        stakerSnapshot[0x69fD02C1Cf7659D3D095c4Ce73B5d5C23886B5f6] = 3;
        stakerSnapshot[0x6b140e5a9F6B6967Af30F789414840E2FFe1bdE9] = 2;
        stakerSnapshot[0x6B703CbB3cA5FE26cA9054F95c808facD7B57bCA] = 2;
        stakerSnapshot[0x6bA9BAb89e215DA976776788630Bce75E331B87d] = 1;
        stakerSnapshot[0x6C719836105879783760EAef03A8E004482eD33C] = 7;
        stakerSnapshot[0x6C87622a5de8cf0B5E7d4Dd2e6d9EBedBBF6289C] = 6;
        stakerSnapshot[0x6c9E0941eD2Fe399bfdd30Afb91A89db3f719f78] = 20;
        stakerSnapshot[0x6D28439B6c5A022B8C50C1AA0b8a8dA4B416FA6f] = 1;
        stakerSnapshot[0x6F8a67326832E81F0c13c69EcC9Bec618F707526] = 6;
        stakerSnapshot[0x6F9fc508dC77FD4ABEa9d72c91E7133703a2F38F] = 20;
        stakerSnapshot[0x7270B7aC52ee19a1c07EFE24574B0360f9bCaa76] = 2;
        stakerSnapshot[0x72b113664DEC5094Efb4431C39Ed4da003De59cd] = 74;
        stakerSnapshot[0x7357f081E79760e157E6C4215a35ad0233260f66] = 1;
        stakerSnapshot[0x74F499133eD684dA42B83afb1592aEc92F48228a] = 2;
        stakerSnapshot[0x75f9406bb829b6ad1313dB7FFf421E1E959D010b] = 8;
        stakerSnapshot[0x76239D6b1D37E0058D89C06c21BE4A14C492b301] = 2;
        stakerSnapshot[0x76E8D76759Acd20220F17f0dCdeb5768Be535152] = 2;
        stakerSnapshot[0x76F8a5c06857b44E1D459671b00708c7502c7999] = 2;
        stakerSnapshot[0x7836989949554501AC5D021b7BaeF6c992f1B854] = 3;
        stakerSnapshot[0x798A7D6F30DCaa0c060c8514E461c005A0400458] = 2;
        stakerSnapshot[0x79adc74978a81EB68D11Ab69558b11BECDD88DeC] = 6;
        stakerSnapshot[0x79c837F954CaEae493FaA298B0e0DcF0d5BAb20d] = 2;
        stakerSnapshot[0x7A0AB4A019f5B9626db6590F02d07f8Ee504Ae8A] = 2;
        stakerSnapshot[0x7a600C045eF72CE5483f7E76d4Fe5bEfFCdEE6aC] = 7;
        stakerSnapshot[0x7A60A3f8377a202E31d9Ff70A9Ebaee6c60D8db8] = 2;
        stakerSnapshot[0x7a6651c84D768c8c6cB380B229e65590c0BD4D78] = 13;
        stakerSnapshot[0x7b9D9cD877784D19A0977Aedb9f8697Bf7aaad9E] = 2;
        stakerSnapshot[0x7C68f66C70836c9745AC42a5Ab2A5C3f8F3D3294] = 2;
        stakerSnapshot[0x7CdA50Bed220eA0860d60095B27Ee4F744511bb9] = 1;
        stakerSnapshot[0x7D198D4643DB60Fd6E772470B03A079e920EcC19] = 31;
        stakerSnapshot[0x7E5F3d3C54B4185b3430005E2354817331F23550] = 3;
        stakerSnapshot[0x7Efbcb80C47514a78Cdf167f8D0eed3d8a1D7a00] = 6;
        stakerSnapshot[0x812005457367912B4FcCf527a13b4947d177E8c6] = 1;
        stakerSnapshot[0x816F81C3fA8368CDB1EaaD755ca50c62fdA9b60D] = 3;
        stakerSnapshot[0x82023a7bf582E1C772a1BcD749e10C0AFD7aB04E] = 2;
        stakerSnapshot[0x824189a4C3bc22089bC771b5c9D60131Fd1252a7] = 20;
        stakerSnapshot[0x82e928D20c021cAbBd150E7335f751F71A30cBcA] = 2;
        stakerSnapshot[0x83A9e7FCCb02a20E7ba0803a6dc74600803BB320] = 8;
        stakerSnapshot[0x849f03ACc35C6F4A861b76e1F271d217CD24b18C] = 2;
        stakerSnapshot[0x854C162aA246Ffe344262FC1175B6F064dB7250E] = 20;
        stakerSnapshot[0x870Bf9b18227aa0d28C0f21689A21931aA4FE3DE] = 2;
        stakerSnapshot[0x87cF0dd1272a6827df5659758859a96De9837EC5] = 8;
        stakerSnapshot[0x8902B48123201dBBadC20c40B1005C5Ad6250cc5] = 6;
        stakerSnapshot[0x89B91536A411D97837163987f3a33C15C5599479] = 2;
        stakerSnapshot[0x89d687021563f1A62DCD3AcaDDc64feF948F8fcb] = 40;
        stakerSnapshot[0x8a4892a38196d4A284e585eBC5D1545E5085583a] = 2;
        stakerSnapshot[0x8C2Bf3a4504888b0DE9688AEccf38a905DcEC940] = 4;
        stakerSnapshot[0x8c2Db300315DcB15e0A8869eA94F843E218a78B4] = 4;
        stakerSnapshot[0x8C409C76690F16a0C520EF4ECECBB8ad71017480] = 20;
        stakerSnapshot[0x8c7e78d32CB350D7B560372285610b5E46e67981] = 4;
        stakerSnapshot[0x8cCc7DA43DcbA6FEf07a318f88965e7aEEdB5eBc] = 12;
        stakerSnapshot[0x8D757F5675405271de9DDff392f7E7A717b5bddb] = 4;
        stakerSnapshot[0x8D98139512ac57459A468BC10ccf30Fd9dd6149A] = 12;
        stakerSnapshot[0x8f0CaCC1B3d0066A31Fc97c6CF1db1b0F56f073f] = 2;
        stakerSnapshot[0x8Fa3e7cb0c9C14FfBe750080A97ee678AD71a216] = 2;
        stakerSnapshot[0x8fd974089B612041C37eB643980C2A9C9BA85058] = 1;
        stakerSnapshot[0x9251af98d5649d1BC949f62E955095938897289d] = 2;
        stakerSnapshot[0x92aC315cb47B620F84238C57d3b3cc7F42078781] = 4;
        stakerSnapshot[0x92b398370dda6392cf5b239561aB1bD3ba393CB6] = 6;
        stakerSnapshot[0x92B99779Bc3471706A8f9Eb0F3975331e6664678] = 4;
        stakerSnapshot[0x93d751d48693AD3384C5021F821122bc4192B504] = 7;
        stakerSnapshot[0x945A81369C1bc7E73eb2D509AF1f7a067A253702] = 4;
        stakerSnapshot[0x95e3C7af64fFCDdA13630C7C10646775dc638275] = 27;
        stakerSnapshot[0x960A84baf0Ac4162a83D421CDB7a00Cc2777b22D] = 2;
        stakerSnapshot[0x964afBC4d4a80346861bB87dbC31a8610AE87fC4] = 4;
        stakerSnapshot[0x97111A057171E93aa7b2d63B4f6B5b7Bdc33EF8D] = 4;
        stakerSnapshot[0x995B7FABDae160217F378BbB05669Aa4bDcdc81f] = 1;
        stakerSnapshot[0x9B687413591Ad92cC1BC5cD5Fd442c04872D97DB] = 6;
        stakerSnapshot[0x9C9964733479a6E0758d97A7B89DcE81C20b19d7] = 1;
        stakerSnapshot[0x9e01852683b88D829551895C7BFd1799b121fdBC] = 4;
        stakerSnapshot[0x9f137fb2330e499607E1b1233dE2C1b90b1A7a85] = 4;
        stakerSnapshot[0x9FC7EdAC9dF5bCc75671EFF5A2c2898Fc4242636] = 22;
        stakerSnapshot[0x9Fe697f4d0D447409331681e0401a4f7E756fdD7] = 5;
        stakerSnapshot[0xA01D7E4e848467CBD2CA864150f27A9D286C86C8] = 9;
        stakerSnapshot[0xa07cb2c3861D34FA5686d52018dC401FF413F05D] = 7;
        stakerSnapshot[0xA0843Cf5DbEaf1EB3d7Cd31B372d6Cc06180b1Ab] = 2;
        stakerSnapshot[0xa0C737617b7E63e1CbF87C45c11cd766CF57Bd9D] = 2;
        stakerSnapshot[0xA1bE91b15E959294Cb6eFD7891c846cAf7ef7602] = 4;
        stakerSnapshot[0xa235Fbd83AD5B143bCd18719834C60BA7c925C52] = 2;
        stakerSnapshot[0xA2bff178071A266D14e360e3f3CE226B19D3F809] = 2;
        stakerSnapshot[0xa55F7eA2F6001DC6d046cFe799c3Ec4dC79cc5b8] = 3;
        stakerSnapshot[0xa62CBb35f5a51695F1cC550f3a8506Fc458D681D] = 2;
        stakerSnapshot[0xA6E3F06461A5d34fB3344FF6b45d6C92D207c35d] = 38;
        stakerSnapshot[0xa731325b4D01250Fe8852Fe76974F084d968e75D] = 20;
        stakerSnapshot[0xa784224c2F3c82c47abEda5D640e911633Cd24Da] = 4;
        stakerSnapshot[0xA8047DcE2A42968379E68870274ED2F534082Edd] = 3;
        stakerSnapshot[0xa8ad3C8D9039a0D10040d187C44336e57456fecE] = 2;
        stakerSnapshot[0xAa5B7f29C81B7409A021a2Bfe1E0FCec27EAD33E] = 2;
        stakerSnapshot[0xAaCDB53292F7703A608926799C9A02C9662923aa] = 4;
        stakerSnapshot[0xAb48De856930c018238c226D166Feaed3541Ec7d] = 1;
        stakerSnapshot[0xab516c4a5A0b705025a079814bDe84e846bCe019] = 20;
        stakerSnapshot[0xAb532bE7866818326D5A9cf86134eb0C2E95A8cE] = 2;
        stakerSnapshot[0xABa93498a69373b5E5f72254a513Bfaf77253d16] = 2;
        stakerSnapshot[0xACa79E56C92DeD769D2B773C8bab2aB552Ec5172] = 69;
        stakerSnapshot[0xAdc81042fEc23050b99EA6E08552a2bA439Df481] = 2;
        stakerSnapshot[0xaF9938ec47EbD29c93208f71f63d27b61E517522] = 20;
        stakerSnapshot[0xAfC9D3054f3047AA99347f4266a256BF2F6e12ca] = 2;
        stakerSnapshot[0xB0ea4466D71431E87B4c00fa2AECe86742e507b0] = 23;
        stakerSnapshot[0xb1ce4373890A21CC3Fd65480D72770496689a7Ba] = 20;
        stakerSnapshot[0xb1e2E3EA2A52Ee700403fc504429012FD733dD72] = 22;
        stakerSnapshot[0xB2A7CE5B1fAF0d1f4fF1a59fCa9D7ee24917FF81] = 4;
        stakerSnapshot[0xb37e6F4F7E3f74e447d860aAeB0E8783320c66bF] = 6;
        stakerSnapshot[0xb3C4fC3a65C2DF5d0f4e748BdC563bAB49d0399d] = 8;
        stakerSnapshot[0xB47832cA65E661b2b54dE39F24775C1d82C216f9] = 2;
        stakerSnapshot[0xb5048a3518C05F2dD51976e941047B54b0539ECD] = 2;
        stakerSnapshot[0xb5cA180081211730DD00d4fac6f4bEDF74e932Da] = 71;
        stakerSnapshot[0xB666A384e23da54C7DA222a2c3dE69a009Fae620] = 2;
        stakerSnapshot[0xB7Afe2297B5756B740193076e5CB2753aC582543] = 2;
        stakerSnapshot[0xB84404f79EbeF00233E1AEdB273c67c917B8840f] = 40;
        stakerSnapshot[0xB8545d529234eB2848C85c0CcC0a5Ce9B30a3C0b] = 6;
        stakerSnapshot[0xb87c4158b4A5766D67aA8591064bbe5126823514] = 2;
        stakerSnapshot[0xb908B613d695c350BF8b88007F3f2799b91f86c4] = 1;
        stakerSnapshot[0xBaB80520D514Df65B765A1f8990cc195559E6778] = 2;
        stakerSnapshot[0xBd50C7a6CF80A5221FCb798a7F3305A036303d2D] = 2;
        stakerSnapshot[0xBde69E440Bd3AbC059db71cE0bb75f31b92F37E1] = 2;
        stakerSnapshot[0xBE331A01056066311C9989437c58293AF56b59cA] = 4;
        stakerSnapshot[0xBe546e6a5CA1c2CfcB486Bb9de4baD98C88e7109] = 2;
        stakerSnapshot[0xBeaa9B4b26aEA31459dCA6E64e12A0b83e21A0dd] = 12;
        stakerSnapshot[0xBfEcB5bD1726Afa7095f924374f3cE5d6375F24A] = 2;
        stakerSnapshot[0xC25cea4227fA68348F025A8C09768378D338F8d6] = 2;
        stakerSnapshot[0xC261c472a5fea6f1002dA278d55D2D4463f000ef] = 4;
        stakerSnapshot[0xc3cf1A2962b750eb552C4A1A61259Fd35063e74e] = 2;
        stakerSnapshot[0xc42480b588Aff1B9f15Db3845fb74299195C8FCE] = 6;
        stakerSnapshot[0xC800391fDDcC6F899DCA185d5B16994B7D0CB13e] = 2;
        stakerSnapshot[0xcac8ca2C41b14304906c884DB9603A7B29D98Adb] = 5;
        stakerSnapshot[0xcB85e96ADE0D281eA3B5B8165cdC808b16Ac13b9] = 2;
        stakerSnapshot[0xcB91368B760f0d6F2160114b422A93aE50e44542] = 4;
        stakerSnapshot[0xcBa18510a6336F3975Cea1164B9C5d029E1A7C82] = 2;
        stakerSnapshot[0xCBc6C9CeF4f3C7cbBb8Eb82A2aD60c00e631A8C1] = 8;
        stakerSnapshot[0xcC507e6DDc3a6C992BC02019fbEeb8f81Be9FBb2] = 69;
        stakerSnapshot[0xcCE8A3fb91290071b377FE0EC3df0eb7ceA8AFFC] = 2;
        stakerSnapshot[0xcd1C78538E3Cc0D2ceadd87b8124357d86566365] = 3;
        stakerSnapshot[0xcE046B2a56fea1559dB99f7fB4e4570aaaFF9889] = 6;
        stakerSnapshot[0xce83bc7517B8435Eb08EB515Aa3f6c9386b1E2A0] = 6;
        stakerSnapshot[0xCF0268111e06d26e1B9ea813Fe49c40A4227778D] = 6;
        stakerSnapshot[0xCf7346Ba8d7D4D2A3A256b2FA00Daf5c7566351b] = 2;
        stakerSnapshot[0xd03a4E75A730eb5f700dfE71703CbaA99CB67532] = 6;
        stakerSnapshot[0xd054952345f497F7A9461a202E8f1284b885eE2F] = 6;
        stakerSnapshot[0xd2A41a1Aa5698f88f947b6ba9Ce4d3109623c223] = 2;
        stakerSnapshot[0xD4658C7c5b42cAd999b5b881305D60A72590f247] = 7;
        stakerSnapshot[0xd696d9f21f2bC4aE97d351E9C14Fa1928C886c61] = 2;
        stakerSnapshot[0xd69A21f89c463a96F9E916F84a7AA5ca8A9DD595] = 1;
        stakerSnapshot[0xd76A10B1916404eE78f48571c1a5Fa913aaAF72b] = 21;
        stakerSnapshot[0xD7d28e62b7221A82094292Ed59F1d9D86D32c39c] = 7;
        stakerSnapshot[0xD9AF96861dE6992b299e9aC004Aa4c68771d0815] = 2;
        stakerSnapshot[0xD9C925E7dB3c6F64c2b347107CAfDc75390A8744] = 4;
        stakerSnapshot[0xDafF72174cf270D194f79C4d5F1e1cDAb748fE14] = 6;
        stakerSnapshot[0xdb955C787Ea67964e1d47b752657C307283aE8c2] = 6;
        stakerSnapshot[0xDBbce16eDeE36909115d374a886aE0cD6be56EB6] = 2;
        stakerSnapshot[0xdc5B1B4A9730C4d980FE4e9d5E7355c501480d73] = 2;
        stakerSnapshot[0xDC6eB1077c9D84260b2c7a5b5F1926273Ae54578] = 2;
        stakerSnapshot[0xDD262F615BfAc068C640269E53A797C58410bAFc] = 42;
        stakerSnapshot[0xdDd1918AC0D873eb02feD2ac24251da75d983Fed] = 2;
        stakerSnapshot[0xE11D08e4EA85dc79d63020d99f02f659B17F36DB] = 3;
        stakerSnapshot[0xE18ff984BdDD7DbE2E1D83B6B4C5B8ab6BC7Daf6] = 2;
        stakerSnapshot[0xE2F7c36A7cFC5F54CfEA051900117695Cb3c6b2f] = 6;
        stakerSnapshot[0xe367B61Ab9bC05100fDA392fec1B6Ff2b226cF6E] = 23;
        stakerSnapshot[0xe54DEBc68b0676d8F800Aff820Dfe63E5C854091] = 2;
        stakerSnapshot[0xe5A923B2Db4b828Ab1592D10C53cfeA7080245B3] = 71;
        stakerSnapshot[0xE5b0e824DA704b77f5190895b17b990024a22A3E] = 2;
        stakerSnapshot[0xe66a52474370E0CbDa0F867da4D25471aA3C1615] = 9;
        stakerSnapshot[0xe717472C2683B6bca8688f030b9e0C65cFc52c99] = 2;
        stakerSnapshot[0xE7b770c6cf75325A6525E79A6Afae60888f3F498] = 2;
        stakerSnapshot[0xE8969399b899244291cE9AB2f175B3229Cd42ECd] = 6;
        stakerSnapshot[0xE9275ac6c2378c0Fb93C738fF55D54a80b3E2d8a] = 2;
        stakerSnapshot[0xe978aE285E6ca04Ef40Af882371A2E4A97cFC812] = 7;
        stakerSnapshot[0xEa02AB878834bA9551987CbA64B94C514DDe194F] = 2;
        stakerSnapshot[0xEA99a428D69aa84aD9a20D782Cde4a1e6c3E9017] = 6;
        stakerSnapshot[0xEa9f6ec11914703227A737A670c4Fc5A7b20CBFc] = 65;
        stakerSnapshot[0xECA576463eA8aFB5A21e0335f0c4F4e4a414156b] = 2;
        stakerSnapshot[0xeCBCeA720dAc9dCFaA7024B80DB92755b8836785] = 4;
        stakerSnapshot[0xeE2020eeD81905C8964A4B236B858A1A6eB5889e] = 2;
        stakerSnapshot[0xEf85AB7726Fb85CEf041F1e035AbD5e6844B660E] = 2;
        stakerSnapshot[0xeFeb821368e89336f7110390A12c98fF95794fa8] = 2;
        stakerSnapshot[0xF1595c576370A794d2Ef783624cd521d5C614b62] = 2;
        stakerSnapshot[0xF2557A90C56CbB18b1955237b212A0f86A834909] = 4;
        stakerSnapshot[0xf2cfA31187616a4669369CD64853D96739ef999C] = 7;
        stakerSnapshot[0xf39C00D5bCDF098bAB69385b56ee8140EeB105a1] = 2;
        stakerSnapshot[0xF3D47f776F035333Aaf3847eBB41EA8955a149F4] = 2;
        stakerSnapshot[0xf416526650C9596Ed5A5aAFEd2880A6b3f9daEfc] = 4;
        stakerSnapshot[0xF45bE2e48dFD057eB700653aDA23d95108928FEF] = 2;
        stakerSnapshot[0xF7f9eF971B6377493Da1CD7a7206F603f190CDa5] = 2;
        stakerSnapshot[0xF90A20105A8EE1C7cc00466ebcC72060887cc099] = 12;
        stakerSnapshot[0xf944f5715314af4D0c882A868599d7849AAC266F] = 6;
        stakerSnapshot[0xF98DA3CC07028722547Bb795ce57D96bEbA936bd] = 4;
        stakerSnapshot[0xfb5D7141feaCBBd6678fD37D58EE9D19e01Df8EE] = 2;
        stakerSnapshot[0xfBBAc3c308799E744C939eaB11449E3649C1e52D] = 20;
        stakerSnapshot[0xFCc36706699c5cB1C324681e826992969dbE0dBA] = 6;
        stakerSnapshot[0xfE3Cf487565A3Cd275cb2cbf96a395F023637D86] = 2;
        stakerSnapshot[0xFeb244CDc87A2f3Feb9B10908B89fEd816E67B5a] = 70;
        stakerSnapshot[0xFECE31D9eD6B02F774eB559C503f75fc9b0bcE4E] = 2;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultMaxPerWallet","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":"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":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ffxr","outputs":[{"internalType":"contract FluffyFucksReborn","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderWlMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"howManyCanSomeoneMint","outputs":[{"internalType":"uint256","name":"freeMints","type":"uint256"},{"internalType":"uint256","name":"maxMints","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_staked","type":"uint256"}],"name":"howManyCanStakerMint","outputs":[{"internalType":"uint256","name":"freeMints","type":"uint256"},{"internalType":"uint256","name":"maxMints","type":"uint256"}],"stateMutability":"pure","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":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"_freeMints","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadataUrl","type":"string"}],"name":"setContractMetadataUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setFluffyContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_holdWlOpen","type":"bool"}],"name":"setHolderWlMintOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkle","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicOpen","type":"bool"}],"name":"setPublicMintOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenMetadataRoot","type":"string"}],"name":"setTokenMetadataUrlRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"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"}]

6080604052600a805462ffffff60a01b1916740100000000000000000000000000000000000000001790556104bc600b55601e600c556005600d556618838370f34000600e553480156200005257600080fd5b50604080518082018252601281527f466c756666794675636b73204b6f616c6173000000000000000000000000000060208083019182528351808501909452600784527f46465867322e3000000000000000000000000000000000000000000000000000908401528151919291620000cd9160029162002f73565b508051620000e390600390602084019062002f73565b5050600160005550620000f63362002f21565b600160098181556014602081905260067f7bb912de870f4a0fe8c392fd88cbbaa13963382d4e51e98eef6bd5af3aa08fef81905560027ff118a6742764c24d1f9039e16e6c575cfd669039542f4e3a20fcd83ce38a67ed81905560047f57a8209a46e9d353deda50742fde0d58530086eef9bdd65b919641ad54cd95838190557f1d57b1448d3f12ed0c1d99ec3c87aee758baa34b6cd4b1fd0b24d9941043e4d48290557f2bad3cbd2bcffa95e1f6b3d899e612ebc649df718b415bbc9cc384fa641130cf8390557f4d2f6fe64cc418b6a830848029ead54dacc567eabaec6be4bff927a0643504ee8290557f7f9be984e83d15e1f37a4cdf015fee497c5926b259252052daae88ac925da5238190557f63f9b2c4ed8e733e6cab0886bbc5f3280f2ea3feec7246759523a4e9b85f9e028290557f899afc3be3e49b6d9b8cde61f47fa52a2a7c6a9deff95870a6ee95b91acfd62182905560087fbf73b22224e2b940d433b6e49a26c33eda35bc9de9898b721f755078b29130908190557f1dcc746afe6151a61db003c7381d34546b5d88ab42888b5a6819ac920484a0c38390557f7f2847001ca0e2941bfc18399f04cb63ab194ab6c5f171a6e9418b8904920cb08390557ff9fdebd1382109649f366c1773dd628074c4ddab37576fb79f7ec5df863389b78390557fb51cfc2c358b0451e574c7fd1e12c491d5d1e576088ae18a91b767f528a7383c839055600d7fc6c24c83fb29138ba45b3fe72172bcfd94387fd2b8597eea34403400a769c4a08190557fa06203438d676628a21e4eb0d1a4dfdd6a8af22de1b3180a4d8e06495aad84c58590557f3f7fdb7d6954c86b194e15f25402771aa500b7c5dd96e3f4aad5222521fb04ca83905560077ff761239b9ca487886fb6684ad14cd04785b77f406eb48feb8cff0a1d9256c2e28190557f534a0a861e1425c179a791da241f539917a28ce83c44a4d279e6e0ec3731b2438590557f4d9e648cf9fb40791e889c41eae69971820217dc9ccd908ca8b73c4b397a8b098490557f6a60d6ce9c7dc2b6139a77f010b3d9dfd08a0d3b1c37ed056b62b4b5556f08c08590557fb9164977862ab0e2ea53e20e09685c0594df9804afb4b9eec4fc089b1feff02c8590557f1122736b94e214e89303141ed1ad98bb288986d672bf3e44cdefb82aa2e2566e8590557fdf207845ad318299c2f8580434d2a84cd7a452cbedbcf15017f75fe35eb7f43f8590557feecd9ccb69a643d1ad94cddf821c2207bfa6d158783e146ddf690e1801b097598490557f983d5dfef894da913a2f6d8d9e27a7425091c0e8b51f3c295e498c3d8800003c8590557f81f7f706cbe8d3cf318774bf91c961f7084d8f98f106e0d9d2bc38458f0af7bd8590557f68f405674b2a2486b799bcdea377cedf3f7856d4e7ae90d736e0a74b6627d44a8590557f958420697115b9b1a503aa3a9f94f8a6f1fa7e32a3c65d975bae33aa60b9ef2f8590557f5e1d9e47c6ec305cc9b3ac04fcfeed2de8a3c355f9676fa214a6b789da3d2e108590557f2292d920ad0d83850c6aa8a33c97935e8fd58cf220459e4002e818894369888f8490557f9039e5401c8888fd79b94731fd8b1588e52ce79f6e94c33fa5f7b9722f5141d38590557fc5de862d33973e5559398040afa72739d78e994c1e246f94a617345181dca7488590557f9fbe6ff36b42621601506d2ba4a9c93d0d8d040eac535ce6b049df06d024ddcc8690557ff8ec550ebf3c5d4c1fae5fc0bdb70c5afdc5e07c701e5c4dcf4c023aea95c4b68690557fd7d717a894a3ae90752fe50a63f857abb16d470bf3a514b5c8ae321fb12890bb8590557f37e8792964ef7aaeaad9f3cfb59e618475006d24f407cdefc0afe515a61ff6c18490557f2ef953bf168807d691becd472bae7fbff99d298de785848d11819737f5d9bb6e849055600f7f9e690118d1eef133e73353e6332b48c5dc60710fc35c0c66307d96905e4556ab557fd302b2bb92ddc4a052424fff1ddd903b82613f7bdaa0a5cdd76742f391f3eef88490557f494adc464a67c6706adb7a12293e46f3d852b8229c39e76d987a9ee22f4beb7c85905560057fbce85c78df602988bc06c30ba9ae91b9e65102ae752456f23c1288151438eebe8190557f623897e90230d4520480b8005cd7709217fed6dbb3ea2673bfad0739de9e01528590557fb5fe3c54169c28bf63b4348f7b63c1d6ac59d552706af1e9779fd3d348a457fa8690557ff66311fed9902b65da0ef3b5e439d6ebfa335f6b96932c5829a1527f8e39f2898590557f9dbb11f6d0a2ca09c473a7fe143224b6597c253d0828f7e10157bee0c88271328690557f9a21f5fcf40bed11fbbc7faa22799b634fe9860415c38e01fdaaa27f050a52c3859055600e7fe6a418a6230bf97af9036c2f5cfd1ea47b5ff29f124a9cb06ef464a22738ef16557f6908929ab052a7d5ea371a41ff65c5ef0f653f211b99f058e0a157975416316a8490557f3743b53cd99a4fb33ba82d6738d633fa1d12a557c26e24003ead758362755a5e8690557f4d44442eb896a655b8f687546e431f066252849e832fbe50277056e02675e33e8690557f2cb2e815809818a391c40e44da61179f2ca61c823b6b228e53badb76221605c18690557f4ce2f0f27acc3d851de1451ff3633a46d6fdadedd4bcb7139c7d62ef22c5ea598790557fb374e0a193d5d571d12441eefdc183836bc2077669c85c125a1c45373ad2a7898490557ffd989a05942745d146590395fd94dafd9091966b10fac6258a778d04fac31bed8690557f4ec56d5a6e5b8dd76f74a2f0afa12c8b520cc83118eb2ba1916ea44a8842cb678690557fef97da4a70f3344e192cea9ec7e904692c035a666449a05e669a59fc2089ac2e879055600c7f567e92aa4b4f7282aada0452310737c95e2fb3697592c9f8500ee2c7735c0a9481905560217f42bb1375b8b9be160f3342f47c9a1849cf2e72f53e67d74b1e9918c108cddaea557f598db636eea5b78c32619bca73f3647eeb209c406f858cce2ee5435e4d9d5f9f8790557f6f6d08818f75f1f880dd8a80e766dbb67a26fd0c74e5aa565e1b455fac73a2388990557ffbd198dddaf7637716b477cdeeb8caf8d4d9510d0ca073f96d379f779dc5122283905560197ffb8653386941e8f24c6ebdfb9589857f200c0c2cf18a5665df43a045121461a4557f1ba588ed8d41371ed5b0f890227279c13199c1b957106ed7f88e9751a6cbc5e08790557ff46aaa909711a627cb558415afcb841f979dcc6d4827b83850a3dc4318b1c0358290557f8248e8e93d4565ae977e3570297180df3f66b2d107fa5b60d67e6dfaea8020088790557fd6a6e5c79e2e8bff2560e27521c705f988bb4f482a88a5c41c1ad53fd2548eff8790557f4fbf912022a0a458dd6ec4bb498679038ff874af831b8f0375ec8b78587f67a08790557fd2d4d19cb86937f822d58283a1b029de4e1422e6bc74e01b42f244670041a4d38290557ffb491e70dfa9f8848c00bbb30a04fea2ab28be8dff9b0b912e22f90b62e1f8708790557f92426d17f61121bc31319fe83847899d92100eed53cf2a4a71bde73e740938358590557fd84686f169b303a58c8e2465c6a7231b089a53323476d5df5ca2703ff4fa03d588905560037f392c4fc818a493e4b5ef6501b6f692baf1e135e04028205a70768548e84e2c958190557f08bce55729cd35f58d845d82fd2905cf5a344b3ad3151e2efcd4f87ee658b969889055604f7f0df0f689042d1f9b0d996f3c1d9c5bf788af70041216446bf6a1ea029638178b557fa4f0476527e924fa3faf791baad6ca27e2fb2e41afb044e71e05bb81d84d07338890557f7c71a77a2c6b0bfa33519401ce4860089b12737cb963505222a5e2720a4d7da08890557f6bafe2efe4790a1fff9ef80425eb9aaec0773a4d013ffbd836f8678f61cb78ac8890557f2242a574589726136160ce41f75550c6210f2d8dfeb76bec77951ce9fbd347cd8890557fa3887aac64a12059e0a7d1871715ebbbb76036499b805aaf103973dd9a45527e88905560167f26d5b87fc090bb20a2ef85a98e3a33c610703c352c435cbb43bba828bd7fed6a8190557f332cb4dd9a51b53540714ab77e2a6a6b2f9e38c07b2de29fe836369d9b8e87918d905560457f7bf3d4401c514941885343dc8dba7fb70702093ec2d02fc79b7e6600dc7734018190557f3f7752dde7bd7c3ff59ddf36811c33bf570fd7c8e1bcd1df2c5ed1301cf667888a90557f9de417e588df170149164eed1220b3c9600832ea1263c554d31a0f8a7e3f0c358b90557f11599217a86c80fd9fdf16f1a890d4be75d5b78a816882e6d8d4602cb4935d0c8a9055601a7f9153720110d2a2b1d8f92a4bdd1c8630fd5a8ac456dedcf5574a670660862186557fdd3b46a127acbfce3580ed3a3d2803e655a8892b0f15e8507edadb572f1f30698990557fcf753f5c20cd452fc26916c482dd639949047d8f7f264c8cd9726b39b76197118a90557fb170edad25ea482d603b0981adab6c0a0f644e2e77fd6e7ff662c0b954e49c308b90557f91661d7b4bbacfeb20f605141b2f4ec561950d69c542937ceae6906bce2373a58990557fbbddfa363c6730a2596786ce5a8e3af33a8f8e1fbffed351413a95e79cd700488a90557ffd7ad1c51e45ad7a0835834bc4e976b7b9d8090c5bde5856fbfd188560087de48a90557fbf6f58f269670353a78f922a4f7e08e98d86ea2054e310c2c4a63dc4c12370408a90557fbd11f7dd538b318e1118dc37afb9929d7d032dd8178b09e6dc173ed483cf9b3e8690557facc20977e993adee30670ffd274c989247bbc3881fecff1d10df4fe73558037d8990557f38092230412094223f1358f7aeb59857f64a8edbfc84eea468caca4482ffef8e8990557fc3e2ddc6a0f0ec4d133e9bf7f3a3a4c9d3dc111a43e1d3e9c3342ead59ee45d08990557fc23d1202441445004ec5c9a409cbaa4c9f59783e2642af01a075bd906931e83a8e90557f6d57a96547c15f9b296ff79929befede5e14461fe5af9fb183bfcad24ce7efe68a90557faebe7fc9fb7779f44e0840ca1c8f86bf03cff09a9468288586b347defa6d954d8990557f1e15ad68343b9a0e4ab431acfe374da5b0f6509a8494ae4726783cdcd4285f208390557ff479302bcf6da9d2f3672c2008dd42e10523d94357822302528a123f5d4384e48390557fd24440f2981d092519ff4af272d53fbe11bc427d06ed5249f804d666c54f9b338690557ffe37fd19d30025a11317b4849357c7692e92f4ae69382909ce1a47ec2fd331158a90557f8aaae7faf675800b7f57c461dffe4605bfdbb73d8101f86c4b4bfdb5698f4f138a90557ff0528d0a79a65e6ef3156731d387fb248070c00f47dbb5e086eedd1b3913bf268a90557ffbea711d667daa9cd948aea42ad9df59c73ce772cf1b8e71e2285437f5a12f168390557fd64a49a1fcef771005f65338f6c1d4a6893ec8cc6674b8346b5275feb16b44f58e90557f3ffb72d1a611b0b939acdbcc4f7a86244794d8ad62bc4a63e2babb13c66f49508390557f97b983256a71c3b078ce1be5b7d0a8607d737cc560746106b443ae76ee45e0bd8b90557f54e64607ecb186fc07c1fc5713c7962aa0979c77dc6005371621fcc43640d89c8a90557f945049e250539e60de0f4a8d6899302fc8dd7f4e60589952c2897b37387175f98a90557f11e1523783c0a094f625fa975ef3052e1e9b4ca069fe9e236c8ed9acc6fd6d278a90557fa2f4330f96e009a1d5a0b3b4adc117b690d99d0a414e93e012ca26dab77f8d358e90557f8856937914f3ef940f9c7bdbb46f816c62a91158e971e7fa3993fcc1f289d51f8a90557fafb8127c28ecc36bd41cbd56496bbfe55f1e835228c5d75278852008faa704f28990557fbcab8dc6199baaedf76bca3e9516fcc665fa5f403785096cad1631335a261f6b8e90557fbf2fee86d6f19e5df3197f633977ada1d810cfe8aeec8d019e9d86f65c9976a78a90557f52418fcf95159b576c8ecb79711d721acd707f2f55afa8bdafdff464512ad1728e90557fa9d4d0646bc28b75b94f9b3d53ac30a2e3037c5c28949e7e766dbb455c5d1f498490557fc11fa8617c11cdca0ad25b56b77ca923466d18c8708325f5b2a1e15b4e05a5518a90557fdacf51cda107388f18c0bc1831b8829bf5a3752b6eb6c0d8154166049a08c5f08a90557fff4c05217f7abde99eb8ef26c819b39426681579c576c63f09c6f713be166db78690557ff684483582dc28ed2c5c2749b28a0e5ddf26e6cfd431a19036ef17725c201e4d899055600a7fd715b359489329e5dd5a1f6cd8aa58fe8fdcf1347d738169e522ebfa1ab037298190557fcc54c16e5ec18b2b4f11c9519c7c8f7b62ac91a85e53fdb321e64612f0ebd0d28f90557f51e5ec0284216e653b682c48857752fa5b7ce39d1885a7dfa28d5e657dc4deef84905560517f5ab590ef0d640abe4c07a6e3a20cc7e6e9feb7280ba53ce46b98fe26c52a0f2955601e7f4df24cd1edcb21916e7d7887d8eebbcad6ab9218b4899edcf6d543719eb07829557f07d375f09495d0665244d8bcdf94d3421fae904c0c527fff86945e80f20023f28d90557f05768c5fb6ceefcab40c56d0afbd740868f69d63649bed4a388e125d7334b84b55602a7fe0ba959791d8a0bbe16759d4459752b6acf948cdc952607fdb450fcfd16d892f8190557f1ed5dc6eebf78e257d46aa4a374ed50f7261a51415a1514dd4c15d8bd2e2879c8b90557f81a39119f07e4f41c0b90df2fd843394c1c6d8764417701113ed397e1e00c1038b90557fddf6aabf4cdb0242cec4fe744024cf5fd8926d379ff35ca95430648c91aef9668490557fcdbbf2d1096e7f7e0906e7517319e23f4ed9a99e3d29840fac8cb2ea10ac2f1d8b90557fc18a5a9440a22f1849e76b7362b206e71fb70bb34c815d0e51dfe84ceaf814ae8b90557fa4d1df62229fb683ccb93eb7958e1b76ad6e5828ebe685b4bdfcacde521b70548f90557f81845f375bc64c5e4699ad9d23dff5b316ffd45611a7583923c96a481d2454268790557ffd12cbe9a2572344f228efed64fe327f90a0d2de1a66a7e179912e029161b73f8c90557fd59f103526836e1fef9f1c9776606c30332fad28de7050b10eb12100ef8c8f828d90557f2ac08fec63de7f50f75de027a3f86b535ed9e81b1ba9620b787e3a0e6dfbb1a18f90557f42ae5fc12fe9ad154aa6d6bb261dc5114e7b7cab5eeac019d1a7b85c6f66d9768c90557f3a19419bbcea92a037b37e4e68bdfa4ffe84d916b5bce8569499c1233c3563bf8d90557f6351328b6c7c0d25add26c0339bb8b4fa04bb3ed22df47aac2f0fed5ba48dd1e8b9055604a7f7e114584da53782491015c2a738dbb916b6c532feff50da5a86e10a6fdb02957557fa78d603a8b0506b73b61dc4ff157c6bc85d22a1d9752c65b27e30f1c452519338f90557f38f64224f6deb00bbb8b69be11c258c869ffb68f5e378f7edfe33411eb806a4d8b90557f0ea7b10beff62ff9504ea46a426af00e24dc097a7c5b42dd2cb04e999d51b45e8990557f8c6d3e27d09a7a5a543abbab83916e96e435380d3850373160c861088df52c298b90557f62f3658b3f3063621b9b308f6a38a08ad1855d7788dc70fc85d2397c1eab1de48b90557ffcb749f0b35a8c172b14b198a1ab8eb932dec4aedd8d05fc34094bf3f89bdd248b90557fe538935c19c4d21066143e06db673b73cf42e6f473473f2609e80e341d39af678490557f23943853bc21f56152fa24ca90232d1f7002f059bf07986b0cd836991660e7f58b90557ff106b9aa040244a212f8cf3d50b0e9a5a2f7f3a2fefe94ace73fcde9a7f235e08c90557fda821a6fa9d35f6bef2016481c05b8753b18a997a78beafca1e97a6853ff9e2e8b90557f14a34569fed6d7880cec1fcc0cccfd4a734e396760b834bb8f6a049977635c7e8b90557f4332e99d343f57c0386a21fb6aaaa09b90fc9801c863e9c4c0d9d00ecabdd2418790557f5e586ba7d402bf04a2b5ce07b60026f1eaea06f2a42d9de7d0bce1a1d626f9d48b90557f0e21235454599ccc3fa817cf84c4d5582ced555a99623c01ad80e21781f14dfe979097557f8a0365da1fcc67b4f8cf39ac7ccb62083a6d15dfc5d8402cf11a2256e9b75fcf8a90557f559cd7dab315a6bcd94a68abd8b6aef8861790319d3d17fe8ae00d65adfe73da8a90557f178238227c9417faa7a56e7f2a38e910de6ab3a8b278e4f7e9c69a74031cf4648e9055601f7f95afe8c3481dd0e32157aa1c120c97146933f043eecefbfeac0ff021777fd703557f39eb7a35fdbe6dbef08c886f45db3ec141b21423113f0b5a2917835b495a81958390557facf9dbc181849ddaf9de7730fca05a888ff33329680f9b622eef59fd5b9af74c8b90557fea67112202c8fc00208f3758b7e65956e477b3ac747dcc773c18f0cc1a996af78e90557f4271c60be6696e9b70f9feb780431560133bcbe4ee3ab8eb1021bf9a7fa47db08390557f9b13043a6ba919c3f6860d9d39cb629b8b194c8b160792f02db82238419ab7408a90557f44bba8584c8e310809ec9751b7b9213c4be392f9a9536cad7ac9105d9669d9118c90557f39cb9443ce903e1a5c4d6b6b4c961e41444e50665024e95c859da2601b835fd58a90557fc28dc8c9bef738ad15958e5744f8824df536c6300720d9f94a2f4216c99becf58890557f97a81d80379ab8bcd17fd9168a85dced33365e65bc3ca99c4979adae8fbb29ce8a90557f80955db7443f060eb170b8577095b1bac6893cae475f9e5607374e58e46ee10f8c90557f55d7024cee2c2db1c23f40f9c6c358395d81cfa0089378dade89117bed7ccc6c8a90557fde7989be338dda3183ef78a377a5570bbd98ba74a1edba9d0fe9b56ba97d07068890557ff868aa7db6decb515d9cb541a5c54e3fce82df9106d12e9e42ee251a1773efb08b90557f61b4d4f142e2c5e177ee82fc5add05d690ae10b29b7459f04724842d8617e4368a905560287f8670cdcb4d6c250c2e99542cd8f0a9b5fb90a903a30704efb751e1511f8ca5218190557f7f678374a694e7cba1b98a1b95f514000ed50162795133e0e002556a4c2750ea8b90557f95471e42dd56bf38f6ae4bd5b7c29afa949126a76072a7c7c37584298ea80a208a90557ff7a44d13c037c3a9f24e8c573cbbe738ed37c264b20c7b7a14cc1fef2e0218cd8a90557f81a156b8cf9cc427f381c919d860aae94cb97e5d39322977c23ac8949d62e0468d90557f6c11acb5cbb6582fc2eec8f91196b951a7a8333989f16b5546b45c2ef2e752828a90557f2c269ad939e91cdfabea7d938b56bdcca10146950ff6f94474eba7e7afd9fbb88590557f523faed4f844e52cea3e58c4c6e3c7af4f6799e41f5c34b47bc1f81f227297818a90557fc2f2b5d84250ff68ad1fd2caa270e122f37c13953c112da1d12997d520b1bda18590557fc35be10e24cf2453d1f807793596932f424160c7cbee19d2729459f23ab19a3a8b90557f0a8ba9d8ba5ec754b198ed0ea337e32ed38fee6f26ccec5b04b1cf949ee0e78f8b90557f9fddc1343c81bb47ef024e062a50fd6cba57182225aa2b09762f1b90127c32df8f90557fe3150f68daba1034f6b7a6d25f585ff7f93c6ad55d02f7e973b9c3f9ad89ed2b8b90557f7935b41a1027f13bf314cd361014492f6b0826fd47d402fbe54541b1664c1e3f8a90557f3fe09038e509f612fd229e3a8d529abd70ae648aef88d51b9d7e380d56d6c8178c90557f858a55b54755265bac3a6ac0e1abcef44b2651be3bb8903157d2c6c1b8fd71978a90557f6f897f702eb89aa1d123fef4b0d456f9f8d8c0869af441fa017908f6a7bd4c488790557feb14d4d08893515c635b34f0331c4a1db158240d447f4fec9fbdc108b9d63ed88a9055601b7fdd98217ef5766b74f0db845cc366b2de11a228b674c0d122a575cc15c30c442d557f045164d84047551ee1e53d92520e5ae22282f47d69d391eb90c8ca7eeb418d448b90557fa62acf95815a60bde022950197b3853bf037c674f5c591ca00517cec1c0d86308a90557fb34fc5df34d8c5780e2ba5a654932bde6b39f3548c0d95afc45c11cf18b978108a90557f844df2b0335d466fd54238e38decaa560c4076e5614de57586f3125690df8bad8f90557f030e761d73ca0fdf0310c932b31d1e5751307ca32aea8852e0d0230a7291c1788c90557f0cb8054baba856fdbbccbadbd8cd7b1b0647df295d4882604be085305b6baf218f90557fb369bdaf82ff3caed718981e0a25fc73843040015101c13f146fbcdde29c95b68a90557f5c4a0058a79c8239b6993e083b97bb9960a68c2062e210bdbe77f4adf74b93c08a90557fcaa1875ef44432478953bff0b97453be34bb1b8303a5bbd769f3a724a7d1d7be8390557fd2eb0b1d60fe51f42ac6f207be22cb0a1aa387271ada54046211b1a93d1e8ff88690557f5e320afea9da0dfddac06fab6e9923f1310995df681ab7deb589bea7ec1d5d478e90557fe23f91615bcb6fbd2ae5d32fcd3ae3ee679ba51c675085b3b59d2c3cb67090d38790557fd4dbd9ef19f0729d7f617b0664b5518edeb1f75303563a78b4dd2a1aeba7e2398b90557fc2bddb05f16c4eabcc76208dbcb9125e55f184ba8e1bfb515a12011fc99d64b28b90557f23c18c477df4cd8ad93828ce005affc295cf5a3722fd67a4cd68bcc53b6b96cb8a90557f7be3921b191bef5412654fad2f977fb5400854f6dd63130b482591026198fbbc8b90557f589fb34bc835e92a7951f3307f372610aa2c429f485671952a81ac2a003a7d048b90557fd3b80c12090db4c291ba55f1b29b98f5957b375dec4b7334c39a8d15f7b9c8fe8490557f68d0bf03665ed321acb30f4e7c114bf56267c0403b2d62664cdc310729dc54888b905560267fd4a482457fd9dd933eed8e2ec84fc99fa5e6389199858927d305a8f2cf1add68557f729c7be3576e9be42b0be3f54e12d539765ad160c48b01ae45cb99bb3b573b0c8d90557f153ac8e40ff4d34ced1778eeaec8c28de9450e29561904a7a7f0095fd21558788a90557fbecb066be6291f6fbbe244f9bdc292fe7b1466cb6bdd657c613e3d2d009c6d978490557fa33520c9869d1ec7e8234dc6371802c5725d48cdd788ef4b77badb0740c1f5788b90557f1d8fa3350d0d7aa4a0866a00d5ada86aba2e7accab307d7c9cfdf983834827ca8b90557fd9c13efb558f84167eb03f59d90c755854a684ed52e76a995a6644dcf6097ce18a90557f515d1da4079e5c00a5cc513ba60443aefe22a6ae839889b1b8f16c681cdab6578f90557fe92f8ba0218b7d3b5f70f5df76363f4b44b42c6c50ca5f33a3d54890d7756f358d90557f614b638d6115f2fdd67ece59803e72edea5c1d5e617bceb1f79493e17d0070298b90557f5150bae5ab301c9e9fdf4ea6b0b10d46b5adb2748c04171a67125e8e5de49b6c8b90557f535f6b78137233cf081f2f395a13ca0371af2dfabca93f5cd5c12895d76d352c8290557f581c4e71cdfab9da075e2ea81c2bfef458c3af9e23a5fefcf913a15f2c41f3e28b90557f6cb981071bb39a61ff7c99e26abd555e2009035f53620bc2ed155b129b82e62e8d90557f1a788fe948c6b6b22ec1a4ec397a9490968cd1f9081a85b4c530f926e8095f498b905560177f87e60d091e59c4ff87b3c87d97a887fe5009d8df6746c10c915e87de586679098190557f56fd5ba98aa9fbd6e4687d0fe4bf19697d1e1f855235fcb49fbfc13213d794788e90557f0bb2ff9e86bc28d27c6310ac64ed8a5224d0574a635094d2f588b5d4853a0fba939093557f2d5ef52d7ee915a8ed108000858997f0dbe7ad081f3f747b51a12d95003283ef8a90557fc63be3507cad5f4a884229823eac13ca3536230762e5019a8d58df2e8b959e628c90557ff77e65b0bff32ec854f203baed648f4aba3be28395a1e4cec0efb6c8342930d38990557ffb7fa0e20077b8f47f99afefdb2716e19536decde0afd588b4bfee59fe5a705b8b90557f7b688528b75a999f44149f5cbf517168ca91359ba97de496947242e8b6a0ca048b905560477f1cff7bbd09a7ab2e803f33b6ccc0b7b3446f98312f63ad965dec420fd1ba03148190557fff1df58c425ee59b79e4107b9388ed9d60d429ed48bfbe7de82c6dbdf42425ee8c90557f1619e0042c324d845ea6d104e94c1df23fd8fdf60941c9a39ac599982e9690ef8c90557fd054bd2d7af76ffdaf8621edbeafadff0f9fd2f5698200532cf84dfcbfe02677919091557f6665977707594b99997cffb03e4a07137eec3325c8eebfe4470a82151dbb4faa8c90557fdd33c56fe9737755d30c49ebe942116b76351d04407e1ad1ac3d53293e2a8ceb8b90557f8f1ef43170539779d9bc37413b802a4599433d561b19c4d5edd9138319a4f6088f90557f9074b4f24e9cc3e16f15cac0b6598e34a1259b94c75803ab753416c5d8cf3a0d8b90557fa90ab2f6739f69e4b0e731c04338765b1634e2737601c12ad82ca4d8735f6ac78b90557f882808eadd54a86dd1f458b893a2cac72e1f701dcdd4cfc4e2bee8340231d8f08b90557f2bf9a3626a398a336984f480cb59622284630266e18313055fc59e939ecdd9a68a90557fadbefbfa68755f361a3fdd5f202944c797486695c31a6bc4df5182eecc6733e08b90557fe0bce01657fa1e6159a7e13e6d27d043212fca655f5968644ec66a60786fecad8590557f1f0200056bbc6472c5f400205d25294b525b1821dc7057a7b54206335af958578b90557f0f317775ce216da5c8482593df35476aec4f76585fe33ba72bb160d53ab893698b90557f545951495d385250a9e873e5799031fc501a043556d4dc2a0d21f021339503e08a90557f3920d77517c9701fb697ab2242dd30fe3b927d175f59d4818d19dd98d70925de8b90557fb2dc0a96c2e52ff0df0cc5e7d4e211bc8fc7cc401eb75fd95bb7df6e628a6a478c90557f0fb401a2a22e1ea019a6ed47ba03841b2820f319a24f9a1defa8bd35a26bec218b90557f70e1e9514f62e9af878664fc6f3ea2f03ce66be61ed8a4ae993e8df43d8ab43c959095557f6b470848052b17db40a2ee38fb2662d272f24aea64a5e8a114aed78d69722a048a90557f3924e33a2bec6d9f61b462c60d7fbd6c7fe64bce822c727efd710f65356709118990557ff54a7bcfc718a807f3cc44bedba1143e5601617e6c6402240125aec387d994bd8a90557f85199cded01c91a24c4e14e4dc80ee6a3139e86ba65a0c741bcd9591c0ac2f1d979097557f9d8cd5a1b1b00be14129741af52b683f205d0e466925818a3c3ba660ae58fbc4969096557fdd3b5c7bd6a0820aa1b2f32b7a60dded7b9b093fcea8f83e38a13a0f0e24d5808890557fa4d41a9ce06cf8f89ac47edd2f1b4f99aaf657085a3bff9c4ffc0f81f85bb30e8190557f5f7400f80372699b2238c420a17b38fc268351d3d15333ac9c49078e110f190f8990557fa914354ad2195ef7af16d6774cc237b64149ac975a98ed8c2f21175d76974dfb8990557ff155e4ad87a7ed2bcdd56dd8549a1ac75e8b8c04cd2ce9aeaa0d56e47b574a0a8990557f9c56a2b08f0f3827ddc4ce1cd0437b64b7314bc2fcc689114aad725576945d258890557ff2b39bf7b41d995df12dd861fcdeb9c5b5c697879e6278ce78f0f8165c2263008990557f0d309e58029527e2e3a1f833253c515647b61be298edeb0d2960f0c2dc7cf7348990557f53aa8ba635b65ea32bbd200723fc81c229688b358d33a1dd0e636ce061a129728890557f077bf0917340ac9ef16cdb13be2affc3e7c21f0316e7c00463c251eb0e008f9f8490557fdad974a38b06118c0b78b99700e19b47b72f73693593e9acb03a051eddd07cd58890557f0a277ac56a0461f75d555ca3d0d0cb09a15c977de3b492d034c7b78b64116d789b909b5560157f8a9dcc8b93b3af1ed867bc5319bd4ec95389ec9e0cca042468c2fe3c90a23f67557fb165b69521413878f6ed59624e833d013f18ab4d9b6834e698b6830aad14ccc78390557fa0b458ea7de6635adcda379153f9e26b8e19536eda880406d2194571d3f5b99a8790557fb7cb328ed0cd59cee254f406c1531e7f0d467a18255b9de3e5d20f7120fada148690557f0eecd1b27848076e2834819cc05b64074de5c3ea8a5c2f24068fe4bda26b9ce88890557f5cabb0f562185ee18b3757ee6c522860b15171fa2436d3cde4171570233d941a8890557f9e27afd2062087764e6c3a7efee18f749ef214b05ec1a65f43595c6ed849f51a8790557f360868193aedc65bf6a13540bbd5fda792b32d94994a820e4a3253e12d0d4d118790557f68dfd2a9193de3bda93d63a04327eca3622c222e07f9170cd8a16b8d7661cac98790557f1592d3d90fe68c955975abc5197d2f8c1343ed777abfc1f66ccd8abf2a477a4c939093557f969613b1453ed3304dd55c3626fe8efc8ad26b324c039eb16620fa8ecd9899f08690557fa94c8cf0312fd1faadf6a8bc74acd5799ec1e2b76d8b2b9542b6973c992dfafa999099557f919b7ac2978afb7132dc0ba13697e029e397cadfc5b53920fc9f6351968edf748590557f57e3ae052473c931d2e9977265bc492b38d237ad0c7893a58ddc6b843911ddba8690557f07dd9bf099c02a44cef5e0ce82a8ec96cc3bdc29683562aa798f76cd99a46eb1929092557fcf46f160b0885d65ebfa587456ee433bf9fe3e1b380e1393ad4262b0f2c23e718490557fb4c12693ab5230f3c3b2fd07383ca639bbf7a41a7509436abc2a38564b89a20f979097557fc7fe5b31a849b0406e313110de9710945b260e19373d259ef93179a1bb64ec448390557fa7d9394a751b01024fa32f4266632867ffd1d3f876fdb523e363823ef196c0af959095557f8cbc53fc224a9c7366365978ea1ecf5eb23bcc6ec75ff5f2aed38fe98af8348a8290557fd44521eefef17cfa5727546e4fef5011b74a005775862ca4ae5a64c8f44900778290557f7131e733c7ee6370f929081cb4375e01ba6d1e6aede829c5d1a91fed48544b318390557f9f508d182b4bc143de8b39c9d0a4c0c4ad41c4903ce031703d3a2fbe48804e7e8290557f1bc504613c7033f357bd53cc26415b1fa0f95b87ee0b47de82ab538983ccfdb68590557fd72a059ba58d3ae0473d39a42534fa1d21bbf4ae1159cb0c5e4bf3f0a1bb7b368290557f8880fe462efed42af68e816ebef69eaaf55964bb2e0090c6b21ebe14531f76ce83905560417fe73854925a894c0fb8528b5d922aabc6f4f22f6aa49dc10ec007e5f8a88582e1557f8d07bbd9d5c0c71609037e3794c66faee3f940052f6002dccb7029b4c5a2b88e8290557fe9de8be759d33bbf6ab80498a7ffb0c40fd017251e3934a4cd41856ee8ce1dcf8190557fefd39d621c2eb96d36637fb0204341eb283e551605a9b70d20b1d29bbe93bf648290557f91eaeae99555a15e7f70b88e5f4502ad20a3404c3e7fd6fad294866a1c813abd8290557f3f5c8dc2b0ac09fe1f7627016db05dbbf50c9d292406aa01fd940275fdb7e17b8290557fd264a3467fc1c5e932992113ede4c39bf052d18e149dbcc669d9201311bcf47c8290557fce246bc264dc8409203f7cfb6211ac4bab220bb448a0c2be9cc9a458de5be4f08190557fde48c512d9ff775f69431b220bacd213bd3c66daa0ecd13242c2c07c229483d1949094557fbd6755b800f724e3ac5dffff45ad217e6cfa753af05f474fa82371d994d9cdaf8190557fb9129ad3185f2fc35bcc0c42529f07811f51dee27ae9b6933ef114df0a3389b18190557fd93094e0a6c955b8d5dbeaf52ef29bfd672951607edadb479d6f542f12caa3268490557f7c37a179bc15c19674a3459db83dbec1a0f44f164902f16cf82bdf0739dc4c428190557f508798b39b0664cdb3d04f2166d635110a779f038228174686687b0c397059538190557fd1b33cc040244ee42dd7ae7ef0c477f584f6449e2c9cb53bfbffe3fafcb4013f949094557ff424798e7b85bf890dabb2cd7c9deaf1ef95f7fe21077e6ccfb4bee8ca534a858190557ffd78289c3eeb0a36ada5364afcb127b5cddf078038a62cd46d73fce2f7fa4755929092557f264b915482263f90b99593052d908e64e89a096059bb6577958cb17d02347b1f8390557f6f3970c7551071d8747b589a2d219931a4c1e8b9efe564d4cc1dace93b3d905c557f383617ee728a4cb8fa235e54a2a7a926ad09565f5e016920717c4c9df97c6dba557f0c15bb7635d60e9a38cf074771e0c36fb9ee9441758bc1b1cd55c71534c0bc0681905560467fa72f9708621a63aecc88dbfca147f618ff08b68b852e8801682cd77f3792f8bb5573fece31d9ed6b02f774eb559c503f75fc9b0bce4e6000527f8437395be05316e88a963e176510990dea61d62f3151cee6084f0a8457d0f1e5556200306e565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462002f819062003019565b90600052602060002090601f01602090048101928262002fa5576000855562002ff0565b82601f1062002fc057805160ff191683800117855562002ff0565b8280016001018555821562002ff0579182015b8281111562002ff057825182559160200191906001019062002fd3565b5062002ffe92915062003002565b5090565b5b8082111562002ffe576000815560010162003003565b600181811c908216806200302e57607f821691505b60208210810362003068577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b612b43806200307e6000396000f3fe60806040526004361061025c5760003560e01c8063715018a611610144578063b88d4fde116100b6578063d9a85b3f1161007a578063d9a85b3f14610726578063e6d37b8814610747578063e8a3d4851461075a578063e985e9c51461076f578063f11157eb1461078f578063f2fde38b146107af57600080fd5b8063b88d4fde14610678578063bcc9ca5b14610698578063c23dc68f146106b9578063c439ba44146106e6578063c87b56dd1461070657600080fd5b806395d89b411161010857806395d89b41146105b8578063974dc179146105cd57806399a2557a14610602578063a035b1fe14610622578063a22cb46514610638578063ad8c1f821461065857600080fd5b8063715018a6146105185780637cb647591461052d5780638462151c1461054d5780638da5cb5b1461057a5780639116950c1461059857600080fd5b80632cfac6ec116101dd5780634302823e116101a15780634302823e146104545780635bbb21771461046a5780635c975abb146104975780636352211e146104b85780636387f804146104d857806370a08231146104f857600080fd5b80632cfac6ec146103d35780632eb4a7ab146103e95780632fbba115146103ff5780633ccfd60b1461041f57806342842e0e1461043457600080fd5b806314d005791161022457806314d005791461033657806316c38b3c1461035657806318160ddd146103765780631b18e0cf1461039357806323b872dd146103b357600080fd5b806301ffc9a714610261578063047fc9aa1461029657806306fdde03146102ba578063081812fc146102dc578063095ea7b314610314575b600080fd5b34801561026d57600080fd5b5061028161027c366004612306565b6107cf565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ac600b5481565b60405190815260200161028d565b3480156102c657600080fd5b506102cf610821565b60405161028d919061237b565b3480156102e857600080fd5b506102fc6102f736600461238e565b6108b3565b6040516001600160a01b03909116815260200161028d565b34801561032057600080fd5b5061033461032f3660046123c3565b6108f7565b005b34801561034257600080fd5b506103346103513660046123fd565b6109c9565b34801561036257600080fd5b506103346103713660046123fd565b610a1a565b34801561038257600080fd5b5060015460005403600019016102ac565b34801561039f57600080fd5b506103346103ae366004612418565b610a62565b3480156103bf57600080fd5b506103346103ce36600461248a565b610a9d565b3480156103df57600080fd5b506102ac600c5481565b3480156103f557600080fd5b506102ac600f5481565b34801561040b57600080fd5b5061033461041a36600461238e565b610aa8565b34801561042b57600080fd5b50610334610b94565b34801561044057600080fd5b5061033461044f36600461248a565b610c68565b34801561046057600080fd5b506102ac600d5481565b34801561047657600080fd5b5061048a61048536600461250d565b610c83565b60405161028d91906125b3565b3480156104a357600080fd5b50600a5461028190600160a01b900460ff1681565b3480156104c457600080fd5b506102fc6104d336600461238e565b610d4a565b3480156104e457600080fd5b506103346104f33660046123fd565b610d55565b34801561050457600080fd5b506102ac61051336600461261e565b610d9d565b34801561052457600080fd5b50610334610dec565b34801561053957600080fd5b5061033461054836600461238e565b610e22565b34801561055957600080fd5b5061056d61056836600461261e565b610e51565b60405161028d9190612639565b34801561058657600080fd5b506008546001600160a01b03166102fc565b3480156105a457600080fd5b506103346105b3366004612418565b610f53565b3480156105c457600080fd5b506102cf610f89565b3480156105d957600080fd5b506105ed6105e836600461238e565b610f98565b6040805192835260208301919091520161028d565b34801561060e57600080fd5b5061056d61061d366004612671565b611034565b34801561062e57600080fd5b506102ac600e5481565b34801561064457600080fd5b506103346106533660046126a4565b6111bc565b34801561066457600080fd5b50600a546102fc906001600160a01b031681565b34801561068457600080fd5b506103346106933660046126d7565b611251565b3480156106a457600080fd5b50600a5461028190600160b01b900460ff1681565b3480156106c557600080fd5b506106d96106d436600461238e565b61129b565b60405161028d9190612797565b3480156106f257600080fd5b506105ed61070136600461261e565b611310565b34801561071257600080fd5b506102cf61072136600461238e565b6113cf565b34801561073257600080fd5b50600a5461028190600160a81b900460ff1681565b6103346107553660046127cd565b611452565b34801561076657600080fd5b506102cf6116a8565b34801561077b57600080fd5b5061028161078a366004612850565b6116b7565b34801561079b57600080fd5b506103346107aa36600461261e565b6116e5565b3480156107bb57600080fd5b506103346107ca36600461261e565b611731565b60006301ffc9a760e01b6001600160e01b03198316148061080057506380ac58cd60e01b6001600160e01b03198316145b8061081b5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546108309061287a565b80601f016020809104026020016040519081016040528092919081815260200182805461085c9061287a565b80156108a95780601f1061087e576101008083540402835291602001916108a9565b820191906000526020600020905b81548152906001019060200180831161088c57829003601f168201915b5050505050905090565b60006108be826117cc565b6108db576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061090282611801565b9050806001600160a01b0316836001600160a01b0316036109365760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461096d5761095081336116b7565b61096d576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146109fc5760405162461bcd60e51b81526004016109f3906128b4565b60405180910390fd5b600a8054911515600160a81b0260ff60a81b19909216919091179055565b6008546001600160a01b03163314610a445760405162461bcd60e51b81526004016109f3906128b4565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b6008546001600160a01b03163314610a8c5760405162461bcd60e51b81526004016109f3906128b4565b610a9860118383612257565b505050565b610a98838383611870565b6008546001600160a01b03163314610ad25760405162461bcd60e51b81526004016109f3906128b4565b600260095403610af45760405162461bcd60e51b81526004016109f3906128e9565b6002600955600b54819081610b0c6000546000190190565b610b169190612936565b1115610b345760405162461bcd60e51b81526004016109f39061294e565b600c5433600090815260126020526040902054610b52908490612936565b1115610b5d57600080fd5b610b673383611a17565b3360009081526012602052604081208054849290610b86908490612936565b909155505060016009555050565b6008546001600160a01b03163314610bbe5760405162461bcd60e51b81526004016109f3906128b4565b600260095403610be05760405162461bcd60e51b81526004016109f3906128e9565b60026009556000610bf96008546001600160a01b031690565b6001600160a01b0316306001600160a01b03163160405160006040518083038185875af1925050503d8060008114610c4d576040519150601f19603f3d011682016040523d82523d6000602084013e610c52565b606091505b5050905080610c6057600080fd5b506001600955565b610a9883838360405180602001604052806000815250611251565b805160609060008167ffffffffffffffff811115610ca357610ca36124c6565b604051908082528060200260200182016040528015610cee57816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610cc15790505b50905060005b828114610d4257610d1d858281518110610d1057610d1061298f565b602002602001015161129b565b828281518110610d2f57610d2f61298f565b6020908102919091010152600101610cf4565b509392505050565b600061081b82611801565b6008546001600160a01b03163314610d7f5760405162461bcd60e51b81526004016109f3906128b4565b600a8054911515600160b01b0260ff60b01b19909216919091179055565b60006001600160a01b038216610dc6576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610e165760405162461bcd60e51b81526004016109f3906128b4565b610e206000611a35565b565b6008546001600160a01b03163314610e4c5760405162461bcd60e51b81526004016109f3906128b4565b600f55565b60606000806000610e6185610d9d565b905060008167ffffffffffffffff811115610e7e57610e7e6124c6565b604051908082528060200260200182016040528015610ea7578160200160208202803683370190505b509050610ecd604080516060810182526000808252602082018190529181019190915290565b60015b838614610f4757610ee081611a87565b91508160400151610f3f5781516001600160a01b031615610f0057815194505b876001600160a01b0316856001600160a01b031603610f3f5780838780600101985081518110610f3257610f3261298f565b6020026020010181815250505b600101610ed0565b50909695505050505050565b6008546001600160a01b03163314610f7d5760405162461bcd60e51b81526004016109f3906128b4565b610a9860108383612257565b6060600380546108309061287a565b60008082600003610fae57506000928392509050565b82600103610fc25750600092600592509050565b600a831015610fe057610fd66002846129a5565b9360059350915050565b6014831015610ffe57610ff46002846129a5565b93600a9350915050565b60288310156110135750600a92601492509050565b60458310156110285750601492602892509050565b50602392604592509050565b606081831061105657604051631960ccad60e11b815260040160405180910390fd5b60008061106260005490565b9050600185101561107257600194505b8084111561107e578093505b600061108987610d9d565b9050848610156110a857858503818110156110a2578091505b506110ac565b5060005b60008167ffffffffffffffff8111156110c7576110c76124c6565b6040519080825280602002602001820160405280156110f0578160200160208202803683370190505b509050816000036111065793506111b592505050565b60006111118861129b565b905060008160400151611122575080515b885b8881141580156111345750848714155b156111a95761114281611a87565b925082604001516111a15782516001600160a01b03161561116257825191505b8a6001600160a01b0316826001600160a01b0316036111a157808488806001019950815181106111945761119461298f565b6020026020010181815250505b600101611124565b50505092835250909150505b9392505050565b336001600160a01b038316036111e55760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61125c848484611870565b6001600160a01b0383163b156112955761127884848484611abc565b611295576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b604080516060808201835260008083526020808401829052838501829052845192830185528183528201819052928101929092529060018310806112e157506000548310155b156112ec5792915050565b6112f583611a87565b90508060400151156113075792915050565b6111b583611ba7565b6001600160a01b0381166000908152601460205260408120548190600110156113a9576001600160a01b03831660009081526014602052604090205461135590610f98565b6001600160a01b038516600090815260136020526040902054919350915061137d90836129c7565b6001600160a01b0384166000908152601260205260409020546113a090836129c7565b91509150915091565b6001600160a01b038316600090815260126020526040812054600d546113a091906129c7565b60606113da826117cc565b6113f757604051630a14c4b560e41b815260040160405180910390fd5b6000611401611bd5565b9050805160000361142157604051806020016040528060008152506111b5565b8061142b84611be4565b60405160200161143c9291906129de565b6040516020818303038152906040529392505050565b600a54600160a01b900460ff16156114a55760405162461bcd60e51b815260206004820152601660248201527526b4b73a34b7339034b9903737ba1030b1ba34bb329760511b60448201526064016109f3565b6002600954036114c75760405162461bcd60e51b81526004016109f3906128e9565b60026009556114d68385612936565b600b54816114e76000546000190190565b6114f19190612936565b111561150f5760405162461bcd60e51b81526004016109f39061294e565b600061151b8587612936565b116115685760405162461bcd60e51b815260206004820152601960248201527f4e6f20706f696e74206d696e74696e67206e6f7468696e672e0000000000000060448201526064016109f3565b336000908152601460205260409020541561159e573360008181526014602052604090205461159991878734611c33565b61169c565b600085116115ee5760405162461bcd60e51b815260206004820152601b60248201527f4e6f20706f696e74206d696e74696e67206e6f20666c756666732e000000000060448201526064016109f3565b600a546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165b9190612a1d565b905080156116745761166e338734611dfd565b5061169c565b61167f338585611f4d565b1561168f5761166e338734611dfd565b61169a338734611fcd565b505b50506001600955505050565b6060601080546108309061287a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b0316331461170f5760405162461bcd60e51b81526004016109f3906128b4565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b0316331461175b5760405162461bcd60e51b81526004016109f3906128b4565b6001600160a01b0381166117c05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109f3565b6117c981611a35565b50565b6000816001111580156117e0575060005482105b801561081b575050600090815260046020526040902054600160e01b161590565b60008180600111611857576000548110156118575760008181526004602052604081205490600160e01b82169003611855575b806000036111b5575060001901600081815260046020526040902054611834565b505b604051636f96cda160e11b815260040160405180910390fd5b600061187b82611801565b9050836001600160a01b0316816001600160a01b0316146118ae5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806118cc57506118cc85336116b7565b806118e75750336118dc846108b3565b6001600160a01b0316145b90508061190757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661192e57604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b87178117909155831690036119cf576001830160008181526004602052604081205490036119cd5760005481146119cd5760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b611a31828260405180602001604052806000815250612026565b5050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516060810182526000808252602082018190529181019190915260008281526004602052604090205461081b9061219a565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611af1903390899088908890600401612a36565b6020604051808303816000875af1925050508015611b2c575060408051601f3d908101601f19168201909252611b2991810190612a73565b60015b611b8a573d808015611b5a576040519150601f19603f3d011682016040523d82523d6000602084013e611b5f565b606091505b508051600003611b82576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b604080516060810182526000808252602082018190529181019190915261081b611bd083611801565b61219a565b6060601180546108309061287a565b604080516080810191829052607f0190826030600a8206018353600a90045b8015611c2157600183039250600a81066030018353600a9004611c03565b50819003601f19909101908152919050565b828180600e5483611c449190612a90565b1115611c625760405162461bcd60e51b81526004016109f390612aaf565b600080611c6e89610f98565b6001600160a01b038a1660009081526013602052604090205491935091508290611c989088612936565b1115611cf45760405162461bcd60e51b815260206004820152602560248201527f596f752063616e6e6f74206d696e742074686973206d616e792066726565206d60448201526434b73a399760d91b60648201526084016109f3565b6001600160a01b0388166000908152601260205260409020548190611d19888a612936565b611d239190612936565b1115611d7b5760405162461bcd60e51b815260206004820152602160248201527f596f752063616e6e6f74206d696e742074686973206d616e7920666c756666736044820152601760f91b60648201526084016109f3565b611d8e88611d89888a612936565b611a17565b611d988688612936565b6001600160a01b03891660009081526012602052604081208054909190611dc0908490612936565b90915550506001600160a01b03881660009081526013602052604081208054889290611ded908490612936565b9091555050505050505050505050565b600a54600160a81b900460ff16611e655760405162461bcd60e51b815260206004820152602660248201527f486f6c64657220616e642057686974656c697374206d696e74206973206e6f746044820152651037b832b71760d11b60648201526084016109f3565b818180600e5483611e769190612a90565b1115611e945760405162461bcd60e51b81526004016109f390612aaf565b600d546001600160a01b03861660009081526012602052604090205486918691611ebf908390612936565b1115611f0d5760405162461bcd60e51b815260206004820152601960248201527f596f752063616e6e6f74206d696e742074686973206d616e790000000000000060448201526064016109f3565b611f178787611a17565b6001600160a01b03871660009081526012602052604081208054889290611f3f908490612936565b909155505050505050505050565b6000611fc583838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f546040516bffffffffffffffffffffffff1960608b901b1660208201529092506034019050604051602081830303815290604052805190602001206121d5565b949350505050565b600a54600160b01b900460ff16611e655760405162461bcd60e51b815260206004820152601860248201527f5075626c6963206d696e74206973206e6f74206f70656e2e000000000000000060448201526064016109f3565b6000546001600160a01b03841661204f57604051622e076360e81b815260040160405180910390fd5b826000036120705760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15612145575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461210e6000878480600101955087611abc565b61212b576040516368d2bf6b60e11b815260040160405180910390fd5b8082106120c357826000541461214057600080fd5b61218a565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612146575b5060009081556112959085838684565b604080516060810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b90921615159082015290565b6000826121e285846121eb565b14949350505050565b600081815b8451811015610d4257600085828151811061220d5761220d61298f565b602002602001015190508083116122335760008381526020829052604090209250612244565b600081815260208490526040902092505b508061224f81612af4565b9150506121f0565b8280546122639061287a565b90600052602060002090601f01602090048101928261228557600085556122cb565b82601f1061229e5782800160ff198235161785556122cb565b828001600101855582156122cb579182015b828111156122cb5782358255916020019190600101906122b0565b506122d79291506122db565b5090565b5b808211156122d757600081556001016122dc565b6001600160e01b0319811681146117c957600080fd5b60006020828403121561231857600080fd5b81356111b5816122f0565b60005b8381101561233e578181015183820152602001612326565b838111156112955750506000910152565b60008151808452612367816020860160208601612323565b601f01601f19169290920160200192915050565b6020815260006111b5602083018461234f565b6000602082840312156123a057600080fd5b5035919050565b80356001600160a01b03811681146123be57600080fd5b919050565b600080604083850312156123d657600080fd5b6123df836123a7565b946020939093013593505050565b803580151581146123be57600080fd5b60006020828403121561240f57600080fd5b6111b5826123ed565b6000806020838503121561242b57600080fd5b823567ffffffffffffffff8082111561244357600080fd5b818501915085601f83011261245757600080fd5b81358181111561246657600080fd5b86602082850101111561247857600080fd5b60209290920196919550909350505050565b60008060006060848603121561249f57600080fd5b6124a8846123a7565b92506124b6602085016123a7565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612505576125056124c6565b604052919050565b6000602080838503121561252057600080fd5b823567ffffffffffffffff8082111561253857600080fd5b818501915085601f83011261254c57600080fd5b81358181111561255e5761255e6124c6565b8060051b915061256f8483016124dc565b818152918301840191848101908884111561258957600080fd5b938501935b838510156125a75784358252938501939085019061258e565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610f475761260b83855180516001600160a01b0316825260208082015167ffffffffffffffff16908301526040908101511515910152565b92840192606092909201916001016125cf565b60006020828403121561263057600080fd5b6111b5826123a7565b6020808252825182820181905260009190848201906040850190845b81811015610f4757835183529284019291840191600101612655565b60008060006060848603121561268657600080fd5b61268f846123a7565b95602085013595506040909401359392505050565b600080604083850312156126b757600080fd5b6126c0836123a7565b91506126ce602084016123ed565b90509250929050565b600080600080608085870312156126ed57600080fd5b6126f6856123a7565b935060206127058187016123a7565b935060408601359250606086013567ffffffffffffffff8082111561272957600080fd5b818801915088601f83011261273d57600080fd5b81358181111561274f5761274f6124c6565b612761601f8201601f191685016124dc565b9150808252898482850101111561277757600080fd5b808484018584013760008482840101525080935050505092959194509250565b81516001600160a01b0316815260208083015167ffffffffffffffff16908201526040808301511515908201526060810161081b565b600080600080606085870312156127e357600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561280957600080fd5b818701915087601f83011261281d57600080fd5b81358181111561282c57600080fd5b8860208260051b850101111561284157600080fd5b95989497505060200194505050565b6000806040838503121561286357600080fd5b61286c836123a7565b91506126ce602084016123a7565b600181811c9082168061288e57607f821691505b6020821081036128ae57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561294957612949612920565b500190565b60208082526021908201527f5468697320776f756c6420657863656564206d696e74696e6720737570706c796040820152601760f91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000826129c257634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156129d9576129d9612920565b500390565b600083516129f0818460208801612323565b835190830190612a04818360208801612323565b64173539b7b760d91b9101908152600501949350505050565b600060208284031215612a2f57600080fd5b5051919050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a699083018461234f565b9695505050505050565b600060208284031215612a8557600080fd5b81516111b5816122f0565b6000816000190483118215151615612aaa57612aaa612920565b500290565b60208082526025908201527f596f7520646f206e6f74206861766520656e6f756768206d6f6e657920746f2060408201526436b4b73a1760d91b606082015260800190565b600060018201612b0657612b06612920565b506001019056fea2646970667358221220814b45d0d22cae48d1eb31d7a9cbffcc0d90e5fb3f89174380d9a7ae626e29c564736f6c634300080d0033

Deployed Bytecode

0x60806040526004361061025c5760003560e01c8063715018a611610144578063b88d4fde116100b6578063d9a85b3f1161007a578063d9a85b3f14610726578063e6d37b8814610747578063e8a3d4851461075a578063e985e9c51461076f578063f11157eb1461078f578063f2fde38b146107af57600080fd5b8063b88d4fde14610678578063bcc9ca5b14610698578063c23dc68f146106b9578063c439ba44146106e6578063c87b56dd1461070657600080fd5b806395d89b411161010857806395d89b41146105b8578063974dc179146105cd57806399a2557a14610602578063a035b1fe14610622578063a22cb46514610638578063ad8c1f821461065857600080fd5b8063715018a6146105185780637cb647591461052d5780638462151c1461054d5780638da5cb5b1461057a5780639116950c1461059857600080fd5b80632cfac6ec116101dd5780634302823e116101a15780634302823e146104545780635bbb21771461046a5780635c975abb146104975780636352211e146104b85780636387f804146104d857806370a08231146104f857600080fd5b80632cfac6ec146103d35780632eb4a7ab146103e95780632fbba115146103ff5780633ccfd60b1461041f57806342842e0e1461043457600080fd5b806314d005791161022457806314d005791461033657806316c38b3c1461035657806318160ddd146103765780631b18e0cf1461039357806323b872dd146103b357600080fd5b806301ffc9a714610261578063047fc9aa1461029657806306fdde03146102ba578063081812fc146102dc578063095ea7b314610314575b600080fd5b34801561026d57600080fd5b5061028161027c366004612306565b6107cf565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ac600b5481565b60405190815260200161028d565b3480156102c657600080fd5b506102cf610821565b60405161028d919061237b565b3480156102e857600080fd5b506102fc6102f736600461238e565b6108b3565b6040516001600160a01b03909116815260200161028d565b34801561032057600080fd5b5061033461032f3660046123c3565b6108f7565b005b34801561034257600080fd5b506103346103513660046123fd565b6109c9565b34801561036257600080fd5b506103346103713660046123fd565b610a1a565b34801561038257600080fd5b5060015460005403600019016102ac565b34801561039f57600080fd5b506103346103ae366004612418565b610a62565b3480156103bf57600080fd5b506103346103ce36600461248a565b610a9d565b3480156103df57600080fd5b506102ac600c5481565b3480156103f557600080fd5b506102ac600f5481565b34801561040b57600080fd5b5061033461041a36600461238e565b610aa8565b34801561042b57600080fd5b50610334610b94565b34801561044057600080fd5b5061033461044f36600461248a565b610c68565b34801561046057600080fd5b506102ac600d5481565b34801561047657600080fd5b5061048a61048536600461250d565b610c83565b60405161028d91906125b3565b3480156104a357600080fd5b50600a5461028190600160a01b900460ff1681565b3480156104c457600080fd5b506102fc6104d336600461238e565b610d4a565b3480156104e457600080fd5b506103346104f33660046123fd565b610d55565b34801561050457600080fd5b506102ac61051336600461261e565b610d9d565b34801561052457600080fd5b50610334610dec565b34801561053957600080fd5b5061033461054836600461238e565b610e22565b34801561055957600080fd5b5061056d61056836600461261e565b610e51565b60405161028d9190612639565b34801561058657600080fd5b506008546001600160a01b03166102fc565b3480156105a457600080fd5b506103346105b3366004612418565b610f53565b3480156105c457600080fd5b506102cf610f89565b3480156105d957600080fd5b506105ed6105e836600461238e565b610f98565b6040805192835260208301919091520161028d565b34801561060e57600080fd5b5061056d61061d366004612671565b611034565b34801561062e57600080fd5b506102ac600e5481565b34801561064457600080fd5b506103346106533660046126a4565b6111bc565b34801561066457600080fd5b50600a546102fc906001600160a01b031681565b34801561068457600080fd5b506103346106933660046126d7565b611251565b3480156106a457600080fd5b50600a5461028190600160b01b900460ff1681565b3480156106c557600080fd5b506106d96106d436600461238e565b61129b565b60405161028d9190612797565b3480156106f257600080fd5b506105ed61070136600461261e565b611310565b34801561071257600080fd5b506102cf61072136600461238e565b6113cf565b34801561073257600080fd5b50600a5461028190600160a81b900460ff1681565b6103346107553660046127cd565b611452565b34801561076657600080fd5b506102cf6116a8565b34801561077b57600080fd5b5061028161078a366004612850565b6116b7565b34801561079b57600080fd5b506103346107aa36600461261e565b6116e5565b3480156107bb57600080fd5b506103346107ca36600461261e565b611731565b60006301ffc9a760e01b6001600160e01b03198316148061080057506380ac58cd60e01b6001600160e01b03198316145b8061081b5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546108309061287a565b80601f016020809104026020016040519081016040528092919081815260200182805461085c9061287a565b80156108a95780601f1061087e576101008083540402835291602001916108a9565b820191906000526020600020905b81548152906001019060200180831161088c57829003601f168201915b5050505050905090565b60006108be826117cc565b6108db576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061090282611801565b9050806001600160a01b0316836001600160a01b0316036109365760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461096d5761095081336116b7565b61096d576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146109fc5760405162461bcd60e51b81526004016109f3906128b4565b60405180910390fd5b600a8054911515600160a81b0260ff60a81b19909216919091179055565b6008546001600160a01b03163314610a445760405162461bcd60e51b81526004016109f3906128b4565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b6008546001600160a01b03163314610a8c5760405162461bcd60e51b81526004016109f3906128b4565b610a9860118383612257565b505050565b610a98838383611870565b6008546001600160a01b03163314610ad25760405162461bcd60e51b81526004016109f3906128b4565b600260095403610af45760405162461bcd60e51b81526004016109f3906128e9565b6002600955600b54819081610b0c6000546000190190565b610b169190612936565b1115610b345760405162461bcd60e51b81526004016109f39061294e565b600c5433600090815260126020526040902054610b52908490612936565b1115610b5d57600080fd5b610b673383611a17565b3360009081526012602052604081208054849290610b86908490612936565b909155505060016009555050565b6008546001600160a01b03163314610bbe5760405162461bcd60e51b81526004016109f3906128b4565b600260095403610be05760405162461bcd60e51b81526004016109f3906128e9565b60026009556000610bf96008546001600160a01b031690565b6001600160a01b0316306001600160a01b03163160405160006040518083038185875af1925050503d8060008114610c4d576040519150601f19603f3d011682016040523d82523d6000602084013e610c52565b606091505b5050905080610c6057600080fd5b506001600955565b610a9883838360405180602001604052806000815250611251565b805160609060008167ffffffffffffffff811115610ca357610ca36124c6565b604051908082528060200260200182016040528015610cee57816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610cc15790505b50905060005b828114610d4257610d1d858281518110610d1057610d1061298f565b602002602001015161129b565b828281518110610d2f57610d2f61298f565b6020908102919091010152600101610cf4565b509392505050565b600061081b82611801565b6008546001600160a01b03163314610d7f5760405162461bcd60e51b81526004016109f3906128b4565b600a8054911515600160b01b0260ff60b01b19909216919091179055565b60006001600160a01b038216610dc6576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610e165760405162461bcd60e51b81526004016109f3906128b4565b610e206000611a35565b565b6008546001600160a01b03163314610e4c5760405162461bcd60e51b81526004016109f3906128b4565b600f55565b60606000806000610e6185610d9d565b905060008167ffffffffffffffff811115610e7e57610e7e6124c6565b604051908082528060200260200182016040528015610ea7578160200160208202803683370190505b509050610ecd604080516060810182526000808252602082018190529181019190915290565b60015b838614610f4757610ee081611a87565b91508160400151610f3f5781516001600160a01b031615610f0057815194505b876001600160a01b0316856001600160a01b031603610f3f5780838780600101985081518110610f3257610f3261298f565b6020026020010181815250505b600101610ed0565b50909695505050505050565b6008546001600160a01b03163314610f7d5760405162461bcd60e51b81526004016109f3906128b4565b610a9860108383612257565b6060600380546108309061287a565b60008082600003610fae57506000928392509050565b82600103610fc25750600092600592509050565b600a831015610fe057610fd66002846129a5565b9360059350915050565b6014831015610ffe57610ff46002846129a5565b93600a9350915050565b60288310156110135750600a92601492509050565b60458310156110285750601492602892509050565b50602392604592509050565b606081831061105657604051631960ccad60e11b815260040160405180910390fd5b60008061106260005490565b9050600185101561107257600194505b8084111561107e578093505b600061108987610d9d565b9050848610156110a857858503818110156110a2578091505b506110ac565b5060005b60008167ffffffffffffffff8111156110c7576110c76124c6565b6040519080825280602002602001820160405280156110f0578160200160208202803683370190505b509050816000036111065793506111b592505050565b60006111118861129b565b905060008160400151611122575080515b885b8881141580156111345750848714155b156111a95761114281611a87565b925082604001516111a15782516001600160a01b03161561116257825191505b8a6001600160a01b0316826001600160a01b0316036111a157808488806001019950815181106111945761119461298f565b6020026020010181815250505b600101611124565b50505092835250909150505b9392505050565b336001600160a01b038316036111e55760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61125c848484611870565b6001600160a01b0383163b156112955761127884848484611abc565b611295576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b604080516060808201835260008083526020808401829052838501829052845192830185528183528201819052928101929092529060018310806112e157506000548310155b156112ec5792915050565b6112f583611a87565b90508060400151156113075792915050565b6111b583611ba7565b6001600160a01b0381166000908152601460205260408120548190600110156113a9576001600160a01b03831660009081526014602052604090205461135590610f98565b6001600160a01b038516600090815260136020526040902054919350915061137d90836129c7565b6001600160a01b0384166000908152601260205260409020546113a090836129c7565b91509150915091565b6001600160a01b038316600090815260126020526040812054600d546113a091906129c7565b60606113da826117cc565b6113f757604051630a14c4b560e41b815260040160405180910390fd5b6000611401611bd5565b9050805160000361142157604051806020016040528060008152506111b5565b8061142b84611be4565b60405160200161143c9291906129de565b6040516020818303038152906040529392505050565b600a54600160a01b900460ff16156114a55760405162461bcd60e51b815260206004820152601660248201527526b4b73a34b7339034b9903737ba1030b1ba34bb329760511b60448201526064016109f3565b6002600954036114c75760405162461bcd60e51b81526004016109f3906128e9565b60026009556114d68385612936565b600b54816114e76000546000190190565b6114f19190612936565b111561150f5760405162461bcd60e51b81526004016109f39061294e565b600061151b8587612936565b116115685760405162461bcd60e51b815260206004820152601960248201527f4e6f20706f696e74206d696e74696e67206e6f7468696e672e0000000000000060448201526064016109f3565b336000908152601460205260409020541561159e573360008181526014602052604090205461159991878734611c33565b61169c565b600085116115ee5760405162461bcd60e51b815260206004820152601b60248201527f4e6f20706f696e74206d696e74696e67206e6f20666c756666732e000000000060448201526064016109f3565b600a546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165b9190612a1d565b905080156116745761166e338734611dfd565b5061169c565b61167f338585611f4d565b1561168f5761166e338734611dfd565b61169a338734611fcd565b505b50506001600955505050565b6060601080546108309061287a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b0316331461170f5760405162461bcd60e51b81526004016109f3906128b4565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b0316331461175b5760405162461bcd60e51b81526004016109f3906128b4565b6001600160a01b0381166117c05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109f3565b6117c981611a35565b50565b6000816001111580156117e0575060005482105b801561081b575050600090815260046020526040902054600160e01b161590565b60008180600111611857576000548110156118575760008181526004602052604081205490600160e01b82169003611855575b806000036111b5575060001901600081815260046020526040902054611834565b505b604051636f96cda160e11b815260040160405180910390fd5b600061187b82611801565b9050836001600160a01b0316816001600160a01b0316146118ae5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806118cc57506118cc85336116b7565b806118e75750336118dc846108b3565b6001600160a01b0316145b90508061190757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661192e57604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b87178117909155831690036119cf576001830160008181526004602052604081205490036119cd5760005481146119cd5760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b611a31828260405180602001604052806000815250612026565b5050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516060810182526000808252602082018190529181019190915260008281526004602052604090205461081b9061219a565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611af1903390899088908890600401612a36565b6020604051808303816000875af1925050508015611b2c575060408051601f3d908101601f19168201909252611b2991810190612a73565b60015b611b8a573d808015611b5a576040519150601f19603f3d011682016040523d82523d6000602084013e611b5f565b606091505b508051600003611b82576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b604080516060810182526000808252602082018190529181019190915261081b611bd083611801565b61219a565b6060601180546108309061287a565b604080516080810191829052607f0190826030600a8206018353600a90045b8015611c2157600183039250600a81066030018353600a9004611c03565b50819003601f19909101908152919050565b828180600e5483611c449190612a90565b1115611c625760405162461bcd60e51b81526004016109f390612aaf565b600080611c6e89610f98565b6001600160a01b038a1660009081526013602052604090205491935091508290611c989088612936565b1115611cf45760405162461bcd60e51b815260206004820152602560248201527f596f752063616e6e6f74206d696e742074686973206d616e792066726565206d60448201526434b73a399760d91b60648201526084016109f3565b6001600160a01b0388166000908152601260205260409020548190611d19888a612936565b611d239190612936565b1115611d7b5760405162461bcd60e51b815260206004820152602160248201527f596f752063616e6e6f74206d696e742074686973206d616e7920666c756666736044820152601760f91b60648201526084016109f3565b611d8e88611d89888a612936565b611a17565b611d988688612936565b6001600160a01b03891660009081526012602052604081208054909190611dc0908490612936565b90915550506001600160a01b03881660009081526013602052604081208054889290611ded908490612936565b9091555050505050505050505050565b600a54600160a81b900460ff16611e655760405162461bcd60e51b815260206004820152602660248201527f486f6c64657220616e642057686974656c697374206d696e74206973206e6f746044820152651037b832b71760d11b60648201526084016109f3565b818180600e5483611e769190612a90565b1115611e945760405162461bcd60e51b81526004016109f390612aaf565b600d546001600160a01b03861660009081526012602052604090205486918691611ebf908390612936565b1115611f0d5760405162461bcd60e51b815260206004820152601960248201527f596f752063616e6e6f74206d696e742074686973206d616e790000000000000060448201526064016109f3565b611f178787611a17565b6001600160a01b03871660009081526012602052604081208054889290611f3f908490612936565b909155505050505050505050565b6000611fc583838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f546040516bffffffffffffffffffffffff1960608b901b1660208201529092506034019050604051602081830303815290604052805190602001206121d5565b949350505050565b600a54600160b01b900460ff16611e655760405162461bcd60e51b815260206004820152601860248201527f5075626c6963206d696e74206973206e6f74206f70656e2e000000000000000060448201526064016109f3565b6000546001600160a01b03841661204f57604051622e076360e81b815260040160405180910390fd5b826000036120705760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15612145575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461210e6000878480600101955087611abc565b61212b576040516368d2bf6b60e11b815260040160405180910390fd5b8082106120c357826000541461214057600080fd5b61218a565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612146575b5060009081556112959085838684565b604080516060810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b90921615159082015290565b6000826121e285846121eb565b14949350505050565b600081815b8451811015610d4257600085828151811061220d5761220d61298f565b602002602001015190508083116122335760008381526020829052604090209250612244565b600081815260208490526040902092505b508061224f81612af4565b9150506121f0565b8280546122639061287a565b90600052602060002090601f01602090048101928261228557600085556122cb565b82601f1061229e5782800160ff198235161785556122cb565b828001600101855582156122cb579182015b828111156122cb5782358255916020019190600101906122b0565b506122d79291506122db565b5090565b5b808211156122d757600081556001016122dc565b6001600160e01b0319811681146117c957600080fd5b60006020828403121561231857600080fd5b81356111b5816122f0565b60005b8381101561233e578181015183820152602001612326565b838111156112955750506000910152565b60008151808452612367816020860160208601612323565b601f01601f19169290920160200192915050565b6020815260006111b5602083018461234f565b6000602082840312156123a057600080fd5b5035919050565b80356001600160a01b03811681146123be57600080fd5b919050565b600080604083850312156123d657600080fd5b6123df836123a7565b946020939093013593505050565b803580151581146123be57600080fd5b60006020828403121561240f57600080fd5b6111b5826123ed565b6000806020838503121561242b57600080fd5b823567ffffffffffffffff8082111561244357600080fd5b818501915085601f83011261245757600080fd5b81358181111561246657600080fd5b86602082850101111561247857600080fd5b60209290920196919550909350505050565b60008060006060848603121561249f57600080fd5b6124a8846123a7565b92506124b6602085016123a7565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612505576125056124c6565b604052919050565b6000602080838503121561252057600080fd5b823567ffffffffffffffff8082111561253857600080fd5b818501915085601f83011261254c57600080fd5b81358181111561255e5761255e6124c6565b8060051b915061256f8483016124dc565b818152918301840191848101908884111561258957600080fd5b938501935b838510156125a75784358252938501939085019061258e565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610f475761260b83855180516001600160a01b0316825260208082015167ffffffffffffffff16908301526040908101511515910152565b92840192606092909201916001016125cf565b60006020828403121561263057600080fd5b6111b5826123a7565b6020808252825182820181905260009190848201906040850190845b81811015610f4757835183529284019291840191600101612655565b60008060006060848603121561268657600080fd5b61268f846123a7565b95602085013595506040909401359392505050565b600080604083850312156126b757600080fd5b6126c0836123a7565b91506126ce602084016123ed565b90509250929050565b600080600080608085870312156126ed57600080fd5b6126f6856123a7565b935060206127058187016123a7565b935060408601359250606086013567ffffffffffffffff8082111561272957600080fd5b818801915088601f83011261273d57600080fd5b81358181111561274f5761274f6124c6565b612761601f8201601f191685016124dc565b9150808252898482850101111561277757600080fd5b808484018584013760008482840101525080935050505092959194509250565b81516001600160a01b0316815260208083015167ffffffffffffffff16908201526040808301511515908201526060810161081b565b600080600080606085870312156127e357600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561280957600080fd5b818701915087601f83011261281d57600080fd5b81358181111561282c57600080fd5b8860208260051b850101111561284157600080fd5b95989497505060200194505050565b6000806040838503121561286357600080fd5b61286c836123a7565b91506126ce602084016123a7565b600181811c9082168061288e57607f821691505b6020821081036128ae57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561294957612949612920565b500190565b60208082526021908201527f5468697320776f756c6420657863656564206d696e74696e6720737570706c796040820152601760f91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000826129c257634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156129d9576129d9612920565b500390565b600083516129f0818460208801612323565b835190830190612a04818360208801612323565b64173539b7b760d91b9101908152600501949350505050565b600060208284031215612a2f57600080fd5b5051919050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a699083018461234f565b9695505050505050565b600060208284031215612a8557600080fd5b81516111b5816122f0565b6000816000190483118215151615612aaa57612aaa612920565b500290565b60208082526025908201527f596f7520646f206e6f74206861766520656e6f756768206d6f6e657920746f2060408201526436b4b73a1760d91b606082015260800190565b600060018201612b0657612b06612920565b506001019056fea2646970667358221220814b45d0d22cae48d1eb31d7a9cbffcc0d90e5fb3f89174380d9a7ae626e29c564736f6c634300080d0033

Deployed Bytecode Sourcemap

69707:32796:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25118:615;;;;;;;;;;-1:-1:-1;25118:615:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;25118:615:0;;;;;;;;69936:28;;;;;;;;;;;;;;;;;;;738:25:1;;;726:2;711:18;69936:28:0;592:177:1;30131:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32199:204::-;;;;;;;;;;-1:-1:-1;32199:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1874:32:1;;;1856:51;;1844:2;1829:18;32199:204:0;1710:203:1;31659:474:0;;;;;;;;;;-1:-1:-1;31659:474:0;;;;;:::i;:::-;;:::i;:::-;;74054:136;;;;;;;;;;-1:-1:-1;74054:136:0;;;;;:::i;:::-;;:::i;73797:109::-;;;;;;;;;;-1:-1:-1;73797:109:0;;;;;:::i;:::-;;:::i;24172:315::-;;;;;;;;;;-1:-1:-1;77564:1:0;24438:12;24225:7;24422:13;:28;-1:-1:-1;;24422:46:0;24172:315;;74636:169;;;;;;;;;;-1:-1:-1;74636:169:0;;;;;:::i;:::-;;:::i;33085:170::-;;;;;;;;;;-1:-1:-1;33085:170:0;;;;;:::i;:::-;;:::i;69971:30::-;;;;;;;;;;;;;;;;70095:25;;;;;;;;;;;;;;;;70596:309;;;;;;;;;;-1:-1:-1;70596:309:0;;;;;:::i;:::-;;:::i;77581:195::-;;;;;;;;;;;;;:::i;33326:185::-;;;;;;;;;;-1:-1:-1;33326:185:0;;;;;:::i;:::-;;:::i;70008:38::-;;;;;;;;;;;;;;;;54330:468;;;;;;;;;;-1:-1:-1;54330:468:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;69820:25::-;;;;;;;;;;-1:-1:-1;69820:25:0;;;;-1:-1:-1;;;69820:25:0;;;;;;29920:144;;;;;;;;;;-1:-1:-1;29920:144:0;;;;;:::i;:::-;;:::i;73914:132::-;;;;;;;;;;-1:-1:-1;73914:132:0;;;;;:::i;:::-;;:::i;25797:224::-;;;;;;;;;;-1:-1:-1;25797:224:0;;;;;:::i;:::-;;:::i;9104:103::-;;;;;;;;;;;;;:::i;74346:119::-;;;;;;;;;;-1:-1:-1;74346:119:0;;;;;:::i;:::-;;:::i;58142:892::-;;;;;;;;;;-1:-1:-1;58142:892:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8453:87::-;;;;;;;;;;-1:-1:-1;8526:6:0;;-1:-1:-1;;;;;8526:6:0;8453:87;;74473:155;;;;;;;;;;-1:-1:-1;74473:155:0;;;;;:::i;:::-;;:::i;30300:104::-;;;;;;;;;;;;;:::i;75381:798::-;;;;;;;;;;-1:-1:-1;75381:798:0;;;;;:::i;:::-;;:::i;:::-;;;;7377:25:1;;;7433:2;7418:18;;7411:34;;;;7350:18;75381:798:0;7203:248:1;55188:2505:0;;;;;;;;;;-1:-1:-1;55188:2505:0;;;;;:::i;:::-;;:::i;70053:35::-;;;;;;;;;;;;;;;;32475:308;;;;;;;;;;-1:-1:-1;32475:308:0;;;;;:::i;:::-;;:::i;69784:29::-;;;;;;;;;;-1:-1:-1;69784:29:0;;;;-1:-1:-1;;;;;69784:29:0;;;33582:396;;;;;;;;;;-1:-1:-1;33582:396:0;;;;;:::i;:::-;;:::i;69895:34::-;;;;;;;;;;-1:-1:-1;69895:34:0;;;;-1:-1:-1;;;69895:34:0;;;;;;53751:420;;;;;;;;;;-1:-1:-1;53751:420:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;74847:526::-;;;;;;;;;;-1:-1:-1;74847:526:0;;;;;:::i;:::-;;:::i;77994:396::-;;;;;;;;;;-1:-1:-1;77994:396:0;;;;;:::i;:::-;;:::i;69852:36::-;;;;;;;;;;-1:-1:-1;69852:36:0;;;;-1:-1:-1;;;69852:36:0;;;;;;70926:1108;;;;;;:::i;:::-;;:::i;77788:135::-;;;;;;;;;;;;;:::i;32854:164::-;;;;;;;;;;-1:-1:-1;32854:164:0;;;;;:::i;:::-;;:::i;74198:140::-;;;;;;;;;;-1:-1:-1;74198:140:0;;;;;:::i;:::-;;:::i;9362:201::-;;;;;;;;;;-1:-1:-1;9362:201:0;;;;;:::i;:::-;;:::i;25118:615::-;25203:4;-1:-1:-1;;;;;;;;;25503:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;25580:25:0;;;25503:102;:179;;;-1:-1:-1;;;;;;;;;;25657:25:0;;;25503:179;25483:199;25118:615;-1:-1:-1;;25118:615:0:o;30131:100::-;30185:13;30218:5;30211:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30131:100;:::o;32199:204::-;32267:7;32292:16;32300:7;32292;:16::i;:::-;32287:64;;32317:34;;-1:-1:-1;;;32317:34:0;;;;;;;;;;;32287:64;-1:-1:-1;32371:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32371:24:0;;32199:204::o;31659:474::-;31732:13;31764:27;31783:7;31764:18;:27::i;:::-;31732:61;;31814:5;-1:-1:-1;;;;;31808:11:0;:2;-1:-1:-1;;;;;31808:11:0;;31804:48;;31828:24;;-1:-1:-1;;;31828:24:0;;;;;;;;;;;31804:48;48302:10;-1:-1:-1;;;;;31869:28:0;;;31865:175;;31917:44;31934:5;48302:10;32854:164;:::i;31917:44::-;31912:128;;31989:35;;-1:-1:-1;;;31989:35:0;;;;;;;;;;;31912:128;32052:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;32052:29:0;-1:-1:-1;;;;;32052:29:0;;;;;;;;;32097:28;;32052:24;;32097:28;;;;;;;31721:412;31659:474;;:::o;74054:136::-;8526:6;;-1:-1:-1;;;;;8526:6:0;48302:10;8673:23;8665:68;;;;-1:-1:-1;;;8665:68:0;;;;;;;:::i;:::-;;;;;;;;;74152:16:::1;:30:::0;;;::::1;;-1:-1:-1::0;;;74152:30:0::1;-1:-1:-1::0;;;;74152:30:0;;::::1;::::0;;;::::1;::::0;;74054:136::o;73797:109::-;8526:6;;-1:-1:-1;;;;;8526:6:0;48302:10;8673:23;8665:68;;;;-1:-1:-1;;;8665:68:0;;;;;;;:::i;:::-;73882:6:::1;:16:::0;;;::::1;;-1:-1:-1::0;;;73882:16:0::1;-1:-1:-1::0;;;;73882:16:0;;::::1;::::0;;;::::1;::::0;;73797:109::o;74636:169::-;8526:6;;-1:-1:-1;;;;;8526:6:0;48302:10;8673:23;8665:68;;;;-1:-1:-1;;;8665:68:0;;;;;;;:::i;:::-;74756:41:::1;:20;74779:18:::0;;74756:41:::1;:::i;:::-;;74636:169:::0;;:::o;33085:170::-;33219:28;33229:4;33235:2;33239:7;33219:9;:28::i;70596:309::-;8526:6;;-1:-1:-1;;;;;8526:6:0;48302:10;8673:23;8665:68;;;;-1:-1:-1;;;8665:68:0;;;;;;;:::i;:::-;4497:1:::1;5095:7;;:19:::0;5087:63:::1;;;;-1:-1:-1::0;;;5087:63:0::1;;;;;;;:::i;:::-;4497:1;5228:7;:18:::0;76946:6:::2;::::0;70712:9;;;76916:14:::2;24632:7:::0;24820:13;-1:-1:-1;;24820:31:0;;24585:285;76916:14:::2;:26;;;;:::i;:::-;:36;;76908:82;;;;-1:-1:-1::0;;;76908:82:0::2;;;;;;;:::i;:::-;70791:10:::3;::::0;70764::::3;70747:28;::::0;;;:16:::3;:28;::::0;;;;;:40:::3;::::0;70778:9;;70747:40:::3;:::i;:::-;:54;;70739:63;;;::::0;::::3;;70813:32;70823:10;70835:9;70813;:32::i;:::-;70873:10;70856:28;::::0;;;:16:::3;:28;::::0;;;;:41;;70888:9;;70856:28;:41:::3;::::0;70888:9;;70856:41:::3;:::i;:::-;::::0;;;-1:-1:-1;;4453:1:0::1;5407:7;:22:::0;-1:-1:-1;;70596:309:0:o;77581:195::-;8526:6;;-1:-1:-1;;;;;8526:6:0;48302:10;8673:23;8665:68;;;;-1:-1:-1;;;8665:68:0;;;;;;;:::i;:::-;4497:1:::1;5095:7;;:19:::0;5087:63:::1;;;;-1:-1:-1::0;;;5087:63:0::1;;;;;;;:::i;:::-;4497:1;5228:7;:18:::0;77678:7:::2;77699;8526:6:::0;;-1:-1:-1;;;;;8526:6:0;;8453:87;77699:7:::2;-1:-1:-1::0;;;;;77691:21:0::2;77728:4;-1:-1:-1::0;;;;;77720:21:0::2;;77691:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77677:69;;;77765:2;77757:11;;;::::0;::::2;;-1:-1:-1::0;4453:1:0::1;5407:7;:22:::0;77581:195::o;33326:185::-;33464:39;33481:4;33487:2;33491:7;33464:39;;;;;;;;;;;;:16;:39::i;54330:468::-;54505:15;;54419:23;;54480:22;54505:15;54572:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;54572:36:0;;-1:-1:-1;;54572:36:0;;;;;;;;;;;;54535:73;;54628:9;54623:125;54644:14;54639:1;:19;54623:125;;54700:32;54720:8;54729:1;54720:11;;;;;;;;:::i;:::-;;;;;;;54700:19;:32::i;:::-;54684:10;54695:1;54684:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;54660:3;;54623:125;;;-1:-1:-1;54769:10:0;54330:468;-1:-1:-1;;;54330:468:0:o;29920:144::-;29984:7;30027:27;30046:7;30027:18;:27::i;73914:132::-;8526:6;;-1:-1:-1;;;;;8526:6:0;48302:10;8673:23;8665:68;;;;-1:-1:-1;;;8665:68:0;;;;;;;:::i;:::-;74010:14:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;74010:28:0::1;-1:-1:-1::0;;;;74010:28:0;;::::1;::::0;;;::::1;::::0;;73914:132::o;25797:224::-;25861:7;-1:-1:-1;;;;;25885:19:0;;25881:60;;25913:28;;-1:-1:-1;;;25913:28:0;;;;;;;;;;;25881:60;-1:-1:-1;;;;;;25959:25:0;;;;;:18;:25;;;;;;21136:13;25959:54;;25797:224::o;9104:103::-;8526:6;;-1:-1:-1;;;;;8526:6:0;48302:10;8673:23;8665:68;;;;-1:-1:-1;;;8665:68:0;;;;;;;:::i;:::-;9169:30:::1;9196:1;9169:18;:30::i;:::-;9104:103::o:0;74346:119::-;8526:6;;-1:-1:-1;;;;;8526:6:0;48302:10;8673:23;8665:68;;;;-1:-1:-1;;;8665:68:0;;;;;;;:::i;:::-;74437:10:::1;:20:::0;74346:119::o;58142:892::-;58212:16;58266:19;58300:25;58340:22;58365:16;58375:5;58365:9;:16::i;:::-;58340:41;;58396:25;58438:14;58424:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58424:29:0;;58396:57;;58468:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;58468:31:0;77564:1;58514:472;58563:14;58548:11;:29;58514:472;;58615:15;58628:1;58615:12;:15::i;:::-;58603:27;;58653:9;:16;;;58694:8;58649:73;58744:14;;-1:-1:-1;;;;;58744:28:0;;58740:111;;58817:14;;;-1:-1:-1;58740:111:0;58894:5;-1:-1:-1;;;;;58873:26:0;:17;-1:-1:-1;;;;;58873:26:0;;58869:102;;58950:1;58924:8;58933:13;;;;;;58924:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;58869:102;58579:3;;58514:472;;;-1:-1:-1;59007:8:0;;58142:892;-1:-1:-1;;;;;;58142:892:0:o;74473:155::-;8526:6;;-1:-1:-1;;;;;8526:6:0;48302:10;8673:23;8665:68;;;;-1:-1:-1;;;8665:68:0;;;;;;;:::i;:::-;74586:34:::1;:19;74608:12:::0;;74586:34:::1;:::i;30300:104::-:0;30356:13;30389:7;30382:14;;;;;:::i;75381:798::-;75475:17;75494:16;75532:7;75543:1;75532:12;75528:644;;-1:-1:-1;75594:1:0;;;;-1:-1:-1;75381:798:0;-1:-1:-1;75381:798:0:o;75528:644::-;75621:7;75632:1;75621:12;75617:555;;-1:-1:-1;75683:1:0;;75686;;-1:-1:-1;75381:798:0;-1:-1:-1;75381:798:0:o;75617:555::-;75720:2;75710:7;:12;75706:466;;;75776:11;75786:1;75776:7;:11;:::i;:::-;75768:23;75789:1;;-1:-1:-1;75381:798:0;-1:-1:-1;;75381:798:0:o;75706:466::-;75823:2;75813:7;:12;75809:363;;;75879:11;75889:1;75879:7;:11;:::i;:::-;75871:24;75892:2;;-1:-1:-1;75381:798:0;-1:-1:-1;;75381:798:0:o;75809:363::-;75927:2;75917:7;:12;75913:259;;;-1:-1:-1;75983:2:0;;75987;;-1:-1:-1;75381:798:0;-1:-1:-1;75381:798:0:o;75913:259::-;76022:2;76012:7;:12;76008:164;;;-1:-1:-1;76078:2:0;;76082;;-1:-1:-1;75381:798:0;-1:-1:-1;75381:798:0:o;76008:164::-;-1:-1:-1;76153:2:0;;76157;;-1:-1:-1;75381:798:0;-1:-1:-1;75381:798:0:o;55188:2505::-;55323:16;55390:4;55381:5;:13;55377:45;;55403:19;;-1:-1:-1;;;55403:19:0;;;;;;;;;;;55377:45;55437:19;55471:17;55491:14;23913:7;23940:13;;23866:95;55491:14;55471:34;-1:-1:-1;77564:1:0;55583:5;:23;55579:87;;;77564:1;55627:23;;55579:87;55742:9;55735:4;:16;55731:73;;;55779:9;55772:16;;55731:73;55818:25;55846:16;55856:5;55846:9;:16::i;:::-;55818:44;;56040:4;56032:5;:12;56028:278;;;56087:12;;;56122:31;;;56118:111;;;56198:11;56178:31;;56118:111;56046:198;56028:278;;;-1:-1:-1;56289:1:0;56028:278;56320:25;56362:17;56348:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56348:32:0;;56320:60;;56399:17;56420:1;56399:22;56395:78;;56449:8;-1:-1:-1;56442:15:0;;-1:-1:-1;;;56442:15:0;56395:78;56617:31;56651:26;56671:5;56651:19;:26::i;:::-;56617:60;;56692:25;56937:9;:16;;;56932:92;;-1:-1:-1;56994:14:0;;56932:92;57055:5;57038:478;57067:4;57062:1;:9;;:45;;;;;57090:17;57075:11;:32;;57062:45;57038:478;;;57145:15;57158:1;57145:12;:15::i;:::-;57133:27;;57183:9;:16;;;57224:8;57179:73;57274:14;;-1:-1:-1;;;;;57274:28:0;;57270:111;;57347:14;;;-1:-1:-1;57270:111:0;57424:5;-1:-1:-1;;;;;57403:26:0;:17;-1:-1:-1;;;;;57403:26:0;;57399:102;;57480:1;57454:8;57463:13;;;;;;57454:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;57399:102;57109:3;;57038:478;;;-1:-1:-1;;;57601:29:0;;;-1:-1:-1;57608:8:0;;-1:-1:-1;;55188:2505:0;;;;;;:::o;32475:308::-;48302:10;-1:-1:-1;;;;;32574:31:0;;;32570:61;;32614:17;;-1:-1:-1;;;32614:17:0;;;;;;;;;;;32570:61;48302:10;32644:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;32644:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;32644:60:0;;;;;;;;;;32720:55;;540:41:1;;;32644:49:0;;48302:10;32720:55;;513:18:1;32720:55:0;;;;;;;32475:308;;:::o;33582:396::-;33749:28;33759:4;33765:2;33769:7;33749:9;:28::i;:::-;-1:-1:-1;;;;;33792:14:0;;;:19;33788:183;;33831:56;33862:4;33868:2;33872:7;33881:5;33831:30;:56::i;:::-;33826:145;;33915:40;;-1:-1:-1;;;33915:40:0;;;;;;;;;;;33826:145;33582:396;;;;:::o;53751:420::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77564:1:0;53907:25;;;:54;;-1:-1:-1;23913:7:0;23940:13;53936:7;:25;;53907:54;53903:103;;;53985:9;53751:420;-1:-1:-1;;53751:420:0:o;53903:103::-;54028:21;54041:7;54028:12;:21::i;:::-;54016:33;;54064:9;:16;;;54060:65;;;54104:9;53751:420;-1:-1:-1;;53751:420:0:o;54060:65::-;54142:21;54155:7;54142:12;:21::i;74847:526::-;-1:-1:-1;;;;;74998:23:0;;74942:17;74998:23;;;:14;:23;;;;;;74942:17;;75024:1;-1:-1:-1;74995:371:0;;;-1:-1:-1;;;;;75087:23:0;;;;;;:14;:23;;;;;;75066:45;;:20;:45::i;:::-;-1:-1:-1;;;;;75164:28:0;;;;;;:19;:28;;;;;;75042:69;;-1:-1:-1;75042:69:0;-1:-1:-1;75152:40:0;;75042:69;75152:40;:::i;:::-;-1:-1:-1;;;;;75222:25:0;;;;;;:16;:25;;;;;;75211:36;;:8;:36;:::i;:::-;75126:136;;;;74847:526;;;:::o;74995:371::-;-1:-1:-1;;;;;75328:25:0;;75303:1;75328:25;;;:16;:25;;;;;;75306:19;;:47;;75328:25;75306:47;:::i;77994:396::-;78131:13;78167:16;78175:7;78167;:16::i;:::-;78162:59;;78192:29;;-1:-1:-1;;;78192:29:0;;;;;;;;;;;78162:59;78234:21;78258:10;:8;:10::i;:::-;78234:34;;78292:7;78286:21;78311:1;78286:26;:96;;;;;;;;;;;;;;;;;78339:7;78348:18;78358:7;78348:9;:18::i;:::-;78322:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78279:103;77994:396;-1:-1:-1;;;77994:396:0:o;70926:1108::-;76517:6;;-1:-1:-1;;;76517:6:0;;;;:15;76509:50;;;;-1:-1:-1;;;76509:50:0;;13863:2:1;76509:50:0;;;13845:21:1;13902:2;13882:18;;;13875:30;-1:-1:-1;;;13921:18:1;;;13914:52;13983:18;;76509:50:0;13661:346:1;76509:50:0;4497:1:::1;5095:7;;:19:::0;5087:63:::1;;;;-1:-1:-1::0;;;5087:63:0::1;;;;;;;:::i;:::-;4497:1;5228:7;:18:::0;71140:22:::2;71152:10:::0;71140:9;:22:::2;:::i;:::-;76946:6;;76933:9;76916:14;24632:7:::0;24820:13;-1:-1:-1;;24820:31:0;;24585:285;76916:14:::2;:26;;;;:::i;:::-;:36;;76908:82;;;;-1:-1:-1::0;;;76908:82:0::2;;;;;;;:::i;:::-;71213:1:::3;71188:22;71200:10:::0;71188:9;:22:::3;:::i;:::-;:26;71180:64;;;::::0;-1:-1:-1;;;71180:64:0;;14214:2:1;71180:64:0::3;::::0;::::3;14196:21:1::0;14253:2;14233:18;;;14226:30;14292:27;14272:18;;;14265:55;14337:18;;71180:64:0::3;14012:349:1::0;71180:64:0::3;71326:10;71340:1;71311:26:::0;;;:14:::3;:26;::::0;;;;;:30;71308:153:::3;;71391:10;71376:26;::::0;;;:14:::3;:26;::::0;;;;;71365:84:::3;::::0;71416:9;71427:10;71439:9:::3;71365:10;:84::i;:::-;71358:91;;71308:153;71493:1;71481:9;:13;71473:53;;;::::0;-1:-1:-1;;;71473:53:0;;14568:2:1;71473:53:0::3;::::0;::::3;14550:21:1::0;14607:2;14587:18;;;14580:30;14646:29;14626:18;;;14619:57;14693:18;;71473:53:0::3;14366:351:1::0;71473:53:0::3;71608:4;::::0;:26:::3;::::0;-1:-1:-1;;;71608:26:0;;71623:10:::3;71608:26;::::0;::::3;1856:51:1::0;71590:15:0::3;::::0;-1:-1:-1;;;;;71608:4:0::3;::::0;:14:::3;::::0;1829:18:1;;71608:26:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71590:44:::0;-1:-1:-1;71649:11:0;;71645:95:::3;;71684:44;71695:10;71707:9;71718;71684:10;:44::i;:::-;71677:51;;;71645:95;71802:40;71823:10;71835:6;;71802:20;:40::i;:::-;71798:127;;;71866:47;71880:10;71892:9;71903;71866:13;:47::i;71798:127::-;71982:44;71993:10;72005:9;72016;71982:10;:44::i;:::-;71975:51;77001:1;-1:-1:-1::0;;4453:1:0::1;5407:7;:22:::0;-1:-1:-1;;;70926:1108:0:o;77788:135::-;77858:13;77896:19;77889:26;;;;;:::i;32854:164::-;-1:-1:-1;;;;;32975:25:0;;;32951:4;32975:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32854:164::o;74198:140::-;8526:6;;-1:-1:-1;;;;;8526:6:0;48302:10;8673:23;8665:68;;;;-1:-1:-1;;;8665:68:0;;;;;;;:::i;:::-;74295:4:::1;:35:::0;;-1:-1:-1;;;;;;74295:35:0::1;-1:-1:-1::0;;;;;74295:35:0;;;::::1;::::0;;;::::1;::::0;;74198:140::o;9362:201::-;8526:6;;-1:-1:-1;;;;;8526:6:0;48302:10;8673:23;8665:68;;;;-1:-1:-1;;;8665:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9451:22:0;::::1;9443:73;;;::::0;-1:-1:-1;;;9443:73:0;;15113:2:1;9443:73:0::1;::::0;::::1;15095:21:1::0;15152:2;15132:18;;;15125:30;15191:34;15171:18;;;15164:62;-1:-1:-1;;;15242:18:1;;;15235:36;15288:19;;9443:73:0::1;14911:402:1::0;9443:73:0::1;9527:28;9546:8;9527:18;:28::i;:::-;9362:201:::0;:::o;34233:273::-;34290:4;34346:7;77564:1;34327:26;;:66;;;;;34380:13;;34370:7;:23;34327:66;:152;;;;-1:-1:-1;;34431:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;34431:43:0;:48;;34233:273::o;27435:1129::-;27502:7;27537;;77564:1;27586:23;27582:915;;27639:13;;27632:4;:20;27628:869;;;27677:14;27694:23;;;:17;:23;;;;;;;-1:-1:-1;;;27783:23:0;;:28;;27779:699;;28302:113;28309:6;28319:1;28309:11;28302:113;;-1:-1:-1;;;28380:6:0;28362:25;;;;:17;:25;;;;;;28302:113;;27779:699;27654:843;27628:869;28525:31;;-1:-1:-1;;;28525:31:0;;;;;;;;;;;39472:2515;39587:27;39617;39636:7;39617:18;:27::i;:::-;39587:57;;39702:4;-1:-1:-1;;;;;39661:45:0;39677:19;-1:-1:-1;;;;;39661:45:0;;39657:86;;39715:28;;-1:-1:-1;;;39715:28:0;;;;;;;;;;;39657:86;39756:22;48302:10;-1:-1:-1;;;;;39782:27:0;;;;:87;;-1:-1:-1;39826:43:0;39843:4;48302:10;32854:164;:::i;39826:43::-;39782:147;;;-1:-1:-1;48302:10:0;39886:20;39898:7;39886:11;:20::i;:::-;-1:-1:-1;;;;;39886:43:0;;39782:147;39756:174;;39948:17;39943:66;;39974:35;;-1:-1:-1;;;39974:35:0;;;;;;;;;;;39943:66;-1:-1:-1;;;;;40024:16:0;;40020:52;;40049:23;;-1:-1:-1;;;40049:23:0;;;;;;;;;;;40020:52;40201:24;;;;:15;:24;;;;;;;;40194:31;;-1:-1:-1;;;;;;40194:31:0;;;-1:-1:-1;;;;;40593:24:0;;;;;:18;:24;;;;;40591:26;;-1:-1:-1;;40591:26:0;;;40662:22;;;;;;;40660:24;;-1:-1:-1;40660:24:0;;;40955:26;;;:17;:26;;;;;-1:-1:-1;;;41043:15:0;21790:3;41043:41;41001:84;;:128;;40955:174;;;41249:46;;:51;;41245:626;;41353:1;41343:11;;41321:19;41476:30;;;:17;:30;;;;;;:35;;41472:384;;41614:13;;41599:11;:28;41595:242;;41761:30;;;;:17;:30;;;;;:52;;;41595:242;41302:569;41245:626;41918:7;41914:2;-1:-1:-1;;;;;41899:27:0;41908:4;-1:-1:-1;;;;;41899:27:0;;;;;;;;;;;39576:2411;;39472:2515;;;:::o;34590:104::-;34659:27;34669:2;34673:8;34659:27;;;;;;;;;;;;:9;:27::i;:::-;34590:104;;:::o;9723:191::-;9816:6;;;-1:-1:-1;;;;;9833:17:0;;;-1:-1:-1;;;;;;9833:17:0;;;;;;;9866:40;;9816:6;;;9833:17;9816:6;;9866:40;;9797:16;;9866:40;9786:128;9723:191;:::o;29044:153::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;29164:24:0;;;;:17;:24;;;;;;29145:44;;:18;:44::i;45684:716::-;45868:88;;-1:-1:-1;;;45868:88:0;;45847:4;;-1:-1:-1;;;;;45868:45:0;;;;;:88;;48302:10;;45935:4;;45941:7;;45950:5;;45868:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45868:88:0;;;;;;;;-1:-1:-1;;45868:88:0;;;;;;;;;;;;:::i;:::-;;;45864:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46151:6;:13;46168:1;46151:18;46147:235;;46197:40;;-1:-1:-1;;;46197:40:0;;;;;;;;;;;46147:235;46340:6;46334:13;46325:6;46321:2;46317:15;46310:38;45864:529;-1:-1:-1;;;;;;46027:64:0;-1:-1:-1;;;46027:64:0;;-1:-1:-1;45684:716:0;;;;;;:::o;29700:158::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;29803:47:0;29822:27;29841:7;29822:18;:27::i;:::-;29803:18;:47::i;78398:154::-;78486:13;78524:20;78517:27;;;;;:::i;48426:1959::-;48897:4;48891:11;;48904:3;48887:21;;48982:17;;;;49679:11;;;49558:5;49811:2;49825;49815:13;;49807:22;49679:11;49794:36;49866:2;49856:13;;49449:682;49885:4;49449:682;;;50060:1;50055:3;50051:11;50044:18;;50111:2;50105:4;50101:13;50097:2;50093:22;50088:3;50080:36;49981:2;49971:13;;49449:682;;;-1:-1:-1;50173:13:0;;;-1:-1:-1;;50288:12:0;;;50348:19;;;50288:12;48426:1959;-1:-1:-1;48426:1959:0:o;72062:682::-;72214:9;72225:8;77118;77109:5;;77097:9;:17;;;;:::i;:::-;:29;;77089:79;;;;-1:-1:-1;;;77089:79:0;;;;;;;:::i;:::-;72252:20:::1;72274:17:::0;72295:35:::1;72316:13;72295:20;:35::i;:::-;-1:-1:-1::0;;;;;72362:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;72251:79;;-1:-1:-1;72251:79:0;-1:-1:-1;72251:79:0;;72349:41:::1;::::0;:10;:41:::1;:::i;:::-;:57;;72341:107;;;::::0;-1:-1:-1;;;72341:107:0;;16847:2:1;72341:107:0::1;::::0;::::1;16829:21:1::0;16886:2;16866:18;;;16859:30;16925:34;16905:18;;;16898:62;-1:-1:-1;;;16976:18:1;;;16969:35;17021:19;;72341:107:0::1;16645:401:1::0;72341:107:0::1;-1:-1:-1::0;;;;;72492:25:0;::::1;;::::0;;;:16:::1;:25;::::0;;;;;72521:9;;72467:22:::1;72479:10:::0;72467:9;:22:::1;:::i;:::-;:50;;;;:::i;:::-;:63;;72459:109;;;::::0;-1:-1:-1;;;72459:109:0;;17253:2:1;72459:109:0::1;::::0;::::1;17235:21:1::0;17292:2;17272:18;;;17265:30;17331:34;17311:18;;;17304:62;-1:-1:-1;;;17382:18:1;;;17375:31;17423:19;;72459:109:0::1;17051:397:1::0;72459:109:0::1;72579:42;72589:7:::0;72598:22:::1;72610:10:::0;72598:9;:22:::1;:::i;:::-;72579:9;:42::i;:::-;72661:22;72673:10:::0;72661:9;:22:::1;:::i;:::-;-1:-1:-1::0;;;;;72632:25:0;::::1;;::::0;;;:16:::1;:25;::::0;;;;:51;;:25;;;:51:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;72694:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;:42;;72726:10;;72694:28;:42:::1;::::0;72726:10;;72694:42:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;;;72062:682:0:o;73109:303::-;76764:16;;-1:-1:-1;;;76764:16:0;;;;76756:67;;;;-1:-1:-1;;;76756:67:0;;17655:2:1;76756:67:0;;;17637:21:1;17694:2;17674:18;;;17667:30;17733:34;17713:18;;;17706:62;-1:-1:-1;;;17784:18:1;;;17777:36;17830:19;;76756:67:0;17453:402:1;76756:67:0;73246:9:::1;73257:8;77118;77109:5;;77097:9;:17;;;;:::i;:::-;:29;;77089:79;;;;-1:-1:-1::0;;;77089:79:0::1;;;;;;;:::i;:::-;77320:19:::2;::::0;-1:-1:-1;;;;;77279:25:0;::::2;;::::0;;;:16:::2;:25;::::0;;;;;73290:7;;73299:9;;77279:37:::2;::::0;73299:9;;77279:37:::2;:::i;:::-;:60;;77271:98;;;::::0;-1:-1:-1;;;77271:98:0;;18062:2:1;77271:98:0::2;::::0;::::2;18044:21:1::0;18101:2;18081:18;;;18074:30;18140:27;18120:18;;;18113:55;18185:18;;77271:98:0::2;17860:349:1::0;77271:98:0::2;73326:29:::3;73336:7;73345:9;73326;:29::i;:::-;-1:-1:-1::0;;;;;73366:25:0;::::3;;::::0;;;:16:::3;:25;::::0;;;;:38;;73395:9;;73366:25;:38:::3;::::0;73395:9;;73366:38:::3;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;73109:303:0:o;76187:235::-;76309:4;76338:76;76357:6;;76338:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;76365:10:0;;76387:25;;-1:-1:-1;;18363:2:1;18359:15;;;18355:53;76387:25:0;;;18343:66:1;76365:10:0;;-1:-1:-1;18425:12:1;;;-1:-1:-1;76387:25:0;;;;;;;;;;;;76377:36;;;;;;76338:18;:76::i;:::-;76331:83;76187:235;-1:-1:-1;;;;76187:235:0:o;73440:301::-;76639:14;;-1:-1:-1;;;76639:14:0;;;;76631:51;;;;-1:-1:-1;;;76631:51:0;;18650:2:1;76631:51:0;;;18632:21:1;18689:2;18669:18;;;18662:30;18728:26;18708:18;;;18701:54;18772:18;;76631:51:0;18448:348:1;35067:2236:0;35190:20;35213:13;-1:-1:-1;;;;;35241:16:0;;35237:48;;35266:19;;-1:-1:-1;;;35266:19:0;;;;;;;;;;;35237:48;35300:8;35312:1;35300:13;35296:44;;35322:18;;-1:-1:-1;;;35322:18:0;;;;;;;;;;;35296:44;-1:-1:-1;;;;;35889:22:0;;;;;;:18;:22;;;;21273:2;35889:22;;;:70;;35927:31;35915:44;;35889:70;;;36202:31;;;:17;:31;;;;;36295:15;21790:3;36295:41;36253:84;;-1:-1:-1;36373:13:0;;22053:3;36358:56;36253:162;36202:213;;:31;;36496:23;;;;36540:14;:19;36536:635;;36580:313;36611:38;;36636:12;;-1:-1:-1;;;;;36611:38:0;;;36628:1;;36611:38;;36628:1;;36611:38;36677:69;36716:1;36720:2;36724:14;;;;;;36740:5;36677:30;:69::i;:::-;36672:174;;36782:40;;-1:-1:-1;;;36782:40:0;;;;;;;;;;;36672:174;36888:3;36873:12;:18;36580:313;;36974:12;36957:13;;:29;36953:43;;36988:8;;;36953:43;36536:635;;;37037:119;37068:40;;37093:14;;;;;-1:-1:-1;;;;;37068:40:0;;;37085:1;;37068:40;;37085:1;;37068:40;37151:3;37136:12;:18;37037:119;;36536:635;-1:-1:-1;37185:13:0;:28;;;37235:60;;37268:2;37272:12;37286:8;37235:60;:::i;28658:295::-;-1:-1:-1;;;;;;;;;;;;;28768:41:0;;;;21790:3;28854:32;;;28820:67;;-1:-1:-1;;;28820:67:0;-1:-1:-1;;;28917:23:0;;;:28;;-1:-1:-1;;;28898:47:0;-1:-1:-1;28658:295:0:o;1220:190::-;1345:4;1398;1369:25;1382:5;1389:4;1369:12;:25::i;:::-;:33;;1220:190;-1:-1:-1;;;;1220:190:0:o;1771:675::-;1854:7;1897:4;1854:7;1912:497;1936:5;:12;1932:1;:16;1912:497;;;1970:20;1993:5;1999:1;1993:8;;;;;;;;:::i;:::-;;;;;;;1970:31;;2036:12;2020;:28;2016:382;;2522:13;2572:15;;;2608:4;2601:15;;;2655:4;2639:21;;2148:57;;2016:382;;;2522:13;2572:15;;;2608:4;2601:15;;;2655:4;2639:21;;2325:57;;2016:382;-1:-1:-1;1950:3:0;;;;:::i;:::-;;;;1912:497;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:::-;1079:3;1117:5;1111:12;1144:6;1139:3;1132:19;1160:63;1216:6;1209:4;1204:3;1200:14;1193:4;1186:5;1182:16;1160:63;:::i;:::-;1277:2;1256:15;-1:-1:-1;;1252:29:1;1243:39;;;;1284:4;1239:50;;1037:258;-1:-1:-1;;1037:258:1:o;1300:220::-;1449:2;1438:9;1431:21;1412:4;1469:45;1510:2;1499:9;1495:18;1487:6;1469:45;:::i;1525:180::-;1584:6;1637:2;1625:9;1616:7;1612:23;1608:32;1605:52;;;1653:1;1650;1643:12;1605:52;-1:-1:-1;1676:23:1;;1525:180;-1:-1:-1;1525:180:1:o;1918:173::-;1986:20;;-1:-1:-1;;;;;2035:31:1;;2025:42;;2015:70;;2081:1;2078;2071:12;2015:70;1918:173;;;:::o;2096:254::-;2164:6;2172;2225:2;2213:9;2204:7;2200:23;2196:32;2193:52;;;2241:1;2238;2231:12;2193:52;2264:29;2283:9;2264:29;:::i;:::-;2254:39;2340:2;2325:18;;;;2312:32;;-1:-1:-1;;;2096:254:1:o;2355:160::-;2420:20;;2476:13;;2469:21;2459:32;;2449:60;;2505:1;2502;2495:12;2520:180;2576:6;2629:2;2617:9;2608:7;2604:23;2600:32;2597:52;;;2645:1;2642;2635:12;2597:52;2668:26;2684:9;2668:26;:::i;2705:592::-;2776:6;2784;2837:2;2825:9;2816:7;2812:23;2808:32;2805:52;;;2853:1;2850;2843:12;2805:52;2893:9;2880:23;2922:18;2963:2;2955:6;2952:14;2949:34;;;2979:1;2976;2969:12;2949:34;3017:6;3006:9;3002:22;2992:32;;3062:7;3055:4;3051:2;3047:13;3043:27;3033:55;;3084:1;3081;3074:12;3033:55;3124:2;3111:16;3150:2;3142:6;3139:14;3136:34;;;3166:1;3163;3156:12;3136:34;3211:7;3206:2;3197:6;3193:2;3189:15;3185:24;3182:37;3179:57;;;3232:1;3229;3222:12;3179:57;3263:2;3255:11;;;;;3285:6;;-1:-1:-1;2705:592:1;;-1:-1:-1;;;;2705:592:1:o;3302:328::-;3379:6;3387;3395;3448:2;3436:9;3427:7;3423:23;3419:32;3416:52;;;3464:1;3461;3454:12;3416:52;3487:29;3506:9;3487:29;:::i;:::-;3477:39;;3535:38;3569:2;3558:9;3554:18;3535:38;:::i;:::-;3525:48;;3620:2;3609:9;3605:18;3592:32;3582:42;;3302:328;;;;;:::o;3817:127::-;3878:10;3873:3;3869:20;3866:1;3859:31;3909:4;3906:1;3899:15;3933:4;3930:1;3923:15;3949:275;4020:2;4014:9;4085:2;4066:13;;-1:-1:-1;;4062:27:1;4050:40;;4120:18;4105:34;;4141:22;;;4102:62;4099:88;;;4167:18;;:::i;:::-;4203:2;4196:22;3949:275;;-1:-1:-1;3949:275:1:o;4229:946::-;4313:6;4344:2;4387;4375:9;4366:7;4362:23;4358:32;4355:52;;;4403:1;4400;4393:12;4355:52;4443:9;4430:23;4472:18;4513:2;4505:6;4502:14;4499:34;;;4529:1;4526;4519:12;4499:34;4567:6;4556:9;4552:22;4542:32;;4612:7;4605:4;4601:2;4597:13;4593:27;4583:55;;4634:1;4631;4624:12;4583:55;4670:2;4657:16;4692:2;4688;4685:10;4682:36;;;4698:18;;:::i;:::-;4744:2;4741:1;4737:10;4727:20;;4767:28;4791:2;4787;4783:11;4767:28;:::i;:::-;4829:15;;;4899:11;;;4895:20;;;4860:12;;;;4927:19;;;4924:39;;;4959:1;4956;4949:12;4924:39;4983:11;;;;5003:142;5019:6;5014:3;5011:15;5003:142;;;5085:17;;5073:30;;5036:12;;;;5123;;;;5003:142;;;5164:5;4229:946;-1:-1:-1;;;;;;;;4229:946:1:o;5463:722::-;5696:2;5748:21;;;5818:13;;5721:18;;;5840:22;;;5667:4;;5696:2;5919:15;;;;5893:2;5878:18;;;5667:4;5962:197;5976:6;5973:1;5970:13;5962:197;;;6025:52;6073:3;6064:6;6058:13;5264:12;;-1:-1:-1;;;;;5260:38:1;5248:51;;5352:4;5341:16;;;5335:23;5360:18;5331:48;5315:14;;;5308:72;5443:4;5432:16;;;5426:23;5419:31;5412:39;5396:14;;5389:63;5180:278;6025:52;6134:15;;;;6106:4;6097:14;;;;;5998:1;5991:9;5962:197;;6190:186;6249:6;6302:2;6290:9;6281:7;6277:23;6273:32;6270:52;;;6318:1;6315;6308:12;6270:52;6341:29;6360:9;6341:29;:::i;6566:632::-;6737:2;6789:21;;;6859:13;;6762:18;;;6881:22;;;6708:4;;6737:2;6960:15;;;;6934:2;6919:18;;;6708:4;7003:169;7017:6;7014:1;7011:13;7003:169;;;7078:13;;7066:26;;7147:15;;;;7112:12;;;;7039:1;7032:9;7003:169;;7456:322;7533:6;7541;7549;7602:2;7590:9;7581:7;7577:23;7573:32;7570:52;;;7618:1;7615;7608:12;7570:52;7641:29;7660:9;7641:29;:::i;:::-;7631:39;7717:2;7702:18;;7689:32;;-1:-1:-1;7768:2:1;7753:18;;;7740:32;;7456:322;-1:-1:-1;;;7456:322:1:o;7783:254::-;7848:6;7856;7909:2;7897:9;7888:7;7884:23;7880:32;7877:52;;;7925:1;7922;7915:12;7877:52;7948:29;7967:9;7948:29;:::i;:::-;7938:39;;7996:35;8027:2;8016:9;8012:18;7996:35;:::i;:::-;7986:45;;7783:254;;;;;:::o;8276:980::-;8371:6;8379;8387;8395;8448:3;8436:9;8427:7;8423:23;8419:33;8416:53;;;8465:1;8462;8455:12;8416:53;8488:29;8507:9;8488:29;:::i;:::-;8478:39;;8536:2;8557:38;8591:2;8580:9;8576:18;8557:38;:::i;:::-;8547:48;;8642:2;8631:9;8627:18;8614:32;8604:42;;8697:2;8686:9;8682:18;8669:32;8720:18;8761:2;8753:6;8750:14;8747:34;;;8777:1;8774;8767:12;8747:34;8815:6;8804:9;8800:22;8790:32;;8860:7;8853:4;8849:2;8845:13;8841:27;8831:55;;8882:1;8879;8872:12;8831:55;8918:2;8905:16;8940:2;8936;8933:10;8930:36;;;8946:18;;:::i;:::-;8988:53;9031:2;9012:13;;-1:-1:-1;;9008:27:1;9004:36;;8988:53;:::i;:::-;8975:66;;9064:2;9057:5;9050:17;9104:7;9099:2;9094;9090;9086:11;9082:20;9079:33;9076:53;;;9125:1;9122;9115:12;9076:53;9180:2;9175;9171;9167:11;9162:2;9155:5;9151:14;9138:45;9224:1;9219:2;9214;9207:5;9203:14;9199:23;9192:34;;9245:5;9235:15;;;;;8276:980;;;;;;;:::o;9261:265::-;5264:12;;-1:-1:-1;;;;;5260:38:1;5248:51;;5352:4;5341:16;;;5335:23;5360:18;5331:48;5315:14;;;5308:72;5443:4;5432:16;;;5426:23;5419:31;5412:39;5396:14;;;5389:63;9457:2;9442:18;;9469:51;5180:278;9531:751;9635:6;9643;9651;9659;9712:2;9700:9;9691:7;9687:23;9683:32;9680:52;;;9728:1;9725;9718:12;9680:52;9764:9;9751:23;9741:33;;9821:2;9810:9;9806:18;9793:32;9783:42;;9876:2;9865:9;9861:18;9848:32;9899:18;9940:2;9932:6;9929:14;9926:34;;;9956:1;9953;9946:12;9926:34;9994:6;9983:9;9979:22;9969:32;;10039:7;10032:4;10028:2;10024:13;10020:27;10010:55;;10061:1;10058;10051:12;10010:55;10101:2;10088:16;10127:2;10119:6;10116:14;10113:34;;;10143:1;10140;10133:12;10113:34;10196:7;10191:2;10181:6;10178:1;10174:14;10170:2;10166:23;10162:32;10159:45;10156:65;;;10217:1;10214;10207:12;10156:65;9531:751;;;;-1:-1:-1;;10248:2:1;10240:11;;-1:-1:-1;;;9531:751:1:o;10287:260::-;10355:6;10363;10416:2;10404:9;10395:7;10391:23;10387:32;10384:52;;;10432:1;10429;10422:12;10384:52;10455:29;10474:9;10455:29;:::i;:::-;10445:39;;10503:38;10537:2;10526:9;10522:18;10503:38;:::i;10552:380::-;10631:1;10627:12;;;;10674;;;10695:61;;10749:4;10741:6;10737:17;10727:27;;10695:61;10802:2;10794:6;10791:14;10771:18;10768:38;10765:161;;10848:10;10843:3;10839:20;10836:1;10829:31;10883:4;10880:1;10873:15;10911:4;10908:1;10901:15;10765:161;;10552:380;;;:::o;10937:356::-;11139:2;11121:21;;;11158:18;;;11151:30;11217:34;11212:2;11197:18;;11190:62;11284:2;11269:18;;10937:356::o;11298:355::-;11500:2;11482:21;;;11539:2;11519:18;;;11512:30;11578:33;11573:2;11558:18;;11551:61;11644:2;11629:18;;11298:355::o;11658:127::-;11719:10;11714:3;11710:20;11707:1;11700:31;11750:4;11747:1;11740:15;11774:4;11771:1;11764:15;11790:128;11830:3;11861:1;11857:6;11854:1;11851:13;11848:39;;;11867:18;;:::i;:::-;-1:-1:-1;11903:9:1;;11790:128::o;11923:397::-;12125:2;12107:21;;;12164:2;12144:18;;;12137:30;12203:34;12198:2;12183:18;;12176:62;-1:-1:-1;;;12269:2:1;12254:18;;12247:31;12310:3;12295:19;;11923:397::o;12535:127::-;12596:10;12591:3;12587:20;12584:1;12577:31;12627:4;12624:1;12617:15;12651:4;12648:1;12641:15;12667:217;12707:1;12733;12723:132;;12777:10;12772:3;12768:20;12765:1;12758:31;12812:4;12809:1;12802:15;12840:4;12837:1;12830:15;12723:132;-1:-1:-1;12869:9:1;;12667:217::o;12889:125::-;12929:4;12957:1;12954;12951:8;12948:34;;;12962:18;;:::i;:::-;-1:-1:-1;12999:9:1;;12889:125::o;13019:637::-;13299:3;13337:6;13331:13;13353:53;13399:6;13394:3;13387:4;13379:6;13375:17;13353:53;:::i;:::-;13469:13;;13428:16;;;;13491:57;13469:13;13428:16;13525:4;13513:17;;13491:57;:::i;:::-;-1:-1:-1;;;13570:20:1;;13599:22;;;13648:1;13637:13;;13019:637;-1:-1:-1;;;;13019:637:1:o;14722:184::-;14792:6;14845:2;14833:9;14824:7;14820:23;14816:32;14813:52;;;14861:1;14858;14851:12;14813:52;-1:-1:-1;14884:16:1;;14722:184;-1:-1:-1;14722:184:1:o;15318:489::-;-1:-1:-1;;;;;15587:15:1;;;15569:34;;15639:15;;15634:2;15619:18;;15612:43;15686:2;15671:18;;15664:34;;;15734:3;15729:2;15714:18;;15707:31;;;15512:4;;15755:46;;15781:19;;15773:6;15755:46;:::i;:::-;15747:54;15318:489;-1:-1:-1;;;;;;15318:489:1:o;15812:249::-;15881:6;15934:2;15922:9;15913:7;15909:23;15905:32;15902:52;;;15950:1;15947;15940:12;15902:52;15982:9;15976:16;16001:30;16025:5;16001:30;:::i;16066:168::-;16106:7;16172:1;16168;16164:6;16160:14;16157:1;16154:21;16149:1;16142:9;16135:17;16131:45;16128:71;;;16179:18;;:::i;:::-;-1:-1:-1;16219:9:1;;16066:168::o;16239:401::-;16441:2;16423:21;;;16480:2;16460:18;;;16453:30;16519:34;16514:2;16499:18;;16492:62;-1:-1:-1;;;16585:2:1;16570:18;;16563:35;16630:3;16615:19;;16239:401::o;18801:135::-;18840:3;18861:17;;;18858:43;;18881:18;;:::i;:::-;-1:-1:-1;18928:1:1;18917:13;;18801:135::o

Swarm Source

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