docs: def osf_crawl(k, *pths, **kw):
      '''
      osf_crawl(k) crawls the osf repository k and returns a lazy nested map structure of the
        repository's files. Folders have values that are maps of their contents while files have
        values that are their download links.
      osf_crawl(k1, k2, ...) is equivalent to osf_crawl(posixpath.join(k1, k2...)).
  
      The optional named argument base (default: 'osfstorage') may be specified to search in a
      non-standard storage position in the OSF URL; e.g. in the github storage.
      '''
      from six.moves import reduce
      base = kw.pop('base', 'osfstorage')
      root = kw.pop('root', None)
      if len(kw) > 0: raise ValueError('Unknown optional parameters: %s' % (list(kw.keys()),))
      if k.lower().startswith('osf:'): k = k[4:]
      k = k.lstrip('/')
      pths = [p.lstrip('/') for p in (k.split('/') + list(pths))]
      (bpth, pths) = (pths[0], pths[1:])
      if root is None: root = _osf_tree(bpth, base=base)
      return reduce(lambda m,k: m[k], pths, root)