<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def LoadSecondaryConfig(self, filename=None, parser=None):
 """Loads an additional configuration file. The configuration system has the concept of a single Primary configuration file, and multiple secondary files. The primary configuration file is the main file that is used by the program. Any writebacks will only be made to the primary configuration file. Secondary files contain additional configuration data which will be merged into the configuration system. This method adds an additional configuration file. Args: filename: The configuration file that will be loaded. For example file:///etc/grr.conf or reg://HKEY_LOCAL_MACHINE/Software/GRR. parser: An optional parser can be given. In this case, the parser's data will be loaded directly. Returns: The parser used to parse this configuration source. Raises: ValueError: if both filename and parser arguments are None. ConfigFileNotFound: If a specified included file was not found. """

    if filename:
      # Maintain a stack of config file locations in loaded order.
      self.files.append(filename)

      parser_cls = self.GetParserFromFilename(filename)
      parser = parser_cls(filename=filename)
      logging.debug("Loading configuration from %s", filename)
      self.secondary_config_parsers.append(parser)
    elif parser is None:
      raise ValueError("Must provide either a filename or a parser.")

    clone = self.MakeNewConfig()
    clone.MergeData(parser.RawData())
    clone.initialized = True

    for file_to_load in clone["Config.includes"]:
      # We can not include a relative file from a config which does not have
      # path.
      if not os.path.isabs(file_to_load):
        if not filename:
          raise ConfigFileNotFound(
              "While loading %s: Unable to include a relative path (%s) "
              "from a config without a filename" % (filename, file_to_load))

        # If the included path is relative, we take it as relative to the
        # current path of the config.
        file_to_load = os.path.join(os.path.dirname(filename), file_to_load)

      clone_parser = clone.LoadSecondaryConfig(file_to_load)
      # If an include file is specified but it was not found, raise an error.
      if not clone_parser.parsed:
        raise ConfigFileNotFound(
            "Unable to load include file %s" % file_to_load)

    self.MergeData(clone.raw_data)
    self.files.extend(clone.files)

    return parser