ETH Price: $2,538.06 (-5.23%)
Gas: 2 Gwei

Token

Anime Metaverse: Soulmates (AMS)
 

Overview

Max Total Supply

5,000 AMS

Holders

233

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
shifters.eth
Balance
1 AMS
0x7EF152B8b6D09b5dC53779F7648302760b63E533
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:
AnimeMetaverse

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-26
*/

// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.9;

library AddressUtils {

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   * as the code is not actually created until after the constructor finishes.
   * @param _addr address to check
   * @return whether the target address is a contract
   */
  function isContract(address _addr) internal view returns (bool) {
    uint256 size;
    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(_addr) }
    return size > 0;
  }

}

library MerkleProof {
function verify(
    bytes32[] memory proof,
    bytes32 root,
    bytes32 leaf
  )
    internal
    pure
    returns (bool)
  {
    bytes32 computedHash = leaf;

    for (uint256 i = 0; i < proof.length; i++) {
      bytes32 proofElement = proof[i];

      if (computedHash < proofElement) {
        // Hash(current computed hash + current element of the proof)
        computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
      } else {
        // Hash(current element of the proof + current computed hash)
        computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
      }
    }

    // Check if the computed hash (root) is equal to the provided root
    return computedHash == root;
  }
}

/**
 * @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 ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721TokenReceiver
{

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

}


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

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

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

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

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

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

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

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

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

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

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

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

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

}


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

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


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

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

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

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

}

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

}


/**
 * @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 does not 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);
  }
  
  function ownerOfInternal(
    uint256 _tokenId
  )
    internal
    view
    returns (address _owner)
  {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }

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

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

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

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

    emit Transfer(from, _to, _tokenId);
  }

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

    _addNFToken(_to, _tokenId);

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

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

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

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

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

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

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

    _transfer(_to, _tokenId);

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

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

}



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


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

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

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

  /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */


}

// OmegaM

contract AnimeMetaverse is NFTokenMetadata, Ownable 
{
    // Properties
    address payable feeAddress;

    // OmegaM
    uint constant public nftPrice = 0.25 ether;
    uint constant public maxNft   = 5000;   // Total nfts
    
    // Switches
    bool public isMintingActive     = false;  // Is minting open? Yes or no.
    bool public isWhiteListActive   = false;  // Is the public sale open or is it only whitelisted?
    bool public isMerkleActive      = true;   // OmegaM

    // Mappings 
    mapping(address => bool) private    whiteList; // Map of addresses on the whitelist.
    mapping(address => uint256) public  nftClaimed; // Map of how many nfts are minted per address.

    // Vars
    uint256 public current_minted = 0;
    // OmegaM
    uint public mintLimit = 1;
    
    // URI Data
    // OmegaM
    string private metaAddress = "https://mint.animemetaverse.ai/metadata/";
    string constant private jsonAppend = ".json";

    // Events
    event Minted(address sender, uint256 count);

    // Merkle tree support

    bytes32 public merkleRoot;

    constructor()
    {
        // OmegaM
        nftName     = "Anime Metaverse: Soulmates";
        nftSymbol   = "AMS";
        feeAddress  = payable(msg.sender);
    }

    function tokenURI(uint tokenID) external view returns (string memory)
    {   // @dev Token URIs are generated dynamically on view requests. 
        // This is to allow easy server changes and reduce gas fees for minting. -ssa2
        require(tokenID > 0, "Token does not exist.");
        require(tokenID <= current_minted, "Token hasn't been minted yet.");

        bytes32 thisToken;
        bytes memory concat;
        thisToken = uintToBytes(tokenID);
        concat = abi.encodePacked(metaAddress, thisToken, jsonAppend);
        return string(concat);
    }

    function setMerkleRoot (bytes32 merkle) external onlyOwner {
      require(merkle[0] != 0, "merkle root value is invalid");

        merkleRoot = merkle;
    }


    // Toggle whether any gals can be minted at all.
    function toggleMinting() public onlyOwner
    {
        isMintingActive = !isMintingActive;
    }

    // Toggle if we're in the Whitelist or Public Sale.
    function toggleWhiteList() public onlyOwner
    {
        isWhiteListActive = !isWhiteListActive;
    }

    function toggleMerkle () public onlyOwner {
      isMerkleActive = !isMerkleActive;      
    }

    // Add a list of wallet addresses to the Whitelist.
    function addToWhiteList(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Cannot add the null address");

            whiteList[addresses[i]] = true;
        }
    }

    // Tells the world if a given address is whitelisted or not.
    function onWhiteList(address addr) external view returns (bool) {
        return whiteList[addr];
    }

    // }:)
    function removeFromwhiteList(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Cant add null address");

            whiteList[addresses[i]] = false;
        }
    }

    // Public annoucement how many nfts a given address has minted.
    function claimedBy(address owner) external view returns (uint256) {
        require(owner != address(0), 'The zero address cannot mint anything.');

        return nftClaimed[owner];
    }

    // Address  ETH gets sent to when withdrawing.
    function updateRecipient(address payable _newAddress) public onlyOwner
    {
        feeAddress = _newAddress;
    }

    // Takes care of converting an integer into the raw bytes of it's abi-encodable string.
    function uintToBytes(uint v) private pure returns (bytes32 ret) {
        if (v == 0)
        {
            ret = '0';
        }
        else
        {
            while (v > 0) 
            {
                ret = bytes32(uint(ret) / (2 ** 8));
                ret |= bytes32(((v % 10) + 48) * 2 ** (8 * 31));
                v /= 10;
            }
        }
        return ret;
    }

    function verify(bytes32[] calldata proof)
        public
        view
        returns (bool)
    {
        require(merkleRoot[0] != 0, "merkle root not set");
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        return MerkleProof.verify(proof, merkleRoot, leaf);
    }

    // Public Sale minting function
    function mint(uint8 _mintNum, bytes32[] calldata _proof) public payable
    {
        require(isMintingActive, "Minting not available yet or paused for next round");
        require(_mintNum > 0, "At least one art is needed");
        require(_mintNum + nftClaimed[msg.sender] <= mintLimit, "Can't mint more than 1 limit per Wallet.");
        require(msg.value >= nftPrice * _mintNum, "NFTs are expensive, need more ETH to afford that.");
        require(current_minted + _mintNum <= maxNft, "Not enough of those left in stock.");
        require(_proof.length <= 10, "Invalid proof");
        
        if (isMerkleActive)
        {
            require(verify(_proof), "Not in the Merkle tree, only for exclusive invitees");
        }

        if(isWhiteListActive)
        {
            require(whiteList[msg.sender], "Only for exclusive invitees...");
        }

        for(uint i = 0; i < _mintNum; i++)
        {
            current_minted += 1;
            super._mint(msg.sender, current_minted);
            nftClaimed[msg.sender] += 1;
        }

        emit Minted(msg.sender, _mintNum);
    }

    // Emergency Devmint function if something gets messed up.
    function devMint(uint8 _mintNum) external onlyOwner 
    {
        require(_mintNum + current_minted <= maxNft, "Cannot mint more the total supply.");
        for(uint256 i = 0; i < _mintNum; i++) 
        {
            current_minted += 1;
            nftClaimed[msg.sender] += 1;
            super._mint(msg.sender, current_minted);
        }
    }

    // Withdraw the ETH stored in the contract.
    function withdrawETH() external onlyOwner 
    {
        feeAddress.transfer(address(this).balance);
    }

    // Update the metadata URI to a new server or IPFS if needed.
    function updateURI(string calldata _URI) external onlyOwner 
    {
        metaAddress = _URI;
    }

    // Update how many can be purchased at a time if need be.
    function updateLimit(uint newLimit) external onlyOwner
    {
        mintLimit = newLimit;
    }

    // Get how many nfts are minted right now.
    function totalSupply() public view returns(uint) 
    {
        return current_minted;
    }

    // Get how many nfts can be minted.    
    function maxSupply() public pure returns(uint) 
    {
        return maxNft;
    }
}

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":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhiteList","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":"address","name":"owner","type":"address"}],"name":"claimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"current_minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintNum","type":"uint8"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMerkleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhiteListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintNum","type":"uint8"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nftClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"onWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"addresses","type":"address[]"}],"name":"removeFromwhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkle","type":"bytes32"}],"name":"setMerkleRoot","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":[],"name":"toggleMerkle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updateLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newAddress","type":"address"}],"name":"updateRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600860146101000a81548160ff0219169083151502179055506000600860156101000a81548160ff0219169083151502179055506001600860166101000a81548160ff0219169083151502179055506000600b556001600c556040518060600160405280602881526020016200589960289139600d908051906020019062000090929190620002b6565b503480156200009e57600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601a81526020017f416e696d65204d65746176657273653a20536f756c6d617465730000000000008152506005908051906020019062000220929190620002b6565b506040518060400160405280600381526020017f414d530000000000000000000000000000000000000000000000000000000000815250600690805190602001906200026e929190620002b6565b5033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003cb565b828054620002c49062000395565b90600052602060002090601f016020900481019282620002e8576000855562000334565b82601f106200030357805160ff191683800117855562000334565b8280016001018555821562000334579182015b828111156200033357825182559160200191906001019062000316565b5b50905062000343919062000347565b5090565b5b808211156200036257600081600090555060010162000348565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003ae57607f821691505b60208210811415620003c557620003c462000366565b5b50919050565b6154be80620003db6000396000f3fe60806040526004361061025c5760003560e01c80637cb6475911610144578063b61c5e69116100b6578063e086e5ec1161007a578063e086e5ec146108db578063e985e9c5146108f2578063f2fde38b1461092f578063f3fe3bc314610958578063fae0959a14610983578063feec756c146109ac5761025c565b8063b61c5e6914610805578063b88d4fde14610821578063c30f4a5a1461084a578063c87b56dd14610873578063d5abeb01146108b05761025c565b8063974fbca811610108578063974fbca8146106e3578063976116381461070c578063996517cf14610749578063a22cb46514610774578063ade983fb1461079d578063b22d0c83146107c85761025c565b80637cb64759146106225780637d55094d1461064b578063860d248a146106625780638da5cb5b1461068d57806395d89b41146106b85761025c565b80633497d165116101dd57806363430b38116101a157806363430b38146105125780636352211e146105295780636ac437b014610566578063707e25771461059157806370a08231146105bc578063740d73f3146105f95761025c565b80633497d1651461044157806342787f4d1461046a57806342842e0e146104815780634e14f8ea146104aa578063573f5dae146104e75761025c565b806318160ddd1161022457806318160ddd1461035a5780631fb26d5b1461038557806323b872dd146103b057806329998d4b146103d95780632eb4a7ab146104165761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630d39fc811461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613f12565b6109d5565b6040516102959190613f5a565b60405180910390f35b3480156102aa57600080fd5b506102b3610a3c565b6040516102c0919061400e565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190614066565b610ace565b6040516102fd91906140d4565b60405180910390f35b34801561031257600080fd5b5061032d6004803603810190610328919061411b565b610be9565b005b34801561033b57600080fd5b50610344610fcc565b604051610351919061416a565b60405180910390f35b34801561036657600080fd5b5061036f610fd8565b60405161037c919061416a565b60405180910390f35b34801561039157600080fd5b5061039a610fe2565b6040516103a7919061416a565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d29190614185565b610fe8565b005b3480156103e557600080fd5b5061040060048036038101906103fb91906141d8565b61143a565b60405161040d919061416a565b60405180910390f35b34801561042257600080fd5b5061042b6114f2565b604051610438919061421e565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190614272565b6114f8565b005b34801561047657600080fd5b5061047f6116b8565b005b34801561048d57600080fd5b506104a860048036038101906104a39190614185565b6117ad565b005b3480156104b657600080fd5b506104d160048036038101906104cc91906141d8565b6117cd565b6040516104de919061416a565b60405180910390f35b3480156104f357600080fd5b506104fc6117e5565b6040516105099190613f5a565b60405180910390f35b34801561051e57600080fd5b506105276117f8565b005b34801561053557600080fd5b50610550600480360381019061054b9190614066565b6118ed565b60405161055d91906140d4565b60405180910390f35b34801561057257600080fd5b5061057b6119d3565b6040516105889190613f5a565b60405180910390f35b34801561059d57600080fd5b506105a66119e6565b6040516105b3919061416a565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de91906141d8565b6119ec565b6040516105f0919061416a565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190614304565b611aa6565b005b34801561062e57600080fd5b506106496004803603810190610644919061437d565b611cab565b005b34801561065757600080fd5b50610660611dfe565b005b34801561066e57600080fd5b50610677611ef3565b604051610684919061400e565b60405180910390f35b34801561069957600080fd5b506106a2611f2c565b6040516106af91906140d4565b60405180910390f35b3480156106c457600080fd5b506106cd611f52565b6040516106da919061400e565b60405180910390f35b3480156106ef57600080fd5b5061070a60048036038101906107059190614304565b611fe4565b005b34801561071857600080fd5b50610733600480360381019061072e9190614400565b6121e9565b6040516107409190613f5a565b60405180910390f35b34801561075557600080fd5b5061075e6122ee565b60405161076b919061416a565b60405180910390f35b34801561078057600080fd5b5061079b60048036038101906107969190614479565b6122f4565b005b3480156107a957600080fd5b506107b26123f1565b6040516107bf9190613f5a565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea91906141d8565b612404565b6040516107fc9190613f5a565b60405180910390f35b61081f600480360381019061081a91906144b9565b61245a565b005b34801561082d57600080fd5b506108486004803603810190610843919061456f565b612854565b005b34801561085657600080fd5b50610871600480360381019061086c919061464d565b6128ab565b005b34801561087f57600080fd5b5061089a60048036038101906108959190614066565b61298a565b6040516108a7919061400e565b60405180910390f35b3480156108bc57600080fd5b506108c5612a89565b6040516108d2919061416a565b60405180910390f35b3480156108e757600080fd5b506108f0612a93565b005b3480156108fe57600080fd5b506109196004803603810190610914919061469a565b612bc7565b6040516109269190613f5a565b60405180910390f35b34801561093b57600080fd5b50610956600480360381019061095191906141d8565b612c5b565b005b34801561096457600080fd5b5061096d612e8d565b60405161097a919061400e565b60405180910390f35b34801561098f57600080fd5b506109aa60048036038101906109a59190614066565b612ec6565b005b3480156109b857600080fd5b506109d360048036038101906109ce9190614718565b612f99565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060058054610a4b90614774565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7790614774565b8015610ac45780601f10610a9957610100808354040283529160200191610ac4565b820191906000526020600020905b815481529060010190602001808311610aa757829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba3919061400e565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610ce25750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d50919061400e565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d919061400e565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d919061400e565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6703782dace9d9000081565b6000600b54905090565b600b5481565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806110b957503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061114a5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030340000000000000000000000000000000000000000000000000000815250906111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b8919061400e565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295919061400e565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303700000000000000000000000000000000000000000000000000008152509061137d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611374919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d919061400e565b60405180910390fd5b5061143186866130a6565b50505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290614818565b60405180910390fd5b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906115c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b7919061400e565b60405180910390fd5b50611388600b548260ff166115d59190614867565b1115611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d9061492f565b60405180910390fd5b60005b8160ff168110156116b4576001600b60008282546116379190614867565b925050819055506001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461168e9190614867565b925050819055506116a133600b5461315b565b80806116ac9061494f565b915050611619565b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611780576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611777919061400e565b60405180910390fd5b50600860169054906101000a900460ff1615600860166101000a81548160ff021916908315150217905550565b6117c883838360405180602001604052806000815250613349565b505050565b600a6020528060005260406000206000915090505481565b600860159054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b7919061400e565b60405180910390fd5b50600860159054906101000a900460ff1615600860156101000a81548160ff021916908315150217905550565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c4919061400e565b60405180910390fd5b50919050565b600860149054906101000a900460ff1681565b61138881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c919061400e565b60405180910390fd5b50611a9f82613917565b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b65919061400e565b60405180910390fd5b5060005b82829050811015611ca657600073ffffffffffffffffffffffffffffffffffffffff16838383818110611ba857611ba7614998565b5b9050602002016020810190611bbd91906141d8565b73ffffffffffffffffffffffffffffffffffffffff161415611c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0b90614a13565b60405180910390fd5b600160096000858585818110611c2d57611c2c614998565b5b9050602002016020810190611c4291906141d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611c9e9061494f565b915050611b72565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6a919061400e565b60405180910390fd5b50600060f81b81600060208110611d8d57611d8c614998565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb90614a7f565b60405180910390fd5b80600e8190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd919061400e565b60405180910390fd5b50600860149054906101000a900460ff1615600860146101000a81548160ff021916908315150217905550565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060068054611f6190614774565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8d90614774565b8015611fda5780601f10611faf57610100808354040283529160200191611fda565b820191906000526020600020905b815481529060010190602001808311611fbd57829003601f168201915b5050505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a3919061400e565b60405180910390fd5b5060005b828290508110156121e457600073ffffffffffffffffffffffffffffffffffffffff168383838181106120e6576120e5614998565b5b90506020020160208101906120fb91906141d8565b73ffffffffffffffffffffffffffffffffffffffff161415612152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214990614aeb565b60405180910390fd5b60006009600085858581811061216b5761216a614998565b5b905060200201602081019061218091906141d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806121dc9061494f565b9150506120b0565b505050565b60008060f81b600e5460006020811061220557612204614998565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561226c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226390614b57565b60405180910390fd5b60003360405160200161227f9190614bbf565b6040516020818303038152906040528051906020012090506122e5848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483613960565b91505092915050565b600c5481565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123e59190613f5a565b60405180910390a35050565b600860169054906101000a900460ff1681565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600860149054906101000a900460ff166124a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a090614c4c565b60405180910390fd5b60008360ff16116124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e690614cb8565b60405180910390fd5b600c54600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548460ff166125409190614867565b1115612581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257890614d4a565b60405180910390fd5b8260ff166703782dace9d900006125989190614d6a565b3410156125da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d190614e36565b60405180910390fd5b6113888360ff16600b546125ee9190614867565b111561262f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262690614ec8565b60405180910390fd5b600a828290501115612676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266d90614f34565b60405180910390fd5b600860169054906101000a900460ff16156126d55761269582826121e9565b6126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cb90614fc6565b60405180910390fd5b5b600860159054906101000a900460ff161561277757600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d90615032565b60405180910390fd5b5b60005b8360ff16811015612815576001600b60008282546127989190614867565b925050819055506127ab33600b5461315b565b6001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127fb9190614867565b92505081905550808061280d9061494f565b91505061277a565b507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe338460405161284792919061508d565b60405180910390a1505050565b6128a485858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613349565b5050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296a919061400e565b60405180910390fd5b508181600d9190612985929190613e0d565b505050565b6060600082116129cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c690615102565b60405180910390fd5b600b54821115612a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0b9061516e565b60405180910390fd5b60006060612a2184613a17565b9150600d826040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250604051602001612a6e9392919061527f565b60405160208183030381529060405290508092505050919050565b6000611388905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b52919061400e565b60405180910390fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612bc4573d6000803e3d6000fd5b50565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1a919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090612dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc3919061400e565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f85919061400e565b60405180910390fd5b5080600c8190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090613061576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613058919061400e565b60405180910390fd5b5080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506130e782613ace565b6130f18183613b07565b6130fb8383613c72565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fa919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906132de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d5919061400e565b60405180910390fd5b506132e98282613c72565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061341a57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806134ab5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090613522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613519919061400e565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906135ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f6919061400e565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906136de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d5919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377e919061400e565b60405180910390fd5b5061379287876130a6565b6137b18773ffffffffffffffffffffffffffffffffffffffff16613dfa565b1561390d5760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016137f79493929190615309565b602060405180830381600087803b15801561381157600080fd5b505af1158015613825573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613849919061536a565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f30303330303500000000000000000000000000000000000000000000000000008152509061390a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613901919061400e565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008082905060005b8551811015613a0957600086828151811061398757613986614998565b5b60200260200101519050808310156139c95782816040516020016139ac929190615397565b6040516020818303038152906040528051906020012092506139f5565b80836040516020016139dc929190615397565b6040516020818303038152906040528051906020012092505b508080613a019061494f565b915050613969565b508381149150509392505050565b600080821415613a49577f30000000000000000000000000000000000000000000000000000000000000009050613ac9565b5b6000821115613ac8576101008160001c613a6491906153f2565b60001b90507f01000000000000000000000000000000000000000000000000000000000000006030600a84613a999190615423565b613aa39190614867565b613aad9190614d6a565b60001b81179050600a82613ac191906153f2565b9150613a4a565b5b919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090613be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bd7919061400e565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c319190615454565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d43919061400e565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613def9190614867565b925050819055505050565b600080823b905060008111915050919050565b828054613e1990614774565b90600052602060002090601f016020900481019282613e3b5760008555613e82565b82601f10613e5457803560ff1916838001178555613e82565b82800160010185558215613e82579182015b82811115613e81578235825591602001919060010190613e66565b5b509050613e8f9190613e93565b5090565b5b80821115613eac576000816000905550600101613e94565b5090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613eef81613eba565b8114613efa57600080fd5b50565b600081359050613f0c81613ee6565b92915050565b600060208284031215613f2857613f27613eb0565b5b6000613f3684828501613efd565b91505092915050565b60008115159050919050565b613f5481613f3f565b82525050565b6000602082019050613f6f6000830184613f4b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613faf578082015181840152602081019050613f94565b83811115613fbe576000848401525b50505050565b6000601f19601f8301169050919050565b6000613fe082613f75565b613fea8185613f80565b9350613ffa818560208601613f91565b61400381613fc4565b840191505092915050565b600060208201905081810360008301526140288184613fd5565b905092915050565b6000819050919050565b61404381614030565b811461404e57600080fd5b50565b6000813590506140608161403a565b92915050565b60006020828403121561407c5761407b613eb0565b5b600061408a84828501614051565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140be82614093565b9050919050565b6140ce816140b3565b82525050565b60006020820190506140e960008301846140c5565b92915050565b6140f8816140b3565b811461410357600080fd5b50565b600081359050614115816140ef565b92915050565b6000806040838503121561413257614131613eb0565b5b600061414085828601614106565b925050602061415185828601614051565b9150509250929050565b61416481614030565b82525050565b600060208201905061417f600083018461415b565b92915050565b60008060006060848603121561419e5761419d613eb0565b5b60006141ac86828701614106565b93505060206141bd86828701614106565b92505060406141ce86828701614051565b9150509250925092565b6000602082840312156141ee576141ed613eb0565b5b60006141fc84828501614106565b91505092915050565b6000819050919050565b61421881614205565b82525050565b6000602082019050614233600083018461420f565b92915050565b600060ff82169050919050565b61424f81614239565b811461425a57600080fd5b50565b60008135905061426c81614246565b92915050565b60006020828403121561428857614287613eb0565b5b60006142968482850161425d565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126142c4576142c361429f565b5b8235905067ffffffffffffffff8111156142e1576142e06142a4565b5b6020830191508360208202830111156142fd576142fc6142a9565b5b9250929050565b6000806020838503121561431b5761431a613eb0565b5b600083013567ffffffffffffffff81111561433957614338613eb5565b5b614345858286016142ae565b92509250509250929050565b61435a81614205565b811461436557600080fd5b50565b60008135905061437781614351565b92915050565b60006020828403121561439357614392613eb0565b5b60006143a184828501614368565b91505092915050565b60008083601f8401126143c0576143bf61429f565b5b8235905067ffffffffffffffff8111156143dd576143dc6142a4565b5b6020830191508360208202830111156143f9576143f86142a9565b5b9250929050565b6000806020838503121561441757614416613eb0565b5b600083013567ffffffffffffffff81111561443557614434613eb5565b5b614441858286016143aa565b92509250509250929050565b61445681613f3f565b811461446157600080fd5b50565b6000813590506144738161444d565b92915050565b600080604083850312156144905761448f613eb0565b5b600061449e85828601614106565b92505060206144af85828601614464565b9150509250929050565b6000806000604084860312156144d2576144d1613eb0565b5b60006144e08682870161425d565b935050602084013567ffffffffffffffff81111561450157614500613eb5565b5b61450d868287016143aa565b92509250509250925092565b60008083601f84011261452f5761452e61429f565b5b8235905067ffffffffffffffff81111561454c5761454b6142a4565b5b602083019150836001820283011115614568576145676142a9565b5b9250929050565b60008060008060006080868803121561458b5761458a613eb0565b5b600061459988828901614106565b95505060206145aa88828901614106565b94505060406145bb88828901614051565b935050606086013567ffffffffffffffff8111156145dc576145db613eb5565b5b6145e888828901614519565b92509250509295509295909350565b60008083601f84011261460d5761460c61429f565b5b8235905067ffffffffffffffff81111561462a576146296142a4565b5b602083019150836001820283011115614646576146456142a9565b5b9250929050565b6000806020838503121561466457614663613eb0565b5b600083013567ffffffffffffffff81111561468257614681613eb5565b5b61468e858286016145f7565b92509250509250929050565b600080604083850312156146b1576146b0613eb0565b5b60006146bf85828601614106565b92505060206146d085828601614106565b9150509250929050565b60006146e582614093565b9050919050565b6146f5816146da565b811461470057600080fd5b50565b600081359050614712816146ec565b92915050565b60006020828403121561472e5761472d613eb0565b5b600061473c84828501614703565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061478c57607f821691505b602082108114156147a05761479f614745565b5b50919050565b7f546865207a65726f20616464726573732063616e6e6f74206d696e7420616e7960008201527f7468696e672e0000000000000000000000000000000000000000000000000000602082015250565b6000614802602683613f80565b915061480d826147a6565b604082019050919050565b60006020820190508181036000830152614831816147f5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061487282614030565b915061487d83614030565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148b2576148b1614838565b5b828201905092915050565b7f43616e6e6f74206d696e74206d6f72652074686520746f74616c20737570706c60008201527f792e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614919602283613f80565b9150614924826148bd565b604082019050919050565b600060208201905081810360008301526149488161490c565b9050919050565b600061495a82614030565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561498d5761498c614838565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f742061646420746865206e756c6c20616464726573730000000000600082015250565b60006149fd601b83613f80565b9150614a08826149c7565b602082019050919050565b60006020820190508181036000830152614a2c816149f0565b9050919050565b7f6d65726b6c6520726f6f742076616c756520697320696e76616c696400000000600082015250565b6000614a69601c83613f80565b9150614a7482614a33565b602082019050919050565b60006020820190508181036000830152614a9881614a5c565b9050919050565b7f43616e7420616464206e756c6c20616464726573730000000000000000000000600082015250565b6000614ad5601583613f80565b9150614ae082614a9f565b602082019050919050565b60006020820190508181036000830152614b0481614ac8565b9050919050565b7f6d65726b6c6520726f6f74206e6f742073657400000000000000000000000000600082015250565b6000614b41601383613f80565b9150614b4c82614b0b565b602082019050919050565b60006020820190508181036000830152614b7081614b34565b9050919050565b60008160601b9050919050565b6000614b8f82614b77565b9050919050565b6000614ba182614b84565b9050919050565b614bb9614bb4826140b3565b614b96565b82525050565b6000614bcb8284614ba8565b60148201915081905092915050565b7f4d696e74696e67206e6f7420617661696c61626c6520796574206f722070617560008201527f73656420666f72206e65787420726f756e640000000000000000000000000000602082015250565b6000614c36603283613f80565b9150614c4182614bda565b604082019050919050565b60006020820190508181036000830152614c6581614c29565b9050919050565b7f4174206c65617374206f6e6520617274206973206e6565646564000000000000600082015250565b6000614ca2601a83613f80565b9150614cad82614c6c565b602082019050919050565b60006020820190508181036000830152614cd181614c95565b9050919050565b7f43616e2774206d696e74206d6f7265207468616e2031206c696d69742070657260008201527f2057616c6c65742e000000000000000000000000000000000000000000000000602082015250565b6000614d34602883613f80565b9150614d3f82614cd8565b604082019050919050565b60006020820190508181036000830152614d6381614d27565b9050919050565b6000614d7582614030565b9150614d8083614030565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614db957614db8614838565b5b828202905092915050565b7f4e4654732061726520657870656e736976652c206e656564206d6f726520455460008201527f4820746f206166666f726420746861742e000000000000000000000000000000602082015250565b6000614e20603183613f80565b9150614e2b82614dc4565b604082019050919050565b60006020820190508181036000830152614e4f81614e13565b9050919050565b7f4e6f7420656e6f756768206f662074686f7365206c65667420696e2073746f6360008201527f6b2e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614eb2602283613f80565b9150614ebd82614e56565b604082019050919050565b60006020820190508181036000830152614ee181614ea5565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614f1e600d83613f80565b9150614f2982614ee8565b602082019050919050565b60006020820190508181036000830152614f4d81614f11565b9050919050565b7f4e6f7420696e20746865204d65726b6c6520747265652c206f6e6c7920666f7260008201527f206578636c757369766520696e76697465657300000000000000000000000000602082015250565b6000614fb0603383613f80565b9150614fbb82614f54565b604082019050919050565b60006020820190508181036000830152614fdf81614fa3565b9050919050565b7f4f6e6c7920666f72206578636c757369766520696e7669746565732e2e2e0000600082015250565b600061501c601e83613f80565b915061502782614fe6565b602082019050919050565b6000602082019050818103600083015261504b8161500f565b9050919050565b6000819050919050565b600061507761507261506d84614239565b615052565b614030565b9050919050565b6150878161505c565b82525050565b60006040820190506150a260008301856140c5565b6150af602083018461507e565b9392505050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b60006150ec601583613f80565b91506150f7826150b6565b602082019050919050565b6000602082019050818103600083015261511b816150df565b9050919050565b7f546f6b656e206861736e2774206265656e206d696e746564207965742e000000600082015250565b6000615158601d83613f80565b915061516382615122565b602082019050919050565b600060208201905081810360008301526151878161514b565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546151bb81614774565b6151c5818661518e565b945060018216600081146151e057600181146151f157615224565b60ff19831686528186019350615224565b6151fa85615199565b60005b8381101561521c578154818901526001820191506020810190506151fd565b838801955050505b50505092915050565b6000819050919050565b61524861524382614205565b61522d565b82525050565b600061525982613f75565b615263818561518e565b9350615273818560208601613f91565b80840191505092915050565b600061528b82866151ae565b91506152978285615237565b6020820191506152a7828461524e565b9150819050949350505050565b600081519050919050565b600082825260208201905092915050565b60006152db826152b4565b6152e581856152bf565b93506152f5818560208601613f91565b6152fe81613fc4565b840191505092915050565b600060808201905061531e60008301876140c5565b61532b60208301866140c5565b615338604083018561415b565b818103606083015261534a81846152d0565b905095945050505050565b60008151905061536481613ee6565b92915050565b6000602082840312156153805761537f613eb0565b5b600061538e84828501615355565b91505092915050565b60006153a38285615237565b6020820191506153b38284615237565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006153fd82614030565b915061540883614030565b925082615418576154176153c3565b5b828204905092915050565b600061542e82614030565b915061543983614030565b925082615449576154486153c3565b5b828206905092915050565b600061545f82614030565b915061546a83614030565b92508282101561547d5761547c614838565b5b82820390509291505056fea26469706673582212203f6456c8d27e03575e589d7360a083b613b5d827c81acd8deac957055c5647c064736f6c6343000809003368747470733a2f2f6d696e742e616e696d656d65746176657273652e61692f6d657461646174612f

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80637cb6475911610144578063b61c5e69116100b6578063e086e5ec1161007a578063e086e5ec146108db578063e985e9c5146108f2578063f2fde38b1461092f578063f3fe3bc314610958578063fae0959a14610983578063feec756c146109ac5761025c565b8063b61c5e6914610805578063b88d4fde14610821578063c30f4a5a1461084a578063c87b56dd14610873578063d5abeb01146108b05761025c565b8063974fbca811610108578063974fbca8146106e3578063976116381461070c578063996517cf14610749578063a22cb46514610774578063ade983fb1461079d578063b22d0c83146107c85761025c565b80637cb64759146106225780637d55094d1461064b578063860d248a146106625780638da5cb5b1461068d57806395d89b41146106b85761025c565b80633497d165116101dd57806363430b38116101a157806363430b38146105125780636352211e146105295780636ac437b014610566578063707e25771461059157806370a08231146105bc578063740d73f3146105f95761025c565b80633497d1651461044157806342787f4d1461046a57806342842e0e146104815780634e14f8ea146104aa578063573f5dae146104e75761025c565b806318160ddd1161022457806318160ddd1461035a5780631fb26d5b1461038557806323b872dd146103b057806329998d4b146103d95780632eb4a7ab146104165761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630d39fc811461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613f12565b6109d5565b6040516102959190613f5a565b60405180910390f35b3480156102aa57600080fd5b506102b3610a3c565b6040516102c0919061400e565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190614066565b610ace565b6040516102fd91906140d4565b60405180910390f35b34801561031257600080fd5b5061032d6004803603810190610328919061411b565b610be9565b005b34801561033b57600080fd5b50610344610fcc565b604051610351919061416a565b60405180910390f35b34801561036657600080fd5b5061036f610fd8565b60405161037c919061416a565b60405180910390f35b34801561039157600080fd5b5061039a610fe2565b6040516103a7919061416a565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d29190614185565b610fe8565b005b3480156103e557600080fd5b5061040060048036038101906103fb91906141d8565b61143a565b60405161040d919061416a565b60405180910390f35b34801561042257600080fd5b5061042b6114f2565b604051610438919061421e565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190614272565b6114f8565b005b34801561047657600080fd5b5061047f6116b8565b005b34801561048d57600080fd5b506104a860048036038101906104a39190614185565b6117ad565b005b3480156104b657600080fd5b506104d160048036038101906104cc91906141d8565b6117cd565b6040516104de919061416a565b60405180910390f35b3480156104f357600080fd5b506104fc6117e5565b6040516105099190613f5a565b60405180910390f35b34801561051e57600080fd5b506105276117f8565b005b34801561053557600080fd5b50610550600480360381019061054b9190614066565b6118ed565b60405161055d91906140d4565b60405180910390f35b34801561057257600080fd5b5061057b6119d3565b6040516105889190613f5a565b60405180910390f35b34801561059d57600080fd5b506105a66119e6565b6040516105b3919061416a565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de91906141d8565b6119ec565b6040516105f0919061416a565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190614304565b611aa6565b005b34801561062e57600080fd5b506106496004803603810190610644919061437d565b611cab565b005b34801561065757600080fd5b50610660611dfe565b005b34801561066e57600080fd5b50610677611ef3565b604051610684919061400e565b60405180910390f35b34801561069957600080fd5b506106a2611f2c565b6040516106af91906140d4565b60405180910390f35b3480156106c457600080fd5b506106cd611f52565b6040516106da919061400e565b60405180910390f35b3480156106ef57600080fd5b5061070a60048036038101906107059190614304565b611fe4565b005b34801561071857600080fd5b50610733600480360381019061072e9190614400565b6121e9565b6040516107409190613f5a565b60405180910390f35b34801561075557600080fd5b5061075e6122ee565b60405161076b919061416a565b60405180910390f35b34801561078057600080fd5b5061079b60048036038101906107969190614479565b6122f4565b005b3480156107a957600080fd5b506107b26123f1565b6040516107bf9190613f5a565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea91906141d8565b612404565b6040516107fc9190613f5a565b60405180910390f35b61081f600480360381019061081a91906144b9565b61245a565b005b34801561082d57600080fd5b506108486004803603810190610843919061456f565b612854565b005b34801561085657600080fd5b50610871600480360381019061086c919061464d565b6128ab565b005b34801561087f57600080fd5b5061089a60048036038101906108959190614066565b61298a565b6040516108a7919061400e565b60405180910390f35b3480156108bc57600080fd5b506108c5612a89565b6040516108d2919061416a565b60405180910390f35b3480156108e757600080fd5b506108f0612a93565b005b3480156108fe57600080fd5b506109196004803603810190610914919061469a565b612bc7565b6040516109269190613f5a565b60405180910390f35b34801561093b57600080fd5b50610956600480360381019061095191906141d8565b612c5b565b005b34801561096457600080fd5b5061096d612e8d565b60405161097a919061400e565b60405180910390f35b34801561098f57600080fd5b506109aa60048036038101906109a59190614066565b612ec6565b005b3480156109b857600080fd5b506109d360048036038101906109ce9190614718565b612f99565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060058054610a4b90614774565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7790614774565b8015610ac45780601f10610a9957610100808354040283529160200191610ac4565b820191906000526020600020905b815481529060010190602001808311610aa757829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba3919061400e565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610ce25750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d50919061400e565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2d919061400e565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d919061400e565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6703782dace9d9000081565b6000600b54905090565b600b5481565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806110b957503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061114a5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030340000000000000000000000000000000000000000000000000000815250906111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b8919061400e565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295919061400e565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303700000000000000000000000000000000000000000000000000008152509061137d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611374919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d919061400e565b60405180910390fd5b5061143186866130a6565b50505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290614818565b60405180910390fd5b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906115c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b7919061400e565b60405180910390fd5b50611388600b548260ff166115d59190614867565b1115611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160d9061492f565b60405180910390fd5b60005b8160ff168110156116b4576001600b60008282546116379190614867565b925050819055506001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461168e9190614867565b925050819055506116a133600b5461315b565b80806116ac9061494f565b915050611619565b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611780576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611777919061400e565b60405180910390fd5b50600860169054906101000a900460ff1615600860166101000a81548160ff021916908315150217905550565b6117c883838360405180602001604052806000815250613349565b505050565b600a6020528060005260406000206000915090505481565b600860159054906101000a900460ff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b7919061400e565b60405180910390fd5b50600860159054906101000a900460ff1615600860156101000a81548160ff021916908315150217905550565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c4919061400e565b60405180910390fd5b50919050565b600860149054906101000a900460ff1681565b61138881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c919061400e565b60405180910390fd5b50611a9f82613917565b9050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b65919061400e565b60405180910390fd5b5060005b82829050811015611ca657600073ffffffffffffffffffffffffffffffffffffffff16838383818110611ba857611ba7614998565b5b9050602002016020810190611bbd91906141d8565b73ffffffffffffffffffffffffffffffffffffffff161415611c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0b90614a13565b60405180910390fd5b600160096000858585818110611c2d57611c2c614998565b5b9050602002016020810190611c4291906141d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611c9e9061494f565b915050611b72565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6a919061400e565b60405180910390fd5b50600060f81b81600060208110611d8d57611d8c614998565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb90614a7f565b60405180910390fd5b80600e8190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd919061400e565b60405180910390fd5b50600860149054906101000a900460ff1615600860146101000a81548160ff021916908315150217905550565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060068054611f6190614774565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8d90614774565b8015611fda5780601f10611faf57610100808354040283529160200191611fda565b820191906000526020600020905b815481529060010190602001808311611fbd57829003601f168201915b5050505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a3919061400e565b60405180910390fd5b5060005b828290508110156121e457600073ffffffffffffffffffffffffffffffffffffffff168383838181106120e6576120e5614998565b5b90506020020160208101906120fb91906141d8565b73ffffffffffffffffffffffffffffffffffffffff161415612152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214990614aeb565b60405180910390fd5b60006009600085858581811061216b5761216a614998565b5b905060200201602081019061218091906141d8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806121dc9061494f565b9150506120b0565b505050565b60008060f81b600e5460006020811061220557612204614998565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561226c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226390614b57565b60405180910390fd5b60003360405160200161227f9190614bbf565b6040516020818303038152906040528051906020012090506122e5848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483613960565b91505092915050565b600c5481565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123e59190613f5a565b60405180910390a35050565b600860169054906101000a900460ff1681565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600860149054906101000a900460ff166124a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a090614c4c565b60405180910390fd5b60008360ff16116124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e690614cb8565b60405180910390fd5b600c54600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548460ff166125409190614867565b1115612581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257890614d4a565b60405180910390fd5b8260ff166703782dace9d900006125989190614d6a565b3410156125da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d190614e36565b60405180910390fd5b6113888360ff16600b546125ee9190614867565b111561262f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262690614ec8565b60405180910390fd5b600a828290501115612676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266d90614f34565b60405180910390fd5b600860169054906101000a900460ff16156126d55761269582826121e9565b6126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cb90614fc6565b60405180910390fd5b5b600860159054906101000a900460ff161561277757600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d90615032565b60405180910390fd5b5b60005b8360ff16811015612815576001600b60008282546127989190614867565b925050819055506127ab33600b5461315b565b6001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127fb9190614867565b92505081905550808061280d9061494f565b91505061277a565b507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe338460405161284792919061508d565b60405180910390a1505050565b6128a485858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613349565b5050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296a919061400e565b60405180910390fd5b508181600d9190612985929190613e0d565b505050565b6060600082116129cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c690615102565b60405180910390fd5b600b54821115612a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0b9061516e565b60405180910390fd5b60006060612a2184613a17565b9150600d826040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250604051602001612a6e9392919061527f565b60405160208183030381529060405290508092505050919050565b6000611388905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b52919061400e565b60405180910390fd5b50600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612bc4573d6000803e3d6000fd5b50565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1a919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090612dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc3919061400e565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f85919061400e565b60405180910390fd5b5080600c8190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090613061576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613058919061400e565b60405180910390fd5b5080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506130e782613ace565b6130f18183613b07565b6130fb8383613c72565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fa919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906132de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d5919061400e565b60405180910390fd5b506132e98282613c72565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061341a57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806134ab5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090613522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613519919061400e565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906135ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f6919061400e565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906136de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d5919061400e565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377e919061400e565b60405180910390fd5b5061379287876130a6565b6137b18773ffffffffffffffffffffffffffffffffffffffff16613dfa565b1561390d5760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016137f79493929190615309565b602060405180830381600087803b15801561381157600080fd5b505af1158015613825573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613849919061536a565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f30303330303500000000000000000000000000000000000000000000000000008152509061390a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613901919061400e565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008082905060005b8551811015613a0957600086828151811061398757613986614998565b5b60200260200101519050808310156139c95782816040516020016139ac929190615397565b6040516020818303038152906040528051906020012092506139f5565b80836040516020016139dc929190615397565b6040516020818303038152906040528051906020012092505b508080613a019061494f565b915050613969565b508381149150509392505050565b600080821415613a49577f30000000000000000000000000000000000000000000000000000000000000009050613ac9565b5b6000821115613ac8576101008160001c613a6491906153f2565b60001b90507f01000000000000000000000000000000000000000000000000000000000000006030600a84613a999190615423565b613aa39190614867565b613aad9190614d6a565b60001b81179050600a82613ac191906153f2565b9150613a4a565b5b919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090613be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bd7919061400e565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c319190615454565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d43919061400e565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613def9190614867565b925050819055505050565b600080823b905060008111915050919050565b828054613e1990614774565b90600052602060002090601f016020900481019282613e3b5760008555613e82565b82601f10613e5457803560ff1916838001178555613e82565b82800160010185558215613e82579182015b82811115613e81578235825591602001919060010190613e66565b5b509050613e8f9190613e93565b5090565b5b80821115613eac576000816000905550600101613e94565b5090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613eef81613eba565b8114613efa57600080fd5b50565b600081359050613f0c81613ee6565b92915050565b600060208284031215613f2857613f27613eb0565b5b6000613f3684828501613efd565b91505092915050565b60008115159050919050565b613f5481613f3f565b82525050565b6000602082019050613f6f6000830184613f4b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613faf578082015181840152602081019050613f94565b83811115613fbe576000848401525b50505050565b6000601f19601f8301169050919050565b6000613fe082613f75565b613fea8185613f80565b9350613ffa818560208601613f91565b61400381613fc4565b840191505092915050565b600060208201905081810360008301526140288184613fd5565b905092915050565b6000819050919050565b61404381614030565b811461404e57600080fd5b50565b6000813590506140608161403a565b92915050565b60006020828403121561407c5761407b613eb0565b5b600061408a84828501614051565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140be82614093565b9050919050565b6140ce816140b3565b82525050565b60006020820190506140e960008301846140c5565b92915050565b6140f8816140b3565b811461410357600080fd5b50565b600081359050614115816140ef565b92915050565b6000806040838503121561413257614131613eb0565b5b600061414085828601614106565b925050602061415185828601614051565b9150509250929050565b61416481614030565b82525050565b600060208201905061417f600083018461415b565b92915050565b60008060006060848603121561419e5761419d613eb0565b5b60006141ac86828701614106565b93505060206141bd86828701614106565b92505060406141ce86828701614051565b9150509250925092565b6000602082840312156141ee576141ed613eb0565b5b60006141fc84828501614106565b91505092915050565b6000819050919050565b61421881614205565b82525050565b6000602082019050614233600083018461420f565b92915050565b600060ff82169050919050565b61424f81614239565b811461425a57600080fd5b50565b60008135905061426c81614246565b92915050565b60006020828403121561428857614287613eb0565b5b60006142968482850161425d565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126142c4576142c361429f565b5b8235905067ffffffffffffffff8111156142e1576142e06142a4565b5b6020830191508360208202830111156142fd576142fc6142a9565b5b9250929050565b6000806020838503121561431b5761431a613eb0565b5b600083013567ffffffffffffffff81111561433957614338613eb5565b5b614345858286016142ae565b92509250509250929050565b61435a81614205565b811461436557600080fd5b50565b60008135905061437781614351565b92915050565b60006020828403121561439357614392613eb0565b5b60006143a184828501614368565b91505092915050565b60008083601f8401126143c0576143bf61429f565b5b8235905067ffffffffffffffff8111156143dd576143dc6142a4565b5b6020830191508360208202830111156143f9576143f86142a9565b5b9250929050565b6000806020838503121561441757614416613eb0565b5b600083013567ffffffffffffffff81111561443557614434613eb5565b5b614441858286016143aa565b92509250509250929050565b61445681613f3f565b811461446157600080fd5b50565b6000813590506144738161444d565b92915050565b600080604083850312156144905761448f613eb0565b5b600061449e85828601614106565b92505060206144af85828601614464565b9150509250929050565b6000806000604084860312156144d2576144d1613eb0565b5b60006144e08682870161425d565b935050602084013567ffffffffffffffff81111561450157614500613eb5565b5b61450d868287016143aa565b92509250509250925092565b60008083601f84011261452f5761452e61429f565b5b8235905067ffffffffffffffff81111561454c5761454b6142a4565b5b602083019150836001820283011115614568576145676142a9565b5b9250929050565b60008060008060006080868803121561458b5761458a613eb0565b5b600061459988828901614106565b95505060206145aa88828901614106565b94505060406145bb88828901614051565b935050606086013567ffffffffffffffff8111156145dc576145db613eb5565b5b6145e888828901614519565b92509250509295509295909350565b60008083601f84011261460d5761460c61429f565b5b8235905067ffffffffffffffff81111561462a576146296142a4565b5b602083019150836001820283011115614646576146456142a9565b5b9250929050565b6000806020838503121561466457614663613eb0565b5b600083013567ffffffffffffffff81111561468257614681613eb5565b5b61468e858286016145f7565b92509250509250929050565b600080604083850312156146b1576146b0613eb0565b5b60006146bf85828601614106565b92505060206146d085828601614106565b9150509250929050565b60006146e582614093565b9050919050565b6146f5816146da565b811461470057600080fd5b50565b600081359050614712816146ec565b92915050565b60006020828403121561472e5761472d613eb0565b5b600061473c84828501614703565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061478c57607f821691505b602082108114156147a05761479f614745565b5b50919050565b7f546865207a65726f20616464726573732063616e6e6f74206d696e7420616e7960008201527f7468696e672e0000000000000000000000000000000000000000000000000000602082015250565b6000614802602683613f80565b915061480d826147a6565b604082019050919050565b60006020820190508181036000830152614831816147f5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061487282614030565b915061487d83614030565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148b2576148b1614838565b5b828201905092915050565b7f43616e6e6f74206d696e74206d6f72652074686520746f74616c20737570706c60008201527f792e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614919602283613f80565b9150614924826148bd565b604082019050919050565b600060208201905081810360008301526149488161490c565b9050919050565b600061495a82614030565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561498d5761498c614838565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f742061646420746865206e756c6c20616464726573730000000000600082015250565b60006149fd601b83613f80565b9150614a08826149c7565b602082019050919050565b60006020820190508181036000830152614a2c816149f0565b9050919050565b7f6d65726b6c6520726f6f742076616c756520697320696e76616c696400000000600082015250565b6000614a69601c83613f80565b9150614a7482614a33565b602082019050919050565b60006020820190508181036000830152614a9881614a5c565b9050919050565b7f43616e7420616464206e756c6c20616464726573730000000000000000000000600082015250565b6000614ad5601583613f80565b9150614ae082614a9f565b602082019050919050565b60006020820190508181036000830152614b0481614ac8565b9050919050565b7f6d65726b6c6520726f6f74206e6f742073657400000000000000000000000000600082015250565b6000614b41601383613f80565b9150614b4c82614b0b565b602082019050919050565b60006020820190508181036000830152614b7081614b34565b9050919050565b60008160601b9050919050565b6000614b8f82614b77565b9050919050565b6000614ba182614b84565b9050919050565b614bb9614bb4826140b3565b614b96565b82525050565b6000614bcb8284614ba8565b60148201915081905092915050565b7f4d696e74696e67206e6f7420617661696c61626c6520796574206f722070617560008201527f73656420666f72206e65787420726f756e640000000000000000000000000000602082015250565b6000614c36603283613f80565b9150614c4182614bda565b604082019050919050565b60006020820190508181036000830152614c6581614c29565b9050919050565b7f4174206c65617374206f6e6520617274206973206e6565646564000000000000600082015250565b6000614ca2601a83613f80565b9150614cad82614c6c565b602082019050919050565b60006020820190508181036000830152614cd181614c95565b9050919050565b7f43616e2774206d696e74206d6f7265207468616e2031206c696d69742070657260008201527f2057616c6c65742e000000000000000000000000000000000000000000000000602082015250565b6000614d34602883613f80565b9150614d3f82614cd8565b604082019050919050565b60006020820190508181036000830152614d6381614d27565b9050919050565b6000614d7582614030565b9150614d8083614030565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614db957614db8614838565b5b828202905092915050565b7f4e4654732061726520657870656e736976652c206e656564206d6f726520455460008201527f4820746f206166666f726420746861742e000000000000000000000000000000602082015250565b6000614e20603183613f80565b9150614e2b82614dc4565b604082019050919050565b60006020820190508181036000830152614e4f81614e13565b9050919050565b7f4e6f7420656e6f756768206f662074686f7365206c65667420696e2073746f6360008201527f6b2e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614eb2602283613f80565b9150614ebd82614e56565b604082019050919050565b60006020820190508181036000830152614ee181614ea5565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614f1e600d83613f80565b9150614f2982614ee8565b602082019050919050565b60006020820190508181036000830152614f4d81614f11565b9050919050565b7f4e6f7420696e20746865204d65726b6c6520747265652c206f6e6c7920666f7260008201527f206578636c757369766520696e76697465657300000000000000000000000000602082015250565b6000614fb0603383613f80565b9150614fbb82614f54565b604082019050919050565b60006020820190508181036000830152614fdf81614fa3565b9050919050565b7f4f6e6c7920666f72206578636c757369766520696e7669746565732e2e2e0000600082015250565b600061501c601e83613f80565b915061502782614fe6565b602082019050919050565b6000602082019050818103600083015261504b8161500f565b9050919050565b6000819050919050565b600061507761507261506d84614239565b615052565b614030565b9050919050565b6150878161505c565b82525050565b60006040820190506150a260008301856140c5565b6150af602083018461507e565b9392505050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b60006150ec601583613f80565b91506150f7826150b6565b602082019050919050565b6000602082019050818103600083015261511b816150df565b9050919050565b7f546f6b656e206861736e2774206265656e206d696e746564207965742e000000600082015250565b6000615158601d83613f80565b915061516382615122565b602082019050919050565b600060208201905081810360008301526151878161514b565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546151bb81614774565b6151c5818661518e565b945060018216600081146151e057600181146151f157615224565b60ff19831686528186019350615224565b6151fa85615199565b60005b8381101561521c578154818901526001820191506020810190506151fd565b838801955050505b50505092915050565b6000819050919050565b61524861524382614205565b61522d565b82525050565b600061525982613f75565b615263818561518e565b9350615273818560208601613f91565b80840191505092915050565b600061528b82866151ae565b91506152978285615237565b6020820191506152a7828461524e565b9150819050949350505050565b600081519050919050565b600082825260208201905092915050565b60006152db826152b4565b6152e581856152bf565b93506152f5818560208601613f91565b6152fe81613fc4565b840191505092915050565b600060808201905061531e60008301876140c5565b61532b60208301866140c5565b615338604083018561415b565b818103606083015261534a81846152d0565b905095945050505050565b60008151905061536481613ee6565b92915050565b6000602082840312156153805761537f613eb0565b5b600061538e84828501615355565b91505092915050565b60006153a38285615237565b6020820191506153b38284615237565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006153fd82614030565b915061540883614030565b925082615418576154176153c3565b5b828204905092915050565b600061542e82614030565b915061543983614030565b925082615449576154486153c3565b5b828206905092915050565b600061545f82614030565b915061546a83614030565b92508282101561547d5761547c614838565b5b82820390509291505056fea26469706673582212203f6456c8d27e03575e589d7360a083b613b5d827c81acd8deac957055c5647c064736f6c63430008090033

Deployed Bytecode Sourcemap

27347:6967:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11043:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26810:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21026:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18600:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27477:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34078:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28070:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17826:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30724:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28423:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33149:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29730:97;;;;;;;;;;;;;:::i;:::-;;17071:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27954:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27686:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29616:106;;;;;;;;;;;;;:::i;:::-;;20364:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27608:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27526:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19890:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29892:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29224:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29451:100;;;;;;;;;;;;;:::i;:::-;;11652:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11772:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27046:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30369:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31604:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28125:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19364:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27787:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30244:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31945:1132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16451:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33749:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28638:578;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34226:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33565:109;;;;;;;;;;;;;:::i;:::-;;21478:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12597:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11596:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33923:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30976:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11043:172;11153:4;11176:19;:33;11196:12;11176:33;;;;;;;;;;;;;;;;;;;;;;;;;;;11169:40;;11043:172;;;:::o;26810:120::-;26878:19;26917:7;26909:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26810:120;:::o;21026:183::-;21155:7;21131:8;15414:1;15383:33;;:9;:19;15393:8;15383:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15418:13;;;;;;;;;;;;;;;;;15375:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21181:12:::1;:22;21194:8;21181:22;;;;;;;;;;;;;;;;;;;;;21174:29;;21026:183:::0;;;;:::o;18600:352::-;18713:8;14567:18;14588:9;:19;14598:8;14588:19;;;;;;;;;;;;;;;;;;;;;14567:40;;14644:10;14630:24;;:10;:24;;;:68;;;;14658:16;:28;14675:10;14658:28;;;;;;;;;;;;;;;:40;14687:10;14658:40;;;;;;;;;;;;;;;;;;;;;;;;;14630:68;14707:21;;;;;;;;;;;;;;;;;14614:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18741:8:::1;15414:1;15383:33;;:9;:19;15393:8;15383:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15418:13;;;;;;;;;;;;;;;;::::0;15375:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18761:18:::2;18782:9;:19;18792:8;18782:19;;;;;;;;;;;;;;;;;;;;;18761:40;;18829:10;18816:23;;:9;:23;;;;18841:8;;;;;;;;;;;;;;;;::::0;18808:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18884:9;18859:12;:22;18872:8;18859:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;18937:8;18926:9;18905:41;;18914:10;18905:41;;;;;;;;;;;;18754:198;14742:1:::1;14560:189:::0;18600:352;;;:::o;27477:42::-;27509:10;27477:42;:::o;34078:95::-;34121:4;34151:14;;34144:21;;34078:95;:::o;28070:33::-;;;;:::o;17826:353::-;17959:8;14947:18;14968:9;:19;14978:8;14968:19;;;;;;;;;;;;;;;;;;;;;14947:40;;15024:10;15010:24;;:10;:24;;;:71;;;;15071:10;15045:36;;:12;:22;15058:8;15045:22;;;;;;;;;;;;;;;;;;;;;:36;;;15010:71;:122;;;;15092:16;:28;15109:10;15092:28;;;;;;;;;;;;;;;:40;15121:10;15092:40;;;;;;;;;;;;;;;;;;;;;;;;;15010:122;15141:30;;;;;;;;;;;;;;;;;14994:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17987:8:::1;15414:1;15383:33;;:9;:19;15393:8;15383:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15418:13;;;;;;;;;;;;;;;;::::0;15375:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18007:18:::2;18028:9;:19;18038:8;18028:19;;;;;;;;;;;;;;;;;;;;;18007:40;;18076:5;18062:19;;:10;:19;;;18083:9;;;;;;;;;;;;;;;;::::0;18054:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18123:1;18108:17;;:3;:17;;;;18127:12;;;;;;;;;;;;;;;;::::0;18100:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18149:24;18159:3;18164:8;18149:9;:24::i;:::-;18000:179;15185:1:::1;14940:252:::0;17826:353;;;;:::o;30724:192::-;30781:7;30826:1;30809:19;;:5;:19;;;;30801:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;30891:10;:17;30902:5;30891:17;;;;;;;;;;;;;;;;30884:24;;30724:192;;;:::o;28423:25::-;;;;:::o;33149:359::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27558:4:::1;33237:14;;33226:8;:25;;;;;;:::i;:::-;:35;;33218:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;33315:9;33311:190;33334:8;33330:12;;:1;:12;33311:190;;;33392:1;33374:14;;:19;;;;;;;:::i;:::-;;;;;;;;33434:1;33408:10;:22;33419:10;33408:22;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;33450:39;33462:10;33474:14;;33450:11;:39::i;:::-;33344:3;;;;;:::i;:::-;;;;33311:190;;;;33149:359:::0;:::o;29730:97::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29799:14:::1;;;;;;;;;;;29798:15;29781:14;;:32;;;;;;;;;;;;;;;;;;29730:97::o:0;17071:179::-;17201:43;17219:5;17226:3;17231:8;17201:43;;;;;;;;;;;;:17;:43::i;:::-;17071:179;;;:::o;27954:46::-;;;;;;;;;;;;;;;;;:::o;27686:39::-;;;;;;;;;;;;;:::o;29616:106::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29697:17:::1;;;;;;;;;;;29696:18;29676:17;;:38;;;;;;;;;;;;;;;;;;29616:106::o:0;20364:208::-;20461:14;20496:9;:19;20506:8;20496:19;;;;;;;;;;;;;;;;;;;;;20487:28;;20548:1;20530:20;;:6;:20;;;;20552:13;;;;;;;;;;;;;;;;;20522:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20364:208;;;:::o;27608:39::-;;;;;;;;;;;;;:::o;27526:36::-;27558:4;27526:36;:::o;19890:204::-;19987:7;20032:1;20014:20;;:6;:20;;;;20036:12;;;;;;;;;;;;;;;;;20006:43;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20063:25;20081:6;20063:17;:25::i;:::-;20056:32;;19890:204;;;:::o;29892:278::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29981:9:::1;29976:187;30000:9;;:16;;29996:1;:20;29976:187;;;30070:1;30046:26;;:9;;30056:1;30046:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;30038:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;30147:4;30121:9;:23;30131:9;;30141:1;30131:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;30121:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;30018:3;;;;;:::i;:::-;;;;29976:187;;;;29892:278:::0;;:::o;29224:163::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29313:1:::1;29300:14;;:6;29307:1;29300:9;;;;;;;:::i;:::-;;;;;:14;;;;;29292:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;29373:6;29360:10;:19;;;;29224:163:::0;:::o;29451:100::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29528:15:::1;;;;;;;;;;;29527:16;29509:15;;:34;;;;;;;;;;;;;;;;;;29451:100::o:0;11652:65::-;;;;;;;;;;;;;;;;;;;:::o;11772:20::-;;;;;;;;;;;;;:::o;27046:128::-;27116:21;27159:9;27149:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27046:128;:::o;30369:278::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30463:9:::1;30458:182;30482:9;;:16;;30478:1;:20;30458:182;;;30552:1;30528:26;;:9;;30538:1;30528:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;30520:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;30623:5;30597:9;:23;30607:9;;30617:1;30607:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;30597:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;30500:3;;;;;:::i;:::-;;;;30458:182;;;;30369:278:::0;;:::o;31604:296::-;31694:4;31741:1;31724:18;;:10;;31735:1;31724:13;;;;;;;:::i;:::-;;;;;:18;;;;;31716:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;31777:12;31819:10;31802:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;31792:39;;;;;;31777:54;;31849:43;31868:5;;31849:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31875:10;;31887:4;31849:18;:43::i;:::-;31842:50;;;31604:296;;;;:::o;28125:25::-;;;;:::o;19364:232::-;19521:9;19479:16;:28;19496:10;19479:28;;;;;;;;;;;;;;;:39;19508:9;19479:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;19569:9;19542:48;;19557:10;19542:48;;;19580:9;19542:48;;;;;;:::i;:::-;;;;;;;;19364:232;;:::o;27787:38::-;;;;;;;;;;;;;:::o;30244:105::-;30302:4;30326:9;:15;30336:4;30326:15;;;;;;;;;;;;;;;;;;;;;;;;;30319:22;;30244:105;;;:::o;31945:1132::-;32041:15;;;;;;;;;;;32033:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;32141:1;32130:8;:12;;;32122:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;32229:9;;32203:10;:22;32214:10;32203:22;;;;;;;;;;;;;;;;32192:8;:33;;;;;;:::i;:::-;:46;;32184:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;32326:8;32315:19;;27509:10;32315:19;;;;:::i;:::-;32302:9;:32;;32294:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;27558:4;32424:8;32407:25;;:14;;:25;;;;:::i;:::-;:35;;32399:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;32517:2;32500:6;;:13;;:19;;32492:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;32562:14;;;;;;;;;;;32558:134;;;32610:14;32617:6;;32610;:14::i;:::-;32602:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;32558:134;32707:17;;;;;;;;;;;32704:122;;;32758:9;:21;32768:10;32758:21;;;;;;;;;;;;;;;;;;;;;;;;;32750:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32704:122;32842:6;32838:186;32858:8;32854:12;;:1;:12;32838:186;;;32915:1;32897:14;;:19;;;;;;;:::i;:::-;;;;;;;;32931:39;32943:10;32955:14;;32931:11;:39::i;:::-;33011:1;32985:10;:22;32996:10;32985:22;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;32868:3;;;;;:::i;:::-;;;;32838:186;;;;33041:28;33048:10;33060:8;33041:28;;;;;;;:::i;:::-;;;;;;;;31945:1132;;;:::o;16451:209::-;16608:46;16626:5;16633:3;16638:8;16648:5;;16608:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;16451:209;;;;;:::o;33749:103::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;33840:4:::1;;33826:11;:18;;;;;;;:::i;:::-;;33749:103:::0;;:::o;28638:578::-;28693:13;28896:1;28886:7;:11;28878:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;28953:14;;28942:7;:25;;28934:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29014:17;29042:19;29084:20;29096:7;29084:11;:20::i;:::-;29072:32;;29141:11;29154:9;29165:10;;;;;;;;;;;;;;;;;29124:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29115:61;;29201:6;29187:21;;;;28638:578;;;:::o;34226:85::-;34267:4;27558;34290:13;;34226:85;:::o;33565:109::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;33624:10:::1;;;;;;;;;;;:19;;:42;33644:21;33624:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;33565:109::o:0;21478:192::-;21606:4;21629:16;:24;21646:6;21629:24;;;;;;;;;;;;;;;:35;21654:9;21629:35;;;;;;;;;;;;;;;;;;;;;;;;;21622:42;;21478:192;;;;:::o;12597:238::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12719:1:::1;12698:23;;:9;:23;;;;12723:31;;;;;;;;;;;;;;;;::::0;12690:65:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12795:9;12767:38;;12788:5;;;;;;;;;;;12767:38;;;;;;;;;;;;12820:9;12812:5;;:17;;;;;;;;;;;;;;;;;;12597:238:::0;:::o;11596:51::-;;;;;;;;;;;;;;;;;;;:::o;33923:99::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;34006:8:::1;33994:9;:20;;;;33923:99:::0;:::o;30976:119::-;12390:5;;;;;;;;;;;12376:19;;:10;:19;;;12397:17;;;;;;;;;;;;;;;;;12368:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;31076:11:::1;31063:10;;:24;;;;;;;;;;;;;;;;;;30976:119:::0;:::o;21861:275::-;21950:12;21965:9;:19;21975:8;21965:19;;;;;;;;;;;;;;;;;;;;;21950:34;;21991:24;22006:8;21991:14;:24::i;:::-;22024:30;22039:4;22045:8;22024:14;:30::i;:::-;22061:26;22073:3;22078:8;22061:11;:26::i;:::-;22121:8;22116:3;22101:29;;22110:4;22101:29;;;;;;;;;;;;21943:193;21861:275;;:::o;22527:297::-;22648:1;22633:17;;:3;:17;;;;22652:12;;;;;;;;;;;;;;;;;22625:40;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22711:1;22680:33;;:9;:19;22690:8;22680:19;;;;;;;;;;;;;;;;;;;;;:33;;;22715:18;;;;;;;;;;;;;;;;;22672:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22743:26;22755:3;22760:8;22743:11;:26::i;:::-;22809:8;22804:3;22783:35;;22800:1;22783:35;;;;;;;;;;;;22527:297;;:::o;25263:590::-;25411:8;14947:18;14968:9;:19;14978:8;14968:19;;;;;;;;;;;;;;;;;;;;;14947:40;;15024:10;15010:24;;:10;:24;;;:71;;;;15071:10;15045:36;;:12;:22;15058:8;15045:22;;;;;;;;;;;;;;;;;;;;;:36;;;15010:71;:122;;;;15092:16;:28;15109:10;15092:28;;;;;;;;;;;;;;;:40;15121:10;15092:40;;;;;;;;;;;;;;;;;;;;;;;;;15010:122;15141:30;;;;;;;;;;;;;;;;;14994:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25439:8:::1;15414:1;15383:33;;:9;:19;15393:8;15383:19;;;;;;;;;;;;;;;;;;;;;:33;;;;15418:13;;;;;;;;;;;;;;;;::::0;15375:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25459:18:::2;25480:9;:19;25490:8;25480:19;;;;;;;;;;;;;;;;;;;;;25459:40;;25528:5;25514:19;;:10;:19;;;25535:9;;;;;;;;;;;;;;;;::::0;25506:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25575:1;25560:17;;:3;:17;;;;25579:12;;;;;;;;;;;;;;;;::::0;25552:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25601:24;25611:3;25616:8;25601:9;:24::i;:::-;25638:16;:3;:14;;;:16::i;:::-;25634:214;;;25670:13;25706:3;25686:41;;;25728:10;25740:5;25747:8;25757:5;25686:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25670:93;;13785:10;25790:24;;25780:34;;;:6;:34;;;;25816:23;;;;;;;;;;;;;;;;::::0;25772:68:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25661:187;25634:214;25452:401;15185:1:::1;14940:252:::0;25263:590;;;;;:::o;24822:163::-;24926:7;24952:19;:27;24972:6;24952:27;;;;;;;;;;;;;;;;24945:34;;24822:163;;;:::o;1047:755::-;1173:4;1189:20;1212:4;1189:27;;1230:9;1225:464;1249:5;:12;1245:1;:16;1225:464;;;1277:20;1300:5;1306:1;1300:8;;;;;;;;:::i;:::-;;;;;;;;1277:31;;1338:12;1323;:27;1319:363;;;1476:12;1490;1459:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1449:55;;;;;;1434:70;;1319:363;;;1644:12;1658;1627:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1617:55;;;;;;1602:70;;1319:363;1268:421;1263:3;;;;;:::i;:::-;;;;1225:464;;;;1792:4;1776:12;:20;1769:27;;;1047:755;;;;;:::o;31196:400::-;31247:11;31280:1;31275;:6;31271:297;;;31307:9;;;31271:297;;;31367:190;31378:1;31374;:5;31367:190;;;31441:6;31433:3;31428:9;;:20;;;;:::i;:::-;31420:29;;31414:35;;31501:13;31495:2;31489;31485:1;:6;;;;:::i;:::-;31484:13;;;;:::i;:::-;31483:31;;;;:::i;:::-;31475:40;;31468:47;;;;31539:2;31534:7;;;;;:::i;:::-;;;31367:190;;;31271:297;31196:400;;;:::o;25986:110::-;26068:12;:22;26081:8;26068:22;;;;;;;;;;;;26061:29;;;;;;;;;;;25986:110;:::o;23784:234::-;23924:5;23901:28;;:9;:19;23911:8;23901:19;;;;;;;;;;;;;;;;;;;;;:28;;;23931:9;;;;;;;;;;;;;;;;;23893:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23978:1;23948:19;:26;23968:5;23948:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;23993:9;:19;24003:8;23993:19;;;;;;;;;;;;23986:26;;;;;;;;;;;23784:234;;:::o;24285:242::-;24428:1;24397:33;;:9;:19;24407:8;24397:19;;;;;;;;;;;;;;;;;;;;;:33;;;24432:18;;;;;;;;;;;;;;;;;24389:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24482:3;24460:9;:19;24470:8;24460:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;24520:1;24492:19;:24;24512:3;24492:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;24285:242;;:::o;426:589::-;484:4;497:12;980:5;968:18;960:26;;1008:1;1001:4;:8;994:15;;;426:589;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:77::-;6287:7;6316:5;6305:16;;6250:77;;;:::o;6333:118::-;6420:24;6438:5;6420:24;:::i;:::-;6415:3;6408:37;6333:118;;:::o;6457:222::-;6550:4;6588:2;6577:9;6573:18;6565:26;;6601:71;6669:1;6658:9;6654:17;6645:6;6601:71;:::i;:::-;6457:222;;;;:::o;6685:86::-;6720:7;6760:4;6753:5;6749:16;6738:27;;6685:86;;;:::o;6777:118::-;6848:22;6864:5;6848:22;:::i;:::-;6841:5;6838:33;6828:61;;6885:1;6882;6875:12;6828:61;6777:118;:::o;6901:135::-;6945:5;6983:6;6970:20;6961:29;;6999:31;7024:5;6999:31;:::i;:::-;6901:135;;;;:::o;7042:325::-;7099:6;7148:2;7136:9;7127:7;7123:23;7119:32;7116:119;;;7154:79;;:::i;:::-;7116:119;7274:1;7299:51;7342:7;7333:6;7322:9;7318:22;7299:51;:::i;:::-;7289:61;;7245:115;7042:325;;;;:::o;7373:117::-;7482:1;7479;7472:12;7496:117;7605:1;7602;7595:12;7619:117;7728:1;7725;7718:12;7759:568;7832:8;7842:6;7892:3;7885:4;7877:6;7873:17;7869:27;7859:122;;7900:79;;:::i;:::-;7859:122;8013:6;8000:20;7990:30;;8043:18;8035:6;8032:30;8029:117;;;8065:79;;:::i;:::-;8029:117;8179:4;8171:6;8167:17;8155:29;;8233:3;8225:4;8217:6;8213:17;8203:8;8199:32;8196:41;8193:128;;;8240:79;;:::i;:::-;8193:128;7759:568;;;;;:::o;8333:559::-;8419:6;8427;8476:2;8464:9;8455:7;8451:23;8447:32;8444:119;;;8482:79;;:::i;:::-;8444:119;8630:1;8619:9;8615:17;8602:31;8660:18;8652:6;8649:30;8646:117;;;8682:79;;:::i;:::-;8646:117;8795:80;8867:7;8858:6;8847:9;8843:22;8795:80;:::i;:::-;8777:98;;;;8573:312;8333:559;;;;;:::o;8898:122::-;8971:24;8989:5;8971:24;:::i;:::-;8964:5;8961:35;8951:63;;9010:1;9007;9000:12;8951:63;8898:122;:::o;9026:139::-;9072:5;9110:6;9097:20;9088:29;;9126:33;9153:5;9126:33;:::i;:::-;9026:139;;;;:::o;9171:329::-;9230:6;9279:2;9267:9;9258:7;9254:23;9250:32;9247:119;;;9285:79;;:::i;:::-;9247:119;9405:1;9430:53;9475:7;9466:6;9455:9;9451:22;9430:53;:::i;:::-;9420:63;;9376:117;9171:329;;;;:::o;9523:568::-;9596:8;9606:6;9656:3;9649:4;9641:6;9637:17;9633:27;9623:122;;9664:79;;:::i;:::-;9623:122;9777:6;9764:20;9754:30;;9807:18;9799:6;9796:30;9793:117;;;9829:79;;:::i;:::-;9793:117;9943:4;9935:6;9931:17;9919:29;;9997:3;9989:4;9981:6;9977:17;9967:8;9963:32;9960:41;9957:128;;;10004:79;;:::i;:::-;9957:128;9523:568;;;;;:::o;10097:559::-;10183:6;10191;10240:2;10228:9;10219:7;10215:23;10211:32;10208:119;;;10246:79;;:::i;:::-;10208:119;10394:1;10383:9;10379:17;10366:31;10424:18;10416:6;10413:30;10410:117;;;10446:79;;:::i;:::-;10410:117;10559:80;10631:7;10622:6;10611:9;10607:22;10559:80;:::i;:::-;10541:98;;;;10337:312;10097:559;;;;;:::o;10662:116::-;10732:21;10747:5;10732:21;:::i;:::-;10725:5;10722:32;10712:60;;10768:1;10765;10758:12;10712:60;10662:116;:::o;10784:133::-;10827:5;10865:6;10852:20;10843:29;;10881:30;10905:5;10881:30;:::i;:::-;10784:133;;;;:::o;10923:468::-;10988:6;10996;11045:2;11033:9;11024:7;11020:23;11016:32;11013:119;;;11051:79;;:::i;:::-;11013:119;11171:1;11196:53;11241:7;11232:6;11221:9;11217:22;11196:53;:::i;:::-;11186:63;;11142:117;11298:2;11324:50;11366:7;11357:6;11346:9;11342:22;11324:50;:::i;:::-;11314:60;;11269:115;10923:468;;;;;:::o;11397:700::-;11490:6;11498;11506;11555:2;11543:9;11534:7;11530:23;11526:32;11523:119;;;11561:79;;:::i;:::-;11523:119;11681:1;11706:51;11749:7;11740:6;11729:9;11725:22;11706:51;:::i;:::-;11696:61;;11652:115;11834:2;11823:9;11819:18;11806:32;11865:18;11857:6;11854:30;11851:117;;;11887:79;;:::i;:::-;11851:117;12000:80;12072:7;12063:6;12052:9;12048:22;12000:80;:::i;:::-;11982:98;;;;11777:313;11397:700;;;;;:::o;12116:552::-;12173:8;12183:6;12233:3;12226:4;12218:6;12214:17;12210:27;12200:122;;12241:79;;:::i;:::-;12200:122;12354:6;12341:20;12331:30;;12384:18;12376:6;12373:30;12370:117;;;12406:79;;:::i;:::-;12370:117;12520:4;12512:6;12508:17;12496:29;;12574:3;12566:4;12558:6;12554:17;12544:8;12540:32;12537:41;12534:128;;;12581:79;;:::i;:::-;12534:128;12116:552;;;;;:::o;12674:963::-;12771:6;12779;12787;12795;12803;12852:3;12840:9;12831:7;12827:23;12823:33;12820:120;;;12859:79;;:::i;:::-;12820:120;12979:1;13004:53;13049:7;13040:6;13029:9;13025:22;13004:53;:::i;:::-;12994:63;;12950:117;13106:2;13132:53;13177:7;13168:6;13157:9;13153:22;13132:53;:::i;:::-;13122:63;;13077:118;13234:2;13260:53;13305:7;13296:6;13285:9;13281:22;13260:53;:::i;:::-;13250:63;;13205:118;13390:2;13379:9;13375:18;13362:32;13421:18;13413:6;13410:30;13407:117;;;13443:79;;:::i;:::-;13407:117;13556:64;13612:7;13603:6;13592:9;13588:22;13556:64;:::i;:::-;13538:82;;;;13333:297;12674:963;;;;;;;;:::o;13657:553::-;13715:8;13725:6;13775:3;13768:4;13760:6;13756:17;13752:27;13742:122;;13783:79;;:::i;:::-;13742:122;13896:6;13883:20;13873:30;;13926:18;13918:6;13915:30;13912:117;;;13948:79;;:::i;:::-;13912:117;14062:4;14054:6;14050:17;14038:29;;14116:3;14108:4;14100:6;14096:17;14086:8;14082:32;14079:41;14076:128;;;14123:79;;:::i;:::-;14076:128;13657:553;;;;;:::o;14216:529::-;14287:6;14295;14344:2;14332:9;14323:7;14319:23;14315:32;14312:119;;;14350:79;;:::i;:::-;14312:119;14498:1;14487:9;14483:17;14470:31;14528:18;14520:6;14517:30;14514:117;;;14550:79;;:::i;:::-;14514:117;14663:65;14720:7;14711:6;14700:9;14696:22;14663:65;:::i;:::-;14645:83;;;;14441:297;14216:529;;;;;:::o;14751:474::-;14819:6;14827;14876:2;14864:9;14855:7;14851:23;14847:32;14844:119;;;14882:79;;:::i;:::-;14844:119;15002:1;15027:53;15072:7;15063:6;15052:9;15048:22;15027:53;:::i;:::-;15017:63;;14973:117;15129:2;15155:53;15200:7;15191:6;15180:9;15176:22;15155:53;:::i;:::-;15145:63;;15100:118;14751:474;;;;;:::o;15231:104::-;15276:7;15305:24;15323:5;15305:24;:::i;:::-;15294:35;;15231:104;;;:::o;15341:138::-;15422:32;15448:5;15422:32;:::i;:::-;15415:5;15412:43;15402:71;;15469:1;15466;15459:12;15402:71;15341:138;:::o;15485:155::-;15539:5;15577:6;15564:20;15555:29;;15593:41;15628:5;15593:41;:::i;:::-;15485:155;;;;:::o;15646:345::-;15713:6;15762:2;15750:9;15741:7;15737:23;15733:32;15730:119;;;15768:79;;:::i;:::-;15730:119;15888:1;15913:61;15966:7;15957:6;15946:9;15942:22;15913:61;:::i;:::-;15903:71;;15859:125;15646:345;;;;:::o;15997:180::-;16045:77;16042:1;16035:88;16142:4;16139:1;16132:15;16166:4;16163:1;16156:15;16183:320;16227:6;16264:1;16258:4;16254:12;16244:22;;16311:1;16305:4;16301:12;16332:18;16322:81;;16388:4;16380:6;16376:17;16366:27;;16322:81;16450:2;16442:6;16439:14;16419:18;16416:38;16413:84;;;16469:18;;:::i;:::-;16413:84;16234:269;16183:320;;;:::o;16509:225::-;16649:34;16645:1;16637:6;16633:14;16626:58;16718:8;16713:2;16705:6;16701:15;16694:33;16509:225;:::o;16740:366::-;16882:3;16903:67;16967:2;16962:3;16903:67;:::i;:::-;16896:74;;16979:93;17068:3;16979:93;:::i;:::-;17097:2;17092:3;17088:12;17081:19;;16740:366;;;:::o;17112:419::-;17278:4;17316:2;17305:9;17301:18;17293:26;;17365:9;17359:4;17355:20;17351:1;17340:9;17336:17;17329:47;17393:131;17519:4;17393:131;:::i;:::-;17385:139;;17112:419;;;:::o;17537:180::-;17585:77;17582:1;17575:88;17682:4;17679:1;17672:15;17706:4;17703:1;17696:15;17723:305;17763:3;17782:20;17800:1;17782:20;:::i;:::-;17777:25;;17816:20;17834:1;17816:20;:::i;:::-;17811:25;;17970:1;17902:66;17898:74;17895:1;17892:81;17889:107;;;17976:18;;:::i;:::-;17889:107;18020:1;18017;18013:9;18006:16;;17723:305;;;;:::o;18034:221::-;18174:34;18170:1;18162:6;18158:14;18151:58;18243:4;18238:2;18230:6;18226:15;18219:29;18034:221;:::o;18261:366::-;18403:3;18424:67;18488:2;18483:3;18424:67;:::i;:::-;18417:74;;18500:93;18589:3;18500:93;:::i;:::-;18618:2;18613:3;18609:12;18602:19;;18261:366;;;:::o;18633:419::-;18799:4;18837:2;18826:9;18822:18;18814:26;;18886:9;18880:4;18876:20;18872:1;18861:9;18857:17;18850:47;18914:131;19040:4;18914:131;:::i;:::-;18906:139;;18633:419;;;:::o;19058:233::-;19097:3;19120:24;19138:5;19120:24;:::i;:::-;19111:33;;19166:66;19159:5;19156:77;19153:103;;;19236:18;;:::i;:::-;19153:103;19283:1;19276:5;19272:13;19265:20;;19058:233;;;:::o;19297:180::-;19345:77;19342:1;19335:88;19442:4;19439:1;19432:15;19466:4;19463:1;19456:15;19483:177;19623:29;19619:1;19611:6;19607:14;19600:53;19483:177;:::o;19666:366::-;19808:3;19829:67;19893:2;19888:3;19829:67;:::i;:::-;19822:74;;19905:93;19994:3;19905:93;:::i;:::-;20023:2;20018:3;20014:12;20007:19;;19666:366;;;:::o;20038:419::-;20204:4;20242:2;20231:9;20227:18;20219:26;;20291:9;20285:4;20281:20;20277:1;20266:9;20262:17;20255:47;20319:131;20445:4;20319:131;:::i;:::-;20311:139;;20038:419;;;:::o;20463:178::-;20603:30;20599:1;20591:6;20587:14;20580:54;20463:178;:::o;20647:366::-;20789:3;20810:67;20874:2;20869:3;20810:67;:::i;:::-;20803:74;;20886:93;20975:3;20886:93;:::i;:::-;21004:2;20999:3;20995:12;20988:19;;20647:366;;;:::o;21019:419::-;21185:4;21223:2;21212:9;21208:18;21200:26;;21272:9;21266:4;21262:20;21258:1;21247:9;21243:17;21236:47;21300:131;21426:4;21300:131;:::i;:::-;21292:139;;21019:419;;;:::o;21444:171::-;21584:23;21580:1;21572:6;21568:14;21561:47;21444:171;:::o;21621:366::-;21763:3;21784:67;21848:2;21843:3;21784:67;:::i;:::-;21777:74;;21860:93;21949:3;21860:93;:::i;:::-;21978:2;21973:3;21969:12;21962:19;;21621:366;;;:::o;21993:419::-;22159:4;22197:2;22186:9;22182:18;22174:26;;22246:9;22240:4;22236:20;22232:1;22221:9;22217:17;22210:47;22274:131;22400:4;22274:131;:::i;:::-;22266:139;;21993:419;;;:::o;22418:169::-;22558:21;22554:1;22546:6;22542:14;22535:45;22418:169;:::o;22593:366::-;22735:3;22756:67;22820:2;22815:3;22756:67;:::i;:::-;22749:74;;22832:93;22921:3;22832:93;:::i;:::-;22950:2;22945:3;22941:12;22934:19;;22593:366;;;:::o;22965:419::-;23131:4;23169:2;23158:9;23154:18;23146:26;;23218:9;23212:4;23208:20;23204:1;23193:9;23189:17;23182:47;23246:131;23372:4;23246:131;:::i;:::-;23238:139;;22965:419;;;:::o;23390:94::-;23423:8;23471:5;23467:2;23463:14;23442:35;;23390:94;;;:::o;23490:::-;23529:7;23558:20;23572:5;23558:20;:::i;:::-;23547:31;;23490:94;;;:::o;23590:100::-;23629:7;23658:26;23678:5;23658:26;:::i;:::-;23647:37;;23590:100;;;:::o;23696:157::-;23801:45;23821:24;23839:5;23821:24;:::i;:::-;23801:45;:::i;:::-;23796:3;23789:58;23696:157;;:::o;23859:256::-;23971:3;23986:75;24057:3;24048:6;23986:75;:::i;:::-;24086:2;24081:3;24077:12;24070:19;;24106:3;24099:10;;23859:256;;;;:::o;24121:237::-;24261:34;24257:1;24249:6;24245:14;24238:58;24330:20;24325:2;24317:6;24313:15;24306:45;24121:237;:::o;24364:366::-;24506:3;24527:67;24591:2;24586:3;24527:67;:::i;:::-;24520:74;;24603:93;24692:3;24603:93;:::i;:::-;24721:2;24716:3;24712:12;24705:19;;24364:366;;;:::o;24736:419::-;24902:4;24940:2;24929:9;24925:18;24917:26;;24989:9;24983:4;24979:20;24975:1;24964:9;24960:17;24953:47;25017:131;25143:4;25017:131;:::i;:::-;25009:139;;24736:419;;;:::o;25161:176::-;25301:28;25297:1;25289:6;25285:14;25278:52;25161:176;:::o;25343:366::-;25485:3;25506:67;25570:2;25565:3;25506:67;:::i;:::-;25499:74;;25582:93;25671:3;25582:93;:::i;:::-;25700:2;25695:3;25691:12;25684:19;;25343:366;;;:::o;25715:419::-;25881:4;25919:2;25908:9;25904:18;25896:26;;25968:9;25962:4;25958:20;25954:1;25943:9;25939:17;25932:47;25996:131;26122:4;25996:131;:::i;:::-;25988:139;;25715:419;;;:::o;26140:227::-;26280:34;26276:1;26268:6;26264:14;26257:58;26349:10;26344:2;26336:6;26332:15;26325:35;26140:227;:::o;26373:366::-;26515:3;26536:67;26600:2;26595:3;26536:67;:::i;:::-;26529:74;;26612:93;26701:3;26612:93;:::i;:::-;26730:2;26725:3;26721:12;26714:19;;26373:366;;;:::o;26745:419::-;26911:4;26949:2;26938:9;26934:18;26926:26;;26998:9;26992:4;26988:20;26984:1;26973:9;26969:17;26962:47;27026:131;27152:4;27026:131;:::i;:::-;27018:139;;26745:419;;;:::o;27170:348::-;27210:7;27233:20;27251:1;27233:20;:::i;:::-;27228:25;;27267:20;27285:1;27267:20;:::i;:::-;27262:25;;27455:1;27387:66;27383:74;27380:1;27377:81;27372:1;27365:9;27358:17;27354:105;27351:131;;;27462:18;;:::i;:::-;27351:131;27510:1;27507;27503:9;27492:20;;27170:348;;;;:::o;27524:236::-;27664:34;27660:1;27652:6;27648:14;27641:58;27733:19;27728:2;27720:6;27716:15;27709:44;27524:236;:::o;27766:366::-;27908:3;27929:67;27993:2;27988:3;27929:67;:::i;:::-;27922:74;;28005:93;28094:3;28005:93;:::i;:::-;28123:2;28118:3;28114:12;28107:19;;27766:366;;;:::o;28138:419::-;28304:4;28342:2;28331:9;28327:18;28319:26;;28391:9;28385:4;28381:20;28377:1;28366:9;28362:17;28355:47;28419:131;28545:4;28419:131;:::i;:::-;28411:139;;28138:419;;;:::o;28563:221::-;28703:34;28699:1;28691:6;28687:14;28680:58;28772:4;28767:2;28759:6;28755:15;28748:29;28563:221;:::o;28790:366::-;28932:3;28953:67;29017:2;29012:3;28953:67;:::i;:::-;28946:74;;29029:93;29118:3;29029:93;:::i;:::-;29147:2;29142:3;29138:12;29131:19;;28790:366;;;:::o;29162:419::-;29328:4;29366:2;29355:9;29351:18;29343:26;;29415:9;29409:4;29405:20;29401:1;29390:9;29386:17;29379:47;29443:131;29569:4;29443:131;:::i;:::-;29435:139;;29162:419;;;:::o;29587:163::-;29727:15;29723:1;29715:6;29711:14;29704:39;29587:163;:::o;29756:366::-;29898:3;29919:67;29983:2;29978:3;29919:67;:::i;:::-;29912:74;;29995:93;30084:3;29995:93;:::i;:::-;30113:2;30108:3;30104:12;30097:19;;29756:366;;;:::o;30128:419::-;30294:4;30332:2;30321:9;30317:18;30309:26;;30381:9;30375:4;30371:20;30367:1;30356:9;30352:17;30345:47;30409:131;30535:4;30409:131;:::i;:::-;30401:139;;30128:419;;;:::o;30553:238::-;30693:34;30689:1;30681:6;30677:14;30670:58;30762:21;30757:2;30749:6;30745:15;30738:46;30553:238;:::o;30797:366::-;30939:3;30960:67;31024:2;31019:3;30960:67;:::i;:::-;30953:74;;31036:93;31125:3;31036:93;:::i;:::-;31154:2;31149:3;31145:12;31138:19;;30797:366;;;:::o;31169:419::-;31335:4;31373:2;31362:9;31358:18;31350:26;;31422:9;31416:4;31412:20;31408:1;31397:9;31393:17;31386:47;31450:131;31576:4;31450:131;:::i;:::-;31442:139;;31169:419;;;:::o;31594:180::-;31734:32;31730:1;31722:6;31718:14;31711:56;31594:180;:::o;31780:366::-;31922:3;31943:67;32007:2;32002:3;31943:67;:::i;:::-;31936:74;;32019:93;32108:3;32019:93;:::i;:::-;32137:2;32132:3;32128:12;32121:19;;31780:366;;;:::o;32152:419::-;32318:4;32356:2;32345:9;32341:18;32333:26;;32405:9;32399:4;32395:20;32391:1;32380:9;32376:17;32369:47;32433:131;32559:4;32433:131;:::i;:::-;32425:139;;32152:419;;;:::o;32577:60::-;32605:3;32626:5;32619:12;;32577:60;;;:::o;32643:138::-;32691:9;32724:51;32742:32;32751:22;32767:5;32751:22;:::i;:::-;32742:32;:::i;:::-;32724:51;:::i;:::-;32711:64;;32643:138;;;:::o;32787:127::-;32872:35;32901:5;32872:35;:::i;:::-;32867:3;32860:48;32787:127;;:::o;32920:328::-;33039:4;33077:2;33066:9;33062:18;33054:26;;33090:71;33158:1;33147:9;33143:17;33134:6;33090:71;:::i;:::-;33171:70;33237:2;33226:9;33222:18;33213:6;33171:70;:::i;:::-;32920:328;;;;;:::o;33254:171::-;33394:23;33390:1;33382:6;33378:14;33371:47;33254:171;:::o;33431:366::-;33573:3;33594:67;33658:2;33653:3;33594:67;:::i;:::-;33587:74;;33670:93;33759:3;33670:93;:::i;:::-;33788:2;33783:3;33779:12;33772:19;;33431:366;;;:::o;33803:419::-;33969:4;34007:2;33996:9;33992:18;33984:26;;34056:9;34050:4;34046:20;34042:1;34031:9;34027:17;34020:47;34084:131;34210:4;34084:131;:::i;:::-;34076:139;;33803:419;;;:::o;34228:179::-;34368:31;34364:1;34356:6;34352:14;34345:55;34228:179;:::o;34413:366::-;34555:3;34576:67;34640:2;34635:3;34576:67;:::i;:::-;34569:74;;34652:93;34741:3;34652:93;:::i;:::-;34770:2;34765:3;34761:12;34754:19;;34413:366;;;:::o;34785:419::-;34951:4;34989:2;34978:9;34974:18;34966:26;;35038:9;35032:4;35028:20;35024:1;35013:9;35009:17;35002:47;35066:131;35192:4;35066:131;:::i;:::-;35058:139;;34785:419;;;:::o;35210:148::-;35312:11;35349:3;35334:18;;35210:148;;;;:::o;35364:141::-;35413:4;35436:3;35428:11;;35459:3;35456:1;35449:14;35493:4;35490:1;35480:18;35472:26;;35364:141;;;:::o;35535:845::-;35638:3;35675:5;35669:12;35704:36;35730:9;35704:36;:::i;:::-;35756:89;35838:6;35833:3;35756:89;:::i;:::-;35749:96;;35876:1;35865:9;35861:17;35892:1;35887:137;;;;36038:1;36033:341;;;;35854:520;;35887:137;35971:4;35967:9;35956;35952:25;35947:3;35940:38;36007:6;36002:3;35998:16;35991:23;;35887:137;;36033:341;36100:38;36132:5;36100:38;:::i;:::-;36160:1;36174:154;36188:6;36185:1;36182:13;36174:154;;;36262:7;36256:14;36252:1;36247:3;36243:11;36236:35;36312:1;36303:7;36299:15;36288:26;;36210:4;36207:1;36203:12;36198:17;;36174:154;;;36357:6;36352:3;36348:16;36341:23;;36040:334;;35854:520;;35642:738;;35535:845;;;;:::o;36386:79::-;36425:7;36454:5;36443:16;;36386:79;;;:::o;36471:157::-;36576:45;36596:24;36614:5;36596:24;:::i;:::-;36576:45;:::i;:::-;36571:3;36564:58;36471:157;;:::o;36634:377::-;36740:3;36768:39;36801:5;36768:39;:::i;:::-;36823:89;36905:6;36900:3;36823:89;:::i;:::-;36816:96;;36921:52;36966:6;36961:3;36954:4;36947:5;36943:16;36921:52;:::i;:::-;36998:6;36993:3;36989:16;36982:23;;36744:267;36634:377;;;;:::o;37017:570::-;37222:3;37244:92;37332:3;37323:6;37244:92;:::i;:::-;37237:99;;37346:75;37417:3;37408:6;37346:75;:::i;:::-;37446:2;37441:3;37437:12;37430:19;;37466:95;37557:3;37548:6;37466:95;:::i;:::-;37459:102;;37578:3;37571:10;;37017:570;;;;;;:::o;37593:98::-;37644:6;37678:5;37672:12;37662:22;;37593:98;;;:::o;37697:168::-;37780:11;37814:6;37809:3;37802:19;37854:4;37849:3;37845:14;37830:29;;37697:168;;;;:::o;37871:360::-;37957:3;37985:38;38017:5;37985:38;:::i;:::-;38039:70;38102:6;38097:3;38039:70;:::i;:::-;38032:77;;38118:52;38163:6;38158:3;38151:4;38144:5;38140:16;38118:52;:::i;:::-;38195:29;38217:6;38195:29;:::i;:::-;38190:3;38186:39;38179:46;;37961:270;37871:360;;;;:::o;38237:640::-;38432:4;38470:3;38459:9;38455:19;38447:27;;38484:71;38552:1;38541:9;38537:17;38528:6;38484:71;:::i;:::-;38565:72;38633:2;38622:9;38618:18;38609:6;38565:72;:::i;:::-;38647;38715:2;38704:9;38700:18;38691:6;38647:72;:::i;:::-;38766:9;38760:4;38756:20;38751:2;38740:9;38736:18;38729:48;38794:76;38865:4;38856:6;38794:76;:::i;:::-;38786:84;;38237:640;;;;;;;:::o;38883:141::-;38939:5;38970:6;38964:13;38955:22;;38986:32;39012:5;38986:32;:::i;:::-;38883:141;;;;:::o;39030:349::-;39099:6;39148:2;39136:9;39127:7;39123:23;39119:32;39116:119;;;39154:79;;:::i;:::-;39116:119;39274:1;39299:63;39354:7;39345:6;39334:9;39330:22;39299:63;:::i;:::-;39289:73;;39245:127;39030:349;;;;:::o;39385:397::-;39525:3;39540:75;39611:3;39602:6;39540:75;:::i;:::-;39640:2;39635:3;39631:12;39624:19;;39653:75;39724:3;39715:6;39653:75;:::i;:::-;39753:2;39748:3;39744:12;39737:19;;39773:3;39766:10;;39385:397;;;;;:::o;39788:180::-;39836:77;39833:1;39826:88;39933:4;39930:1;39923:15;39957:4;39954:1;39947:15;39974:185;40014:1;40031:20;40049:1;40031:20;:::i;:::-;40026:25;;40065:20;40083:1;40065:20;:::i;:::-;40060:25;;40104:1;40094:35;;40109:18;;:::i;:::-;40094:35;40151:1;40148;40144:9;40139:14;;39974:185;;;;:::o;40165:176::-;40197:1;40214:20;40232:1;40214:20;:::i;:::-;40209:25;;40248:20;40266:1;40248:20;:::i;:::-;40243:25;;40287:1;40277:35;;40292:18;;:::i;:::-;40277:35;40333:1;40330;40326:9;40321:14;;40165:176;;;;:::o;40347:191::-;40387:4;40407:20;40425:1;40407:20;:::i;:::-;40402:25;;40441:20;40459:1;40441:20;:::i;:::-;40436:25;;40480:1;40477;40474:8;40471:34;;;40485:18;;:::i;:::-;40471:34;40530:1;40527;40523:9;40515:17;;40347:191;;;;:::o

Swarm Source

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