def ParseRow(self, parser_mediator, row_offset, row):
    """Parses a line of the log file and produces events.

    Args:
      parser_mediator (ParserMediator): mediates interactions between parsers
          and other components, such as storage and dfvfs.
      row_offset (int): line number of the row.
      row (dict[str, str]): fields of a single row, as specified in COLUMNS.
    """
    time_elements_tuple = self._GetTimeElementsTuple(row['time'])

    try:
      date_time = dfdatetime_time_elements.TimeElements(
          time_elements_tuple=time_elements_tuple)
      date_time.is_local_time = True
    except ValueError:
      parser_mediator.ProduceExtractionWarning(
          'invalid date time value: {0!s}'.format(time_elements_tuple))
      return

    # TODO: remove unused attributes.
    event_data = SymantecEventData()
    event_data.access = row.get('access', None)
    event_data.action0 = row.get('action0', None)
    event_data.action1 = row.get('action1', None)
    event_data.action1_status = row.get('action1_status', None)
    event_data.action2 = row.get('action2', None)
    event_data.action2_status = row.get('action2_status', None)
    event_data.address = row.get('address', None)
    event_data.backup_id = row.get('backup_id', None)
    event_data.cat = row.get('cat', None)
    event_data.cleaninfo = row.get('cleaninfo', None)
    event_data.clientgroup = row.get('clientgroup', None)
    event_data.compressed = row.get('compressed', None)
    event_data.computer = row.get('computer', None)
    event_data.definfo = row.get('definfo', None)
    event_data.defseqnumber = row.get('defseqnumber', None)
    event_data.deleteinfo = row.get('deleteinfo', None)
    event_data.depth = row.get('depth', None)
    event_data.description = row.get('description', None)
    event_data.domain_guid = row.get('domain_guid', None)
    event_data.domainname = row.get('domainname', None)
    event_data.err_code = row.get('err_code', None)
    event_data.event_data = row.get('event_data', None)
    event_data.event = row.get('event', None)
    event_data.extra = row.get('extra', None)
    event_data.file = row.get('file', None)
    event_data.flags = row.get('flags', None)
    event_data.groupid = row.get('groupid', None)
    event_data.guid = row.get('guid', None)
    event_data.license_expiration_dt = row.get('license_expiration_dt', None)
    event_data.license_feature_name = row.get('license_feature_name', None)
    event_data.license_feature_ver = row.get('license_feature_ver', None)
    event_data.license_fulfillment_id = row.get('license_fulfillment_id', None)
    event_data.license_lifecycle = row.get('license_lifecycle', None)
    event_data.license_seats_delta = row.get('license_seats_delta', None)
    event_data.license_seats = row.get('license_seats', None)
    event_data.license_seats_total = row.get('license_seats_total', None)
    event_data.license_serial_num = row.get('license_serial_num', None)
    event_data.license_start_dt = row.get('license_start_dt', None)
    event_data.logger = row.get('logger', None)
    event_data.login_domain = row.get('login_domain', None)
    event_data.log_session_guid = row.get('log_session_guid', None)
    event_data.macaddr = row.get('macaddr', None)
    event_data.new_ext = row.get('new_ext', None)
    event_data.ntdomain = row.get('ntdomain', None)
    event_data.offset = row_offset
    event_data.parent = row.get('parent', None)
    event_data.quarfwd_status = row.get('quarfwd_status', None)
    event_data.remote_machine_ip = row.get('remote_machine_ip', None)
    event_data.remote_machine = row.get('remote_machine', None)
    event_data.scanid = row.get('scanid', None)
    event_data.snd_status = row.get('snd_status', None)
    event_data.status = row.get('status', None)
    event_data.still_infected = row.get('still_infected', None)
    event_data.time = row.get('time', None)
    event_data.user = row.get('user', None)
    event_data.vbin_id = row.get('vbin_id', None)
    event_data.vbin_session_id = row.get('vbin_session_id', None)
    event_data.version = row.get('version:', None)
    event_data.virus_id = row.get('virus_id', None)
    event_data.virus = row.get('virus', None)
    event_data.virustype = row.get('virustype', None)

    event = time_events.DateTimeValuesEvent(
        date_time, definitions.TIME_DESCRIPTION_WRITTEN)
    parser_mediator.ProduceEventWithEventData(event, event_data)
Parses a line of the log file and produces events.

    Args:
      parser_mediator (ParserMediator): mediates interactions between parsers
          and other components, such as storage and dfvfs.
      row_offset (int): line number of the row.
      row (dict[str, str]): fields of a single row, as specified in COLUMNS.