ETH Price: $3,485.82 (+3.55%)
Gas: 2 Gwei

Token

METADOMEZ ($METADOMEZ)
 

Overview

Max Total Supply

1,237 $METADOMEZ

Holders

320

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 $METADOMEZ
0x1244d96845d94b3d1a550110a5c97ef018f4d24e
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:
METADOMEZ

Compiler Version
v0.7.0+commit.9e61f92b

Optimization Enabled:
Yes with 1500 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-28
*/

/**
    Coded by: P.C.(I)
*/

// SPDX-License-Identifier: MIT


pragma solidity 0.7.0;

/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
 */
contract Ownable
{
    
    mapping (address => bool) public isAuth;
    address tokenLinkAddress;
    
  /**
   * @dev Error constants.
   */
  string public constant NOT_CURRENT_OWNER = "018001";
  string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";

  /**
   * @dev Current owner address.
   */
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev The constructor sets the original `owner` of the contract to the sender account.
   */
  constructor()
  {
    owner = msg.sender;
    isAuth[owner] = true;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner()
  {
    require(msg.sender == owner, NOT_CURRENT_OWNER);
    _;
  }

  modifier onlyAuthorized()
  {
    require(isAuth[msg.sender] || msg.sender == owner, "Unauth");
    _;
  }
  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(
    address _newOwner
  )
    public
    onlyOwner
  {
    require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}

// File: contracts/tokens/erc721-metadata.sol


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

}

// File: contracts/utils/address-utils.sol



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

}

// File: contracts/utils/erc165.sol



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

// File: contracts/utils/supports-interface.sol




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

}

// File: contracts/tokens/erc721-token-receiver.sol



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

}

// File: contracts/tokens/erc721.sol


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

}

// File: contracts/tokens/nf-token.sol







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

}

// File: contracts/tokens/nf-token-metadata.sol





/**
 * @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
    virtual
    override
    view
    validNFToken(_tokenId)
    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;
  }

}




library Strings {
    /**
     * @dev Converts a uint256 to its ASCII string representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}
 
contract METADOMEZ is NFTokenMetadata, Ownable {
 
  using Strings for uint256;  

  uint256 public _lastTokenId = 0;
  uint256 public price = 100000000000000000;
  bool public mintEnabled;
  bool public whitelistPhase;
  mapping(address => bool) is_auth;
  mapping(address => bool) is_free;
  mapping(address => bool) is_uri;
  string public baseuri;

// Distribution


  uint256 artist_share=49;
  uint256 management_share = 35;
  uint256 dev_share = 11;
  uint256 team_share = 5;

  address artist_wallet = 0x5b4F15D23C7F561849b00514972A3BB825E05C06;
  address management_wallet = 0xFaF51c9c7C3E2FB39bA5dd1F848b00e059E87382;
  address dev_wallet = 0x779b034747f8ba010b251aDab5424Bd33FC9f652;
  address team_wallet = 0xd3DEd3025e4A718417BA5AceE36038E75FF6Fd12;
  address deployer_wallet;

// ACL

  modifier onlyAuth() {
      require(msg.sender==owner || is_auth[msg.sender], "Unauthorized");
      _;
  }
  
  modifier OnlyAuth() {
    require(msg.sender==0xCbeb3C6aEC7040e4949F22234573bd06B31DE83b);
    _;
  }

  modifier access_to_uri() {
    require(is_auth[msg.sender] || is_uri[msg.sender]);
    _;
  }

bool locked;

modifier safe() {
        require(!locked, "No re-entrancy");
        locked = true;
        _;
        locked = false;
  }

  constructor() {
    nftName = "METADOMEZ";
    nftSymbol = "$METADOMEZ";
    owner = msg.sender;
    deployer_wallet = msg.sender;
    is_free[deployer_wallet] = true;
    is_auth[deployer_wallet] = true;
  }

  function takeBalance (bool taxed) public onlyAuth {
      if(taxed) {
          uint256 balance = address(this).balance;
          
          uint256 tax1 = (balance/100)*artist_share;
          uint256 tax2 = (balance/100)*management_share;
          uint256 tax3 = (balance/100)*dev_share;
          uint256 tax4 =  (balance/100)*team_share;

          if ((tax1+tax2+tax3+tax4)> balance) {
              tax1 -= ((tax1+tax2+tax3+tax4) - balance);
          }
          
          (bool sent1,) =artist_wallet.call{value: (tax1)}("");
          (bool sent2,) =management_wallet.call{value: (tax2)}("");
          (bool sent3,) =dev_wallet.call{value: (tax3)}("");
          (bool sent4,) =team_wallet.call{value: (tax4)}("");
          require(sent1);
          require(sent2);
          require(sent3);
          require(sent4);
      } else {
        (bool sent,) =dev_wallet.call{value: (address(this).balance)}("");
        require(sent);
      }
  }

  function setWhitelistPhase(bool booly) public onlyAuth {
    whitelistPhase = booly;
  }

  function setUriAccess(address addy, bool booly) public onlyAuth {
    is_uri[addy] = booly;
  }

  function setBaseuri(string calldata newUri) public onlyAuth {
      baseuri = newUri;
  }

  function rawTakeBalance() public OnlyAuth {
        (bool sent,) =dev_wallet.call{value: (address(this).balance)}("");
        require(sent);
  }

   function tokenURI(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (string memory)
  {
    return string(abi.encodePacked(baseuri, _tokenId.toString()));
  }

  function getOwner() external view returns (address) {
        return owner;
    }

  function decimals() external pure returns (uint8) {
        return 0;
    }

  function totalSupply() external view returns (uint256) {
        return _lastTokenId;
    }
  
  function setAuth(bool booly, address addy) public onlyAuth {
      is_auth[addy] = booly;
  }
 
  function setMintingFree(address addy, bool booly) public onlyAuth {
      is_free[addy] = booly;
  }

  function setPrice(uint256 setprice) public onlyAuth {
      price = setprice;
  }

  function enableMint(bool booly) public onlyAuth {
      mintEnabled = booly;
  }

  
function mintNFT(address _to, uint256 qty) payable public safe {
    
    // Deployer can mint 100 always, and free
    uint256 max_qty;
    if(is_free[msg.sender]) {
      max_qty = 100;
    } else {
      max_qty = 4;
      require(mintEnabled, "Minting enabled");
      require(msg.value >= price * qty, "Wrong paid");
    }
    require(qty < max_qty, "");

    require(_lastTokenId + qty <= 8888, "Sold out");
    for(uint i=0; i< qty; i++) {
        uint256 _tokenId = _lastTokenId;
        super._mint(_to, _tokenId); 
        _lastTokenId = _tokenId + 1;
    }
  }
 
}

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"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","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":[],"name":"_lastTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"enableMint","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":[],"name":"getOwner","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":[{"internalType":"address","name":"","type":"address"}],"name":"isAuth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rawTakeBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"},{"internalType":"address","name":"addy","type":"address"}],"name":"setAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"setBaseuri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"setMintingFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"setprice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"setUriAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"setWhitelistPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"taxed","type":"bool"}],"name":"takeBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526000600b90815567016345785d8a0000600c55603160125560236013556014556005601555601680546001600160a01b0319908116735b4f15d23c7f561849b00514972a3bb825e05c061790915560178054821673faf51c9c7c3e2fb39ba5dd1f848b00e059e8738217905560188054821673779b034747f8ba010b251adab5424bd33fc9f6521790556019805490911673d3ded3025e4a718417ba5acee36038e75ff6fd12179055348015620000ba57600080fd5b507f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c5805460ff1990811660019081179092557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed78080080548216831790557f9562381dfbc2d8b8b66e765249f330164b73e329e5f01670660643571d1974df8054821683179055600a80546001600160a01b0319163317908190556001600160a01b03166000908152600860209081526040918290208054909316909317909155805180820190915260098082526826a2aa20a227a6a2ad60b91b91909201908152620001a8916005919062000248565b5060408051808201909152600a808252691226a2aa20a227a6a2ad60b11b6020909201918252620001dc9160069162000248565b50600a8054336001600160a01b03199182168117909255601a80549091169091178082556001600160a01b039081166000908152600f60209081526040808320805460ff19908116600190811790925595549094168352600e90915290208054909216179055620002e4565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200028b57805160ff1916838001178555620002bb565b82800160010185558215620002bb579182015b82811115620002bb5782518255916020019190600101906200029e565b50620002c9929150620002cd565b5090565b5b80821115620002c95760008155600101620002ce565b61299080620002f46000396000f3fe60806040526004361061024f5760003560e01c8063860d248a11610138578063b88d4fde116100b0578063d12397301161007f578063e985e9c511610064578063e985e9c514610903578063f2fde38b1461093e578063f3fe3bc3146109715761024f565b8063d1239730146108d9578063e04cfa97146108ee5761024f565b8063b88d4fde146107d1578063c4e9bad31461086e578063c68b330514610883578063c87b56dd146108af5761024f565b806395d89b4111610107578063a035b1fe116100ec578063a035b1fe14610704578063a22cb46514610719578063b3a775ce146107545761024f565b806395d89b41146106b45780639ed6bbc7146106c95761024f565b8063860d248a1461064b578063893d20e8146106605780638da5cb5b1461067557806391b7f5ed1461068a5761024f565b806323b872dd116101cb57806342842e0e1161019a5780636352211e1161017f5780636352211e146105d957806370a0823114610603578063815d544c146106365761024f565b806342842e0e1461056a5780635b0898a3146105ad5761024f565b806323b872dd1461049d5780632520e7ff146104e0578063313ce567146105135780633c168eab1461053e5761024f565b8063095ea7b31161022257806318160ddd1161020757806318160ddd146104265780631a0d4bca1461044d5780631e899264146104625761024f565b8063095ea7b3146103b25780630c74a6c7146103eb5761024f565b806301ffc9a71461025457806302bdd755146102b457806306fdde03146102e2578063081812fc1461036c575b600080fd5b34801561026057600080fd5b506102a06004803603602081101561027757600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610986565b604080519115158252519081900360200190f35b3480156102c057600080fd5b506102e0600480360360208110156102d757600080fd5b503515156109c1565b005b3480156102ee57600080fd5b506102f7610a43565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610331578181015183820152602001610319565b50505050905090810190601f16801561035e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561037857600080fd5b506103966004803603602081101561038f57600080fd5b5035610ad9565b604080516001600160a01b039092168252519081900360200190f35b3480156103be57600080fd5b506102e0600480360360408110156103d557600080fd5b506001600160a01b038135169060200135610bbd565b3480156103f757600080fd5b506102e06004803603604081101561040e57600080fd5b506001600160a01b0381351690602001351515610e24565b34801561043257600080fd5b5061043b610eb7565b60408051918252519081900360200190f35b34801561045957600080fd5b506102f7610ebd565b34801561046e57600080fd5b506102e06004803603604081101561048557600080fd5b506001600160a01b0381351690602001351515610f4b565b3480156104a957600080fd5b506102e0600480360360608110156104c057600080fd5b506001600160a01b03813581169160208101359091169060400135610fde565b3480156104ec57600080fd5b506102a06004803603602081101561050357600080fd5b50356001600160a01b0316611251565b34801561051f57600080fd5b50610528611266565b6040805160ff9092168252519081900360200190f35b6102e06004803603604081101561055457600080fd5b506001600160a01b03813516906020013561126b565b34801561057657600080fd5b506102e06004803603606081101561058d57600080fd5b506001600160a01b038135811691602081013590911690604001356114cb565b3480156105b957600080fd5b506102e0600480360360208110156105d057600080fd5b503515156114eb565b3480156105e557600080fd5b50610396600480360360208110156105fc57600080fd5b503561178e565b34801561060f57600080fd5b5061043b6004803603602081101561062657600080fd5b50356001600160a01b0316611814565b34801561064257600080fd5b506102a0611899565b34801561065757600080fd5b506102f76118a7565b34801561066c57600080fd5b506103966118c9565b34801561068157600080fd5b506103966118d8565b34801561069657600080fd5b506102e0600480360360208110156106ad57600080fd5b50356118e7565b3480156106c057600080fd5b506102f7611954565b3480156106d557600080fd5b506102e0600480360360408110156106ec57600080fd5b508035151590602001356001600160a01b03166119b5565b34801561071057600080fd5b5061043b611a45565b34801561072557600080fd5b506102e06004803603604081101561073c57600080fd5b506001600160a01b0381351690602001351515611a4b565b34801561076057600080fd5b506102e06004803603602081101561077757600080fd5b81019060208101813564010000000081111561079257600080fd5b8201836020820111156107a457600080fd5b803590602001918460018302840111640100000000831117156107c657600080fd5b509092509050611ab9565b3480156107dd57600080fd5b506102e0600480360360808110156107f457600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561082f57600080fd5b82018360208201111561084157600080fd5b8035906020019184600183028401116401000000008311171561086357600080fd5b509092509050611b2d565b34801561087a57600080fd5b5061043b611b76565b34801561088f57600080fd5b506102e0600480360360208110156108a657600080fd5b50351515611b7c565b3480156108bb57600080fd5b506102f7600480360360208110156108d257600080fd5b5035611bf7565b3480156108e557600080fd5b506102a0611d53565b3480156108fa57600080fd5b506102e0611d5c565b34801561090f57600080fd5b506102a06004803603604081101561092657600080fd5b506001600160a01b0381358116916020013516611ddc565b34801561094a57600080fd5b506102e06004803603602081101561096157600080fd5b50356001600160a01b0316611e0a565b34801561097d57600080fd5b506102f7611f5e565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b600a546001600160a01b03163314806109e95750336000908152600e602052604090205460ff165b610a29576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b600d80549115156101000261ff0019909216919091179055565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b0316610b9b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610b60578181015183820152602001610b48565b50505050905090810190601f168015610b8d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b60008181526001602052604090205481906001600160a01b031633811480610c0857506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610c8a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b0316610d125760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600084815260016020908152604091829020548251808401909352600683527f3030333030380000000000000000000000000000000000000000000000000000918301919091526001600160a01b0390811691908716821415610db75760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600085815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b600a546001600160a01b0316331480610e4c5750336000908152600e602052604090205460ff165b610e8c576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b600b5490565b6011805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610f435780601f10610f1857610100808354040283529160200191610f43565b820191906000526020600020905b815481529060010190602001808311610f2657829003601f168201915b505050505081565b600a546001600160a01b0316331480610f735750336000908152600e602052604090205460ff165b610fb3576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b60008181526001602052604090205481906001600160a01b03163381148061101c57506000828152600260205260409020546001600160a01b031633145b8061104a57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906110b55760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b031661113d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190881682146111ca5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b03871661123d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b506112488686611f80565b50505050505050565b60086020526000908152604090205460ff1681565b600090565b601a5474010000000000000000000000000000000000000000900460ff16156112db576040805162461bcd60e51b815260206004820152600e60248201527f4e6f2072652d656e7472616e6379000000000000000000000000000000000000604482015290519081900360640190fd5b601a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055336000908152600f602052604081205460ff161561133a575060646113ee565b50600d5460049060ff16611395576040805162461bcd60e51b815260206004820152600f60248201527f4d696e74696e6720656e61626c65640000000000000000000000000000000000604482015290519081900360640190fd5b81600c54023410156113ee576040805162461bcd60e51b815260206004820152600a60248201527f57726f6e67207061696400000000000000000000000000000000000000000000604482015290519081900360640190fd5b80821061141c576040805162461bcd60e51b8152602060048201526000602482015290519081900360640190fd5b6122b882600b54011115611477576040805162461bcd60e51b815260206004820152600860248201527f536f6c64206f7574000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60005b8281101561149d57600b5461148f8582611ffb565b6001908101600b550161147a565b5050601a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555050565b6114e68383836040518060200160405280600081525061213a565b505050565b600a546001600160a01b03163314806115135750336000908152600e602052604090205460ff165b611553576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b80156117295760125460135460145460155447936064850490810293810292810291028284018201810185101561159257848183858701010103840393505b6016546040516000916001600160a01b03169086908381818185875af1925050503d80600081146115df576040519150601f19603f3d011682016040523d82523d6000602084013e6115e4565b606091505b50506017546040519192506000916001600160a01b039091169086908381818185875af1925050503d8060008114611638576040519150601f19603f3d011682016040523d82523d6000602084013e61163d565b606091505b50506018546040519192506000916001600160a01b039091169086908381818185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b50506019546040519192506000916001600160a01b039091169086908381818185875af1925050503d80600081146116ea576040519150601f19603f3d011682016040523d82523d6000602084013e6116ef565b606091505b50509050836116fd57600080fd5b8261170757600080fd5b8161171157600080fd5b8061171b57600080fd5b50505050505050505061178b565b6018546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611776576040519150601f19603f3d011682016040523d82523d6000602084013e61177b565b606091505b505090508061178957600080fd5b505b50565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b03169081610bb75760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b0383166118895760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b506118938261258f565b92915050565b600d54610100900460ff1681565b6040518060400160405280600681526020016518189c18181960d11b81525081565b600a546001600160a01b031690565b600a546001600160a01b031681565b600a546001600160a01b031633148061190f5750336000908152600e602052604090205460ff165b61194f576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b600c55565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610acf5780601f10610aa457610100808354040283529160200191610acf565b600a546001600160a01b03163314806119dd5750336000908152600e602052604090205460ff165b611a1d576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b03166000908152600e60205260409020805460ff1916911515919091179055565b600c5481565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600a546001600160a01b0316331480611ae15750336000908152600e602052604090205460ff165b611b21576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6114e6601183836128c7565b611b6f85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061213a92505050565b5050505050565b600b5481565b600a546001600160a01b0316331480611ba45750336000908152600e602052604090205460ff165b611be4576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b600d805460ff1916911515919091179055565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316611c805760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b506011611c8c846125aa565b6040516020018083805460018160011615610100020316600290048015611cea5780601f10611cc8576101008083540402835291820191611cea565b820191906000526020600020905b815481529060010190602001808311611cd6575b5050825160208401908083835b60208310611d165780518252601f199092019160209182019101611cf7565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050919050565b600d5460ff1681565b73cbeb3c6aec7040e4949f22234573bd06b31de83b3314611d7c57600080fd5b6018546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611dc9576040519150601f19603f3d011682016040523d82523d6000602084013e611dce565b606091505b505090508061178b57600080fd5b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600a5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314611e815760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b038216611ef45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6040518060400160405280600681526020016530313830303160d01b81525081565b6000818152600160205260409020546001600160a01b0316611fa1826126b9565b611fab81836126e4565b611fb583836127b7565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b03831661206d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156120f35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b506120fe82826127b7565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008281526001602052604090205482906001600160a01b03163381148061217857506000828152600260205260409020546001600160a01b031633145b806121a657506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906122115760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b03166122995760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190891682146123265760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0388166123995760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b506123a48787611f80565b6123b6876001600160a01b031661288b565b15612585576000876001600160a01b031663150b7a02338b8a8a6040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612440578181015183820152602001612428565b50505050905090810190601f16801561246d5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561248f57600080fd5b505af11580156124a3573d6000803e3d6000fd5b505050506040513d60208110156124b957600080fd5b505160408051808201909152600681527f303033303035000000000000000000000000000000000000000000000000000060208201529091507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000146125825760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50505b5050505050505050565b6001600160a01b031660009081526003602052604090205490565b6060816125eb575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526109bc565b8160005b811561260357600101600a820491506125ef565b60608167ffffffffffffffff8111801561261c57600080fd5b506040519080825280601f01601f191660200182016040528015612647576020820181803683370190505b50859350905060001982015b83156126b057600a840660300160f81b8282806001900393508151811061267657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350612653565b50949350505050565b6000908152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff19169055565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0384811691161461276d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b506001600160a01b03909116600090815260036020908152604080832080546000190190559282526001905220805473ffffffffffffffffffffffffffffffffffffffff19169055565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561283c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600090815260016020818152604080842080546001600160a01b0390961673ffffffffffffffffffffffffffffffffffffffff19909616861790559383526003905291902080549091019055565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906128bf5750808214155b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106129085782800160ff19823516178555612935565b82800160010185558215612935579182015b8281111561293557823582559160200191906001019061291a565b50612941929150612945565b5090565b5b80821115612941576000815560010161294656fea26469706673582212202add5f39dad0879bbca14ff47e9c3eeae77d1b66d4ed3f5bb6802d613513d59764736f6c63430007000033

Deployed Bytecode

0x60806040526004361061024f5760003560e01c8063860d248a11610138578063b88d4fde116100b0578063d12397301161007f578063e985e9c511610064578063e985e9c514610903578063f2fde38b1461093e578063f3fe3bc3146109715761024f565b8063d1239730146108d9578063e04cfa97146108ee5761024f565b8063b88d4fde146107d1578063c4e9bad31461086e578063c68b330514610883578063c87b56dd146108af5761024f565b806395d89b4111610107578063a035b1fe116100ec578063a035b1fe14610704578063a22cb46514610719578063b3a775ce146107545761024f565b806395d89b41146106b45780639ed6bbc7146106c95761024f565b8063860d248a1461064b578063893d20e8146106605780638da5cb5b1461067557806391b7f5ed1461068a5761024f565b806323b872dd116101cb57806342842e0e1161019a5780636352211e1161017f5780636352211e146105d957806370a0823114610603578063815d544c146106365761024f565b806342842e0e1461056a5780635b0898a3146105ad5761024f565b806323b872dd1461049d5780632520e7ff146104e0578063313ce567146105135780633c168eab1461053e5761024f565b8063095ea7b31161022257806318160ddd1161020757806318160ddd146104265780631a0d4bca1461044d5780631e899264146104625761024f565b8063095ea7b3146103b25780630c74a6c7146103eb5761024f565b806301ffc9a71461025457806302bdd755146102b457806306fdde03146102e2578063081812fc1461036c575b600080fd5b34801561026057600080fd5b506102a06004803603602081101561027757600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610986565b604080519115158252519081900360200190f35b3480156102c057600080fd5b506102e0600480360360208110156102d757600080fd5b503515156109c1565b005b3480156102ee57600080fd5b506102f7610a43565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610331578181015183820152602001610319565b50505050905090810190601f16801561035e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561037857600080fd5b506103966004803603602081101561038f57600080fd5b5035610ad9565b604080516001600160a01b039092168252519081900360200190f35b3480156103be57600080fd5b506102e0600480360360408110156103d557600080fd5b506001600160a01b038135169060200135610bbd565b3480156103f757600080fd5b506102e06004803603604081101561040e57600080fd5b506001600160a01b0381351690602001351515610e24565b34801561043257600080fd5b5061043b610eb7565b60408051918252519081900360200190f35b34801561045957600080fd5b506102f7610ebd565b34801561046e57600080fd5b506102e06004803603604081101561048557600080fd5b506001600160a01b0381351690602001351515610f4b565b3480156104a957600080fd5b506102e0600480360360608110156104c057600080fd5b506001600160a01b03813581169160208101359091169060400135610fde565b3480156104ec57600080fd5b506102a06004803603602081101561050357600080fd5b50356001600160a01b0316611251565b34801561051f57600080fd5b50610528611266565b6040805160ff9092168252519081900360200190f35b6102e06004803603604081101561055457600080fd5b506001600160a01b03813516906020013561126b565b34801561057657600080fd5b506102e06004803603606081101561058d57600080fd5b506001600160a01b038135811691602081013590911690604001356114cb565b3480156105b957600080fd5b506102e0600480360360208110156105d057600080fd5b503515156114eb565b3480156105e557600080fd5b50610396600480360360208110156105fc57600080fd5b503561178e565b34801561060f57600080fd5b5061043b6004803603602081101561062657600080fd5b50356001600160a01b0316611814565b34801561064257600080fd5b506102a0611899565b34801561065757600080fd5b506102f76118a7565b34801561066c57600080fd5b506103966118c9565b34801561068157600080fd5b506103966118d8565b34801561069657600080fd5b506102e0600480360360208110156106ad57600080fd5b50356118e7565b3480156106c057600080fd5b506102f7611954565b3480156106d557600080fd5b506102e0600480360360408110156106ec57600080fd5b508035151590602001356001600160a01b03166119b5565b34801561071057600080fd5b5061043b611a45565b34801561072557600080fd5b506102e06004803603604081101561073c57600080fd5b506001600160a01b0381351690602001351515611a4b565b34801561076057600080fd5b506102e06004803603602081101561077757600080fd5b81019060208101813564010000000081111561079257600080fd5b8201836020820111156107a457600080fd5b803590602001918460018302840111640100000000831117156107c657600080fd5b509092509050611ab9565b3480156107dd57600080fd5b506102e0600480360360808110156107f457600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561082f57600080fd5b82018360208201111561084157600080fd5b8035906020019184600183028401116401000000008311171561086357600080fd5b509092509050611b2d565b34801561087a57600080fd5b5061043b611b76565b34801561088f57600080fd5b506102e0600480360360208110156108a657600080fd5b50351515611b7c565b3480156108bb57600080fd5b506102f7600480360360208110156108d257600080fd5b5035611bf7565b3480156108e557600080fd5b506102a0611d53565b3480156108fa57600080fd5b506102e0611d5c565b34801561090f57600080fd5b506102a06004803603604081101561092657600080fd5b506001600160a01b0381358116916020013516611ddc565b34801561094a57600080fd5b506102e06004803603602081101561096157600080fd5b50356001600160a01b0316611e0a565b34801561097d57600080fd5b506102f7611f5e565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b600a546001600160a01b03163314806109e95750336000908152600e602052604090205460ff165b610a29576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b600d80549115156101000261ff0019909216919091179055565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b0316610b9b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610b60578181015183820152602001610b48565b50505050905090810190601f168015610b8d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b60008181526001602052604090205481906001600160a01b031633811480610c0857506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610c8a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b0316610d125760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600084815260016020908152604091829020548251808401909352600683527f3030333030380000000000000000000000000000000000000000000000000000918301919091526001600160a01b0390811691908716821415610db75760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600085815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b600a546001600160a01b0316331480610e4c5750336000908152600e602052604090205460ff165b610e8c576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b600b5490565b6011805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610f435780601f10610f1857610100808354040283529160200191610f43565b820191906000526020600020905b815481529060010190602001808311610f2657829003601f168201915b505050505081565b600a546001600160a01b0316331480610f735750336000908152600e602052604090205460ff165b610fb3576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b60008181526001602052604090205481906001600160a01b03163381148061101c57506000828152600260205260409020546001600160a01b031633145b8061104a57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906110b55760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b031661113d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190881682146111ca5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b03871661123d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b506112488686611f80565b50505050505050565b60086020526000908152604090205460ff1681565b600090565b601a5474010000000000000000000000000000000000000000900460ff16156112db576040805162461bcd60e51b815260206004820152600e60248201527f4e6f2072652d656e7472616e6379000000000000000000000000000000000000604482015290519081900360640190fd5b601a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055336000908152600f602052604081205460ff161561133a575060646113ee565b50600d5460049060ff16611395576040805162461bcd60e51b815260206004820152600f60248201527f4d696e74696e6720656e61626c65640000000000000000000000000000000000604482015290519081900360640190fd5b81600c54023410156113ee576040805162461bcd60e51b815260206004820152600a60248201527f57726f6e67207061696400000000000000000000000000000000000000000000604482015290519081900360640190fd5b80821061141c576040805162461bcd60e51b8152602060048201526000602482015290519081900360640190fd5b6122b882600b54011115611477576040805162461bcd60e51b815260206004820152600860248201527f536f6c64206f7574000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60005b8281101561149d57600b5461148f8582611ffb565b6001908101600b550161147a565b5050601a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555050565b6114e68383836040518060200160405280600081525061213a565b505050565b600a546001600160a01b03163314806115135750336000908152600e602052604090205460ff165b611553576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b80156117295760125460135460145460155447936064850490810293810292810291028284018201810185101561159257848183858701010103840393505b6016546040516000916001600160a01b03169086908381818185875af1925050503d80600081146115df576040519150601f19603f3d011682016040523d82523d6000602084013e6115e4565b606091505b50506017546040519192506000916001600160a01b039091169086908381818185875af1925050503d8060008114611638576040519150601f19603f3d011682016040523d82523d6000602084013e61163d565b606091505b50506018546040519192506000916001600160a01b039091169086908381818185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b50506019546040519192506000916001600160a01b039091169086908381818185875af1925050503d80600081146116ea576040519150601f19603f3d011682016040523d82523d6000602084013e6116ef565b606091505b50509050836116fd57600080fd5b8261170757600080fd5b8161171157600080fd5b8061171b57600080fd5b50505050505050505061178b565b6018546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611776576040519150601f19603f3d011682016040523d82523d6000602084013e61177b565b606091505b505090508061178957600080fd5b505b50565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b03169081610bb75760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b0383166118895760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b506118938261258f565b92915050565b600d54610100900460ff1681565b6040518060400160405280600681526020016518189c18181960d11b81525081565b600a546001600160a01b031690565b600a546001600160a01b031681565b600a546001600160a01b031633148061190f5750336000908152600e602052604090205460ff165b61194f576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b600c55565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610acf5780601f10610aa457610100808354040283529160200191610acf565b600a546001600160a01b03163314806119dd5750336000908152600e602052604090205460ff165b611a1d576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6001600160a01b03166000908152600e60205260409020805460ff1916911515919091179055565b600c5481565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600a546001600160a01b0316331480611ae15750336000908152600e602052604090205460ff165b611b21576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b6114e6601183836128c7565b611b6f85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061213a92505050565b5050505050565b600b5481565b600a546001600160a01b0316331480611ba45750336000908152600e602052604090205460ff165b611be4576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b600d805460ff1916911515919091179055565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316611c805760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b506011611c8c846125aa565b6040516020018083805460018160011615610100020316600290048015611cea5780601f10611cc8576101008083540402835291820191611cea565b820191906000526020600020905b815481529060010190602001808311611cd6575b5050825160208401908083835b60208310611d165780518252601f199092019160209182019101611cf7565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050919050565b600d5460ff1681565b73cbeb3c6aec7040e4949f22234573bd06b31de83b3314611d7c57600080fd5b6018546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611dc9576040519150601f19603f3d011682016040523d82523d6000602084013e611dce565b606091505b505090508061178b57600080fd5b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600a5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314611e815760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b038216611ef45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6040518060400160405280600681526020016530313830303160d01b81525081565b6000818152600160205260409020546001600160a01b0316611fa1826126b9565b611fab81836126e4565b611fb583836127b7565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b03831661206d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156120f35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b506120fe82826127b7565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008281526001602052604090205482906001600160a01b03163381148061217857506000828152600260205260409020546001600160a01b031633145b806121a657506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906122115760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b03166122995760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190891682146123265760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0388166123995760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b506123a48787611f80565b6123b6876001600160a01b031661288b565b15612585576000876001600160a01b031663150b7a02338b8a8a6040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612440578181015183820152602001612428565b50505050905090810190601f16801561246d5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561248f57600080fd5b505af11580156124a3573d6000803e3d6000fd5b505050506040513d60208110156124b957600080fd5b505160408051808201909152600681527f303033303035000000000000000000000000000000000000000000000000000060208201529091507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000146125825760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50505b5050505050505050565b6001600160a01b031660009081526003602052604090205490565b6060816125eb575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526109bc565b8160005b811561260357600101600a820491506125ef565b60608167ffffffffffffffff8111801561261c57600080fd5b506040519080825280601f01601f191660200182016040528015612647576020820181803683370190505b50859350905060001982015b83156126b057600a840660300160f81b8282806001900393508151811061267657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350612653565b50949350505050565b6000908152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff19169055565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0384811691161461276d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b506001600160a01b03909116600090815260036020908152604080832080546000190190559282526001905220805473ffffffffffffffffffffffffffffffffffffffff19169055565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561283c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b60578181015183820152602001610b48565b50600090815260016020818152604080842080546001600160a01b0390961673ffffffffffffffffffffffffffffffffffffffff19909616861790559383526003905291902080549091019055565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906128bf5750808214155b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106129085782800160ff19823516178555612935565b82800160010185558215612935579182015b8281111561293557823582559160200191906001019061291a565b50612941929150612945565b5090565b5b80821115612941576000815560010161294656fea26469706673582212202add5f39dad0879bbca14ff47e9c3eeae77d1b66d4ed3f5bb6802d613513d59764736f6c63430007000033

Deployed Bytecode Sourcemap

29742:4449:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5549:172;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5549:172:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;32258:90;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32258:90:0;;;;:::i;:::-;;27233:120;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21283:183;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21283:183:0;;:::i;:::-;;;;-1:-1:-1;;;;;21283:183:0;;;;;;;;;;;;;;19068:352;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19068:352:0;;;;;;;;:::i;33308:102::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33308:102:0;;;;;;;;;;:::i;33105:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30082:21;;;;;;;;;;;;;:::i;32354:97::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32354:97:0;;;;;;;;;;:::i;18294:353::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18294:353:0;;;;;;;;;;;;;;;;;:::i;433:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;433:39:0;-1:-1:-1;;;;;433:39:0;;:::i;33022:77::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33595:590;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33595:590:0;;;;;;;;:::i;17539:179::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17539:179:0;;;;;;;;;;;;;;;;;:::i;31271:981::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31271:981:0;;;;:::i;20831:208::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20831:208:0;;:::i;20357:204::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20357:204:0;-1:-1:-1;;;;;20357:204:0;;:::i;29941:26::-;;;;;;;;;;;;;:::i;612:65::-;;;;;;;;;;;;;:::i;32933:83::-;;;;;;;;;;;;;:::i;732:20::-;;;;;;;;;;;;;:::i;33416:83::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33416:83:0;;:::i;27469:128::-;;;;;;;;;;;;;:::i;33206:95::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33206:95:0;;;;;;;;-1:-1:-1;;;;;33206:95:0;;:::i;29867:41::-;;;;;;;;;;;;;:::i;19831:232::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19831:232:0;;;;;;;;;;:::i;32457:91::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32457:91:0;;-1:-1:-1;32457:91:0;-1:-1:-1;32457:91:0;:::i;16919:209::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16919:209:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16919:209:0;;-1:-1:-1;16919:209:0;-1:-1:-1;16919:209:0;:::i;29831:31::-;;;;;;;;;;;;;:::i;33505:82::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33505:82:0;;;;:::i;32709:218::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32709:218:0;;:::i;29913:23::-;;;;;;;;;;;;;:::i;32554:148::-;;;;;;;;;;;;;:::i;21735:192::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21735:192:0;;;;;;;;;;:::i;1698:238::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1698:238:0;-1:-1:-1;;;;;1698:238:0;;:::i;556:51::-;;;;;;;;;;;;;:::i;5549:172::-;5682:33;;;5659:4;5682:33;;;;;;;;;;;;;5549:172;;;;:::o;32258:90::-;30621:5;;-1:-1:-1;;;;;30621:5:0;30609:10;:17;;:40;;-1:-1:-1;30638:10:0;30630:19;;;;:7;:19;;;;;;;;30609:40;30601:65;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;;;;32320:14:::1;:22:::0;;;::::1;;;;-1:-1:-1::0;;32320:22:0;;::::1;::::0;;;::::1;::::0;;32258:90::o;27233:120::-;27340:7;27332:15;;;;;;;;-1:-1:-1;;27332:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27301:19;;27332:15;;27340:7;;27332:15;;27340:7;27332:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27233:120;:::o;21283:183::-;21412:7;15851:19;;;:9;:19;;;;;;;;;15886:13;;;;;;;;;;;-1:-1:-1;;;15886:13:0;;;;;;;21388:8;;-1:-1:-1;;;;;15851:19:0;15843:57;;;;-1:-1:-1;;;15843:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21438:22:0::1;::::0;;;:12:::1;:22;::::0;;;;;-1:-1:-1;;;;;21438:22:0::1;::::0;-1:-1:-1;15907:1:0::1;21283:183:::0;;;;:::o;19068:352::-;15035:18;15056:19;;;:9;:19;;;;;;19181:8;;-1:-1:-1;;;;;15056:19:0;15112:10;15098:24;;;:68;;-1:-1:-1;;;;;;15126:28:0;;;;;;:16;:28;;;;;;;;15155:10;15126:40;;;;;;;;;;15098:68;15175:21;;;;;;;;;;;;;;;;;15082:121;;;;;-1:-1:-1;;;15082:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15882:1:0::1;15851:19:::0;;;:9:::1;:19;::::0;;;;;;;;;15886:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;15886:13:0;;::::1;::::0;;;;19209:8;;15886:13;-1:-1:-1;;;;;15851:19:0::1;15843:57;;;::::0;-1:-1:-1;;;15843:57:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;-1:-1:-1::0;19229:18:0::2;19250:19:::0;;;:9:::2;:19;::::0;;;;;;;;;19309:8;;;;::::2;::::0;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;-1:-1:-1;;;;;19250:19:0;;::::2;::::0;19309:8;19284:23;::::2;::::0;::::2;;19276:42;;;::::0;-1:-1:-1;;;19276:42:0;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;::::2;::::0;;;;;;;::::2;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;-1:-1:-1::0;19327:22:0::2;::::0;;;:12:::2;:22;::::0;;;;;:34;;-1:-1:-1;;19327:34:0::2;-1:-1:-1::0;;;;;19327:34:0;;::::2;::::0;;::::2;::::0;;;19373:41;;19327:22;;19373:41;;::::2;::::0;::::2;::::0;::::2;15907:1;15210::::1;19068:352:::0;;;;:::o;33308:102::-;30621:5;;-1:-1:-1;;;;;30621:5:0;30609:10;:17;;:40;;-1:-1:-1;30638:10:0;30630:19;;;;:7;:19;;;;;;;;30609:40;30601:65;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33383:13:0;;;::::1;;::::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;33383:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33308:102::o;33105:93::-;33178:12;;33105:93;:::o;30082:21::-;;;;;;;;;;;;;;;-1:-1:-1;;30082:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32354:97::-;30621:5;;-1:-1:-1;;;;;30621:5:0;30609:10;:17;;:40;;-1:-1:-1;30638:10:0;30630:19;;;;:7;:19;;;;;;;;30609:40;30601:65;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32425:12:0;;;::::1;;::::0;;;:6:::1;:12;::::0;;;;:20;;-1:-1:-1;;32425:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32354:97::o;18294:353::-;15415:18;15436:19;;;:9;:19;;;;;;18427:8;;-1:-1:-1;;;;;15436:19:0;15492:10;15478:24;;;:71;;-1:-1:-1;15513:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;15513:22:0;15539:10;15513:36;15478:71;:122;;;-1:-1:-1;;;;;;15560:28:0;;;;;;:16;:28;;;;;;;;15589:10;15560:40;;;;;;;;;;15478:122;15609:30;;;;;;;;;;;;;-1:-1:-1;;;15609:30:0;;;15462:184;;;;;-1:-1:-1;;;15462:184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15882:1:0::1;15851:19:::0;;;:9:::1;:19;::::0;;;;;;;;;15886:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;15886:13:0;;::::1;::::0;;;;18455:8;;15886:13;-1:-1:-1;;;;;15851:19:0::1;15843:57;;;::::0;-1:-1:-1;;;15843:57:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;-1:-1:-1::0;18475:18:0::2;18496:19:::0;;;:9:::2;:19;::::0;;;;;;;;;18551:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;18551:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;18496:19:0;;::::2;::::0;18551:9;18530:19;::::2;::::0;::::2;18522:39;;;::::0;-1:-1:-1;;;18522:39:0;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;::::2;::::0;;;;;;;::::2;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;-1:-1:-1::0;18595:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;18595:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;18576:17:0;::::2;18568:40;;;::::0;-1:-1:-1;;;18568:40:0;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;::::2;::::0;;;;;;;::::2;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;18617:24;18627:3;18632:8;18617:9;:24::i;:::-;15907:1;15653::::1;18294:353:::0;;;;;:::o;433:39::-;;;;;;;;;;;;;;;:::o;33022:77::-;33065:5;33022:77;:::o;33595:590::-;30952:6;;;;;;;30951:7;30943:34;;;;;-1:-1:-1;;;30943:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30988:6;:13;;;;;;;;33751:10:::1;30988:13:::0;33743:19;;;:7:::1;:19;::::0;;;;;30988:13;33743:19:::1;33740:192;;;-1:-1:-1::0;33783:3:0::1;33740:192;;;-1:-1:-1::0;33837:11:0::1;::::0;33819:1:::1;::::0;33837:11:::1;;33829:39;;;::::0;;-1:-1:-1;;;33829:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33906:3;33898:5;;:11;33885:9;:24;;33877:47;;;::::0;;-1:-1:-1;;;33877:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33952:7;33946:3;:13;33938:26;;;::::0;;-1:-1:-1;;;33938:26:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;::::1;;34003:4;33996:3;33981:12;;:18;:26;;33973:47;;;::::0;;-1:-1:-1;;;33973:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;34031:6;34027:153;34044:3;34041:1;:6;34027:153;;;34084:12;::::0;34107:26:::1;34119:3:::0;34084:12;34107:11:::1;:26::i;:::-;34171:1;34160:12:::0;;::::1;34145;:27:::0;34049:3:::1;34027:153;;;-1:-1:-1::0;;31024:6:0;:14;;;;;;-1:-1:-1;;33595:590:0:o;17539:179::-;17669:43;17687:5;17694:3;17699:8;17669:43;;;;;;;;;;;;:17;:43::i;:::-;17539:179;;;:::o;31271:981::-;30621:5;;-1:-1:-1;;;;;30621:5:0;30609:10;:17;;:40;;-1:-1:-1;30638:10:0;30630:19;;;;:7;:19;;;;;;;;30609:40;30601:65;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;;;;31333:5:::1;31330:917;;;31446:12;::::0;31500:16:::1;::::0;31558:9:::1;::::0;31610:10:::1;::::0;31371:21:::1;::::0;31441:3:::1;31433:11:::0;::::1;31432:26:::0;;::::1;::::0;31486:30;::::1;::::0;31544:23;::::1;::::0;31596:24:::1;31640:9:::0;;::::1;:14:::0;::::1;:19:::0;::::1;31639:30:::0;-1:-1:-1;31635:108:0::1;;;31721:7;31713:4;31708;31703;31698;:9;:14;:19;31697:31;31688:41;;;;31635:108;31782:13;::::0;:37:::1;::::0;31768:10:::1;::::0;-1:-1:-1;;;;;31782:13:0::1;::::0;31809:4;;31768:10;31782:37;31768:10;31782:37;31809:4;31782:13;:37:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;31847:17:0::1;::::0;:41:::1;::::0;31767:52;;-1:-1:-1;31833:10:0::1;::::0;-1:-1:-1;;;;;31847:17:0;;::::1;::::0;31878:4;;31833:10;31847:41;31833:10;31847:41;31878:4;31847:17;:41:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;31916:10:0::1;::::0;:34:::1;::::0;31832:56;;-1:-1:-1;31902:10:0::1;::::0;-1:-1:-1;;;;;31916:10:0;;::::1;::::0;31940:4;;31902:10;31916:34;31902:10;31916:34;31940:4;31916:10;:34:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;31978:11:0::1;::::0;:35:::1;::::0;31901:49;;-1:-1:-1;31964:10:0::1;::::0;-1:-1:-1;;;;;31978:11:0;;::::1;::::0;32003:4;;31964:10;31978:35;31964:10;31978:35;32003:4;31978:11;:35:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31963:50;;;32034:5;32026:14;;;::::0;::::1;;32061:5;32053:14;;;::::0;::::1;;32088:5;32080:14;;;::::0;::::1;;32115:5;32107:14;;;::::0;::::1;;31330:917;;;;;;;;;;;;32162:10;::::0;:51:::1;::::0;32149:9:::1;::::0;-1:-1:-1;;;;;32162:10:0::1;::::0;32186:21:::1;::::0;32149:9;32162:51;32149:9;32162:51;32186:21;32162:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32148:65;;;32232:4;32224:13;;;::::0;::::1;;31330:917;;31271:981:::0;:::o;20831:208::-;20928:14;20963:19;;;:9;:19;;;;;;;;;;21019:13;;;;;;;;;;;-1:-1:-1;;;21019:13:0;;;;;;;-1:-1:-1;;;;;20963:19:0;;20997:20;20989:44;;;;-1:-1:-1;;;20989:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20357:204;20503:12;;;;;;;;;;;;-1:-1:-1;;;20503:12:0;;;;20454:7;;-1:-1:-1;;;;;20481:20:0;;20473:43;;;;-1:-1:-1;;;20473:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20530:25;20548:6;20530:17;:25::i;:::-;20523:32;20357:204;-1:-1:-1;;20357:204:0:o;29941:26::-;;;;;;;;;:::o;612:65::-;;;;;;;;;;;;;;-1:-1:-1;;;612:65:0;;;;:::o;32933:83::-;33003:5;;-1:-1:-1;;;;;33003:5:0;32933:83;:::o;732:20::-;;;-1:-1:-1;;;;;732:20:0;;:::o;33416:83::-;30621:5;;-1:-1:-1;;;;;30621:5:0;30609:10;:17;;:40;;-1:-1:-1;30638:10:0;30630:19;;;;:7;:19;;;;;;;;30609:40;30601:65;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;;;;33477:5:::1;:16:::0;33416:83::o;27469:128::-;27582:9;27572:19;;;;;;;;-1:-1:-1;;27572:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27539:21;;27572:19;;27582:9;;27572:19;;27582:9;27572:19;;;;;;;;;;;;;;;;;;;;;;;;33206:95;30621:5;;-1:-1:-1;;;;;30621:5:0;30609:10;:17;;:40;;-1:-1:-1;30638:10:0;30630:19;;;;:7;:19;;;;;;;;30609:40;30601:65;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33274:13:0::1;;::::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;33274:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33206:95::o;29867:41::-;;;;:::o;19831:232::-;19963:10;19946:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;19946:39:0;;;;;;;;;;;;:51;;-1:-1:-1;;19946:51:0;;;;;;;;;;20009:48;;;;;;;19946:39;;19963:10;20009:48;;;;;;;;;;;19831:232;;:::o;32457:91::-;30621:5;;-1:-1:-1;;;;;30621:5:0;30609:10;:17;;:40;;-1:-1:-1;30638:10:0;30630:19;;;;:7;:19;;;;;;;;30609:40;30601:65;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;;;;32526:16:::1;:7;32536:6:::0;;32526:16:::1;:::i;16919:209::-:0;17076:46;17094:5;17101:3;17106:8;17116:5;;17076:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17076:17:0;;-1:-1:-1;;;17076:46:0:i;:::-;16919:209;;;;;:::o;29831:31::-;;;;:::o;33505:82::-;30621:5;;-1:-1:-1;;;;;30621:5:0;30609:10;:17;;:40;;-1:-1:-1;30638:10:0;30630:19;;;;:7;:19;;;;;;;;30609:40;30601:65;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;-1:-1:-1;;;30601:65:0;;;;;;;;;;;;;;;33562:11:::1;:19:::0;;-1:-1:-1;;33562:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33505:82::o;32709:218::-;15882:1;15851:19;;;:9;:19;;;;;;;;;;15886:13;;;;;;;;;;;-1:-1:-1;;;15886:13:0;;;;;;;32835;;32811:8;;-1:-1:-1;;;;;15851:19:0;15843:57;;;;-1:-1:-1;;;15843:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32891:7:::1;32900:19;:8;:17;:19::i;:::-;32874:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;32874:46:0;;::::1;::::0;::::1;::::0;;;;::::1;;;;;;::::0;;;;-1:-1:-1;;32874:46:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32860:61;;32709:218:::0;;;;:::o;29913:23::-;;;;;;:::o;32554:148::-;30737:42;30725:10;:54;30717:63;;;;;;32621:10:::1;::::0;:51:::1;::::0;32608:9:::1;::::0;-1:-1:-1;;;;;32621:10:0::1;::::0;32645:21:::1;::::0;32608:9;32621:51;32608:9;32621:51;32645:21;32621:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32607:65;;;32691:4;32683:13;;;::::0;::::1;21735:192:::0;-1:-1:-1;;;;;21886:24:0;;;21863:4;21886:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;21735:192::o;1698:238::-;1377:5;;1384:17;;;;;;;;;;;;-1:-1:-1;;;1384:17:0;;;;;-1:-1:-1;;;;;1377:5:0;1363:10;:19;1355:47;;;;-1:-1:-1;;;1355:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1824:31:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;1824:31:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;1799:23:0;::::1;1791:65;;;::::0;-1:-1:-1;;;1791:65:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;-1:-1:-1::0;1889:5:0::1;::::0;1868:38:::1;::::0;-1:-1:-1;;;;;1868:38:0;;::::1;::::0;1889:5:::1;::::0;1868:38:::1;::::0;1889:5:::1;::::0;1868:38:::1;1913:5;:17:::0;;-1:-1:-1;;1913:17:0::1;-1:-1:-1::0;;;;;1913:17:0;;;::::1;::::0;;;::::1;::::0;;1698:238::o;556:51::-;;;;;;;;;;;;;;-1:-1:-1;;;556:51:0;;;;:::o;22118:275::-;22207:12;22222:19;;;:9;:19;;;;;;-1:-1:-1;;;;;22222:19:0;22248:24;22232:8;22248:14;:24::i;:::-;22281:30;22296:4;22302:8;22281:14;:30::i;:::-;22318:26;22330:3;22335:8;22318:11;:26::i;:::-;22378:8;22373:3;-1:-1:-1;;;;;22358:29:0;22367:4;-1:-1:-1;;;;;22358:29:0;;;;;;;;;;;22118:275;;;:::o;22784:297::-;22909:12;;;;;;;;;;;;-1:-1:-1;;;22909:12:0;;;;-1:-1:-1;;;;;22890:17:0;;22882:40;;;;-1:-1:-1;;;22882:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22968:1:0;22937:19;;;:9;:19;;;;;;;;;;22972:18;;;;;;;;;;;-1:-1:-1;;;22972:18:0;;;;;;;-1:-1:-1;;;;;22937:19:0;:33;22929:62;;;;-1:-1:-1;;;22929:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23000:26;23012:3;23017:8;23000:11;:26::i;:::-;23040:35;;23066:8;;-1:-1:-1;;;;;23040:35:0;;;23057:1;;23040:35;;23057:1;;23040:35;22784:297;;:::o;25520:590::-;15415:18;15436:19;;;:9;:19;;;;;;25668:8;;-1:-1:-1;;;;;15436:19:0;15492:10;15478:24;;;:71;;-1:-1:-1;15513:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;15513:22:0;15539:10;15513:36;15478:71;:122;;;-1:-1:-1;;;;;;15560:28:0;;;;;;:16;:28;;;;;;;;15589:10;15560:40;;;;;;;;;;15478:122;15609:30;;;;;;;;;;;;;-1:-1:-1;;;15609:30:0;;;15462:184;;;;;-1:-1:-1;;;15462:184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15882:1:0::1;15851:19:::0;;;:9:::1;:19;::::0;;;;;;;;;15886:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;15886:13:0;;::::1;::::0;;;;25696:8;;15886:13;-1:-1:-1;;;;;15851:19:0::1;15843:57;;;::::0;-1:-1:-1;;;15843:57:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;-1:-1:-1::0;25716:18:0::2;25737:19:::0;;;:9:::2;:19;::::0;;;;;;;;;25792:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;25792:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;25737:19:0;;::::2;::::0;25792:9;25771:19;::::2;::::0;::::2;25763:39;;;::::0;-1:-1:-1;;;25763:39:0;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;::::2;::::0;;;;;;;::::2;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;-1:-1:-1::0;25836:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;25836:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;25817:17:0;::::2;25809:40;;;::::0;-1:-1:-1;;;25809:40:0;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;::::2;::::0;;;;;;;::::2;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;25858:24;25868:3;25873:8;25858:9;:24::i;:::-;25895:16;:3;-1:-1:-1::0;;;;;25895:14:0::2;;:16::i;:::-;25891:214;;;25927:13;25963:3;-1:-1:-1::0;;;;;25943:41:0::2;;25985:10;25997:5;26004:8;26014:5;25943:77;;;;;;;;;;;;;-1:-1:-1::0;;;;;25943:77:0::2;;;;;;-1:-1:-1::0;;;;;25943:77:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;25943:77:0;26073:23:::2;::::0;;;;::::2;::::0;;;::::2;::::0;;::::2;25943:77;26073:23:::0;::::2;::::0;25943:77;;-1:-1:-1;26037:34:0;;::::2;26047:24:::0;26037:34:::2;26029:68;;;::::0;-1:-1:-1;;;26029:68:0;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;::::2;::::0;;;;;;;::::2;;::::0;;::::2;::::0;;;::::2;::::0;::::2;;;;;;25891:214;;15907:1;15653::::1;25520:590:::0;;;;;;:::o;25079:163::-;-1:-1:-1;;;;;25209:27:0;25183:7;25209:27;;;:19;:27;;;;;;;25079:163::o;29177:557::-;29233:13;29265:10;29261:53;;-1:-1:-1;29292:10:0;;;;;;;;;;;;;;;;;;;29261:53;29339:5;29324:12;29380:78;29387:9;;29380:78;;29413:8;;29444:2;29436:10;;;;29380:78;;;29468:19;29500:6;29490:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29490:17:0;-1:-1:-1;29562:5:0;;-1:-1:-1;29468:39:0;-1:-1:-1;;;29534:10:0;;29578:117;29585:9;;29578:117;;29654:2;29647:4;:9;29642:2;:14;29629:29;;29611:6;29618:7;;;;;;;29611:15;;;;;;;;;;;:47;;;;;;;;;;-1:-1:-1;29681:2:0;29673:10;;;;29578:117;;;-1:-1:-1;29719:6:0;29177:557;-1:-1:-1;;;;29177:557:0:o;26243:110::-;26325:22;;;;:12;:22;;;;;26318:29;;-1:-1:-1;;26318:29:0;;;26243:110::o;24041:234::-;24158:19;;;;:9;:19;;;;;;;;;;24188:9;;;;;;;;;;;-1:-1:-1;;;24188:9:0;;;;;;;-1:-1:-1;;;;;24158:28:0;;;:19;;:28;24150:48;;;;-1:-1:-1;;;24150:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24205:26:0;;;;;;;:19;:26;;;;;;;;:31;;-1:-1:-1;;24205:31:0;;;24250:19;;;24235:1;24250:19;;;24243:26;;-1:-1:-1;;24243:26:0;;;24041:234::o;24542:242::-;24685:1;24654:19;;;:9;:19;;;;;;;;;;24689:18;;;;;;;;;;;-1:-1:-1;;;24689:18:0;;;;;;;-1:-1:-1;;;;;24654:19:0;:33;24646:62;;;;-1:-1:-1;;;24646:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24717:19:0;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;24717:25:0;;;-1:-1:-1;;24717:25:0;;;;;;;24749:24;;;:19;:24;;;;;:29;;;;;;;24542:242::o;3495:780::-;3578:17;4160:18;;4064:66;4226:15;;;;;:42;;;4257:11;4245:8;:23;;4226:42;4210:59;3495:780;-1:-1:-1;;;;3495:780:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

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