code: def ReadAtOffset(self, offset, size=None):
      
      if size is not None and size < 0:
        raise ValueError('Invalid size value {0!s}'.format(size))
  
      if offset < 0:
        raise ValueError('Invalid offset value {0!s}'.format(offset))
  
      if size == 0 or offset >= self.uncompressed_data_size:
        return b''
  
      if self._cache_start_offset is None:
        self._LoadDataIntoCache(self._file_object, offset)
  
      if offset > self._cache_end_offset or offset < self._cache_start_offset:
        self.FlushCache()
        self._LoadDataIntoCache(self._file_object, offset)
  
      cache_offset = offset - self._cache_start_offset
      if not size:
        return self._cache[cache_offset:]
  
      data_end_offset = cache_offset + size
  
      if data_end_offset > self._cache_end_offset:
        return self._cache[cache_offset:]
  
      return self._cache[cache_offset:data_end_offset]
docs: Reads a byte string from the gzip member at the specified offset.
  
      The function will read a byte string of the specified size or
      all of the remaining data if no size was specified.
  
      Args:
        offset (int): offset within the uncompressed data in this member to
          read from.
        size (Optional[int]): maximum number of bytes to read, where None
            represents all remaining data, to a maximum of the uncompressed
            cache size.
  
      Returns:
        bytes: data read.
  
      Raises:
        IOError: if the read failed.
        ValueError: if a negative read size or offset is specified.