<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _ParseIndexTable( self, parser_mediator, file_system, file_entry, index_table):
 """Parses a Chrome Cache index table. Args: parser_mediator (ParserMediator):
 mediates interactions between parsers and other components, such as storage and dfvfs. file_system (dfvfs.FileSystem):
 file system. file_entry (dfvfs.FileEntry):
 file entry. index_table (list[CacheAddress]):
 the cache addresses which are stored in the index file. """

    # Build a lookup table for the data block files.
    path_segments = file_system.SplitPath(file_entry.path_spec.location)

    data_block_files = {}
    for cache_address in index_table:
      if cache_address.filename not in data_block_files:
        # Remove the previous filename from the path segments list and
        # add one of the data block files.
        path_segments.pop()
        path_segments.append(cache_address.filename)

        # We need to pass only used arguments to the path specification
        # factory otherwise it will raise.
        kwargs = {}
        if file_entry.path_spec.parent:
          kwargs['parent'] = file_entry.path_spec.parent
        kwargs['location'] = file_system.JoinPath(path_segments)

        data_block_file_path_spec = path_spec_factory.Factory.NewPathSpec(
            file_entry.path_spec.TYPE_INDICATOR, **kwargs)

        try:
          data_block_file_entry = path_spec_resolver.Resolver.OpenFileEntry(
              data_block_file_path_spec)
        except RuntimeError as exception:
          message = (
              'Unable to open data block file: {0:s} with error: '
              '{1!s}'.format(kwargs['location'], exception))
          parser_mediator.ProduceExtractionWarning(message)
          data_block_file_entry = None

        if not data_block_file_entry:
          message = 'Missing data block file: {0:s}'.format(
              cache_address.filename)
          parser_mediator.ProduceExtractionWarning(message)
          data_block_file_object = None

        else:
          data_block_file_object = data_block_file_entry.GetFileObject()

          try:
            self._data_block_file_parser.ParseFileObject(
                parser_mediator, data_block_file_object)
          except (IOError, errors.ParseError) as exception:
            message = (
                'Unable to parse data block file: {0:s} with error: '
                '{1!s}').format(cache_address.filename, exception)
            parser_mediator.ProduceExtractionWarning(message)
            data_block_file_object.close()
            data_block_file_object = None

        data_block_files[cache_address.filename] = data_block_file_object

    try:
      self._ParseCacheEntries(
          parser_mediator, index_table, data_block_files)
    finally:
      for data_block_file_object in iter(data_block_files.values()):
        if data_block_file_object:
          data_block_file_object.close()