contract SupportsInterfaceWithLookup is ERC165 {
   bytes4 public constant InterfaceId_ERC165 = 0x01ffc9a7;
   /**
    * 0x01ffc9a7 ===
    *   bytes4(keccak256('supportsInterface(bytes4)'))
    */

   /**
    * @dev a mapping of interface id to whether or not it's supported
    */
   mapping(bytes4 => bool) internal supportedInterfaces;

   /**
    * @dev A contract implementing SupportsInterfaceWithLookup
    * implement ERC165 itself
    */
   constructor() public {
       _registerInterface(InterfaceId_ERC165);
   }

   /**
    * @dev implement supportsInterface(bytes4) using a lookup table
    */
   function supportsInterface(bytes4 _interfaceId) external view returns (bool) {
       return supportedInterfaces[_interfaceId];
   }

   /**
    * @dev private method for registering an interface
    */
   function _registerInterface(bytes4 _interfaceId) internal {
       require(_interfaceId != 0xffffffff);
       supportedInterfaces[_interfaceId] = true;
   }
}
/**
 * @title SupportsInterfaceWithLookup
 * @author Matt Condon (@shrugs)
 * @dev Implements ERC165 using a lookup table.
 */
function supportsInterface(bytes4 _interfaceId) external view returns (bool) {
    return supportedInterfaces[_interfaceId];
}

/**
 * @dev implement supportsInterface(bytes4) using a lookup table
 */