abstract contract ERC165 {
    /**
    * @notice Query if a contract implements an interface
    * @param _interfaceID The interface identifier, as specified in ERC-165
    * @return `true` if the contract implements `_interfaceID`
    */
    function supportsInterface(bytes4 _interfaceID) virtual public pure returns (bool) {
        return _interfaceID == this.supportsInterface.selector;
    }
}
function supportsInterface(bytes4 _interfaceID) virtual public pure returns (bool) {
    return _interfaceID == this.supportsInterface.selector;
}

/**
 * @notice Query if a contract implements an interface
 * @param _interfaceID The interface identifier, as specified in ERC-165
 * @return `true` if the contract implements `_interfaceID`
 */