docs: def iterall(cls, build, branch, flags, platform=None):
          """Generator for all possible BuildTasks with these parameters"""
          # Prepare build type
          if platform is None:
              platform = Platform()
          target_platform = platform.gecko_platform
  
          is_namespace = False
          if cls.RE_DATE.match(build):
              task_urls = map(''.join,
                              itertools.product(cls._pushdate_urls(build.replace('-', '.'), branch, target_platform),
                                                (flags.build_string(),)))
  
          elif cls.RE_REV.match(build):
              task_urls = (cls._revision_url(build.lower(), branch, target_platform) + flags.build_string(),)
  
          elif build == 'latest':
              namespace = 'gecko.v2.mozilla-' + branch + '.latest'
              product = 'mobile' if 'android' in target_platform else 'firefox'
              task_urls = (cls.URL_BASE + '/task/' + namespace + '.' + product + '.' + target_platform +
                           flags.build_string(),)
  
          else:
              # try to use build argument directly as a namespace
              task_urls = (cls.URL_BASE + '/task/' + build,)
              is_namespace = True
  
          for (url, try_wo_opt) in itertools.product(task_urls, (False, True)):
  
              if try_wo_opt:
                  if '-opt' not in url or is_namespace:
                      continue
                  url = url.replace('-opt', '')
  
              try:
                  data = HTTP_SESSION.get(url)
                  data.raise_for_status()
              except requests.exceptions.RequestException:
                  continue
  
              obj = cls(None, None, None, _blank=True)
              obj.url = url
              obj._data = data.json()  # pylint: disable=protected-access
  
              LOG.debug('Found archive for %s', cls._debug_str(build))
              yield obj