ETH Price: $3,250.76 (-0.25%)
Gas: 1 Gwei

Token

FluidPass (OOO)
 

Overview

Max Total Supply

138 OOO

Holders

138

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 OOO
0x6da498c6579ad24384823a405608268c3b18194e
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:
Fluid_NFT

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 3: LiquidERC721.sol
// SPDX-License-Identifier: CC-BY-ND-4.0

pragma solidity ^0.8.14;

import "./LiquidProtocol.sol";
import "./FluidNFT.sol";


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract Fluid_NFT is IERC721E, protected, FuidAdvancedNft {

    bool luck_editor = true;

    // Token Linking
    address public fluid;
    Fluid fluid_controller;
    address public token;

    function set_fluid(address fluid_) public override onlyAuth {
        fluid = fluid_;
        fluid_controller = Fluid(fluid);
        is_auth[fluid] = true;
    }


    function set_bool_editor(bool is_editor) public onlyAuth {
        luck_editor = is_editor;
    }

    uint minting_price = 50000000000000000; // 0.05 ETH

    /* On Chain Metadata Structures */

    mapping(uint => bool) public tokenProtection;

    string public _baseURI_;
    string public _endpointURI_;

    address ERC20_Token;
    IERC20 erc_token;
    
    struct OnChainMetadata {
        string SVG_Image; // Optional
        string Image_Uri; // Optional (has priority)
        string[] properties;
        mapping(string => string) attributes; // properties -> attributes
    }

    mapping(uint => OnChainMetadata) Token_Metadata; // tokenID -> metadata

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

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

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

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

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

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

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    mapping(address => uint256) public owned_NFT_count;

    mapping(address => uint256) public owned_protected_count;

    /// Maximum values
    uint public max_mint;

    constructor(string memory name_, string memory symbol_, uint _max_mint, uint initial_mint, address owner_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
        max_mint = _max_mint;
        _initial_mint(msg.sender, initial_mint);
        owner = owner_;
        is_auth[owner] = true;
        is_auth[msg.sender] = true;
    }

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

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

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

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

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

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

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

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

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

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

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner_, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner_];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner_] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

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

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

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

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

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

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

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

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        string memory endpointURI;
        // Rarity and ON CHAIN attributes are added in phase 2
        if(is_phase_2) {
            endpointURI = _endpointURI();
        } else {
            endpointURI = _baseURI();
        }
        return bytes(endpointURI).length != 0 ? string(abi.encodePacked(endpointURI, _toString(tokenId))) : '';
    }

    function set_baseURI(string memory base) public override onlyAuth{
        _baseURI_ = base;
    }

    function set_Fluid_Token(address tkn) public onlyAuth{
        ERC20_Token = tkn;
        erc_token = IERC20(tkn);
        mintable_ooo = tkn;
    }

    function set_endpointURI(string memory endpoint) public override onlyAuth{
        _endpointURI_ = endpoint;
    }

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

    function _endpointURI() internal view virtual returns (string memory) {
        return _endpointURI_;
    }
    
    function set_max_mint(uint maxs) public override onlyAuth {
        max_mint = maxs;
    }

    function set_minting_price_wei(uint price) public override onlyAuth{
        minting_price = price;
    }

    function get_minting_price() public view override returns(uint actual_price) {
        return(minting_price);
    }

    function get_last_index() public view override returns(uint last_index_) {
        return _currentIndex;
    }

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    modifier onlyContract() {
      require(msg.sender==address(this));
      _;
    }

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

        // Fluid operations are held AFTER minting procedures
        fluid_controller.on_nft_minting(to, quantity, startTokenId);
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }


    function retrieve_earnings() public onlyAuth {
        (bool success,) = msg.sender.call{value: address(this).balance}("");
        require(success, "Failed");
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */

    function mint() public payable safe returns(uint id) {
        revert("Need mint mode");
        return 0;
    }

    function mint(uint mint_mode) public payable safe returns(uint id) {
        
        /// On phase 1, minting is limited    
        if(!is_phase_2) {
            if(!(is_auth[msg.sender])) {
                require(minters[msg.sender].minted < MAX_MINT_PHASE_1, "You already minted");
            }
        }
        /// On phase 2, rules are different (max 100 per wallet, 1 per day)
        else {
            require((minters[msg.sender].minted < MAX_PER_WALLET) && (block.timestamp > minters[msg.sender].last_mint_timestamp), "Mint limit");
        }

        // Minting with Ethereum
        if(is_eth_mintable) {
            require(msg.value==eth_minting_price, "Eth value mismatch");
        }

        // Minting with custom token 
        if(mint_mode == 0) {
            require(is_token_mintable, "Custom token not enabled"); 
            IERC20 mintable_token_erc = IERC20(mintable_token);
            uint token_decimals = mintable_token_erc.decimals();
            uint required_token_decimal = token_mint_price*(10**token_decimals);
            uint current_allowance = mintable_token_erc.allowance(msg.sender, address(this));
            require(current_allowance >= required_token_decimal, "Allowance");
            mintable_token_erc.transferFrom(msg.sender, address(this), (token_mint_price * (10**token_decimals)));
    
        }
        // Minting with OOO
        else if(mint_mode == 1) {
            require(is_ooo_mintable, "OOO mode is not enabled");
            IERC20 ooo_token = IERC20(mintable_ooo);
            uint current_allowance =  ooo_token.allowance(msg.sender,address(this));
            uint required_ooo_decimal = token_mint_price*(10**18);
            require(current_allowance >= required_ooo_decimal, "Allowance on OOO");
            ooo_token.transferFrom(msg.sender, address(this), required_ooo_decimal);
        }
        // Just OOO holding
        else if(mint_mode == 2) {
            IERC20 ooo_token = IERC20(mintable_ooo);
            uint balance_of_ooo = ooo_token.balanceOf(msg.sender);
            require(balance_of_ooo > 0, "No OOO holding");
        }
        else {
            revert("Minting mode is not valid (please use 0, 1 and 2)");
        }



        require(_currentIndex < max_mint, "Limit reached");
        uint _id = _mint(msg.sender, 1);
        if(!(is_auth[msg.sender])) {
            minters[msg.sender].minted += 1;
            minters[msg.sender].last_mint_timestamp = block.timestamp + MIN_COOLDOWN;
        }
        return _id;
    }

    function _initial_mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 0) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

            _currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _mint(address to, uint256 quantity) internal returns(uint _id){
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 0) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

            _currentIndex = updatedIndex;
        }


        if(luck_editor) {
            uint current_balance = erc_token.balanceOf(to);
            fluid_controller.set_luck(to, current_balance);
            uint rarity = fluid_controller.liquid_extractor(to);
            fluid_controller.set_nft_rarity(startTokenId+1, rarity);
        }
        else {
            // Fluid operations are held AFTER minting procedures
            fluid_controller.on_nft_minting(to, quantity, startTokenId);
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
        return _currentIndex;
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _NFT_transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {

        owned_NFT_Ids[from][tokenId] = false;
        owned_NFT_count[from] -= 1;
        owned_NFT_Ids[to][tokenId] = true;
        owned_NFT_count[from] += 1;

        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        address approvedAddress = _tokenApprovals[tokenId];

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            approvedAddress == _msgSenderERC721A());

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

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

        // Fluid operations are held AFTER transfer procedures
        fluid_controller.on_nft_transfer(from, to, tokenId);
        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

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

        address from = address(uint160(prevOwnershipPacked));
        address approvedAddress = _tokenApprovals[tokenId];

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

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

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

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

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

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

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

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

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

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


   /*

    On Chain Metadata Functions

   /*

 
    struct OnChainMetadata {
        string SVG_Image; // Optional
        string Image_Uri; // Optional (has priority)
        string[] properties;
        mapping(string => string) attributes; // properties -> attributes
    }

    mapping(uint => OnChainMetadata) Token_Metadata; // tokenID -> metadata

    /*

    tokenURI can be set as https://apiurl.com/retrieve?nft=0xcontractaddress&id=tokenID

    The API will contain a web3 call with ERC721E abi contract and the below method
    returning ERC721 compatible json with imageURI being the url or the svg based on content

    */

    function setMetadata(string memory SVG_Image, string memory Image_Uri, string[] memory properties, string[] memory attributes) internal {
        uint _currentIndex_ = _totalMinted();
        Token_Metadata[_currentIndex_].Image_Uri = Image_Uri;
        Token_Metadata[_currentIndex_].SVG_Image = SVG_Image;
        Token_Metadata[_currentIndex_].properties = properties;
        for (uint i; i < attributes.length; i++) {
            Token_Metadata[_currentIndex_].attributes[properties[i]] = attributes[i];
        }
    }

    function retrieveMetadata(uint tokenID) public view returns(string memory SVG, string memory URI, string[] memory properties, string[] memory attributes) {
        string memory _svg = Token_Metadata[tokenID].SVG_Image;
        string memory _uri = Token_Metadata[tokenID].Image_Uri;
        string[] memory _properties = Token_Metadata[tokenID].properties;
        string[] memory _attributes;
        for(uint a; a < properties.length; a++) {
            _attributes[a] = (Token_Metadata[tokenID].attributes[properties[a]]);
        }
        return(_svg, _uri, _properties, _attributes);
    }

}

File 1 of 3: FluidNFT.sol
// SPDX-License-Identifier: CC-BY-ND-4.0

pragma solidity ^0.8.14;

import "./LiquidProtocol.sol";

contract FuidAdvancedNft is protected {

    struct MINTERS {
        uint minted;
        uint last_mint_timestamp;
    }

    mapping(address => MINTERS) minters;

    address public mintable_ooo;
    bool public is_ooo_mintable = false;
    uint public ooo_mint_price = 1;
 
    address public mintable_token;
    bool public is_token_mintable = false;
    uint public token_mint_price;

    bool public is_eth_mintable = true;
    uint public eth_minting_price;

    uint public MAX_PER_WALLET = 100;
    uint public MIN_COOLDOWN = 1 days;
    uint public MAX_MINT_PHASE_1 = 1;

    // Setting limits
    function set_max_per_wallet(uint mpw) public onlyAuth {
        MAX_PER_WALLET = mpw;
    }

    function set_min_cooldown(uint mcd) public onlyAuth {
        MIN_COOLDOWN = mcd;
    }

    function set_max_mint_phase_1(uint mmp1) public onlyAuth {
        MAX_MINT_PHASE_1 = mmp1;
    }


    // Define addresses 

    function set_mintable_token_address(address tkn) public onlyAuth {
        mintable_token = tkn;
    }

    function set_mintable_ooo_address(address ooo) public onlyAuth {
        mintable_ooo = ooo;
    }

    // Define mintables

    function eth_mintable(bool booly) public onlyAuth {
        is_eth_mintable = booly;
    }

    function token_mintable(bool booly) public onlyAuth {
        is_token_mintable = booly;
    }

    function ooo_mintable(bool booly) public onlyAuth {
        is_ooo_mintable = booly;
    }

    // Define prices

    function ooo_price(uint price_wei) public onlyAuth {
        ooo_mint_price = price_wei;
    }

    function eth_price(uint price_wei) public onlyAuth {
        eth_minting_price = price_wei;
    }

    function token_price(uint price_wei) public onlyAuth {
        token_mint_price = price_wei;
    }

    /// PHASES
    bool is_phase_1 = true;
    bool is_phase_2;

    function primitive() public onlyAuth {
        is_phase_1 = true;
        is_phase_2 = false;
    }

    function evolve() public onlyAuth {
        is_phase_1 = false;
        is_phase_2 = true;
    }
}

File 3 of 3: LiquidProtocol.sol
// SPDX-License-Identifier: CC-BY-ND-4.0

pragma solidity ^0.8.14;

contract protected {
    mapping (address => bool) is_auth;
    function authorized(address addy) public view returns(bool) {
        return is_auth[addy];
    }
    function set_authorized(address addy, bool booly) public onlyAuth {
        is_auth[addy] = booly;
    }
    modifier onlyAuth() {
        require( is_auth[msg.sender] || msg.sender==owner, "not owner");
        _;
    }
    address owner;
    modifier onlyOwner() {
        require(msg.sender==owner, "not owner");
        _;
    }
    bool locked;
    modifier safe() {
        require(!locked, "reentrant");
        locked = true;
        _;
        locked = false;
    }
    function change_owner(address new_owner) public onlyAuth {
        owner = new_owner;
    }
    receive() external payable {}
    fallback() external payable {}
}

/*
----------------------------------------------------------------

ERC721E Section, based on ERC721A

----------------------------------------------------------------
*/

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721E {

    function set_fluid(address fluid_) external;

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

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

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

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

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

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

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

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

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

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

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

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

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _internal_tokenURI(uint256 tokenId) external view returns (string memory);

    function set_baseURI(string memory base) external;
    function set_endpointURI(string memory endpoint) external;

    function mint() external payable returns(uint id);
    function set_minting_price_wei(uint price) external;
    function get_minting_price() external view returns(uint actual_price);

    function get_last_index() external view returns(uint last_index_);

    function set_max_mint(uint maxs) external;
}   

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

/*
----------------------------------------------------------------

ERC20 Section

----------------------------------------------------------------
*/

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function set_fluid(address _fluid_) external;
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IUniswapV2Router01 {
  function factory() external pure returns (address);
  function WETH() external pure returns (address);

  function addLiquidity(
      address tokenA,
      address tokenB,
      uint amountADesired,
      uint amountBDesired,
      uint amountAMin,
      uint amountBMin,
      address to,
      uint deadline
  ) external returns (uint amountA, uint amountB, uint liquidity);
  function addLiquidityETH(
      address token,
      uint amountTokenDesired,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
  ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
  function removeLiquidity(
      address tokenA,
      address tokenB,
      uint liquidity,
      uint amountAMin,
      uint amountBMin,
      address to,
      uint deadline
  ) external returns (uint amountA, uint amountB);
  function removeLiquidityETH(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
  ) external returns (uint amountToken, uint amountETH);
  function removeLiquidityWithPermit(
      address tokenA,
      address tokenB,
      uint liquidity,
      uint amountAMin,
      uint amountBMin,
      address to,
      uint deadline,
      bool approveMax, uint8 v, bytes32 r, bytes32 s
  ) external returns (uint amountA, uint amountB);
  function removeLiquidityETHWithPermit(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline,
      bool approveMax, uint8 v, bytes32 r, bytes32 s
  ) external returns (uint amountToken, uint amountETH);
  function swapExactTokensForTokens(
      uint amountIn,
      uint amountOutMin,
      address[] calldata path,
      address to,
      uint deadline
  ) external returns (uint[] memory amounts);
  function swapTokensForExactTokens(
      uint amountOut,
      uint amountInMax,
      address[] calldata path,
      address to,
      uint deadline
  ) external returns (uint[] memory amounts);
  function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
      external
      payable
      returns (uint[] memory amounts);
  function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
      external
      returns (uint[] memory amounts);
  function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
      external
      returns (uint[] memory amounts);
  function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
      external
      payable
      returns (uint[] memory amounts);

  function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
  function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
  function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
  function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
  function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IUniswapV2Factory {
  event PairCreated(address indexed token0, address indexed token1, address pair, uint);

  function getPair(address tokenA, address tokenB) external view returns (address pair);
  function allPairs(uint) external view returns (address pair);
  function allPairsLength() external view returns (uint);

  function feeTo() external view returns (address);
  function feeToSetter() external view returns (address);

  function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Pair {
  event Approval(address indexed owner, address indexed spender, uint value);
  event Transfer(address indexed from, address indexed to, uint value);

  function name() external pure returns (string memory);
  function symbol() external pure returns (string memory);
  function decimals() external pure returns (uint8);
  function totalSupply() external view returns (uint);
  function balanceOf(address owner) external view returns (uint);
  function allowance(address owner, address spender) external view returns (uint);

  function approve(address spender, uint value) external returns (bool);
  function transfer(address to, uint value) external returns (bool);
  function transferFrom(address from, address to, uint value) external returns (bool);

  function DOMAIN_SEPARATOR() external view returns (bytes32);
  function PERMIT_TYPEHASH() external pure returns (bytes32);
  function nonces(address owner) external view returns (uint);

  function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

  event Mint(address indexed sender, uint amount0, uint amount1);
  event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
  event Swap(
      address indexed sender,
      uint amount0In,
      uint amount1In,
      uint amount0Out,
      uint amount1Out,
      address indexed to
  );
  event Sync(uint112 reserve0, uint112 reserve1);

  function MINIMUM_LIQUIDITY() external pure returns (uint);
  function factory() external view returns (address);
  function token0() external view returns (address);
  function token1() external view returns (address);
  function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
  function price0CumulativeLast() external view returns (uint);
  function price1CumulativeLast() external view returns (uint);
  function kLast() external view returns (uint);

  function mint(address to) external returns (uint liquidity);
  function burn(address to) external returns (uint amount0, uint amount1);
  function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
  function skim(address to) external;
  function sync() external;
}

interface FluidExtension {
    function delegated_on_transfer(address _from,
                                   address _to, 
                                   uint quantity, 
                                   bool is_buy, 
                                   bool is_sell, 
                                   bool is_transfer) external returns(bool skip);
    
    function delegated_on_nft_transfer(address _from, address _to, uint id) external returns(bool skip);

    function delegated_on_minting(address _from, uint quantity, uint starting_id) external returns(bool skip);
}

interface Fluid {

    function get_luck(address recipient) external view returns (uint luck);

    function stake_tokens(uint quantity) external returns (uint slot);
    function unstake_tokens(uint stake_id) external;

    function set_nft_rarity(uint id, uint rarity) external;
    function get_nft_rarity(uint id) external view returns(uint rarity);
    function get_nft_onchain_attributes(uint id) external view returns(bytes32[] memory);

    function get_stake_status(address actor) external view returns(uint total, bool is_it);

    function on_transfer(address _from, address _to, uint quantity, bool is_buy, bool is_sell, bool is_transfer) external;

    function on_nft_transfer(address _from, address _to, uint id) external;
    function on_nft_minting(address _from, uint quantity, uint start_token) external;

    function set_probabilities(uint _rare, uint _particular, uint _uncommon) external;
    function get_probabilities() external view returns(uint rare_, uint particular_, uint uncommon_, uint common_);
    function get_all_lucks() external view returns(uint all_lucks);

    function set_luck(address recipient, uint _luck) external;
    function liquid_extractor(address actor) external view returns(uint rarity);

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"_max_mint","type":"uint256"},{"internalType":"uint256","name":"initial_mint","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_MINT_PHASE_1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_COOLDOWN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseURI_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_endpointURI_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"_internal_tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"new_owner","type":"address"}],"name":"change_owner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"eth_mintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eth_minting_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_wei","type":"uint256"}],"name":"eth_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"evolve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fluid","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_last_index","outputs":[{"internalType":"uint256","name":"last_index_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_minting_price","outputs":[{"internalType":"uint256","name":"actual_price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"is_eth_mintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"is_ooo_mintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"is_token_mintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mint_mode","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintable_ooo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintable_token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ooo_mint_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"ooo_mintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_wei","type":"uint256"}],"name":"ooo_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"owned_NFT_Ids","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"owned_NFT_count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"owned_protected_count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primitive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"retrieveMetadata","outputs":[{"internalType":"string","name":"SVG","type":"string"},{"internalType":"string","name":"URI","type":"string"},{"internalType":"string[]","name":"properties","type":"string[]"},{"internalType":"string[]","name":"attributes","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"retrieve_earnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tkn","type":"address"}],"name":"set_Fluid_Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"set_authorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"base","type":"string"}],"name":"set_baseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"is_editor","type":"bool"}],"name":"set_bool_editor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"endpoint","type":"string"}],"name":"set_endpointURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fluid_","type":"address"}],"name":"set_fluid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxs","type":"uint256"}],"name":"set_max_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mmp1","type":"uint256"}],"name":"set_max_mint_phase_1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mpw","type":"uint256"}],"name":"set_max_per_wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mcd","type":"uint256"}],"name":"set_min_cooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ooo","type":"address"}],"name":"set_mintable_ooo_address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tkn","type":"address"}],"name":"set_mintable_token_address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"set_minting_price_wei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token_mint_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"token_mintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_wei","type":"uint256"}],"name":"token_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526003805460ff60a01b1990811690915560016004819055600580549092169091556007805460ff191682179055606460095562015180600a55600b55600c805462ff00ff19166201000117905566b1a2bc2ec50000600f553480156200006957600080fd5b5060405162003970380380620039708339810160408190526200008c91620002bf565b60186200009a8682620003ef565b506019620000a98582620003ef565b5060006016556021839055620000c0338362000113565b600180546001600160a01b039092166001600160a01b031990921682178155600091825260208290526040808320805460ff1990811684179091553384529220805490921617905550620004bb92505050565b601654826000036200013757604051622e076360e81b815260040160405180910390fd5b81600003620001595760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0383166000908152601b602090815260408083208054680100000000000000018702019055838352601a90915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210620001a457506016555b505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200021a57600080fd5b81516001600160401b0380821115620002375762000237620001f2565b604051601f8301601f19908116603f01168101908282118183101715620002625762000262620001f2565b816040528381526020925086838588010111156200027f57600080fd5b600091505b83821015620002a3578582018301518183018401529082019062000284565b83821115620002b55760008385830101525b9695505050505050565b600080600080600060a08688031215620002d857600080fd5b85516001600160401b0380821115620002f057600080fd5b620002fe89838a0162000208565b965060208801519150808211156200031557600080fd5b50620003248882890162000208565b6040880151606089015160808a0151929750909550935090506001600160a01b03811681146200035357600080fd5b809150509295509295909350565b600181811c908216806200037657607f821691505b6020821081036200039757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001ed57600081815260208120601f850160051c81016020861015620003c65750805b601f850160051c820191505b81811015620003e757828155600101620003d2565b505050505050565b81516001600160401b038111156200040b576200040b620001f2565b62000423816200041c845462000361565b846200039d565b602080601f8311600181146200045b5760008415620004425750858301515b600019600386901b1c1916600185901b178555620003e7565b600085815260208120601f198616915b828110156200048c578886015182559484019460019091019084016200046b565b5085821015620004ab5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6134a580620004cb6000396000f3fe6080604052600436106103a25760003560e01c806370a08231116101e5578063c24d96e61161010c578063da4b81ee116100a5578063e985e9c511610077578063e985e9c514610af7578063f714cb4414610b17578063fafb763e14610b2d578063fc0c546a14610b4e578063fec40e8e14610b6e57005b8063da4b81ee14610a67578063da5a75a814610a97578063e09574c614610ab7578063e6009a6b14610ad757005b8063d250522d116100de578063d250522d146107ed578063d551850b14610a05578063d687b3e914610a25578063d7c64e7f14610a5157005b8063c24d96e614610993578063c36cc02c146109a8578063c547e4af146109cf578063c87b56dd146109e557005b8063a0712d681161017e578063afa5704011610150578063afa5704014610904578063b0cc010a14610924578063b88d4fde1461093a578063b91816111461095a57005b8063a0712d681461089c578063a22cb465146108af578063a954e08e146108cf578063abe96a83146108ef57005b8063825a85b5116101b7578063825a85b51461081757806395d89b4114610837578063999e476a1461084c5780639e888da91461086c57005b806370a08231146107b8578063734b8147146107d8578063736bf591146107ed5780637e7701e31461080257005b806338348887116102c957806353e4c94c116102625780636352211e116102345780636352211e1461074257806364d99b481461076257806368dcf01514610782578063695f9a391461079857005b806353e4c94c146106ad5780635caeb579146106c75780635e7057a4146106e7578063618c66321461070757005b8063450f3e2d1161029b578063450f3e2d1461062057806347e674981461064d5780634925407e1461066d5780634acff6fa1461068d57005b806338348887146105b65780633a5bda93146105cb5780633d8adfd0146105eb57806342842e0e1461060057005b806314ca514a1161033b5780632818553f1161030d5780632818553f146105355780632bfe8742146105555780633040e00b146105755780633065fb601461059557005b806314ca514a146104c657806318160ddd146104dc57806323b872dd146104f5578063253c8bd41461051557005b8063095ea7b311610374578063095ea7b31461045a5780630ad78a921461047a5780630f2cdd6c1461049a5780631249c58b146104be57005b806301ffc9a7146103ab5780630587e9ab146103e057806306fdde0314610400578063081812fc1461042257005b366103a957005b005b3480156103b757600080fd5b506103cb6103c6366004612cba565b610b8e565b60405190151581526020015b60405180910390f35b3480156103ec57600080fd5b506103a96103fb366004612cd7565b610be0565b34801561040c57600080fd5b50610415610c32565b6040516103d79190612d48565b34801561042e57600080fd5b5061044261043d366004612cd7565b610cc4565b6040516001600160a01b0390911681526020016103d7565b34801561046657600080fd5b506103a9610475366004612d77565b610d08565b34801561048657600080fd5b506103a9610495366004612da1565b610dda565b3480156104a657600080fd5b506104b060095481565b6040519081526020016103d7565b6104b0610e40565b3480156104d257600080fd5b506104b060085481565b3480156104e857600080fd5b50601754601654036104b0565b34801561050157600080fd5b506103a9610510366004612dbc565b610ed5565b34801561052157600080fd5b506103a9610530366004612da1565b610ef1565b34801561054157600080fd5b506103a9610550366004612cd7565b610f57565b34801561056157600080fd5b506103a9610570366004612e06565b610fa0565b34801561058157600080fd5b506103a9610590366004612da1565b61100f565b3480156105a157600080fd5b506003546103cb90600160a01b900460ff1681565b3480156105c257600080fd5b50600f546104b0565b3480156105d757600080fd5b506103a96105e6366004612e3d565b611075565b3480156105f757600080fd5b506104156110d5565b34801561060c57600080fd5b506103a961061b366004612dbc565b611163565b34801561062c57600080fd5b506104b061063b366004612da1565b601f6020526000908152604090205481565b34801561065957600080fd5b506103a9610668366004612cd7565b61118a565b34801561067957600080fd5b506103a9610688366004612e3d565b6111d3565b34801561069957600080fd5b50600354610442906001600160a01b031681565b3480156106b957600080fd5b506007546103cb9060ff1681565b3480156106d357600080fd5b506103a96106e2366004612cd7565b611235565b3480156106f357600080fd5b506103a9610702366004612cd7565b61127e565b34801561071357600080fd5b506103cb610722366004612d77565b601e60209081526000928352604080842090915290825290205460ff1681565b34801561074e57600080fd5b5061044261075d366004612cd7565b6112c7565b34801561076e57600080fd5b506103a961077d366004612e3d565b6112d2565b34801561078e57600080fd5b506104b060065481565b3480156107a457600080fd5b50600554610442906001600160a01b031681565b3480156107c457600080fd5b506104b06107d3366004612da1565b611329565b3480156107e457600080fd5b506103a9611372565b3480156107f957600080fd5b506016546104b0565b34801561080e57600080fd5b506103a96113c7565b34801561082357600080fd5b506103a9610832366004612da1565b61141b565b34801561084357600080fd5b506104156114c0565b34801561085857600080fd5b506103a9610867366004612cd7565b6114cf565b34801561087857600080fd5b506103cb610887366004612cd7565b60106020526000908152604090205460ff1681565b6104b06108aa366004612cd7565b611518565b3480156108bb57600080fd5b506103a96108ca366004612e06565b611c9e565b3480156108db57600080fd5b506103a96108ea366004612cd7565b611d33565b3480156108fb57600080fd5b506103a9611d7c565b34801561091057600080fd5b506103a961091f366004612ee6565b611e44565b34801561093057600080fd5b506104b0600b5481565b34801561094657600080fd5b506103a9610955366004612f2f565b611e98565b34801561096657600080fd5b506103cb610975366004612da1565b6001600160a01b031660009081526020819052604090205460ff1690565b34801561099f57600080fd5b50610415611eee565b3480156109b457600080fd5b50600c5461044290630100000090046001600160a01b031681565b3480156109db57600080fd5b506104b060045481565b3480156109f157600080fd5b50610415610a00366004612cd7565b611efb565b348015610a1157600080fd5b506103a9610a20366004612ee6565b611f7a565b348015610a3157600080fd5b506104b0610a40366004612da1565b602080526000908152604090205481565b348015610a5d57600080fd5b506104b060215481565b348015610a7357600080fd5b50610a87610a82366004612cd7565b611fca565b6040516103d79493929190613000565b348015610aa357600080fd5b506103a9610ab2366004612da1565b61231d565b348015610ac357600080fd5b506103a9610ad2366004612e3d565b612397565b348015610ae357600080fd5b50610415610af2366004612cd7565b6123f9565b348015610b0357600080fd5b506103cb610b12366004613058565b61242b565b348015610b2357600080fd5b506104b0600a5481565b348015610b3957600080fd5b506005546103cb90600160a01b900460ff1681565b348015610b5a57600080fd5b50600e54610442906001600160a01b031681565b348015610b7a57600080fd5b506103a9610b89366004612cd7565b612482565b60006301ffc9a760e01b6001600160e01b031983161480610bbf57506380ac58cd60e01b6001600160e01b03198316145b80610bda5750635b5e139f60e01b6001600160e01b03198316145b92915050565b3360009081526020819052604090205460ff1680610c0857506001546001600160a01b031633145b610c2d5760405162461bcd60e51b8152600401610c249061308b565b60405180910390fd5b600455565b606060188054610c41906130ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6d906130ae565b8015610cba5780601f10610c8f57610100808354040283529160200191610cba565b820191906000526020600020905b815481529060010190602001808311610c9d57829003601f168201915b5050505050905090565b6000610ccf826124cb565b610cec576040516333d1c03960e21b815260040160405180910390fd5b506000908152601c60205260409020546001600160a01b031690565b6000610d13826124f3565b9050806001600160a01b0316836001600160a01b031603610d475760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610d7e57610d61813361242b565b610d7e576040516367d9dca160e11b815260040160405180910390fd5b6000828152601c602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3360009081526020819052604090205460ff1680610e0257506001546001600160a01b031633145b610e1e5760405162461bcd60e51b8152600401610c249061308b565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b600154600090600160a01b900460ff1615610e895760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610c24565b6001805460ff60a01b1916600160a01b17905560405162461bcd60e51b815260206004820152600e60248201526d4e656564206d696e74206d6f646560901b6044820152606401610c24565b333014610ee157600080fd5b610eec83838361255a565b505050565b3360009081526020819052604090205460ff1680610f1957506001546001600160a01b031633145b610f355760405162461bcd60e51b8152600401610c249061308b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680610f7f57506001546001600160a01b031633145b610f9b5760405162461bcd60e51b8152600401610c249061308b565b600655565b3360009081526020819052604090205460ff1680610fc857506001546001600160a01b031633145b610fe45760405162461bcd60e51b8152600401610c249061308b565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b3360009081526020819052604090205460ff168061103757506001546001600160a01b031633145b6110535760405162461bcd60e51b8152600401610c249061308b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff168061109d57506001546001600160a01b031633145b6110b95760405162461bcd60e51b8152600401610c249061308b565b600c8054911515620100000262ff000019909216919091179055565b601180546110e2906130ae565b80601f016020809104026020016040519081016040528092919081815260200182805461110e906130ae565b801561115b5780601f106111305761010080835404028352916020019161115b565b820191906000526020600020905b81548152906001019060200180831161113e57829003601f168201915b505050505081565b33301461116f57600080fd5b610eec83838360405180602001604052806000815250611e98565b3360009081526020819052604090205460ff16806111b257506001546001600160a01b031633145b6111ce5760405162461bcd60e51b8152600401610c249061308b565b600855565b3360009081526020819052604090205460ff16806111fb57506001546001600160a01b031633145b6112175760405162461bcd60e51b8152600401610c249061308b565b60058054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526020819052604090205460ff168061125d57506001546001600160a01b031633145b6112795760405162461bcd60e51b8152600401610c249061308b565b600955565b3360009081526020819052604090205460ff16806112a657506001546001600160a01b031633145b6112c25760405162461bcd60e51b8152600401610c249061308b565b600b55565b6000610bda826124f3565b3360009081526020819052604090205460ff16806112fa57506001546001600160a01b031633145b6113165760405162461bcd60e51b8152600401610c249061308b565b6007805460ff1916911515919091179055565b60008160000361134c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152601b602052604090205467ffffffffffffffff1690565b3360009081526020819052604090205460ff168061139a57506001546001600160a01b031633145b6113b65760405162461bcd60e51b8152600401610c249061308b565b600c805461ffff1916610100179055565b3360009081526020819052604090205460ff16806113ef57506001546001600160a01b031633145b61140b5760405162461bcd60e51b8152600401610c249061308b565b600c805461ffff19166001179055565b3360009081526020819052604090205460ff168061144357506001546001600160a01b031633145b61145f5760405162461bcd60e51b8152600401610c249061308b565b600c80546301000000600160b81b03191663010000006001600160a01b0393841681029190911791829055600d8054919092049092166001600160a01b0319909216821790556000908152602081905260409020805460ff19166001179055565b606060198054610c41906130ae565b3360009081526020819052604090205460ff16806114f757506001546001600160a01b031633145b6115135760405162461bcd60e51b8152600401610c249061308b565b600f55565b600154600090600160a01b900460ff16156115615760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610c24565b6001805460ff60a01b1916600160a01b179055600c54610100900460ff166115f4573360009081526020819052604090205460ff166115ef57600b5433600090815260026020526040902054106115ef5760405162461bcd60e51b8152602060048201526012602482015271165bdd48185b1c9958591e481b5a5b9d195960721b6044820152606401610c24565b61165e565b6009543360009081526002602052604090205410801561162557503360009081526002602052604090206001015442115b61165e5760405162461bcd60e51b815260206004820152600a602482015269135a5b9d081b1a5b5a5d60b21b6044820152606401610c24565b60075460ff16156116af5760085434146116af5760405162461bcd60e51b815260206004820152601260248201527108ae8d040ecc2d8eaca40dad2e6dac2e8c6d60731b6044820152606401610c24565b816000036118ff57600554600160a01b900460ff166117105760405162461bcd60e51b815260206004820152601860248201527f437573746f6d20746f6b656e206e6f7420656e61626c656400000000000000006044820152606401610c24565b6005546040805163313ce56760e01b815290516001600160a01b0390921691600091839163313ce567916004808201926020929091908290030181865afa15801561175f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178391906130e8565b60ff169050600061179582600a613205565b6006546117a29190613211565b604051636eb1769f60e11b81523360048201523060248201529091506000906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa1580156117f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118169190613230565b9050818110156118545760405162461bcd60e51b8152602060048201526009602482015268416c6c6f77616e636560b81b6044820152606401610c24565b6001600160a01b0384166323b872dd333061187087600a613205565b60065461187d9190613211565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af11580156118d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f59190613249565b5050505050611bdb565b81600103611ab657600354600160a01b900460ff166119605760405162461bcd60e51b815260206004820152601760248201527f4f4f4f206d6f6465206973206e6f7420656e61626c65640000000000000000006044820152606401610c24565b600354604051636eb1769f60e11b81523360048201523060248201526001600160a01b0390911690600090829063dd62ed3e90604401602060405180830381865afa1580156119b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d79190613230565b90506000600654670de0b6b3a76400006119f19190613211565b905080821015611a365760405162461bcd60e51b815260206004820152601060248201526f416c6c6f77616e6365206f6e204f4f4f60801b6044820152606401610c24565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038416906323b872dd906064016020604051808303816000875af1158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad9190613249565b50505050611bdb565b81600203611b79576003546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2f9190613230565b905060008111611b725760405162461bcd60e51b815260206004820152600e60248201526d4e6f204f4f4f20686f6c64696e6760901b6044820152606401610c24565b5050611bdb565b60405162461bcd60e51b815260206004820152603160248201527f4d696e74696e67206d6f6465206973206e6f742076616c69642028706c656173604482015270652075736520302c203120616e6420322960781b6064820152608401610c24565b60215460165410611c1e5760405162461bcd60e51b815260206004820152600d60248201526c131a5b5a5d081c995858da1959609a1b6044820152606401610c24565b6000611c2b336001612821565b3360009081526020819052604090205490915060ff16611c8b57336000908152600260205260408120805460019290611c65908490613266565b9091555050600a54611c779042613266565b336000908152600260205260409020600101555b6001805460ff60a01b1916905592915050565b336001600160a01b03831603611cc75760405163b06307db60e01b815260040160405180910390fd5b336000818152601d602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526020819052604090205460ff1680611d5b57506001546001600160a01b031633145b611d775760405162461bcd60e51b8152600401610c249061308b565b600a55565b3360009081526020819052604090205460ff1680611da457506001546001600160a01b031633145b611dc05760405162461bcd60e51b8152600401610c249061308b565b604051600090339047908381818185875af1925050503d8060008114611e02576040519150601f19603f3d011682016040523d82523d6000602084013e611e07565b606091505b5050905080611e415760405162461bcd60e51b815260206004820152600660248201526511985a5b195960d21b6044820152606401610c24565b50565b3360009081526020819052604090205460ff1680611e6c57506001546001600160a01b031633145b611e885760405162461bcd60e51b8152600401610c249061308b565b6011611e9482826132c4565b5050565b333014611ea457600080fd5b611eaf84848461255a565b6001600160a01b0383163b15611ee857611ecb84848484612b4b565b611ee8576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b601280546110e2906130ae565b600c546060908190610100900460ff1615611f1f57611f18612c37565b9050611f2a565b611f27612c46565b90505b8051600003611f485760405180602001604052806000815250611f73565b80611f5284612c55565b604051602001611f63929190613384565b6040516020818303038152906040525b9392505050565b3360009081526020819052604090205460ff1680611fa257506001546001600160a01b031633145b611fbe5760405162461bcd60e51b8152600401610c249061308b565b6012611e9482826132c4565b600081815260156020526040812080546060928392839283929190611fee906130ae565b80601f016020809104026020016040519081016040528092919081815260200182805461201a906130ae565b80156120675780601f1061203c57610100808354040283529160200191612067565b820191906000526020600020905b81548152906001019060200180831161204a57829003601f168201915b505050505090506000601560008881526020019081526020016000206001018054612091906130ae565b80601f01602080910402602001604051908101604052809291908181526020018280546120bd906130ae565b801561210a5780601f106120df5761010080835404028352916020019161210a565b820191906000526020600020905b8154815290600101906020018083116120ed57829003601f168201915b50505050509050600060156000898152602001908152602001600020600201805480602002602001604051908101604052809291908181526020016000905b828210156121f5578382906000526020600020018054612168906130ae565b80601f0160208091040260200160405190810160405280929190818152602001828054612194906130ae565b80156121e15780601f106121b6576101008083540402835291602001916121e1565b820191906000526020600020905b8154815290600101906020018083116121c457829003601f168201915b505050505081526020019060010190612149565b505050509050606060005b865181101561230d57601560008b8152602001908152602001600020600301878281518110612231576122316133b3565b602002602001015160405161224691906133c9565b9081526020016040518091039020805461225f906130ae565b80601f016020809104026020016040519081016040528092919081815260200182805461228b906130ae565b80156122d85780601f106122ad576101008083540402835291602001916122d8565b820191906000526020600020905b8154815290600101906020018083116122bb57829003601f168201915b50505050508282815181106122ef576122ef6133b3565b60200260200101819052508080612305906133e5565b915050612200565b5092989197509550909350915050565b3360009081526020819052604090205460ff168061234557506001546001600160a01b031633145b6123615760405162461bcd60e51b8152600401610c249061308b565b601380546001600160a01b039092166001600160a01b031992831681179091556014805483168217905560038054909216179055565b3360009081526020819052604090205460ff16806123bf57506001546001600160a01b031633145b6123db5760405162461bcd60e51b8152600401610c249061308b565b60038054911515600160a01b0260ff60a01b19909216919091179055565b6060612404826124cb565b61242157604051630a14c4b560e41b815260040160405180910390fd5b6000611f27612c46565b600c546000906001600160a01b03630100000090910481169083160361245357506001610bda565b506001600160a01b039182166000908152601d6020908152604080832093909416825291909152205460ff1690565b3360009081526020819052604090205460ff16806124aa57506001546001600160a01b031633145b6124c65760405162461bcd60e51b8152600401610c249061308b565b602155565b600060165482108015610bda5750506000908152601a6020526040902054600160e01b161590565b600081601654811015612541576000818152601a602052604081205490600160e01b8216900361253f575b80600003611f735750600019016000818152601a602052604090205461251e565b505b604051636f96cda160e11b815260040160405180910390fd5b6001600160a01b0383166000818152601e602090815260408083208584528252808320805460ff19169055928252601f90529081208054600192906125a09084906133fe565b90915550506001600160a01b038083166000908152601e602090815260408083208584528252808320805460ff191660019081179091559387168352601f909152812080549091906125f3908490613266565b9091555060009050612604826124f3565b9050836001600160a01b0316816001600160a01b0316146126375760405162a1148160e81b815260040160405180910390fd5b6000828152601c60205260408120546001600160a01b03908116919086163314806126675750612667863361242b565b8061267a57506001600160a01b03821633145b90508061269a57604051632ce44b5f60e11b815260040160405180910390fd5b846000036126bb57604051633a954ecd60e21b815260040160405180910390fd5b81156126de576000848152601c6020526040902080546001600160a01b03191690555b6001600160a01b038681166000908152601b602090815260408083208054600019019055928816825282822080546001019055868252601a9052908120600160e11b4260a01b881781179091558416900361276957600184016000818152601a60205260408120549003612767576016548114612767576000818152601a602052604090208490555b505b600d54604051634b5b0bcd60e11b81526001600160a01b038881166004830152878116602483015260448201879052909116906396b6179a90606401600060405180830381600087803b1580156127bf57600080fd5b505af11580156127d3573d6000803e3d6000fd5b5050505083856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6016546000908360000361284757604051622e076360e81b815260040160405180910390fd5b826000036128685760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0384166000908152601b602090815260408083208054680100000000000000018802019055838352601a90915290204260a01b85176001851460e11b179055808084015b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106128b35750601655600c5462010000900460ff1615612ad2576014546040516370a0823160e01b81526001600160a01b03868116600483015260009216906370a0823190602401602060405180830381865afa158015612956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297a9190613230565b600d546040516302b5e86760e01b81526001600160a01b038881166004830152602482018490529293509116906302b5e86790604401600060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b5050600d546040516310b23add60e31b81526001600160a01b038981166004830152600094509091169150638591d6e890602401602060405180830381865afa158015612a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a539190613230565b600d549091506001600160a01b0316637aa0d8b3612a72856001613266565b836040518363ffffffff1660e01b8152600401612a99929190918252602082015260400190565b600060405180830381600087803b158015612ab357600080fd5b505af1158015612ac7573d6000803e3d6000fd5b505050505050612b40565b600d546040516306fc05e960e51b81526001600160a01b03868116600483015260248201869052604482018490529091169063df80bd2090606401600060405180830381600087803b158015612b2757600080fd5b505af1158015612b3b573d6000803e3d6000fd5b505050505b505060165492915050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612b80903390899088908890600401613415565b6020604051808303816000875af1925050508015612bbb575060408051601f3d908101601f19168201909252612bb891810190613452565b60015b612c19573d808015612be9576040519150601f19603f3d011682016040523d82523d6000602084013e612bee565b606091505b508051600003612c11576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060128054610c41906130ae565b606060118054610c41906130ae565b604080516080810191829052607f0190826030600a8206018353600a90045b8015612c9257600183039250600a81066030018353600a9004612c74565b50819003601f19909101908152919050565b6001600160e01b031981168114611e4157600080fd5b600060208284031215612ccc57600080fd5b8135611f7381612ca4565b600060208284031215612ce957600080fd5b5035919050565b60005b83811015612d0b578181015183820152602001612cf3565b83811115611ee85750506000910152565b60008151808452612d34816020860160208601612cf0565b601f01601f19169290920160200192915050565b602081526000611f736020830184612d1c565b80356001600160a01b0381168114612d7257600080fd5b919050565b60008060408385031215612d8a57600080fd5b612d9383612d5b565b946020939093013593505050565b600060208284031215612db357600080fd5b611f7382612d5b565b600080600060608486031215612dd157600080fd5b612dda84612d5b565b9250612de860208501612d5b565b9150604084013590509250925092565b8015158114611e4157600080fd5b60008060408385031215612e1957600080fd5b612e2283612d5b565b91506020830135612e3281612df8565b809150509250929050565b600060208284031215612e4f57600080fd5b8135611f7381612df8565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612e8b57612e8b612e5a565b604051601f8501601f19908116603f01168101908282118183101715612eb357612eb3612e5a565b81604052809350858152868686011115612ecc57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612ef857600080fd5b813567ffffffffffffffff811115612f0f57600080fd5b8201601f81018413612f2057600080fd5b612c2f84823560208401612e70565b60008060008060808587031215612f4557600080fd5b612f4e85612d5b565b9350612f5c60208601612d5b565b925060408501359150606085013567ffffffffffffffff811115612f7f57600080fd5b8501601f81018713612f9057600080fd5b612f9f87823560208401612e70565b91505092959194509250565b600081518084526020808501808196508360051b8101915082860160005b85811015612ff3578284038952612fe1848351612d1c565b98850198935090840190600101612fc9565b5091979650505050505050565b6080815260006130136080830187612d1c565b82810360208401526130258187612d1c565b905082810360408401526130398186612fab565b9050828103606084015261304d8185612fab565b979650505050505050565b6000806040838503121561306b57600080fd5b61307483612d5b565b915061308260208401612d5b565b90509250929050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b600181811c908216806130c257607f821691505b6020821081036130e257634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156130fa57600080fd5b815160ff81168114611f7357600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561315c5781600019048211156131425761314261310b565b8085161561314f57918102915b93841c9390800290613126565b509250929050565b60008261317357506001610bda565b8161318057506000610bda565b816001811461319657600281146131a0576131bc565b6001915050610bda565b60ff8411156131b1576131b161310b565b50506001821b610bda565b5060208310610133831016604e8410600b84101617156131df575081810a610bda565b6131e98383613121565b80600019048211156131fd576131fd61310b565b029392505050565b6000611f738383613164565b600081600019048311821515161561322b5761322b61310b565b500290565b60006020828403121561324257600080fd5b5051919050565b60006020828403121561325b57600080fd5b8151611f7381612df8565b600082198211156132795761327961310b565b500190565b601f821115610eec57600081815260208120601f850160051c810160208610156132a55750805b601f850160051c820191505b81811015612819578281556001016132b1565b815167ffffffffffffffff8111156132de576132de612e5a565b6132f2816132ec84546130ae565b8461327e565b602080601f831160018114613327576000841561330f5750858301515b600019600386901b1c1916600185901b178555612819565b600085815260208120601f198616915b8281101561335657888601518255948401946001909101908401613337565b50858210156133745787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008351613396818460208801612cf0565b8351908301906133aa818360208801612cf0565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b600082516133db818460208701612cf0565b9190910192915050565b6000600182016133f7576133f761310b565b5060010190565b6000828210156134105761341061310b565b500390565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061344890830184612d1c565b9695505050505050565b60006020828403121561346457600080fd5b8151611f7381612ca456fea2646970667358221220e2fe3d09f390965b8cb61cb01d367713e140a75bf4bb38b48404d0ab9a5c112364736f6c634300080f003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000abea70e445e0cde24e5952b6e343e24e44b78b780000000000000000000000000000000000000000000000000000000000000009466c75696450617373000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f4f4f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103a25760003560e01c806370a08231116101e5578063c24d96e61161010c578063da4b81ee116100a5578063e985e9c511610077578063e985e9c514610af7578063f714cb4414610b17578063fafb763e14610b2d578063fc0c546a14610b4e578063fec40e8e14610b6e57005b8063da4b81ee14610a67578063da5a75a814610a97578063e09574c614610ab7578063e6009a6b14610ad757005b8063d250522d116100de578063d250522d146107ed578063d551850b14610a05578063d687b3e914610a25578063d7c64e7f14610a5157005b8063c24d96e614610993578063c36cc02c146109a8578063c547e4af146109cf578063c87b56dd146109e557005b8063a0712d681161017e578063afa5704011610150578063afa5704014610904578063b0cc010a14610924578063b88d4fde1461093a578063b91816111461095a57005b8063a0712d681461089c578063a22cb465146108af578063a954e08e146108cf578063abe96a83146108ef57005b8063825a85b5116101b7578063825a85b51461081757806395d89b4114610837578063999e476a1461084c5780639e888da91461086c57005b806370a08231146107b8578063734b8147146107d8578063736bf591146107ed5780637e7701e31461080257005b806338348887116102c957806353e4c94c116102625780636352211e116102345780636352211e1461074257806364d99b481461076257806368dcf01514610782578063695f9a391461079857005b806353e4c94c146106ad5780635caeb579146106c75780635e7057a4146106e7578063618c66321461070757005b8063450f3e2d1161029b578063450f3e2d1461062057806347e674981461064d5780634925407e1461066d5780634acff6fa1461068d57005b806338348887146105b65780633a5bda93146105cb5780633d8adfd0146105eb57806342842e0e1461060057005b806314ca514a1161033b5780632818553f1161030d5780632818553f146105355780632bfe8742146105555780633040e00b146105755780633065fb601461059557005b806314ca514a146104c657806318160ddd146104dc57806323b872dd146104f5578063253c8bd41461051557005b8063095ea7b311610374578063095ea7b31461045a5780630ad78a921461047a5780630f2cdd6c1461049a5780631249c58b146104be57005b806301ffc9a7146103ab5780630587e9ab146103e057806306fdde0314610400578063081812fc1461042257005b366103a957005b005b3480156103b757600080fd5b506103cb6103c6366004612cba565b610b8e565b60405190151581526020015b60405180910390f35b3480156103ec57600080fd5b506103a96103fb366004612cd7565b610be0565b34801561040c57600080fd5b50610415610c32565b6040516103d79190612d48565b34801561042e57600080fd5b5061044261043d366004612cd7565b610cc4565b6040516001600160a01b0390911681526020016103d7565b34801561046657600080fd5b506103a9610475366004612d77565b610d08565b34801561048657600080fd5b506103a9610495366004612da1565b610dda565b3480156104a657600080fd5b506104b060095481565b6040519081526020016103d7565b6104b0610e40565b3480156104d257600080fd5b506104b060085481565b3480156104e857600080fd5b50601754601654036104b0565b34801561050157600080fd5b506103a9610510366004612dbc565b610ed5565b34801561052157600080fd5b506103a9610530366004612da1565b610ef1565b34801561054157600080fd5b506103a9610550366004612cd7565b610f57565b34801561056157600080fd5b506103a9610570366004612e06565b610fa0565b34801561058157600080fd5b506103a9610590366004612da1565b61100f565b3480156105a157600080fd5b506003546103cb90600160a01b900460ff1681565b3480156105c257600080fd5b50600f546104b0565b3480156105d757600080fd5b506103a96105e6366004612e3d565b611075565b3480156105f757600080fd5b506104156110d5565b34801561060c57600080fd5b506103a961061b366004612dbc565b611163565b34801561062c57600080fd5b506104b061063b366004612da1565b601f6020526000908152604090205481565b34801561065957600080fd5b506103a9610668366004612cd7565b61118a565b34801561067957600080fd5b506103a9610688366004612e3d565b6111d3565b34801561069957600080fd5b50600354610442906001600160a01b031681565b3480156106b957600080fd5b506007546103cb9060ff1681565b3480156106d357600080fd5b506103a96106e2366004612cd7565b611235565b3480156106f357600080fd5b506103a9610702366004612cd7565b61127e565b34801561071357600080fd5b506103cb610722366004612d77565b601e60209081526000928352604080842090915290825290205460ff1681565b34801561074e57600080fd5b5061044261075d366004612cd7565b6112c7565b34801561076e57600080fd5b506103a961077d366004612e3d565b6112d2565b34801561078e57600080fd5b506104b060065481565b3480156107a457600080fd5b50600554610442906001600160a01b031681565b3480156107c457600080fd5b506104b06107d3366004612da1565b611329565b3480156107e457600080fd5b506103a9611372565b3480156107f957600080fd5b506016546104b0565b34801561080e57600080fd5b506103a96113c7565b34801561082357600080fd5b506103a9610832366004612da1565b61141b565b34801561084357600080fd5b506104156114c0565b34801561085857600080fd5b506103a9610867366004612cd7565b6114cf565b34801561087857600080fd5b506103cb610887366004612cd7565b60106020526000908152604090205460ff1681565b6104b06108aa366004612cd7565b611518565b3480156108bb57600080fd5b506103a96108ca366004612e06565b611c9e565b3480156108db57600080fd5b506103a96108ea366004612cd7565b611d33565b3480156108fb57600080fd5b506103a9611d7c565b34801561091057600080fd5b506103a961091f366004612ee6565b611e44565b34801561093057600080fd5b506104b0600b5481565b34801561094657600080fd5b506103a9610955366004612f2f565b611e98565b34801561096657600080fd5b506103cb610975366004612da1565b6001600160a01b031660009081526020819052604090205460ff1690565b34801561099f57600080fd5b50610415611eee565b3480156109b457600080fd5b50600c5461044290630100000090046001600160a01b031681565b3480156109db57600080fd5b506104b060045481565b3480156109f157600080fd5b50610415610a00366004612cd7565b611efb565b348015610a1157600080fd5b506103a9610a20366004612ee6565b611f7a565b348015610a3157600080fd5b506104b0610a40366004612da1565b602080526000908152604090205481565b348015610a5d57600080fd5b506104b060215481565b348015610a7357600080fd5b50610a87610a82366004612cd7565b611fca565b6040516103d79493929190613000565b348015610aa357600080fd5b506103a9610ab2366004612da1565b61231d565b348015610ac357600080fd5b506103a9610ad2366004612e3d565b612397565b348015610ae357600080fd5b50610415610af2366004612cd7565b6123f9565b348015610b0357600080fd5b506103cb610b12366004613058565b61242b565b348015610b2357600080fd5b506104b0600a5481565b348015610b3957600080fd5b506005546103cb90600160a01b900460ff1681565b348015610b5a57600080fd5b50600e54610442906001600160a01b031681565b348015610b7a57600080fd5b506103a9610b89366004612cd7565b612482565b60006301ffc9a760e01b6001600160e01b031983161480610bbf57506380ac58cd60e01b6001600160e01b03198316145b80610bda5750635b5e139f60e01b6001600160e01b03198316145b92915050565b3360009081526020819052604090205460ff1680610c0857506001546001600160a01b031633145b610c2d5760405162461bcd60e51b8152600401610c249061308b565b60405180910390fd5b600455565b606060188054610c41906130ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6d906130ae565b8015610cba5780601f10610c8f57610100808354040283529160200191610cba565b820191906000526020600020905b815481529060010190602001808311610c9d57829003601f168201915b5050505050905090565b6000610ccf826124cb565b610cec576040516333d1c03960e21b815260040160405180910390fd5b506000908152601c60205260409020546001600160a01b031690565b6000610d13826124f3565b9050806001600160a01b0316836001600160a01b031603610d475760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610d7e57610d61813361242b565b610d7e576040516367d9dca160e11b815260040160405180910390fd5b6000828152601c602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3360009081526020819052604090205460ff1680610e0257506001546001600160a01b031633145b610e1e5760405162461bcd60e51b8152600401610c249061308b565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b600154600090600160a01b900460ff1615610e895760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610c24565b6001805460ff60a01b1916600160a01b17905560405162461bcd60e51b815260206004820152600e60248201526d4e656564206d696e74206d6f646560901b6044820152606401610c24565b333014610ee157600080fd5b610eec83838361255a565b505050565b3360009081526020819052604090205460ff1680610f1957506001546001600160a01b031633145b610f355760405162461bcd60e51b8152600401610c249061308b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680610f7f57506001546001600160a01b031633145b610f9b5760405162461bcd60e51b8152600401610c249061308b565b600655565b3360009081526020819052604090205460ff1680610fc857506001546001600160a01b031633145b610fe45760405162461bcd60e51b8152600401610c249061308b565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b3360009081526020819052604090205460ff168061103757506001546001600160a01b031633145b6110535760405162461bcd60e51b8152600401610c249061308b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff168061109d57506001546001600160a01b031633145b6110b95760405162461bcd60e51b8152600401610c249061308b565b600c8054911515620100000262ff000019909216919091179055565b601180546110e2906130ae565b80601f016020809104026020016040519081016040528092919081815260200182805461110e906130ae565b801561115b5780601f106111305761010080835404028352916020019161115b565b820191906000526020600020905b81548152906001019060200180831161113e57829003601f168201915b505050505081565b33301461116f57600080fd5b610eec83838360405180602001604052806000815250611e98565b3360009081526020819052604090205460ff16806111b257506001546001600160a01b031633145b6111ce5760405162461bcd60e51b8152600401610c249061308b565b600855565b3360009081526020819052604090205460ff16806111fb57506001546001600160a01b031633145b6112175760405162461bcd60e51b8152600401610c249061308b565b60058054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526020819052604090205460ff168061125d57506001546001600160a01b031633145b6112795760405162461bcd60e51b8152600401610c249061308b565b600955565b3360009081526020819052604090205460ff16806112a657506001546001600160a01b031633145b6112c25760405162461bcd60e51b8152600401610c249061308b565b600b55565b6000610bda826124f3565b3360009081526020819052604090205460ff16806112fa57506001546001600160a01b031633145b6113165760405162461bcd60e51b8152600401610c249061308b565b6007805460ff1916911515919091179055565b60008160000361134c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152601b602052604090205467ffffffffffffffff1690565b3360009081526020819052604090205460ff168061139a57506001546001600160a01b031633145b6113b65760405162461bcd60e51b8152600401610c249061308b565b600c805461ffff1916610100179055565b3360009081526020819052604090205460ff16806113ef57506001546001600160a01b031633145b61140b5760405162461bcd60e51b8152600401610c249061308b565b600c805461ffff19166001179055565b3360009081526020819052604090205460ff168061144357506001546001600160a01b031633145b61145f5760405162461bcd60e51b8152600401610c249061308b565b600c80546301000000600160b81b03191663010000006001600160a01b0393841681029190911791829055600d8054919092049092166001600160a01b0319909216821790556000908152602081905260409020805460ff19166001179055565b606060198054610c41906130ae565b3360009081526020819052604090205460ff16806114f757506001546001600160a01b031633145b6115135760405162461bcd60e51b8152600401610c249061308b565b600f55565b600154600090600160a01b900460ff16156115615760405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606401610c24565b6001805460ff60a01b1916600160a01b179055600c54610100900460ff166115f4573360009081526020819052604090205460ff166115ef57600b5433600090815260026020526040902054106115ef5760405162461bcd60e51b8152602060048201526012602482015271165bdd48185b1c9958591e481b5a5b9d195960721b6044820152606401610c24565b61165e565b6009543360009081526002602052604090205410801561162557503360009081526002602052604090206001015442115b61165e5760405162461bcd60e51b815260206004820152600a602482015269135a5b9d081b1a5b5a5d60b21b6044820152606401610c24565b60075460ff16156116af5760085434146116af5760405162461bcd60e51b815260206004820152601260248201527108ae8d040ecc2d8eaca40dad2e6dac2e8c6d60731b6044820152606401610c24565b816000036118ff57600554600160a01b900460ff166117105760405162461bcd60e51b815260206004820152601860248201527f437573746f6d20746f6b656e206e6f7420656e61626c656400000000000000006044820152606401610c24565b6005546040805163313ce56760e01b815290516001600160a01b0390921691600091839163313ce567916004808201926020929091908290030181865afa15801561175f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178391906130e8565b60ff169050600061179582600a613205565b6006546117a29190613211565b604051636eb1769f60e11b81523360048201523060248201529091506000906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa1580156117f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118169190613230565b9050818110156118545760405162461bcd60e51b8152602060048201526009602482015268416c6c6f77616e636560b81b6044820152606401610c24565b6001600160a01b0384166323b872dd333061187087600a613205565b60065461187d9190613211565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af11580156118d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f59190613249565b5050505050611bdb565b81600103611ab657600354600160a01b900460ff166119605760405162461bcd60e51b815260206004820152601760248201527f4f4f4f206d6f6465206973206e6f7420656e61626c65640000000000000000006044820152606401610c24565b600354604051636eb1769f60e11b81523360048201523060248201526001600160a01b0390911690600090829063dd62ed3e90604401602060405180830381865afa1580156119b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d79190613230565b90506000600654670de0b6b3a76400006119f19190613211565b905080821015611a365760405162461bcd60e51b815260206004820152601060248201526f416c6c6f77616e6365206f6e204f4f4f60801b6044820152606401610c24565b6040516323b872dd60e01b8152336004820152306024820152604481018290526001600160a01b038416906323b872dd906064016020604051808303816000875af1158015611a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aad9190613249565b50505050611bdb565b81600203611b79576003546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2f9190613230565b905060008111611b725760405162461bcd60e51b815260206004820152600e60248201526d4e6f204f4f4f20686f6c64696e6760901b6044820152606401610c24565b5050611bdb565b60405162461bcd60e51b815260206004820152603160248201527f4d696e74696e67206d6f6465206973206e6f742076616c69642028706c656173604482015270652075736520302c203120616e6420322960781b6064820152608401610c24565b60215460165410611c1e5760405162461bcd60e51b815260206004820152600d60248201526c131a5b5a5d081c995858da1959609a1b6044820152606401610c24565b6000611c2b336001612821565b3360009081526020819052604090205490915060ff16611c8b57336000908152600260205260408120805460019290611c65908490613266565b9091555050600a54611c779042613266565b336000908152600260205260409020600101555b6001805460ff60a01b1916905592915050565b336001600160a01b03831603611cc75760405163b06307db60e01b815260040160405180910390fd5b336000818152601d602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526020819052604090205460ff1680611d5b57506001546001600160a01b031633145b611d775760405162461bcd60e51b8152600401610c249061308b565b600a55565b3360009081526020819052604090205460ff1680611da457506001546001600160a01b031633145b611dc05760405162461bcd60e51b8152600401610c249061308b565b604051600090339047908381818185875af1925050503d8060008114611e02576040519150601f19603f3d011682016040523d82523d6000602084013e611e07565b606091505b5050905080611e415760405162461bcd60e51b815260206004820152600660248201526511985a5b195960d21b6044820152606401610c24565b50565b3360009081526020819052604090205460ff1680611e6c57506001546001600160a01b031633145b611e885760405162461bcd60e51b8152600401610c249061308b565b6011611e9482826132c4565b5050565b333014611ea457600080fd5b611eaf84848461255a565b6001600160a01b0383163b15611ee857611ecb84848484612b4b565b611ee8576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b601280546110e2906130ae565b600c546060908190610100900460ff1615611f1f57611f18612c37565b9050611f2a565b611f27612c46565b90505b8051600003611f485760405180602001604052806000815250611f73565b80611f5284612c55565b604051602001611f63929190613384565b6040516020818303038152906040525b9392505050565b3360009081526020819052604090205460ff1680611fa257506001546001600160a01b031633145b611fbe5760405162461bcd60e51b8152600401610c249061308b565b6012611e9482826132c4565b600081815260156020526040812080546060928392839283929190611fee906130ae565b80601f016020809104026020016040519081016040528092919081815260200182805461201a906130ae565b80156120675780601f1061203c57610100808354040283529160200191612067565b820191906000526020600020905b81548152906001019060200180831161204a57829003601f168201915b505050505090506000601560008881526020019081526020016000206001018054612091906130ae565b80601f01602080910402602001604051908101604052809291908181526020018280546120bd906130ae565b801561210a5780601f106120df5761010080835404028352916020019161210a565b820191906000526020600020905b8154815290600101906020018083116120ed57829003601f168201915b50505050509050600060156000898152602001908152602001600020600201805480602002602001604051908101604052809291908181526020016000905b828210156121f5578382906000526020600020018054612168906130ae565b80601f0160208091040260200160405190810160405280929190818152602001828054612194906130ae565b80156121e15780601f106121b6576101008083540402835291602001916121e1565b820191906000526020600020905b8154815290600101906020018083116121c457829003601f168201915b505050505081526020019060010190612149565b505050509050606060005b865181101561230d57601560008b8152602001908152602001600020600301878281518110612231576122316133b3565b602002602001015160405161224691906133c9565b9081526020016040518091039020805461225f906130ae565b80601f016020809104026020016040519081016040528092919081815260200182805461228b906130ae565b80156122d85780601f106122ad576101008083540402835291602001916122d8565b820191906000526020600020905b8154815290600101906020018083116122bb57829003601f168201915b50505050508282815181106122ef576122ef6133b3565b60200260200101819052508080612305906133e5565b915050612200565b5092989197509550909350915050565b3360009081526020819052604090205460ff168061234557506001546001600160a01b031633145b6123615760405162461bcd60e51b8152600401610c249061308b565b601380546001600160a01b039092166001600160a01b031992831681179091556014805483168217905560038054909216179055565b3360009081526020819052604090205460ff16806123bf57506001546001600160a01b031633145b6123db5760405162461bcd60e51b8152600401610c249061308b565b60038054911515600160a01b0260ff60a01b19909216919091179055565b6060612404826124cb565b61242157604051630a14c4b560e41b815260040160405180910390fd5b6000611f27612c46565b600c546000906001600160a01b03630100000090910481169083160361245357506001610bda565b506001600160a01b039182166000908152601d6020908152604080832093909416825291909152205460ff1690565b3360009081526020819052604090205460ff16806124aa57506001546001600160a01b031633145b6124c65760405162461bcd60e51b8152600401610c249061308b565b602155565b600060165482108015610bda5750506000908152601a6020526040902054600160e01b161590565b600081601654811015612541576000818152601a602052604081205490600160e01b8216900361253f575b80600003611f735750600019016000818152601a602052604090205461251e565b505b604051636f96cda160e11b815260040160405180910390fd5b6001600160a01b0383166000818152601e602090815260408083208584528252808320805460ff19169055928252601f90529081208054600192906125a09084906133fe565b90915550506001600160a01b038083166000908152601e602090815260408083208584528252808320805460ff191660019081179091559387168352601f909152812080549091906125f3908490613266565b9091555060009050612604826124f3565b9050836001600160a01b0316816001600160a01b0316146126375760405162a1148160e81b815260040160405180910390fd5b6000828152601c60205260408120546001600160a01b03908116919086163314806126675750612667863361242b565b8061267a57506001600160a01b03821633145b90508061269a57604051632ce44b5f60e11b815260040160405180910390fd5b846000036126bb57604051633a954ecd60e21b815260040160405180910390fd5b81156126de576000848152601c6020526040902080546001600160a01b03191690555b6001600160a01b038681166000908152601b602090815260408083208054600019019055928816825282822080546001019055868252601a9052908120600160e11b4260a01b881781179091558416900361276957600184016000818152601a60205260408120549003612767576016548114612767576000818152601a602052604090208490555b505b600d54604051634b5b0bcd60e11b81526001600160a01b038881166004830152878116602483015260448201879052909116906396b6179a90606401600060405180830381600087803b1580156127bf57600080fd5b505af11580156127d3573d6000803e3d6000fd5b5050505083856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6016546000908360000361284757604051622e076360e81b815260040160405180910390fd5b826000036128685760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0384166000908152601b602090815260408083208054680100000000000000018802019055838352601a90915290204260a01b85176001851460e11b179055808084015b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106128b35750601655600c5462010000900460ff1615612ad2576014546040516370a0823160e01b81526001600160a01b03868116600483015260009216906370a0823190602401602060405180830381865afa158015612956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297a9190613230565b600d546040516302b5e86760e01b81526001600160a01b038881166004830152602482018490529293509116906302b5e86790604401600060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b5050600d546040516310b23add60e31b81526001600160a01b038981166004830152600094509091169150638591d6e890602401602060405180830381865afa158015612a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a539190613230565b600d549091506001600160a01b0316637aa0d8b3612a72856001613266565b836040518363ffffffff1660e01b8152600401612a99929190918252602082015260400190565b600060405180830381600087803b158015612ab357600080fd5b505af1158015612ac7573d6000803e3d6000fd5b505050505050612b40565b600d546040516306fc05e960e51b81526001600160a01b03868116600483015260248201869052604482018490529091169063df80bd2090606401600060405180830381600087803b158015612b2757600080fd5b505af1158015612b3b573d6000803e3d6000fd5b505050505b505060165492915050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612b80903390899088908890600401613415565b6020604051808303816000875af1925050508015612bbb575060408051601f3d908101601f19168201909252612bb891810190613452565b60015b612c19573d808015612be9576040519150601f19603f3d011682016040523d82523d6000602084013e612bee565b606091505b508051600003612c11576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060128054610c41906130ae565b606060118054610c41906130ae565b604080516080810191829052607f0190826030600a8206018353600a90045b8015612c9257600183039250600a81066030018353600a9004612c74565b50819003601f19909101908152919050565b6001600160e01b031981168114611e4157600080fd5b600060208284031215612ccc57600080fd5b8135611f7381612ca4565b600060208284031215612ce957600080fd5b5035919050565b60005b83811015612d0b578181015183820152602001612cf3565b83811115611ee85750506000910152565b60008151808452612d34816020860160208601612cf0565b601f01601f19169290920160200192915050565b602081526000611f736020830184612d1c565b80356001600160a01b0381168114612d7257600080fd5b919050565b60008060408385031215612d8a57600080fd5b612d9383612d5b565b946020939093013593505050565b600060208284031215612db357600080fd5b611f7382612d5b565b600080600060608486031215612dd157600080fd5b612dda84612d5b565b9250612de860208501612d5b565b9150604084013590509250925092565b8015158114611e4157600080fd5b60008060408385031215612e1957600080fd5b612e2283612d5b565b91506020830135612e3281612df8565b809150509250929050565b600060208284031215612e4f57600080fd5b8135611f7381612df8565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612e8b57612e8b612e5a565b604051601f8501601f19908116603f01168101908282118183101715612eb357612eb3612e5a565b81604052809350858152868686011115612ecc57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612ef857600080fd5b813567ffffffffffffffff811115612f0f57600080fd5b8201601f81018413612f2057600080fd5b612c2f84823560208401612e70565b60008060008060808587031215612f4557600080fd5b612f4e85612d5b565b9350612f5c60208601612d5b565b925060408501359150606085013567ffffffffffffffff811115612f7f57600080fd5b8501601f81018713612f9057600080fd5b612f9f87823560208401612e70565b91505092959194509250565b600081518084526020808501808196508360051b8101915082860160005b85811015612ff3578284038952612fe1848351612d1c565b98850198935090840190600101612fc9565b5091979650505050505050565b6080815260006130136080830187612d1c565b82810360208401526130258187612d1c565b905082810360408401526130398186612fab565b9050828103606084015261304d8185612fab565b979650505050505050565b6000806040838503121561306b57600080fd5b61307483612d5b565b915061308260208401612d5b565b90509250929050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b600181811c908216806130c257607f821691505b6020821081036130e257634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156130fa57600080fd5b815160ff81168114611f7357600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561315c5781600019048211156131425761314261310b565b8085161561314f57918102915b93841c9390800290613126565b509250929050565b60008261317357506001610bda565b8161318057506000610bda565b816001811461319657600281146131a0576131bc565b6001915050610bda565b60ff8411156131b1576131b161310b565b50506001821b610bda565b5060208310610133831016604e8410600b84101617156131df575081810a610bda565b6131e98383613121565b80600019048211156131fd576131fd61310b565b029392505050565b6000611f738383613164565b600081600019048311821515161561322b5761322b61310b565b500290565b60006020828403121561324257600080fd5b5051919050565b60006020828403121561325b57600080fd5b8151611f7381612df8565b600082198211156132795761327961310b565b500190565b601f821115610eec57600081815260208120601f850160051c810160208610156132a55750805b601f850160051c820191505b81811015612819578281556001016132b1565b815167ffffffffffffffff8111156132de576132de612e5a565b6132f2816132ec84546130ae565b8461327e565b602080601f831160018114613327576000841561330f5750858301515b600019600386901b1c1916600185901b178555612819565b600085815260208120601f198616915b8281101561335657888601518255948401946001909101908401613337565b50858210156133745787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008351613396818460208801612cf0565b8351908301906133aa818360208801612cf0565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b600082516133db818460208701612cf0565b9190910192915050565b6000600182016133f7576133f761310b565b5060010190565b6000828210156134105761341061310b565b500390565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061344890830184612d1c565b9695505050505050565b60006020828403121561346457600080fd5b8151611f7381612ca456fea2646970667358221220e2fe3d09f390965b8cb61cb01d367713e140a75bf4bb38b48404d0ab9a5c112364736f6c634300080f0033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000abea70e445e0cde24e5952b6e343e24e44b78b780000000000000000000000000000000000000000000000000000000000000009466c75696450617373000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f4f4f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): FluidPass
Arg [1] : symbol_ (string): OOO
Arg [2] : _max_mint (uint256): 10000
Arg [3] : initial_mint (uint256): 1
Arg [4] : owner_ (address): 0xABEa70E445e0cde24e5952B6E343e24e44b78B78

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 000000000000000000000000abea70e445e0cde24e5952b6e343e24e44b78b78
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [6] : 466c756964506173730000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 4f4f4f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

617:39159:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6083:607;;;;;;;;;;-1:-1:-1;6083:607:1;;;;;:::i;:::-;;:::i;:::-;;;565:14:3;;558:22;540:41;;528:2;513:18;6083:607:1;;;;;;;;1580:94:0;;;;;;;;;;-1:-1:-1;1580:94:0;;;;;:::i;:::-;;:::i;10993:98:1:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;14398:200::-;;;;;;;;;;-1:-1:-1;14398:200:1;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:3;;;1674:51;;1662:2;1647:18;14398:200:1;1528:203:3;13869:468:1;;;;;;;;;;-1:-1:-1;13869:468:1;;;;;:::i;:::-;;:::i;1029:102:0:-;;;;;;;;;;-1:-1:-1;1029:102:0;;;;;:::i;:::-;;:::i;571:32::-;;;;;;;;;;;;;;;;;;;2510:25:3;;;2498:2;2483:18;571:32:0;2364:177:3;20142:112:1;;;:::i;535:29:0:-;;;;;;;;;;;;;;;;5168:309:1;;;;;;;;;;-1:-1:-1;5430:12:1;;5414:13;;:28;5168:309;;15434:181;;;;;;;;;;-1:-1:-1;15434:181:1;;;;;:::i;:::-;;:::i;713:91:2:-;;;;;;;;;;-1:-1:-1;713:91:2;;;;;:::i;:::-;;:::i;1783:98:0:-;;;;;;;;;;-1:-1:-1;1783:98:0;;;;;:::i;:::-;;:::i;234:104:2:-;;;;;;;;;;-1:-1:-1;234:104:2;;;;;:::i;:::-;;:::i;1137:98:0:-;;;;;;;;;;-1:-1:-1;1137:98:0;;;;;:::i;:::-;;:::i;303:35::-;;;;;;;;;;-1:-1:-1;303:35:0;;;;-1:-1:-1;;;303:35:0;;;;;;13137:115:1;;;;;;;;;;-1:-1:-1;13231:13:1;;13137:115;;985:97;;;;;;;;;;-1:-1:-1;985:97:1;;;;;:::i;:::-;;:::i;1236:23::-;;;;;;;;;;;;;:::i;15681:192::-;;;;;;;;;;-1:-1:-1;15681:192:1;;;;;:::i;:::-;;:::i;4025:50::-;;;;;;;;;;-1:-1:-1;4025:50:1;;;;;:::i;:::-;;;;;;;;;;;;;;1680:97:0;;;;;;;;;;-1:-1:-1;1680:97:0;;;;;:::i;:::-;;:::i;1362:94::-;;;;;;;;;;-1:-1:-1;1362:94:0;;;;;:::i;:::-;;:::i;270:27::-;;;;;;;;;;-1:-1:-1;270:27:0;;;;-1:-1:-1;;;;;270:27:0;;;495:34;;;;;;;;;;-1:-1:-1;495:34:0;;;;;;;;709:91;;;;;;;;;;-1:-1:-1;709:91:0;;;;;:::i;:::-;;:::i;899:97::-;;;;;;;;;;-1:-1:-1;899:97:0;;;;;:::i;:::-;;:::i;3954:64:1:-;;;;;;;;;;-1:-1:-1;3954:64:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;10789:142;;;;;;;;;;-1:-1:-1;10789:142:1;;;;;:::i;:::-;;:::i;1266:90:0:-;;;;;;;;;;-1:-1:-1;1266:90:0;;;;;:::i;:::-;;:::i;460:28::-;;;;;;;;;;;;;;;;382:29;;;;;;;;;;-1:-1:-1;382:29:0;;;;-1:-1:-1;;;;;382:29:0;;;6749:234:1;;;;;;;;;;-1:-1:-1;6749:234:1;;;;;:::i;:::-;;:::i;2057:96:0:-;;;;;;;;;;;;;:::i;5570:277:1:-;;;;;;;;;;-1:-1:-1;5799:13:1;;5570:277;;1952:99:0;;;;;;;;;;;;;:::i;815:163:1:-;;;;;;;;;;-1:-1:-1;815:163:1;;;;;:::i;:::-;;:::i;11155:102::-;;;;;;;;;;;;;:::i;13026:105::-;;;;;;;;;;-1:-1:-1;13026:105:1;;;;;:::i;:::-;;:::i;1185:44::-;;;;;;;;;;-1:-1:-1;1185:44:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;20260:2520;;;;;;:::i;:::-;;:::i;14665:303::-;;;;;;;;;;-1:-1:-1;14665:303:1;;;;;:::i;:::-;;:::i;806:87:0:-;;;;;;;;;;-1:-1:-1;806:87:0;;;;;:::i;:::-;;:::i;19729:165:1:-;;;;;;;;;;;;;:::i;12095:98::-;;;;;;;;;;-1:-1:-1;12095:98:1;;;;;:::i;:::-;;:::i;648:32:0:-;;;;;;;;;;;;;;;;15939:402:1;;;;;;;;;;-1:-1:-1;15939:402:1;;;;;:::i;:::-;;:::i;132:97:2:-;;;;;;;;;;-1:-1:-1;132:97:2;;;;;:::i;:::-;-1:-1:-1;;;;;209:13:2;186:4;209:13;;;;;;;;;;;;;;132:97;1265:27:1;;;;;;;;;;;;;:::i;734:20::-;;;;;;;;;;-1:-1:-1;734:20:1;;;;;;;-1:-1:-1;;;;;734:20:1;;;344:30:0;;;;;;;;;;;;;;;;11652:437:1;;;;;;;;;;-1:-1:-1;11652:437:1;;;;;:::i;:::-;;:::i;12353:114::-;;;;;;;;;;-1:-1:-1;12353:114:1;;;;;:::i;:::-;;:::i;4082:56::-;;;;;;;;;;-1:-1:-1;4082:56:1;;;;;:::i;:::-;;;;;;;;;;;;;;4168:20;;;;;;;;;;;;;;;;39177:596;;;;;;;;;;-1:-1:-1;39177:596:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;12199:148::-;;;;;;;;;;-1:-1:-1;12199:148:1;;;;;:::i;:::-;;:::i;1462:90:0:-;;;;;;;;;;-1:-1:-1;1462:90:0;;;;;:::i;:::-;;:::i;11323:323:1:-;;;;;;;;;;-1:-1:-1;11323:323:1;;;;;:::i;:::-;;:::i;15034:250::-;;;;;;;;;;-1:-1:-1;15034:250:1;;;;;:::i;:::-;;:::i;609:33:0:-;;;;;;;;;;;;;;;;417:37;;;;;;;;;;-1:-1:-1;417:37:0;;;;-1:-1:-1;;;417:37:0;;;;;;788:20:1;;;;;;;;;;-1:-1:-1;788:20:1;;;;-1:-1:-1;;;;;788:20:1;;;12930:90;;;;;;;;;;-1:-1:-1;12930:90:1;;;;;:::i;:::-;;:::i;6083:607::-;6168:4;-1:-1:-1;;;;;;;;;6463:25:1;;;;:101;;-1:-1:-1;;;;;;;;;;6539:25:1;;;6463:101;:177;;;-1:-1:-1;;;;;;;;;;6615:25:1;;;6463:177;6444:196;6083:607;-1:-1:-1;;6083:607:1:o;1580:94:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;;;;;;;;;1641:14:0::1;:26:::0;1580:94::o;10993:98:1:-;11047:13;11079:5;11072:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10993:98;:::o;14398:200::-;14466:7;14490:16;14498:7;14490;:16::i;:::-;14485:64;;14515:34;;-1:-1:-1;;;14515:34:1;;;;;;;;;;;14485:64;-1:-1:-1;14567:24:1;;;;:15;:24;;;;;;-1:-1:-1;;;;;14567:24:1;;14398:200::o;13869:468::-;13941:14;13974:27;13993:7;13974:18;:27::i;:::-;13941:62;;14023:6;-1:-1:-1;;;;;14017:12:1;:2;-1:-1:-1;;;;;14017:12:1;;14013:49;;14038:24;;-1:-1:-1;;;14038:24:1;;;;;;;;;;;14013:49;35963:10;-1:-1:-1;;;;;14077:29:1;;;14073:174;;14125:45;14142:6;35963:10;15034:250;:::i;14125:45::-;14120:127;;14197:35;;-1:-1:-1;;;14197:35:1;;;;;;;;;;;14120:127;14257:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;14257:29:1;-1:-1:-1;;;;;14257:29:1;;;;;;;;;14301;;14257:24;;14301:29;;;;;;;13931:406;13869:468;;:::o;1029:102:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1104:14:0::1;:20:::0;;-1:-1:-1;;;;;;1104:20:0::1;-1:-1:-1::0;;;;;1104:20:0;;;::::1;::::0;;;::::1;::::0;;1029:102::o;20142:112:1:-;623:6:2;;20186:7:1;;-1:-1:-1;;;623:6:2;;;;622:7;614:29;;;;-1:-1:-1;;;614:29:2;;8111:2:3;614:29:2;;;8093:21:3;8150:1;8130:18;;;8123:29;-1:-1:-1;;;8168:18:3;;;8161:39;8217:18;;614:29:2;7909:332:3;614:29:2;662:4;653:13;;-1:-1:-1;;;;653:13:2;-1:-1:-1;;;653:13:2;;;20205:24:1::1;::::0;-1:-1:-1;;;20205:24:1;;8448:2:3;20205:24:1::1;::::0;::::1;8430:21:3::0;8487:2;8467:18;;;8460:30;-1:-1:-1;;;8506:18:3;;;8499:44;8560:18;;20205:24:1::1;8246:338:3::0;15434:181:1;15330:10;15350:4;15330:25;15322:34;;;;;;15576:32:::1;15590:4;15596:2;15600:7;15576:13;:32::i;:::-;15434:181:::0;;;:::o;713:91:2:-;390:10;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;780:5:::1;:17:::0;;-1:-1:-1;;;;;;780:17:2::1;-1:-1:-1::0;;;;;780:17:2;;;::::1;::::0;;;::::1;::::0;;713:91::o;1783:98:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1846:16:0::1;:28:::0;1783:98::o;234:104:2:-;390:10;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;310:13:2;;;::::1;:7;:13:::0;;;::::1;::::0;;;;;;:21;;-1:-1:-1;;310:21:2::1;::::0;::::1;;::::0;;;::::1;::::0;;234:104::o;1137:98:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1210:12:0::1;:18:::0;;-1:-1:-1;;;;;;1210:18:0::1;-1:-1:-1::0;;;;;1210:18:0;;;::::1;::::0;;;::::1;::::0;;1137:98::o;985:97:1:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1052:11:1::1;:23:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;1052:23:1;;::::1;::::0;;;::::1;::::0;;985:97::o;1236:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15681:192::-;15330:10;15350:4;15330:25;15322:34;;;;;;15827:39:::1;15844:4;15850:2;15854:7;15827:39;;;;;;;;;;;::::0;:16:::1;:39::i;1680:97:0:-:0;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1741:17:0::1;:29:::0;1680:97::o;1362:94::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1424:17:0::1;:25:::0;;;::::1;;-1:-1:-1::0;;;1424:25:0::1;-1:-1:-1::0;;;;1424:25:0;;::::1;::::0;;;::::1;::::0;;1362:94::o;709:91::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;773:14:0::1;:20:::0;709:91::o;899:97::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;966:16:0::1;:23:::0;899:97::o;10789:142:1:-;10853:7;10895:27;10914:7;10895:18;:27::i;1266:90:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1326:15:0::1;:23:::0;;-1:-1:-1;;1326:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;1266:90::o;6749:234:1:-;6814:7;6855:6;6866:1;6837:30;6833:71;;6876:28;;-1:-1:-1;;;6876:28:1;;;;;;;;;;;6833:71;-1:-1:-1;;;;;;6921:26:1;;;;;:18;:26;;;;;;1760:13;6921:55;;6749:234::o;2057:96:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;2101:10:0::1;:18:::0;;-1:-1:-1;;2129:17:0;2101:18:::1;2129:17;::::0;;2057:96::o;1952:99::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1999:10:0::1;:17:::0;;-1:-1:-1;;2026:18:0;2012:4:::1;2026:18:::0;;;1952:99::o;815:163:1:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;885:5:1::1;:14:::0;;-1:-1:-1;;;;;;885:14:1::1;::::0;-1:-1:-1;;;;;885:14:1;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;909:16:::1;:31:::0;;934:5;;;::::1;::::0;;::::1;-1:-1:-1::0;;;;;;909:31:1;;::::1;::::0;::::1;::::0;;-1:-1:-1;950:14:1;;;::::1;::::0;;;;;;:21;;-1:-1:-1;;950:21:1::1;-1:-1:-1::0;950:21:1::1;::::0;;815:163::o;11155:102::-;11211:13;11243:7;11236:14;;;;;:::i;13026:105::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;13103:13:1::1;:21:::0;13026:105::o;20260:2520::-;623:6:2;;20318:7:1;;-1:-1:-1;;;623:6:2;;;;622:7;614:29;;;;-1:-1:-1;;;614:29:2;;8111:2:3;614:29:2;;;8093:21:3;8150:1;8130:18;;;8123:29;-1:-1:-1;;;8168:18:3;;;8161:39;8217:18;;614:29:2;7909:332:3;614:29:2;662:4;653:13;;-1:-1:-1;;;;653:13:2;-1:-1:-1;;;653:13:2;;;20397:10:1::1;::::0;653:13:2;20397:10:1;::::1;653:13:2::0;20397:10:1::1;20393:422;;20436:10;20428:7;:19:::0;;;::::1;::::0;;;;;;;::::1;;20423:136;;20505:16;::::0;20484:10:::1;20476:19;::::0;;;:7:::1;:19;::::0;;;;:26;:45:::1;20468:76;;;::::0;-1:-1:-1;;;20468:76:1;;8791:2:3;20468:76:1::1;::::0;::::1;8773:21:3::0;8830:2;8810:18;;;8803:30;-1:-1:-1;;;8849:18:3;;;8842:48;8907:18;;20468:76:1::1;8589:342:3::0;20468:76:1::1;20393:422;;;20711:14;::::0;20690:10:::1;20682:19;::::0;;;:7:::1;:19;::::0;;;;:26;:43:::1;20681:108:::0;::::1;;;-1:-1:-1::0;20757:10:1::1;20749:19;::::0;;;:7:::1;:19;::::0;;;;:39:::1;;::::0;20731:15:::1;:57;20681:108;20673:131;;;::::0;-1:-1:-1;;;20673:131:1;;9138:2:3;20673:131:1::1;::::0;::::1;9120:21:3::0;9177:2;9157:18;;;9150:30;-1:-1:-1;;;9196:18:3;;;9189:40;9246:18;;20673:131:1::1;8936:334:3::0;20673:131:1::1;20861:15;::::0;::::1;;20858:104;;;20911:17;;20900:9;:28;20892:59;;;::::0;-1:-1:-1;;;20892:59:1;;9477:2:3;20892:59:1::1;::::0;::::1;9459:21:3::0;9516:2;9496:18;;;9489:30;-1:-1:-1;;;9535:18:3;;;9528:48;9593:18;;20892:59:1::1;9275:342:3::0;20892:59:1::1;21013:9;21026:1;21013:14:::0;21010:1462:::1;;21051:17;::::0;-1:-1:-1;;;21051:17:1;::::1;;;21043:54;;;::::0;-1:-1:-1;;;21043:54:1;;9824:2:3;21043:54:1::1;::::0;::::1;9806:21:3::0;9863:2;9843:18;;;9836:30;9902:26;9882:18;;;9875:54;9946:18;;21043:54:1::1;9622:348:3::0;21043:54:1::1;21147:14;::::0;21198:29:::1;::::0;;-1:-1:-1;;;21198:29:1;;;;-1:-1:-1;;;;;21147:14:1;;::::1;::::0;21112:25:::1;::::0;21147:14;;21198:27:::1;::::0;:29:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;21147:14;21198:29:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21176:51;;::::0;-1:-1:-1;21241:27:1::1;21289:18;21176:51:::0;21289:2:::1;:18;:::i;:::-;21271:16;;:37;;;;:::i;:::-;21347:55;::::0;-1:-1:-1;;;21347:55:1;;21376:10:::1;21347:55;::::0;::::1;12144:34:3::0;21396:4:1::1;12194:18:3::0;;;12187:43;21241:67:1;;-1:-1:-1;21322:22:1::1;::::0;-1:-1:-1;;;;;21347:28:1;::::1;::::0;::::1;::::0;12079:18:3;;21347:55:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21322:80;;21445:22;21424:17;:43;;21416:65;;;::::0;-1:-1:-1;;;21416:65:1;;12632:2:3;21416:65:1::1;::::0;::::1;12614:21:3::0;12671:1;12651:18;;;12644:29;-1:-1:-1;;;12689:18:3;;;12682:39;12738:18;;21416:65:1::1;12430:332:3::0;21416:65:1::1;-1:-1:-1::0;;;;;21495:31:1;::::1;;21527:10;21547:4;21575:18;21579:14:::0;21575:2:::1;:18;:::i;:::-;21555:16;;:39;;;;:::i;:::-;21495:101;::::0;-1:-1:-1;;;;;;21495:101:1::1;::::0;;;;;;-1:-1:-1;;;;;13025:15:3;;;21495:101:1::1;::::0;::::1;13007:34:3::0;13077:15;;;;13057:18;;;13050:43;13109:18;;;13102:34;12942:18;;21495:101:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21029:583;;;;21010:1462;;;21657:9;21670:1;21657:14:::0;21654:818:::1;;21695:15;::::0;-1:-1:-1;;;21695:15:1;::::1;;;21687:51;;;::::0;-1:-1:-1;;;21687:51:1;;13599:2:3;21687:51:1::1;::::0;::::1;13581:21:3::0;13638:2;13618:18;;;13611:30;13677:25;13657:18;;;13650:53;13720:18;;21687:51:1::1;13397:347:3::0;21687:51:1::1;21778:12;::::0;21831:45:::1;::::0;-1:-1:-1;;;21831:45:1;;21851:10:::1;21831:45;::::0;::::1;12144:34:3::0;21870:4:1::1;12194:18:3::0;;;12187:43;-1:-1:-1;;;;;21778:12:1;;::::1;::::0;21752:16:::1;::::0;21778:12;;21831:19:::1;::::0;12079:18:3;;21831:45:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21805:71;;21890:25;21918:16;;21936:6;21918:25;;;;:::i;:::-;21890:53;;21986:20;21965:17;:41;;21957:70;;;::::0;-1:-1:-1;;;21957:70:1;;13951:2:3;21957:70:1::1;::::0;::::1;13933:21:3::0;13990:2;13970:18;;;13963:30;-1:-1:-1;;;14009:18:3;;;14002:46;14065:18;;21957:70:1::1;13749:340:3::0;21957:70:1::1;22041:71;::::0;-1:-1:-1;;;22041:71:1;;22064:10:::1;22041:71;::::0;::::1;13007:34:3::0;22084:4:1::1;13057:18:3::0;;;13050:43;13109:18;;;13102:34;;;-1:-1:-1;;;;;22041:22:1;::::1;::::0;::::1;::::0;12942:18:3;;22041:71:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21673:450;;;21654:818;;;22168:9;22181:1;22168:14:::0;22165:307:::1;;22224:12;::::0;22273:31:::1;::::0;-1:-1:-1;;;22273:31:1;;22293:10:::1;22273:31;::::0;::::1;1674:51:3::0;-1:-1:-1;;;;;22224:12:1;;::::1;::::0;22198:16:::1;::::0;22224:12;;22273:19:::1;::::0;1647:18:3;;22273:31:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22251:53;;22343:1;22326:14;:18;22318:45;;;::::0;-1:-1:-1;;;22318:45:1;;14296:2:3;22318:45:1::1;::::0;::::1;14278:21:3::0;14335:2;14315:18;;;14308:30;-1:-1:-1;;;14354:18:3;;;14347:44;14408:18;;22318:45:1::1;14094:338:3::0;22318:45:1::1;22184:190;;22165:307;;;22402:59;::::0;-1:-1:-1;;;22402:59:1;;14639:2:3;22402:59:1::1;::::0;::::1;14621:21:3::0;14678:2;14658:18;;;14651:30;14717:34;14697:18;;;14690:62;-1:-1:-1;;;14768:18:3;;;14761:47;14825:19;;22402:59:1::1;14437:413:3::0;22165:307:1::1;22508:8;;22492:13;;:24;22484:50;;;::::0;-1:-1:-1;;;22484:50:1;;15057:2:3;22484:50:1::1;::::0;::::1;15039:21:3::0;15096:2;15076:18;;;15069:30;-1:-1:-1;;;15115:18:3;;;15108:43;15168:18;;22484:50:1::1;14855:337:3::0;22484:50:1::1;22544:8;22555:20;22561:10;22573:1;22555:5;:20::i;:::-;22598:10;22590:7;:19:::0;;;::::1;::::0;;;;;;;22544:31;;-1:-1:-1;22590:19:1::1;;22585:169;;22634:10;22626:19;::::0;;;:7:::1;:19;::::0;;;;:31;;22656:1:::1;::::0;22626:19;:31:::1;::::0;22656:1;;22626:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;22731:12:1::1;::::0;22713:30:::1;::::0;:15:::1;:30;:::i;:::-;22679:10;22671:19;::::0;;;:7:::1;:19;::::0;;;;:39:::1;;:72:::0;22585:169:::1;687:6:2::0;:14;;-1:-1:-1;;;;687:14:2;;;22770:3:1;20260:2520;-1:-1:-1;;20260:2520:1:o;14665:303::-;35963:10;-1:-1:-1;;;;;14763:31:1;;;14759:61;;14803:17;;-1:-1:-1;;;14803:17:1;;;;;;;;;;;14759:61;35963:10;14831:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;14831:49:1;;;;;;;;;;;;:60;;-1:-1:-1;;14831:60:1;;;;;;;;;;14906:55;;540:41:3;;;14831:49:1;;35963:10;14906:55;;513:18:3;14906:55:1;;;;;;;14665:303;;:::o;806:87:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;868:12:0::1;:18:::0;806:87::o;19729:165:1:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;19802:49:1::1;::::0;19785:12:::1;::::0;19802:10:::1;::::0;19825:21:::1;::::0;19785:12;19802:49;19785:12;19802:49;19825:21;19802:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19784:67;;;19869:7;19861:26;;;::::0;-1:-1:-1;;;19861:26:1;;15742:2:3;19861:26:1::1;::::0;::::1;15724:21:3::0;15781:1;15761:18;;;15754:29;-1:-1:-1;;;15799:18:3;;;15792:36;15845:18;;19861:26:1::1;15540:329:3::0;19861:26:1::1;19774:120;19729:165::o:0;12095:98::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;12170:9:1::1;:16;12182:4:::0;12170:9;:16:::1;:::i;:::-;;12095:98:::0;:::o;15939:402::-;15330:10;15350:4;15330:25;15322:34;;;;;;16113:32:::1;16127:4;16133:2;16137:7;16113:13;:32::i;:::-;-1:-1:-1::0;;;;;16159:14:1;::::1;;:19:::0;16155:180:::1;;16197:56;16228:4;16234:2;16238:7;16247:5;16197:30;:56::i;:::-;16192:143;;16280:40;;-1:-1:-1::0;;;16280:40:1::1;;;;;;;;;;;16192:143;15939:402:::0;;;;:::o;1265:27::-;;;;;;;:::i;11652:437::-;11851:10;;11725:13;;;;11851:10;;;;;11848:123;;;11891:14;:12;:14::i;:::-;11877:28;;11848:123;;;11950:10;:8;:10::i;:::-;11936:24;;11848:123;11993:11;11987:25;12016:1;11987:30;:95;;;;;;;;;;;;;;;;;12044:11;12057:18;12067:7;12057:9;:18::i;:::-;12027:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11987:95;11980:102;11652:437;-1:-1:-1;;;11652:437:1:o;12353:114::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;12436:13:1::1;:24;12452:8:::0;12436:13;:24:::1;:::i;39177:596::-:0;39341:18;39362:23;;;:14;:23;;;;;39341:54;;39237:17;;;;;;;;39341:18;39362:23;39341:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39405:18;39426:14;:23;39441:7;39426:23;;;;;;;;;;;:33;;39405:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39469:27;39499:14;:23;39514:7;39499:23;;;;;;;;;;;:34;;39469:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39543:27;39584:6;39580:133;39596:10;:17;39592:1;:21;39580:133;;;39652:14;:23;39667:7;39652:23;;;;;;;;;;;:34;;39687:10;39698:1;39687:13;;;;;;;;:::i;:::-;;;;;;;39652:49;;;;;;:::i;:::-;;;;;;;;;;;;;39634:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;39646:1;39634:14;;;;;;;;:::i;:::-;;;;;;:68;;;;39615:3;;;;;:::i;:::-;;;;39580:133;;;-1:-1:-1;39729:4:1;;39735;;-1:-1:-1;39735:4:1;-1:-1:-1;39729:4:1;;-1:-1:-1;39177:596:1;-1:-1:-1;;39177:596:1:o;12199:148::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;12262:11:1::1;:17:::0;;-1:-1:-1;;;;;12262:17:1;;::::1;-1:-1:-1::0;;;;;;12262:17:1;;::::1;::::0;::::1;::::0;;;12289:9:::1;:23:::0;;;::::1;::::0;::::1;::::0;;12322:12:::1;:18:::0;;;;::::1;;::::0;;12199:148::o;1462:90:0:-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;1522:15:0::1;:23:::0;;;::::1;;-1:-1:-1::0;;;1522:23:0::1;-1:-1:-1::0;;;;1522:23:0;;::::1;::::0;;;::::1;::::0;;1462:90::o;11323:323:1:-;11406:13;11436:16;11444:7;11436;:16::i;:::-;11431:59;;11461:29;;-1:-1:-1;;;11461:29:1;;;;;;;;;;;11431:59;11501:21;11525:10;:8;:10::i;15034:250::-;15161:5;;15132:4;;-1:-1:-1;;;;;15161:5:1;;;;;;15151:15;;;;15148:130;;-1:-1:-1;15189:4:1;15182:11;;15148:130;-1:-1:-1;;;;;;15231:26:1;;;;;;;:18;:26;;;;;;;;:36;;;;;;;;;;;;;;;15034:250::o;12930:90::-;390:10:2;382:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;417:5:2;;-1:-1:-1;;;;;417:5:2;405:10;:17;382:40;373:63;;;;-1:-1:-1;;;373:63:2;;;;;;;:::i;:::-;12998:8:1::1;:15:::0;12930:90::o;16587:268::-;16644:4;16731:13;;16721:7;:23;16679:150;;;;-1:-1:-1;;16781:26:1;;;;:17;:26;;;;;;-1:-1:-1;;;16781:43:1;:48;;16587:268::o;8366:1105::-;8433:7;8467;8565:13;;8558:4;:20;8554:853;;;8602:14;8619:23;;;:17;:23;;;;;;;-1:-1:-1;;;8706:23:1;;:28;;8702:687;;9217:111;9224:6;9234:1;9224:11;9217:111;;-1:-1:-1;;;9294:6:1;9276:25;;;;:17;:25;;;;;;9217:111;;8702:687;8580:827;8554:853;9433:31;;-1:-1:-1;;;9433:31:1;;;;;;;;;;;26802:2886;-1:-1:-1;;;;;26917:19:1;;26948:5;26917:19;;;:13;:19;;;;;;;;:28;;;;;;;;:36;;-1:-1:-1;;26917:36:1;;;26963:21;;;:15;:21;;;;;:26;;26917:36;;26948:5;26963:26;;26917:36;;26963:26;:::i;:::-;;;;-1:-1:-1;;;;;;;26999:17:1;;;;;;;:13;:17;;;;;;;;:26;;;;;;;;:33;;-1:-1:-1;;26999:33:1;27028:4;26999:33;;;;;;27042:21;;;;;:15;:21;;;;;:26;;:21;;26999:17;27042:26;;27028:4;;27042:26;:::i;:::-;;;;-1:-1:-1;27079:27:1;;-1:-1:-1;27109:27:1;27128:7;27109:18;:27::i;:::-;27079:57;;27192:4;-1:-1:-1;;;;;27151:45:1;27167:19;-1:-1:-1;;;;;27151:45:1;;27147:86;;27205:28;;-1:-1:-1;;;27205:28:1;;;;;;;;;;;27147:86;27244:23;27270:24;;;:15;:24;;;;;;-1:-1:-1;;;;;27270:24:1;;;;27244:23;27331:27;;35963:10;27331:27;;:86;;-1:-1:-1;27374:43:1;27391:4;35963:10;15034:250;:::i;27374:43::-;27331:140;;;-1:-1:-1;;;;;;27433:38:1;;35963:10;27433:38;27331:140;27305:167;;27488:17;27483:66;;27514:35;;-1:-1:-1;;;27514:35:1;;;;;;;;;;;27483:66;27581:2;27588:1;27563:26;27559:62;;27598:23;;-1:-1:-1;;;27598:23:1;;;;;;;;;;;27559:62;27760:15;27742:39;27738:101;;27804:24;;;;:15;:24;;;;;27797:31;;-1:-1:-1;;;;;;27797:31:1;;;27738:101;-1:-1:-1;;;;;28199:24:1;;;;;;;:18;:24;;;;;;;;28197:26;;-1:-1:-1;;28197:26:1;;;28267:22;;;;;;;;28265:24;;-1:-1:-1;28265:24:1;;;28553:26;;;:17;:26;;;;;-1:-1:-1;;;28639:15:1;2399:3;28639:41;28598:83;;:126;;28553:171;;;28841:46;;:51;;28837:616;;28944:1;28934:11;;28912:19;29065:30;;;:17;:30;;;;;;:35;;29061:378;;29201:13;;29186:11;:28;29182:239;;29346:30;;;;:17;:30;;;;;:52;;;29182:239;28894:559;28837:616;29536:16;;:51;;-1:-1:-1;;;29536:51:1;;-1:-1:-1;;;;;13025:15:3;;;29536:51:1;;;13007:34:3;13077:15;;;13057:18;;;13050:43;13109:18;;;13102:34;;;29536:16:1;;;;:32;;12942:18:3;;29536:51:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29621:7;29617:2;-1:-1:-1;;;;;29602:27:1;29611:4;-1:-1:-1;;;;;29602:27:1;;;;;;;;;;;29639:42;26906:2782;;;26802:2886;;;:::o;24429:2131::-;24533:13;;24491:8;;24578:2;24585:1;24560:26;24556:58;;24595:19;;-1:-1:-1;;;24595:19:1;;;;;;;;;;;24556:58;24628:8;24640:1;24628:13;24624:44;;24650:18;;-1:-1:-1;;;24650:18:1;;;;;;;;;;;24624:44;-1:-1:-1;;;;;25204:22:1;;;;;;:18;:22;;;;1894:2;25204:22;;;:70;;25242:31;25230:44;;25204:70;;;25510:31;;;:17;:31;;;;;25601:15;2399:3;25601:41;25560:83;;-1:-1:-1;25678:13:1;;2656:3;25663:56;25560:160;25510:210;;:31;25798:23;;;25836:109;25862:40;;25887:14;;;;;-1:-1:-1;;;;;25862:40:1;;;25879:1;;25862:40;;25879:1;;25862:40;25940:3;25925:12;:18;25836:109;;-1:-1:-1;25959:13:1;:28;26012:11;;;;;;;26009:445;;;26062:9;;:23;;-1:-1:-1;;;26062:23:1;;-1:-1:-1;;;;;1692:32:3;;;26062:23:1;;;1674:51:3;26039:20:1;;26062:9;;:19;;1647:18:3;;26062:23:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26099:16;;:46;;-1:-1:-1;;;26099:46:1;;-1:-1:-1;;;;;19428:32:3;;;26099:46:1;;;19410:51:3;19477:18;;;19470:34;;;26039:46:1;;-1:-1:-1;26099:16:1;;;:25;;19383:18:3;;26099:46:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26173:16:1;;:37;;-1:-1:-1;;;26173:37:1;;-1:-1:-1;;;;;1692:32:3;;;26173:37:1;;;1674:51:3;26159:11:1;;-1:-1:-1;26173:16:1;;;;-1:-1:-1;26173:33:1;;1647:18:3;;26173:37:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26224:16;;26159:51;;-1:-1:-1;;;;;;26224:16:1;:31;26256:14;:12;26224:16;26256:14;:::i;:::-;26272:6;26224:55;;;;;;;;;;;;;;;19689:25:3;;;19745:2;19730:18;;19723:34;19677:2;19662:18;;19515:248;26224:55:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26025:265;;26009:445;;;26384:16;;:59;;-1:-1:-1;;;26384:59:1;;-1:-1:-1;;;;;19988:32:3;;;26384:59:1;;;19970:51:3;20037:18;;;20030:34;;;20080:18;;;20073:34;;;26384:16:1;;;;:31;;19943:18:3;;26384:59:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26009:445;-1:-1:-1;;26540:13:1;;24429:2131;;;;:::o;33417:697::-;33595:88;;-1:-1:-1;;;33595:88:1;;33575:4;;-1:-1:-1;;;;;33595:45:1;;;;;:88;;35963:10;;33662:4;;33668:7;;33677:5;;33595:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33595:88:1;;;;;;;;-1:-1:-1;;33595:88:1;;;;;;;;;;;;:::i;:::-;;;33591:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33873:6;:13;33890:1;33873:18;33869:229;;33918:40;;-1:-1:-1;;;33918:40:1;;;;;;;;;;;33869:229;34058:6;34052:13;34043:6;34039:2;34035:15;34028:38;33591:517;-1:-1:-1;;;;;;33751:64:1;-1:-1:-1;;;33751:64:1;;-1:-1:-1;33591:517:1;33417:697;;;;;;:::o;12813:107::-;12868:13;12900;12893:20;;;;;:::i;12708:99::-;12759:13;12791:9;12784:16;;;;;:::i;36081:1920::-;36546:4;36540:11;;36553:3;36536:21;;36629:17;;;;37313:11;;;37194:5;37443:2;37457;37447:13;;37439:22;37313:11;37426:36;37497:2;37487:13;;37087:668;37515:4;37087:668;;;37686:1;37681:3;37677:11;37670:18;;37736:2;37730:4;37726:13;37722:2;37718:22;37713:3;37705:36;37609:2;37599:13;;37087:668;;;-1:-1:-1;37795:13:1;;;-1:-1:-1;;37908:12:1;;;37966:19;;;37908:12;36081:1920;-1:-1:-1;36081:1920:1:o;14:131:3:-;-1:-1:-1;;;;;;88:32:3;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:180::-;651:6;704:2;692:9;683:7;679:23;675:32;672:52;;;720:1;717;710:12;672:52;-1:-1:-1;743:23:3;;592:180;-1:-1:-1;592:180:3:o;777:258::-;849:1;859:113;873:6;870:1;867:13;859:113;;;949:11;;;943:18;930:11;;;923:39;895:2;888:10;859:113;;;990:6;987:1;984:13;981:48;;;-1:-1:-1;;1025:1:3;1007:16;;1000:27;777:258::o;1040:::-;1082:3;1120:5;1114:12;1147:6;1142:3;1135:19;1163:63;1219:6;1212:4;1207:3;1203:14;1196:4;1189:5;1185:16;1163:63;:::i;:::-;1280:2;1259:15;-1:-1:-1;;1255:29:3;1246:39;;;;1287:4;1242:50;;1040:258;-1:-1:-1;;1040:258:3:o;1303:220::-;1452:2;1441:9;1434:21;1415:4;1472:45;1513:2;1502:9;1498:18;1490:6;1472:45;:::i;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:3;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:3:o;2173:186::-;2232:6;2285:2;2273:9;2264:7;2260:23;2256:32;2253:52;;;2301:1;2298;2291:12;2253:52;2324:29;2343:9;2324:29;:::i;2546:328::-;2623:6;2631;2639;2692:2;2680:9;2671:7;2667:23;2663:32;2660:52;;;2708:1;2705;2698:12;2660:52;2731:29;2750:9;2731:29;:::i;:::-;2721:39;;2779:38;2813:2;2802:9;2798:18;2779:38;:::i;:::-;2769:48;;2864:2;2853:9;2849:18;2836:32;2826:42;;2546:328;;;;;:::o;2879:118::-;2965:5;2958:13;2951:21;2944:5;2941:32;2931:60;;2987:1;2984;2977:12;3002:315;3067:6;3075;3128:2;3116:9;3107:7;3103:23;3099:32;3096:52;;;3144:1;3141;3134:12;3096:52;3167:29;3186:9;3167:29;:::i;:::-;3157:39;;3246:2;3235:9;3231:18;3218:32;3259:28;3281:5;3259:28;:::i;:::-;3306:5;3296:15;;;3002:315;;;;;:::o;3322:241::-;3378:6;3431:2;3419:9;3410:7;3406:23;3402:32;3399:52;;;3447:1;3444;3437:12;3399:52;3486:9;3473:23;3505:28;3527:5;3505:28;:::i;3568:127::-;3629:10;3624:3;3620:20;3617:1;3610:31;3660:4;3657:1;3650:15;3684:4;3681:1;3674:15;3700:632;3765:5;3795:18;3836:2;3828:6;3825:14;3822:40;;;3842:18;;:::i;:::-;3917:2;3911:9;3885:2;3971:15;;-1:-1:-1;;3967:24:3;;;3993:2;3963:33;3959:42;3947:55;;;4017:18;;;4037:22;;;4014:46;4011:72;;;4063:18;;:::i;:::-;4103:10;4099:2;4092:22;4132:6;4123:15;;4162:6;4154;4147:22;4202:3;4193:6;4188:3;4184:16;4181:25;4178:45;;;4219:1;4216;4209:12;4178:45;4269:6;4264:3;4257:4;4249:6;4245:17;4232:44;4324:1;4317:4;4308:6;4300;4296:19;4292:30;4285:41;;;;3700:632;;;;;:::o;4337:451::-;4406:6;4459:2;4447:9;4438:7;4434:23;4430:32;4427:52;;;4475:1;4472;4465:12;4427:52;4515:9;4502:23;4548:18;4540:6;4537:30;4534:50;;;4580:1;4577;4570:12;4534:50;4603:22;;4656:4;4648:13;;4644:27;-1:-1:-1;4634:55:3;;4685:1;4682;4675:12;4634:55;4708:74;4774:7;4769:2;4756:16;4751:2;4747;4743:11;4708:74;:::i;4793:667::-;4888:6;4896;4904;4912;4965:3;4953:9;4944:7;4940:23;4936:33;4933:53;;;4982:1;4979;4972:12;4933:53;5005:29;5024:9;5005:29;:::i;:::-;4995:39;;5053:38;5087:2;5076:9;5072:18;5053:38;:::i;:::-;5043:48;;5138:2;5127:9;5123:18;5110:32;5100:42;;5193:2;5182:9;5178:18;5165:32;5220:18;5212:6;5209:30;5206:50;;;5252:1;5249;5242:12;5206:50;5275:22;;5328:4;5320:13;;5316:27;-1:-1:-1;5306:55:3;;5357:1;5354;5347:12;5306:55;5380:74;5446:7;5441:2;5428:16;5423:2;5419;5415:11;5380:74;:::i;:::-;5370:84;;;4793:667;;;;;;;:::o;5465:616::-;5517:3;5555:5;5549:12;5582:6;5577:3;5570:19;5608:4;5649:2;5644:3;5640:12;5674:11;5701;5694:18;;5751:6;5748:1;5744:14;5737:5;5733:26;5721:38;;5793:2;5786:5;5782:14;5814:1;5824:231;5838:6;5835:1;5832:13;5824:231;;;5909:5;5903:4;5899:16;5894:3;5887:29;5937:38;5970:4;5961:6;5955:13;5937:38;:::i;:::-;6033:12;;;;5929:46;-1:-1:-1;5998:15:3;;;;5860:1;5853:9;5824:231;;;-1:-1:-1;6071:4:3;;5465:616;-1:-1:-1;;;;;;;5465:616:3:o;6086:831::-;6479:3;6468:9;6461:22;6442:4;6506:46;6547:3;6536:9;6532:19;6524:6;6506:46;:::i;:::-;6600:9;6592:6;6588:22;6583:2;6572:9;6568:18;6561:50;6634:33;6660:6;6652;6634:33;:::i;:::-;6620:47;;6715:9;6707:6;6703:22;6698:2;6687:9;6683:18;6676:50;6749:43;6785:6;6777;6749:43;:::i;:::-;6735:57;;6840:9;6832:6;6828:22;6823:2;6812:9;6808:18;6801:50;6868:43;6904:6;6896;6868:43;:::i;:::-;6860:51;6086:831;-1:-1:-1;;;;;;;6086:831:3:o;6922:260::-;6990:6;6998;7051:2;7039:9;7030:7;7026:23;7022:32;7019:52;;;7067:1;7064;7057:12;7019:52;7090:29;7109:9;7090:29;:::i;:::-;7080:39;;7138:38;7172:2;7161:9;7157:18;7138:38;:::i;:::-;7128:48;;6922:260;;;;;:::o;7187:332::-;7389:2;7371:21;;;7428:1;7408:18;;;7401:29;-1:-1:-1;;;7461:2:3;7446:18;;7439:39;7510:2;7495:18;;7187:332::o;7524:380::-;7603:1;7599:12;;;;7646;;;7667:61;;7721:4;7713:6;7709:17;7699:27;;7667:61;7774:2;7766:6;7763:14;7743:18;7740:38;7737:161;;7820:10;7815:3;7811:20;7808:1;7801:31;7855:4;7852:1;7845:15;7883:4;7880:1;7873:15;7737:161;;7524:380;;;:::o;9975:273::-;10043:6;10096:2;10084:9;10075:7;10071:23;10067:32;10064:52;;;10112:1;10109;10102:12;10064:52;10144:9;10138:16;10194:4;10187:5;10183:16;10176:5;10173:27;10163:55;;10214:1;10211;10204:12;10253:127;10314:10;10309:3;10305:20;10302:1;10295:31;10345:4;10342:1;10335:15;10369:4;10366:1;10359:15;10385:422;10474:1;10517:5;10474:1;10531:270;10552:7;10542:8;10539:21;10531:270;;;10611:4;10607:1;10603:6;10599:17;10593:4;10590:27;10587:53;;;10620:18;;:::i;:::-;10670:7;10660:8;10656:22;10653:55;;;10690:16;;;;10653:55;10769:22;;;;10729:15;;;;10531:270;;;10535:3;10385:422;;;;;:::o;10812:806::-;10861:5;10891:8;10881:80;;-1:-1:-1;10932:1:3;10946:5;;10881:80;10980:4;10970:76;;-1:-1:-1;11017:1:3;11031:5;;10970:76;11062:4;11080:1;11075:59;;;;11148:1;11143:130;;;;11055:218;;11075:59;11105:1;11096:10;;11119:5;;;11143:130;11180:3;11170:8;11167:17;11164:43;;;11187:18;;:::i;:::-;-1:-1:-1;;11243:1:3;11229:16;;11258:5;;11055:218;;11357:2;11347:8;11344:16;11338:3;11332:4;11329:13;11325:36;11319:2;11309:8;11306:16;11301:2;11295:4;11292:12;11288:35;11285:77;11282:159;;;-1:-1:-1;11394:19:3;;;11426:5;;11282:159;11473:34;11498:8;11492:4;11473:34;:::i;:::-;11543:6;11539:1;11535:6;11531:19;11522:7;11519:32;11516:58;;;11554:18;;:::i;:::-;11592:20;;10812:806;-1:-1:-1;;;10812:806:3:o;11623:131::-;11683:5;11712:36;11739:8;11733:4;11712:36;:::i;11759:168::-;11799:7;11865:1;11861;11857:6;11853:14;11850:1;11847:21;11842:1;11835:9;11828:17;11824:45;11821:71;;;11872:18;;:::i;:::-;-1:-1:-1;11912:9:3;;11759:168::o;12241:184::-;12311:6;12364:2;12352:9;12343:7;12339:23;12335:32;12332:52;;;12380:1;12377;12370:12;12332:52;-1:-1:-1;12403:16:3;;12241:184;-1:-1:-1;12241:184:3:o;13147:245::-;13214:6;13267:2;13255:9;13246:7;13242:23;13238:32;13235:52;;;13283:1;13280;13273:12;13235:52;13315:9;13309:16;13334:28;13356:5;13334:28;:::i;15197:128::-;15237:3;15268:1;15264:6;15261:1;15258:13;15255:39;;;15274:18;;:::i;:::-;-1:-1:-1;15310:9:3;;15197:128::o;16000:545::-;16102:2;16097:3;16094:11;16091:448;;;16138:1;16163:5;16159:2;16152:17;16208:4;16204:2;16194:19;16278:2;16266:10;16262:19;16259:1;16255:27;16249:4;16245:38;16314:4;16302:10;16299:20;16296:47;;;-1:-1:-1;16337:4:3;16296:47;16392:2;16387:3;16383:12;16380:1;16376:20;16370:4;16366:31;16356:41;;16447:82;16465:2;16458:5;16455:13;16447:82;;;16510:17;;;16491:1;16480:13;16447:82;;16721:1352;16847:3;16841:10;16874:18;16866:6;16863:30;16860:56;;;16896:18;;:::i;:::-;16925:97;17015:6;16975:38;17007:4;17001:11;16975:38;:::i;:::-;16969:4;16925:97;:::i;:::-;17077:4;;17141:2;17130:14;;17158:1;17153:663;;;;17860:1;17877:6;17874:89;;;-1:-1:-1;17929:19:3;;;17923:26;17874:89;-1:-1:-1;;16678:1:3;16674:11;;;16670:24;16666:29;16656:40;16702:1;16698:11;;;16653:57;17976:81;;17123:944;;17153:663;15947:1;15940:14;;;15984:4;15971:18;;-1:-1:-1;;17189:20:3;;;17307:236;17321:7;17318:1;17315:14;17307:236;;;17410:19;;;17404:26;17389:42;;17502:27;;;;17470:1;17458:14;;;;17337:19;;17307:236;;;17311:3;17571:6;17562:7;17559:19;17556:201;;;17632:19;;;17626:26;-1:-1:-1;;17715:1:3;17711:14;;;17727:3;17707:24;17703:37;17699:42;17684:58;17669:74;;17556:201;-1:-1:-1;;;;;17803:1:3;17787:14;;;17783:22;17770:36;;-1:-1:-1;16721:1352:3:o;18078:470::-;18257:3;18295:6;18289:13;18311:53;18357:6;18352:3;18345:4;18337:6;18333:17;18311:53;:::i;:::-;18427:13;;18386:16;;;;18449:57;18427:13;18386:16;18483:4;18471:17;;18449:57;:::i;:::-;18522:20;;18078:470;-1:-1:-1;;;;18078:470:3:o;18553:127::-;18614:10;18609:3;18605:20;18602:1;18595:31;18645:4;18642:1;18635:15;18669:4;18666:1;18659:15;18685:276;18816:3;18854:6;18848:13;18870:53;18916:6;18911:3;18904:4;18896:6;18892:17;18870:53;:::i;:::-;18939:16;;;;;18685:276;-1:-1:-1;;18685:276:3:o;18966:135::-;19005:3;19026:17;;;19023:43;;19046:18;;:::i;:::-;-1:-1:-1;19093:1:3;19082:13;;18966:135::o;19106:125::-;19146:4;19174:1;19171;19168:8;19165:34;;;19179:18;;:::i;:::-;-1:-1:-1;19216:9:3;;19106:125::o;20118:489::-;-1:-1:-1;;;;;20387:15:3;;;20369:34;;20439:15;;20434:2;20419:18;;20412:43;20486:2;20471:18;;20464:34;;;20534:3;20529:2;20514:18;;20507:31;;;20312:4;;20555:46;;20581:19;;20573:6;20555:46;:::i;:::-;20547:54;20118:489;-1:-1:-1;;;;;;20118:489:3:o;20612:249::-;20681:6;20734:2;20722:9;20713:7;20709:23;20705:32;20702:52;;;20750:1;20747;20740:12;20702:52;20782:9;20776:16;20801:30;20825:5;20801:30;:::i

Swarm Source

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