ETH Price: $3,064.01 (-1.83%)

Token

robobots (🤖)
 

Overview

Max Total Supply

10,000 🤖

Holders

2,644

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
85584.eth
Balance
8 🤖
0x70dd6f9b1bbe897c0bcfd007d75b2933affa1fe5
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:
Robobots

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-22
*/

// File: contracts/tokens/erc721.sol

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

/**
 * @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/erc721-token-receiver.sol

pragma solidity ^0.8.0;

/**
 * @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/utils/erc165.sol

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

/**
 * @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/utils/address-utils.sol

pragma solidity ^0.8.0;

/**
 * @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/tokens/nf-token.sol

pragma solidity ^0.8.0;




/**
 * @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
    virtual
  {
    address from = idToOwner[_tokenId];
    _clearApproval(_tokenId);

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

    emit Transfer(from, _to, _tokenId);
  }

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

    _addNFToken(_to, _tokenId);

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

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

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

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

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

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

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

    _transfer(_to, _tokenId);

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

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

}

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

pragma solidity ^0.8.0;

/**
 * @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/NFTokenMetadata.sol

pragma solidity 0.8.6;


/**
 * @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 The baseUri for NFTokens.
     */
    string internal baseUri;

    /**
     * @dev Contract constructor.
     * @notice When implementing, don't forget to set nftName, nftSymbol, and baseUri
     */
    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 concatenated baseURI and _tokenId string.
     */
    function tokenURI(
        uint256 _tokenId
    )
    external
    override
    view
    validNFToken(_tokenId)
    returns (string memory)
    {
        return string(abi.encodePacked(baseUri, uint2str(_tokenId)));
    }

    function uint2str(uint _i) internal pure returns (string memory) {
    if (_i == 0) {
        return "0";
    }
    uint j = _i;
    uint length;
    while (j != 0) {
        length++;
        j /= 10;
    }
    bytes memory str = new bytes(length);
    while (_i != 0) {
        str[--length] = bytes1(uint8(48 + _i % 10));
        _i /= 10;
    }
    return string(str);
}

}

// File: contracts/ownership/ownable.sol

pragma solidity ^0.8.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
{

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

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

  /**
   * @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: @openzeppelin/contracts/utils/math/SafeMath.sol

// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: contracts/Robobots.sol

pragma solidity 0.8.6;



/**
 * @dev Robobots ERC721 & Marketplace.
 */
contract Robobots is NFTokenMetadata, Ownable {

    using SafeMath for uint256;

    string constant NOT_FOR_SALE = "004001";
    string constant NOT_FOR_SALE_TO_YOU = "004002";
    string constant INSUFFICIENT_VALUE = "004003";
    string constant BID_INFLATION = "004004";
    string constant MISSING_BID = "004005";
    string constant NOT_BIDDER = "004006";
    string constant INTERNAL_INCONSISTENCY = "004007";

    string public constant imageHash = "d4c5e36e00ab8cefae0f3c04ad14f71209e75897a9dd1a3e59a01a51be7dfbf0";
    uint256 public constant totalSupply = 10000;
    uint256 public constant feePercent = 1; // of 100 basis points, or 1%

    struct Offer {
        bool isForSale;
        uint tokenId;
        address seller;
        uint minValue;
        address onlySellTo; // optionally sell only to a specific address
    }

    struct Bid {
        bool hasBid;
        uint tokenId;
        address bidder;
        uint value;
    }

    // A record of tokens that are offered for sale at a minimum value, and optionally to a specific buyer
    mapping (uint => Offer) public offers;
    // A record of the highest bid per token
    mapping (uint => Bid) public bids;
    // Ether stored in the contract until a seller withdraws
    mapping (address => uint) public pendingWithdrawals;

    event PurchaseMade(uint indexed tokenId, uint value, address indexed fromAddress, address indexed toAddress);
    event OfferMade(uint indexed tokenId, uint minValue, address indexed toAddress);
    event OfferRemoved(uint indexed tokenId);
    event BidMade(uint indexed tokenId, uint value, address indexed fromAddress);
    event BidRemoved(uint indexed tokenId, uint value, address indexed fromAddress);

    /**
    * @dev Contract constructor. Sets metadata extension `name` and `symbol`.
    */
    constructor() {
        nftName = "robobots";
        nftSymbol = unicode"🤖";
        baseUri = "https://robobots-f79f8.web.app/metadata/bot";
    }

    function setBaseTokenURI(string calldata _baseUri) external onlyOwner {
        baseUri = _baseUri;
    }

    /**
    * @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) external {
        require(_tokenId < totalSupply, NOT_VALID_NFT); // _tokenId should range from 0 to totalSupply-1
        super._mint(_to, _tokenId);
    }

    /**
    * @dev onlyOwner backdoor to allow multiple mints in one transaction
    * @param _to The addresses that will own a minted NFT.
    * @param _tokenIds to be minted by the msg.sender.
    */
    function mintAll(address[] memory _to, uint256[] memory _tokenIds) external onlyOwner {
        uint n = _to.length;
        for (uint i = 0; i < n; i++) {
            require(_tokenIds[i] < totalSupply, NOT_VALID_NFT);
            super._mint(_to[i], _tokenIds[i]);
        }
    }

    /**
    * @dev Put the token on sale at a minimum sale price.
    * @param _tokenId The token for sale, operated by msg.sender
    * @param _minSalePriceInWei the minimum payment accepted
    */
    function makeOffer(uint256 _tokenId, uint _minSalePriceInWei) external canOperate(_tokenId) {
        offers[_tokenId] = Offer(true, _tokenId, msg.sender, _minSalePriceInWei, address(0));
        emit OfferMade(_tokenId, _minSalePriceInWei, address(0));
    }

    /**
    * @dev Like makeOffer, but the token may only be bought from a specific address.
    * @param _tokenId The token for sale, operated by msg.sender
    * @param _minSalePriceInWei the minimum payment accepted
    * @param _toAddress the only allowed buyer
    */
    function makeOfferToAddress(uint256 _tokenId, uint _minSalePriceInWei, address _toAddress) external canOperate(_tokenId) {
        offers[_tokenId] = Offer(true, _tokenId, msg.sender, _minSalePriceInWei, _toAddress);
        emit OfferMade(_tokenId, _minSalePriceInWei, _toAddress);
    }

    /**
    * @dev Remove the offer for this token.
    * @param _tokenId The token (previously) for sale, operated by msg.sender
    */
    function withdrawOffer(uint256 _tokenId) external canOperate(_tokenId) {
        _removeOffer(_tokenId);
    }

    /**
    * @dev Buy the token at the minimum sale price.
    * @param _tokenId The token for sale
    */
    function buy(uint256 _tokenId) external payable {
        // check that this is a valid purchase attempt
        require(_tokenId < totalSupply, NOT_VALID_NFT);
        Offer memory offer = offers[_tokenId];
        require(offer.isForSale, NOT_FOR_SALE);
        require(offer.onlySellTo == address(0) || offer.onlySellTo == msg.sender, NOT_FOR_SALE_TO_YOU);
        require(msg.value >= offer.minValue, INSUFFICIENT_VALUE);
        address seller = offer.seller;
        require(seller == idToOwner[_tokenId], INTERNAL_INCONSISTENCY);

        // make the Transfer
        _transfer(msg.sender, _tokenId);


        // collect fee, and make proceeds available to seller
        uint256 fee = (msg.value.mul(feePercent)).div(100);
        uint256 proceeds = msg.value - fee;
        pendingWithdrawals[owner] += fee;
        pendingWithdrawals[seller] += proceeds;
        emit PurchaseMade(_tokenId, msg.value, seller, msg.sender);

        // Check for the case where there is a bid from the new owner and refund it.
        // Any other bid can stay in place.
        Bid memory bid = bids[_tokenId];
        if (bid.bidder == msg.sender) {
            // Delete bid and refund value
            pendingWithdrawals[msg.sender] += bid.value;
            _removeBid(_tokenId);
        }
    }

    /**
    * @dev Remove funds from this contract, after a sale and/or a withdrawn bid.
    */
    function withdrawFunds() external {
        uint amount = pendingWithdrawals[msg.sender];
        // Zero the pending refund before sending to prevent re-entrancy attacks
        pendingWithdrawals[msg.sender] = 0;
        payable(msg.sender).transfer(amount);
    }

    /**
    * @dev Make a bid for the token with msg.value.
    * @param _tokenId The coveted token
    */
    function makeBid(uint256 _tokenId) external payable {
        require(_tokenId < totalSupply, NOT_VALID_NFT);
        require(idToOwner[_tokenId] != address(0), ZERO_ADDRESS);
        require(idToOwner[_tokenId] != msg.sender, BID_INFLATION);
        Bid memory existingBid = bids[_tokenId];
        require(msg.value > existingBid.value, INSUFFICIENT_VALUE);
        if (existingBid.value > 0) {
            pendingWithdrawals[existingBid.bidder] += existingBid.value; // refund the outbid bidder
        }
        bids[_tokenId] = Bid(true, _tokenId, msg.sender, msg.value);
        emit BidMade(_tokenId, msg.value, msg.sender);
    }

    /**
    * @dev Accept the highest bid, assuming a minimum sale price.
    * @param _tokenId The coveted token, operated by msg.sender
    * @param _minSalePriceInWei the minimum payment accepted, ensuring the bid has not just been reduced.
    */
    function acceptBid(uint256 _tokenId, uint _minSalePriceInWei) external canOperate(_tokenId) {
        address seller = msg.sender;
        Bid memory bid = bids[_tokenId];
        require(bid.hasBid, MISSING_BID);
        require(bid.value > 0, INTERNAL_INCONSISTENCY);
        require(bid.value >= _minSalePriceInWei, INSUFFICIENT_VALUE);

        // make the Transfer
        _transfer(bid.bidder, _tokenId);

        uint amount = bid.value;
        _removeBid(_tokenId);

        // collect fee, and make proceeds available to seller
        uint256 fee = (amount.mul(feePercent)).div(100);
        uint256 proceeds = amount - fee;
        pendingWithdrawals[owner] += fee;
        pendingWithdrawals[seller] += proceeds;
        emit PurchaseMade(_tokenId, bid.value, seller, bid.bidder);
    }

    /**
    * @dev Withdraw the bid for this token.
    * @param _tokenId The (once-)coveted token
    */
    function withdrawBid(uint256 _tokenId) external {
        require(_tokenId < totalSupply, NOT_VALID_NFT);
        require(idToOwner[_tokenId] != msg.sender, BID_INFLATION);
        Bid memory bid = bids[_tokenId];
        require(bid.bidder == msg.sender, NOT_BIDDER);
        uint amount = bid.value;
        _removeBid(_tokenId);
        // Refund the bid money
        payable(msg.sender).transfer(amount);
    }

    function _removeOffer(uint256 _tokenId) internal {
        if (offers[_tokenId].isForSale) {
            offers[_tokenId] = Offer(false, _tokenId, address(0), 0, address(0));
            emit OfferRemoved(_tokenId);
        }
    }

    function _removeBid(uint256 _tokenId) internal {
        Bid memory bid = bids[_tokenId];
        bids[_tokenId] = Bid(false, 0, address(0), 0);
        emit BidRemoved(_tokenId, bid.value, bid.bidder);
    }

    /**
    * @dev Transfers the ownership of an NFT from one address to another address.
    * Removes any existing offer for the token when ownership changes.
    * @param _to The new owner.
    * @param _tokenId The NFT to transfer.
    */
function _transfer(address _to, uint256 _tokenId) internal override {
    super._transfer(_to, _tokenId);
    _removeOffer(_tokenId);
}
}

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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"}],"name":"BidMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"}],"name":"BidRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minValue","type":"uint256"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"OfferMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"OfferRemoved","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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"PurchaseMade","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_minSalePriceInWei","type":"uint256"}],"name":"acceptBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bids","outputs":[{"internalType":"bool","name":"hasBid","type":"bool"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imageHash","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"_tokenId","type":"uint256"}],"name":"makeBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_minSalePriceInWei","type":"uint256"}],"name":"makeOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_minSalePriceInWei","type":"uint256"},{"internalType":"address","name":"_toAddress","type":"address"}],"name":"makeOfferToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"mintAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"offers","outputs":[{"internalType":"bool","name":"isForSale","type":"bool"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"address","name":"onlySellTo","type":"address"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"pendingWithdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseTokenURI","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":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawOffer","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600881526020017f726f626f626f747300000000000000000000000000000000000000000000000081525060059080519060200190620001939291906200021a565b506040518060400160405280600481526020017ff09fa4960000000000000000000000000000000000000000000000000000000081525060069080519060200190620001e19291906200021a565b506040518060600160405280602b815260200162005e78602b913960079080519060200190620002139291906200021a565b506200032f565b8280546200022890620002ca565b90600052602060002090601f0160209004810192826200024c576000855562000298565b82601f106200026757805160ff191683800117855562000298565b8280016001018555821562000298579182015b82811115620002975782518255916020019190600101906200027a565b5b509050620002a79190620002ab565b5090565b5b80821115620002c6576000816000905550600101620002ac565b5090565b60006002820490506001821680620002e357607f821691505b60208210811415620002fa57620002f962000300565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615b39806200033f6000396000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063ae0b61ba116100a0578063d96a094a1161006f578063d96a094a14610725578063e985e9c514610741578063f2fde38b1461077e578063f3f43703146107a7578063f3fe3bc3146107e4576101f9565b8063ae0b61ba1461066d578063b88d4fde14610696578063c87b56dd146106bf578063c99fef70146106fc576101f9565b80638a72ea6a116100dc5780638a72ea6a146105ad5780638da5cb5b146105ee57806395d89b4114610619578063a22cb46514610644576101f9565b806370a08231146104f15780637fd6f15c1461052e578063860d248a146105595780638610f04514610584576101f9565b806318160ddd1161019057806340c10f191161015f57806340c10f19146103f757806342842e0e146104205780634423c5f11461044957806351605d80146104895780636352211e146104b4576101f9565b806318160ddd1461036357806323b872dd1461038e57806324600fc3146103b757806330176e13146103ce576101f9565b8063081812fc116101cc578063081812fc146102b8578063095ea7b3146102f55780630eaaf4c81461031e578063175b230414610347576101f9565b806301ffc9a7146101fe57806302e9d5e41461023b57806305b7cdd31461026457806306fdde031461028d575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190615189565b61080f565b60405161023291906154ca565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d919061525d565b610876565b005b34801561027057600080fd5b5061028b6004803603810190610286919061525d565b610db2565b005b34801561029957600080fd5b506102a26110a8565b6040516102af919061557d565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190615230565b61113a565b6040516102ec9190615463565b60405180910390f35b34801561030157600080fd5b5061031c600480360381019061031791906150d1565b611255565b005b34801561032a57600080fd5b5061034560048036038101906103409190615230565b611638565b005b610361600480360381019061035c9190615230565b611940565b005b34801561036f57600080fd5b50610378611e24565b604051610385919061559f565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190614fb6565b611e2a565b005b3480156103c357600080fd5b506103cc61227c565b005b3480156103da57600080fd5b506103f560048036038101906103f091906151e3565b61234f565b005b34801561040357600080fd5b5061041e600480360381019061041991906150d1565b61242e565b005b34801561042c57600080fd5b5061044760048036038101906104429190614fb6565b6124b9565b005b34801561045557600080fd5b50610470600480360381019061046b9190615230565b6124d9565b60405161048094939291906154e5565b60405180910390f35b34801561049557600080fd5b5061049e612536565b6040516104ab919061557d565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190615230565b612552565b6040516104e89190615463565b60405180910390f35b3480156104fd57600080fd5b5061051860048036038101906105139190614f49565b612638565b604051610525919061559f565b60405180910390f35b34801561053a57600080fd5b506105436126f2565b604051610550919061559f565b60405180910390f35b34801561056557600080fd5b5061056e6126f7565b60405161057b919061557d565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190615230565b612730565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190615230565b6128af565b6040516105e595949392919061552a565b60405180910390f35b3480156105fa57600080fd5b50610603612932565b6040516106109190615463565b60405180910390f35b34801561062557600080fd5b5061062e612958565b60405161063b919061557d565b60405180910390f35b34801561065057600080fd5b5061066b60048036038101906106669190615091565b6129ea565b005b34801561067957600080fd5b50610694600480360381019061068f9190615111565b612ae7565b005b3480156106a257600080fd5b506106bd60048036038101906106b89190615009565b612caf565b005b3480156106cb57600080fd5b506106e660048036038101906106e19190615230565b612d06565b6040516106f3919061557d565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e919061529d565b612e18565b005b61073f600480360381019061073a9190615230565b61310d565b005b34801561074d57600080fd5b5061076860048036038101906107639190614f76565b613811565b60405161077591906154ca565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190614f49565b6138a5565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190614f49565b613ad7565b6040516107db919061559f565b60405180910390f35b3480156107f057600080fd5b506107f9613aef565b604051610806919061557d565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061096f5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906109e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dd919061557d565b60405180910390fd5b5060003390506000600a60008781526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481525050905080600001516040518060400160405280600681526020017f303034303035000000000000000000000000000000000000000000000000000081525090610b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b06919061557d565b60405180910390fd5b5060008160600151116040518060400160405280600681526020017f303034303037000000000000000000000000000000000000000000000000000081525090610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b86919061557d565b60405180910390fd5b5084816060015110156040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c06919061557d565b60405180910390fd5b50610c1e816040015187613b28565b600081606001519050610c3087613b3f565b6000610c596064610c4b600185613d0f90919063ffffffff16565b613d2590919063ffffffff16565b905060008183610c699190615770565b905081600b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610cdc919061568f565b9250508190555080600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d32919061568f565b92505081905550836040015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168a7fb04d24cdcf6af8f0958f4d472da766e8b3f6ff75a3b24b3658f9bfa7c30dd7968760600151604051610d9f919061559f565b60405180910390a4505050505050505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610eab5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f19919061557d565b60405180910390fd5b506040518060a001604052806001151581526020018581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001848152602001600073ffffffffffffffffffffffffffffffffffffffff168152506009600086815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600073ffffffffffffffffffffffffffffffffffffffff16847f53658d2ac4988b1c671f54219e366b4c7cdebdbfd92fd0762b1524d9abbc5cc18560405161109a919061559f565b60405180910390a350505050565b6060600580546110b790615875565b80601f01602080910402602001604051908101604052809291908181526020018280546110e390615875565b80156111305780601f1061110557610100808354040283529160200191611130565b820191906000526020600020905b81548152906001019060200180831161111357829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f919061557d565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061134e5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc919061557d565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906114a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611499919061557d565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579919061557d565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab919061557d565b60405180910390fd5b503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303430303400000000000000000000000000000000000000000000000000008152509061178f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611786919061557d565b60405180910390fd5b506000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030343030360000000000000000000000000000000000000000000000000000815250906118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d8919061557d565b60405180910390fd5b506000816060015190506118f483613b3f565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561193a573d6000803e3d6000fd5b50505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b3919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f919061557d565b60405180910390fd5b503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303034303034000000000000000000000000000000000000000000000000000081525090611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a919061557d565b60405180910390fd5b506000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815250509050806060015134116040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c90919061557d565b60405180910390fd5b50600081606001511115611d06578060600151600b6000836040015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cfe919061568f565b925050819055505b60405180608001604052806001151581526020018381526020013373ffffffffffffffffffffffffffffffffffffffff16815260200134815250600a600084815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301559050503373ffffffffffffffffffffffffffffffffffffffff16827f2db9bd3d5e680e2159753ffc16e1709fb0e786ca24553a511f64e3c6a7d4b70a34604051611e18919061559f565b60405180910390a35050565b61271081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611efb57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611f8c5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa919061557d565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7919061557d565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b6919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225f919061557d565b60405180910390fd5b506122738686613b28565b50505050505050565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561234b573d6000803e3d6000fd5b5050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e919061557d565b60405180910390fd5b50818160079190612429929190614c55565b505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a1919061557d565b60405180910390fd5b506124b58282613d3b565b5050565b6124d483838360405180602001604052806000815250613f29565b505050565b600a6020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905084565b604051806060016040528060408152602001615ac46040913981565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612629919061557d565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d8919061557d565b60405180910390fd5b506126eb826144f7565b9050919050565b600181565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806128295750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906128a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612897919061557d565b60405180910390fd5b506128aa83614540565b505050565b60096020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461296790615875565b80601f016020809104026020016040519081016040528092919081815260200182805461299390615875565b80156129e05780601f106129b5576101008083540402835291602001916129e0565b820191906000526020600020905b8154815290600101906020018083116129c357829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612adb91906154ca565b60405180910390a35050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba6919061557d565b60405180910390fd5b5060008251905060005b81811015612ca957612710838281518110612bd757612bd66159df565b5b6020026020010151106040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4e919061557d565b60405180910390fd5b50612c96848281518110612c6e57612c6d6159df565b5b6020026020010151848381518110612c8957612c886159df565b5b6020026020010151613d3b565b8080612ca1906158d8565b915050612bb9565b50505050565b612cff85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613f29565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddb919061557d565b60405180910390fd5b506007612df0846146cb565b604051602001612e0192919061543f565b604051602081830303815290604052915050919050565b8260006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612f115750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090612f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7f919061557d565b60405180910390fd5b506040518060a001604052806001151581526020018681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff168152506009600087815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508273ffffffffffffffffffffffffffffffffffffffff16857f53658d2ac4988b1c671f54219e366b4c7cdebdbfd92fd0762b1524d9abbc5cc1866040516130fe919061559f565b60405180910390a35050505050565b61271081106040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090613189576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613180919061557d565b60405180910390fd5b506000600960008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905080600001516040518060400160405280600681526020017f303034303031000000000000000000000000000000000000000000000000000081525090613303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fa919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16148061337257503373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600681526020017f3030343030320000000000000000000000000000000000000000000000000000815250906133e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e0919061557d565b60405180910390fd5b5080606001513410156040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090613469576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613460919061557d565b60405180910390fd5b506000816040015190506001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303430303700000000000000000000000000000000000000000000000000008152509061354c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613543919061557d565b60405180910390fd5b506135573384613b28565b60006135806064613572600134613d0f90919063ffffffff16565b613d2590919063ffffffff16565b9050600081346135909190615770565b905081600b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613603919061568f565b9250508190555080600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613659919061568f565b925050819055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16867fb04d24cdcf6af8f0958f4d472da766e8b3f6ff75a3b24b3658f9bfa7c30dd796346040516136be919061559f565b60405180910390a46000600a60008781526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff161415613809578060600151600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137f8919061568f565b9250508190555061380886613b3f565b5b505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061396d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613964919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090613a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0d919061557d565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b6020528060005260406000206000915090505481565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b613b328282614829565b613b3b81614540565b5050565b6000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815250509050604051806080016040528060001515815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600a600084815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155905050806040015173ffffffffffffffffffffffffffffffffffffffff16827f4a096bfd874de7130bbce9d6635f0a77646b227b594b1b1b34d174e05be363dc8360600151604051613d03919061559f565b60405180910390a35050565b60008183613d1d9190615716565b905092915050565b60008183613d3391906156e5565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dda919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eb5919061557d565b60405180910390fd5b50613ec982826148de565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480613ffa57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061408b5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090614102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140f9919061557d565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906141df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141d6919061557d565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906142be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142b5919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090614367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435e919061557d565b60405180910390fd5b506143728787613b28565b6143918773ffffffffffffffffffffffffffffffffffffffff16614a66565b156144ed5760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016143d7949392919061547e565b602060405180830381600087803b1580156143f157600080fd5b505af1158015614405573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061442991906151b6565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906144ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144e1919061557d565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6009600082815260200190815260200160002060000160009054906101000a900460ff16156146c8576040518060a00160405280600015158152602001828152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152506009600083815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050807fe78251393d13c4f887458774ea505a80414b5608a0c963bb2e75da45811919f160405160405180910390a25b50565b60606000821415614713576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614824565b600082905060005b6000821461474557808061472e906158d8565b915050600a8261473e91906156e5565b915061471b565b60008167ffffffffffffffff81111561476157614760615a0e565b5b6040519080825280601f01601f1916602001820160405280156147935781602001600182028036833780820191505090505b5090505b6000851461481d57600a856147ac9190615921565b60306147b8919061568f565b60f81b81836147c69061584b565b935083815181106147da576147d96159df565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561481691906156e5565b9450614797565b8093505050505b919050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061486a82614ab1565b6148748183614aea565b61487e83836148de565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906149b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016149af919061557d565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614a5b919061568f565b925050819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015614aa85750808214155b92505050919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090614bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614bba919061557d565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614c149190615770565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b828054614c6190615875565b90600052602060002090601f016020900481019282614c835760008555614cca565b82601f10614c9c57803560ff1916838001178555614cca565b82800160010185558215614cca579182015b82811115614cc9578235825591602001919060010190614cae565b5b509050614cd79190614cdb565b5090565b5b80821115614cf4576000816000905550600101614cdc565b5090565b6000614d0b614d06846155df565b6155ba565b90508083825260208201905082856020860282011115614d2e57614d2d615a47565b5b60005b85811015614d5e5781614d448882614dd8565b845260208401935060208301925050600181019050614d31565b5050509392505050565b6000614d7b614d768461560b565b6155ba565b90508083825260208201905082856020860282011115614d9e57614d9d615a47565b5b60005b85811015614dce5781614db48882614f34565b845260208401935060208301925050600181019050614da1565b5050509392505050565b600081359050614de781615a67565b92915050565b600082601f830112614e0257614e01615a42565b5b8135614e12848260208601614cf8565b91505092915050565b600082601f830112614e3057614e2f615a42565b5b8135614e40848260208601614d68565b91505092915050565b600081359050614e5881615a7e565b92915050565b600081359050614e6d81615a95565b92915050565b600081519050614e8281615a95565b92915050565b60008083601f840112614e9e57614e9d615a42565b5b8235905067ffffffffffffffff811115614ebb57614eba615a3d565b5b602083019150836001820283011115614ed757614ed6615a47565b5b9250929050565b60008083601f840112614ef457614ef3615a42565b5b8235905067ffffffffffffffff811115614f1157614f10615a3d565b5b602083019150836001820283011115614f2d57614f2c615a47565b5b9250929050565b600081359050614f4381615aac565b92915050565b600060208284031215614f5f57614f5e615a51565b5b6000614f6d84828501614dd8565b91505092915050565b60008060408385031215614f8d57614f8c615a51565b5b6000614f9b85828601614dd8565b9250506020614fac85828601614dd8565b9150509250929050565b600080600060608486031215614fcf57614fce615a51565b5b6000614fdd86828701614dd8565b9350506020614fee86828701614dd8565b9250506040614fff86828701614f34565b9150509250925092565b60008060008060006080868803121561502557615024615a51565b5b600061503388828901614dd8565b955050602061504488828901614dd8565b945050604061505588828901614f34565b935050606086013567ffffffffffffffff81111561507657615075615a4c565b5b61508288828901614e88565b92509250509295509295909350565b600080604083850312156150a8576150a7615a51565b5b60006150b685828601614dd8565b92505060206150c785828601614e49565b9150509250929050565b600080604083850312156150e8576150e7615a51565b5b60006150f685828601614dd8565b925050602061510785828601614f34565b9150509250929050565b6000806040838503121561512857615127615a51565b5b600083013567ffffffffffffffff81111561514657615145615a4c565b5b61515285828601614ded565b925050602083013567ffffffffffffffff81111561517357615172615a4c565b5b61517f85828601614e1b565b9150509250929050565b60006020828403121561519f5761519e615a51565b5b60006151ad84828501614e5e565b91505092915050565b6000602082840312156151cc576151cb615a51565b5b60006151da84828501614e73565b91505092915050565b600080602083850312156151fa576151f9615a51565b5b600083013567ffffffffffffffff81111561521857615217615a4c565b5b61522485828601614ede565b92509250509250929050565b60006020828403121561524657615245615a51565b5b600061525484828501614f34565b91505092915050565b6000806040838503121561527457615273615a51565b5b600061528285828601614f34565b925050602061529385828601614f34565b9150509250929050565b6000806000606084860312156152b6576152b5615a51565b5b60006152c486828701614f34565b93505060206152d586828701614f34565b92505060406152e686828701614dd8565b9150509250925092565b6152f9816157a4565b82525050565b615308816157b6565b82525050565b60006153198261564c565b6153238185615662565b9350615333818560208601615818565b61533c81615a56565b840191505092915050565b600061535282615657565b61535c8185615673565b935061536c818560208601615818565b61537581615a56565b840191505092915050565b600061538b82615657565b6153958185615684565b93506153a5818560208601615818565b80840191505092915050565b600081546153be81615875565b6153c88186615684565b945060018216600081146153e357600181146153f457615427565b60ff19831686528186019350615427565b6153fd85615637565b60005b8381101561541f57815481890152600182019150602081019050615400565b838801955050505b50505092915050565b6154398161580e565b82525050565b600061544b82856153b1565b91506154578284615380565b91508190509392505050565b600060208201905061547860008301846152f0565b92915050565b600060808201905061549360008301876152f0565b6154a060208301866152f0565b6154ad6040830185615430565b81810360608301526154bf818461530e565b905095945050505050565b60006020820190506154df60008301846152ff565b92915050565b60006080820190506154fa60008301876152ff565b6155076020830186615430565b61551460408301856152f0565b6155216060830184615430565b95945050505050565b600060a08201905061553f60008301886152ff565b61554c6020830187615430565b61555960408301866152f0565b6155666060830185615430565b61557360808301846152f0565b9695505050505050565b600060208201905081810360008301526155978184615347565b905092915050565b60006020820190506155b46000830184615430565b92915050565b60006155c46155d5565b90506155d082826158a7565b919050565b6000604051905090565b600067ffffffffffffffff8211156155fa576155f9615a0e565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561562657615625615a0e565b5b602082029050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061569a8261580e565b91506156a58361580e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156156da576156d9615952565b5b828201905092915050565b60006156f08261580e565b91506156fb8361580e565b92508261570b5761570a615981565b5b828204905092915050565b60006157218261580e565b915061572c8361580e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561576557615764615952565b5b828202905092915050565b600061577b8261580e565b91506157868361580e565b92508282101561579957615798615952565b5b828203905092915050565b60006157af826157ee565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561583657808201518184015260208101905061581b565b83811115615845576000848401525b50505050565b60006158568261580e565b9150600082141561586a57615869615952565b5b600182039050919050565b6000600282049050600182168061588d57607f821691505b602082108114156158a1576158a06159b0565b5b50919050565b6158b082615a56565b810181811067ffffffffffffffff821117156158cf576158ce615a0e565b5b80604052505050565b60006158e38261580e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561591657615915615952565b5b600182019050919050565b600061592c8261580e565b91506159378361580e565b92508261594757615946615981565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b615a70816157a4565b8114615a7b57600080fd5b50565b615a87816157b6565b8114615a9257600080fd5b50565b615a9e816157c2565b8114615aa957600080fd5b50565b615ab58161580e565b8114615ac057600080fd5b5056fe64346335653336653030616238636566616530663363303461643134663731323039653735383937613964643161336535396130316135316265376466626630a2646970667358221220be539e2c3ccdf3b83c01ee223d1f01073960383b2543701df5fdfc0b4561789d64736f6c6343000806003368747470733a2f2f726f626f626f74732d66373966382e7765622e6170702f6d657461646174612f626f74

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806370a082311161010d578063ae0b61ba116100a0578063d96a094a1161006f578063d96a094a14610725578063e985e9c514610741578063f2fde38b1461077e578063f3f43703146107a7578063f3fe3bc3146107e4576101f9565b8063ae0b61ba1461066d578063b88d4fde14610696578063c87b56dd146106bf578063c99fef70146106fc576101f9565b80638a72ea6a116100dc5780638a72ea6a146105ad5780638da5cb5b146105ee57806395d89b4114610619578063a22cb46514610644576101f9565b806370a08231146104f15780637fd6f15c1461052e578063860d248a146105595780638610f04514610584576101f9565b806318160ddd1161019057806340c10f191161015f57806340c10f19146103f757806342842e0e146104205780634423c5f11461044957806351605d80146104895780636352211e146104b4576101f9565b806318160ddd1461036357806323b872dd1461038e57806324600fc3146103b757806330176e13146103ce576101f9565b8063081812fc116101cc578063081812fc146102b8578063095ea7b3146102f55780630eaaf4c81461031e578063175b230414610347576101f9565b806301ffc9a7146101fe57806302e9d5e41461023b57806305b7cdd31461026457806306fdde031461028d575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190615189565b61080f565b60405161023291906154ca565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d919061525d565b610876565b005b34801561027057600080fd5b5061028b6004803603810190610286919061525d565b610db2565b005b34801561029957600080fd5b506102a26110a8565b6040516102af919061557d565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190615230565b61113a565b6040516102ec9190615463565b60405180910390f35b34801561030157600080fd5b5061031c600480360381019061031791906150d1565b611255565b005b34801561032a57600080fd5b5061034560048036038101906103409190615230565b611638565b005b610361600480360381019061035c9190615230565b611940565b005b34801561036f57600080fd5b50610378611e24565b604051610385919061559f565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190614fb6565b611e2a565b005b3480156103c357600080fd5b506103cc61227c565b005b3480156103da57600080fd5b506103f560048036038101906103f091906151e3565b61234f565b005b34801561040357600080fd5b5061041e600480360381019061041991906150d1565b61242e565b005b34801561042c57600080fd5b5061044760048036038101906104429190614fb6565b6124b9565b005b34801561045557600080fd5b50610470600480360381019061046b9190615230565b6124d9565b60405161048094939291906154e5565b60405180910390f35b34801561049557600080fd5b5061049e612536565b6040516104ab919061557d565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190615230565b612552565b6040516104e89190615463565b60405180910390f35b3480156104fd57600080fd5b5061051860048036038101906105139190614f49565b612638565b604051610525919061559f565b60405180910390f35b34801561053a57600080fd5b506105436126f2565b604051610550919061559f565b60405180910390f35b34801561056557600080fd5b5061056e6126f7565b60405161057b919061557d565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190615230565b612730565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190615230565b6128af565b6040516105e595949392919061552a565b60405180910390f35b3480156105fa57600080fd5b50610603612932565b6040516106109190615463565b60405180910390f35b34801561062557600080fd5b5061062e612958565b60405161063b919061557d565b60405180910390f35b34801561065057600080fd5b5061066b60048036038101906106669190615091565b6129ea565b005b34801561067957600080fd5b50610694600480360381019061068f9190615111565b612ae7565b005b3480156106a257600080fd5b506106bd60048036038101906106b89190615009565b612caf565b005b3480156106cb57600080fd5b506106e660048036038101906106e19190615230565b612d06565b6040516106f3919061557d565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e919061529d565b612e18565b005b61073f600480360381019061073a9190615230565b61310d565b005b34801561074d57600080fd5b5061076860048036038101906107639190614f76565b613811565b60405161077591906154ca565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190614f49565b6138a5565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190614f49565b613ad7565b6040516107db919061559f565b60405180910390f35b3480156107f057600080fd5b506107f9613aef565b604051610806919061557d565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061096f5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906109e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dd919061557d565b60405180910390fd5b5060003390506000600a60008781526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481525050905080600001516040518060400160405280600681526020017f303034303035000000000000000000000000000000000000000000000000000081525090610b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b06919061557d565b60405180910390fd5b5060008160600151116040518060400160405280600681526020017f303034303037000000000000000000000000000000000000000000000000000081525090610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b86919061557d565b60405180910390fd5b5084816060015110156040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c06919061557d565b60405180910390fd5b50610c1e816040015187613b28565b600081606001519050610c3087613b3f565b6000610c596064610c4b600185613d0f90919063ffffffff16565b613d2590919063ffffffff16565b905060008183610c699190615770565b905081600b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610cdc919061568f565b9250508190555080600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d32919061568f565b92505081905550836040015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168a7fb04d24cdcf6af8f0958f4d472da766e8b3f6ff75a3b24b3658f9bfa7c30dd7968760600151604051610d9f919061559f565b60405180910390a4505050505050505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610eab5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f19919061557d565b60405180910390fd5b506040518060a001604052806001151581526020018581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001848152602001600073ffffffffffffffffffffffffffffffffffffffff168152506009600086815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600073ffffffffffffffffffffffffffffffffffffffff16847f53658d2ac4988b1c671f54219e366b4c7cdebdbfd92fd0762b1524d9abbc5cc18560405161109a919061559f565b60405180910390a350505050565b6060600580546110b790615875565b80601f01602080910402602001604051908101604052809291908181526020018280546110e390615875565b80156111305780601f1061110557610100808354040283529160200191611130565b820191906000526020600020905b81548152906001019060200180831161111357829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f919061557d565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061134e5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc919061557d565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906114a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611499919061557d565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579919061557d565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab919061557d565b60405180910390fd5b503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303430303400000000000000000000000000000000000000000000000000008152509061178f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611786919061557d565b60405180910390fd5b506000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030343030360000000000000000000000000000000000000000000000000000815250906118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d8919061557d565b60405180910390fd5b506000816060015190506118f483613b3f565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561193a573d6000803e3d6000fd5b50505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b3919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f919061557d565b60405180910390fd5b503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303034303034000000000000000000000000000000000000000000000000000081525090611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a919061557d565b60405180910390fd5b506000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815250509050806060015134116040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c90919061557d565b60405180910390fd5b50600081606001511115611d06578060600151600b6000836040015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cfe919061568f565b925050819055505b60405180608001604052806001151581526020018381526020013373ffffffffffffffffffffffffffffffffffffffff16815260200134815250600a600084815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301559050503373ffffffffffffffffffffffffffffffffffffffff16827f2db9bd3d5e680e2159753ffc16e1709fb0e786ca24553a511f64e3c6a7d4b70a34604051611e18919061559f565b60405180910390a35050565b61271081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611efb57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611f8c5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa919061557d565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7919061557d565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b6919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225f919061557d565b60405180910390fd5b506122738686613b28565b50505050505050565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561234b573d6000803e3d6000fd5b5050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e919061557d565b60405180910390fd5b50818160079190612429929190614c55565b505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a1919061557d565b60405180910390fd5b506124b58282613d3b565b5050565b6124d483838360405180602001604052806000815250613f29565b505050565b600a6020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905084565b604051806060016040528060408152602001615ac46040913981565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612629919061557d565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d8919061557d565b60405180910390fd5b506126eb826144f7565b9050919050565b600181565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806128295750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906128a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612897919061557d565b60405180910390fd5b506128aa83614540565b505050565b60096020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461296790615875565b80601f016020809104026020016040519081016040528092919081815260200182805461299390615875565b80156129e05780601f106129b5576101008083540402835291602001916129e0565b820191906000526020600020905b8154815290600101906020018083116129c357829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612adb91906154ca565b60405180910390a35050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba6919061557d565b60405180910390fd5b5060008251905060005b81811015612ca957612710838281518110612bd757612bd66159df565b5b6020026020010151106040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4e919061557d565b60405180910390fd5b50612c96848281518110612c6e57612c6d6159df565b5b6020026020010151848381518110612c8957612c886159df565b5b6020026020010151613d3b565b8080612ca1906158d8565b915050612bb9565b50505050565b612cff85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613f29565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddb919061557d565b60405180910390fd5b506007612df0846146cb565b604051602001612e0192919061543f565b604051602081830303815290604052915050919050565b8260006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612f115750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090612f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7f919061557d565b60405180910390fd5b506040518060a001604052806001151581526020018681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff168152506009600087815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508273ffffffffffffffffffffffffffffffffffffffff16857f53658d2ac4988b1c671f54219e366b4c7cdebdbfd92fd0762b1524d9abbc5cc1866040516130fe919061559f565b60405180910390a35050505050565b61271081106040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090613189576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613180919061557d565b60405180910390fd5b506000600960008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905080600001516040518060400160405280600681526020017f303034303031000000000000000000000000000000000000000000000000000081525090613303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fa919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16148061337257503373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600681526020017f3030343030320000000000000000000000000000000000000000000000000000815250906133e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e0919061557d565b60405180910390fd5b5080606001513410156040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090613469576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613460919061557d565b60405180910390fd5b506000816040015190506001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303430303700000000000000000000000000000000000000000000000000008152509061354c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613543919061557d565b60405180910390fd5b506135573384613b28565b60006135806064613572600134613d0f90919063ffffffff16565b613d2590919063ffffffff16565b9050600081346135909190615770565b905081600b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613603919061568f565b9250508190555080600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613659919061568f565b925050819055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16867fb04d24cdcf6af8f0958f4d472da766e8b3f6ff75a3b24b3658f9bfa7c30dd796346040516136be919061559f565b60405180910390a46000600a60008781526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff161415613809578060600151600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137f8919061568f565b9250508190555061380886613b3f565b5b505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061396d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613964919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090613a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0d919061557d565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b6020528060005260406000206000915090505481565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b613b328282614829565b613b3b81614540565b5050565b6000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815250509050604051806080016040528060001515815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600a600084815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155905050806040015173ffffffffffffffffffffffffffffffffffffffff16827f4a096bfd874de7130bbce9d6635f0a77646b227b594b1b1b34d174e05be363dc8360600151604051613d03919061559f565b60405180910390a35050565b60008183613d1d9190615716565b905092915050565b60008183613d3391906156e5565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dda919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eb5919061557d565b60405180910390fd5b50613ec982826148de565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480613ffa57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061408b5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090614102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140f9919061557d565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906141df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141d6919061557d565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906142be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142b5919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090614367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435e919061557d565b60405180910390fd5b506143728787613b28565b6143918773ffffffffffffffffffffffffffffffffffffffff16614a66565b156144ed5760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016143d7949392919061547e565b602060405180830381600087803b1580156143f157600080fd5b505af1158015614405573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061442991906151b6565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906144ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144e1919061557d565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6009600082815260200190815260200160002060000160009054906101000a900460ff16156146c8576040518060a00160405280600015158152602001828152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152506009600083815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050807fe78251393d13c4f887458774ea505a80414b5608a0c963bb2e75da45811919f160405160405180910390a25b50565b60606000821415614713576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614824565b600082905060005b6000821461474557808061472e906158d8565b915050600a8261473e91906156e5565b915061471b565b60008167ffffffffffffffff81111561476157614760615a0e565b5b6040519080825280601f01601f1916602001820160405280156147935781602001600182028036833780820191505090505b5090505b6000851461481d57600a856147ac9190615921565b60306147b8919061568f565b60f81b81836147c69061584b565b935083815181106147da576147d96159df565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561481691906156e5565b9450614797565b8093505050505b919050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061486a82614ab1565b6148748183614aea565b61487e83836148de565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906149b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016149af919061557d565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614a5b919061568f565b925050819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015614aa85750808214155b92505050919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090614bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614bba919061557d565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614c149190615770565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b828054614c6190615875565b90600052602060002090601f016020900481019282614c835760008555614cca565b82601f10614c9c57803560ff1916838001178555614cca565b82800160010185558215614cca579182015b82811115614cc9578235825591602001919060010190614cae565b5b509050614cd79190614cdb565b5090565b5b80821115614cf4576000816000905550600101614cdc565b5090565b6000614d0b614d06846155df565b6155ba565b90508083825260208201905082856020860282011115614d2e57614d2d615a47565b5b60005b85811015614d5e5781614d448882614dd8565b845260208401935060208301925050600181019050614d31565b5050509392505050565b6000614d7b614d768461560b565b6155ba565b90508083825260208201905082856020860282011115614d9e57614d9d615a47565b5b60005b85811015614dce5781614db48882614f34565b845260208401935060208301925050600181019050614da1565b5050509392505050565b600081359050614de781615a67565b92915050565b600082601f830112614e0257614e01615a42565b5b8135614e12848260208601614cf8565b91505092915050565b600082601f830112614e3057614e2f615a42565b5b8135614e40848260208601614d68565b91505092915050565b600081359050614e5881615a7e565b92915050565b600081359050614e6d81615a95565b92915050565b600081519050614e8281615a95565b92915050565b60008083601f840112614e9e57614e9d615a42565b5b8235905067ffffffffffffffff811115614ebb57614eba615a3d565b5b602083019150836001820283011115614ed757614ed6615a47565b5b9250929050565b60008083601f840112614ef457614ef3615a42565b5b8235905067ffffffffffffffff811115614f1157614f10615a3d565b5b602083019150836001820283011115614f2d57614f2c615a47565b5b9250929050565b600081359050614f4381615aac565b92915050565b600060208284031215614f5f57614f5e615a51565b5b6000614f6d84828501614dd8565b91505092915050565b60008060408385031215614f8d57614f8c615a51565b5b6000614f9b85828601614dd8565b9250506020614fac85828601614dd8565b9150509250929050565b600080600060608486031215614fcf57614fce615a51565b5b6000614fdd86828701614dd8565b9350506020614fee86828701614dd8565b9250506040614fff86828701614f34565b9150509250925092565b60008060008060006080868803121561502557615024615a51565b5b600061503388828901614dd8565b955050602061504488828901614dd8565b945050604061505588828901614f34565b935050606086013567ffffffffffffffff81111561507657615075615a4c565b5b61508288828901614e88565b92509250509295509295909350565b600080604083850312156150a8576150a7615a51565b5b60006150b685828601614dd8565b92505060206150c785828601614e49565b9150509250929050565b600080604083850312156150e8576150e7615a51565b5b60006150f685828601614dd8565b925050602061510785828601614f34565b9150509250929050565b6000806040838503121561512857615127615a51565b5b600083013567ffffffffffffffff81111561514657615145615a4c565b5b61515285828601614ded565b925050602083013567ffffffffffffffff81111561517357615172615a4c565b5b61517f85828601614e1b565b9150509250929050565b60006020828403121561519f5761519e615a51565b5b60006151ad84828501614e5e565b91505092915050565b6000602082840312156151cc576151cb615a51565b5b60006151da84828501614e73565b91505092915050565b600080602083850312156151fa576151f9615a51565b5b600083013567ffffffffffffffff81111561521857615217615a4c565b5b61522485828601614ede565b92509250509250929050565b60006020828403121561524657615245615a51565b5b600061525484828501614f34565b91505092915050565b6000806040838503121561527457615273615a51565b5b600061528285828601614f34565b925050602061529385828601614f34565b9150509250929050565b6000806000606084860312156152b6576152b5615a51565b5b60006152c486828701614f34565b93505060206152d586828701614f34565b92505060406152e686828701614dd8565b9150509250925092565b6152f9816157a4565b82525050565b615308816157b6565b82525050565b60006153198261564c565b6153238185615662565b9350615333818560208601615818565b61533c81615a56565b840191505092915050565b600061535282615657565b61535c8185615673565b935061536c818560208601615818565b61537581615a56565b840191505092915050565b600061538b82615657565b6153958185615684565b93506153a5818560208601615818565b80840191505092915050565b600081546153be81615875565b6153c88186615684565b945060018216600081146153e357600181146153f457615427565b60ff19831686528186019350615427565b6153fd85615637565b60005b8381101561541f57815481890152600182019150602081019050615400565b838801955050505b50505092915050565b6154398161580e565b82525050565b600061544b82856153b1565b91506154578284615380565b91508190509392505050565b600060208201905061547860008301846152f0565b92915050565b600060808201905061549360008301876152f0565b6154a060208301866152f0565b6154ad6040830185615430565b81810360608301526154bf818461530e565b905095945050505050565b60006020820190506154df60008301846152ff565b92915050565b60006080820190506154fa60008301876152ff565b6155076020830186615430565b61551460408301856152f0565b6155216060830184615430565b95945050505050565b600060a08201905061553f60008301886152ff565b61554c6020830187615430565b61555960408301866152f0565b6155666060830185615430565b61557360808301846152f0565b9695505050505050565b600060208201905081810360008301526155978184615347565b905092915050565b60006020820190506155b46000830184615430565b92915050565b60006155c46155d5565b90506155d082826158a7565b919050565b6000604051905090565b600067ffffffffffffffff8211156155fa576155f9615a0e565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561562657615625615a0e565b5b602082029050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061569a8261580e565b91506156a58361580e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156156da576156d9615952565b5b828201905092915050565b60006156f08261580e565b91506156fb8361580e565b92508261570b5761570a615981565b5b828204905092915050565b60006157218261580e565b915061572c8361580e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561576557615764615952565b5b828202905092915050565b600061577b8261580e565b91506157868361580e565b92508282101561579957615798615952565b5b828203905092915050565b60006157af826157ee565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561583657808201518184015260208101905061581b565b83811115615845576000848401525b50505050565b60006158568261580e565b9150600082141561586a57615869615952565b5b600182039050919050565b6000600282049050600182168061588d57607f821691505b602082108114156158a1576158a06159b0565b5b50919050565b6158b082615a56565b810181811067ffffffffffffffff821117156158cf576158ce615a0e565b5b80604052505050565b60006158e38261580e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561591657615915615952565b5b600182019050919050565b600061592c8261580e565b91506159378361580e565b92508261594757615946615981565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b615a70816157a4565b8114615a7b57600080fd5b50565b615a87816157b6565b8114615a9257600080fd5b50565b615a9e816157c2565b8114615aa957600080fd5b50565b615ab58161580e565b8114615ac057600080fd5b5056fe64346335653336653030616238636566616530663363303461643134663731323039653735383937613964643161336535396130316135316265376466626630a2646970667358221220be539e2c3ccdf3b83c01ee223d1f01073960383b2543701df5fdfc0b4561789d64736f6c63430008060033

Deployed Bytecode Sourcemap

35492:9405:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8932:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42679:818;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38726:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25531:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18443:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16228:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43615:424;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41767:648;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36035:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15454:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41377:271;;;;;;;;;;;;;:::i;:::-;;37519:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37806:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14699:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36679:33;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;35927:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17991:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17517:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36085:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27248:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39715:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36589:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;27368:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25785:136;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16991:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38226:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14079:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26111:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39275:291;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39947:1323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18895:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28193:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36781:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27192;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8932:172;9042:4;9065:19;:33;9085:12;9065:33;;;;;;;;;;;;;;;;;;;;;;;;;;;9058:40;;8932:172;;;:::o;42679:818::-;42761:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42782:14:::1;42799:10;42782:27;;42820:14;42837:4;:14;42842:8;42837:14;;;;;;;;;;;42820:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;42870:3;:10;;;42882:11;;;;;;;;;;;;;;;;::::0;42862:32:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42925:1;42913:3;:9;;;:13;42928:22;;;;;;;;;;;;;;;;::::0;42905:46:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42983:18;42970:3;:9;;;:31;;43003:18;;;;;;;;;;;;;;;;::::0;42962:60:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43065:31;43075:3;:10;;;43087:8;43065:9;:31::i;:::-;43109:11;43123:3;:9;;;43109:23;;43143:20;43154:8;43143:10;:20::i;:::-;43239:11;43253:33;43282:3;43254:22;36122:1;43254:6;:10;;:22;;;;:::i;:::-;43253:28;;:33;;;;:::i;:::-;43239:47;;43297:16;43325:3;43316:6;:12;;;;:::i;:::-;43297:31;;43368:3;43339:18;:25;43358:5;;;;;;;;;;;43339:25;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;43412:8;43382:18;:26;43401:6;43382:26;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;43478:3;:10;;;43436:53;;43470:6;43436:53;;43449:8;43436:53;43459:3;:9;;;43436:53;;;;;;:::i;:::-;;;;;;;;42771:726;;;;;12188:189:::0;42679:818;;;:::o;38726:262::-;38808:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38848:65:::1;;;;;;;;38854:4;38848:65;;;;;;38860:8;38848:65;;;;38870:10;38848:65;;;;;;38882:18;38848:65;;;;38910:1;38848:65;;;;::::0;38829:6:::1;:16;38836:8;38829:16;;;;;;;;;;;:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38977:1;38929:51;;38939:8;38929:51;38949:18;38929:51;;;;;;:::i;:::-;;;;;;;;12188:189:::0;38726:262;;;:::o;25531:128::-;25599:19;25644:7;25636:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25531:128;:::o;18443:183::-;18572:7;18548:8;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;;13003:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18598:12:::1;:22;18611:8;18598:22;;;;;;;;;;;;;;;;;;;;;18591:29;;18443:183:::0;;;;:::o;16228:352::-;16341:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16369:8:::1;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;::::0;13003:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16389:18:::2;16410:9;:19;16420:8;16410:19;;;;;;;;;;;;;;;;;;;;;16389:40;;16457:10;16444:23;;:9;:23;;;;16469:8;;;;;;;;;;;;;;;;::::0;16436:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16512:9;16487:12;:22;16500:8;16487:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;16565:8;16554:9;16533:41;;16542:10;16533:41;;;;;;;;;;;;16382:198;12370:1:::1;12188:189:::0;16228:352;;;:::o;43615:424::-;36073:5;43682:8;:22;43706:13;;;;;;;;;;;;;;;;;43674:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43762:10;43739:33;;:9;:19;43749:8;43739:19;;;;;;;;;;;;;;;;;;;;;:33;;;;43774:13;;;;;;;;;;;;;;;;;43731:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43799:14;43816:4;:14;43821:8;43816:14;;;;;;;;;;;43799:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43863:10;43849:24;;:3;:10;;;:24;;;43875:10;;;;;;;;;;;;;;;;;43841:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43897:11;43911:3;:9;;;43897:23;;43931:20;43942:8;43931:10;:20::i;:::-;44003:10;43995:28;;:36;44024:6;43995:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43663:376;;43615:424;:::o;41767:648::-;36073:5;41838:8;:22;41862:13;;;;;;;;;;;;;;;;;41830:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41926:1;41895:33;;:9;:19;41905:8;41895:19;;;;;;;;;;;;;;;;;;;;;:33;;;;41930:12;;;;;;;;;;;;;;;;;41887:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41985:10;41962:33;;:9;:19;41972:8;41962:19;;;;;;;;;;;;;;;;;;;;;:33;;;;41997:13;;;;;;;;;;;;;;;;;41954:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42022:22;42047:4;:14;42052:8;42047:14;;;;;;;;;;;42022:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42092:11;:17;;;42080:9;:29;42111:18;;;;;;;;;;;;;;;;;42072:58;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42165:1;42145:11;:17;;;:21;42141:141;;;42225:11;:17;;;42183:18;:38;42202:11;:18;;;42183:38;;;;;;;;;;;;;;;;:59;;;;;;;:::i;:::-;;;;;;;;42141:141;42309:42;;;;;;;;42313:4;42309:42;;;;;;42319:8;42309:42;;;;42329:10;42309:42;;;;;;42341:9;42309:42;;;42292:4;:14;42297:8;42292:14;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42396:10;42367:40;;42375:8;42367:40;42385:9;42367:40;;;;;;:::i;:::-;;;;;;;;41819:596;41767:648;:::o;36035:43::-;36073:5;36035:43;:::o;15454:353::-;15587:8;12575:18;12596:9;:19;12606:8;12596:19;;;;;;;;;;;;;;;;;;;;;12575:40;;12652:10;12638:24;;:10;:24;;;:71;;;;12699:10;12673:36;;:12;:22;12686:8;12673:22;;;;;;;;;;;;;;;;;;;;;:36;;;12638:71;:122;;;;12720:16;:28;12737:10;12720:28;;;;;;;;;;;;;;;:40;12749:10;12720:40;;;;;;;;;;;;;;;;;;;;;;;;;12638:122;12769:30;;;;;;;;;;;;;;;;;12622:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15615:8:::1;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;::::0;13003:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15635:18:::2;15656:9;:19;15666:8;15656:19;;;;;;;;;;;;;;;;;;;;;15635:40;;15704:5;15690:19;;:10;:19;;;15711:9;;;;;;;;;;;;;;;;::::0;15682:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15751:1;15736:17;;:3;:17;;;;15755:12;;;;;;;;;;;;;;;;::::0;15728:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15777:24;15787:3;15792:8;15777:9;:24::i;:::-;15628:179;12813:1:::1;12568:252:::0;15454:353;;;;:::o;41377:271::-;41422:11;41436:18;:30;41455:10;41436:30;;;;;;;;;;;;;;;;41422:44;;41592:1;41559:18;:30;41578:10;41559:30;;;;;;;;;;;;;;;:34;;;;41612:10;41604:28;;:36;41633:6;41604:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41411:237;41377:271::o;37519:107::-;27986:5;;;;;;;;;;;27972:19;;:10;:19;;;27993:17;;;;;;;;;;;;;;;;;27964:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;37610:8:::1;;37600:7;:18;;;;;;;:::i;:::-;;37519:107:::0;;:::o;37806:205::-;36073:5;37879:8;:22;37903:13;;;;;;;;;;;;;;;;;37871:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;37977:26;37989:3;37994:8;37977:11;:26::i;:::-;37806:205;;:::o;14699:179::-;14829:43;14847:5;14854:3;14859:8;14829:43;;;;;;;;;;;;:17;:43::i;:::-;14699:179;;;:::o;36679:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35927:101::-;;;;;;;;;;;;;;;;;;;:::o;17991:208::-;18088:14;18123:9;:19;18133:8;18123:19;;;;;;;;;;;;;;;;;;;;;18114:28;;18175:1;18157:20;;:6;:20;;;;18179:13;;;;;;;;;;;;;;;;;18149:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17991:208;;;:::o;17517:204::-;17614:7;17659:1;17641:20;;:6;:20;;;;17663:12;;;;;;;;;;;;;;;;;17633:43;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17690:25;17708:6;17690:17;:25::i;:::-;17683:32;;17517:204;;;:::o;36085:38::-;36122:1;36085:38;:::o;27248:65::-;;;;;;;;;;;;;;;;;;;:::o;39715:112::-;39776:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;39797:22:::1;39810:8;39797:12;:22::i;:::-;12188:189:::0;39715:112;;:::o;36589:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27368:20::-;;;;;;;;;;;;;:::o;25785:136::-;25855:21;25904:9;25894:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25785:136;:::o;16991:232::-;17148:9;17106:16;:28;17123:10;17106:28;;;;;;;;;;;;;;;:39;17135:9;17106:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;17196:9;17169:48;;17184:10;17169:48;;;17207:9;17169:48;;;;;;:::i;:::-;;;;;;;;16991:232;;:::o;38226:288::-;27986:5;;;;;;;;;;;27972:19;;:10;:19;;;27993:17;;;;;;;;;;;;;;;;;27964:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38323:6:::1;38332:3;:10;38323:19;;38358:6;38353:154;38374:1;38370;:5;38353:154;;;36073:5;38405:9;38415:1;38405:12;;;;;;;;:::i;:::-;;;;;;;;:26;38433:13;;;;;;;;;;;;;;;;::::0;38397:50:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38462:33;38474:3;38478:1;38474:6;;;;;;;;:::i;:::-;;;;;;;;38482:9;38492:1;38482:12;;;;;;;;:::i;:::-;;;;;;;;38462:11;:33::i;:::-;38377:3;;;;;:::i;:::-;;;;38353:154;;;;38312:202;38226:288:::0;;:::o;14079:209::-;14236:46;14254:5;14261:3;14266:8;14276:5;;14236:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;14079:209;;;;;:::o;26111:231::-;26243:13;26219:8;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;;13003:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26305:7:::1;26314:18;26323:8;26314;:18::i;:::-;26288:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26274:60;;26111:231:::0;;;;:::o;39275:291::-;39386:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;39426:65:::1;;;;;;;;39432:4;39426:65;;;;;;39438:8;39426:65;;;;39448:10;39426:65;;;;;;39460:18;39426:65;;;;39480:10;39426:65;;;;::::0;39407:6:::1;:16;39414:8;39407:16;;;;;;;;;;;:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39547:10;39507:51;;39517:8;39507:51;39527:18;39507:51;;;;;;:::i;:::-;;;;;;;;12188:189:::0;39275:291;;;;:::o;39947:1323::-;36073:5;40070:8;:22;40094:13;;;;;;;;;;;;;;;;;40062:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40119:18;40140:6;:16;40147:8;40140:16;;;;;;;;;;;40119:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40175:5;:15;;;40192:12;;;;;;;;;;;;;;;;;40167:38;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40252:1;40224:30;;:5;:16;;;:30;;;:64;;;;40278:10;40258:30;;:5;:16;;;:30;;;40224:64;40290:19;;;;;;;;;;;;;;;;;40216:94;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40342:5;:14;;;40329:9;:27;;40358:18;;;;;;;;;;;;;;;;;40321:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40388:14;40405:5;:12;;;40388:29;;40446:9;:19;40456:8;40446:19;;;;;;;;;;;;;;;;;;;;;40436:29;;:6;:29;;;40467:22;;;;;;;;;;;;;;;;;40428:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40533:31;40543:10;40555:8;40533:9;:31::i;:::-;40642:11;40656:36;40688:3;40657:25;36122:1;40657:9;:13;;:25;;;;:::i;:::-;40656:31;;:36;;;;:::i;:::-;40642:50;;40703:16;40734:3;40722:9;:15;;;;:::i;:::-;40703:34;;40777:3;40748:18;:25;40767:5;;;;;;;;;;;40748:25;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;40821:8;40791:18;:26;40810:6;40791:26;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;40887:10;40845:53;;40879:6;40845:53;;40858:8;40845:53;40868:9;40845:53;;;;;;:::i;:::-;;;;;;;;41042:14;41059:4;:14;41064:8;41059:14;;;;;;;;;;;41042:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41102:10;41088:24;;:3;:10;;;:24;;;41084:179;;;41207:3;:9;;;41173:18;:30;41192:10;41173:30;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;41231:20;41242:8;41231:10;:20::i;:::-;41084:179;39995:1275;;;;;39947:1323;:::o;18895:192::-;19023:4;19046:16;:24;19063:6;19046:24;;;;;;;;;;;;;;;:35;19071:9;19046:35;;;;;;;;;;;;;;;;;;;;;;;;;19039:42;;18895:192;;;;:::o;28193:238::-;27986:5;;;;;;;;;;;27972:19;;:10;:19;;;27993:17;;;;;;;;;;;;;;;;;27964:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;28315:1:::1;28294:23;;:9;:23;;;;28319:31;;;;;;;;;;;;;;;;::::0;28286:65:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;28391:9;28363:38;;28384:5;;;;;;;;;;;28363:38;;;;;;;;;;;;28416:9;28408:5;;:17;;;;;;;;;;;;;;;;;;28193:238:::0;:::o;36781:51::-;;;;;;;;;;;;;;;;;:::o;27192:::-;;;;;;;;;;;;;;;;;;;:::o;44756:138::-;44831:30;44847:3;44852:8;44831:15;:30::i;:::-;44868:22;44881:8;44868:12;:22::i;:::-;44756:138;;:::o;44291:212::-;44349:14;44366:4;:14;44371:8;44366:14;;;;;;;;;;;44349:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44408:28;;;;;;;;44412:5;44408:28;;;;;;44419:1;44408:28;;;;44430:1;44408:28;;;;;;44434:1;44408:28;;;44391:4;:14;44396:8;44391:14;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44484:3;:10;;;44452:43;;44463:8;44452:43;44473:3;:9;;;44452:43;;;;;;:::i;:::-;;;;;;;;44338:165;44291:212;:::o;32052:98::-;32110:7;32141:1;32137;:5;;;;:::i;:::-;32130:12;;32052:98;;;;:::o;32451:::-;32509:7;32540:1;32536;:5;;;;:::i;:::-;32529:12;;32451:98;;;;:::o;19957:297::-;20078:1;20063:17;;:3;:17;;;;20082:12;;;;;;;;;;;;;;;;;20055:40;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20141:1;20110:33;;:9;:19;20120:8;20110:19;;;;;;;;;;;;;;;;;;;;;:33;;;20145:18;;;;;;;;;;;;;;;;;20102:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20173:26;20185:3;20190:8;20173:11;:26::i;:::-;20239:8;20234:3;20213:35;;20230:1;20213:35;;;;;;;;;;;;19957:297;;:::o;22694:590::-;22842:8;12575:18;12596:9;:19;12606:8;12596:19;;;;;;;;;;;;;;;;;;;;;12575:40;;12652:10;12638:24;;:10;:24;;;:71;;;;12699:10;12673:36;;:12;:22;12686:8;12673:22;;;;;;;;;;;;;;;;;;;;;:36;;;12638:71;:122;;;;12720:16;:28;12737:10;12720:28;;;;;;;;;;;;;;;:40;12749:10;12720:40;;;;;;;;;;;;;;;;;;;;;;;;;12638:122;12769:30;;;;;;;;;;;;;;;;;12622:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22870:8:::1;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;::::0;13003:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22890:18:::2;22911:9;:19;22921:8;22911:19;;;;;;;;;;;;;;;;;;;;;22890:40;;22959:5;22945:19;;:10;:19;;;22966:9;;;;;;;;;;;;;;;;::::0;22937:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23006:1;22991:17;;:3;:17;;;;23010:12;;;;;;;;;;;;;;;;::::0;22983:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23032:24;23042:3;23047:8;23032:9;:24::i;:::-;23069:16;:3;:14;;;:16::i;:::-;23065:214;;;23101:13;23137:3;23117:41;;;23159:10;23171:5;23178:8;23188:5;23117:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23101:93;;11413:10;23221:24;;23211:34;;;:6;:34;;;;23247:23;;;;;;;;;;;;;;;;::::0;23203:68:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23092:187;23065:214;22883:401;12813:1:::1;12568:252:::0;22694:590;;;;;:::o;22253:163::-;22357:7;22383:19;:27;22403:6;22383:27;;;;;;;;;;;;;;;;22376:34;;22253:163;;;:::o;44047:236::-;44111:6;:16;44118:8;44111:16;;;;;;;;;;;:26;;;;;;;;;;;;44107:169;;;44173:49;;;;;;;;44179:5;44173:49;;;;;;44186:8;44173:49;;;;44204:1;44173:49;;;;;;44208:1;44173:49;;;;44219:1;44173:49;;;;;44154:6;:16;44161:8;44154:16;;;;;;;;;;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44255:8;44242:22;;;;;;;;;;44107:169;44047:236;:::o;26350:390::-;26400:13;26432:1;26426:2;:7;26422:42;;;26446:10;;;;;;;;;;;;;;;;;;;;;26422:42;26470:6;26479:2;26470:11;;26488;26506:60;26518:1;26513;:6;26506:60;;26532:8;;;;;:::i;:::-;;;;26556:2;26551:7;;;;;:::i;:::-;;;26506:60;;;26572:16;26601:6;26591:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26572:36;;26615:97;26628:1;26622:2;:7;26615:97;;26681:2;26676;:7;;;;:::i;:::-;26671:2;:12;;;;:::i;:::-;26658:27;;26642:3;26646:8;;;;:::i;:::-;;;;26642:13;;;;;;;;:::i;:::-;;;;;:43;;;;;;;;;;;26702:2;26696:8;;;;;:::i;:::-;;;26615:97;;;26732:3;26718:18;;;;;26350:390;;;;:::o;19278:288::-;19380:12;19395:9;:19;19405:8;19395:19;;;;;;;;;;;;;;;;;;;;;19380:34;;19421:24;19436:8;19421:14;:24::i;:::-;19454:30;19469:4;19475:8;19454:14;:30::i;:::-;19491:26;19503:3;19508:8;19491:11;:26::i;:::-;19551:8;19546:3;19531:29;;19540:4;19531:29;;;;;;;;;;;;19373:193;19278:288;;:::o;21715:242::-;21858:1;21827:33;;:9;:19;21837:8;21827:19;;;;;;;;;;;;;;;;;;;;;:33;;;21862:18;;;;;;;;;;;;;;;;;21819:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21912:3;21890:9;:19;21900:8;21890:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;21950:1;21922:19;:24;21942:3;21922:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;21715:242;;:::o;9610:780::-;9693:17;10134:16;10157:19;10179:66;10157:88;;;;10287:5;10275:18;10263:30;;10353:3;10341:15;;:8;:15;;:42;;;;;10372:11;10360:8;:23;;10341:42;10325:59;;9715:675;;9610:780;;;:::o;23417:110::-;23499:12;:22;23512:8;23499:22;;;;;;;;;;;;23492:29;;;;;;;;;;;23417:110;:::o;21214:234::-;21354:5;21331:28;;:9;:19;21341:8;21331:19;;;;;;;;;;;;;;;;;;;;;:28;;;21361:9;;;;;;;;;;;;;;;;;21323:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21408:1;21378:19;:26;21398:5;21378:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;21423:9;:19;21433:8;21423:19;;;;;;;;;;;;21416:26;;;;;;;;;;;21214:234;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;404:79;;:::i;:::-;350:2;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;;;;;;:::o;769:722::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:2;;;1149:79;;:::i;:::-;1095:2;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;;;;;;:::o;1497:139::-;1543:5;1581:6;1568:20;1559:29;;1597:33;1624:5;1597:33;:::i;:::-;1549:87;;;;:::o;1659:370::-;1730:5;1779:3;1772:4;1764:6;1760:17;1756:27;1746:2;;1787:79;;:::i;:::-;1746:2;1904:6;1891:20;1929:94;2019:3;2011:6;2004:4;1996:6;1992:17;1929:94;:::i;:::-;1920:103;;1736:293;;;;;:::o;2052:370::-;2123:5;2172:3;2165:4;2157:6;2153:17;2149:27;2139:2;;2180:79;;:::i;:::-;2139:2;2297:6;2284:20;2322:94;2412:3;2404:6;2397:4;2389:6;2385:17;2322:94;:::i;:::-;2313:103;;2129:293;;;;;:::o;2428:133::-;2471:5;2509:6;2496:20;2487:29;;2525:30;2549:5;2525:30;:::i;:::-;2477:84;;;;:::o;2567:137::-;2612:5;2650:6;2637:20;2628:29;;2666:32;2692:5;2666:32;:::i;:::-;2618:86;;;;:::o;2710:141::-;2766:5;2797:6;2791:13;2782:22;;2813:32;2839:5;2813:32;:::i;:::-;2772:79;;;;:::o;2870:552::-;2927:8;2937:6;2987:3;2980:4;2972:6;2968:17;2964:27;2954:2;;2995:79;;:::i;:::-;2954:2;3108:6;3095:20;3085:30;;3138:18;3130:6;3127:30;3124:2;;;3160:79;;:::i;:::-;3124:2;3274:4;3266:6;3262:17;3250:29;;3328:3;3320:4;3312:6;3308:17;3298:8;3294:32;3291:41;3288:2;;;3335:79;;:::i;:::-;3288:2;2944:478;;;;;:::o;3442:553::-;3500:8;3510:6;3560:3;3553:4;3545:6;3541:17;3537:27;3527:2;;3568:79;;:::i;:::-;3527:2;3681:6;3668:20;3658:30;;3711:18;3703:6;3700:30;3697:2;;;3733:79;;:::i;:::-;3697:2;3847:4;3839:6;3835:17;3823:29;;3901:3;3893:4;3885:6;3881:17;3871:8;3867:32;3864:41;3861:2;;;3908:79;;:::i;:::-;3861:2;3517:478;;;;;:::o;4001:139::-;4047:5;4085:6;4072:20;4063:29;;4101:33;4128:5;4101:33;:::i;:::-;4053:87;;;;:::o;4146:329::-;4205:6;4254:2;4242:9;4233:7;4229:23;4225:32;4222:2;;;4260:79;;:::i;:::-;4222:2;4380:1;4405:53;4450:7;4441:6;4430:9;4426:22;4405:53;:::i;:::-;4395:63;;4351:117;4212:263;;;;:::o;4481:474::-;4549:6;4557;4606:2;4594:9;4585:7;4581:23;4577:32;4574:2;;;4612:79;;:::i;:::-;4574:2;4732:1;4757:53;4802:7;4793:6;4782:9;4778:22;4757:53;:::i;:::-;4747:63;;4703:117;4859:2;4885:53;4930:7;4921:6;4910:9;4906:22;4885:53;:::i;:::-;4875:63;;4830:118;4564:391;;;;;:::o;4961:619::-;5038:6;5046;5054;5103:2;5091:9;5082:7;5078:23;5074:32;5071:2;;;5109:79;;:::i;:::-;5071:2;5229:1;5254:53;5299:7;5290:6;5279:9;5275:22;5254:53;:::i;:::-;5244:63;;5200:117;5356:2;5382:53;5427:7;5418:6;5407:9;5403:22;5382:53;:::i;:::-;5372:63;;5327:118;5484:2;5510:53;5555:7;5546:6;5535:9;5531:22;5510:53;:::i;:::-;5500:63;;5455:118;5061:519;;;;;:::o;5586:963::-;5683:6;5691;5699;5707;5715;5764:3;5752:9;5743:7;5739:23;5735:33;5732:2;;;5771:79;;:::i;:::-;5732:2;5891:1;5916:53;5961:7;5952:6;5941:9;5937:22;5916:53;:::i;:::-;5906:63;;5862:117;6018:2;6044:53;6089:7;6080:6;6069:9;6065:22;6044:53;:::i;:::-;6034:63;;5989:118;6146:2;6172:53;6217:7;6208:6;6197:9;6193:22;6172:53;:::i;:::-;6162:63;;6117:118;6302:2;6291:9;6287:18;6274:32;6333:18;6325:6;6322:30;6319:2;;;6355:79;;:::i;:::-;6319:2;6468:64;6524:7;6515:6;6504:9;6500:22;6468:64;:::i;:::-;6450:82;;;;6245:297;5722:827;;;;;;;;:::o;6555:468::-;6620:6;6628;6677:2;6665:9;6656:7;6652:23;6648:32;6645:2;;;6683:79;;:::i;:::-;6645:2;6803:1;6828:53;6873:7;6864:6;6853:9;6849:22;6828:53;:::i;:::-;6818:63;;6774:117;6930:2;6956:50;6998:7;6989:6;6978:9;6974:22;6956:50;:::i;:::-;6946:60;;6901:115;6635:388;;;;;:::o;7029:474::-;7097:6;7105;7154:2;7142:9;7133:7;7129:23;7125:32;7122:2;;;7160:79;;:::i;:::-;7122:2;7280:1;7305:53;7350:7;7341:6;7330:9;7326:22;7305:53;:::i;:::-;7295:63;;7251:117;7407:2;7433:53;7478:7;7469:6;7458:9;7454:22;7433:53;:::i;:::-;7423:63;;7378:118;7112:391;;;;;:::o;7509:894::-;7627:6;7635;7684:2;7672:9;7663:7;7659:23;7655:32;7652:2;;;7690:79;;:::i;:::-;7652:2;7838:1;7827:9;7823:17;7810:31;7868:18;7860:6;7857:30;7854:2;;;7890:79;;:::i;:::-;7854:2;7995:78;8065:7;8056:6;8045:9;8041:22;7995:78;:::i;:::-;7985:88;;7781:302;8150:2;8139:9;8135:18;8122:32;8181:18;8173:6;8170:30;8167:2;;;8203:79;;:::i;:::-;8167:2;8308:78;8378:7;8369:6;8358:9;8354:22;8308:78;:::i;:::-;8298:88;;8093:303;7642:761;;;;;:::o;8409:327::-;8467:6;8516:2;8504:9;8495:7;8491:23;8487:32;8484:2;;;8522:79;;:::i;:::-;8484:2;8642:1;8667:52;8711:7;8702:6;8691:9;8687:22;8667:52;:::i;:::-;8657:62;;8613:116;8474:262;;;;:::o;8742:349::-;8811:6;8860:2;8848:9;8839:7;8835:23;8831:32;8828:2;;;8866:79;;:::i;:::-;8828:2;8986:1;9011:63;9066:7;9057:6;9046:9;9042:22;9011:63;:::i;:::-;9001:73;;8957:127;8818:273;;;;:::o;9097:529::-;9168:6;9176;9225:2;9213:9;9204:7;9200:23;9196:32;9193:2;;;9231:79;;:::i;:::-;9193:2;9379:1;9368:9;9364:17;9351:31;9409:18;9401:6;9398:30;9395:2;;;9431:79;;:::i;:::-;9395:2;9544:65;9601:7;9592:6;9581:9;9577:22;9544:65;:::i;:::-;9526:83;;;;9322:297;9183:443;;;;;:::o;9632:329::-;9691:6;9740:2;9728:9;9719:7;9715:23;9711:32;9708:2;;;9746:79;;:::i;:::-;9708:2;9866:1;9891:53;9936:7;9927:6;9916:9;9912:22;9891:53;:::i;:::-;9881:63;;9837:117;9698:263;;;;:::o;9967:474::-;10035:6;10043;10092:2;10080:9;10071:7;10067:23;10063:32;10060:2;;;10098:79;;:::i;:::-;10060:2;10218:1;10243:53;10288:7;10279:6;10268:9;10264:22;10243:53;:::i;:::-;10233:63;;10189:117;10345:2;10371:53;10416:7;10407:6;10396:9;10392:22;10371:53;:::i;:::-;10361:63;;10316:118;10050:391;;;;;:::o;10447:619::-;10524:6;10532;10540;10589:2;10577:9;10568:7;10564:23;10560:32;10557:2;;;10595:79;;:::i;:::-;10557:2;10715:1;10740:53;10785:7;10776:6;10765:9;10761:22;10740:53;:::i;:::-;10730:63;;10686:117;10842:2;10868:53;10913:7;10904:6;10893:9;10889:22;10868:53;:::i;:::-;10858:63;;10813:118;10970:2;10996:53;11041:7;11032:6;11021:9;11017:22;10996:53;:::i;:::-;10986:63;;10941:118;10547:519;;;;;:::o;11072:118::-;11159:24;11177:5;11159:24;:::i;:::-;11154:3;11147:37;11137:53;;:::o;11196:109::-;11277:21;11292:5;11277:21;:::i;:::-;11272:3;11265:34;11255:50;;:::o;11311:360::-;11397:3;11425:38;11457:5;11425:38;:::i;:::-;11479:70;11542:6;11537:3;11479:70;:::i;:::-;11472:77;;11558:52;11603:6;11598:3;11591:4;11584:5;11580:16;11558:52;:::i;:::-;11635:29;11657:6;11635:29;:::i;:::-;11630:3;11626:39;11619:46;;11401:270;;;;;:::o;11677:364::-;11765:3;11793:39;11826:5;11793:39;:::i;:::-;11848:71;11912:6;11907:3;11848:71;:::i;:::-;11841:78;;11928:52;11973:6;11968:3;11961:4;11954:5;11950:16;11928:52;:::i;:::-;12005:29;12027:6;12005:29;:::i;:::-;12000:3;11996:39;11989:46;;11769:272;;;;;:::o;12047:377::-;12153:3;12181:39;12214:5;12181:39;:::i;:::-;12236:89;12318:6;12313:3;12236:89;:::i;:::-;12229:96;;12334:52;12379:6;12374:3;12367:4;12360:5;12356:16;12334:52;:::i;:::-;12411:6;12406:3;12402:16;12395:23;;12157:267;;;;;:::o;12454:845::-;12557:3;12594:5;12588:12;12623:36;12649:9;12623:36;:::i;:::-;12675:89;12757:6;12752:3;12675:89;:::i;:::-;12668:96;;12795:1;12784:9;12780:17;12811:1;12806:137;;;;12957:1;12952:341;;;;12773:520;;12806:137;12890:4;12886:9;12875;12871:25;12866:3;12859:38;12926:6;12921:3;12917:16;12910:23;;12806:137;;12952:341;13019:38;13051:5;13019:38;:::i;:::-;13079:1;13093:154;13107:6;13104:1;13101:13;13093:154;;;13181:7;13175:14;13171:1;13166:3;13162:11;13155:35;13231:1;13222:7;13218:15;13207:26;;13129:4;13126:1;13122:12;13117:17;;13093:154;;;13276:6;13271:3;13267:16;13260:23;;12959:334;;12773:520;;12561:738;;;;;;:::o;13305:118::-;13392:24;13410:5;13392:24;:::i;:::-;13387:3;13380:37;13370:53;;:::o;13429:429::-;13606:3;13628:92;13716:3;13707:6;13628:92;:::i;:::-;13621:99;;13737:95;13828:3;13819:6;13737:95;:::i;:::-;13730:102;;13849:3;13842:10;;13610:248;;;;;:::o;13864:222::-;13957:4;13995:2;13984:9;13980:18;13972:26;;14008:71;14076:1;14065:9;14061:17;14052:6;14008:71;:::i;:::-;13962:124;;;;:::o;14092:640::-;14287:4;14325:3;14314:9;14310:19;14302:27;;14339:71;14407:1;14396:9;14392:17;14383:6;14339:71;:::i;:::-;14420:72;14488:2;14477:9;14473:18;14464:6;14420:72;:::i;:::-;14502;14570:2;14559:9;14555:18;14546:6;14502:72;:::i;:::-;14621:9;14615:4;14611:20;14606:2;14595:9;14591:18;14584:48;14649:76;14720:4;14711:6;14649:76;:::i;:::-;14641:84;;14292:440;;;;;;;:::o;14738:210::-;14825:4;14863:2;14852:9;14848:18;14840:26;;14876:65;14938:1;14927:9;14923:17;14914:6;14876:65;:::i;:::-;14830:118;;;;:::o;14954:541::-;15125:4;15163:3;15152:9;15148:19;15140:27;;15177:65;15239:1;15228:9;15224:17;15215:6;15177:65;:::i;:::-;15252:72;15320:2;15309:9;15305:18;15296:6;15252:72;:::i;:::-;15334;15402:2;15391:9;15387:18;15378:6;15334:72;:::i;:::-;15416;15484:2;15473:9;15469:18;15460:6;15416:72;:::i;:::-;15130:365;;;;;;;:::o;15501:652::-;15700:4;15738:3;15727:9;15723:19;15715:27;;15752:65;15814:1;15803:9;15799:17;15790:6;15752:65;:::i;:::-;15827:72;15895:2;15884:9;15880:18;15871:6;15827:72;:::i;:::-;15909;15977:2;15966:9;15962:18;15953:6;15909:72;:::i;:::-;15991;16059:2;16048:9;16044:18;16035:6;15991:72;:::i;:::-;16073:73;16141:3;16130:9;16126:19;16117:6;16073:73;:::i;:::-;15705:448;;;;;;;;:::o;16159:313::-;16272:4;16310:2;16299:9;16295:18;16287:26;;16359:9;16353:4;16349:20;16345:1;16334:9;16330:17;16323:47;16387:78;16460:4;16451:6;16387:78;:::i;:::-;16379:86;;16277:195;;;;:::o;16478:222::-;16571:4;16609:2;16598:9;16594:18;16586:26;;16622:71;16690:1;16679:9;16675:17;16666:6;16622:71;:::i;:::-;16576:124;;;;:::o;16706:129::-;16740:6;16767:20;;:::i;:::-;16757:30;;16796:33;16824:4;16816:6;16796:33;:::i;:::-;16747:88;;;:::o;16841:75::-;16874:6;16907:2;16901:9;16891:19;;16881:35;:::o;16922:311::-;16999:4;17089:18;17081:6;17078:30;17075:2;;;17111:18;;:::i;:::-;17075:2;17161:4;17153:6;17149:17;17141:25;;17221:4;17215;17211:15;17203:23;;17004:229;;;:::o;17239:311::-;17316:4;17406:18;17398:6;17395:30;17392:2;;;17428:18;;:::i;:::-;17392:2;17478:4;17470:6;17466:17;17458:25;;17538:4;17532;17528:15;17520:23;;17321:229;;;:::o;17556:141::-;17605:4;17628:3;17620:11;;17651:3;17648:1;17641:14;17685:4;17682:1;17672:18;17664:26;;17610:87;;;:::o;17703:98::-;17754:6;17788:5;17782:12;17772:22;;17761:40;;;:::o;17807:99::-;17859:6;17893:5;17887:12;17877:22;;17866:40;;;:::o;17912:168::-;17995:11;18029:6;18024:3;18017:19;18069:4;18064:3;18060:14;18045:29;;18007:73;;;;:::o;18086:169::-;18170:11;18204:6;18199:3;18192:19;18244:4;18239:3;18235:14;18220:29;;18182:73;;;;:::o;18261:148::-;18363:11;18400:3;18385:18;;18375:34;;;;:::o;18415:305::-;18455:3;18474:20;18492:1;18474:20;:::i;:::-;18469:25;;18508:20;18526:1;18508:20;:::i;:::-;18503:25;;18662:1;18594:66;18590:74;18587:1;18584:81;18581:2;;;18668:18;;:::i;:::-;18581:2;18712:1;18709;18705:9;18698:16;;18459:261;;;;:::o;18726:185::-;18766:1;18783:20;18801:1;18783:20;:::i;:::-;18778:25;;18817:20;18835:1;18817:20;:::i;:::-;18812:25;;18856:1;18846:2;;18861:18;;:::i;:::-;18846:2;18903:1;18900;18896:9;18891:14;;18768:143;;;;:::o;18917:348::-;18957:7;18980:20;18998:1;18980:20;:::i;:::-;18975:25;;19014:20;19032:1;19014:20;:::i;:::-;19009:25;;19202:1;19134:66;19130:74;19127:1;19124:81;19119:1;19112:9;19105:17;19101:105;19098:2;;;19209:18;;:::i;:::-;19098:2;19257:1;19254;19250:9;19239:20;;18965:300;;;;:::o;19271:191::-;19311:4;19331:20;19349:1;19331:20;:::i;:::-;19326:25;;19365:20;19383:1;19365:20;:::i;:::-;19360:25;;19404:1;19401;19398:8;19395:2;;;19409:18;;:::i;:::-;19395:2;19454:1;19451;19447:9;19439:17;;19316:146;;;;:::o;19468:96::-;19505:7;19534:24;19552:5;19534:24;:::i;:::-;19523:35;;19513:51;;;:::o;19570:90::-;19604:7;19647:5;19640:13;19633:21;19622:32;;19612:48;;;:::o;19666:149::-;19702:7;19742:66;19735:5;19731:78;19720:89;;19710:105;;;:::o;19821:126::-;19858:7;19898:42;19891:5;19887:54;19876:65;;19866:81;;;:::o;19953:77::-;19990:7;20019:5;20008:16;;19998:32;;;:::o;20036:307::-;20104:1;20114:113;20128:6;20125:1;20122:13;20114:113;;;20213:1;20208:3;20204:11;20198:18;20194:1;20189:3;20185:11;20178:39;20150:2;20147:1;20143:10;20138:15;;20114:113;;;20245:6;20242:1;20239:13;20236:2;;;20325:1;20316:6;20311:3;20307:16;20300:27;20236:2;20085:258;;;;:::o;20349:171::-;20388:3;20411:24;20429:5;20411:24;:::i;:::-;20402:33;;20457:4;20450:5;20447:15;20444:2;;;20465:18;;:::i;:::-;20444:2;20512:1;20505:5;20501:13;20494:20;;20392:128;;;:::o;20526:320::-;20570:6;20607:1;20601:4;20597:12;20587:22;;20654:1;20648:4;20644:12;20675:18;20665:2;;20731:4;20723:6;20719:17;20709:27;;20665:2;20793;20785:6;20782:14;20762:18;20759:38;20756:2;;;20812:18;;:::i;:::-;20756:2;20577:269;;;;:::o;20852:281::-;20935:27;20957:4;20935:27;:::i;:::-;20927:6;20923:40;21065:6;21053:10;21050:22;21029:18;21017:10;21014:34;21011:62;21008:2;;;21076:18;;:::i;:::-;21008:2;21116:10;21112:2;21105:22;20895:238;;;:::o;21139:233::-;21178:3;21201:24;21219:5;21201:24;:::i;:::-;21192:33;;21247:66;21240:5;21237:77;21234:2;;;21317:18;;:::i;:::-;21234:2;21364:1;21357:5;21353:13;21346:20;;21182:190;;;:::o;21378:176::-;21410:1;21427:20;21445:1;21427:20;:::i;:::-;21422:25;;21461:20;21479:1;21461:20;:::i;:::-;21456:25;;21500:1;21490:2;;21505:18;;:::i;:::-;21490:2;21546:1;21543;21539:9;21534:14;;21412:142;;;;:::o;21560:180::-;21608:77;21605:1;21598:88;21705:4;21702:1;21695:15;21729:4;21726:1;21719:15;21746:180;21794:77;21791:1;21784:88;21891:4;21888:1;21881:15;21915:4;21912:1;21905:15;21932:180;21980:77;21977:1;21970:88;22077:4;22074:1;22067:15;22101:4;22098:1;22091:15;22118:180;22166:77;22163:1;22156:88;22263:4;22260:1;22253:15;22287:4;22284:1;22277:15;22304:180;22352:77;22349:1;22342:88;22449:4;22446:1;22439:15;22473:4;22470:1;22463:15;22490:117;22599:1;22596;22589:12;22613:117;22722:1;22719;22712:12;22736:117;22845:1;22842;22835:12;22859:117;22968:1;22965;22958:12;22982:117;23091:1;23088;23081:12;23105:102;23146:6;23197:2;23193:7;23188:2;23181:5;23177:14;23173:28;23163:38;;23153:54;;;:::o;23213:122::-;23286:24;23304:5;23286:24;:::i;:::-;23279:5;23276:35;23266:2;;23325:1;23322;23315:12;23266:2;23256:79;:::o;23341:116::-;23411:21;23426:5;23411:21;:::i;:::-;23404:5;23401:32;23391:2;;23447:1;23444;23437:12;23391:2;23381:76;:::o;23463:120::-;23535:23;23552:5;23535:23;:::i;:::-;23528:5;23525:34;23515:2;;23573:1;23570;23563:12;23515:2;23505:78;:::o;23589:122::-;23662:24;23680:5;23662:24;:::i;:::-;23655:5;23652:35;23642:2;;23701:1;23698;23691:12;23642:2;23632:79;:::o

Swarm Source

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