def parseConfig(s):
  """Parses a simple config file.
  
  The expected format encodes a simple key-value store: keys are strings,
  one per line, and values are arrays.  Keys may not have colons in them;
  everything before the first colon on each line is taken to be the key,
  and everything after is considered a space-separated list of value-array
  entries.  Leading and trailing whitespace are stripped on each key and
  value entry.
  
  No special handling of comments is implemented, but non-conforming lines
  (those with no colon) will be silently ignored.
  
  Arguments:
    s: A string containing the full contents of a config file.
  
  Returns a dictionary mapping strings to lists.  The lists, which may be
  singletons, contain ints, floats, and/or strings.
  """
  def stringToNumberMaybe(s):
    if s.lower() in ['true', 'yes']:
      return True
    if s.lower() in ['false', 'no']:
      return False
    try:
      return int(s)
    except ValueError:
      try:
        return float(s)
      except ValueError:
        return s
  
  lines = s.splitlines()
  d = {}
  for line in lines:
    kv = [x.strip() for x in line.split(':',1)]
    try:
      val_list = [stringToNumberMaybe(x) for x in kv[1].split()]
      if len(val_list) != 1:
        d[kv[0]] = val_list
      else:
        d[kv[0]] = val_list[0]
    except IndexError:
      pass
  return d