ETH Price: $3,450.64 (-1.88%)
Gas: 2 Gwei

Token

Dreams (DREAMS)
 

Overview

Max Total Supply

2,294,878.476387552208598899 DREAMS

Holders

186

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
ecifircas.eth
Balance
1,325.205406838059696128 DREAMS

Value
$0.00
0x4f6F6b4EACff3e96C19D8773ac5ac05F5a650207
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:
Dreams

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-25
*/

// SPDX-License-Identifier: MIT

// Scroll down to the bottom to find the contract of interest. 

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

// OpenZeppelin Contracts (last updated v4.5.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.
 */
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 Merklee 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/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;

// import "@openzeppelin/contracts/utils/Context.sol";

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

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

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

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

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

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

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

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


// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


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

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

pragma solidity ^0.8.0;

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


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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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


// File: @rari-capital/solmate/src/tokens/ERC20.sol

pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*///////////////////////////////////////////////////////////////
                             METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*///////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*///////////////////////////////////////////////////////////////
                             EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    bytes32 public constant PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*///////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*///////////////////////////////////////////////////////////////
                              ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*///////////////////////////////////////////////////////////////
                              EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            bytes32 digest = keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
                )
            );

            address recoveredAddress = ecrecover(digest, v, r, s);

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}


// File: eth/contracts/Dreams.sol

pragma solidity ^0.8.0;
pragma abicoder v2;

// import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; 
// import "@openzeppelin/contracts/access/Ownable.sol";
// import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
// import "@rari-capital/solmate/src/tokens/ERC20.sol";

error InvalidProof();
error Unauthorized();
error NotActive();
error IndexOutOfBounds();
error NoMoreAvailableToMint();

abstract contract ERC20MintCapped is ERC20, Ownable {

    uint256 public immutable mintCap;

    uint256 public immutable harvestMintCap;

    uint128 public totalMinted;

    uint128 public totalHarvestMinted;

    mapping(address => bool) public minters;

    constructor(uint128 mintCap_, uint128 harvestMintCap_) { 
        mintCap = mintCap_;
        harvestMintCap = harvestMintCap_;
        if (harvestMintCap_ > mintCap_) revert();
        minters[msg.sender] = true;
    }

    function _cappedMint(address to, uint256 amount) internal returns (uint256) {
        if (amount == 0) return 0;
        uint256 diff;
        unchecked {
            uint256 curr = totalMinted;
            uint256 next = curr + amount;
            if (amount > type(uint128).max) revert();
            if (next > mintCap) { // If the next total amount exceeds the mintCap,
                next = mintCap; // set the total amount to the mintCap.
            }
            diff = next - curr; // The amount needed to be minted.
            if (diff == 0) revert NoMoreAvailableToMint();
            if (next > type(uint128).max) revert();
            totalMinted = uint128(next);    
        }
        _mint(to, diff);
        return diff;
    }

    function _harvestCappedMint(address to, uint256 amount) internal returns (uint256) {
        if (amount == 0) return 0;
        uint256 diff;
        unchecked {
            uint256 curr = totalHarvestMinted;
            uint256 next = curr + amount;
            if (amount > type(uint128).max) revert();
            if (next > harvestMintCap) { // If the next total amount exceeds the harvestMintCap,
                next = harvestMintCap; // set the total amount to the harvestMintCap.
            }
            diff = next - curr; // The amount needed to be minted.
            if (diff == 0) revert NoMoreAvailableToMint();
            if (next > type(uint128).max) revert();
            totalHarvestMinted = uint128(next);    
        }
        return _cappedMint(to, diff);
    }

    function authorizeMinter(address minter) external onlyOwner {
        minters[minter] = true;
    }

    function revokeMinter(address minter) external onlyOwner {
        minters[minter] = false;
    }
    
    function mint(address to, uint256 amount) external {
        if (!minters[msg.sender]) revert Unauthorized();
        _cappedMint(to, amount);
    }

    function selfMint(uint256 amount) external {
        if (!minters[msg.sender]) revert Unauthorized();
        _cappedMint(msg.sender, amount);
    }
}


abstract contract ERC20Claimable is ERC20MintCapped {
    
    bytes32 internal _claimMerkleRoot;

    mapping(uint256 => uint256) internal _claimed;

    constructor(bytes32 claimMerkleRoot) {
        _claimMerkleRoot = claimMerkleRoot;
    }

    function setClaimMerkleRoot(bytes32 root) public onlyOwner {
        _claimMerkleRoot = root;
    }

    function isClaimed(uint256 slot) external view returns (bool) {
        uint256 q = slot >> 8;
        uint256 r = slot & 255;
        uint256 b = 1 << r;
        return _claimed[q] & b != 0;
    }

    function claim(address to, uint256 amount, uint256 slot, bytes32[] calldata proof) external {
        uint256 q = slot >> 8;
        uint256 r = slot & 255;
        uint256 b = 1 << r;
        require(_claimed[q] & b == 0, "Already claimed.");
        bytes32 leaf = keccak256(abi.encodePacked(to, amount, slot));
        bool isValidLeaf = MerkleProof.verify(proof, _claimMerkleRoot, leaf);
        if (!isValidLeaf) revert InvalidProof();
        _claimed[q] |= b;

        _cappedMint(to, amount);
    }
}


abstract contract ERC20Burnable is ERC20 {

    function _checkedBurn(address account, uint256 amount) internal {
        require(balanceOf[account] >= amount, "Insufficient balance.");
        _burn(account, amount);
    }

    function burn(uint256 amount) public {
        _checkedBurn(msg.sender, amount);
    }

    function burnFrom(address account, uint256 amount) public {
        uint256 currentAllowance = allowance[account][msg.sender];
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            allowance[account][msg.sender] -= amount;
        }
        _checkedBurn(account, amount);
    }
}


abstract contract Coin is ERC20, ERC20Burnable, ERC20MintCapped, ERC20Claimable {

    constructor(
        string memory name_, 
        string memory symbol_, 
        uint128 mintCap_, 
        uint128 harvestMintCap_
    )
    ERC20(name_, symbol_, 18) 
    ERC20MintCapped(mintCap_, harvestMintCap_) {}
}


abstract contract Shop is Coin {

    struct PriceListing {
        uint248 price;
        bool active;
    }

    uint256 internal constant BITWIDTH_TOKEN_UID = 16;
    uint256 internal constant BITWIDTH_TOKEN_ID = BITWIDTH_TOKEN_UID - 1;
    uint256 internal constant BITMASK_TOKEN_ID = (1 << BITWIDTH_TOKEN_ID) - 1;

    address public immutable gen0;
    address public immutable gen1;

    constructor(address _gen0, address _gen1) {
        gen0 = _gen0;
        gen1 = _gen1;
    }

    function _gen(uint256 gen) internal view returns (IERC721) {
        return IERC721(gen == 0 ? gen0 : gen1);
    }
}


abstract contract NFTStaker is Shop {

    uint256 internal constant BITSHIFT_OWNER = 96;
    uint256 internal constant BITWIDTH_BLOCK_NUM = 31;
    uint256 internal constant BITMASK_BLOCK_NUM = (1 << BITWIDTH_BLOCK_NUM) - 1;
    uint256 internal constant BITWIDTH_STAKE = (BITWIDTH_TOKEN_UID + BITWIDTH_BLOCK_NUM);
    uint256 internal constant BITMASK_STAKE = (1 << BITWIDTH_STAKE) - 1;
    uint256 internal constant BITMOD_STAKE = (256 / BITWIDTH_STAKE);
    uint256 internal constant BITPOS_NUM_STAKED = BITMOD_STAKE * BITWIDTH_STAKE;
    uint256 internal constant BITMASK_STAKES = (1 << BITPOS_NUM_STAKED) - 1;
    
    uint256 internal constant BITWIDTH_RATE = 4;
    uint256 internal constant BITMOD_RATE = (256 / BITWIDTH_RATE);
    uint256 internal constant BITMASK_RATE = (1 << BITWIDTH_RATE) - 1;
    uint256 internal constant DEFAULT_RATE = 5;

    mapping(uint256 => uint256) internal _vault;

    bytes32 internal _ratesMerkleRoot;

    uint128 public harvestBaseRate;

    uint32 public minStakeBlocks;

    bool private _reentrancyGuard;

    constructor(
        uint128 harvestBaseRate_, 
        uint32 minStakeBlocks_, 
        bytes32 ratesMerkleRoot_
    ) {
        harvestBaseRate = harvestBaseRate_;
        minStakeBlocks = minStakeBlocks_;
        _ratesMerkleRoot = ratesMerkleRoot_;
    }

    modifier nonReentrant() {
        if (_reentrancyGuard) revert();
        _reentrancyGuard = true;
        _;
        _reentrancyGuard = false;
    }

    function setRatesMerkleRoot(bytes32 value) external onlyOwner {
        _ratesMerkleRoot = value;
    }

    function setMinStakeBlocks(uint32 value) external onlyOwner {
        minStakeBlocks = value;
    }

    function setHarvestBaseRate(uint128 value) external onlyOwner {
        harvestBaseRate = value;
    }

    function _blockNumber() internal view virtual returns (uint256) {
        return block.number;
    }

    function stakeNFTs(uint256[] memory tokenUids) 
    external nonReentrant {
        unchecked {
            uint256 n = tokenUids.length;
            require(n > 0, "Please submit at least 1 token.");
            uint256 o = uint256(uint160(msg.sender)) << BITSHIFT_OWNER;
            uint256 f = _vault[o];
            uint256 m = f >> BITPOS_NUM_STAKED;

            uint256 j = m;

            _vault[o] = f ^ ((m ^ (m + n)) << BITPOS_NUM_STAKED);

            uint256 blockNumCurr = _blockNumber();
            for (uint256 i; i < n; ++i) {
                uint256 e = tokenUids[i];
                
                // Transfer NFT from owner to contract.
                uint256 gen = e >> BITWIDTH_TOKEN_ID;
                uint256 tokenId = e & BITMASK_TOKEN_ID;
                _gen(gen).transferFrom(msg.sender, address(this), tokenId);

                uint256 q = (j / BITMOD_STAKE) | o;
                uint256 r = (j % BITMOD_STAKE) * BITWIDTH_STAKE;
                uint256 s = (e << BITWIDTH_BLOCK_NUM) | blockNumCurr;
                _vault[q] |= (s << r);
                ++j;
            }
        }
    }

    function stakedNFTs(address owner) 
    external view returns (uint256[] memory) {
        unchecked {
            uint256 o = uint256(uint160(owner)) << BITSHIFT_OWNER;
            uint256 f = _vault[o];
            uint256 m = f >> BITPOS_NUM_STAKED;

            uint256[] memory a = new uint256[](m);
            for (uint256 j; j < m; ++j) {
                uint256 q = (j / BITMOD_STAKE) | o;
                uint256 r = (j % BITMOD_STAKE) * BITWIDTH_STAKE;
                uint256 s = (_vault[q] >> r) & BITMASK_STAKE;
                a[j] = s >> BITWIDTH_BLOCK_NUM;
            }
            return a;
        }
    }

    function stakedNFTByIndex(address owner, uint256 index) public view returns (uint256) {
        unchecked {
            uint256 j = index;
            uint256 o = uint256(uint160(owner)) << BITSHIFT_OWNER;
            uint256 f = _vault[o];
            uint256 m = f >> BITPOS_NUM_STAKED;
            if (j >= m) revert IndexOutOfBounds();
            uint256 q = (j / BITMOD_STAKE) | o;
            uint256 r = (j % BITMOD_STAKE) * BITWIDTH_STAKE;
            uint256 s = (_vault[q] >> r) & BITMASK_STAKE;
            return s >> BITWIDTH_BLOCK_NUM;
        }        
    }

    function unstakeNFTs(uint256[] calldata indices, uint256 numStaked) 
    external nonReentrant {
        unchecked {
            uint256 o = uint256(uint160(msg.sender)) << BITSHIFT_OWNER;
            uint256 f = _vault[o];
            uint256 m = f >> BITPOS_NUM_STAKED;      
            if (m != numStaked) revert IndexOutOfBounds();
            uint256 n = indices.length;
            require(n > 0, "Please submit at least 1 token.");
            if (m < n) revert IndexOutOfBounds();

            _vault[o] = f ^ ((m ^ (m - n)) << BITPOS_NUM_STAKED);
            uint256 p = type(uint256).max;
            for (uint256 i; i < n; ++i) {
                uint256 j = indices[i];
                if (j >= m || j >= p) revert IndexOutOfBounds();
                uint256 q = (j / BITMOD_STAKE) | o;
                uint256 r = (j % BITMOD_STAKE) * BITWIDTH_STAKE;
                uint256 s = (_vault[q] >> r) & BITMASK_STAKE;
                
                uint256 tokenUid = s >> BITWIDTH_BLOCK_NUM;
                
                // Transfer NFT from contract to owner.
                uint256 gen = tokenUid >> BITWIDTH_TOKEN_ID;
                uint256 tokenId = tokenUid & BITMASK_TOKEN_ID;
                _gen(gen).transferFrom(address(this), msg.sender, tokenId);

                --m;
                uint256 u = (m / BITMOD_STAKE) | o;
                uint256 v = (m % BITMOD_STAKE) * BITWIDTH_STAKE;
                uint256 w = (_vault[u] >> v) & BITMASK_STAKE;
                _vault[q] ^= ((s ^ w) << r);
                _vault[u] ^= (w << v);
                p = j;
            }
        }
    }

    function harvest(uint256[] calldata rates, bytes32[][] calldata proofs) 
    external nonReentrant returns (uint256) {
        unchecked {
            uint256 o = uint256(uint160(msg.sender)) << BITSHIFT_OWNER;
            uint256 m = _vault[o] >> BITPOS_NUM_STAKED;
            uint256 amount;
            if (m != rates.length || m != proofs.length)
                revert InvalidProof();
            
            uint256 blockNumCurr = _blockNumber();
            uint256 thres = minStakeBlocks;
            bytes32 root = _ratesMerkleRoot;
            
            for (uint256 j; j < m; ++j) {
                bytes32[] memory proof = proofs[j];
                uint256 rate = rates[j];
                uint256 q = (j / BITMOD_STAKE) | o;
                uint256 r = (j % BITMOD_STAKE) * BITWIDTH_STAKE;
                uint256 s = (_vault[q] >> r) & BITMASK_STAKE;
                
                uint256 blockNum = s & BITMASK_BLOCK_NUM;
                uint256 tokenUid = s >> BITWIDTH_BLOCK_NUM;
                
                if (blockNum + thres > blockNumCurr) continue;

                if (!MerkleProof.verify(proof, root, 
                    keccak256(abi.encodePacked(tokenUid, rate)))) 
                    revert InvalidProof();

                amount += rate * (blockNumCurr - blockNum);

                uint256 w = (tokenUid << BITWIDTH_BLOCK_NUM) | blockNumCurr;
                _vault[q] ^= ((s ^ w) << r);                    
            }
            amount *= harvestBaseRate;

            return _harvestCappedMint(msg.sender, amount);
        }
    }
}


abstract contract NFTDataChanger is NFTStaker {

    mapping(uint256 => PriceListing) public nftDataPrices;

    // nftData[tokenUid][dataTypeId]
    mapping(uint256 => mapping(uint256 => bytes32)) public nftData;

    event NFTDataChanged(uint256 tokenUid, uint256 dataTypeId, bytes32 value);

    function setNFTDataPrice(uint256 dataTypeId, uint248 price, bool active) external onlyOwner {
        nftDataPrices[dataTypeId].price = price;
        nftDataPrices[dataTypeId].active = active;
    }

    function _setNFTData(uint256 tokenUid, uint256 dataTypeId, bytes32 value) internal {
        if (!nftDataPrices[dataTypeId].active) revert NotActive();
        burn(nftDataPrices[dataTypeId].price);

        nftData[tokenUid][dataTypeId] = value;
        emit NFTDataChanged(tokenUid, dataTypeId, value);
    }

    function setNFTData(uint256 tokenUid, uint256 dataTypeId, bytes32 value) external {
        uint256 gen = tokenUid >> BITWIDTH_TOKEN_ID;
        uint256 tokenId = tokenUid & BITMASK_TOKEN_ID;
        if (msg.sender != _gen(gen).ownerOf(tokenId)) revert Unauthorized();
        _setNFTData(tokenUid, dataTypeId, value);
    }

    function setStakedNFTData(uint256 tokenUid, uint256 index, uint256 dataTypeId, bytes32 value) external {
        if (stakedNFTByIndex(msg.sender, index) != tokenUid) revert Unauthorized();
        _setNFTData(tokenUid, dataTypeId, value);
    }

    function getNFTData(uint256[] calldata tokenUids, uint256[] calldata dataTypeIds) 
    external view returns (bytes32[] memory) {
        unchecked {
            uint256 m = tokenUids.length;
            uint256 n = dataTypeIds.length;
            bytes32[] memory a = new bytes32[](m * n);
            for (uint256 j; j < m; ++j) {
                for (uint256 i; i < n; ++i) {
                    a[j * n + i] = nftData[tokenUids[j]][dataTypeIds[i]];
                }
            }
            return a;    
        }
    }
}


abstract contract TicketShop is Shop {

    mapping(uint256 => PriceListing) public ticketPrices;

    mapping(uint256 => address[]) public ticketPurchases;

    mapping(uint256 => mapping(address => bool)) public hasPurchasedTicket;

    function setTicketPrice(uint256 ticketTypeId, uint248 price, bool active) external onlyOwner {
        ticketPrices[ticketTypeId].price = price;
        ticketPrices[ticketTypeId].active = active;
    }

    function purchaseTicket(uint256 ticketTypeId) public {
        if (!ticketPrices[ticketTypeId].active) revert NotActive();
        burn(ticketPrices[ticketTypeId].price);

        ticketPurchases[ticketTypeId].push(msg.sender);
        hasPurchasedTicket[ticketTypeId][msg.sender] = true;
    }
}


interface IGen1 is IERC721 {
    
    function forceMint(address[] memory _addresses) external;
}


abstract contract Gen1Minter is Shop {

    PriceListing public gen1MintPrice;

    function setGen1MintPrice(uint128 price, bool active) external onlyOwner {
        gen1MintPrice.price = price;
        gen1MintPrice.active = active;
    }

    function passBackGen1Ownership() external onlyOwner {
        Ownable(gen1).transferOwnership(owner());
    }

    function mintGen1(uint256 numTokens) external {
        if (!gen1MintPrice.active) revert NotActive();
        burn(gen1MintPrice.price * numTokens);

        address[] memory a = new address[](numTokens);
        unchecked {
            for (uint i; i < numTokens; ++i) {
                a[i] = msg.sender;
            }
        }
        IGen1(gen1).forceMint(a);
    }
}


abstract contract NFTCoinShop is NFTDataChanger, TicketShop, Gen1Minter {

    constructor(
        string memory name_, 
        string memory symbol_, 
        uint128 mintCap_, 
        uint128 harvestMintCap_, 
        address gen0_, 
        address gen1_,
        bytes32 claimMerkleRoot_,
        uint128 harvestBaseRate_, 
        uint32 minStakeBlocks_, 
        bytes32 ratesMerkleRoot_) 
    Coin(name_, symbol_, mintCap_, harvestMintCap_)
    Shop(gen0_, gen1_)
    ERC20Claimable(claimMerkleRoot_)
    NFTStaker(harvestBaseRate_, minStakeBlocks_, ratesMerkleRoot_) {}
}


// Replace class name with actual value in prod.
contract Dreams is NFTCoinShop {

    constructor() 
    NFTCoinShop(
        // Name
        "Dreams", 
        // Symbol
        "DREAMS", 
        // Mint cap
        10000000 * 1000000000000000000, 
        // Harvest mint cap
        7000000 * 1000000000000000000, 
        // Gen 0 
        0x4e2781e3aD94b2DfcF34c51De0D8e9358c69F296, 
        // Gen 1
        0xAB9F99e6460f6B7940aB7920F44D97b725e0FA4c, 
        // Claim Merkle Root
        0xef35dac8c7728a6c30dc702829819d9d3349f1435480726d0a865665ef8ace69,
        // Harvest base Rate
        100000000000000,
        // Harvest min stake blocks
        66000, 
        // Harvest rates merkle root
        0x8b032d7c4c594507e68c268cbee1026fb7321f4eee5d333862bac183598d338d
    ) {}

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IndexOutOfBounds","type":"error"},{"inputs":[],"name":"InvalidProof","type":"error"},{"inputs":[],"name":"NoMoreAvailableToMint","type":"error"},{"inputs":[],"name":"NotActive","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenUid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dataTypeId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"NFTDataChanged","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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"authorizeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gen0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gen1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gen1MintPrice","outputs":[{"internalType":"uint248","name":"price","type":"uint248"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenUids","type":"uint256[]"},{"internalType":"uint256[]","name":"dataTypeIds","type":"uint256[]"}],"name":"getNFTData","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"rates","type":"uint256[]"},{"internalType":"bytes32[][]","name":"proofs","type":"bytes32[][]"}],"name":"harvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestBaseRate","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestMintCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"hasPurchasedTicket","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minStakeBlocks","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"mintGen1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftData","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftDataPrices","outputs":[{"internalType":"uint248","name":"price","type":"uint248"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"passBackGen1Ownership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ticketTypeId","type":"uint256"}],"name":"purchaseTicket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"revokeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"selfMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setClaimMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"bool","name":"active","type":"bool"}],"name":"setGen1MintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"value","type":"uint128"}],"name":"setHarvestBaseRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"value","type":"uint32"}],"name":"setMinStakeBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenUid","type":"uint256"},{"internalType":"uint256","name":"dataTypeId","type":"uint256"},{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"setNFTData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dataTypeId","type":"uint256"},{"internalType":"uint248","name":"price","type":"uint248"},{"internalType":"bool","name":"active","type":"bool"}],"name":"setNFTDataPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"setRatesMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenUid","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"dataTypeId","type":"uint256"},{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"setStakedNFTData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ticketTypeId","type":"uint256"},{"internalType":"uint248","name":"price","type":"uint248"},{"internalType":"bool","name":"active","type":"bool"}],"name":"setTicketPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenUids","type":"uint256[]"}],"name":"stakeNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"stakedNFTByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"stakedNFTs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ticketPrices","outputs":[{"internalType":"uint248","name":"price","type":"uint248"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ticketPurchases","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalHarvestMinted","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indices","type":"uint256[]"},{"internalType":"uint256","name":"numStaked","type":"uint256"}],"name":"unstakeNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101606040523480156200001257600080fd5b5060405180604001604052806006815260200165447265616d7360d01b81525060405180604001604052806006815260200165445245414d5360d01b8152506a084595161401484a0000006a05ca4ec2a79a7f67000000734e2781e3ad94b2dfcf34c51de0d8e9358c69f29673ab9f99e6460f6b7940ab7920f44d97b725e0fa4c7fef35dac8c7728a6c30dc702829819d9d3349f1435480726d0a865665ef8ace6960001b655af3107a4000620101d07f8b032d7c4c594507e68c268cbee1026fb7321f4eee5d333862bac183598d338d60001b82828288888e8e8e8e8c82828686601282600090805190602001906200010e929190620002df565b50815162000124906001906020850190620002df565b5060ff81166080524660a0526200013a620001f1565b60c052506200014d91503390506200028d565b6001600160801b0380831660e081905290821661010081905211156200017257600080fd5b5050336000908152600860205260409020805460ff19166001179055600955505050506001600160a01b03918216610120521661014052600d805463ffffffff909316600160801b026001600160a01b03199093166001600160801b039094169390931791909117909155600c55506200046698505050505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051620002259190620003c2565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620002ed9062000385565b90600052602060002090601f0160209004810192826200031157600085556200035c565b82601f106200032c57805160ff19168380011785556200035c565b828001600101855582156200035c579182015b828111156200035c5782518255916020019190600101906200033f565b506200036a9291506200036e565b5090565b5b808211156200036a57600081556001016200036f565b600181811c908216806200039a57607f821691505b60208210811415620003bc57634e487b7160e01b600052602260045260246000fd5b50919050565b600080835481600182811c915080831680620003df57607f831692505b60208084108214156200040057634e487b7160e01b86526022600452602486fd5b818015620004175760018114620004295762000458565b60ff1986168952848901965062000458565b60008a81526020902060005b86811015620004505781548b82015290850190830162000435565b505084890196505b509498975050505050505050565b60805160a05160c05160e051610100516101205161014051612f5e620004f9600039600081816105b401528181610f010152818161153601526121620152600081816107b8015261218801526000818161060d0152818161239d01526123c60152600081816106c60152818161229701526122c0015260006115da015260006115a50152600061050c0152612f5e6000f3fe608060405234801561001057600080fd5b50600436106103835760003560e01c806370a08231116101de578063a9059cbb1161010f578063d787f10c116100ad578063e44d311b1161007c578063e44d311b14610923578063f2fde38b14610958578063f46eccc41461096b578063fd1e29621461098e57600080fd5b8063d787f10c146108b3578063dd0b34b5146108c6578063dd62ed3e146108e5578063e0ab7e451461091057600080fd5b8063cfbd4885116100e9578063cfbd488514610826578063d505accf14610839578063d534af441461084c578063d72c9fee146108a057600080fd5b8063a9059cbb146107ed578063afbc1cae14610800578063b948348c1461081357600080fd5b8063924620741161017c5780639e916d1d116101565780639e916d1d1461078d578063a2309ff8146107a0578063a279d621146107b3578063a4646ba7146107da57600080fd5b8063924620741461073f57806395d89b41146107525780639e34070f1461075a57600080fd5b806379cc6790116101b857806379cc6790146106e85780637ecebe00146106fb57806382d9b8341461071b5780638da5cb5b1461072e57600080fd5b806370a0823114610699578063715018a6146106b957806376c71ca1146106c157600080fd5b806323c67f42116102b8578063439fd35f1161025657806350f0d8621161023057806350f0d86214610608578063522ea5c71461062f5780635dc5c2531461065a578063640122241461066d57600080fd5b8063439fd35f146105815780634589657d146105af5780634d10dd7a146105ee57600080fd5b80633644e515116102925780633644e5151461054057806340c10f191461054857806342966c681461055b57806342d7c33d1461056e57600080fd5b806323c67f42146104cd57806330adf81f146104e0578063313ce5671461050757600080fd5b80630f4d84381161032557806313ddc7c9116102ff57806313ddc7c91461047d578063172bd6de1461049e57806318160ddd146104b157806323b872dd146104ba57600080fd5b80630f4d8438146104425780631181102314610462578063132e13a11461046a57600080fd5b80630c830882116103615780630c830882146103f45780630c984832146104095780630d3c69b41461041c5780630f48a4821461042f57600080fd5b806306fdde031461038857806308a3bed7146103a6578063095ea7b3146103d1575b600080fd5b6103906109a1565b60405161039d91906126d7565b60405180910390f35b600d546103b9906001600160801b031681565b6040516001600160801b03909116815260200161039d565b6103e46103df366004612741565b610a2f565b604051901515815260200161039d565b61040761040236600461276d565b610a9c565b005b610407610417366004612799565b610b89565b61040761042a3660046127b6565b610be0565b61040761043d3660046127e5565b610c1d565b6104556104503660046128ef565b610ddf565b60405161039d919061295b565b610407610ed5565b6104076104783660046129b4565b610f9b565b61049061048b3660046128ef565b610fed565b60405190815260200161039d565b6104076104ac3660046129fe565b611243565b61049060025481565b6103e46104c8366004612a68565b611374565b6104076104db3660046127b6565b611454565b6104907f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61052e7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161039d565b6104906115a1565b610407610556366004612741565b6115fc565b6104076105693660046127b6565b61163a565b61040761057c366004612aa9565b611647565b6103e461058f366004612adb565b601260209081526000928352604080842090915290825290205460ff1681565b6105d67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161039d565b6007546103b990600160801b90046001600160801b031681565b6104907f000000000000000000000000000000000000000000000000000000000000000081565b61049061063d366004612b0b565b600f60209081526000928352604080842090915290825290205481565b610490610668366004612741565b61167a565b600d5461068490600160801b900463ffffffff1681565b60405163ffffffff909116815260200161039d565b6104906106a7366004612799565b60036020526000908152604090205481565b6104076116f1565b6104907f000000000000000000000000000000000000000000000000000000000000000081565b6104076106f6366004612741565b611727565b610490610709366004612799565b60056020526000908152604090205481565b610407610729366004612b2d565b6117db565b6006546001600160a01b03166105d6565b61040761074d366004612b90565b611a5d565b610390611aa0565b6103e46107683660046127b6565b600881901c6000908152600a6020526040902054600160ff9092169190911b16151590565b61040761079b3660046127b6565b611aad565b6007546103b9906001600160801b031681565b6105d67f000000000000000000000000000000000000000000000000000000000000000081565b6105d66107e8366004612b0b565b611adc565b6103e46107fb366004612741565b611b14565b61040761080e366004612bc3565b611b7a565b6104076108213660046127b6565b611bc6565b610407610834366004612799565b611c71565b610407610847366004612bde565b611cbc565b61088161085a3660046127b6565b600e602052600090815260409020546001600160f81b03811690600160f81b900460ff1682565b604080516001600160f81b03909316835290151560208301520161039d565b6104556108ae366004612799565b611f0d565b6104076108c13660046129b4565b611fef565b601354610881906001600160f81b03811690600160f81b900460ff1682565b6104906108f3366004612c55565b600460209081526000928352604080842090915290825290205481565b61040761091e366004612c83565b612041565b6108816109313660046127b6565b6010602052600090815260409020546001600160f81b03811690600160f81b900460ff1682565b610407610966366004612799565b612091565b6103e4610979366004612799565b60086020526000908152604090205460ff1681565b61040761099c3660046127b6565b612129565b600080546109ae90612ca9565b80601f01602080910402602001604051908101604052809291908181526020018280546109da90612ca9565b8015610a275780601f106109fc57610100808354040283529160200191610a27565b820191906000526020600020905b815481529060010190602001808311610a0a57829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a8a9086815260200190565b60405180910390a35060015b92915050565b6000610aaa60016010612cfa565b84901c905060006001610abe816010612cfa565b6001901b610acc9190612cfa565b85169050610ad982612158565b6001600160a01b0316636352211e826040518263ffffffff1660e01b8152600401610b0691815260200190565b602060405180830381865afa158015610b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b479190612d11565b6001600160a01b0316336001600160a01b031614610b77576040516282b42960e81b815260040160405180910390fd5b610b828585856121ad565b5050505050565b6006546001600160a01b03163314610bbc5760405162461bcd60e51b8152600401610bb390612d2e565b60405180910390fd5b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b3360009081526008602052604090205460ff16610c0f576040516282b42960e81b815260040160405180910390fd5b610c193382612264565b5050565b600d54600160a01b900460ff1615610c3457600080fd5b600d805460ff60a01b1916600160a01b179055805180610c965760405162461bcd60e51b815260206004820152601f60248201527f506c65617365207375626d6974206174206c65617374203120746f6b656e2e006044820152606401610bb3565b3360601b6000818152600b60205260408120805460eb81811c868101811890911b821890925591819043905b86811015610dc8576000888281518110610cde57610cde612d79565b60209081029190910101519050600f81901c617fff8216610cfe82612158565b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b0391909116906323b872dd90606401600060405180830381600087803b158015610d4e57600080fd5b505af1158015610d62573d6000803e3d6000fd5b50505050600089601f60100161010081610d7e57610d7e612d63565b048881610d8d57610d8d612d63565b04176000908152600b602052604090208054601f9590951b871760058906602f021b9094179093555050600193840193919091019050610cc2565b5050600d805460ff60a01b19169055505050505050565b60608382600081830267ffffffffffffffff811115610e0057610e006127cf565b604051908082528060200260200182016040528015610e29578160200160208202803683370190505b50905060005b83811015610ec95760005b83811015610ec057600f60008b8b85818110610e5857610e58612d79565b9050602002013581526020019081526020016000206000898984818110610e8157610e81612d79565b9050602002013581526020019081526020016000205483828685020181518110610ead57610ead612d79565b6020908102919091010152600101610e3a565b50600101610e2f565b50979650505050505050565b6006546001600160a01b03163314610eff5760405162461bcd60e51b8152600401610bb390612d2e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f2fde38b610f406006546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015610f8157600080fd5b505af1158015610f95573d6000803e3d6000fd5b50505050565b6006546001600160a01b03163314610fc55760405162461bcd60e51b8152600401610bb390612d2e565b6000928352600e6020526040909220911515600160f81b026001600160f81b03909116179055565b600d54600090600160a01b900460ff161561100757600080fd5b600d805460ff60a01b1916600160a01b1790553360601b6000818152600b602052604081205460eb1c9086821415806110405750818514155b1561105e576040516309bde33960e01b815260040160405180910390fd5b600d54600c544391600160801b900463ffffffff169060005b8581101561120b5760008a8a8381811061109357611093612d79565b90506020028101906110a59190612d8f565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050905060008d8d848181106110fb576110fb612d79565b905060200201359050600089601f6010016101008161111c5761111c612d63565b04858161112b5761112b612d63565b04176000818152600b6020526040902054909150602f600586060290657fffffffffff90821c90811690637fffffff811690601f1c61ffff168982018b101561117a5750505050505050611203565b6111b6878a838960405160200161119b929190918252602082015260400190565b6040516020818303038152906040528051906020012061234d565b6111d3576040516309bde33960e01b815260040160405180910390fd5b6000948552600b60205260409094208054601f9590951b8b179290921890921b9092189091558603029590950194505b600101611077565b50600d546001600160801b031693909302926112273385612363565b600d805460ff60a01b191690559b9a5050505050505050505050565b600883901c6000818152600a602052604090205460ff8516906001821b908116156112a35760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c9031b630b4b6b2b21760811b6044820152606401610bb3565b6040516001600160601b031960608a901b1660208201526034810188905260548101879052600090607401604051602081830303815290604052805190602001209050600061132987878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600954915085905061234d565b905080611349576040516309bde33960e01b815260040160405180910390fd5b6000858152600a602052604090208054841790556113678a8a612264565b5050505050505050505050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146113d0576113ab8382612cfa565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906113f8908490612cfa565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020612f09833981519152906114419087815260200190565b60405180910390a3506001949350505050565b601354600160f81b900460ff1661147e57604051634065aaf160e11b815260040160405180910390fd5b601354611499906105699083906001600160f81b0316612dd9565b60008167ffffffffffffffff8111156114b4576114b46127cf565b6040519080825280602002602001820160405280156114dd578160200160208202803683370190505b50905060005b8281101561151e57338282815181106114fe576114fe612d79565b6001600160a01b03909216602092830291909101909101526001016114e3565b50604051635cc43bf160e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b98877e29061156b908490600401612df8565b600060405180830381600087803b15801561158557600080fd5b505af1158015611599573d6000803e3d6000fd5b505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146115d7576115d2612451565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b3360009081526008602052604090205460ff1661162b576040516282b42960e81b815260040160405180910390fd5b6116358282612264565b505050565b61164433826124eb565b50565b83611652338561167a565b1461166f576040516282b42960e81b815260040160405180910390fd5b610f958483836121ad565b606082901b6001600160601b0319166000818152600b60205260408120549091839160eb81901c8084106116c157604051634e23d03560e01b815260040160405180910390fd5b50506005808304919091176000908152600b6020526040902054602f91909206021c601f1c61ffff169392505050565b6006546001600160a01b0316331461171b5760405162461bcd60e51b8152600401610bb390612d2e565b6117256000612555565b565b6001600160a01b0382166000908152600460209081526040808320338452909152902054818110156117a75760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610bb3565b6001600160a01b038316600090815260046020908152604080832033845290915290208054839003905561163583836124eb565b600d54600160a01b900460ff16156117f257600080fd5b600d805460ff60a01b1916600160a01b1790553360601b6000818152600b602052604090205460eb81901c83811461183d57604051634e23d03560e01b815260040160405180910390fd5b848061188b5760405162461bcd60e51b815260206004820152601f60248201527f506c65617365207375626d6974206174206c65617374203120746f6b656e2e006044820152606401610bb3565b808210156118ac57604051634e23d03560e01b815260040160405180910390fd5b6000848152600b60205260408120828403841860eb1b85189055600019905b82811015611a455760008989838181106118e7576118e7612d79565b90506020020135905084811015806118ff5750828110155b1561191d57604051634e23d03560e01b815260040160405180910390fd5b600580820488176000818152600b60205260409020549091602f9084060290811c657fffffffffff81169061ffff601f82901c90811691602e1c60011690617fff1661196882612158565b6040516323b872dd60e01b8152306004820152336024820152604481018390526001600160a01b0391909116906323b872dd90606401600060405180830381600087803b1580156119b857600080fd5b505af11580156119cc573d6000803e3d6000fd5b5050506000199b909b019a5060008d60058d041790506000602f60058e6000858152600b602052604080822080549d8352908220805494909306949094029b8c1c657fffffffffff16998a18909a1b9190911890559190965280549490961b9390931890945550929450505060019190910190506118cb565b5050600d805460ff60a01b1916905550505050505050565b6006546001600160a01b03163314611a875760405162461bcd60e51b8152600401610bb390612d2e565b1515600160f81b026001600160801b0390911617601355565b600180546109ae90612ca9565b6006546001600160a01b03163314611ad75760405162461bcd60e51b8152600401610bb390612d2e565b600c55565b60116020528160005260406000208181548110611af857600080fd5b6000918252602090912001546001600160a01b03169150829050565b33600090815260036020526040812080548391908390611b35908490612cfa565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020612f0983398151915290610a8a9086815260200190565b6006546001600160a01b03163314611ba45760405162461bcd60e51b8152600401610bb390612d2e565b600d80546001600160801b0319166001600160801b0392909216919091179055565b600081815260106020526040902054600160f81b900460ff16611bfc57604051634065aaf160e11b815260040160405180910390fd5b600081815260106020526040902054611c1d906001600160f81b031661163a565b60008181526011602090815260408083208054600181810183559185528385200180546001600160a01b0319163390811790915594845260128352818420948452939091529020805460ff19169091179055565b6006546001600160a01b03163314611c9b5760405162461bcd60e51b8152600401610bb390612d2e565b6001600160a01b03166000908152600860205260409020805460ff19169055565b42841015611d0c5760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610bb3565b6000611d166115a1565b6001600160a01b0389811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938c166060840152608083018b905260a083019390935260c08083018a90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611e2f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611e655750886001600160a01b0316816001600160a01b0316145b611ea25760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610bb3565b6001600160a01b0390811660009081526004602090815260408083208b8516808552908352928190208a905551898152919350918a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b606081811b6001600160601b0319166000818152600b60205260408120549060eb82901c908167ffffffffffffffff811115611f4b57611f4b6127cf565b604051908082528060200260200182016040528015611f74578160200160208202803683370190505b50905060005b82811015611fe557600580820486176000818152600b602052604090205484519192602f9085060291657fffffffffff91831c91821691601f1c61ffff1690869086908110611fcb57611fcb612d79565b602002602001018181525050505050806001019050611f7a565b5095945050505050565b6006546001600160a01b031633146120195760405162461bcd60e51b8152600401610bb390612d2e565b600092835260106020526040909220911515600160f81b026001600160f81b03909116179055565b6006546001600160a01b0316331461206b5760405162461bcd60e51b8152600401610bb390612d2e565b600d805463ffffffff909216600160801b0263ffffffff60801b19909216919091179055565b6006546001600160a01b031633146120bb5760405162461bcd60e51b8152600401610bb390612d2e565b6001600160a01b0381166121205760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bb3565b61164481612555565b6006546001600160a01b031633146121535760405162461bcd60e51b8152600401610bb390612d2e565b600955565b60008115612186577f0000000000000000000000000000000000000000000000000000000000000000610a96565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b6000828152600e6020526040902054600160f81b900460ff166121e357604051634065aaf160e11b815260040160405180910390fd5b6000828152600e6020526040902054612204906001600160f81b031661163a565b6000838152600f6020908152604080832085845282529182902083905581518581529081018490529081018290527f46f0e96acd6a8be5d5dfc62b01034bd46c192d40662fd42fc29c02681cb60d8b9060600160405180910390a1505050565b60008161227357506000610a96565b6007546000906001600160801b03908116908482019085111561229557600080fd5b7f00000000000000000000000000000000000000000000000000000000000000008111156122e057507f00000000000000000000000000000000000000000000000000000000000000005b818103925082600014156123075760405163e766453d60e01b815260040160405180910390fd5b6001600160801b0381111561231b57600080fd5b600780546001600160801b0319166001600160801b03929092169190911790555061234684826125a7565b9392505050565b60008261235a8584612601565b14949350505050565b60008161237257506000610a96565b6007546000906001600160801b03600160801b9091048116908482019085111561239b57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000008111156123e657507f00000000000000000000000000000000000000000000000000000000000000005b8181039250826000141561240d5760405163e766453d60e01b815260040160405180910390fd5b6001600160801b0381111561242157600080fd5b600780546001600160801b03928316600160801b029216919091179055506124498482612264565b949350505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516124839190612e39565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b03821660009081526003602052604090205481111561254b5760405162461bcd60e51b815260206004820152601560248201527424b739bab33334b1b4b2b73a103130b630b731b29760591b6044820152606401610bb3565b610c198282612675565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80600260008282546125b99190612ed5565b90915550506001600160a01b038216600081815260036020908152604080832080548601905551848152600080516020612f0983398151915291015b60405180910390a35050565b600081815b845181101561266d57600085828151811061262357612623612d79565b60200260200101519050808311612649576000838152602082905260409020925061265a565b600081815260208490526040902092505b508061266581612eed565b915050612606565b509392505050565b6001600160a01b0382166000908152600360205260408120805483929061269d908490612cfa565b90915550506002805482900390556040518181526000906001600160a01b03841690600080516020612f09833981519152906020016125f5565b600060208083528351808285015260005b81811015612704578581018301518582016040015282016126e8565b81811115612716576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461164457600080fd5b6000806040838503121561275457600080fd5b823561275f8161272c565b946020939093013593505050565b60008060006060848603121561278257600080fd5b505081359360208301359350604090920135919050565b6000602082840312156127ab57600080fd5b81356123468161272c565b6000602082840312156127c857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156127f857600080fd5b823567ffffffffffffffff8082111561281057600080fd5b818501915085601f83011261282457600080fd5b813581811115612836576128366127cf565b8060051b604051601f19603f8301168101818110858211171561285b5761285b6127cf565b60405291825284820192508381018501918883111561287957600080fd5b938501935b828510156128975784358452938501939285019261287e565b98975050505050505050565b60008083601f8401126128b557600080fd5b50813567ffffffffffffffff8111156128cd57600080fd5b6020830191508360208260051b85010111156128e857600080fd5b9250929050565b6000806000806040858703121561290557600080fd5b843567ffffffffffffffff8082111561291d57600080fd5b612929888389016128a3565b9096509450602087013591508082111561294257600080fd5b5061294f878288016128a3565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b8181101561299357835183529284019291840191600101612977565b50909695505050505050565b803580151581146129af57600080fd5b919050565b6000806000606084860312156129c957600080fd5b8335925060208401356001600160f81b03811681146129e757600080fd5b91506129f56040850161299f565b90509250925092565b600080600080600060808688031215612a1657600080fd5b8535612a218161272c565b94506020860135935060408601359250606086013567ffffffffffffffff811115612a4b57600080fd5b612a57888289016128a3565b969995985093965092949392505050565b600080600060608486031215612a7d57600080fd5b8335612a888161272c565b92506020840135612a988161272c565b929592945050506040919091013590565b60008060008060808587031215612abf57600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215612aee57600080fd5b823591506020830135612b008161272c565b809150509250929050565b60008060408385031215612b1e57600080fd5b50508035926020909101359150565b600080600060408486031215612b4257600080fd5b833567ffffffffffffffff811115612b5957600080fd5b612b65868287016128a3565b909790965060209590950135949350505050565b80356001600160801b03811681146129af57600080fd5b60008060408385031215612ba357600080fd5b612bac83612b79565b9150612bba6020840161299f565b90509250929050565b600060208284031215612bd557600080fd5b61234682612b79565b600080600080600080600060e0888a031215612bf957600080fd5b8735612c048161272c565b96506020880135612c148161272c565b95506040880135945060608801359350608088013560ff81168114612c3857600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215612c6857600080fd5b8235612c738161272c565b91506020830135612b008161272c565b600060208284031215612c9557600080fd5b813563ffffffff8116811461234657600080fd5b600181811c90821680612cbd57607f821691505b60208210811415612cde57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612d0c57612d0c612ce4565b500390565b600060208284031215612d2357600080fd5b81516123468161272c565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612da657600080fd5b83018035915067ffffffffffffffff821115612dc157600080fd5b6020019150600581901b36038213156128e857600080fd5b6000816000190483118215151615612df357612df3612ce4565b500290565b6020808252825182820181905260009190848201906040850190845b818110156129935783516001600160a01b031683529284019291840191600101612e14565b600080835481600182811c915080831680612e5557607f831692505b6020808410821415612e7557634e487b7160e01b86526022600452602486fd5b818015612e895760018114612e9a57612ec7565b60ff19861689528489019650612ec7565b60008a81526020902060005b86811015612ebf5781548b820152908501908301612ea6565b505084890196505b509498975050505050505050565b60008219821115612ee857612ee8612ce4565b500190565b6000600019821415612f0157612f01612ce4565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a49d12b57b0e96b81212eac6ddd03bebad42c1a8e5d0e5aa8bdcecffcfb0642764736f6c634300080c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103835760003560e01c806370a08231116101de578063a9059cbb1161010f578063d787f10c116100ad578063e44d311b1161007c578063e44d311b14610923578063f2fde38b14610958578063f46eccc41461096b578063fd1e29621461098e57600080fd5b8063d787f10c146108b3578063dd0b34b5146108c6578063dd62ed3e146108e5578063e0ab7e451461091057600080fd5b8063cfbd4885116100e9578063cfbd488514610826578063d505accf14610839578063d534af441461084c578063d72c9fee146108a057600080fd5b8063a9059cbb146107ed578063afbc1cae14610800578063b948348c1461081357600080fd5b8063924620741161017c5780639e916d1d116101565780639e916d1d1461078d578063a2309ff8146107a0578063a279d621146107b3578063a4646ba7146107da57600080fd5b8063924620741461073f57806395d89b41146107525780639e34070f1461075a57600080fd5b806379cc6790116101b857806379cc6790146106e85780637ecebe00146106fb57806382d9b8341461071b5780638da5cb5b1461072e57600080fd5b806370a0823114610699578063715018a6146106b957806376c71ca1146106c157600080fd5b806323c67f42116102b8578063439fd35f1161025657806350f0d8621161023057806350f0d86214610608578063522ea5c71461062f5780635dc5c2531461065a578063640122241461066d57600080fd5b8063439fd35f146105815780634589657d146105af5780634d10dd7a146105ee57600080fd5b80633644e515116102925780633644e5151461054057806340c10f191461054857806342966c681461055b57806342d7c33d1461056e57600080fd5b806323c67f42146104cd57806330adf81f146104e0578063313ce5671461050757600080fd5b80630f4d84381161032557806313ddc7c9116102ff57806313ddc7c91461047d578063172bd6de1461049e57806318160ddd146104b157806323b872dd146104ba57600080fd5b80630f4d8438146104425780631181102314610462578063132e13a11461046a57600080fd5b80630c830882116103615780630c830882146103f45780630c984832146104095780630d3c69b41461041c5780630f48a4821461042f57600080fd5b806306fdde031461038857806308a3bed7146103a6578063095ea7b3146103d1575b600080fd5b6103906109a1565b60405161039d91906126d7565b60405180910390f35b600d546103b9906001600160801b031681565b6040516001600160801b03909116815260200161039d565b6103e46103df366004612741565b610a2f565b604051901515815260200161039d565b61040761040236600461276d565b610a9c565b005b610407610417366004612799565b610b89565b61040761042a3660046127b6565b610be0565b61040761043d3660046127e5565b610c1d565b6104556104503660046128ef565b610ddf565b60405161039d919061295b565b610407610ed5565b6104076104783660046129b4565b610f9b565b61049061048b3660046128ef565b610fed565b60405190815260200161039d565b6104076104ac3660046129fe565b611243565b61049060025481565b6103e46104c8366004612a68565b611374565b6104076104db3660046127b6565b611454565b6104907f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61052e7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff909116815260200161039d565b6104906115a1565b610407610556366004612741565b6115fc565b6104076105693660046127b6565b61163a565b61040761057c366004612aa9565b611647565b6103e461058f366004612adb565b601260209081526000928352604080842090915290825290205460ff1681565b6105d67f000000000000000000000000ab9f99e6460f6b7940ab7920f44d97b725e0fa4c81565b6040516001600160a01b03909116815260200161039d565b6007546103b990600160801b90046001600160801b031681565b6104907f00000000000000000000000000000000000000000005ca4ec2a79a7f6700000081565b61049061063d366004612b0b565b600f60209081526000928352604080842090915290825290205481565b610490610668366004612741565b61167a565b600d5461068490600160801b900463ffffffff1681565b60405163ffffffff909116815260200161039d565b6104906106a7366004612799565b60036020526000908152604090205481565b6104076116f1565b6104907f000000000000000000000000000000000000000000084595161401484a00000081565b6104076106f6366004612741565b611727565b610490610709366004612799565b60056020526000908152604090205481565b610407610729366004612b2d565b6117db565b6006546001600160a01b03166105d6565b61040761074d366004612b90565b611a5d565b610390611aa0565b6103e46107683660046127b6565b600881901c6000908152600a6020526040902054600160ff9092169190911b16151590565b61040761079b3660046127b6565b611aad565b6007546103b9906001600160801b031681565b6105d67f0000000000000000000000004e2781e3ad94b2dfcf34c51de0d8e9358c69f29681565b6105d66107e8366004612b0b565b611adc565b6103e46107fb366004612741565b611b14565b61040761080e366004612bc3565b611b7a565b6104076108213660046127b6565b611bc6565b610407610834366004612799565b611c71565b610407610847366004612bde565b611cbc565b61088161085a3660046127b6565b600e602052600090815260409020546001600160f81b03811690600160f81b900460ff1682565b604080516001600160f81b03909316835290151560208301520161039d565b6104556108ae366004612799565b611f0d565b6104076108c13660046129b4565b611fef565b601354610881906001600160f81b03811690600160f81b900460ff1682565b6104906108f3366004612c55565b600460209081526000928352604080842090915290825290205481565b61040761091e366004612c83565b612041565b6108816109313660046127b6565b6010602052600090815260409020546001600160f81b03811690600160f81b900460ff1682565b610407610966366004612799565b612091565b6103e4610979366004612799565b60086020526000908152604090205460ff1681565b61040761099c3660046127b6565b612129565b600080546109ae90612ca9565b80601f01602080910402602001604051908101604052809291908181526020018280546109da90612ca9565b8015610a275780601f106109fc57610100808354040283529160200191610a27565b820191906000526020600020905b815481529060010190602001808311610a0a57829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a8a9086815260200190565b60405180910390a35060015b92915050565b6000610aaa60016010612cfa565b84901c905060006001610abe816010612cfa565b6001901b610acc9190612cfa565b85169050610ad982612158565b6001600160a01b0316636352211e826040518263ffffffff1660e01b8152600401610b0691815260200190565b602060405180830381865afa158015610b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b479190612d11565b6001600160a01b0316336001600160a01b031614610b77576040516282b42960e81b815260040160405180910390fd5b610b828585856121ad565b5050505050565b6006546001600160a01b03163314610bbc5760405162461bcd60e51b8152600401610bb390612d2e565b60405180910390fd5b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b3360009081526008602052604090205460ff16610c0f576040516282b42960e81b815260040160405180910390fd5b610c193382612264565b5050565b600d54600160a01b900460ff1615610c3457600080fd5b600d805460ff60a01b1916600160a01b179055805180610c965760405162461bcd60e51b815260206004820152601f60248201527f506c65617365207375626d6974206174206c65617374203120746f6b656e2e006044820152606401610bb3565b3360601b6000818152600b60205260408120805460eb81811c868101811890911b821890925591819043905b86811015610dc8576000888281518110610cde57610cde612d79565b60209081029190910101519050600f81901c617fff8216610cfe82612158565b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b0391909116906323b872dd90606401600060405180830381600087803b158015610d4e57600080fd5b505af1158015610d62573d6000803e3d6000fd5b50505050600089601f60100161010081610d7e57610d7e612d63565b048881610d8d57610d8d612d63565b04176000908152600b602052604090208054601f9590951b871760058906602f021b9094179093555050600193840193919091019050610cc2565b5050600d805460ff60a01b19169055505050505050565b60608382600081830267ffffffffffffffff811115610e0057610e006127cf565b604051908082528060200260200182016040528015610e29578160200160208202803683370190505b50905060005b83811015610ec95760005b83811015610ec057600f60008b8b85818110610e5857610e58612d79565b9050602002013581526020019081526020016000206000898984818110610e8157610e81612d79565b9050602002013581526020019081526020016000205483828685020181518110610ead57610ead612d79565b6020908102919091010152600101610e3a565b50600101610e2f565b50979650505050505050565b6006546001600160a01b03163314610eff5760405162461bcd60e51b8152600401610bb390612d2e565b7f000000000000000000000000ab9f99e6460f6b7940ab7920f44d97b725e0fa4c6001600160a01b031663f2fde38b610f406006546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015610f8157600080fd5b505af1158015610f95573d6000803e3d6000fd5b50505050565b6006546001600160a01b03163314610fc55760405162461bcd60e51b8152600401610bb390612d2e565b6000928352600e6020526040909220911515600160f81b026001600160f81b03909116179055565b600d54600090600160a01b900460ff161561100757600080fd5b600d805460ff60a01b1916600160a01b1790553360601b6000818152600b602052604081205460eb1c9086821415806110405750818514155b1561105e576040516309bde33960e01b815260040160405180910390fd5b600d54600c544391600160801b900463ffffffff169060005b8581101561120b5760008a8a8381811061109357611093612d79565b90506020028101906110a59190612d8f565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050905060008d8d848181106110fb576110fb612d79565b905060200201359050600089601f6010016101008161111c5761111c612d63565b04858161112b5761112b612d63565b04176000818152600b6020526040902054909150602f600586060290657fffffffffff90821c90811690637fffffff811690601f1c61ffff168982018b101561117a5750505050505050611203565b6111b6878a838960405160200161119b929190918252602082015260400190565b6040516020818303038152906040528051906020012061234d565b6111d3576040516309bde33960e01b815260040160405180910390fd5b6000948552600b60205260409094208054601f9590951b8b179290921890921b9092189091558603029590950194505b600101611077565b50600d546001600160801b031693909302926112273385612363565b600d805460ff60a01b191690559b9a5050505050505050505050565b600883901c6000818152600a602052604090205460ff8516906001821b908116156112a35760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c9031b630b4b6b2b21760811b6044820152606401610bb3565b6040516001600160601b031960608a901b1660208201526034810188905260548101879052600090607401604051602081830303815290604052805190602001209050600061132987878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600954915085905061234d565b905080611349576040516309bde33960e01b815260040160405180910390fd5b6000858152600a602052604090208054841790556113678a8a612264565b5050505050505050505050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146113d0576113ab8382612cfa565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906113f8908490612cfa565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020612f09833981519152906114419087815260200190565b60405180910390a3506001949350505050565b601354600160f81b900460ff1661147e57604051634065aaf160e11b815260040160405180910390fd5b601354611499906105699083906001600160f81b0316612dd9565b60008167ffffffffffffffff8111156114b4576114b46127cf565b6040519080825280602002602001820160405280156114dd578160200160208202803683370190505b50905060005b8281101561151e57338282815181106114fe576114fe612d79565b6001600160a01b03909216602092830291909101909101526001016114e3565b50604051635cc43bf160e11b81526001600160a01b037f000000000000000000000000ab9f99e6460f6b7940ab7920f44d97b725e0fa4c169063b98877e29061156b908490600401612df8565b600060405180830381600087803b15801561158557600080fd5b505af1158015611599573d6000803e3d6000fd5b505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000146146115d7576115d2612451565b905090565b507f4fabf36b31cf8251577951184f3310bd602be5edfa2eea736df2a8056484a6b290565b3360009081526008602052604090205460ff1661162b576040516282b42960e81b815260040160405180910390fd5b6116358282612264565b505050565b61164433826124eb565b50565b83611652338561167a565b1461166f576040516282b42960e81b815260040160405180910390fd5b610f958483836121ad565b606082901b6001600160601b0319166000818152600b60205260408120549091839160eb81901c8084106116c157604051634e23d03560e01b815260040160405180910390fd5b50506005808304919091176000908152600b6020526040902054602f91909206021c601f1c61ffff169392505050565b6006546001600160a01b0316331461171b5760405162461bcd60e51b8152600401610bb390612d2e565b6117256000612555565b565b6001600160a01b0382166000908152600460209081526040808320338452909152902054818110156117a75760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610bb3565b6001600160a01b038316600090815260046020908152604080832033845290915290208054839003905561163583836124eb565b600d54600160a01b900460ff16156117f257600080fd5b600d805460ff60a01b1916600160a01b1790553360601b6000818152600b602052604090205460eb81901c83811461183d57604051634e23d03560e01b815260040160405180910390fd5b848061188b5760405162461bcd60e51b815260206004820152601f60248201527f506c65617365207375626d6974206174206c65617374203120746f6b656e2e006044820152606401610bb3565b808210156118ac57604051634e23d03560e01b815260040160405180910390fd5b6000848152600b60205260408120828403841860eb1b85189055600019905b82811015611a455760008989838181106118e7576118e7612d79565b90506020020135905084811015806118ff5750828110155b1561191d57604051634e23d03560e01b815260040160405180910390fd5b600580820488176000818152600b60205260409020549091602f9084060290811c657fffffffffff81169061ffff601f82901c90811691602e1c60011690617fff1661196882612158565b6040516323b872dd60e01b8152306004820152336024820152604481018390526001600160a01b0391909116906323b872dd90606401600060405180830381600087803b1580156119b857600080fd5b505af11580156119cc573d6000803e3d6000fd5b5050506000199b909b019a5060008d60058d041790506000602f60058e6000858152600b602052604080822080549d8352908220805494909306949094029b8c1c657fffffffffff16998a18909a1b9190911890559190965280549490961b9390931890945550929450505060019190910190506118cb565b5050600d805460ff60a01b1916905550505050505050565b6006546001600160a01b03163314611a875760405162461bcd60e51b8152600401610bb390612d2e565b1515600160f81b026001600160801b0390911617601355565b600180546109ae90612ca9565b6006546001600160a01b03163314611ad75760405162461bcd60e51b8152600401610bb390612d2e565b600c55565b60116020528160005260406000208181548110611af857600080fd5b6000918252602090912001546001600160a01b03169150829050565b33600090815260036020526040812080548391908390611b35908490612cfa565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020612f0983398151915290610a8a9086815260200190565b6006546001600160a01b03163314611ba45760405162461bcd60e51b8152600401610bb390612d2e565b600d80546001600160801b0319166001600160801b0392909216919091179055565b600081815260106020526040902054600160f81b900460ff16611bfc57604051634065aaf160e11b815260040160405180910390fd5b600081815260106020526040902054611c1d906001600160f81b031661163a565b60008181526011602090815260408083208054600181810183559185528385200180546001600160a01b0319163390811790915594845260128352818420948452939091529020805460ff19169091179055565b6006546001600160a01b03163314611c9b5760405162461bcd60e51b8152600401610bb390612d2e565b6001600160a01b03166000908152600860205260409020805460ff19169055565b42841015611d0c5760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610bb3565b6000611d166115a1565b6001600160a01b0389811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938c166060840152608083018b905260a083019390935260c08083018a90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611e2f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611e655750886001600160a01b0316816001600160a01b0316145b611ea25760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610bb3565b6001600160a01b0390811660009081526004602090815260408083208b8516808552908352928190208a905551898152919350918a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b606081811b6001600160601b0319166000818152600b60205260408120549060eb82901c908167ffffffffffffffff811115611f4b57611f4b6127cf565b604051908082528060200260200182016040528015611f74578160200160208202803683370190505b50905060005b82811015611fe557600580820486176000818152600b602052604090205484519192602f9085060291657fffffffffff91831c91821691601f1c61ffff1690869086908110611fcb57611fcb612d79565b602002602001018181525050505050806001019050611f7a565b5095945050505050565b6006546001600160a01b031633146120195760405162461bcd60e51b8152600401610bb390612d2e565b600092835260106020526040909220911515600160f81b026001600160f81b03909116179055565b6006546001600160a01b0316331461206b5760405162461bcd60e51b8152600401610bb390612d2e565b600d805463ffffffff909216600160801b0263ffffffff60801b19909216919091179055565b6006546001600160a01b031633146120bb5760405162461bcd60e51b8152600401610bb390612d2e565b6001600160a01b0381166121205760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bb3565b61164481612555565b6006546001600160a01b031633146121535760405162461bcd60e51b8152600401610bb390612d2e565b600955565b60008115612186577f000000000000000000000000ab9f99e6460f6b7940ab7920f44d97b725e0fa4c610a96565b7f0000000000000000000000004e2781e3ad94b2dfcf34c51de0d8e9358c69f29692915050565b6000828152600e6020526040902054600160f81b900460ff166121e357604051634065aaf160e11b815260040160405180910390fd5b6000828152600e6020526040902054612204906001600160f81b031661163a565b6000838152600f6020908152604080832085845282529182902083905581518581529081018490529081018290527f46f0e96acd6a8be5d5dfc62b01034bd46c192d40662fd42fc29c02681cb60d8b9060600160405180910390a1505050565b60008161227357506000610a96565b6007546000906001600160801b03908116908482019085111561229557600080fd5b7f000000000000000000000000000000000000000000084595161401484a0000008111156122e057507f000000000000000000000000000000000000000000084595161401484a0000005b818103925082600014156123075760405163e766453d60e01b815260040160405180910390fd5b6001600160801b0381111561231b57600080fd5b600780546001600160801b0319166001600160801b03929092169190911790555061234684826125a7565b9392505050565b60008261235a8584612601565b14949350505050565b60008161237257506000610a96565b6007546000906001600160801b03600160801b9091048116908482019085111561239b57600080fd5b7f00000000000000000000000000000000000000000005ca4ec2a79a7f670000008111156123e657507f00000000000000000000000000000000000000000005ca4ec2a79a7f670000005b8181039250826000141561240d5760405163e766453d60e01b815260040160405180910390fd5b6001600160801b0381111561242157600080fd5b600780546001600160801b03928316600160801b029216919091179055506124498482612264565b949350505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516124839190612e39565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b03821660009081526003602052604090205481111561254b5760405162461bcd60e51b815260206004820152601560248201527424b739bab33334b1b4b2b73a103130b630b731b29760591b6044820152606401610bb3565b610c198282612675565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80600260008282546125b99190612ed5565b90915550506001600160a01b038216600081815260036020908152604080832080548601905551848152600080516020612f0983398151915291015b60405180910390a35050565b600081815b845181101561266d57600085828151811061262357612623612d79565b60200260200101519050808311612649576000838152602082905260409020925061265a565b600081815260208490526040902092505b508061266581612eed565b915050612606565b509392505050565b6001600160a01b0382166000908152600360205260408120805483929061269d908490612cfa565b90915550506002805482900390556040518181526000906001600160a01b03841690600080516020612f09833981519152906020016125f5565b600060208083528351808285015260005b81811015612704578581018301518582016040015282016126e8565b81811115612716576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461164457600080fd5b6000806040838503121561275457600080fd5b823561275f8161272c565b946020939093013593505050565b60008060006060848603121561278257600080fd5b505081359360208301359350604090920135919050565b6000602082840312156127ab57600080fd5b81356123468161272c565b6000602082840312156127c857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156127f857600080fd5b823567ffffffffffffffff8082111561281057600080fd5b818501915085601f83011261282457600080fd5b813581811115612836576128366127cf565b8060051b604051601f19603f8301168101818110858211171561285b5761285b6127cf565b60405291825284820192508381018501918883111561287957600080fd5b938501935b828510156128975784358452938501939285019261287e565b98975050505050505050565b60008083601f8401126128b557600080fd5b50813567ffffffffffffffff8111156128cd57600080fd5b6020830191508360208260051b85010111156128e857600080fd5b9250929050565b6000806000806040858703121561290557600080fd5b843567ffffffffffffffff8082111561291d57600080fd5b612929888389016128a3565b9096509450602087013591508082111561294257600080fd5b5061294f878288016128a3565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b8181101561299357835183529284019291840191600101612977565b50909695505050505050565b803580151581146129af57600080fd5b919050565b6000806000606084860312156129c957600080fd5b8335925060208401356001600160f81b03811681146129e757600080fd5b91506129f56040850161299f565b90509250925092565b600080600080600060808688031215612a1657600080fd5b8535612a218161272c565b94506020860135935060408601359250606086013567ffffffffffffffff811115612a4b57600080fd5b612a57888289016128a3565b969995985093965092949392505050565b600080600060608486031215612a7d57600080fd5b8335612a888161272c565b92506020840135612a988161272c565b929592945050506040919091013590565b60008060008060808587031215612abf57600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215612aee57600080fd5b823591506020830135612b008161272c565b809150509250929050565b60008060408385031215612b1e57600080fd5b50508035926020909101359150565b600080600060408486031215612b4257600080fd5b833567ffffffffffffffff811115612b5957600080fd5b612b65868287016128a3565b909790965060209590950135949350505050565b80356001600160801b03811681146129af57600080fd5b60008060408385031215612ba357600080fd5b612bac83612b79565b9150612bba6020840161299f565b90509250929050565b600060208284031215612bd557600080fd5b61234682612b79565b600080600080600080600060e0888a031215612bf957600080fd5b8735612c048161272c565b96506020880135612c148161272c565b95506040880135945060608801359350608088013560ff81168114612c3857600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215612c6857600080fd5b8235612c738161272c565b91506020830135612b008161272c565b600060208284031215612c9557600080fd5b813563ffffffff8116811461234657600080fd5b600181811c90821680612cbd57607f821691505b60208210811415612cde57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612d0c57612d0c612ce4565b500390565b600060208284031215612d2357600080fd5b81516123468161272c565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612da657600080fd5b83018035915067ffffffffffffffff821115612dc157600080fd5b6020019150600581901b36038213156128e857600080fd5b6000816000190483118215151615612df357612df3612ce4565b500290565b6020808252825182820181905260009190848201906040850190845b818110156129935783516001600160a01b031683529284019291840191600101612e14565b600080835481600182811c915080831680612e5557607f831692505b6020808410821415612e7557634e487b7160e01b86526022600452602486fd5b818015612e895760018114612e9a57612ec7565b60ff19861689528489019650612ec7565b60008a81526020902060005b86811015612ebf5781548b820152908501908301612ea6565b505084890196505b509498975050505050505050565b60008219821115612ee857612ee8612ce4565b500190565b6000600019821415612f0157612f01612ce4565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a49d12b57b0e96b81212eac6ddd03bebad42c1a8e5d0e5aa8bdcecffcfb0642764736f6c634300080c0033

Deployed Bytecode Sourcemap

39227:772:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15762:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28266:30;;;;;-1:-1:-1;;;;;28266:30:0;;;;;;-1:-1:-1;;;;;780:47:1;;;762:66;;750:2;735:18;28266:30:0;616:218:1;17398:217:0;;;;;;:::i;:::-;;:::i;:::-;;;1460:14:1;;1453:22;1435:41;;1423:2;1408:18;17398:217:0;1295:187:1;35792:329:0;;;;;;:::i;:::-;;:::i;:::-;;24001:101;;;;;;:::i;:::-;;:::i;24380:151::-;;;;;;:::i;:::-;;:::i;29260:1152::-;;;;;;:::i;:::-;;:::i;36384:539::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38062:111::-;;;:::i;35258:202::-;;;;;;:::i;:::-;;:::i;33320:1621::-;;;;;;:::i;:::-;;:::i;:::-;;;6827:25:1;;;6815:2;6800:18;33320:1621:0;6681:177:1;25118:517:0;;;;;;:::i;:::-;;:::i;16046:26::-;;;;;;18016:612;;;;;;:::i;:::-;;:::i;38181:382::-;;;;;;:::i;:::-;;:::i;16397:146::-;;16448:95;16397:146;;15818:31;;;;;;;;8392:4:1;8380:17;;;8362:36;;8350:2;8335:18;15818:31:0;8220:184:1;19856:179:0;;;:::i;24221:151::-;;;;;;:::i;:::-;;:::i;25880:88::-;;;;;;:::i;:::-;;:::i;36129:247::-;;;;;;:::i;:::-;;:::i;37100:70::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;27028:29;;;;;;;;-1:-1:-1;;;;;9283:32:1;;;9265:51;;9253:2;9238:18;27028:29:0;9119:203:1;22101:33:0;;;;;-1:-1:-1;;;22101:33:0;;-1:-1:-1;;;;;22101:33:0;;;22018:39;;;;;35105:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;31069:586;;;;;;:::i;:::-;;:::i;28305:28::-;;;;;-1:-1:-1;;;28305:28:0;;;;;;;;;9754:10:1;9742:23;;;9724:42;;9712:2;9697:18;28305:28:0;9580:192:1;16081:44:0;;;;;;:::i;:::-;;;;;;;;;;;;;;5151:103;;;:::i;21977:32::-;;;;;25976:347;;;;;;:::i;:::-;;:::i;16664:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;31663:1649;;;;;;:::i;:::-;;:::i;4500:87::-;4573:6;;-1:-1:-1;;;;;4573:6:0;4500:87;;37895:159;;;;;;:::i;:::-;;:::i;15789:20::-;;;:::i;24908:202::-;;;;;;:::i;:::-;25001:1;24993:9;;;24964:4;25082:11;;;:8;:11;;;;;;25058:1;25032:3;25025:10;;;25058:6;;;;25082:15;:20;;;24908:202;28816:105;;;;;;:::i;:::-;;:::i;22066:26::-;;;;;-1:-1:-1;;;;;22066:26:0;;;26992:29;;;;;37039:52;;;;;;:::i;:::-;;:::i;17623:385::-;;;;;;:::i;:::-;;:::i;29038:104::-;;;;;;:::i;:::-;;:::i;37392:300::-;;;;;;:::i;:::-;;:::i;24110:99::-;;;;;;:::i;:::-;;:::i;18825:1023::-;;;;;;:::i;:::-;;:::i;35005:53::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;35005:53:0;;;-1:-1:-1;;;35005:53:0;;;;;;;;;;-1:-1:-1;;;;;12135:32:1;;;12117:51;;12211:14;;12204:22;12199:2;12184:18;;12177:50;12090:18;35005:53:0;11949:284:1;30420:641:0;;;;;;:::i;:::-;;:::i;37179:205::-;;;;;;:::i;:::-;;:::i;37853:33::-;;;;;-1:-1:-1;;;;;37853:33:0;;;-1:-1:-1;;;37853:33:0;;;;;;16134:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;28929:101;;;;;;:::i;:::-;;:::i;36978:52::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;36978:52:0;;;-1:-1:-1;;;36978:52:0;;;;;;5409:201;;;;;;:::i;:::-;;:::i;22143:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24799:101;;;;;;:::i;:::-;;:::i;15762:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17398:217::-;17499:10;17472:4;17489:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;17489:30:0;;;;;;;;;;:39;;;17546:37;17472:4;;17489:30;;17546:37;;;;17522:6;6827:25:1;;6815:2;6800:18;;6681:177;17546:37:0;;;;;;;;-1:-1:-1;17603:4:0;17398:217;;;;;:::o;35792:329::-;35885:11;26881:22;26902:1;26826:2;26881:22;:::i;:::-;35899:29;;;;-1:-1:-1;35939:15:0;26982:1;26881:22;26982:1;26826:2;26881:22;:::i;:::-;26956:1;:22;;26955:28;;;;:::i;:::-;35957:8;:27;35939:45;;36013:9;36018:3;36013:4;:9::i;:::-;-1:-1:-1;;;;;36013:17:0;;36031:7;36013:26;;;;;;;;;;;;;6827:25:1;;6815:2;6800:18;;6681:177;36013:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35999:40:0;:10;-1:-1:-1;;;;;35999:40:0;;35995:67;;36048:14;;-1:-1:-1;;;36048:14:0;;;;;;;;;;;35995:67;36073:40;36085:8;36095:10;36107:5;36073:11;:40::i;:::-;35874:247;;35792:329;;;:::o;24001:101::-;4573:6;;-1:-1:-1;;;;;4573:6:0;3248:10;4720:23;4712:68;;;;-1:-1:-1;;;4712:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;24072:15:0::1;;::::0;;;:7:::1;:15;::::0;;;;:22;;-1:-1:-1;;24072:22:0::1;24090:4;24072:22;::::0;;24001:101::o;24380:151::-;24447:10;24439:19;;;;:7;:19;;;;;;;;24434:47;;24467:14;;-1:-1:-1;;;24467:14:0;;;;;;;;;;;24434:47;24492:31;24504:10;24516:6;24492:11;:31::i;:::-;;24380:151;:::o;29260:1152::-;28693:16;;-1:-1:-1;;;28693:16:0;;;;28689:30;;;28711:8;;;28689:30;28730:16;:23;;-1:-1:-1;;;;28730:23:0;-1:-1:-1;;;28730:23:0;;;29383:16;;29422:5;29414:49:::1;;;::::0;-1:-1:-1;;;29414:49:0;;15015:2:1;29414:49:0::1;::::0;::::1;14997:21:1::0;15054:2;15034:18;;;15027:30;15093:33;15073:18;;;15066:61;15144:18;;29414:49:0::1;14813:355:1::0;29414:49:0::1;29506:10;27383:2;29490:46;29478:9;29563::::0;;;:6:::1;:9;::::0;;;;;;27811:29;29599:22;;::::1;29691:5:::0;;::::1;29686:11:::0;::::1;29685:34:::0;;::::1;29680:40:::0;::::1;29668:52:::0;;;29563:9;29599:22;;29232:12;;29789:605:::1;29809:1;29805;:5;29789:605;;;29836:9;29848;29858:1;29848:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;26881:22:0;29968;;::::1;26955:28:::0;30027:20;::::1;30066:9;29968:22:::0;30066:4:::1;:9::i;:::-;:58;::::0;-1:-1:-1;;;30066:58:0;;30089:10:::1;30066:58;::::0;::::1;15677:34:1::0;30109:4:0::1;15727:18:1::0;;;15720:43;15779:18;;;15772:34;;;-1:-1:-1;;;;;30066:22:0;;;::::1;::::0;::::1;::::0;15612:18:1;;30066:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30145:9;30178:1;27439:2;26826;27574:39;27737:3;:20;;;;;:::i;:::-;;30158:1;:16;;;;;:::i;:::-;;30157:22;30198:9;30335::::0;;;:6:::1;:9;::::0;;;;:21;;27439:2:::1;30277:23:::0;;;::::1;30276:40:::0;::::1;27737:20:::0;30211:16;::::1;27574:39:::0;30210:35:::1;30349:6;30335:21:::0;;::::1;::::0;;;-1:-1:-1;;;30375:3:0;;::::1;::::0;29812;;;::::1;::::0;-1:-1:-1;29789:605:0::1;;;-1:-1:-1::0;;28776:16:0;:24;;-1:-1:-1;;;;28776:24:0;;;-1:-1:-1;;;;;;29260:1152:0:o;36384:539::-;36495:16;36561:9;36604:11;36549:9;36672:5;;;36658:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36658:20:0;;36637:41;;36698:9;36693:185;36713:1;36709;:5;36693:185;;;36745:9;36740:123;36760:1;36756;:5;36740:123;;;36806:7;:21;36814:9;;36824:1;36814:12;;;;;;;:::i;:::-;;;;;;;36806:21;;;;;;;;;;;:37;36828:11;;36840:1;36828:14;;;;;;;:::i;:::-;;;;;;;36806:37;;;;;;;;;;;;36791:1;36801;36797;36793;:5;:9;36791:12;;;;;;;;:::i;:::-;;;;;;;;;;:52;36763:3;;36740:123;;;-1:-1:-1;36716:3:0;;36693:185;;;-1:-1:-1;36899:1:0;36384:539;-1:-1:-1;;;;;;;36384:539:0:o;38062:111::-;4573:6;;-1:-1:-1;;;;;4573:6:0;3248:10;4720:23;4712:68;;;;-1:-1:-1;;;4712:68:0;;;;;;;:::i;:::-;38133:4:::1;-1:-1:-1::0;;;;;38125:31:0::1;;38157:7;4573:6:::0;;-1:-1:-1;;;;;4573:6:0;;4500:87;38157:7:::1;38125:40;::::0;-1:-1:-1;;;;;;38125:40:0::1;::::0;;;;;;-1:-1:-1;;;;;9283:32:1;;;38125:40:0::1;::::0;::::1;9265:51:1::0;9238:18;;38125:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38062:111::o:0;35258:202::-;4573:6;;-1:-1:-1;;;;;4573:6:0;3248:10;4720:23;4712:68;;;;-1:-1:-1;;;4712:68:0;;;;;;;:::i;:::-;35361:25:::1;::::0;;;:13:::1;:25;::::0;;;;;35411:41;::::1;;-1:-1:-1::0;;;35411:41:0::1;-1:-1:-1::0;;;;;35361:39:0;;::::1;35411:41;::::0;;35258:202::o;33320:1621::-;28693:16;;33429:7;;-1:-1:-1;;;28693:16:0;;;;28689:30;;;28711:8;;;28689:30;28730:16;:23;;-1:-1:-1;;;;28730:23:0;-1:-1:-1;;;28730:23:0;;;33502:10:::1;27383:2;33486:46;-1:-1:-1::0;33559:9:0;;;:6:::1;:9;::::0;;;;;27811:29;33559:30:::1;::::0;33637:17;;::::1;;::::0;:39:::1;;-1:-1:-1::0;33658:18:0;;::::1;;33637:39;33633:83;;;33702:14;;-1:-1:-1::0;;;33702:14:0::1;;;;;;;;;;;33633:83;33813:14;::::0;33857:16:::1;::::0;29232:12;;-1:-1:-1;;;33813:14:0;::::1;;;::::0;33745:20:::1;33902:919;33922:1;33918;:5;33902:919;;;33949:22;33974:6;;33981:1;33974:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;33949:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34002:12;34017:5;;34023:1;34017:8;;;;;;;:::i;:::-;;;;;;;34002:23;;34044:9;34077:1;27439:2;26826;27574:39;27737:3;:20;;;;;:::i;:::-;;34057:1;:16;;;;;:::i;:::-;;34056:22;34097:9;34176::::0;;;:6:::1;:9;::::0;;;;;34056:22;;-1:-1:-1;27574:39:0;27737:20;34110:16;::::1;34109:35;::::0;27663:25;34176:14;;::::1;34175:32:::0;;::::1;::::0;27494:29;34263:21;;;27439:2:::1;34322:23:::0;;;34386:16;;::::1;-1:-1:-1::0;;34382:45:0::1;;;34419:8;;;;;;;;;34382:45;34453:98;34472:5;34479:4;34534:8;34544:4;34517:32;;;;;;;;16524:19:1::0;;;16568:2;16559:12;;16552:28;16605:2;16596:12;;16367:247;34517:32:0::1;;;;;;;;;;;;;34507:43;;;;;;34453:18;:98::i;:::-;34448:148;;34582:14;;-1:-1:-1::0;;;34582:14:0::1;;;;;;;;;;;34448:148;34680:9;34758::::0;;;:6:::1;:9;::::0;;;;;:27;;27439:2:::1;34693:30:::0;;;::::1;34692:47:::0;::::1;34773:5:::0;;;::::1;34772:12:::0;;::::1;34758:27:::0;;::::1;::::0;;;34635:23;::::1;34627:32;34617:42:::0;;;::::1;::::0;-1:-1:-1;33902:919:0::1;33925:3;;33902:919;;;-1:-1:-1::0;34845:15:0::1;::::0;-1:-1:-1;;;;;34845:15:0::1;34835:25:::0;;;::::1;::::0;34884:38:::1;34903:10;34835:25:::0;34884:18:::1;:38::i;:::-;28776:16:::0;:24;;-1:-1:-1;;;;28776:24:0;;;34877:45;33320:1621;-1:-1:-1;;;;;;;;;;;33320:1621:0:o;25118:517::-;25241:1;25233:9;;;25221;25323:11;;;:8;:11;;;;;;25272:3;25265:10;;;25298:1;:6;;;25323:15;;:20;25315:49;;;;-1:-1:-1;;;25315:49:0;;16821:2:1;25315:49:0;;;16803:21:1;16860:2;16840:18;;;16833:30;-1:-1:-1;;;16879:18:1;;;16872:46;16935:18;;25315:49:0;16619:340:1;25315:49:0;25400:34;;-1:-1:-1;;;;;;17169:2:1;17165:15;;;17161:53;25400:34:0;;;17149:66:1;17231:12;;;17224:28;;;17268:12;;;17261:28;;;25375:12:0;;17305::1;;25400:34:0;;;;;;;;;;;;25390:45;;;;;;25375:60;;25446:16;25465:49;25484:5;;25465:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25491:16:0;;;-1:-1:-1;25509:4:0;;-1:-1:-1;25465:18:0;:49::i;:::-;25446:68;;25530:11;25525:39;;25550:14;;-1:-1:-1;;;25550:14:0;;;;;;;;;;;25525:39;25575:11;;;;:8;:11;;;;;:16;;;;;;25604:23;25616:2;25620:6;25604:11;:23::i;:::-;;25210:425;;;;;25118:517;;;;;:::o;18016:612::-;-1:-1:-1;;;;;18173:15:0;;18138:4;18173:15;;;:9;:15;;;;;;;;18189:10;18173:27;;;;;;;;-1:-1:-1;;18253:28:0;;18249:80;;18313:16;18323:6;18313:7;:16;:::i;:::-;-1:-1:-1;;;;;18283:15:0;;;;;;:9;:15;;;;;;;;18299:10;18283:27;;;;;;;:46;18249:80;-1:-1:-1;;;;;18342:15:0;;;;;;:9;:15;;;;;:25;;18361:6;;18342:15;:25;;18361:6;;18342:25;:::i;:::-;;;;-1:-1:-1;;;;;;;18518:13:0;;;;;;;:9;:13;;;;;;;:23;;;;;;18570:26;18518:13;;18570:26;;;-1:-1:-1;;;;;;;;;;;18570:26:0;;;18535:6;6827:25:1;;6815:2;6800:18;;6681:177;18570:26:0;;;;;;;;-1:-1:-1;18616:4:0;;18016:612;-1:-1:-1;;;;18016:612:0:o;38181:382::-;38243:13;:20;-1:-1:-1;;;38243:20:0;;;;38238:45;;38272:11;;-1:-1:-1;;;38272:11:0;;;;;;;;;;;38238:45;38299:13;:19;38294:37;;38299:31;;38321:9;;-1:-1:-1;;;;;38299:19:0;:31;:::i;38294:37::-;38344:18;38379:9;38365:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38365:24:0;;38344:45;;38430:6;38425:85;38442:9;38438:1;:13;38425:85;;;38484:10;38477:1;38479;38477:4;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38477:17:0;;;:4;;;;;;;;;;;:17;38453:3;;38425:85;;;-1:-1:-1;38531:24:0;;-1:-1:-1;;;38531:24:0;;-1:-1:-1;;;;;38537:4:0;38531:21;;;;:24;;38553:1;;38531:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38227:336;38181:382;:::o;19856:179::-;19913:7;19957:16;19940:13;:33;:87;;20003:24;:22;:24::i;:::-;19933:94;;19856:179;:::o;19940:87::-;-1:-1:-1;19976:24:0;;19856:179::o;24221:151::-;24296:10;24288:19;;;;:7;:19;;;;;;;;24283:47;;24316:14;;-1:-1:-1;;;24316:14:0;;;;;;;;;;;24283:47;24341:23;24353:2;24357:6;24341:11;:23::i;:::-;;24221:151;;:::o;25880:88::-;25928:32;25941:10;25953:6;25928:12;:32::i;:::-;25880:88;:::o;36129:247::-;36286:8;36247:35;36264:10;36276:5;36247:16;:35::i;:::-;:47;36243:74;;36303:14;;-1:-1:-1;;;36303:14:0;;;;;;;;;;;36243:74;36328:40;36340:8;36350:10;36362:5;36328:11;:40::i;31069:586::-;27383:2;31235:41;;;-1:-1:-1;;;;;;31235:41:0;31146:7;31303:9;;;:6;:9;;;;;;31146:7;;31203:5;;27811:29;31339:22;;;31380:6;;;31376:37;;31395:18;;-1:-1:-1;;;31395:18:0;;;;;;;;;;;31376:37;-1:-1:-1;;27737:20:0;31441:16;;;31440:22;;;;31428:9;31552;;;:6;:9;;;;;;27574:39;31490:16;;;;31489:35;31552:14;27439:2;31605:23;;;;;-1:-1:-1;;;31069:586:0:o;5151:103::-;4573:6;;-1:-1:-1;;;;;4573:6:0;3248:10;4720:23;4712:68;;;;-1:-1:-1;;;4712:68:0;;;;;;;:::i;:::-;5216:30:::1;5243:1;5216:18;:30::i;:::-;5151:103::o:0;25976:347::-;-1:-1:-1;;;;;26072:18:0;;26045:24;26072:18;;;:9;:18;;;;;;;;26091:10;26072:30;;;;;;;;26121:26;;;;26113:75;;;;-1:-1:-1;;;26113:75:0;;18366:2:1;26113:75:0;;;18348:21:1;18405:2;18385:18;;;18378:30;18444:34;18424:18;;;18417:62;-1:-1:-1;;;18495:18:1;;;18488:34;18539:19;;26113:75:0;18164:400:1;26113:75:0;-1:-1:-1;;;;;26224:18:0;;;;;;:9;:18;;;;;;;;26243:10;26224:30;;;;;;;:40;;;;;;;26286:29;26234:7;26258:6;26286:12;:29::i;31663:1649::-;28693:16;;-1:-1:-1;;;28693:16:0;;;;28689:30;;;28711:8;;;28689:30;28730:16;:23;;-1:-1:-1;;;;28730:23:0;-1:-1:-1;;;28730:23:0;;;31823:10:::1;27383:2;31807:46;-1:-1:-1::0;31880:9:0;;;:6:::1;:9;::::0;;;;;27811:29;31916:22;;::::1;31963:14:::0;;::::1;31959:45;;31986:18;;-1:-1:-1::0;;;31986:18:0::1;;;;;;;;;;;31959:45;32031:7:::0;32068:5;32060:49:::1;;;::::0;-1:-1:-1;;;32060:49:0;;15015:2:1;32060:49:0::1;::::0;::::1;14997:21:1::0;15054:2;15034:18;;;15027:30;15093:33;15073:18;;;15066:61;15144:18;;32060:49:0::1;14813:355:1::0;32060:49:0::1;32132:1;32128;:5;32124:36;;;32142:18;;-1:-1:-1::0;;;32142:18:0::1;;;;;;;;;;;32124:36;32177:9;::::0;;;:6:::1;:9;::::0;;;;32200:5;;::::1;32195:11:::0;::::1;27811:29:::0;32194:34:::1;32189:40:::0;::::1;32177:52:::0;;-1:-1:-1;;32256:17:0;32288:1006:::1;32308:1;32304;:5;32288:1006;;;32335:9;32347:7;;32355:1;32347:10;;;;;;;:::i;:::-;;;;;;;32335:22;;32385:1;32380;:6;;:16;;;;32395:1;32390;:6;;32380:16;32376:47;;;32405:18;;-1:-1:-1::0;;;32405:18:0::1;;;;;;;;;;;32376:47;27737:20:::0;32455:16;;::::1;32454:22:::0;::::1;32442:9;32574::::0;;;:6:::1;:9;::::0;;;;;32454:22;;27574:39;32508:16;;::::1;32507:35;::::0;32574:14;::::1;27663:25:::0;32573:32;::::1;::::0;32661:23;27439:2:::1;32661:23:::0;;;;;;;32792:29;;27687:1:::1;32792:29:::0;;26955:28;32858:27;32904:9:::1;32792:29:::0;32904:4:::1;:9::i;:::-;:58;::::0;-1:-1:-1;;;32904:58:0;;32935:4:::1;32904:58;::::0;::::1;15677:34:1::0;32942:10:0::1;15727:18:1::0;;;15720:43;15779:18;;;15772:34;;;-1:-1:-1;;;;;32904:22:0;;;::::1;::::0;::::1;::::0;15612:18:1;;32904:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;32983:3:0;;;;;-1:-1:-1;33005:9:0::1;33038:1:::0;27737:20;32983:3;33018:16:::1;33017:22;::::0;-1:-1:-1;33058:9:0::1;27574:39:::0;27737:20;33071:1;33124:9:::1;33137::::0;;;:6:::1;:9;::::0;;;;;;;33187;;;;;;:27;;33071:16;;;::::1;33070:35:::0;;;::::1;33137:14:::0;;::::1;27663:25:::0;33136:32:::1;33202:5:::0;;::::1;33201:12:::0;;::::1;33187:27:::0;;;::::1;::::0;;33233:9;;;;:21;;33247:6;;;::::1;33233:21:::0;;;::::1;::::0;;;-1:-1:-1;33277:1:0;;-1:-1:-1;;;27687:1:0::1;32311:3:::0;;;::::1;::::0;-1:-1:-1;32288:1006:0::1;;;-1:-1:-1::0;;28776:16:0;:24;;-1:-1:-1;;;;28776:24:0;;;-1:-1:-1;;;;;;;31663:1649:0:o;37895:159::-;4573:6;;-1:-1:-1;;;;;4573:6:0;3248:10;4720:23;4712:68;;;;-1:-1:-1;;;4712:68:0;;;;;;;:::i;:::-;38017:29:::1;;-1:-1:-1::0;;;38017:29:0::1;-1:-1:-1::0;;;;;37979:27:0;;::::1;38017:29;37979:13;38017:29:::0;37895:159::o;15789:20::-;;;;;;;:::i;28816:105::-;4573:6;;-1:-1:-1;;;;;4573:6:0;3248:10;4720:23;4712:68;;;;-1:-1:-1;;;4712:68:0;;;;;;;:::i;:::-;28889:16:::1;:24:::0;28816:105::o;37039:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37039:52:0;;-1:-1:-1;37039:52:0;;-1:-1:-1;37039:52:0:o;17623:385::-;17720:10;17693:4;17710:21;;;:9;:21;;;;;:31;;17735:6;;17710:21;17693:4;;17710:31;;17735:6;;17710:31;:::i;:::-;;;;-1:-1:-1;;;;;;;17892:13:0;;;;;;:9;:13;;;;;;;:23;;;;;;17944:32;17953:10;;-1:-1:-1;;;;;;;;;;;17944:32:0;;;17909:6;6827:25:1;;6815:2;6800:18;;6681:177;29038:104:0;4573:6;;-1:-1:-1;;;;;4573:6:0;3248:10;4720:23;4712:68;;;;-1:-1:-1;;;4712:68:0;;;;;;;:::i;:::-;29111:15:::1;:23:::0;;-1:-1:-1;;;;;;29111:23:0::1;-1:-1:-1::0;;;;;29111:23:0;;;::::1;::::0;;;::::1;::::0;;29038:104::o;37392:300::-;37461:26;;;;:12;:26;;;;;:33;-1:-1:-1;;;37461:33:0;;;;37456:58;;37503:11;;-1:-1:-1;;;37503:11:0;;;;;;;;;;;37456:58;37530:26;;;;:12;:26;;;;;:32;37525:38;;-1:-1:-1;;;;;37530:32:0;37525:4;:38::i;:::-;37576:29;;;;:15;:29;;;;;;;;:46;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37576:46:0;37611:10;37576:46;;;;;;37633:32;;;:18;:32;;;;;:44;;;;;;;;;:51;;-1:-1:-1;;37633:51:0;;;;;;37392:300::o;24110:99::-;4573:6;;-1:-1:-1;;;;;4573:6:0;3248:10;4720:23;4712:68;;;;-1:-1:-1;;;4712:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24178:15:0::1;24196:5;24178:15:::0;;;:7:::1;:15;::::0;;;;:23;;-1:-1:-1;;24178:23:0::1;::::0;;24110:99::o;18825:1023::-;19053:15;19041:8;:27;;19033:63;;;;-1:-1:-1;;;19033:63:0;;18771:2:1;19033:63:0;;;18753:21:1;18810:2;18790:18;;;18783:30;18849:25;18829:18;;;18822:53;18892:18;;19033:63:0;18569:347:1;19033:63:0;19266:14;19383:18;:16;:18::i;:::-;-1:-1:-1;;;;;19485:13:0;;;;;;;:6;:13;;;;;;;;;:15;;;;;;;;19434:77;;16448:95;19434:77;;;19208:25:1;19287:18;;;19280:43;;;;19359:15;;;19339:18;;;19332:43;19391:18;;;19384:34;;;19434:19;;;19427:35;;;;19478:19;;;;19471:35;;;19434:77:0;;;;;;;;;;19180:19:1;;;19434:77:0;;;19424:88;;;;;;;;-1:-1:-1;;;19311:220:0;;;19775:27:1;19818:11;;;19811:27;;;;19854:12;;;19847:28;;;;19891:12;;19311:220:0;;;-1:-1:-1;;19311:220:0;;;;;;;;;19283:263;;19311:220;19283:263;;;;19563:24;19590:26;;;;;;;;;20141:25:1;;;20214:4;20202:17;;20182:18;;;20175:45;;;;20236:18;;;20229:34;;;20279:18;;;20272:34;;;19283:263:0;;-1:-1:-1;19563:24:0;19590:26;;20113:19:1;;19590:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19590:26:0;;-1:-1:-1;;19590:26:0;;;-1:-1:-1;;;;;;;19641:30:0;;;;;;:59;;;19695:5;-1:-1:-1;;;;;19675:25:0;:16;-1:-1:-1;;;;;19675:25:0;;19641:59;19633:86;;;;-1:-1:-1;;;19633:86:0;;20519:2:1;19633:86:0;;;20501:21:1;20558:2;20538:18;;;20531:30;-1:-1:-1;;;20577:18:1;;;20570:44;20631:18;;19633:86:0;20317:338:1;19633:86:0;-1:-1:-1;;;;;19736:27:0;;;;;;;:9;:27;;;;;;;;:36;;;;;;;;;;;;;:44;;;19809:31;6827:25:1;;;19736:36:0;;-1:-1:-1;19809:31:0;;;;;;6800:18:1;19809:31:0;;;;;;;18825:1023;;;;;;;:::o;30420:641::-;30484:16;30550:41;;;-1:-1:-1;;;;;;30550:41:0;30538:9;30618;;;:6;:9;;;;;;;27811:29;30654:22;;;;;30714:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30714:16:0;;30693:37;;30750:9;30745:275;30765:1;30761;:5;30745:275;;;27737:20;30805:16;;;30804:22;;30792:9;30924;;;:6;:9;;;;;;30974:4;;30804:22;;27574:39;30858:16;;;30857:35;;27663:25;30924:14;;;30923:32;;;;27439:2;30981:23;;;;30974:4;;30805:16;;30974:4;;;;;;:::i;:::-;;;;;;:30;;;;;30773:247;;;30768:3;;;;;30745:275;;;-1:-1:-1;31041:1:0;30420:641;-1:-1:-1;;;;;30420:641:0:o;37179:205::-;4573:6;;-1:-1:-1;;;;;4573:6:0;3248:10;4720:23;4712:68;;;;-1:-1:-1;;;4712:68:0;;;;;;;:::i;:::-;37283:26:::1;::::0;;;:12:::1;:26;::::0;;;;;37334:42;::::1;;-1:-1:-1::0;;;37334:42:0::1;-1:-1:-1::0;;;;;37283:40:0;;::::1;37334:42;::::0;;37179:205::o;28929:101::-;4573:6;;-1:-1:-1;;;;;4573:6:0;3248:10;4720:23;4712:68;;;;-1:-1:-1;;;4712:68:0;;;;;;;:::i;:::-;29000:14:::1;:22:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;29000:22:0::1;-1:-1:-1::0;;;;29000:22:0;;::::1;::::0;;;::::1;::::0;;28929:101::o;5409:201::-;4573:6;;-1:-1:-1;;;;;4573:6:0;3248:10;4720:23;4712:68;;;;-1:-1:-1;;;4712:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5498:22:0;::::1;5490:73;;;::::0;-1:-1:-1;;;5490:73:0;;20862:2:1;5490:73:0::1;::::0;::::1;20844:21:1::0;20901:2;20881:18;;;20874:30;20940:34;20920:18;;;20913:62;-1:-1:-1;;;20991:18:1;;;20984:36;21037:19;;5490:73:0::1;20660:402:1::0;5490:73:0::1;5574:28;5593:8;5574:18;:28::i;24799:101::-:0;4573:6;;-1:-1:-1;;;;;4573:6:0;3248:10;4720:23;4712:68;;;;-1:-1:-1;;;4712:68:0;;;;;;;:::i;:::-;24869:16:::1;:23:::0;24799:101::o;27170:116::-;27220:7;27255:8;;:22;;27273:4;27255:22;;;27266:4;27240:38;27170:116;-1:-1:-1;;27170:116:0:o;35468:316::-;35567:25;;;;:13;:25;;;;;:32;-1:-1:-1;;;35567:32:0;;;;35562:57;;35608:11;;-1:-1:-1;;;35608:11:0;;;;;;;;;;;35562:57;35635:25;;;;:13;:25;;;;;:31;35630:37;;-1:-1:-1;;;;;35635:31:0;35630:4;:37::i;:::-;35680:17;;;;:7;:17;;;;;;;;:29;;;;;;;;;:37;;;35733:43;;21269:25:1;;;21310:18;;;21303:34;;;21353:18;;;21346:34;;;35733:43:0;;21257:2:1;21242:18;35733:43:0;;;;;;;35468:316;;;:::o;22423:761::-;22490:7;22514:11;22510:25;;-1:-1:-1;22534:1:0;22527:8;;22510:25;22609:11;;22546:12;;-1:-1:-1;;;;;22609:11:0;;;;22650:13;;;;22682:26;;22678:40;;;22710:8;;;22678:40;22744:7;22737:4;:14;22733:158;;;-1:-1:-1;22828:7:0;22733:158;22919:4;22912;:11;22905:18;;22977:4;22985:1;22977:9;22973:45;;;22995:23;;-1:-1:-1;;;22995:23:0;;;;;;;;;;;22973:45;-1:-1:-1;;;;;23037:24:0;;23033:38;;;23063:8;;;23033:38;23086:11;:27;;-1:-1:-1;;;;;;23086:27:0;-1:-1:-1;;;;;23086:27:0;;;;;;;;;;-1:-1:-1;23139:15:0;23145:2;23149:4;23139:5;:15::i;:::-;23172:4;22423:761;-1:-1:-1;;;22423:761:0:o;1023:190::-;1148:4;1201;1172:25;1185:5;1192:4;1172:12;:25::i;:::-;:33;;1023:190;-1:-1:-1;;;;1023:190:0:o;23192:801::-;23266:7;23290:11;23286:25;;-1:-1:-1;23310:1:0;23303:8;;23286:25;23385:18;;23322:12;;-1:-1:-1;;;;;;;;23385:18:0;;;;;;23433:13;;;;23465:26;;23461:40;;;23493:8;;;23461:40;23527:14;23520:4;:21;23516:186;;;-1:-1:-1;23625:14:0;23516:186;23730:4;23723;:11;23716:18;;23788:4;23796:1;23788:9;23784:45;;;23806:23;;-1:-1:-1;;;23806:23:0;;;;;;;;;;;23784:45;-1:-1:-1;;;;;23848:24:0;;23844:38;;;23874:8;;;23844:38;23897:18;:34;;-1:-1:-1;;;;;23897:34:0;;;-1:-1:-1;;;23897:34:0;;;;;;;;;-1:-1:-1;23964:21:0;23976:2;23980:4;23964:11;:21::i;:::-;23957:28;23192:801;-1:-1:-1;;;;23192:801:0:o;20043:457::-;20108:7;20209:95;20343:4;20327:22;;;;;;:::i;:::-;;;;;;;;;;20176:301;;;22888:25:1;;;;22929:18;;22922:34;;;;20372:14:0;22972:18:1;;;22965:34;20409:13:0;23015:18:1;;;23008:34;20453:4:0;23058:19:1;;;23051:61;22860:19;;20176:301:0;;;;;;;;;;;;20148:344;;;;;;20128:364;;20043:457;:::o;25694:178::-;-1:-1:-1;;;;;25777:18:0;;;;;;:9;:18;;;;;;:28;-1:-1:-1;25777:28:0;25769:62;;;;-1:-1:-1;;;25769:62:0;;23325:2:1;25769:62:0;;;23307:21:1;23364:2;23344:18;;;23337:30;-1:-1:-1;;;23383:18:1;;;23376:51;23444:18;;25769:62:0;23123:345:1;25769:62:0;25842:22;25848:7;25857:6;25842:5;:22::i;5770:191::-;5863:6;;;-1:-1:-1;;;;;5880:17:0;;;-1:-1:-1;;;;;;5880:17:0;;;;;;;5913:40;;5863:6;;;5880:17;5863:6;;5913:40;;5844:16;;5913:40;5833:128;5770:191;:::o;20700:335::-;20786:6;20771:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;20943:13:0;;;;;;:9;:13;;;;;;;;:23;;;;;;20995:32;6827:25:1;;;-1:-1:-1;;;;;;;;;;;20995:32:0;6800:18:1;20995:32:0;;;;;;;;20700:335;;:::o;1575:675::-;1658:7;1701:4;1658:7;1716:497;1740:5;:12;1736:1;:16;1716:497;;;1774:20;1797:5;1803:1;1797:8;;;;;;;;:::i;:::-;;;;;;;1774:31;;1840:12;1824;:28;1820:382;;2326:13;2376:15;;;2412:4;2405:15;;;2459:4;2443:21;;1952:57;;1820:382;;;2326:13;2376:15;;;2412:4;2405:15;;;2459:4;2443:21;;2129:57;;1820:382;-1:-1:-1;1754:3:0;;;;:::i;:::-;;;;1716:497;;;-1:-1:-1;2230:12:0;1575:675;-1:-1:-1;;;1575:675:0:o;21043:338::-;-1:-1:-1;;;;;21116:15:0;;;;;;:9;:15;;;;;:25;;21135:6;;21116:15;:25;;21135:6;;21116:25;:::i;:::-;;;;-1:-1:-1;;21289:11:0;:21;;;;;;;21339:34;;6827:25:1;;;-1:-1:-1;;;;;;;21339:34:0;;;-1:-1:-1;;;;;;;;;;;21339:34:0;6815:2:1;6800:18;21339:34:0;6681:177:1;14:597;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;839:131::-;-1:-1:-1;;;;;914:31:1;;904:42;;894:70;;960:1;957;950:12;975:315;1043:6;1051;1104:2;1092:9;1083:7;1079:23;1075:32;1072:52;;;1120:1;1117;1110:12;1072:52;1159:9;1146:23;1178:31;1203:5;1178:31;:::i;:::-;1228:5;1280:2;1265:18;;;;1252:32;;-1:-1:-1;;;975:315:1:o;1487:316::-;1564:6;1572;1580;1633:2;1621:9;1612:7;1608:23;1604:32;1601:52;;;1649:1;1646;1639:12;1601:52;-1:-1:-1;;1672:23:1;;;1742:2;1727:18;;1714:32;;-1:-1:-1;1793:2:1;1778:18;;;1765:32;;1487:316;-1:-1:-1;1487:316:1:o;1808:247::-;1867:6;1920:2;1908:9;1899:7;1895:23;1891:32;1888:52;;;1936:1;1933;1926:12;1888:52;1975:9;1962:23;1994:31;2019:5;1994:31;:::i;2060:180::-;2119:6;2172:2;2160:9;2151:7;2147:23;2143:32;2140:52;;;2188:1;2185;2178:12;2140:52;-1:-1:-1;2211:23:1;;2060:180;-1:-1:-1;2060:180:1:o;2245:127::-;2306:10;2301:3;2297:20;2294:1;2287:31;2337:4;2334:1;2327:15;2361:4;2358:1;2351:15;2377:1115;2461:6;2492:2;2535;2523:9;2514:7;2510:23;2506:32;2503:52;;;2551:1;2548;2541:12;2503:52;2591:9;2578:23;2620:18;2661:2;2653:6;2650:14;2647:34;;;2677:1;2674;2667:12;2647:34;2715:6;2704:9;2700:22;2690:32;;2760:7;2753:4;2749:2;2745:13;2741:27;2731:55;;2782:1;2779;2772:12;2731:55;2818:2;2805:16;2840:2;2836;2833:10;2830:36;;;2846:18;;:::i;:::-;2892:2;2889:1;2885:10;2924:2;2918:9;2987:2;2983:7;2978:2;2974;2970:11;2966:25;2958:6;2954:38;3042:6;3030:10;3027:22;3022:2;3010:10;3007:18;3004:46;3001:72;;;3053:18;;:::i;:::-;3089:2;3082:22;3139:18;;;3173:15;;;;-1:-1:-1;3215:11:1;;;3211:20;;;3243:19;;;3240:39;;;3275:1;3272;3265:12;3240:39;3299:11;;;;3319:142;3335:6;3330:3;3327:15;3319:142;;;3401:17;;3389:30;;3352:12;;;;3439;;;;3319:142;;;3480:6;2377:1115;-1:-1:-1;;;;;;;;2377:1115:1:o;3497:367::-;3560:8;3570:6;3624:3;3617:4;3609:6;3605:17;3601:27;3591:55;;3642:1;3639;3632:12;3591:55;-1:-1:-1;3665:20:1;;3708:18;3697:30;;3694:50;;;3740:1;3737;3730:12;3694:50;3777:4;3769:6;3765:17;3753:29;;3837:3;3830:4;3820:6;3817:1;3813:14;3805:6;3801:27;3797:38;3794:47;3791:67;;;3854:1;3851;3844:12;3791:67;3497:367;;;;;:::o;3869:773::-;3991:6;3999;4007;4015;4068:2;4056:9;4047:7;4043:23;4039:32;4036:52;;;4084:1;4081;4074:12;4036:52;4124:9;4111:23;4153:18;4194:2;4186:6;4183:14;4180:34;;;4210:1;4207;4200:12;4180:34;4249:70;4311:7;4302:6;4291:9;4287:22;4249:70;:::i;:::-;4338:8;;-1:-1:-1;4223:96:1;-1:-1:-1;4426:2:1;4411:18;;4398:32;;-1:-1:-1;4442:16:1;;;4439:36;;;4471:1;4468;4461:12;4439:36;;4510:72;4574:7;4563:8;4552:9;4548:24;4510:72;:::i;:::-;3869:773;;;;-1:-1:-1;4601:8:1;-1:-1:-1;;;;3869:773:1:o;4647:632::-;4818:2;4870:21;;;4940:13;;4843:18;;;4962:22;;;4789:4;;4818:2;5041:15;;;;5015:2;5000:18;;;4789:4;5084:169;5098:6;5095:1;5092:13;5084:169;;;5159:13;;5147:26;;5228:15;;;;5193:12;;;;5120:1;5113:9;5084:169;;;-1:-1:-1;5270:3:1;;4647:632;-1:-1:-1;;;;;;4647:632:1:o;5284:160::-;5349:20;;5405:13;;5398:21;5388:32;;5378:60;;5434:1;5431;5424:12;5378:60;5284:160;;;:::o;5449:422::-;5523:6;5531;5539;5592:2;5580:9;5571:7;5567:23;5563:32;5560:52;;;5608:1;5605;5598:12;5560:52;5631:23;;;-1:-1:-1;5704:2:1;5689:18;;5676:32;-1:-1:-1;;;;;5737:31:1;;5727:42;;5717:70;;5783:1;5780;5773:12;5717:70;5806:5;-1:-1:-1;5830:35:1;5861:2;5846:18;;5830:35;:::i;:::-;5820:45;;5449:422;;;;;:::o;6863:709::-;6976:6;6984;6992;7000;7008;7061:3;7049:9;7040:7;7036:23;7032:33;7029:53;;;7078:1;7075;7068:12;7029:53;7117:9;7104:23;7136:31;7161:5;7136:31;:::i;:::-;7186:5;-1:-1:-1;7238:2:1;7223:18;;7210:32;;-1:-1:-1;7289:2:1;7274:18;;7261:32;;-1:-1:-1;7344:2:1;7329:18;;7316:32;7371:18;7360:30;;7357:50;;;7403:1;7400;7393:12;7357:50;7442:70;7504:7;7495:6;7484:9;7480:22;7442:70;:::i;:::-;6863:709;;;;-1:-1:-1;6863:709:1;;-1:-1:-1;7531:8:1;;7416:96;6863:709;-1:-1:-1;;;6863:709:1:o;7577:456::-;7654:6;7662;7670;7723:2;7711:9;7702:7;7698:23;7694:32;7691:52;;;7739:1;7736;7729:12;7691:52;7778:9;7765:23;7797:31;7822:5;7797:31;:::i;:::-;7847:5;-1:-1:-1;7904:2:1;7889:18;;7876:32;7917:33;7876:32;7917:33;:::i;:::-;7577:456;;7969:7;;-1:-1:-1;;;8023:2:1;8008:18;;;;7995:32;;7577:456::o;8409:385::-;8495:6;8503;8511;8519;8572:3;8560:9;8551:7;8547:23;8543:33;8540:53;;;8589:1;8586;8579:12;8540:53;-1:-1:-1;;8612:23:1;;;8682:2;8667:18;;8654:32;;-1:-1:-1;8733:2:1;8718:18;;8705:32;;8784:2;8769:18;8756:32;;-1:-1:-1;8409:385:1;-1:-1:-1;8409:385:1:o;8799:315::-;8867:6;8875;8928:2;8916:9;8907:7;8903:23;8899:32;8896:52;;;8944:1;8941;8934:12;8896:52;8980:9;8967:23;8957:33;;9040:2;9029:9;9025:18;9012:32;9053:31;9078:5;9053:31;:::i;:::-;9103:5;9093:15;;;8799:315;;;;;:::o;9327:248::-;9395:6;9403;9456:2;9444:9;9435:7;9431:23;9427:32;9424:52;;;9472:1;9469;9462:12;9424:52;-1:-1:-1;;9495:23:1;;;9565:2;9550:18;;;9537:32;;-1:-1:-1;9327:248:1:o;9777:505::-;9872:6;9880;9888;9941:2;9929:9;9920:7;9916:23;9912:32;9909:52;;;9957:1;9954;9947:12;9909:52;9997:9;9984:23;10030:18;10022:6;10019:30;10016:50;;;10062:1;10059;10052:12;10016:50;10101:70;10163:7;10154:6;10143:9;10139:22;10101:70;:::i;:::-;10190:8;;10075:96;;-1:-1:-1;10272:2:1;10257:18;;;;10244:32;;9777:505;-1:-1:-1;;;;9777:505:1:o;10287:188::-;10355:20;;-1:-1:-1;;;;;10404:46:1;;10394:57;;10384:85;;10465:1;10462;10455:12;10480:254;10545:6;10553;10606:2;10594:9;10585:7;10581:23;10577:32;10574:52;;;10622:1;10619;10612:12;10574:52;10645:29;10664:9;10645:29;:::i;:::-;10635:39;;10693:35;10724:2;10713:9;10709:18;10693:35;:::i;:::-;10683:45;;10480:254;;;;;:::o;10924:186::-;10983:6;11036:2;11024:9;11015:7;11011:23;11007:32;11004:52;;;11052:1;11049;11042:12;11004:52;11075:29;11094:9;11075:29;:::i;11115:829::-;11226:6;11234;11242;11250;11258;11266;11274;11327:3;11315:9;11306:7;11302:23;11298:33;11295:53;;;11344:1;11341;11334:12;11295:53;11383:9;11370:23;11402:31;11427:5;11402:31;:::i;:::-;11452:5;-1:-1:-1;11509:2:1;11494:18;;11481:32;11522:33;11481:32;11522:33;:::i;:::-;11574:7;-1:-1:-1;11628:2:1;11613:18;;11600:32;;-1:-1:-1;11679:2:1;11664:18;;11651:32;;-1:-1:-1;11735:3:1;11720:19;;11707:33;11784:4;11771:18;;11759:31;;11749:59;;11804:1;11801;11794:12;11749:59;11115:829;;;;-1:-1:-1;11115:829:1;;;;11827:7;11881:3;11866:19;;11853:33;;-1:-1:-1;11933:3:1;11918:19;;;11905:33;;11115:829;-1:-1:-1;;11115:829:1:o;12875:388::-;12943:6;12951;13004:2;12992:9;12983:7;12979:23;12975:32;12972:52;;;13020:1;13017;13010:12;12972:52;13059:9;13046:23;13078:31;13103:5;13078:31;:::i;:::-;13128:5;-1:-1:-1;13185:2:1;13170:18;;13157:32;13198:33;13157:32;13198:33;:::i;13268:276::-;13326:6;13379:2;13367:9;13358:7;13354:23;13350:32;13347:52;;;13395:1;13392;13385:12;13347:52;13434:9;13421:23;13484:10;13477:5;13473:22;13466:5;13463:33;13453:61;;13510:1;13507;13500:12;13549:380;13628:1;13624:12;;;;13671;;;13692:61;;13746:4;13738:6;13734:17;13724:27;;13692:61;13799:2;13791:6;13788:14;13768:18;13765:38;13762:161;;;13845:10;13840:3;13836:20;13833:1;13826:31;13880:4;13877:1;13870:15;13908:4;13905:1;13898:15;13762:161;;13549:380;;;:::o;13934:127::-;13995:10;13990:3;13986:20;13983:1;13976:31;14026:4;14023:1;14016:15;14050:4;14047:1;14040:15;14066:125;14106:4;14134:1;14131;14128:8;14125:34;;;14139:18;;:::i;:::-;-1:-1:-1;14176:9:1;;14066:125::o;14196:251::-;14266:6;14319:2;14307:9;14298:7;14294:23;14290:32;14287:52;;;14335:1;14332;14325:12;14287:52;14367:9;14361:16;14386:31;14411:5;14386:31;:::i;14452:356::-;14654:2;14636:21;;;14673:18;;;14666:30;14732:34;14727:2;14712:18;;14705:62;14799:2;14784:18;;14452:356::o;15173:127::-;15234:10;15229:3;15225:20;15222:1;15215:31;15265:4;15262:1;15255:15;15289:4;15286:1;15279:15;15305:127;15366:10;15361:3;15357:20;15354:1;15347:31;15397:4;15394:1;15387:15;15421:4;15418:1;15411:15;15817:545;15910:4;15916:6;15976:11;15963:25;16070:2;16066:7;16055:8;16039:14;16035:29;16031:43;16011:18;16007:68;15997:96;;16089:1;16086;16079:12;15997:96;16116:33;;16168:20;;;-1:-1:-1;16211:18:1;16200:30;;16197:50;;;16243:1;16240;16233:12;16197:50;16276:4;16264:17;;-1:-1:-1;16327:1:1;16323:14;;;16307;16303:35;16293:46;;16290:66;;;16352:1;16349;16342:12;17328:168;17368:7;17434:1;17430;17426:6;17422:14;17419:1;17416:21;17411:1;17404:9;17397:17;17393:45;17390:71;;;17441:18;;:::i;:::-;-1:-1:-1;17481:9:1;;17328:168::o;17501:658::-;17672:2;17724:21;;;17794:13;;17697:18;;;17816:22;;;17643:4;;17672:2;17895:15;;;;17869:2;17854:18;;;17643:4;17938:195;17952:6;17949:1;17946:13;17938:195;;;18017:13;;-1:-1:-1;;;;;18013:39:1;18001:52;;18108:15;;;;18073:12;;;;18049:1;17967:9;17938:195;;21520:1104;21650:3;21679:1;21712:6;21706:13;21742:3;21764:1;21792:9;21788:2;21784:18;21774:28;;21852:2;21841:9;21837:18;21874;21864:61;;21918:4;21910:6;21906:17;21896:27;;21864:61;21944:2;21992;21984:6;21981:14;21961:18;21958:38;21955:165;;;-1:-1:-1;;;22019:33:1;;22075:4;22072:1;22065:15;22105:4;22026:3;22093:17;21955:165;22136:18;22163:104;;;;22281:1;22276:323;;;;22129:470;;22163:104;-1:-1:-1;;22196:24:1;;22184:37;;22241:16;;;;-1:-1:-1;22163:104:1;;22276:323;21467:1;21460:14;;;21504:4;21491:18;;22374:1;22388:165;22402:6;22399:1;22396:13;22388:165;;;22480:14;;22467:11;;;22460:35;22523:16;;;;22417:10;;22388:165;;;22392:3;;22582:6;22577:3;22573:16;22566:23;;22129:470;-1:-1:-1;22615:3:1;;21520:1104;-1:-1:-1;;;;;;;;21520:1104:1:o;23473:128::-;23513:3;23544:1;23540:6;23537:1;23534:13;23531:39;;;23550:18;;:::i;:::-;-1:-1:-1;23586:9:1;;23473:128::o;23606:135::-;23645:3;-1:-1:-1;;23666:17:1;;23663:43;;;23686:18;;:::i;:::-;-1:-1:-1;23733:1:1;23722:13;;23606:135::o

Swarm Source

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