Ë
    :vžjR  ã                   ó  — U d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZmZ ddlmZmZ  G d	„ d
ej                   «      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Zdd„Zeez  Zeed<   y)zÅ
resolvers.py
---------------

Provides a common interface to load assets referenced by name
like MTL files, texture images, etc. Assets can be from ZIP
archives, web assets, or a local file path.
é    N)ÚPath)Ú	TypeAlias)Úurlparseé   )ÚcachingÚutil)ÚHttpSessionLikeÚMappingc                   óø   — e Zd ZdZej
                  d„ «       Zej
                  d„ «       Zej
                  defd„«       Z	ej
                  defd„«       Z
ej
                  d„ «       Zd	efd
„Zd	efd„Zd	edefd„Zy)ÚResolverz'
    The base class for resolvers.
    c                 ó   — t        d«      ‚)NzUse a resolver subclass!©ÚNotImplementedError)ÚselfÚargsÚkwargss      úb/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/trimesh/resolvers.pyÚ__init__zResolver.__init__   ó   € ä!Ð"<Ó=Ð=ó    c                 ó   — t        «       ‚©Nr   ©r   Úkeys     r   ÚgetzResolver.get    s   € ä!Ó#Ð#r   Únamec                 ó   — t        d«      ‚©Nz`write` not implemented!r   ©r   r   Údatas      r   ÚwritezResolver.write$   r   r   Ú	namespacec                 ó   — t        d«      ‚)Nz`namespaced` not implemented!r   ©r   r"   s     r   Ú
namespacedzResolver.namespaced(   s   € ä!Ð"AÓBÐBr   c                 ó   — t        d«      ‚)Nz`keys` not implemented!r   ©r   s    r   ÚkeyszResolver.keys,   s   € ä!Ð";Ó<Ð<r   r   c                 ó$   — | j                  |«      S r   )r   r   s     r   Ú__getitem__zResolver.__getitem__0   s   € Ø�x‰x˜‹}Ðr   c                 ó&   — | j                  ||«      S r   )r!   ©r   r   Úvalues      r   Ú__setitem__zResolver.__setitem__3   s   € Ø�z‰z˜#˜uÓ%Ð%r   Úreturnc                 ó&   — || j                  «       v S r   )r(   r   s     r   Ú__contains__zResolver.__contains__6   s   € Ø�d—i‘i“kÐ!Ð!r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚabcÚabstractmethodr   r   Ústrr!   r%   r(   r*   r.   Úboolr1   © r   r   r   r      sÅ   „ ñð 	×Ññ>ó ð>ð 	×Ññ$ó ð$ð 	×Ñð>˜#ò >ó ð>ð 	×ÑðC Cò Có ðCð 	×Ññ=ó ð=ð˜só ð&˜só &ð" ð "¨ô "r   r   c                   ój   — e Zd ZdZddedefd„Zd„ Zdedd fd„Zd	ede	fd
„Z
d	efd„Zd	edeez  fd„Zy)ÚFilePathResolverz>
    Resolve files from a source path on the file system.
    ÚsourceÚallow_anywherec                 ó6  — t         j                  j                  t         j                  j                  t	        |«      «      «      }t        |«      | _        || _        t         j                  j                  |«      r|| _	        n)t         j                  j                  |«      }|d   | _	        t         j                  j                  | j                  «      st        d| j                  › d�«      ‚|| _        t         j                  j                  |«      | _        y)uZ  
        Resolve files based on a source path.

        Parameters
        ------------
        source : str
          File path where mesh was loaded from
        allow_anywhere : bool
          If True allow assets to reference paths outside the
          resolver root, i.e. `../textures/thing.png` â€” the
          pre-5.0 behavior.
        r   zpath `z `not a directory!N)ÚosÚpathÚ
expanduserÚabspathr8   r9   r>   ÚcleanÚisdirÚparentÚsplitÚ
ValueErrorÚ	file_pathÚbasenameÚ	file_name)r   r=   r>   rD   rG   s        r   r   zFilePathResolver.__init__?   s¿   € ô —‘×"Ñ"¤2§7¡7§?¡?´3°v³;Ó#?Ó@ˆä" >Ó2ˆÔàˆŒ
Ü�7‰7�=‰=˜ÔàˆD�Kô —G‘G—M‘M %Ó(ˆEØ ™(ˆDŒKô �w‰w�}‰}˜TŸ[™[Ô)Ü˜v d§k¡k ]Ð2DÐEÓFÐFàˆŒÜŸ™×)Ñ)¨&Ó1ˆ�r   c              #   ó  K  — | j                   }t        j                  | j                   «      D ]N  \  }}}|j                  |«      r|t	        |«      d }|D ]$  }t        j
                  j                  ||«      –— Œ& ŒP y­w)zŸ
        List all files available to be loaded.

        Yields
        -----------
        name : str
          Name of a file which can be accessed.
        N)rF   r@   ÚwalkÚ
startswithÚlenrA   Újoin)r   rF   rA   Ú_Únamesr   s         r   r(   zFilePathResolver.keysa   si   è ø€ ð —‘ˆÜ Ÿg™g d§k¡kÖ2‰NˆD�!�Uà�‰˜vÔ&ØœC ›K˜MÐ*�ã�Ü—g‘g—l‘l 4¨Ó.Ó.ñ ñ 3ùs   ‚A>B r"   r/   c                 ó€   — t        t        j                  j                  | j                  |«      | j
                  ¬«      S )aI  
        Return a resolver which changes the root of the
        resolver by an added namespace.

        Parameters
        -------------
        namespace : str
          Probably a subdirectory

        Returns
        --------------
        resolver : FilePathResolver
          Resolver with root directory changed.
        )r>   )r<   r@   rA   rP   rF   r>   r$   s     r   r%   zFilePathResolver.namespaceds   s/   € ô  Ü�G‰G�L‰L˜Ÿ™ iÓ0À×ATÑATô
ð 	
r   r   c                 óò   — t        | j                  «      j                  «       }||j                  «       z  j                  «       }| j                  s&|j                  |«      st        d|› d|› d�dz   «      ‚|S )aÊ  
        Resolve an asset name to an absolute path under the
        resolver root.

        Parameters
        ------------
        name : str
          Name of an asset relative to the resolver root.

        Returns
        ------------
        path : pathlib.Path
          Absolute resolved path.

        Raises
        ------------
        ValueError
          If the path escapes the resolver root and
          `allow_anywhere` was not set.
        Ú'z' escapes resolver root 'u   ' â€” pass z9`FilePathResolver(path, allow_anywhere=True)` to allow it)r   rF   ÚresolveÚstripr>   Úis_relative_torH   )r   r   rF   rA   s       r   ÚabsolutezFilePathResolver.absolute†   sz   € ô* �d—k‘kÓ"×*Ñ*Ó,ˆØ˜Ÿ™›Ñ%×.Ñ.Ó0ˆØ×"Ò"¨4×+>Ñ+>¸vÔ+FÜØ�D�6Ð2°6°(¸+ÐFØMñNóð ð ˆr   c                 ó²  — |j                  «       |j                  «       j                  d«      t        j                  j	                  |«      d   f}|D ]L  }	 | j                  |«      }|j                  «       sŒ&t        |d«      5 }|j                  «       cddd«       c S  | j                  |«       t        |«      ‚# t        $ r Y Œvw xY w# 1 sw Y   ŒƒxY w)a  
        Get an asset, restricted to the resolver root.

        Parameters
        -------------
        name : str
          Name of the asset. Must resolve inside the resolver root.

        Returns
        ------------
        data : bytes
          Loaded data from asset.
        Ú/éÿÿÿÿÚrbN)rW   Úlstripr@   rA   rG   rY   rH   ÚexistsÚopenÚreadÚFileNotFoundError)r   r   Ú
candidatesÚ	candidaterA   Úfs         r   r   zFilePathResolver.get¤   sº   € ð �J‰J‹LØ�J‰J‹L×Ñ Ó$Ü�G‰G�M‰M˜$Ó Ñ#ð
ˆ
ó
 $ˆIðØ—}‘} YÓ/�ð �{‰{�}Ü˜$ Ô%¨ØŸ6™6›8÷ &Ó%ð $ð 	�‰�dÔÜ Ó%Ð%øô ò Ùðú÷ &Ð%ús   ÁB>ÂCÂ>	C
Ã	C
ÃC	r    c                 ó’   — t        | j                  |«      d«      5 }t        j                  ||¬«       ddd«       y# 1 sw Y   yxY w)a  
        Write an asset to a file path, restricted to the resolver root.

        Parameters
        -----------
        name : str
          Name of the file to write. Must resolve inside the resolver root.
        data : str or bytes
          Data to write to the file.
        Úwb)Úfile_objÚstuffN)r`   rY   r   Úwrite_encoded)r   r   r    re   s       r   r!   zFilePathResolver.writeÄ   s5   € ô �$—-‘- Ó% tÔ,°ä×Ñ¨°Õ6÷ -×,Ñ,ús	   œ=½AN)F)r2   r3   r4   r5   r8   r9   r   r(   r%   r   rY   r   Úbytesr!   r:   r   r   r<   r<   :   sk   „ ññ 2˜sð  2°Dó  2òD/ð$
 Cð 
Ð,>ó 
ð&˜Sð  Tó ð<&˜ó &ð@7˜#ð 7 S¨5¡[ô 7r   r<   c                   óp   — e Zd ZdZddedz  dedz  fd„Zd„ Zdeddfd	„Zd
ede	fd„Z
dedd fd„Zde	fd„Zy)ÚZipResolverz-
    Resolve files inside a ZIP archive.
    NÚarchiver"   c                 ó�   — || _         t        |t        «      r(|j                  «       j	                  d«      dz   | _        yd| _        y)a{  
        Resolve files inside a ZIP archive as loaded by
        trimesh.util.decompress

        Parameters
        -------------
        archive : dict
          Contains resources as file object
        namespace : None or str
          If passed will only show keys that start
          with this value and this substring must be
          removed for any get calls.
        r[   N)rn   Ú
isinstancer8   rW   Úrstripr"   )r   rn   r"   s      r   r   zZipResolver.__init__Ù   s:   € ð ˆŒÜ�i¤Ô%Ø&Ÿ_™_Ó.×5Ñ5°cÓ:¸SÑ@ˆD�Nà!ˆD�Nr   c                 ó  — | j                   �a| j                   }t        |«      }| j                  j                  «       D �cg c]&  }|j	                  |«      rt        |«      |kD  r||d ‘Œ( c}S | j                  j                  «       S c c}w )z¤
        Get the available keys in the current archive.

        Returns
        -----------
        keys : iterable
          Keys in the current archive.
        N)r"   rO   rn   r(   rN   )r   r"   ÚlengthÚks       r   r(   zZipResolver.keysí   s…   € ð �>‰>Ð%ØŸ™ˆIÜ˜“^ˆFð Ÿ™×*Ñ*Ô,óá,�AØ—<‘< 	Ô*¬s°1«v¸ªð �&�'’
Ø,ñð ð
 �|‰|× Ñ Ó"Ð"ùòs   Á +Br   r/   c                 óH   — | j                   €i | _         || j                   |<   y)zÙ
        Store a value in the current archive.

        Parameters
        -----------
        key : hashable
          Key to store data under.
        value : str, bytes, file-like
          Value to store.
        N)rn   r,   s      r   r!   zZipResolver.write  s#   € ð �<‰<ÐØˆDŒLØ!ˆ�‰�SÒr   r   c                 óJ  — |€yt        |d«      r|j                  d«      }| j                  }||vr#t        || j                  «      D ]
  }||v sŒ|} n ||   }t        |t        t        f«      r|S |j                  d«       |j                  «       }|j                  d«       |S )zê
        Get an asset from the ZIP archive.

        Parameters
        -------------
        name : str
          Name of the asset

        Returns
        -------------
        data : bytes
          Loaded data from asset
        NÚdecodeúutf-8r   )
Úhasattrrw   rn   Únearby_namesr"   rp   rk   r8   Úseekra   )r   r   rn   ÚoptionÚobjr    s         r   r   zZipResolver.get  s¤   € ð ˆ<Øä�4˜Ô"Ø—;‘;˜wÓ'ˆDà—,‘,ˆð �wÑä& t¨T¯^©^Ö<�Ø˜WÒ$ð "�DÙð =ð �d‰mˆä�cœE¤3˜<Ô(ØˆJð 	�‰�Œà�x‰x‹zˆØ�‰�ŒØˆr   c                 ó0   — t        | j                  |¬«      S )á„  
        Return a "sub-resolver" with a root namespace.

        Parameters
        -------------
        namespace : str
          The root of the key to clip off, i.e. if
          this resolver has key `a/b/c` you can get
          'a/b/c' with resolver.namespaced('a/b').get('c')

        Returns
        -----------
        resolver : Resolver
          Namespaced resolver.
        )rn   r"   )rm   rn   r$   s     r   r%   zZipResolver.namespaced@  s   € ô   4§<¡<¸9ÔEÐEr   c                 ó@   — t        j                  | j                  «      S )z½
        Export the contents of the current archive as
        a ZIP file.

        Returns
        ------------
        compressed : bytes
          Compressed data in ZIP format.
        )r   Úcompressrn   r'   s    r   ÚexportzZipResolver.exportR  s   € ô �}‰}˜TŸ\™\Ó*Ð*r   )NN)r2   r3   r4   r5   Údictr8   r   r(   r!   rk   r   r%   r‚   r:   r   r   rm   rm   Ô   sp   „ ññ"  t¡ð "¸sÀT¹zó "ò(#ð,"˜ð "¨ó "ð,˜ð , ó ,ð\F Cð F¨Mó Fð$
+˜ô 
+r   rm   c                   óh   — e Zd ZdZ	 	 ddededz  defd„Zdedefd	„Z	defd
„Z
dedd fd„Zd„ Zd„ Zy)ÚWebResolverz+
    Resolve assets from a remote URL.
    NÚurlÚsessionÚtimeoutc                 ó.  — t        |d«      r|j                  d«      }t        |«      }|j                  dvrt	        d|j                  ›d�«      ‚|€ddl}|j                  dt        d	¬
«       || _        || _	        |€dn&t        |«      j                  j                  d«      d   }|dk(  rd|dœ| _        n'|dk(  rd|dœ| _        n|dk(  rt	        d«      ‚i | _        |j                  j                  d«      D �cg c]  }t        |«      dkD  sŒ|‘Œ }}t        |«      dk(  rd}	n-d|d   v rdj!                  |dd «      }	ndj!                  |«      }	|| _        dj!                  d„ |j                  dz   |j$                  j'                  d«      |	j'                  d«      fD «       «      dz   | _        d| j(                  t        |j                  «      dz   d vsJ ‚| j(                  j+                  d«      sJ ‚|j                  d«      d   | _        yc c}w )a�  
        Resolve assets from a base URL.

        Parameters
        --------------
        url : str
          Location where a mesh was stored or
          directory where mesh was stored.
        session : HttpSessionLike or None
          Optional HTTP session used for fetches. Accepts
          `httpx.Client` or `requests.Session`.
        timeout : float
          Per-request timeout in seconds.
        rw   rx   )ÚhttpÚhttpszscheme z not in ('http', 'https')Nr   z‡`WebResolver` without a `session` is deprecated and will require one in a future release. pass an `httpx.Client` or `requests.Session`.é   )ÚcategoryÚ
stacklevelÚhttpxÚ.T)Úfollow_redirectsrˆ   Úrequests)Úallow_redirectsrˆ   Úaiohttpzx`aiohttp` sessions are async-only and bound to their creation loop: pass an `httpx.Client` or `requests.Session` insteadr[   Ú r\   c              3   ó<   K  — | ]  }t        |«      d kD  r|–— Œ y­w)r   N)rO   )Ú.0Úis     r   Ú	<genexpr>z'WebResolver.__init__.<locals>.<genexpr>¸  s#   è ø€ ð áZ�AÜ�q“6˜A’:ô ÙZùs   ‚z:/z//é   )ry   rw   r   ÚschemerH   ÚwarningsÚwarnÚDeprecationWarningr‡   rˆ   Útyper3   rG   Úrequest_kwargsrA   rO   rP   r†   ÚnetlocrW   Úbase_urlÚendswithrK   )
r   r†   r‡   rˆ   Úparsedrœ   Úlibraryr˜   rG   rA   s
             r   r   zWebResolver.__init__d  s*  € ô( �3˜Ô!Ø—*‘*˜WÓ%ˆCô ˜#“ˆà�=‰=Ð 1Ñ1Ü˜w v§}¡}Ð&7Ð7PÐQÓRÐRàˆ?ãà�M‰MðBô ,Øð ô ð ˆŒØˆŒð
 %˜_‘'´$°w³-×2JÑ2J×2PÑ2PÐQTÓ2UÐVWÑ2XˆØ�gÒà7;ÈÑ"PˆDÕØ˜
Ò"Ø6:ÀwÑ"OˆDÕØ˜	Ò!ô ðOóð ð #%ˆDÔð #ŸK™K×-Ñ-¨cÔ2ÓAÑ2�q´c¸!³f¸q³j’Ð2ˆÐAô ˆu‹:˜Š?Ø‰DØ�E˜"‘IÑà—8‘8˜E # 2˜JÓ'‰Dð —8‘8˜E“?ˆDð ˆŒð �H‰Hñ à Ÿ-™-¨$Ñ.°·±×0CÑ0CÀCÓ0HÈ$Ï*É*ÐUXË/ÑZóó ð
 ñð 	Œð ˜4Ÿ=™=¬¨V¯]©]Ó);¸aÑ)?Ð)AÐBÑBÐBÐBà�}‰}×%Ñ% cÔ*Ð*Ð*àŸ™ 3›¨Ñ+ˆ�ùò? Bs   Ã;HÄHr   r/   c                 ót  — ddl }|j                  «       }| j                  xs |} |j                  | j                  |z   fi | j
                  ¤Ž}|j                  dk\  r@|j                  d«      r|dd } |j                  | j                  |z   fi | j
                  ¤Ž}|j                  «        |j                  S )z¡
        Get a resource from the remote site.

        Parameters
        -------------
        name : str
          Asset name, i.e. 'quadknot.obj.mtl'
        r   Ni,  ú./rŒ   )
r�   rW   r‡   r   r¢   r    Ústatus_coderN   Úraise_for_statusÚcontent)r   r   r�   ÚclientÚresponses        r   r   zWebResolver.getÇ  s­   € ó 	ð �z‰z‹|ˆð —‘Ò& ˆØ�6—:‘:˜dŸm™m¨dÑ2ÑJ°d×6IÑ6IÑJˆà×Ñ 3Ò&à�‰˜tÔ$Ø˜A˜B�x�Ø!�v—z‘z $§-¡-°$Ñ"6ÑN¸$×:MÑ:MÑNˆHð 	×!Ñ!Ô#ð ×ÑÐr   c                 ó¬   — ddl } | j                  xs |j                  | j                  fi | j                  ¤Ž}|j                  «        |j                  S )zø
        Fetch the data at the full URL this resolver was
        instantiated with, i.e. `https://stuff.com/hi.glb`
        this will return the response.

        Returns
        --------
        content
          The value at `self.url`
        r   N)r�   r‡   r   r†   r    r©   rª   )r   r�   r¬   s      r   Úget_basezWebResolver.get_baseå  sK   € ó 	ð /�D—L‘LÒ) E×.Ñ.¨t¯x©xÑO¸4×;NÑ;NÑOˆØ×!Ñ!Ô#Ø×ÑÐr   r"   c                 ó`   — t        | j                  |z   | j                  | j                  ¬«      S )a  
        Return a namespaced version of current resolver.

        Parameters
        -------------
        namespace : str
          URL fragment

        Returns
        -----------
        resolver : WebResolver
          With sub-url: `https://example.com/{namespace}`
        ©r†   r‡   rˆ   )r…   r¢   r‡   rˆ   r$   s     r   r%   zWebResolver.namespaced÷  s+   € ô Ø—‘ 	Ñ)Ø—L‘LØ—L‘Lô
ð 	
r   c                 ó   — t        d«      ‚)Nz`WebResolver` is read-only!r   r,   s      r   r!   zWebResolver.write  s   € Ü!Ð"?Ó@Ð@r   c                 ó   — t        d«      ‚)Nz`WebResolver` can't list keysr   r'   s    r   r(   zWebResolver.keys  s   € Ü!Ð"AÓBÐBr   )Nç      >@)r2   r3   r4   r5   r8   r	   Úfloatr   rk   r   r®   r%   r!   r(   r:   r   r   r…   r…   _  sx   „ ñð +/Øñ	a,àða,ð ! 4Ñ'ða,ð ó	a,ðF ˜ð   ó  ð< ˜%ó  ð$
 Cð 
¨Mó 
ò*AóCr   r…   c                   ó~   — e Zd Z	 	 	 	 	 ddededz  dedz  dedz  dedz  defd„Zd	„ Zd
„ Ze	de
fd„«       Zd„ Zd„ Zy)ÚGithubResolverNÚrepoÚbranchÚcommitÚsaver‡   rˆ   c                 óà   — |�d|› d|› d�| _         n|�d|› d|› d�| _         nt        d«      ‚t        | j                   ||¬«      | _        |�t	        j
                  |«      | _        yd| _        y)a�  
        Get files from a remote Github repository by
        downloading a zip file with the entire branch
        or a specific commit.

        Parameters
        -------------
        repo
          In the format of `owner/repo`.
        branch
          The remote branch you want to get files from.
        commit
          The full commit hash: pass either this OR branch.
        save
          A path if you want to save results locally.
        session : HttpSessionLike or None
          Optional HTTP session used for fetches. Accepts
          `httpx.Client` or `requests.Session`.
        timeout : float
          Per-request timeout in seconds.
        Nzhttps://github.com/z	/archive/z.zipz/archive/refs/heads/z$`commit` or `branch` must be passed!r°   )r†   rH   r…   Úresolverr   Ú	DiskCacheÚcache)r   r·   r¸   r¹   rº   r‡   rˆ   s          r   r   zGithubResolver.__init__  s~   € ð> Ðà,¨T¨F°)¸F¸8À4ÐHˆD�HØÐà,¨T¨FÐ2FÀvÀhÈdÐSˆD�HäÐCÓDÐDô $¨¯©¸'È7ÔSˆŒàÐÜ ×*Ñ*¨4Ó0ˆD�JàˆD�Jr   c                 ó6   — | j                   j                  «       S )z£
        List the available files in the repository.

        Returns
        ----------
        keys : iterable
          Keys available to the resolved.
        )Úzippedr(   r'   s    r   r(   zGithubResolver.keysD  s   € ð �{‰{×ÑÓ!Ð!r   c                 ó   — t        d«      ‚r   r   r   s      r   r!   zGithubResolver.writeO  s   € Ü!Ð"<Ó=Ð=r   r/   c           
      ó¤  — t        | d«      r| j                  S | j                  j                  | j                  | j
                  j                  «      }t        t        j                  t        j                  |«      d¬«      j                  «       D ��ci c]  \  }}|j                  dd«      d   |“Œ c}}«      | _        | j                  S c c}}w )zj
        - opened zip file
        - locally saved zip file
        - retrieve zip file and saved
        Ú_zipÚzip)Ú	file_typer[   r   )ry   rÃ   r¾   r   r†   r¼   r®   rm   r   Ú
decompressÚwrap_as_streamÚitemsrG   )r   Úrawrt   Úvs       r   rÀ   zGithubResolver.zippedR  s·   € ô �4˜Ô Ø—9‘9Ðà�j‰j�n‰n˜TŸX™X t§}¡}×'=Ñ'=Ó>ˆô  ô !ŸO™OÜ×'Ñ'¨Ó,¸ôç‘%“'ðôñ‘D�A�qð —‘˜˜Q“ Ñ" AÑ%ðòó
ˆŒ	ð �y‰yÐùós   Â C
c                 ó8   — | j                   j                  |«      S r   )rÀ   r   r   s     r   r   zGithubResolver.getl  s   € Ø�{‰{�‰˜sÓ#Ð#r   c                 ó8   — | j                   j                  |«      S )r   )rÀ   r%   r$   s     r   r%   zGithubResolver.namespacedo  s   € ð  �{‰{×%Ñ% iÓ0Ð0r   )NNNNr³   )r2   r3   r4   r8   r	   r´   r   r(   r!   Úpropertyrm   rÀ   r   r%   r:   r   r   r¶   r¶     s“   „ ð "Ø!ØØ*.Øñ.àð.ð �d‘
ð.ð �d‘
ð	.ð
 �D‰jð.ð ! 4Ñ'ð.ð ó.ò`	"ò>ð ð˜ò ó ðò2$ó1r   r¶   c              #   óº  ‡	K  — d„ Š	d„ d„ ˆ	fd„ˆ	fd„ˆ	fd„d„ d„ g}|€d
}t        «       }|D ]'  } || «      }||v rŒ|j                  |«       ||z   –— Œ) t        j                  |d«      D ][  \  }} | || «      «      }||v rŒ|j                  |«       ||z   –—  | || «      «      }||v rŒD|j                  |«       ||z   –— Œ] d| v r‹|�ˆ|j	                  d«      j                  d«      d	| j                  d«        }|j                  | j                  d«      d   j	                  d«      j                  d«      «       dj                  |«      –— y	y	y	­w)zö
    Try to find nearby variants of a specified name.

    Parameters
    ------------
    name : str
      Initial name.

    Yields
    -----------
    nearby : str
      Name that is a lightly permutated version
      of the initial name.
    c                 óD   — |j                  | «      r|t        | «      d  S |S r   )rN   rO   )ÚprefixÚitems     r   Útrimznearby_names.<locals>.trim“  s$   € Ø�?‰?˜6Ô"Øœ˜F›˜Ð&Ð&Øˆr   c                 ó   — | S r   r:   ©Úxs    r   Ú<lambda>znearby_names.<locals>.<lambda>™  s   € ‘!r   c                 ó"   — | j                  «       S r   )rW   rÔ   s    r   rÖ   znearby_names.<locals>.<lambda>š  s
   € �!—'‘'”)r   c                 ó   •—  ‰d| «      S )Nr§   r:   ©rÕ   rÒ   s    €r   rÖ   znearby_names.<locals>.<lambda>›  ó   ø€ ‘$�t˜Q”-r   c                 ó   •—  ‰d| «      S )Nz.\r:   rÙ   s    €r   rÖ   znearby_names.<locals>.<lambda>œ  s   ø€ ‘$�u˜a”.r   c                 ó   •—  ‰d| «      S )NÚ\r:   rÙ   s    €r   rÖ   znearby_names.<locals>.<lambda>�  rÚ   r   c                 óF   — t         j                  j                  | «      d   S )Nr\   )r@   rA   rG   rÔ   s    r   rÖ   znearby_names.<locals>.<lambda>ž  s   € ”"—'‘'—-‘- Ó" 2Ò&r   c                 ó&   — | j                  dd«      S )Nz%20Ú )ÚreplacerÔ   s    r   rÖ   znearby_names.<locals>.<lambda>Ÿ  s   € �!—)‘)˜E 3Ô'r   Nr•   rŒ   z..r[   r\   )	ÚsetÚaddÚ	itertoolsÚcombinationsrW   rG   ÚcountÚextendrP   )
r   r"   ÚcleanersÚhitre   ÚcurrentÚaÚbrW   rÒ   s
            @r   rz   rz   ‚  so  øè ø€ ò"ñ 	ÙÛÛ ÛÙ&Ù'ð€Hð ÐØˆ	ô ‹%€CÛˆá�D“'ˆØ�c‰>ØØ�‰�ÔØ˜'Ñ!Ó!ð ô ×&Ñ& x°Ö3‰ˆˆ1á‘A�d“G“*ˆØ�c‰>ØØ�‰�ÔØ˜'Ñ!Ò!ñ ‘A�d“G“*ˆØ�c‰>ØØ�‰�ÔØ˜'Ñ!Ó!ð 4ð ˆt�|˜	Ð-à—‘ Ó$×*Ñ*¨3Ó/Ð0C°4·:±:¸dÓ3CÐ2CÐDˆØ�‰�T—Z‘Z Ó% bÑ)×/Ñ/°Ó4×:Ñ:¸3Ó?Ô@Ø�h‰h�u‹oÓð	 .€|ùs   ƒEEÚResolverLiker   )r5   r6   rä   r@   Úpathlibr   Útypingr   Úurllib.parser   r•   r   r   Útypedr	   r
   ÚABCr   r<   rm   r…   r¶   rz   rí   Ú__annotations__r:   r   r   Ú<module>rô      s�   ðòó Û Û 	Ý Ý õ "ç ß +ô "ˆt�x‰xô  "ôFW7�xô W7ôtH+�(ô H+ôVqC�(ô qCôhl1�Xô l1ó^@ðH # WÑ,€ˆiÔ ,r   