ETH Price: $3,311.27 (+1.21%)
Gas: 4 Gwei

Token

Bedans (Bedans)
 

Overview

Max Total Supply

292 Bedans

Holders

158

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 Bedans
0x6BaFDA2192811B823fc3D4A2078E0A7024E9f73B
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:
NFTokenCon

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.0;
// SPDX-License-Identifier: MIT

/**
 * @dev ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721 {

  /**
   * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
   * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
   * number of NFTs may be created and assigned without emitting Transfer. At the time of any
   * transfer, the approved address for that NFT (if any) is reset to none.
   */
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
   * address indicates there is no approved address. When a Transfer event emits, this also
   * indicates that the approved address for that NFT (if any) is reset to none.
   */
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
   * all NFTs of the owner.
   */
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  /**
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external;

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT.  This function can be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved The new approved NFT controller.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The contract MUST allow multiple operators per owner.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external;

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @notice Count all NFTs assigned to an owner.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

  /**
   * @notice Find the owner of an NFT.
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single NFT.
   * @param _tokenId The NFT to find the approved address for.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @notice Query if an address is an authorized operator for another address.
   * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    view
    returns (bool);

}

/**
 * @dev ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721TokenReceiver {

  /**
   * @notice The contract address is always the message sender. A wallet/broker/auction application
   * MUST implement the wallet interface if it will accept safe transfers.
   * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the
   * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return
   * of other than the magic value MUST result in the transaction being reverted.
   * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing.
   * @param _operator The address which called `safeTransferFrom` function.
   * @param _from The address which previously owned the token.
   * @param _tokenId The NFT identifier which is being transferred.
   * @param _data Additional data with no specified format.
   * @return Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    returns(bytes4);

}


/**
 * @dev A standard for detecting smart contract interfaces. 
 * See: https://eips.ethereum.org/EIPS/eip-165.
 */
interface ERC165 {

  /**
   * @dev Checks if the smart contract includes a specific interface.
   * This function uses less than 30,000 gas.
   * @param _interfaceID The interface identifier, as specified in ERC-165.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    view
    returns (bool);
    
}


/**
 * @dev Implementation of standard for detect smart contract interfaces.
 */
contract SupportsInterface is
  ERC165
{

  /**
   * @dev Mapping of supported intefraces. You must not set element 0xffffffff to true.
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x01ffc9a7] = true; // ERC165
  }

  /**
   * @dev Function to check which interfaces are suported by this contract.
   * @param _interfaceID Id of the interface.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    override
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceID];
  }

}


/**
 * @notice Based on:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
 * Requires EIP-1052.
 * @dev Utility library of inline functions on addresses.
 */
library AddressUtils {

  /**
   * @dev Returns whether the target address is a contract.
   * @param _addr Address to check.
   * @return addressCheck True if _addr is a contract, false if not.
   */
  function isContract(
    address _addr
  )
    internal
    view
    returns (bool addressCheck)
  {
    // This method relies in extcodesize, which returns 0 for contracts in
    // construction, since the code is only stored at the end of the
    // constructor execution.

    // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
    // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
    // for accounts without code, i.e. `keccak256('')`
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    assembly { codehash := extcodehash(_addr) } // solhint-disable-line
    addressCheck = (codehash != 0x0 && codehash != accountHash);
  }

}


/**
 * @dev Implementation of ERC-721 non-fungible token standard.
 */
contract NFToken is
  ERC721,
  SupportsInterface
{
  using AddressUtils for address;

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant ZERO_ADDRESS = "003001";
  string constant NOT_VALID_NFT = "003002";
  string constant NOT_OWNER_OR_OPERATOR = "003003";
  string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004";
  string constant NOT_ABLE_TO_RECEIVE_NFT = "003005";
  string constant NFT_ALREADY_EXISTS = "003006";
  string constant NOT_OWNER = "003007";
  string constant IS_OWNER = "003008";

  /**
   * @dev Magic value of a smart contract that can receive NFT.
   * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
   */
  bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

  /**
   * @dev A mapping from NFT ID to the address that owns it.
   */
  mapping (uint256 => address) internal idToOwner;

  /**
   * @dev Mapping from NFT ID to approved address.
   */
  mapping (uint256 => address) internal idToApproval;

   /**
   * @dev Mapping from owner address to count of their tokens.
   */
  mapping (address => uint256) private ownerToNFTokenCount;

  /**
   * @dev Mapping from owner address to mapping of operator addresses.
   */
  mapping (address => mapping (address => bool)) internal ownerToOperators;

  /**
   * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier canOperate(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that the msg.sender is allowed to transfer NFT.
   * @param _tokenId ID of the NFT to transfer.
   */
  modifier canTransfer(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender
      || idToApproval[_tokenId] == msg.sender
      || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_APPROVED_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that _tokenId is a valid Token.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier validNFToken(
    uint256 _tokenId
  )
  {
    require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT);
    _;
  }

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
  }

  /**
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, _data);
  }

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to "".
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);
  }

  /**
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _approved Address to be approved for the given NFT ID.
   * @param _tokenId ID of the token to be approved.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external
    override
    canOperate(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(_approved != tokenOwner, IS_OWNER);

    idToApproval[_tokenId] = _approved;
    emit Approval(tokenOwner, _approved, _tokenId);
  }

  /**
   * @notice This works even if sender doesn't own any tokens at the time.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external
    override
  {
    ownerToOperators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    override
    view
    returns (uint256)
  {
    require(_owner != address(0), ZERO_ADDRESS);
    return _getOwnerNFTCount(_owner);
  }

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return _owner Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    override
    view
    returns (address _owner)
  {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single NFT.
   * @param _tokenId ID of the NFT to query the approval of.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (address)
  {
    return idToApproval[_tokenId];
  }

  /**
   * @dev Checks if `_operator` is an approved operator for `_owner`.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    override
    view
    virtual
    returns (bool)
  {
    return ownerToOperators[_owner][_operator];
  }

  /**
   * @notice Does NO checks.
   * @dev Actually performs the transfer.
   * @param _to Address of a new owner.
   * @param _tokenId The NFT that is being transferred.
   */
  function _transfer(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    address from = idToOwner[_tokenId];
    _clearApproval(_tokenId);

    _removeNFToken(from, _tokenId);
    _addNFToken(_to, _tokenId);

    emit Transfer(from, _to, _tokenId);
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @dev Mints a new NFT.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(_to != address(0), ZERO_ADDRESS);
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    _addNFToken(_to, _tokenId);

    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external burn
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @dev Burns a NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    virtual
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    _clearApproval(_tokenId);
    _removeNFToken(tokenOwner, _tokenId);
    emit Transfer(tokenOwner, address(0), _tokenId);
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Removes a NFT from owner.
   * @param _from Address from which we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    ownerToNFTokenCount[_from] -= 1;
    delete idToOwner[_tokenId];
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Assigns a new NFT to owner.
   * @param _to Address to which we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    idToOwner[_tokenId] = _to;
    ownerToNFTokenCount[_to] += 1;
  }

  /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage (gas optimization) of owner NFT count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    virtual
    view
    returns (uint256)
  {
    return ownerToNFTokenCount[_owner];
  }

  /**
   * @dev Actually perform the safeTransferFrom.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function _safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes memory _data
  )
    private
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);

    if (_to.isContract())
    {
      bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
      require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT);
    }
  }

  /**
   * @dev Clears the current approval of a given NFT ID.
   * @param _tokenId ID of the NFT to be transferred.
   */
  function _clearApproval(
    uint256 _tokenId
  )
    private
  {
    delete idToApproval[_tokenId];
  }

}


/**
 * @dev Optional metadata extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Metadata {

  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   * @return _name Representing name.
   */
  function name()
    external
    view
    returns (string memory _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    view
    returns (string memory _symbol);

  /**
   * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if
   * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file
   * that conforms to the "ERC721 Metadata JSON Schema".
   * @return URI of _tokenId.
   */
  function tokenURI(uint256 _tokenId)
    external
    view
    returns (string memory);

}


/**
 * @dev Optional metadata implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenMetadata is
  NFToken,
  ERC721Metadata
{

  /**
   * @dev A descriptive name for a collection of NFTs.
   */
  string internal nftName;

  /**
   * @dev An abbreviated name for NFTokens.
   */
  string internal nftSymbol;

  /**
   * @dev Mapping from NFT ID to metadata uri.
   */
  mapping (uint256 => string) internal idToUri;

  /**
   * @notice When implementing this contract don't forget to set nftName and nftSymbol.
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
  }

  /**
   * @dev Returns a descriptive name for a collection of NFTokens.
   * @return _name Representing name.
   */
  function name()
    external
    override
    view
    returns (string memory _name)
  {
    _name = nftName;
  }

  /**
   * @dev Returns an abbreviated name for NFTokens.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    override
    view
    returns (string memory _symbol)
  {
    _symbol = nftSymbol;
  }

  /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function tokenURI(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (string memory)
  {
    return _tokenURI(_tokenId);
  }

  /**
   * @notice This is an internal function that can be overriden if you want to implement a different
   * way to generate token URI.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function _tokenURI(
    uint256 _tokenId
  )
    internal
    virtual
    view
    returns (string memory)
  {
    return idToUri[_tokenId];
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @dev Burns a NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);

    delete idToUri[_tokenId];
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @dev Set a distinct URI (RFC 3986) for a given NFT ID.
   * @param _tokenId Id for which we want URI.
   * @param _uri String representing RFC 3986 URI.
   */
  function _setTokenUri(
    uint256 _tokenId,
    string memory _uri
  )
    internal
    validNFToken(_tokenId)
  {
    idToUri[_tokenId] = _uri;
  }

}


/**
 * @dev Optional enumeration extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Enumerable {

  /**
   * @dev Returns a count of valid NFTs tracked by this contract, where each one of them has an
   * assigned and queryable owner not equal to the zero address.
   * @return Total supply of NFTs.
   */
  function totalSupply()
    external
    view
    returns (uint256);

  /**
   * @dev Returns the token identifier for the `_index`th NFT. Sort order is not specified.
   * @param _index A counter less than `totalSupply()`.
   * @return Token id.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    view
    returns (uint256);

  /**
   * @dev Returns the token identifier for the `_index`th NFT assigned to `_owner`. Sort order is
   * not specified. It throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address,
   * representing invalid NFTs.
   * @param _owner An address where we are interested in NFTs owned by them.
   * @param _index A counter less than `balanceOf(_owner)`.
   * @return Token id.
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    external
    view
    returns (uint256);

}


/**
 * @dev Optional enumeration implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenEnumerable is
  NFToken,
  ERC721Enumerable
{

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant INVALID_INDEX = "005007";

  /**
   * @dev Array of all NFT IDs.
   */
  uint256[] internal tokens;

  /**
   * @dev Mapping from token ID to its index in global tokens array.
   */
  mapping(uint256 => uint256) internal idToIndex;

  /**
   * @dev Mapping from owner to list of owned NFT IDs.
   */
  mapping(address => uint256[]) internal ownerToIds;

  /**
   * @dev Mapping from NFT ID to its index in the owner tokens list.
   */
  mapping(uint256 => uint256) internal idToOwnerIndex;

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable
  }

  /**
   * @dev Returns the count of all existing NFTokens.
   * @return Total supply of NFTs.
   */
  function totalSupply()
    external
    override
    view
    returns (uint256)
  {
    return tokens.length;
  }

  /**
   * @dev Returns NFT ID by its index.
   * @param _index A counter less than `totalSupply()`.
   * @return Token id.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    override
    view
    returns (uint256)
  {
    require(_index < tokens.length, INVALID_INDEX);
    return tokens[_index];
  }

  /**
   * @dev returns the n-th NFT ID from a list of owner's tokens.
   * @param _owner Token owner's address.
   * @param _index Index number representing n-th token in owner's list of tokens.
   * @return Token id.
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    external
    override
    view
    returns (uint256)
  {
    require(_index < ownerToIds[_owner].length, INVALID_INDEX);
    return ownerToIds[_owner][_index];
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @dev Mints a new NFT.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._mint(_to, _tokenId);
    tokens.push(_tokenId);
    idToIndex[_tokenId] = tokens.length - 1;
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @dev Burns a NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);

    uint256 tokenIndex = idToIndex[_tokenId];
    uint256 lastTokenIndex = tokens.length - 1;
    uint256 lastToken = tokens[lastTokenIndex];

    tokens[tokenIndex] = lastToken;

    tokens.pop();
    // This wastes gas if you are burning the last token but saves a little gas if you are not.
    idToIndex[lastToken] = tokenIndex;
    idToIndex[_tokenId] = 0;
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Removes a NFT from an address.
   * @param _from Address from wich we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    delete idToOwner[_tokenId];

    uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId];
    uint256 lastTokenIndex = ownerToIds[_from].length - 1;

    if (lastTokenIndex != tokenToRemoveIndex)
    {
      uint256 lastToken = ownerToIds[_from][lastTokenIndex];
      ownerToIds[_from][tokenToRemoveIndex] = lastToken;
      idToOwnerIndex[lastToken] = tokenToRemoveIndex;
    }

    ownerToIds[_from].pop();
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Assigns a new NFT to an address.
   * @param _to Address to wich we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);
    idToOwner[_tokenId] = _to;

    ownerToIds[_to].push(_tokenId);
    idToOwnerIndex[_tokenId] = ownerToIds[_to].length - 1;
  }

  /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage(gas optimization) of owner NFT count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    override
    virtual
    view
    returns (uint256)
  {
    return ownerToIds[_owner].length;
  }
}

contract Ownable {

  /**
   * @dev Error constants.
   */
  string public constant NOT_CURRENT_OWNER = "018001";
  string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";
  string public constant NOT_CURRENT_MANAGER = "018003";

  address public owner;
  mapping(address=>bool) public Manager;


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


  constructor()
    public
  {
    owner = msg.sender;
  }
  modifier onlyOwner()
  {
    require(msg.sender == owner, NOT_CURRENT_OWNER);
    _;
  }
  
  modifier onlyManager()    
  {
    require(Manager[msg.sender], NOT_CURRENT_MANAGER);
    _;
  }

  function addManager(address _maddr) public onlyOwner{
      Manager[_maddr] = true;
  }
  
  function delManager(address _maddr) public onlyOwner{
      Manager[_maddr] = false;
  }
  function transferOwnership(
    address _newOwner
  )
    public
    onlyOwner
  {
    require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}


// nft + enumerable + base_url
/**
 * @dev This is an example contract implementation of NFToken with enumerable and metadata
 * extensions.
 */
library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
    // function toPayable(address account) internal pure returns (address payable) {
    //     return address(uint160(account));
    // }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) =  recipient.call{value : amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

}


contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

contract NFTokenCon is
  NFTokenEnumerable,
  NFTokenMetadata,
  Ownable
{

    using SafeMath for uint256;
    string public baseURI; // 
    uint256 public constant maxAmount = 5555; 
    uint256 public soldBoxCount;
    uint256 public perUserLimit = 2; 
    uint256 boxIndex = 10000000;

    mapping(address => bool) public whiteMap;
    mapping(address => uint8) public userBuyCount;
    string boxUrl = "0";

    // 初始价格
    uint256 public price = 8900000000000000;
    // 初始收币地址
    address payable collect = payable(0xe52Ab043711f90596970a409518cAD9a53cEf803);
    uint256 public startOpenBox = 1694534400; 

    address private openSeaRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;
    uint256 public  openBoxAmount = 5555; 
    mapping(uint256 => uint256) movedCards;



  constructor()
  {
    nftName = "Bedans";
    nftSymbol = "Bedans";
    baseURI = "https://ipfs.io/ipfs/QmfGk943RQAD4yas8B2uQLNEWVXxZYQK7gPvZbNUzbqLvE/";
  }



  function setWhite(address addr,bool flag) public onlyOwner{
    require(whiteMap[addr] != flag,"is set");
    whiteMap[addr] = flag;
  }


  function setWhiteList(address[] memory list,bool flag) public onlyOwner{
    for(uint256 i;i<list.length;i++){
        whiteMap[list[i]] = flag;
    }
  }



  function setPrice(uint256 _price) public onlyOwner{
    price = _price;
  }


  function setPerUserLimit(uint256 _limit) public onlyOwner{
    perUserLimit = _limit;
  }
  


  function setCollectAddr(address payable addr) public onlyOwner{
    collect = addr;
  }

  function setStartOpenBox(uint256 time) public onlyOwner{
    startOpenBox = time;
  }


  function setBaseUrl(string calldata _url) public onlyOwner{
    baseURI = _url;
  }



  receive() external payable {}

  fallback() external payable {}

  function buyBox(uint8 num) public payable{
      require(num>=1 || num<=2 ,"err num");
      soldBoxCount += num;

      require(soldBoxCount<=maxAmount,"no box left");
      require(userBuyCount[msg.sender] + num <=perUserLimit,"over limit");

      uint256 fee = price.mul(num);
      require(msg.value>=fee,"err amount");
      (bool sent,) = collect.call{value: msg.value}("");
      require(sent, "Failed to send Ether");
      
      userBuyCount[msg.sender] = userBuyCount[msg.sender] + num;

      for (uint8 i;i<num;i++){
        boxIndex++;
        super._mint(msg.sender, boxIndex);
        super._setTokenUri(boxIndex, boxUrl);
      }
    
  }


  function whiteBuyBox() public{
    require(whiteMap[msg.sender],"not white");
    soldBoxCount++;
    require(soldBoxCount<=maxAmount,"no box left");
    require(userBuyCount[msg.sender]<perUserLimit,"over limit");
    userBuyCount[msg.sender] = userBuyCount[msg.sender] + 1;

    boxIndex++;
    super._mint(msg.sender, boxIndex);
    super._setTokenUri(boxIndex, boxUrl);
    whiteMap[msg.sender] = false;
  }
 

  function openBox(uint256 _tokenId) public{
    require(block.timestamp>=startOpenBox,"not start");

    require(_tokenId>10000000,"err tokenid");
    require(idToOwner[_tokenId] == msg.sender,"err owner");
    super._burn(_tokenId);

    uint256 index = draw();
    super._mint(msg.sender, index);
    super._setTokenUri(index, _uint2str(index));
  }

  function getRandom(uint256 k) private view returns(uint256) {
    return uint256(keccak256(abi.encodePacked(
                (block.timestamp).add
                (block.difficulty).add
                (block.gaslimit).add
                ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (block.timestamp)).add
                (block.number)
            ))) % (k);
  }


  function cardAt(uint256 i) private view returns (uint256) {
      if (movedCards[i]>0) {
          return movedCards[i];
      } else {
          return i;
      }
  }

  function draw() private returns (uint256) {
      require(openBoxAmount > 0, "All cards drawn");
      // Pick i
      uint256 i = getRandom(openBoxAmount);
      // Pick the ith card in the "deck"
      uint256 outCard = cardAt(i);

      // Move the last card in the deck into position i
      movedCards[i] = cardAt(openBoxAmount - 1);
      movedCards[openBoxAmount - 1] = 0;
      openBoxAmount -= 1;

      return outCard;
  }




  function setOpenSeaRegistryAddress(address a) public onlyOwner {
      openSeaRegistryAddress = a;
  }

  
  function isApprovedForAll(address owner, address operator) public override view returns (bool) {
      ProxyRegistry openSeaRegistry = ProxyRegistry(openSeaRegistryAddress);

      if (address(openSeaRegistry.proxies(owner)) == operator) {
          return true;
      }

      return ownerToOperators[owner][operator];
  }


  function _transfer(
    address _to,
    uint256 _tokenId
  )
    internal
    override{
      super._transfer(_to,_tokenId);

    }



  /**
   * @dev Removes a NFT from owner.
   * @param _tokenId Which NFT we want to remove.
   */
  function burn(
    uint256 _tokenId
  )
    external
    onlyOwner
  {
    super._burn(_tokenId);
  }

  /**
   * @dev Mints a new NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    override(NFToken, NFTokenEnumerable)
    virtual
  {
    NFTokenEnumerable._mint(_to, _tokenId);
  }


  /**
   * @dev Burns a NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override(NFTokenMetadata, NFTokenEnumerable)
    virtual
  {
    NFTokenEnumerable._burn(_tokenId);
    if (bytes(idToUri[_tokenId]).length != 0)
    {
      delete idToUri[_tokenId];
    }
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Removes a NFT from an address.
   * @param _from Address from wich we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    override(NFToken, NFTokenEnumerable)
  {
    NFTokenEnumerable._removeNFToken(_from, _tokenId);
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Assigns a new NFT to an address.
   * @param _to Address to wich we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    override(NFToken, NFTokenEnumerable)
  {
    NFTokenEnumerable._addNFToken(_to, _tokenId);
  }

   /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage(gas optimization) of owner nft count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    override(NFToken, NFTokenEnumerable)
    view
    returns (uint256)
  {
    return NFTokenEnumerable._getOwnerNFTCount(_owner);
  }

  /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function _tokenURI(
    uint256 _tokenId
  )
    internal
    override
    view
    returns (string memory)
  {
    return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, super._tokenURI(_tokenId))) : "";
  }

  /**
   * @dev Helper function that changes uint to string representation.
   * @return str String representation.
   */
  function _uint2str(
    uint256 _i
  )
    internal
    pure
    returns (string memory str)
  {
    if (_i == 0) {
      return "0";
    }
    uint256 j = _i;
    uint256 length;
    while (j != 0) {
      length++;
      j /= 10;
    }
    bytes memory bstr = new bytes(length);
    uint256 k = length;
    j = _i;
    while (j != 0) {
      bstr[--k] = bytes1(uint8(48 + j % 10));
      j /= 10;
    }
    str = string(bstr);
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Manager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_MANAGER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_maddr","type":"address"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"num","type":"uint8"}],"name":"buyBox","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_maddr","type":"address"}],"name":"delManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"openBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openBoxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perUserLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","type":"string"}],"name":"setBaseUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setCollectAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setOpenSeaRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setPerUserLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setStartOpenBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setWhite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"list","type":"address[]"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"soldBoxCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startOpenBox","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userBuyCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteBuyBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60026010556298968060115560c060405260016080819052600360fc1b60a090815262000030916014919062000208565b50661f9e80ba804000601555601680546001600160a01b031990811673e52ab043711f90596970a409518cad9a53cef803179091556365008b006017556018805490911673a5409ec958c83c3f309868babaca7c86dcb077c11790556115b36019553480156200009f57600080fd5b50600060208181527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c5805460ff1990811660019081179092557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed78080080548216831790557f77b7bbe0e49b76487c9476b5db3354cf5270619d0037ccb899c2a4c4a75b43188054821683179055635b5e139f60e01b9093527f9562381dfbc2d8b8b66e765249f330164b73e329e5f01670660643571d1974df805490931617909155600c80546001600160a01b0319163317905560408051808201909152600680825265426564616e7360d01b91909201908152620001a0916009919062000208565b5060408051808201909152600680825265426564616e7360d01b6020909201918252620001d091600a9162000208565b50604051806080016040528060448152602001620035646044913980516200020191600e9160209091019062000208565b50620002eb565b8280546200021690620002ae565b90600052602060002090601f0160209004810192826200023a576000855562000285565b82601f106200025557805160ff191683800117855562000285565b8280016001018555821562000285579182015b828111156200028557825182559160200191906001019062000268565b506200029392915062000297565b5090565b5b8082111562000293576000815560010162000298565b600181811c90821680620002c357607f821691505b60208210811415620002e557634e487b7160e01b600052602260045260246000fd5b50919050565b61326980620002fb6000396000f3fe60806040526004361061025e5760003560e01c80637b89523811610143578063b1e5e2b7116100bb578063e43f696e11610077578063e43f696e14610757578063e985e9c514610777578063f2fde38b14610797578063f3fe3bc3146107b7578063f432980d146107e9578063f46f6e3d1461082b57005b8063b1e5e2b7146106ae578063b88d4fde146106ce578063c261a268146106ee578063c7c3268b14610701578063c87b56dd14610721578063e0d8b65d1461074157005b80638da5cb5b1161010a5780638da5cb5b1461060357806391b7f5ed1461062357806395d89b4114610643578063a035b1fe14610658578063a22cb4651461066e578063a65eacdc1461068e57005b80637b8952381461054c5780637d16a3d41461057c57806382c081871461059c578063860d248a146105bc578063894db748146105ee57005b80634322f09a116101d65780635f48f3931161019d5780635f48f393146104b55780636352211e146104cb5780636c0360eb146104eb5780636d6f3d601461050057806370a082311461051657806375daccc01461053657005b80634322f09a1461040557806347240874146104255780634b0697e4146104455780634f6ccce71461047557806357b59e161461049557005b806323b872dd1161022557806323b872dd1461034f5780632d06177a1461036f5780632f745c591461038f5780633431dcc2146103af57806342842e0e146103c557806342966c68146103e557005b806301ffc9a71461026757806306fdde03146102b6578063081812fc146102d8578063095ea7b31461031057806318160ddd1461033057005b3661026557005b005b34801561027357600080fd5b506102a1610282366004612e38565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b3480156102c257600080fd5b506102cb61085d565b6040516102ad9190613039565b3480156102e457600080fd5b506102f86102f3366004612ed1565b6108ef565b6040516001600160a01b0390911681526020016102ad565b34801561031c57600080fd5b5061026561032b366004612d2e565b610971565b34801561033c57600080fd5b506005545b6040519081526020016102ad565b34801561035b57600080fd5b5061026561036a366004612c45565b610b13565b34801561037b57600080fd5b5061026561038a366004612bef565b610cce565b34801561039b57600080fd5b506103416103aa366004612d2e565b610d3c565b3480156103bb57600080fd5b5061034160195481565b3480156103d157600080fd5b506102656103e0366004612c45565b610dd4565b3480156103f157600080fd5b50610265610400366004612ed1565b610df4565b34801561041157600080fd5b50610265610420366004612ed1565b610e4a565b34801561043157600080fd5b50610265610440366004612cf9565b610e99565b34801561045157600080fd5b506102a1610460366004612bef565b600d6020526000908152604090205460ff1681565b34801561048157600080fd5b50610341610490366004612ed1565b610f66565b3480156104a157600080fd5b506102656104b0366004612bef565b610fce565b3480156104c157600080fd5b506103416115b381565b3480156104d757600080fd5b506102f86104e6366004612ed1565b61103a565b3480156104f757600080fd5b506102cb611092565b34801561050c57600080fd5b5061034160175481565b34801561052257600080fd5b50610341610531366004612bef565b611120565b34801561054257600080fd5b50610341600f5481565b34801561055857600080fd5b506102a1610567366004612bef565b60126020526000908152604090205460ff1681565b34801561058857600080fd5b50610265610597366004612bef565b611171565b3480156105a857600080fd5b506102656105b7366004612ed1565b6111dd565b3480156105c857600080fd5b506102cb6040518060400160405280600681526020016518189c18181960d11b81525081565b3480156105fa57600080fd5b5061026561122c565b34801561060f57600080fd5b50600c546102f8906001600160a01b031681565b34801561062f57600080fd5b5061026561063e366004612ed1565b61142c565b34801561064f57600080fd5b506102cb61147b565b34801561066457600080fd5b5061034160155481565b34801561067a57600080fd5b50610265610689366004612cf9565b61148a565b34801561069a57600080fd5b506102656106a9366004612bef565b6114f6565b3480156106ba57600080fd5b506102656106c9366004612ed1565b611561565b3480156106da57600080fd5b506102656106e9366004612c86565b611666565b6102656106fc366004612eea565b6116af565b34801561070d57600080fd5b5061026561071c366004612e8f565b61193e565b34801561072d57600080fd5b506102cb61073c366004612ed1565b611994565b34801561074d57600080fd5b5061034160105481565b34801561076357600080fd5b50610265610772366004612d5a565b611a00565b34801561078357600080fd5b506102a1610792366004612c0c565b611ab1565b3480156107a357600080fd5b506102656107b2366004612bef565b611b7f565b3480156107c357600080fd5b506102cb6040518060400160405280600681526020016530313830303160d01b81525081565b3480156107f557600080fd5b50610819610804366004612bef565b60136020526000908152604090205460ff1681565b60405160ff90911681526020016102ad565b34801561083757600080fd5b506102cb6040518060400160405280600681526020016530313830303360d01b81525081565b60606009805461086c90613116565b80601f016020809104026020016040519081016040528092919081815260200182805461089890613116565b80156108e55780601f106108ba576101008083540402835291602001916108e5565b820191906000526020600020905b8154815290600101906020018083116108c857829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b031661094f5760405162461bcd60e51b81526004016109469190613039565b60405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b60008181526001602052604090205481906001600160a01b0316338114806109bc57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b815250906109f95760405162461bcd60e51b81526004016109469190613039565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b0316610a535760405162461bcd60e51b81526004016109469190613039565b50600084815260016020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b0390811691908716821415610ab35760405162461bcd60e51b81526004016109469190613039565b5060008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b60008181526001602052604090205481906001600160a01b031633811480610b5157506000828152600260205260409020546001600160a01b031633145b80610b7f57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610bbc5760405162461bcd60e51b81526004016109469190613039565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b0316610c165760405162461bcd60e51b81526004016109469190613039565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03908116919088168214610c755760405162461bcd60e51b81526004016109469190613039565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038716610cba5760405162461bcd60e51b81526004016109469190613039565b50610cc58686611c6a565b50505050505050565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610d175760405162461bcd60e51b81526004016109469190613039565b506001600160a01b03166000908152600d60205260409020805460ff19166001179055565b6001600160a01b0382166000908152600760209081526040808320548151808301909252600682526530303530303760d01b92820192909252908310610d955760405162461bcd60e51b81526004016109469190613039565b506001600160a01b0383166000908152600760205260409020805483908110610dc057610dc06131dc565b906000526020600020015490505b92915050565b610def83838360405180602001604052806000815250611c74565b505050565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610e3d5760405162461bcd60e51b81526004016109469190613039565b50610e4781611f22565b50565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610e935760405162461bcd60e51b81526004016109469190613039565b50601755565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610ee25760405162461bcd60e51b81526004016109469190613039565b506001600160a01b03821660009081526012602052604090205460ff1615158115151415610f3b5760405162461bcd60e51b81526020600482015260066024820152651a5cc81cd95d60d21b6044820152606401610946565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b60055460408051808201909152600681526530303530303760d01b60208201526000918310610fa85760405162461bcd60e51b81526004016109469190613039565b5060058281548110610fbc57610fbc6131dc565b90600052602060002001549050919050565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146110175760405162461bcd60e51b81526004016109469190613039565b50601680546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b0316908161096b5760405162461bcd60e51b81526004016109469190613039565b600e805461109f90613116565b80601f01602080910402602001604051908101604052809291908181526020018280546110cb90613116565b80156111185780601f106110ed57610100808354040283529160200191611118565b820191906000526020600020905b8154815290600101906020018083116110fb57829003601f168201915b505050505081565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b0383166111675760405162461bcd60e51b81526004016109469190613039565b50610dce82611f42565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146111ba5760405162461bcd60e51b81526004016109469190613039565b50601880546001600160a01b0319166001600160a01b0392909216919091179055565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146112265760405162461bcd60e51b81526004016109469190613039565b50601055565b3360009081526012602052604090205460ff166112775760405162461bcd60e51b81526020600482015260096024820152686e6f7420776869746560b81b6044820152606401610946565b600f80549060006112878361314b565b91905055506115b3600f5411156112ce5760405162461bcd60e51b815260206004820152600b60248201526a1b9bc8189bde081b19599d60aa1b6044820152606401610946565b6010543360009081526013602052604090205460ff161061131e5760405162461bcd60e51b815260206004820152600a6024820152691bdd995c881b1a5b5a5d60b21b6044820152606401610946565b3360009081526013602052604090205461133c9060ff166001613064565b336000908152601360205260408120805460ff191660ff9390931692909217909155601180549161136c8361314b565b919050555061137d33601154611f60565b6114136011546014805461139090613116565b80601f01602080910402602001604051908101604052809291908181526020018280546113bc90613116565b80156114095780601f106113de57610100808354040283529160200191611409565b820191906000526020600020905b8154815290600101906020018083116113ec57829003601f168201915b5050505050611fc0565b336000908152601260205260409020805460ff19169055565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146114755760405162461bcd60e51b81526004016109469190613039565b50601555565b6060600a805461086c90613116565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b0316331461153f5760405162461bcd60e51b81526004016109469190613039565b506001600160a01b03166000908152600d60205260409020805460ff19169055565b60175442101561159f5760405162461bcd60e51b81526020600482015260096024820152681b9bdd081cdd185c9d60ba1b6044820152606401610946565b6298968081116115df5760405162461bcd60e51b815260206004820152600b60248201526a195c9c881d1bdad95b9a5960aa1b6044820152606401610946565b6000818152600160205260409020546001600160a01b031633146116315760405162461bcd60e51b815260206004820152600960248201526832b9391037bbb732b960b91b6044820152606401610946565b61163a81611f22565b6000611644612039565b90506116503382611f60565b6116628161165d8361210e565b611fc0565b5050565b6116a885858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c7492505050565b5050505050565b60018160ff161015806116c6575060028160ff1611155b6116fc5760405162461bcd60e51b8152602060048201526007602482015266657272206e756d60c81b6044820152606401610946565b8060ff16600f6000828254611711919061304c565b9091555050600f546115b310156117585760405162461bcd60e51b815260206004820152600b60248201526a1b9bc8189bde081b19599d60aa1b6044820152606401610946565b6010543360009081526013602052604090205461177990839060ff16613064565b60ff1611156117b75760405162461bcd60e51b815260206004820152600a6024820152691bdd995c881b1a5b5a5d60b21b6044820152606401610946565b6015546000906117ca9060ff8416612217565b9050803410156118095760405162461bcd60e51b815260206004820152600a602482015269195c9c88185b5bdd5b9d60b21b6044820152606401610946565b6016546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611856576040519150601f19603f3d011682016040523d82523d6000602084013e61185b565b606091505b50509050806118a35760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610946565b336000908152601360205260409020546118c190849060ff16613064565b336000908152601360205260408120805460ff191660ff93909316929092179091555b8360ff168160ff16101561193857601180549060006119028361314b565b919050555061191333601154611f60565b6119266011546014805461139090613116565b8061193081613166565b9150506118e4565b50505050565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146119875760405162461bcd60e51b81526004016109469190613039565b50610def600e8383612a48565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b03166119ef5760405162461bcd60e51b81526004016109469190613039565b506119f983612296565b9392505050565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314611a495760405162461bcd60e51b81526004016109469190613039565b5060005b8251811015610def578160126000858481518110611a6d57611a6d6131dc565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611aa98161314b565b915050611a4d565b60185460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611afe57600080fd5b505afa158015611b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b369190612e72565b6001600160a01b03161415611b4f576001915050610dce565b50506001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314611bc85760405162461bcd60e51b81526004016109469190613039565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b038216611c0d5760405162461bcd60e51b81526004016109469190613039565b50600c546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b61166282826122f4565b60008281526001602052604090205482906001600160a01b031633811480611cb257506000828152600260205260409020546001600160a01b031633145b80611ce057506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090611d1d5760405162461bcd60e51b81526004016109469190613039565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b0316611d775760405162461bcd60e51b81526004016109469190613039565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03908116919089168214611dd65760405162461bcd60e51b81526004016109469190613039565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038816611e1b5760405162461bcd60e51b81526004016109469190613039565b50611e268787611c6a565b611e38876001600160a01b031661237f565b15611f1857604051630a85bd0160e11b81526000906001600160a01b0389169063150b7a0290611e729033908d908c908c90600401612ffc565b602060405180830381600087803b158015611e8c57600080fd5b505af1158015611ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec49190612e55565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b14611f155760405162461bcd60e51b81526004016109469190613039565b50505b5050505050505050565b611f2b816123bb565b6000818152600b60205260408120610e4791612ac8565b6001600160a01b038116600090815260076020526040812054610dce565b611f6a828261246f565b600580546001818101835560008390527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db09091018390559054611fad91906130bc565b6000918252600660205260409091205550565b600082815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166120195760405162461bcd60e51b81526004016109469190613039565b506000838152600b60209081526040909120835161193892850190612b02565b6000806019541161207e5760405162461bcd60e51b815260206004820152600f60248201526e20b6361031b0b9323990323930bbb760891b6044820152606401610946565b600061208b601954612552565b90506000612098826125f0565b90506120b160016019546120ac91906130bc565b6125f0565b601a6000848152602001908152602001600020819055506000601a600060016019546120dd91906130bc565b81526020019081526020016000208190555060016019600082825461210291906130bc565b90915550909392505050565b6060816121325750506040805180820190915260018152600360fc1b602082015290565b8160005b811561215c57806121468161314b565b91506121559050600a83613089565b9150612136565b60008167ffffffffffffffff811115612177576121776131f2565b6040519080825280601f01601f1916602001820160405280156121a1576020820181803683370190505b508593509050815b831561220e576121ba600a85613186565b6121c590603061304c565b60f81b826121d2836130ff565b925082815181106121e5576121e56131dc565b60200101906001600160f81b031916908160001a905350612207600a85613089565b93506121a9565b50949350505050565b60008261222657506000610dce565b6000612232838561309d565b90508261223f8583613089565b146119f95760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610946565b60606000600e80546122a790613116565b9050116122c35760405180602001604052806000815250610dce565b600e6122ce83612620565b6040516020016122df929190612f55565b60405160208183030381529060405292915050565b600081815260016020908152604080832054600290925290912080546001600160a01b03191690556001600160a01b031661232f81836126c2565b61233983836126cc565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906123b35750808214155b949350505050565b6123c4816126d6565b6000818152600660205260408120546005549091906123e5906001906130bc565b90506000600582815481106123fc576123fc6131dc565b90600052602060002001549050806005848154811061241d5761241d6131dc565b600091825260209091200155600580548061243a5761243a6131c6565b600082815260208082208301600019908101839055909201909255918152600690915260408082209390935592835250812055565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b0383166124b35760405162461bcd60e51b81526004016109469190613039565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561250b5760405162461bcd60e51b81526004016109469190613039565b5061251682826126cc565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000816125bb436125b54233604051602001612586919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528051906020012060001c6125a99190613089565b6125b5458142446127a8565b906127a8565b6040516020016125cd91815260200190565b6040516020818303038152906040528051906020012060001c610dce9190613186565b6000818152601a60205260408120541561261757506000908152601a602052604090205490565b5090565b919050565b6000818152600b6020526040902080546060919061263d90613116565b80601f016020809104026020016040519081016040528092919081815260200182805461266990613116565b80156126b65780601f1061268b576101008083540402835291602001916126b6565b820191906000526020600020905b81548152906001019060200180831161269957829003601f168201915b50505050509050919050565b6116628282612807565b6116628282612984565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528291906001600160a01b031661272f5760405162461bcd60e51b81526004016109469190613039565b50600082815260016020908152604080832054600290925290912080546001600160a01b03191690556001600160a01b031661276b81846126c2565b60405183906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505050565b6000806127b5838561304c565b9050838110156119f95760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610946565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b038481169116146128625760405162461bcd60e51b81526004016109469190613039565b50600081815260016020818152604080842080546001600160a01b031916905560088252808420546001600160a01b038716855260079092528320549092916128aa916130bc565b9050818114612941576001600160a01b03841660009081526007602052604081208054839081106128dd576128dd6131dc565b906000526020600020015490508060076000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612921576129216131dc565b600091825260208083209091019290925591825260089052604090208290555b6001600160a01b0384166000908152600760205260409020805480612968576129686131c6565b6001900381819060005260206000200160009055905550505050565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156129db5760405162461bcd60e51b81526004016109469190613039565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b03881690811790915580855260078352908420805480850182558186529285209092018590559092529054612a3591906130bc565b6000918252600860205260409091205550565b828054612a5490613116565b90600052602060002090601f016020900481019282612a765760008555612abc565b82601f10612a8f5782800160ff19823516178555612abc565b82800160010185558215612abc579182015b82811115612abc578235825591602001919060010190612aa1565b50612617929150612b76565b508054612ad490613116565b6000825580601f10612ae4575050565b601f016020900490600052602060002090810190610e479190612b76565b828054612b0e90613116565b90600052602060002090601f016020900481019282612b305760008555612abc565b82601f10612b4957805160ff1916838001178555612abc565b82800160010185558215612abc579182015b82811115612abc578251825591602001919060010190612b5b565b5b808211156126175760008155600101612b77565b803561261b81613208565b8035801515811461261b57600080fd5b60008083601f840112612bb857600080fd5b50813567ffffffffffffffff811115612bd057600080fd5b602083019150836020828501011115612be857600080fd5b9250929050565b600060208284031215612c0157600080fd5b81356119f981613208565b60008060408385031215612c1f57600080fd5b8235612c2a81613208565b91506020830135612c3a81613208565b809150509250929050565b600080600060608486031215612c5a57600080fd5b8335612c6581613208565b92506020840135612c7581613208565b929592945050506040919091013590565b600080600080600060808688031215612c9e57600080fd5b8535612ca981613208565b94506020860135612cb981613208565b935060408601359250606086013567ffffffffffffffff811115612cdc57600080fd5b612ce888828901612ba6565b969995985093965092949392505050565b60008060408385031215612d0c57600080fd5b8235612d1781613208565b9150612d2560208401612b96565b90509250929050565b60008060408385031215612d4157600080fd5b8235612d4c81613208565b946020939093013593505050565b60008060408385031215612d6d57600080fd5b823567ffffffffffffffff80821115612d8557600080fd5b818501915085601f830112612d9957600080fd5b8135602082821115612dad57612dad6131f2565b8160051b604051601f19603f83011681018181108682111715612dd257612dd26131f2565b604052838152828101945085830182870184018b1015612df157600080fd5b600096505b84871015612e1b57612e0781612b8b565b865260019690960195948301948301612df6565b509650612e2b9050878201612b96565b9450505050509250929050565b600060208284031215612e4a57600080fd5b81356119f98161321d565b600060208284031215612e6757600080fd5b81516119f98161321d565b600060208284031215612e8457600080fd5b81516119f981613208565b60008060208385031215612ea257600080fd5b823567ffffffffffffffff811115612eb957600080fd5b612ec585828601612ba6565b90969095509350505050565b600060208284031215612ee357600080fd5b5035919050565b600060208284031215612efc57600080fd5b813560ff811681146119f957600080fd5b60008151808452612f258160208601602086016130d3565b601f01601f19169290920160200192915050565b60008151612f4b8185602086016130d3565b9290920192915050565b600080845481600182811c915080831680612f7157607f831692505b6020808410821415612f9157634e487b7160e01b86526022600452602486fd5b818015612fa55760018114612fb657612fe3565b60ff19861689528489019650612fe3565b60008b81526020902060005b86811015612fdb5781548b820152908501908301612fc2565b505084890196505b505050505050612ff38185612f39565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061302f90830184612f0d565b9695505050505050565b6020815260006119f96020830184612f0d565b6000821982111561305f5761305f61319a565b500190565b600060ff821660ff84168060ff038211156130815761308161319a565b019392505050565b600082613098576130986131b0565b500490565b60008160001904831182151516156130b7576130b761319a565b500290565b6000828210156130ce576130ce61319a565b500390565b60005b838110156130ee5781810151838201526020016130d6565b838111156119385750506000910152565b60008161310e5761310e61319a565b506000190190565b600181811c9082168061312a57607f821691505b6020821081141561096b57634e487b7160e01b600052602260045260246000fd5b600060001982141561315f5761315f61319a565b5060010190565b600060ff821660ff81141561317d5761317d61319a565b60010192915050565b600082613195576131956131b0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e4757600080fd5b6001600160e01b031981168114610e4757600080fdfea2646970667358221220eb09805b7a7cac50326ef7cb067c7eded10e5848e5c827149dc6f1be81cb692164736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d66476b393433525141443479617338423275514c4e45575658785a59514b376750765a624e557a62714c76452f

Deployed Bytecode

0x60806040526004361061025e5760003560e01c80637b89523811610143578063b1e5e2b7116100bb578063e43f696e11610077578063e43f696e14610757578063e985e9c514610777578063f2fde38b14610797578063f3fe3bc3146107b7578063f432980d146107e9578063f46f6e3d1461082b57005b8063b1e5e2b7146106ae578063b88d4fde146106ce578063c261a268146106ee578063c7c3268b14610701578063c87b56dd14610721578063e0d8b65d1461074157005b80638da5cb5b1161010a5780638da5cb5b1461060357806391b7f5ed1461062357806395d89b4114610643578063a035b1fe14610658578063a22cb4651461066e578063a65eacdc1461068e57005b80637b8952381461054c5780637d16a3d41461057c57806382c081871461059c578063860d248a146105bc578063894db748146105ee57005b80634322f09a116101d65780635f48f3931161019d5780635f48f393146104b55780636352211e146104cb5780636c0360eb146104eb5780636d6f3d601461050057806370a082311461051657806375daccc01461053657005b80634322f09a1461040557806347240874146104255780634b0697e4146104455780634f6ccce71461047557806357b59e161461049557005b806323b872dd1161022557806323b872dd1461034f5780632d06177a1461036f5780632f745c591461038f5780633431dcc2146103af57806342842e0e146103c557806342966c68146103e557005b806301ffc9a71461026757806306fdde03146102b6578063081812fc146102d8578063095ea7b31461031057806318160ddd1461033057005b3661026557005b005b34801561027357600080fd5b506102a1610282366004612e38565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b3480156102c257600080fd5b506102cb61085d565b6040516102ad9190613039565b3480156102e457600080fd5b506102f86102f3366004612ed1565b6108ef565b6040516001600160a01b0390911681526020016102ad565b34801561031c57600080fd5b5061026561032b366004612d2e565b610971565b34801561033c57600080fd5b506005545b6040519081526020016102ad565b34801561035b57600080fd5b5061026561036a366004612c45565b610b13565b34801561037b57600080fd5b5061026561038a366004612bef565b610cce565b34801561039b57600080fd5b506103416103aa366004612d2e565b610d3c565b3480156103bb57600080fd5b5061034160195481565b3480156103d157600080fd5b506102656103e0366004612c45565b610dd4565b3480156103f157600080fd5b50610265610400366004612ed1565b610df4565b34801561041157600080fd5b50610265610420366004612ed1565b610e4a565b34801561043157600080fd5b50610265610440366004612cf9565b610e99565b34801561045157600080fd5b506102a1610460366004612bef565b600d6020526000908152604090205460ff1681565b34801561048157600080fd5b50610341610490366004612ed1565b610f66565b3480156104a157600080fd5b506102656104b0366004612bef565b610fce565b3480156104c157600080fd5b506103416115b381565b3480156104d757600080fd5b506102f86104e6366004612ed1565b61103a565b3480156104f757600080fd5b506102cb611092565b34801561050c57600080fd5b5061034160175481565b34801561052257600080fd5b50610341610531366004612bef565b611120565b34801561054257600080fd5b50610341600f5481565b34801561055857600080fd5b506102a1610567366004612bef565b60126020526000908152604090205460ff1681565b34801561058857600080fd5b50610265610597366004612bef565b611171565b3480156105a857600080fd5b506102656105b7366004612ed1565b6111dd565b3480156105c857600080fd5b506102cb6040518060400160405280600681526020016518189c18181960d11b81525081565b3480156105fa57600080fd5b5061026561122c565b34801561060f57600080fd5b50600c546102f8906001600160a01b031681565b34801561062f57600080fd5b5061026561063e366004612ed1565b61142c565b34801561064f57600080fd5b506102cb61147b565b34801561066457600080fd5b5061034160155481565b34801561067a57600080fd5b50610265610689366004612cf9565b61148a565b34801561069a57600080fd5b506102656106a9366004612bef565b6114f6565b3480156106ba57600080fd5b506102656106c9366004612ed1565b611561565b3480156106da57600080fd5b506102656106e9366004612c86565b611666565b6102656106fc366004612eea565b6116af565b34801561070d57600080fd5b5061026561071c366004612e8f565b61193e565b34801561072d57600080fd5b506102cb61073c366004612ed1565b611994565b34801561074d57600080fd5b5061034160105481565b34801561076357600080fd5b50610265610772366004612d5a565b611a00565b34801561078357600080fd5b506102a1610792366004612c0c565b611ab1565b3480156107a357600080fd5b506102656107b2366004612bef565b611b7f565b3480156107c357600080fd5b506102cb6040518060400160405280600681526020016530313830303160d01b81525081565b3480156107f557600080fd5b50610819610804366004612bef565b60136020526000908152604090205460ff1681565b60405160ff90911681526020016102ad565b34801561083757600080fd5b506102cb6040518060400160405280600681526020016530313830303360d01b81525081565b60606009805461086c90613116565b80601f016020809104026020016040519081016040528092919081815260200182805461089890613116565b80156108e55780601f106108ba576101008083540402835291602001916108e5565b820191906000526020600020905b8154815290600101906020018083116108c857829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b031661094f5760405162461bcd60e51b81526004016109469190613039565b60405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b60008181526001602052604090205481906001600160a01b0316338114806109bc57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b815250906109f95760405162461bcd60e51b81526004016109469190613039565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b0316610a535760405162461bcd60e51b81526004016109469190613039565b50600084815260016020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b0390811691908716821415610ab35760405162461bcd60e51b81526004016109469190613039565b5060008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b60008181526001602052604090205481906001600160a01b031633811480610b5157506000828152600260205260409020546001600160a01b031633145b80610b7f57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610bbc5760405162461bcd60e51b81526004016109469190613039565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b0316610c165760405162461bcd60e51b81526004016109469190613039565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03908116919088168214610c755760405162461bcd60e51b81526004016109469190613039565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038716610cba5760405162461bcd60e51b81526004016109469190613039565b50610cc58686611c6a565b50505050505050565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610d175760405162461bcd60e51b81526004016109469190613039565b506001600160a01b03166000908152600d60205260409020805460ff19166001179055565b6001600160a01b0382166000908152600760209081526040808320548151808301909252600682526530303530303760d01b92820192909252908310610d955760405162461bcd60e51b81526004016109469190613039565b506001600160a01b0383166000908152600760205260409020805483908110610dc057610dc06131dc565b906000526020600020015490505b92915050565b610def83838360405180602001604052806000815250611c74565b505050565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610e3d5760405162461bcd60e51b81526004016109469190613039565b50610e4781611f22565b50565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610e935760405162461bcd60e51b81526004016109469190613039565b50601755565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610ee25760405162461bcd60e51b81526004016109469190613039565b506001600160a01b03821660009081526012602052604090205460ff1615158115151415610f3b5760405162461bcd60e51b81526020600482015260066024820152651a5cc81cd95d60d21b6044820152606401610946565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b60055460408051808201909152600681526530303530303760d01b60208201526000918310610fa85760405162461bcd60e51b81526004016109469190613039565b5060058281548110610fbc57610fbc6131dc565b90600052602060002001549050919050565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146110175760405162461bcd60e51b81526004016109469190613039565b50601680546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b0316908161096b5760405162461bcd60e51b81526004016109469190613039565b600e805461109f90613116565b80601f01602080910402602001604051908101604052809291908181526020018280546110cb90613116565b80156111185780601f106110ed57610100808354040283529160200191611118565b820191906000526020600020905b8154815290600101906020018083116110fb57829003601f168201915b505050505081565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b0383166111675760405162461bcd60e51b81526004016109469190613039565b50610dce82611f42565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146111ba5760405162461bcd60e51b81526004016109469190613039565b50601880546001600160a01b0319166001600160a01b0392909216919091179055565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146112265760405162461bcd60e51b81526004016109469190613039565b50601055565b3360009081526012602052604090205460ff166112775760405162461bcd60e51b81526020600482015260096024820152686e6f7420776869746560b81b6044820152606401610946565b600f80549060006112878361314b565b91905055506115b3600f5411156112ce5760405162461bcd60e51b815260206004820152600b60248201526a1b9bc8189bde081b19599d60aa1b6044820152606401610946565b6010543360009081526013602052604090205460ff161061131e5760405162461bcd60e51b815260206004820152600a6024820152691bdd995c881b1a5b5a5d60b21b6044820152606401610946565b3360009081526013602052604090205461133c9060ff166001613064565b336000908152601360205260408120805460ff191660ff9390931692909217909155601180549161136c8361314b565b919050555061137d33601154611f60565b6114136011546014805461139090613116565b80601f01602080910402602001604051908101604052809291908181526020018280546113bc90613116565b80156114095780601f106113de57610100808354040283529160200191611409565b820191906000526020600020905b8154815290600101906020018083116113ec57829003601f168201915b5050505050611fc0565b336000908152601260205260409020805460ff19169055565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146114755760405162461bcd60e51b81526004016109469190613039565b50601555565b6060600a805461086c90613116565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b0316331461153f5760405162461bcd60e51b81526004016109469190613039565b506001600160a01b03166000908152600d60205260409020805460ff19169055565b60175442101561159f5760405162461bcd60e51b81526020600482015260096024820152681b9bdd081cdd185c9d60ba1b6044820152606401610946565b6298968081116115df5760405162461bcd60e51b815260206004820152600b60248201526a195c9c881d1bdad95b9a5960aa1b6044820152606401610946565b6000818152600160205260409020546001600160a01b031633146116315760405162461bcd60e51b815260206004820152600960248201526832b9391037bbb732b960b91b6044820152606401610946565b61163a81611f22565b6000611644612039565b90506116503382611f60565b6116628161165d8361210e565b611fc0565b5050565b6116a885858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c7492505050565b5050505050565b60018160ff161015806116c6575060028160ff1611155b6116fc5760405162461bcd60e51b8152602060048201526007602482015266657272206e756d60c81b6044820152606401610946565b8060ff16600f6000828254611711919061304c565b9091555050600f546115b310156117585760405162461bcd60e51b815260206004820152600b60248201526a1b9bc8189bde081b19599d60aa1b6044820152606401610946565b6010543360009081526013602052604090205461177990839060ff16613064565b60ff1611156117b75760405162461bcd60e51b815260206004820152600a6024820152691bdd995c881b1a5b5a5d60b21b6044820152606401610946565b6015546000906117ca9060ff8416612217565b9050803410156118095760405162461bcd60e51b815260206004820152600a602482015269195c9c88185b5bdd5b9d60b21b6044820152606401610946565b6016546040516000916001600160a01b03169034908381818185875af1925050503d8060008114611856576040519150601f19603f3d011682016040523d82523d6000602084013e61185b565b606091505b50509050806118a35760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610946565b336000908152601360205260409020546118c190849060ff16613064565b336000908152601360205260408120805460ff191660ff93909316929092179091555b8360ff168160ff16101561193857601180549060006119028361314b565b919050555061191333601154611f60565b6119266011546014805461139090613116565b8061193081613166565b9150506118e4565b50505050565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146119875760405162461bcd60e51b81526004016109469190613039565b50610def600e8383612a48565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b03166119ef5760405162461bcd60e51b81526004016109469190613039565b506119f983612296565b9392505050565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314611a495760405162461bcd60e51b81526004016109469190613039565b5060005b8251811015610def578160126000858481518110611a6d57611a6d6131dc565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611aa98161314b565b915050611a4d565b60185460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611afe57600080fd5b505afa158015611b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b369190612e72565b6001600160a01b03161415611b4f576001915050610dce565b50506001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600c5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314611bc85760405162461bcd60e51b81526004016109469190613039565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b038216611c0d5760405162461bcd60e51b81526004016109469190613039565b50600c546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c80546001600160a01b0319166001600160a01b0392909216919091179055565b61166282826122f4565b60008281526001602052604090205482906001600160a01b031633811480611cb257506000828152600260205260409020546001600160a01b031633145b80611ce057506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090611d1d5760405162461bcd60e51b81526004016109469190613039565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b0316611d775760405162461bcd60e51b81526004016109469190613039565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03908116919089168214611dd65760405162461bcd60e51b81526004016109469190613039565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038816611e1b5760405162461bcd60e51b81526004016109469190613039565b50611e268787611c6a565b611e38876001600160a01b031661237f565b15611f1857604051630a85bd0160e11b81526000906001600160a01b0389169063150b7a0290611e729033908d908c908c90600401612ffc565b602060405180830381600087803b158015611e8c57600080fd5b505af1158015611ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec49190612e55565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b14611f155760405162461bcd60e51b81526004016109469190613039565b50505b5050505050505050565b611f2b816123bb565b6000818152600b60205260408120610e4791612ac8565b6001600160a01b038116600090815260076020526040812054610dce565b611f6a828261246f565b600580546001818101835560008390527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db09091018390559054611fad91906130bc565b6000918252600660205260409091205550565b600082815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166120195760405162461bcd60e51b81526004016109469190613039565b506000838152600b60209081526040909120835161193892850190612b02565b6000806019541161207e5760405162461bcd60e51b815260206004820152600f60248201526e20b6361031b0b9323990323930bbb760891b6044820152606401610946565b600061208b601954612552565b90506000612098826125f0565b90506120b160016019546120ac91906130bc565b6125f0565b601a6000848152602001908152602001600020819055506000601a600060016019546120dd91906130bc565b81526020019081526020016000208190555060016019600082825461210291906130bc565b90915550909392505050565b6060816121325750506040805180820190915260018152600360fc1b602082015290565b8160005b811561215c57806121468161314b565b91506121559050600a83613089565b9150612136565b60008167ffffffffffffffff811115612177576121776131f2565b6040519080825280601f01601f1916602001820160405280156121a1576020820181803683370190505b508593509050815b831561220e576121ba600a85613186565b6121c590603061304c565b60f81b826121d2836130ff565b925082815181106121e5576121e56131dc565b60200101906001600160f81b031916908160001a905350612207600a85613089565b93506121a9565b50949350505050565b60008261222657506000610dce565b6000612232838561309d565b90508261223f8583613089565b146119f95760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610946565b60606000600e80546122a790613116565b9050116122c35760405180602001604052806000815250610dce565b600e6122ce83612620565b6040516020016122df929190612f55565b60405160208183030381529060405292915050565b600081815260016020908152604080832054600290925290912080546001600160a01b03191690556001600160a01b031661232f81836126c2565b61233983836126cc565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906123b35750808214155b949350505050565b6123c4816126d6565b6000818152600660205260408120546005549091906123e5906001906130bc565b90506000600582815481106123fc576123fc6131dc565b90600052602060002001549050806005848154811061241d5761241d6131dc565b600091825260209091200155600580548061243a5761243a6131c6565b600082815260208082208301600019908101839055909201909255918152600690915260408082209390935592835250812055565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b0383166124b35760405162461bcd60e51b81526004016109469190613039565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561250b5760405162461bcd60e51b81526004016109469190613039565b5061251682826126cc565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000816125bb436125b54233604051602001612586919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528051906020012060001c6125a99190613089565b6125b5458142446127a8565b906127a8565b6040516020016125cd91815260200190565b6040516020818303038152906040528051906020012060001c610dce9190613186565b6000818152601a60205260408120541561261757506000908152601a602052604090205490565b5090565b919050565b6000818152600b6020526040902080546060919061263d90613116565b80601f016020809104026020016040519081016040528092919081815260200182805461266990613116565b80156126b65780601f1061268b576101008083540402835291602001916126b6565b820191906000526020600020905b81548152906001019060200180831161269957829003601f168201915b50505050509050919050565b6116628282612807565b6116628282612984565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528291906001600160a01b031661272f5760405162461bcd60e51b81526004016109469190613039565b50600082815260016020908152604080832054600290925290912080546001600160a01b03191690556001600160a01b031661276b81846126c2565b60405183906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505050565b6000806127b5838561304c565b9050838110156119f95760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610946565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b038481169116146128625760405162461bcd60e51b81526004016109469190613039565b50600081815260016020818152604080842080546001600160a01b031916905560088252808420546001600160a01b038716855260079092528320549092916128aa916130bc565b9050818114612941576001600160a01b03841660009081526007602052604081208054839081106128dd576128dd6131dc565b906000526020600020015490508060076000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612921576129216131dc565b600091825260208083209091019290925591825260089052604090208290555b6001600160a01b0384166000908152600760205260409020805480612968576129686131c6565b6001900381819060005260206000200160009055905550505050565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156129db5760405162461bcd60e51b81526004016109469190613039565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b03881690811790915580855260078352908420805480850182558186529285209092018590559092529054612a3591906130bc565b6000918252600860205260409091205550565b828054612a5490613116565b90600052602060002090601f016020900481019282612a765760008555612abc565b82601f10612a8f5782800160ff19823516178555612abc565b82800160010185558215612abc579182015b82811115612abc578235825591602001919060010190612aa1565b50612617929150612b76565b508054612ad490613116565b6000825580601f10612ae4575050565b601f016020900490600052602060002090810190610e479190612b76565b828054612b0e90613116565b90600052602060002090601f016020900481019282612b305760008555612abc565b82601f10612b4957805160ff1916838001178555612abc565b82800160010185558215612abc579182015b82811115612abc578251825591602001919060010190612b5b565b5b808211156126175760008155600101612b77565b803561261b81613208565b8035801515811461261b57600080fd5b60008083601f840112612bb857600080fd5b50813567ffffffffffffffff811115612bd057600080fd5b602083019150836020828501011115612be857600080fd5b9250929050565b600060208284031215612c0157600080fd5b81356119f981613208565b60008060408385031215612c1f57600080fd5b8235612c2a81613208565b91506020830135612c3a81613208565b809150509250929050565b600080600060608486031215612c5a57600080fd5b8335612c6581613208565b92506020840135612c7581613208565b929592945050506040919091013590565b600080600080600060808688031215612c9e57600080fd5b8535612ca981613208565b94506020860135612cb981613208565b935060408601359250606086013567ffffffffffffffff811115612cdc57600080fd5b612ce888828901612ba6565b969995985093965092949392505050565b60008060408385031215612d0c57600080fd5b8235612d1781613208565b9150612d2560208401612b96565b90509250929050565b60008060408385031215612d4157600080fd5b8235612d4c81613208565b946020939093013593505050565b60008060408385031215612d6d57600080fd5b823567ffffffffffffffff80821115612d8557600080fd5b818501915085601f830112612d9957600080fd5b8135602082821115612dad57612dad6131f2565b8160051b604051601f19603f83011681018181108682111715612dd257612dd26131f2565b604052838152828101945085830182870184018b1015612df157600080fd5b600096505b84871015612e1b57612e0781612b8b565b865260019690960195948301948301612df6565b509650612e2b9050878201612b96565b9450505050509250929050565b600060208284031215612e4a57600080fd5b81356119f98161321d565b600060208284031215612e6757600080fd5b81516119f98161321d565b600060208284031215612e8457600080fd5b81516119f981613208565b60008060208385031215612ea257600080fd5b823567ffffffffffffffff811115612eb957600080fd5b612ec585828601612ba6565b90969095509350505050565b600060208284031215612ee357600080fd5b5035919050565b600060208284031215612efc57600080fd5b813560ff811681146119f957600080fd5b60008151808452612f258160208601602086016130d3565b601f01601f19169290920160200192915050565b60008151612f4b8185602086016130d3565b9290920192915050565b600080845481600182811c915080831680612f7157607f831692505b6020808410821415612f9157634e487b7160e01b86526022600452602486fd5b818015612fa55760018114612fb657612fe3565b60ff19861689528489019650612fe3565b60008b81526020902060005b86811015612fdb5781548b820152908501908301612fc2565b505084890196505b505050505050612ff38185612f39565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061302f90830184612f0d565b9695505050505050565b6020815260006119f96020830184612f0d565b6000821982111561305f5761305f61319a565b500190565b600060ff821660ff84168060ff038211156130815761308161319a565b019392505050565b600082613098576130986131b0565b500490565b60008160001904831182151516156130b7576130b761319a565b500290565b6000828210156130ce576130ce61319a565b500390565b60005b838110156130ee5781810151838201526020016130d6565b838111156119385750506000910152565b60008161310e5761310e61319a565b506000190190565b600181811c9082168061312a57607f821691505b6020821081141561096b57634e487b7160e01b600052602260045260246000fd5b600060001982141561315f5761315f61319a565b5060010190565b600060ff821660ff81141561317d5761317d61319a565b60010192915050565b600082613195576131956131b0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e4757600080fd5b6001600160e01b031981168114610e4757600080fdfea2646970667358221220eb09805b7a7cac50326ef7cb067c7eded10e5848e5c827149dc6f1be81cb692164736f6c63430008070033

Deployed Bytecode Sourcemap

41196:8845:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8655:172;;;;;;;;;;-1:-1:-1;8655:172:0;;;;;:::i;:::-;-1:-1:-1;;;;;;8788:33:0;8765:4;8788:33;;;;;;;;;;;;;;8655:172;;;;9433:14:1;;9426:22;9408:41;;9396:2;9381:18;8655:172:0;;;;;;;;24967:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18021:183::-;;;;;;;;;;-1:-1:-1;18021:183:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8731:32:1;;;8713:51;;8701:2;8686:18;18021:183:0;8567:203:1;15806:352:0;;;;;;;;;;-1:-1:-1;15806:352:0;;;;;:::i;:::-;;:::i;29596:120::-;;;;;;;;;;-1:-1:-1;29697:6:0;:13;29596:120;;;14319:25:1;;;14307:2;14292:18;29596:120:0;14173:177:1;15032:353:0;;;;;;;;;;-1:-1:-1;15032:353:0;;;;;:::i;:::-;;:::i;34697:89::-;;;;;;;;;;-1:-1:-1;34697:89:0;;;;;:::i;:::-;;:::i;30293:251::-;;;;;;;;;;-1:-1:-1;30293:251:0;;;;;:::i;:::-;;:::i;41949:36::-;;;;;;;;;;;;;;;;14277:179;;;;;;;;;;-1:-1:-1;14277:179:0;;;;;:::i;:::-;;:::i;46284:108::-;;;;;;;;;;-1:-1:-1;46284:108:0;;;;;:::i;:::-;;:::i;42812:87::-;;;;;;;;;;-1:-1:-1;42812:87:0;;;;;:::i;:::-;;:::i;42214:139::-;;;;;;;;;;-1:-1:-1;42214:139:0;;;;;:::i;:::-;;:::i;34274:37::-;;;;;;;;;;-1:-1:-1;34274:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29857:199;;;;;;;;;;-1:-1:-1;29857:199:0;;;;;:::i;:::-;;:::i;42717:89::-;;;;;;;;;;-1:-1:-1;42717:89:0;;;;;:::i;:::-;;:::i;41347:40::-;;;;;;;;;;;;41383:4;41347:40;;17569:208;;;;;;;;;;-1:-1:-1;17569:208:0;;;;;:::i;:::-;;:::i;41315:21::-;;;;;;;;;;;;;:::i;41809:40::-;;;;;;;;;;;;;;;;17095:204;;;;;;;;;;-1:-1:-1;17095:204:0;;;;;:::i;:::-;;:::i;41395:27::-;;;;;;;;;;;;;;;;41504:40;;;;;;;;;;-1:-1:-1;41504:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45579:104;;;;;;;;;;-1:-1:-1;45579:104:0;;;;;:::i;:::-;;:::i;42614:91::-;;;;;;;;;;-1:-1:-1;42614:91:0;;;;;:::i;:::-;;:::i;34119:65::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34119:65:0;;;;;43757:422;;;;;;;;;;;;;:::i;34249:20::-;;;;;;;;;;-1:-1:-1;34249:20:0;;;;-1:-1:-1;;;;;34249:20:0;;;42529:77;;;;;;;;;;-1:-1:-1;42529:77:0;;;;;:::i;:::-;;:::i;25203:128::-;;;;;;;;;;;;;:::i;41652:39::-;;;;;;;;;;;;;;;;16569:232;;;;;;;;;;-1:-1:-1;16569:232:0;;;;;:::i;:::-;;:::i;34794:90::-;;;;;;;;;;-1:-1:-1;34794:90:0;;;;;:::i;:::-;;:::i;44188:360::-;;;;;;;;;;-1:-1:-1;44188:360:0;;;;;:::i;:::-;;:::i;13657:209::-;;;;;;;;;;-1:-1:-1;13657:209:0;;;;;:::i;:::-;;:::i;43073:676::-;;;;;;:::i;:::-;;:::i;42907:85::-;;;;;;;;;;-1:-1:-1;42907:85:0;;;;;:::i;:::-;;:::i;25484:183::-;;;;;;;;;;-1:-1:-1;25484:183:0;;;;;:::i;:::-;;:::i;41429:31::-;;;;;;;;;;;;;;;;42361:158;;;;;;;;;;-1:-1:-1;42361:158:0;;;;;:::i;:::-;;:::i;45693:331::-;;;;;;;;;;-1:-1:-1;45693:331:0;;;;;:::i;:::-;;:::i;34888:238::-;;;;;;;;;;-1:-1:-1;34888:238:0;;;;;:::i;:::-;;:::i;34063:51::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34063:51:0;;;;;41551:45;;;;;;;;;;-1:-1:-1;41551:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14527:4:1;14515:17;;;14497:36;;14485:2;14470:18;41551:45:0;14355:184:1;34189:53:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34189:53:0;;;;;24967:120;25035:19;25074:7;25066:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24967:120;:::o;18021:183::-;18150:7;12589:19;;;:9;:19;;;;;;;;;12624:13;;;;;;;;;;;-1:-1:-1;;;12624:13:0;;;;;;;18126:8;;-1:-1:-1;;;;;12589:19:0;12581:57;;;;-1:-1:-1;;;12581:57:0;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;18176:22:0::1;::::0;;;:12:::1;:22;::::0;;;;;-1:-1:-1;;;;;18176:22:0::1;::::0;-1:-1:-1;12645:1:0::1;18021:183:::0;;;;:::o;15806:352::-;11773:18;11794:19;;;:9;:19;;;;;;15919:8;;-1:-1:-1;;;;;11794:19:0;11850:10;11836:24;;;:68;;-1:-1:-1;;;;;;11864:28:0;;;;;;:16;:28;;;;;;;;11893:10;11864:40;;;;;;;;;;11836:68;11913:21;;;;;;;;;;;;;-1:-1:-1;;;11913:21:0;;;11820:121;;;;;-1:-1:-1;;;11820:121:0;;;;;;;;:::i;:::-;-1:-1:-1;12620:1:0::1;12589:19:::0;;;:9:::1;:19;::::0;;;;;;;;;12624:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;12624:13:0;;::::1;::::0;;;;15947:8;;12624:13;-1:-1:-1;;;;;12589:19:0::1;12581:57;;;;-1:-1:-1::0;;;12581:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;15967:18:0::2;15988:19:::0;;;:9:::2;:19;::::0;;;;;;;;;16047:8;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;16047:8:0;;::::2;::::0;;;;-1:-1:-1;;;;;15988:19:0;;::::2;::::0;16047:8;16022:23;::::2;::::0;::::2;;16014:42;;;;-1:-1:-1::0;;;16014:42:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;16065:22:0::2;::::0;;;:12:::2;:22;::::0;;;;;:34;;-1:-1:-1;;;;;;16065:34:0::2;-1:-1:-1::0;;;;;16065:34:0;;::::2;::::0;;::::2;::::0;;;16111:41;;16065:22;;16111:41;;::::2;::::0;::::2;::::0;::::2;15960:198;11948:1:::1;11766:189:::0;15806:352;;;:::o;15032:353::-;12153:18;12174:19;;;:9;:19;;;;;;15165:8;;-1:-1:-1;;;;;12174:19:0;12230:10;12216:24;;;:71;;-1:-1:-1;12251:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;12251:22:0;12277:10;12251:36;12216:71;:122;;;-1:-1:-1;;;;;;12298:28:0;;;;;;:16;:28;;;;;;;;12327:10;12298:40;;;;;;;;;;12216:122;12347:30;;;;;;;;;;;;;-1:-1:-1;;;12347:30:0;;;12200:184;;;;;-1:-1:-1;;;12200:184:0;;;;;;;;:::i;:::-;-1:-1:-1;12620:1:0::1;12589:19:::0;;;:9:::1;:19;::::0;;;;;;;;;12624:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;12624:13:0;;::::1;::::0;;;;15193:8;;12624:13;-1:-1:-1;;;;;12589:19:0::1;12581:57;;;;-1:-1:-1::0;;;12581:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;15213:18:0::2;15234:19:::0;;;:9:::2;:19;::::0;;;;;;;;;15289:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;15289:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;15234:19:0;;::::2;::::0;15289:9;15268:19;::::2;::::0;::::2;15260:39;;;;-1:-1:-1::0;;;15260:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;15333:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;15333:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;15314:17:0;::::2;15306:40;;;;-1:-1:-1::0;;;15306:40:0::2;;;;;;;;:::i;:::-;;15355:24;15365:3;15370:8;15355:9;:24::i;:::-;15206:179;12391:1:::1;12146:252:::0;15032:353;;;;:::o;34697:89::-;34544:5;;34551:17;;;;;;;;;;;;-1:-1:-1;;;34551:17:0;;;;;-1:-1:-1;;;;;34544:5:0;34530:10;:19;34522:47;;;;-1:-1:-1;;;34522:47:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;34758:15:0::1;;::::0;;;:7:::1;:15;::::0;;;;:22;;-1:-1:-1;;34758:22:0::1;34776:4;34758:22;::::0;;34697:89::o;30293:251::-;-1:-1:-1;;;;;30457:18:0;;30421:7;30457:18;;;:10;:18;;;;;;;;:25;30484:13;;;;;;;;;;;-1:-1:-1;;;30484:13:0;;;;;;;;30448:34;;30440:58;;;;-1:-1:-1;;;30440:58:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;30512:18:0;;;;;;:10;:18;;;;;:26;;30531:6;;30512:26;;;;;;:::i;:::-;;;;;;;;;30505:33;;30293:251;;;;;:::o;14277:179::-;14407:43;14425:5;14432:3;14437:8;14407:43;;;;;;;;;;;;:17;:43::i;:::-;14277:179;;;:::o;46284:108::-;34544:5;;34551:17;;;;;;;;;;;;-1:-1:-1;;;34551:17:0;;;;;-1:-1:-1;;;;;34544:5:0;34530:10;:19;34522:47;;;;-1:-1:-1;;;34522:47:0;;;;;;;;:::i;:::-;;46365:21:::1;46377:8;46365:11;:21::i;:::-;46284:108:::0;:::o;42812:87::-;34544:5;;34551:17;;;;;;;;;;;;-1:-1:-1;;;34551:17:0;;;;;-1:-1:-1;;;;;34544:5:0;34530:10;:19;34522:47;;;;-1:-1:-1;;;34522:47:0;;;;;;;;:::i;:::-;-1:-1:-1;42874:12:0::1;:19:::0;42812:87::o;42214:139::-;34544:5;;34551:17;;;;;;;;;;;;-1:-1:-1;;;34551:17:0;;;;;-1:-1:-1;;;;;34544:5:0;34530:10;:19;34522:47;;;;-1:-1:-1;;;34522:47:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;42287:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;;::::1;;:22;;::::0;::::1;;;;42279:40;;;::::0;-1:-1:-1;;;42279:40:0;;12688:2:1;42279:40:0::1;::::0;::::1;12670:21:1::0;12727:1;12707:18;;;12700:29;-1:-1:-1;;;12745:18:1;;;12738:36;12791:18;;42279:40:0::1;12486:329:1::0;42279:40:0::1;-1:-1:-1::0;;;;;42326:14:0;;;::::1;;::::0;;;:8:::1;:14;::::0;;;;:21;;-1:-1:-1;;42326:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42214:139::o;29857:199::-;29993:6;:13;30008;;;;;;;;;;;;-1:-1:-1;;;30008:13:0;;;;29957:7;;29984:22;;29976:46;;;;-1:-1:-1;;;29976:46:0;;;;;;;;:::i;:::-;;30036:6;30043;30036:14;;;;;;;;:::i;:::-;;;;;;;;;30029:21;;29857:199;;;:::o;42717:89::-;34544:5;;34551:17;;;;;;;;;;;;-1:-1:-1;;;34551:17:0;;;;;-1:-1:-1;;;;;34544:5:0;34530:10;:19;34522:47;;;;-1:-1:-1;;;34522:47:0;;;;;;;;:::i;:::-;-1:-1:-1;42786:7:0::1;:14:::0;;-1:-1:-1;;;;;;42786:14:0::1;-1:-1:-1::0;;;;;42786:14:0;;;::::1;::::0;;;::::1;::::0;;42717:89::o;17569:208::-;17666:14;17701:19;;;:9;:19;;;;;;;;;;17757:13;;;;;;;;;;;-1:-1:-1;;;17757:13:0;;;;;;;-1:-1:-1;;;;;17701:19:0;;17735:20;17727:44;;;;-1:-1:-1;;;17727:44:0;;;;;;;;:::i;41315:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17095:204::-;17241:12;;;;;;;;;;;;-1:-1:-1;;;17241:12:0;;;;17192:7;;-1:-1:-1;;;;;17219:20:0;;17211:43;;;;-1:-1:-1;;;17211:43:0;;;;;;;;:::i;:::-;;17268:25;17286:6;17268:17;:25::i;45579:104::-;34544:5;;34551:17;;;;;;;;;;;;-1:-1:-1;;;34551:17:0;;;;;-1:-1:-1;;;;;34544:5:0;34530:10;:19;34522:47;;;;-1:-1:-1;;;34522:47:0;;;;;;;;:::i;:::-;-1:-1:-1;45651:22:0::1;:26:::0;;-1:-1:-1;;;;;;45651:26:0::1;-1:-1:-1::0;;;;;45651:26:0;;;::::1;::::0;;;::::1;::::0;;45579:104::o;42614:91::-;34544:5;;34551:17;;;;;;;;;;;;-1:-1:-1;;;34551:17:0;;;;;-1:-1:-1;;;;;34544:5:0;34530:10;:19;34522:47;;;;-1:-1:-1;;;34522:47:0;;;;;;;;:::i;:::-;-1:-1:-1;42678:12:0::1;:21:::0;42614:91::o;43757:422::-;43810:10;43801:20;;;;:8;:20;;;;;;;;43793:41;;;;-1:-1:-1;;;43793:41:0;;13362:2:1;43793:41:0;;;13344:21:1;13401:1;13381:18;;;13374:29;-1:-1:-1;;;13419:18:1;;;13412:39;13468:18;;43793:41:0;13160:332:1;43793:41:0;43841:12;:14;;;:12;:14;;;:::i;:::-;;;;;;41383:4;43870:12;;:23;;43862:46;;;;-1:-1:-1;;;43862:46:0;;10918:2:1;43862:46:0;;;10900:21:1;10957:2;10937:18;;;10930:30;-1:-1:-1;;;10976:18:1;;;10969:41;11027:18;;43862:46:0;10716:335:1;43862:46:0;43948:12;;43936:10;43923:24;;;;:12;:24;;;;;;;;:37;43915:59;;;;-1:-1:-1;;;43915:59:0;;9886:2:1;43915:59:0;;;9868:21:1;9925:2;9905:18;;;9898:30;-1:-1:-1;;;9944:18:1;;;9937:40;9994:18;;43915:59:0;9684:334:1;43915:59:0;44021:10;44008:24;;;;:12;:24;;;;;;:28;;:24;;;:28;:::i;:::-;43994:10;43981:24;;;;:12;:24;;;;;:55;;-1:-1:-1;;43981:55:0;;;;;;;;;;;;;44045:8;:10;;;;;;:::i;:::-;;;;;;44062:33;44074:10;44086:8;;44062:11;:33::i;:::-;44102:36;44121:8;;44131:6;44102:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:36::i;:::-;44154:10;44168:5;44145:20;;;:8;:20;;;;;:28;;-1:-1:-1;;44145:28:0;;;43757:422::o;42529:77::-;34544:5;;34551:17;;;;;;;;;;;;-1:-1:-1;;;34551:17:0;;;;;-1:-1:-1;;;;;34544:5:0;34530:10;:19;34522:47;;;;-1:-1:-1;;;34522:47:0;;;;;;;;:::i;:::-;-1:-1:-1;42586:5:0::1;:14:::0;42529:77::o;25203:128::-;25273:21;25316:9;25306:19;;;;;:::i;16569:232::-;16701:10;16684:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;16684:39:0;;;;;;;;;;;;:51;;-1:-1:-1;;16684:51:0;;;;;;;;;;16747:48;;9408:41:1;;;16684:39:0;;16701:10;16747:48;;9381:18:1;16747:48:0;;;;;;;16569:232;;:::o;34794:90::-;34544:5;;34551:17;;;;;;;;;;;;-1:-1:-1;;;34551:17:0;;;;;-1:-1:-1;;;;;34544:5:0;34530:10;:19;34522:47;;;;-1:-1:-1;;;34522:47:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;34855:15:0::1;34873:5;34855:15:::0;;;:7:::1;:15;::::0;;;;:23;;-1:-1:-1;;34855:23:0::1;::::0;;34794:90::o;44188:360::-;44261:12;;44244:15;:29;;44236:50;;;;-1:-1:-1;;;44236:50:0;;10225:2:1;44236:50:0;;;10207:21:1;10264:1;10244:18;;;10237:29;-1:-1:-1;;;10282:18:1;;;10275:39;10331:18;;44236:50:0;10023:332:1;44236:50:0;44312:8;44303;:17;44295:40;;;;-1:-1:-1;;;44295:40:0;;13022:2:1;44295:40:0;;;13004:21:1;13061:2;13041:18;;;13034:30;-1:-1:-1;;;13080:18:1;;;13073:41;13131:18;;44295:40:0;12820:335:1;44295:40:0;44350:19;;;;:9;:19;;;;;;-1:-1:-1;;;;;44350:19:0;44373:10;44350:33;44342:54;;;;-1:-1:-1;;;44342:54:0;;13699:2:1;44342:54:0;;;13681:21:1;13738:1;13718:18;;;13711:29;-1:-1:-1;;;13756:18:1;;;13749:39;13805:18;;44342:54:0;13497:332:1;44342:54:0;44403:21;44415:8;44403:11;:21::i;:::-;44433:13;44449:6;:4;:6::i;:::-;44433:22;;44462:30;44474:10;44486:5;44462:11;:30::i;:::-;44499:43;44518:5;44525:16;44535:5;44525:9;:16::i;:::-;44499:18;:43::i;:::-;44229:319;44188:360;:::o;13657:209::-;13814:46;13832:5;13839:3;13844:8;13854:5;;13814:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13814:17:0;;-1:-1:-1;;;13814:46:0:i;:::-;13657:209;;;;;:::o;43073:676::-;43136:1;43131:3;:6;;;;:16;;;;43146:1;43141:3;:6;;;;43131:16;43123:36;;;;-1:-1:-1;;;43123:36:0;;12353:2:1;43123:36:0;;;12335:21:1;12392:1;12372:18;;;12365:29;-1:-1:-1;;;12410:18:1;;;12403:37;12457:18;;43123:36:0;12151:330:1;43123:36:0;43184:3;43168:19;;:12;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;43206:12:0;;41383:4;-1:-1:-1;43206:23:0;43198:46;;;;-1:-1:-1;;;43198:46:0;;10918:2:1;43198:46:0;;;10900:21:1;10957:2;10937:18;;;10930:30;-1:-1:-1;;;10976:18:1;;;10969:41;11027:18;;43198:46:0;10716:335:1;43198:46:0;43294:12;;43274:10;43261:24;;;;:12;:24;;;;;;:30;;43288:3;;43261:24;;:30;:::i;:::-;:45;;;;43253:67;;;;-1:-1:-1;;;43253:67:0;;9886:2:1;43253:67:0;;;9868:21:1;9925:2;9905:18;;;9898:30;-1:-1:-1;;;9944:18:1;;;9937:40;9994:18;;43253:67:0;9684:334:1;43253:67:0;43345:5;;43331:11;;43345:14;;;;;:9;:14::i;:::-;43331:28;;43387:3;43376:9;:14;;43368:36;;;;-1:-1:-1;;;43368:36:0;;14036:2:1;43368:36:0;;;14018:21:1;14075:2;14055:18;;;14048:30;-1:-1:-1;;;14094:18:1;;;14087:40;14144:18;;43368:36:0;13834:334:1;43368:36:0;43428:7;;:34;;43414:9;;-1:-1:-1;;;;;43428:7:0;;43448:9;;43414;43428:34;43414:9;43428:34;43448:9;43428:7;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43413:49;;;43479:4;43471:37;;;;-1:-1:-1;;;43471:37:0;;11258:2:1;43471:37:0;;;11240:21:1;11297:2;11277:18;;;11270:30;-1:-1:-1;;;11316:18:1;;;11309:50;11376:18;;43471:37:0;11056:344:1;43471:37:0;43565:10;43552:24;;;;:12;:24;;;;;;:30;;43579:3;;43552:24;;:30;:::i;:::-;43538:10;43525:24;;;;:12;:24;;;;;:57;;-1:-1:-1;;43525:57:0;;;;;;;;;;;;;43593:145;43608:3;43606:5;;:1;:5;;;43593:145;;;43627:8;:10;;;:8;:10;;;:::i;:::-;;;;;;43648:33;43660:10;43672:8;;43648:11;:33::i;:::-;43692:36;43711:8;;43721:6;43692:36;;;;;:::i;:::-;43612:3;;;;:::i;:::-;;;;43593:145;;;;43114:635;;43073:676;:::o;42907:85::-;34544:5;;34551:17;;;;;;;;;;;;-1:-1:-1;;;34551:17:0;;;;;-1:-1:-1;;;;;34544:5:0;34530:10;:19;34522:47;;;;-1:-1:-1;;;34522:47:0;;;;;;;;:::i;:::-;-1:-1:-1;42972:14:0::1;:7;42982:4:::0;;42972:14:::1;:::i;25484:183::-:0;12620:1;12589:19;;;:9;:19;;;;;;;;;;12624:13;;;;;;;;;;;-1:-1:-1;;;12624:13:0;;;;;;;25610;;25586:8;;-1:-1:-1;;;;;12589:19:0;12581:57;;;;-1:-1:-1;;;12581:57:0;;;;;;;;:::i;:::-;;25642:19:::1;25652:8;25642:9;:19::i;:::-;25635:26:::0;25484:183;-1:-1:-1;;;25484:183:0:o;42361:158::-;34544:5;;34551:17;;;;;;;;;;;;-1:-1:-1;;;34551:17:0;;;;;-1:-1:-1;;;;;34544:5:0;34530:10;:19;34522:47;;;;-1:-1:-1;;;34522:47:0;;;;;;;;:::i;:::-;;42443:9:::1;42439:75;42455:4;:11;42453:1;:13;42439:75;;;42502:4;42482:8;:17;42491:4;42496:1;42491:7;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;42482:17:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;42482:17:0;:24;;-1:-1:-1;;42482:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42467:3;::::1;::::0;::::1;:::i;:::-;;;;42439:75;;45693:331:::0;45843:22;;45889:30;;-1:-1:-1;;;45889:30:0;;-1:-1:-1;;;;;8731:32:1;;;45889:30:0;;;8713:51:1;45782:4:0;;45843:22;;;45881:51;;;;45843:22;;45889:23;;8686:18:1;;45889:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45881:51:0;;45877:91;;;45954:4;45947:11;;;;;45877:91;-1:-1:-1;;;;;;;45985:23:0;;;;;;;:16;:23;;;;;;;;:33;;;;;;;;;;;;;;;45693:331::o;34888:238::-;34544:5;;34551:17;;;;;;;;;;;;-1:-1:-1;;;34551:17:0;;;;;-1:-1:-1;;;;;34544:5:0;34530:10;:19;34522:47;;;;-1:-1:-1;;;34522:47:0;;;;;;;;:::i;:::-;-1:-1:-1;35014:31:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;35014:31:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;34989:23:0;::::1;34981:65;;;;-1:-1:-1::0;;;34981:65:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;35079:5:0::1;::::0;35058:38:::1;::::0;-1:-1:-1;;;;;35058:38:0;;::::1;::::0;35079:5:::1;::::0;35058:38:::1;::::0;35079:5:::1;::::0;35058:38:::1;35103:5;:17:::0;;-1:-1:-1;;;;;;35103:17:0::1;-1:-1:-1::0;;;;;35103:17:0;;;::::1;::::0;;;::::1;::::0;;34888:238::o;46032:140::-;46133:29;46149:3;46153:8;46133:15;:29::i;22285:590::-;12153:18;12174:19;;;:9;:19;;;;;;22433:8;;-1:-1:-1;;;;;12174:19:0;12230:10;12216:24;;;:71;;-1:-1:-1;12251:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;12251:22:0;12277:10;12251:36;12216:71;:122;;;-1:-1:-1;;;;;;12298:28:0;;;;;;:16;:28;;;;;;;;12327:10;12298:40;;;;;;;;;;12216:122;12347:30;;;;;;;;;;;;;-1:-1:-1;;;12347:30:0;;;12200:184;;;;;-1:-1:-1;;;12200:184:0;;;;;;;;:::i;:::-;-1:-1:-1;12620:1:0::1;12589:19:::0;;;:9:::1;:19;::::0;;;;;;;;;12624:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;12624:13:0;;::::1;::::0;;;;22461:8;;12624:13;-1:-1:-1;;;;;12589:19:0::1;12581:57;;;;-1:-1:-1::0;;;12581:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;22481:18:0::2;22502:19:::0;;;:9:::2;:19;::::0;;;;;;;;;22557:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;22557:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;22502:19:0;;::::2;::::0;22557:9;22536:19;::::2;::::0;::::2;22528:39;;;;-1:-1:-1::0;;;22528:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;22601:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;22601:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;22582:17:0;::::2;22574:40;;;;-1:-1:-1::0;;;22574:40:0::2;;;;;;;;:::i;:::-;;22623:24;22633:3;22638:8;22623:9;:24::i;:::-;22660:16;:3;-1:-1:-1::0;;;;;22660:14:0::2;;:16::i;:::-;22656:214;;;22708:77;::::0;-1:-1:-1;;;22708:77:0;;22692:13:::2;::::0;-1:-1:-1;;;;;22708:41:0;::::2;::::0;::::2;::::0;:77:::2;::::0;22750:10:::2;::::0;22762:5;;22769:8;;22779:5;;22708:77:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22838:23;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;22838:23:0::2;::::0;::::2;::::0;22692:93;;-1:-1:-1;;;;;;;22802:34:0;::::2;-1:-1:-1::0;;;22802:34:0::2;22794:68;;;;-1:-1:-1::0;;;22794:68:0::2;;;;;;;;:::i;:::-;;22683:187;22656:214;22474:401;12391:1:::1;12146:252:::0;22285:590;;;;;:::o;26457:154::-;26551:21;26563:8;26551:11;:21::i;:::-;26588:17;;;;:7;:17;;;;;26581:24;;;:::i;48857:208::-;-1:-1:-1;;;;;33959:18:0;;48990:7;33959:18;;;:10;:18;;;;;:25;49016:43;33815:175;30935:218;31047:26;31059:3;31064:8;31047:11;:26::i;:::-;31080:6;:21;;;;;;;;-1:-1:-1;31080:21:0;;;;;;;;;;31130:13;;:17;;31080:21;31130:17;:::i;:::-;31108:19;;;;:9;:19;;;;;;:39;-1:-1:-1;30935:218:0:o;27006:157::-;12620:1;12589:19;;;:9;:19;;;;;;;;;;12624:13;;;;;;;;;;;-1:-1:-1;;;12624:13:0;;;;;;;27113:8;;12624:13;-1:-1:-1;;;;;12589:19:0;12581:57;;;;-1:-1:-1;;;12581:57:0;;;;;;;;:::i;:::-;-1:-1:-1;27133:17:0::1;::::0;;;:7:::1;:17;::::0;;;;;;;:24;;::::1;::::0;;::::1;::::0;::::1;:::i;45122:445::-:0;45155:7;45197:1;45181:13;;:17;45173:45;;;;-1:-1:-1;;;45173:45:0;;11607:2:1;45173:45:0;;;11589:21:1;11646:2;11626:18;;;11619:30;-1:-1:-1;;;11665:18:1;;;11658:45;11720:18;;45173:45:0;11405:339:1;45173:45:0;45244:9;45256:24;45266:13;;45256:9;:24::i;:::-;45244:36;;45331:15;45349:9;45356:1;45349:6;:9::i;:::-;45331:27;;45442:25;45465:1;45449:13;;:17;;;;:::i;:::-;45442:6;:25::i;:::-;45426:10;:13;45437:1;45426:13;;;;;;;;;;;:41;;;;45508:1;45476:10;:29;45503:1;45487:13;;:17;;;;:::i;:::-;45476:29;;;;;;;;;;;:33;;;;45535:1;45518:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;45554:7:0;;45122:445;-1:-1:-1;;;45122:445:0:o;49580:456::-;49659:17;49692:7;49688:40;;-1:-1:-1;;49710:10:0;;;;;;;;;;;;-1:-1:-1;;;49710:10:0;;;;;49580:456::o;49688:40::-;49746:2;49734:9;49776:56;49783:6;;49776:56;;49800:8;;;;:::i;:::-;;-1:-1:-1;49817:7:0;;-1:-1:-1;49822:2:0;49817:7;;:::i;:::-;;;49776:56;;;49838:17;49868:6;49858:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49858:17:0;-1:-1:-1;49911:2:0;;-1:-1:-1;49838:37:0;-1:-1:-1;49894:6:0;49920:86;49927:6;;49920:86;;49974:6;49978:2;49974:1;:6;:::i;:::-;49969:11;;:2;:11;:::i;:::-;49956:26;;49944:4;49949:3;;;:::i;:::-;;;;49944:9;;;;;;;;:::i;:::-;;;;:38;-1:-1:-1;;;;;49944:38:0;;;;;;;;-1:-1:-1;49991:7:0;49996:2;49991:7;;:::i;:::-;;;49920:86;;;-1:-1:-1;50025:4:0;49580:456;-1:-1:-1;;;;49580:456:0:o;37838:471::-;37896:7;38141:6;38137:47;;-1:-1:-1;38171:1:0;38164:8;;38137:47;38196:9;38208:5;38212:1;38208;:5;:::i;:::-;38196:17;-1:-1:-1;38241:1:0;38232:5;38236:1;38196:17;38232:5;:::i;:::-;:10;38224:56;;;;-1:-1:-1;;;38224:56:0;;11951:2:1;38224:56:0;;;11933:21:1;11990:2;11970:18;;;11963:30;12029:34;12009:18;;;12002:62;-1:-1:-1;;;12080:18:1;;;12073:31;12121:19;;38224:56:0;11749:397:1;49218:230:0;49317:13;49373:1;49355:7;49349:21;;;;;:::i;:::-;;;:25;:93;;;;;;;;;;;;;;;;;49401:7;49410:25;49426:8;49410:15;:25::i;:::-;49384:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49342:100;49218:230;-1:-1:-1;;49218:230:0:o;18869:288::-;18971:12;18986:19;;;:9;:19;;;;;;;;;23090:12;:22;;;;;;23083:29;;-1:-1:-1;;;;;;23083:29:0;;;-1:-1:-1;;;;;18986:19:0;19045:30;19060:4;19066:8;19045:14;:30::i;:::-;19082:26;19094:3;19099:8;19082:11;:26::i;:::-;19142:8;19137:3;-1:-1:-1;;;;;19122:29:0;19131:4;-1:-1:-1;;;;;19122:29:0;;;;;;;;;;;18964:193;18869:288;;:::o;9261:780::-;9344:17;9926:18;;9830:66;9992:15;;;;;:42;;;10023:11;10011:8;:23;;9992:42;9976:59;9261:780;-1:-1:-1;;;;9261:780:0:o;31556:495::-;31650:21;31662:8;31650:11;:21::i;:::-;31680:18;31701:19;;;:9;:19;;;;;;31752:6;:13;31701:19;;31680:18;31752:17;;31768:1;;31752:17;:::i;:::-;31727:42;;31776:17;31796:6;31803:14;31796:22;;;;;;;;:::i;:::-;;;;;;;;;31776:42;;31848:9;31827:6;31834:10;31827:18;;;;;;;;:::i;:::-;;;;;;;;;;:30;31866:6;:12;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;31866:12:0;;;;;;;;;;;;31982:20;;;:9;:20;;;;;;;:33;;;;32022:19;;;-1:-1:-1;32022:19:0;;:23;31556:495::o;19548:297::-;19673:12;;;;;;;;;;;;-1:-1:-1;;;19673:12:0;;;;-1:-1:-1;;;;;19654:17:0;;19646:40;;;;-1:-1:-1;;;19646:40:0;;;;;;;;:::i;:::-;-1:-1:-1;19732:1:0;19701:19;;;:9;:19;;;;;;;;;;19736:18;;;;;;;;;;;-1:-1:-1;;;19736:18:0;;;;;;;-1:-1:-1;;;;;19701:19:0;:33;19693:62;;;;-1:-1:-1;;;19693:62:0;;;;;;;;:::i;:::-;;19764:26;19776:3;19781:8;19764:11;:26::i;:::-;19804:35;;19830:8;;-1:-1:-1;;;;;19804:35:0;;;19821:1;;19804:35;;19821:1;;19804:35;19548:297;;:::o;44554:381::-;44605:7;44927:1;44681:225;44893:12;44681:189;44853:15;44835:10;44818:28;;;;;;;6906:2:1;6902:15;;;;-1:-1:-1;;6898:53:1;6886:66;;6977:2;6968:12;;6757:229;44818:28:0;;;;;;;;;;;;;44808:39;;;;;;44800:48;;44799:70;;;;:::i;:::-;44681:95;44761:14;44681:95;44682:15;44721:16;44681:21;:57::i;:::-;:61;;:95::i;:225::-;44646:275;;;;;;8509:19:1;;8553:2;8544:12;;8380:182;44646:275:0;;;;;;;;;;;;;44636:286;;;;;;44628:295;;:301;;;;:::i;44943:173::-;44992:7;45014:13;;;:10;:13;;;;;;:15;45010:101;;-1:-1:-1;45051:13:0;;;;:10;:13;;;;;;;44943:173::o;45010:101::-;-1:-1:-1;45100:1:0;44943:173::o;45010:101::-;44943:173;;;:::o;25901:153::-;26031:17;;;;:7;:17;;;;;26024:24;;25999:13;;26031:17;26024:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25901:153;;;:::o;47914:193::-;48052:49;48085:5;48092:8;48052:32;:49::i;48378:183::-;48511:44;48541:3;48546:8;48511:29;:44::i;20248:282::-;12620:1;12589:19;;;:9;:19;;;;;;;;;;12624:13;;;;;;;;;;;-1:-1:-1;;;12624:13:0;;;;;;;20336:8;;12624:13;-1:-1:-1;;;;;12589:19:0;12581:57;;;;-1:-1:-1;;;12581:57:0;;;;;;;;:::i;:::-;-1:-1:-1;20356:18:0::1;20377:19:::0;;;:9:::1;:19;::::0;;;;;;;;23090:12;:22;;;;;;23083:29;;-1:-1:-1;;;;;;23083:29:0;;;-1:-1:-1;;;;;20377:19:0::1;20434:36;20449:10;20461:8;20434:14;:36::i;:::-;20482:42;::::0;20515:8;;20511:1:::1;::::0;-1:-1:-1;;;;;20482:42:0;::::1;::::0;::::1;::::0;20511:1;;20482:42:::1;20349:181;20248:282:::0;;:::o;36468:181::-;36526:7;;36558:5;36562:1;36558;:5;:::i;:::-;36546:17;;36587:1;36582;:6;;36574:46;;;;-1:-1:-1;;;36574:46:0;;10562:2:1;36574:46:0;;;10544:21:1;10601:2;10581:18;;;10574:30;10640:29;10620:18;;;10613:57;10687:18;;36574:46:0;10360:351:1;32330:602:0;32461:19;;;;:9;:19;;;;;;;;;;32491:9;;;;;;;;;;;-1:-1:-1;;;32491:9:0;;;;;;;-1:-1:-1;;;;;32461:28:0;;;:19;;:28;32453:48;;;;-1:-1:-1;;;32453:48:0;;;;;;;;:::i;:::-;-1:-1:-1;32515:19:0;;;;:9;:19;;;;;;;;32508:26;;-1:-1:-1;;;;;;32508:26:0;;;32572:14;:24;;;;;;-1:-1:-1;;;;;32628:17:0;;;;:10;:17;;;;;:24;32572;;32515:19;32628:28;;;:::i;:::-;32603:53;;32687:18;32669:14;:36;32665:230;;-1:-1:-1;;;;;32741:17:0;;32721;32741;;;:10;:17;;;;;:33;;32759:14;;32741:33;;;;;;:::i;:::-;;;;;;;;;32721:53;;32823:9;32783:10;:17;32794:5;-1:-1:-1;;;;;32783:17:0;-1:-1:-1;;;;;32783:17:0;;;;;;;;;;;;32801:18;32783:37;;;;;;;;:::i;:::-;;;;;;;;;;;;:49;;;;32841:25;;;:14;:25;;;;;:46;;;32665:230;-1:-1:-1;;;;;32903:17:0;;;;;;:10;:17;;;;;:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;32446:486;;32330:602;;:::o;33203:317::-;33360:1;33329:19;;;:9;:19;;;;;;;;;;33364:18;;;;;;;;;;;-1:-1:-1;;;33364:18:0;;;;;;;-1:-1:-1;;;;;33329:19:0;:33;33321:62;;;;-1:-1:-1;;;33321:62:0;;;;;;;;:::i;:::-;-1:-1:-1;33390:19:0;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;;33390:25:0;-1:-1:-1;;;;;33390:25:0;;;;;;;;33424:15;;;:10;:15;;;;;:30;;;;;;;;;;;;;;;;;;;33488:15;;;:22;;:26;;33390:9;33488:26;:::i;:::-;33461:24;;;;:14;:24;;;;;;:53;-1:-1:-1;33203:317:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:134:1;82:20;;111:31;82:20;111:31;:::i;153:160::-;218:20;;274:13;;267:21;257:32;;247:60;;303:1;300;293:12;318:347;369:8;379:6;433:3;426:4;418:6;414:17;410:27;400:55;;451:1;448;441:12;400:55;-1:-1:-1;474:20:1;;517:18;506:30;;503:50;;;549:1;546;539:12;503:50;586:4;578:6;574:17;562:29;;638:3;631:4;622:6;614;610:19;606:30;603:39;600:59;;;655:1;652;645:12;600:59;318:347;;;;;:::o;670:247::-;729:6;782:2;770:9;761:7;757:23;753:32;750:52;;;798:1;795;788:12;750:52;837:9;824:23;856:31;881:5;856:31;:::i;1182:388::-;1250:6;1258;1311:2;1299:9;1290:7;1286:23;1282:32;1279:52;;;1327:1;1324;1317:12;1279:52;1366:9;1353:23;1385:31;1410:5;1385:31;:::i;:::-;1435:5;-1:-1:-1;1492:2:1;1477:18;;1464:32;1505:33;1464:32;1505:33;:::i;:::-;1557:7;1547:17;;;1182:388;;;;;:::o;1575:456::-;1652:6;1660;1668;1721:2;1709:9;1700:7;1696:23;1692:32;1689:52;;;1737:1;1734;1727:12;1689:52;1776:9;1763:23;1795:31;1820:5;1795:31;:::i;:::-;1845:5;-1:-1:-1;1902:2:1;1887:18;;1874:32;1915:33;1874:32;1915:33;:::i;:::-;1575:456;;1967:7;;-1:-1:-1;;;2021:2:1;2006:18;;;;1993:32;;1575:456::o;2036:754::-;2133:6;2141;2149;2157;2165;2218:3;2206:9;2197:7;2193:23;2189:33;2186:53;;;2235:1;2232;2225:12;2186:53;2274:9;2261:23;2293:31;2318:5;2293:31;:::i;:::-;2343:5;-1:-1:-1;2400:2:1;2385:18;;2372:32;2413:33;2372:32;2413:33;:::i;:::-;2465:7;-1:-1:-1;2519:2:1;2504:18;;2491:32;;-1:-1:-1;2574:2:1;2559:18;;2546:32;2601:18;2590:30;;2587:50;;;2633:1;2630;2623:12;2587:50;2672:58;2722:7;2713:6;2702:9;2698:22;2672:58;:::i;:::-;2036:754;;;;-1:-1:-1;2036:754:1;;-1:-1:-1;2749:8:1;;2646:84;2036:754;-1:-1:-1;;;2036:754:1:o;2795:315::-;2860:6;2868;2921:2;2909:9;2900:7;2896:23;2892:32;2889:52;;;2937:1;2934;2927:12;2889:52;2976:9;2963:23;2995:31;3020:5;2995:31;:::i;:::-;3045:5;-1:-1:-1;3069:35:1;3100:2;3085:18;;3069:35;:::i;:::-;3059:45;;2795:315;;;;;:::o;3115:::-;3183:6;3191;3244:2;3232:9;3223:7;3219:23;3215:32;3212:52;;;3260:1;3257;3250:12;3212:52;3299:9;3286:23;3318:31;3343:5;3318:31;:::i;:::-;3368:5;3420:2;3405:18;;;;3392:32;;-1:-1:-1;;;3115:315:1:o;3435:1202::-;3525:6;3533;3586:2;3574:9;3565:7;3561:23;3557:32;3554:52;;;3602:1;3599;3592:12;3554:52;3642:9;3629:23;3671:18;3712:2;3704:6;3701:14;3698:34;;;3728:1;3725;3718:12;3698:34;3766:6;3755:9;3751:22;3741:32;;3811:7;3804:4;3800:2;3796:13;3792:27;3782:55;;3833:1;3830;3823:12;3782:55;3869:2;3856:16;3891:4;3914:2;3910;3907:10;3904:36;;;3920:18;;:::i;:::-;3966:2;3963:1;3959:10;3998:2;3992:9;4061:2;4057:7;4052:2;4048;4044:11;4040:25;4032:6;4028:38;4116:6;4104:10;4101:22;4096:2;4084:10;4081:18;4078:46;4075:72;;;4127:18;;:::i;:::-;4163:2;4156:22;4213:18;;;4247:15;;;;-1:-1:-1;4282:11:1;;;4312;;;4308:20;;4305:33;-1:-1:-1;4302:53:1;;;4351:1;4348;4341:12;4302:53;4373:1;4364:10;;4383:169;4397:2;4394:1;4391:9;4383:169;;;4454:23;4473:3;4454:23;:::i;:::-;4442:36;;4415:1;4408:9;;;;;4498:12;;;;4530;;4383:169;;;-1:-1:-1;4571:6:1;-1:-1:-1;4596:35:1;;-1:-1:-1;4612:18:1;;;4596:35;:::i;:::-;4586:45;;;;;;3435:1202;;;;;:::o;4642:245::-;4700:6;4753:2;4741:9;4732:7;4728:23;4724:32;4721:52;;;4769:1;4766;4759:12;4721:52;4808:9;4795:23;4827:30;4851:5;4827:30;:::i;4892:249::-;4961:6;5014:2;5002:9;4993:7;4989:23;4985:32;4982:52;;;5030:1;5027;5020:12;4982:52;5062:9;5056:16;5081:30;5105:5;5081:30;:::i;5146:280::-;5245:6;5298:2;5286:9;5277:7;5273:23;5269:32;5266:52;;;5314:1;5311;5304:12;5266:52;5346:9;5340:16;5365:31;5390:5;5365:31;:::i;5431:410::-;5502:6;5510;5563:2;5551:9;5542:7;5538:23;5534:32;5531:52;;;5579:1;5576;5569:12;5531:52;5619:9;5606:23;5652:18;5644:6;5641:30;5638:50;;;5684:1;5681;5674:12;5638:50;5723:58;5773:7;5764:6;5753:9;5749:22;5723:58;:::i;:::-;5800:8;;5697:84;;-1:-1:-1;5431:410:1;-1:-1:-1;;;;5431:410:1:o;5846:180::-;5905:6;5958:2;5946:9;5937:7;5933:23;5929:32;5926:52;;;5974:1;5971;5964:12;5926:52;-1:-1:-1;5997:23:1;;5846:180;-1:-1:-1;5846:180:1:o;6031:269::-;6088:6;6141:2;6129:9;6120:7;6116:23;6112:32;6109:52;;;6157:1;6154;6147:12;6109:52;6196:9;6183:23;6246:4;6239:5;6235:16;6228:5;6225:27;6215:55;;6266:1;6263;6256:12;6305:257;6346:3;6384:5;6378:12;6411:6;6406:3;6399:19;6427:63;6483:6;6476:4;6471:3;6467:14;6460:4;6453:5;6449:16;6427:63;:::i;:::-;6544:2;6523:15;-1:-1:-1;;6519:29:1;6510:39;;;;6551:4;6506:50;;6305:257;-1:-1:-1;;6305:257:1:o;6567:185::-;6609:3;6647:5;6641:12;6662:52;6707:6;6702:3;6695:4;6688:5;6684:16;6662:52;:::i;:::-;6730:16;;;;;6567:185;-1:-1:-1;;6567:185:1:o;6991:1174::-;7167:3;7196:1;7229:6;7223:13;7259:3;7281:1;7309:9;7305:2;7301:18;7291:28;;7369:2;7358:9;7354:18;7391;7381:61;;7435:4;7427:6;7423:17;7413:27;;7381:61;7461:2;7509;7501:6;7498:14;7478:18;7475:38;7472:165;;;-1:-1:-1;;;7536:33:1;;7592:4;7589:1;7582:15;7622:4;7543:3;7610:17;7472:165;7653:18;7680:104;;;;7798:1;7793:320;;;;7646:467;;7680:104;-1:-1:-1;;7713:24:1;;7701:37;;7758:16;;;;-1:-1:-1;7680:104:1;;7793:320;14617:1;14610:14;;;14654:4;14641:18;;7888:1;7902:165;7916:6;7913:1;7910:13;7902:165;;;7994:14;;7981:11;;;7974:35;8037:16;;;;7931:10;;7902:165;;;7906:3;;8096:6;8091:3;8087:16;8080:23;;7646:467;;;;;;;8129:30;8155:3;8147:6;8129:30;:::i;:::-;8122:37;6991:1174;-1:-1:-1;;;;;6991:1174:1:o;8775:488::-;-1:-1:-1;;;;;9044:15:1;;;9026:34;;9096:15;;9091:2;9076:18;;9069:43;9143:2;9128:18;;9121:34;;;9191:3;9186:2;9171:18;;9164:31;;;8969:4;;9212:45;;9237:19;;9229:6;9212:45;:::i;:::-;9204:53;8775:488;-1:-1:-1;;;;;;8775:488:1:o;9460:219::-;9609:2;9598:9;9591:21;9572:4;9629:44;9669:2;9658:9;9654:18;9646:6;9629:44;:::i;14670:128::-;14710:3;14741:1;14737:6;14734:1;14731:13;14728:39;;;14747:18;;:::i;:::-;-1:-1:-1;14783:9:1;;14670:128::o;14803:204::-;14841:3;14877:4;14874:1;14870:12;14909:4;14906:1;14902:12;14944:3;14938:4;14934:14;14929:3;14926:23;14923:49;;;14952:18;;:::i;:::-;14988:13;;14803:204;-1:-1:-1;;;14803:204:1:o;15012:120::-;15052:1;15078;15068:35;;15083:18;;:::i;:::-;-1:-1:-1;15117:9:1;;15012:120::o;15137:168::-;15177:7;15243:1;15239;15235:6;15231:14;15228:1;15225:21;15220:1;15213:9;15206:17;15202:45;15199:71;;;15250:18;;:::i;:::-;-1:-1:-1;15290:9:1;;15137:168::o;15310:125::-;15350:4;15378:1;15375;15372:8;15369:34;;;15383:18;;:::i;:::-;-1:-1:-1;15420:9:1;;15310:125::o;15440:258::-;15512:1;15522:113;15536:6;15533:1;15530:13;15522:113;;;15612:11;;;15606:18;15593:11;;;15586:39;15558:2;15551:10;15522:113;;;15653:6;15650:1;15647:13;15644:48;;;-1:-1:-1;;15688:1:1;15670:16;;15663:27;15440:258::o;15703:136::-;15742:3;15770:5;15760:39;;15779:18;;:::i;:::-;-1:-1:-1;;;15815:18:1;;15703:136::o;15844:380::-;15923:1;15919:12;;;;15966;;;15987:61;;16041:4;16033:6;16029:17;16019:27;;15987:61;16094:2;16086:6;16083:14;16063:18;16060:38;16057:161;;;16140:10;16135:3;16131:20;16128:1;16121:31;16175:4;16172:1;16165:15;16203:4;16200:1;16193:15;16229:135;16268:3;-1:-1:-1;;16289:17:1;;16286:43;;;16309:18;;:::i;:::-;-1:-1:-1;16356:1:1;16345:13;;16229:135::o;16369:175::-;16406:3;16450:4;16443:5;16439:16;16479:4;16470:7;16467:17;16464:43;;;16487:18;;:::i;:::-;16536:1;16523:15;;16369:175;-1:-1:-1;;16369:175:1:o;16549:112::-;16581:1;16607;16597:35;;16612:18;;:::i;:::-;-1:-1:-1;16646:9:1;;16549:112::o;16666:127::-;16727:10;16722:3;16718:20;16715:1;16708:31;16758:4;16755:1;16748:15;16782:4;16779:1;16772:15;16798:127;16859:10;16854:3;16850:20;16847:1;16840:31;16890:4;16887:1;16880:15;16914:4;16911:1;16904:15;16930:127;16991:10;16986:3;16982:20;16979:1;16972:31;17022:4;17019:1;17012:15;17046:4;17043:1;17036:15;17062:127;17123:10;17118:3;17114:20;17111:1;17104:31;17154:4;17151:1;17144:15;17178:4;17175:1;17168:15;17194:127;17255:10;17250:3;17246:20;17243:1;17236:31;17286:4;17283:1;17276:15;17310:4;17307:1;17300:15;17326:131;-1:-1:-1;;;;;17401:31:1;;17391:42;;17381:70;;17447:1;17444;17437:12;17462:131;-1:-1:-1;;;;;;17536:32:1;;17526:43;;17516:71;;17583:1;17580;17573:12

Swarm Source

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