docs: def appendArgs(url, args):
      """Append query arguments to a HTTP(s) URL. If the URL already has
      query arguemtns, these arguments will be added, and the existing
      arguments will be preserved. Duplicate arguments will not be
      detected or collapsed (both will appear in the output).
  
      @param url: The url to which the arguments will be appended
      @type url: str
  
      @param args: The query arguments to add to the URL. If a
          dictionary is passed, the items will be sorted before
          appending them to the URL. If a sequence of pairs is passed,
          the order of the sequence will be preserved.
      @type args: A dictionary from string to string, or a sequence of
          pairs of strings.
  
      @returns: The URL with the parameters added
      @rtype: str
      """
      if hasattr(args, 'items'):
          args = args.items()
          args.sort()
      else:
          args = list(args)
  
      if len(args) == 0:
          return url
  
      if '?' in url:
          sep = '&'
      else:
          sep = '?'
  
      # Map unicode to UTF-8 if present. Do not make any assumptions
      # about the encodings of plain bytes (str).
      i = 0
      for k, v in args:
          if type(k) is not str:
              k = k.encode('UTF-8')
  
          if type(v) is not str:
              v = v.encode('UTF-8')
  
          args[i] = (k, v)
          i += 1
  
      return '%s%s%s' % (url, sep, urlencode(args))