ó
    Eñi©B  ã                   óð  • S SK r S SKrS SKrS SKrS SKrS SKrS SKJr  S SKJ	r	J
r
  S SKJrJr  S SKJr  S SKJrJr  S SKrS SKJr  \ R,                  " \5      rS\4S	 jrS"S
\S\\\4   4S jjrS rS"S jrS#S jr S\!S\"\!   4S jr#S\$\!\!4   4S jr%S r&S r'S r(S r)\S 5       r*\	 " S S5      5       r+S\+4S jr,S$S\S\\   SS4S jjr-\S$S\S\\   SS4S jj5       r.\S 5       r/\S  5       r0S! r1g)%é    N)Úcontextmanager)Ú	dataclassÚfield)Ú	lru_cacheÚwraps)Úwhich)ÚOptionalÚUnion)ÚparseÚcurrent_envc                 ó&  ^^• / SQn/ nU R                  5        Ht  u  mm[        UU4S jU 5       5      (       a7  [        T5      S:¼  a(  [        T5      S:¼  a  UR                  T ST S35        MX  [        R                  ST ST S35        Mv     U$ )aÊ  
    Verifies that all keys and values in `current_env` do not contain illegal keys or values, and returns a list of
    strings as the result.

    Example:
    ```python
    >>> from accelerate.utils.environment import verify_env

    >>> env = {"ACCELERATE_DEBUG_MODE": "1", "BAD_ENV_NAME": "<mything", "OTHER_ENV": "2"}
    >>> valid_env_items = verify_env(env)
    >>> print(valid_env_items)
    ["ACCELERATE_DEBUG_MODE=1
", "OTHER_ENV=2
"]
    ```
    )Ú;Ú
Ú<Ú>Ú c              3   ó2   >#   • U  H  oTT-   ;  v •  M     g 7f©N© )Ú.0ÚcharÚkeyÚvalues     €€ÚY/home/mande/repo/quber/.venv/lib/python3.13/site-packages/accelerate/utils/environment.pyÚ	<genexpr>Ú0convert_dict_to_env_variables.<locals>.<genexpr>4   s   øé € ÐE²_¨T˜C %™KÖ(²_ùs   ƒé   Ú=r   zWARNING: Skipping z7 as it contains forbidden characters or missing values.)ÚitemsÚallÚlenÚappendÚloggerÚwarning)r   Úforbidden_charsÚvalid_env_itemsr   r   s      @@r   Úconvert_dict_to_env_variablesr'   "   s‘   ù€ ò 1€OØ€OØ!×'Ñ'Ö)‰
ˆˆUÜÕE±_ÓE×EÑEÌ#ÈcË(ÐVWË-Ô\_Ð`eÓ\fÐjkÓ\kØ×"Ñ" c U¨!¨E¨7°"Ð#5Ö6ä�N‰NÐ/°¨u°A°e°WÐ<sÐtÖuñ	 *ð
 Ðó    Úto_boolÚreturnc                 ó‚   • U R                  5       n U S;   a  U(       d  S$ S$ U S;   a  U(       d  S$ S$ [        SU  35      e)z»
Converts a string representation of truth to `True` (1) or `False` (0).

True values are `y`, `yes`, `t`, `true`, `on`, and `1`; False value are `n`, `no`, `f`, `false`, `off`, and `0`;
)ÚyÚyesÚtÚtrueÚonÚ1r   T)ÚnÚnoÚfÚfalseÚoffÚ0r   Fzinvalid truth value )ÚlowerÚ
ValueError)r   r)   s     r   Ústr_to_boolr:   ;   sN   € ð �K‰K‹M€EØÐ4Ó4ÞˆqÐ) TÐ)Ø	Ð7Ó	7ÞˆqÐ* UÐ*äÐ/°¨wÐ7Ó8Ð8r(   c                 ó~   • U  H6  n[        [        R                  R                  US5      5      nUS:¼  d  M4  Us  $    U$ )zQReturns the first positive env value found in the `env_keys` list or the default.éÿÿÿÿr   )ÚintÚosÚenvironÚget)Úenv_keysÚdefaultÚeÚvals       r   Úget_int_from_envrE   J   s8   € ãˆÜ”"—*‘*—.‘.  BÓ'Ó(ˆØ�!�8ØŠJñ ð €Nr(   c                 óp   • [         R                  R                  U [        U5      5      n[	        U5      S:H  $ )zJReturns truthy value for `key` from the env if available else the default.r   )r>   r?   r@   Ústrr:   ©r   rB   r   s      r   Úparse_flag_from_envrI   S   s*   € ä�J‰J�N‰N˜3¤ G£Ó-€EÜ�uÓ Ñ"Ð"r(   c                 óX   • [         R                  R                  U [        U5      5      nU$ r   )r>   r?   r@   rG   rH   s      r   Úparse_choice_from_envrK   Y   s   € Ü�J‰J�N‰N˜3¤ G£Ó-€EØ€Lr(   Úlibrary_namesc                  óx   • U  Vs/ s H(  o[         R                  R                  5       ;   d  M&  UPM*     sn$ s  snf )zc
Checks if any of `library_names` are imported in the environment. Will return any names that are.
)ÚsysÚmodulesÚkeys)rL   Úlib_names     r   Úare_libraries_initializedrR   ^   s.   € ñ &3ÓU¢]˜Ä#Ç+Á+×BRÑBRÓBTÑ6T�H¡]ÑUÐUùÒUs   …%7®7c                  ó&  • SSK Jn JnJnJnJnJnJn  U" 5       (       a  gU" 5       (       a  gU" 5       (       a  gU" 5       (       a  gU " 5       (       a  g[        R                  R                  5       (       a  gU" 5       (       a  g	U" 5       (       a  g
g)a  
Determines the current device type and distributed type without initializing any device.

This is particularly important when using fork-based multiprocessing, as device initialization
before forking can cause errors.

The device detection order follows the same priority as state.py:_prepare_backend():
MLU -> SDAA -> MUSA -> NPU -> HPU -> CUDA -> XPU

Returns:
    tuple[str, str]: A tuple of (device_type, distributed_type)
        - device_type: The device string (e.g., "cuda", "npu", "xpu")
        - distributed_type: The distributed type string (e.g., "MULTI_GPU", "MULTI_NPU")

Example:
    ```python
    >>> device_type, distributed_type = get_current_device_type()
    >>> print(device_type)  # "cuda"
    >>> print(distributed_type)  # "MULTI_GPU"
    ```
r   ©Úis_hpu_availableÚis_mlu_availableÚis_musa_availableÚis_neuron_availableÚis_npu_availableÚis_sdaa_availableÚis_xpu_available)ÚmluÚ	MULTI_MLU)ÚsdaaÚ
MULTI_SDAA)ÚmusaÚ
MULTI_MUSA)ÚnpuÚ	MULTI_NPU)ÚhpuÚ	MULTI_HPU)ÚcudaÚ	MULTI_GPU)ÚxpuÚ	MULTI_XPU)ÚneuronÚMULTI_NEURON)ÚimportsrU   rV   rW   rX   rY   rZ   r[   Útorchrf   Úis_availablerT   s          r   Úget_current_device_typero   e   s‚   € ÷,÷ ñ ñ ×ÑØ!Ù	×	Ñ	Ø#Ù	×	Ñ	Ø#Ù	×	Ñ	Ø!Ù	×	Ñ	Ø!Ü	�‰×	 Ñ	 ×	"Ñ	"Ø"Ù	×	Ñ	Ø!Ù	×	Ñ	Ø'ð #r(   c                  óˆ   • [         R                  " 5       S:X  a&  [        S5      n U c  [        R                  S    S3n U $ Sn U $ )z;
Returns the right nvidia-smi command based on the system.
ÚWindowsz
nvidia-smiÚsystemdrivez6\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe)ÚplatformÚsystemr   r>   r?   )Úcommands    r   Ú_nvidia_smirv   š   sN   € ô ‡‚Ó˜IÓ%ô ˜Ó%ˆØ‰?ÜŸ™ MÑ2Ð3Ð3mÐnˆGð €Nð ˆØ€Nr(   c                  ó(  • [         R                  " [        5       SS/SS9n U R                  5       n U R	                  [
        R                  5      n[        U5      nU Vs/ s H$  o3R	                  S5      S   R                  5       PM&     nnXB4$ s  snf )z~
Gets GPU count and names using `nvidia-smi` instead of torch to not initialize CUDA.

Largely based on the `gputil` library.
z--query-gpu=count,nameú--format=csv,noheaderT©Úuniversal_newlinesÚ,r   )Ú
subprocessÚcheck_outputrv   ÚstripÚsplitr>   Úlinesepr!   )ÚoutputÚgpusÚ	gpu_countÚgpuÚ	gpu_namess        r   Úget_gpu_infor†   ©   sƒ   € ô ×$Ò$Ü	‹Ð0Ð2IÐJÐ_cñ€Fð �\‰\‹^€FØ�<‰<œŸ
™
Ó#€Dä�D“	€IÙ6:Ó;²d¨s—‘˜3“ Ñ"×(Ñ(Ö*±d€IÐ;ØÐÐùò <s   Á+Bc                  ó¦   • [         R                  " [        5       SS/SS9n U R                  5       n U R	                  [
        R                  5      S   $ )zR
Returns the driver version

In the case of multiple GPUs, will return the first.
z--query-gpu=driver_versionrx   Try   r   )r|   r}   rv   r~   r   r>   r€   )r�   s    r   Úget_driver_versionrˆ   »   sJ   € ô ×$Ò$Ü	‹Ð4Ð6MÐNÐcgñ€Fð �\‰\‹^€FØ�<‰<œŸ
™
Ó# AÑ&Ð&r(   c                  óÒ   ^•  [        5       u  pS1mUS:”  a@  [        U4S jU  5       5      (       a&  Sn[        5       n[        U5      [        U5      :  a  ggg! [         a     gf = f)zÃ
Checks if the devices being used have issues with P2P and IB communications, namely any consumer GPU hardware after
the 3090.

Notably uses `nvidia-smi` instead of torch to not initialize CUDA.
zRTX 40r   c              3   ó@   >#   • U  H  nT  H	  nX!;   v •  M     M     g 7fr   r   )r   Údevice_nameÚunsupported_deviceÚunsupported_devicess      €r   r   Ú,check_cuda_p2p_ib_support.<locals>.<genexpr>Ô   s)   øé € ð â#/�KÜ*=Ð&ð #Ö1á*=ñ 2Ú#/ùs   ƒz	550.40.07FT)r†   Úanyrˆ   r   Ú	Exception)Údevice_namesÚdevice_countÚacceptable_driver_versionÚcurrent_driver_versionr�   s       @r   Úcheck_cuda_p2p_ib_supportr•   È   sƒ   ø€ ðÜ%1£^Ñ"ˆà'˜jÐØ˜!ÓÜô á#/ó÷ ñ ð -8Ð)Ü);Ó)=Ð&ÜÐ/Ó0´5Ð9RÓ3SÓSØ Øð øô ó ØØðús   ƒAA Á
A&Á%A&c                  ób  •  [         R                  " [        5       SS/SS9n U R                  5       n [	        [        [        U R                  [        R                  5      S   R                  S5      5      5      nUS:¬  $ ! [         a%    [        R                  R                  5       n US:¬  $ f = f)zd
Checks if the current GPU available supports FP8.

Notably might initialize `torch.cuda` to check.
z--query-gpu=compute_capabilityrx   Try   r   Ú.)é   é	   )r|   r}   rv   r~   ÚtupleÚmapr=   r   r>   r€   r�   rm   rf   Úget_device_capability)r�   Úcompute_capabilitys     r   Úcheck_cuda_fp8_capabilityrž   ä   s£   € ð	@ä×(Ò(Ü‹]Ð<Ð>UÐVÐkoñ
ˆð —‘“ˆä"¤3¤s¨F¯L©L¼¿¹Ó,DÀQÑ,G×,MÑ,MÈcÓ,RÓ#SÓTÐð  Ñ'Ð'øô ó @Ü"ŸZ™Z×=Ñ=Ó?Ñà Ñ'Ð'ð@ús   ‚A8A? Á?(B.Â-B.c                   óŠ   • \ rS rSr% Sr\" SSS0S9r\\S'   \" SSS	0S9r	\\S
'   \" SSS0S9r
\\S'   \" SSS0S9r\\S'   Srg)ÚCPUInformationéú   aO  
Stores information about the CPU in a distributed environment. It contains the following attributes:
- rank: The rank of the current process.
- world_size: The total number of processes in the world.
- local_rank: The rank of the current process on the local node.
- local_world_size: The total number of processes on the local node.
r   Úhelpz The rank of the current process.)rB   ÚmetadataÚrankr   z+The total number of processes in the world.Ú
world_sizez2The rank of the current process on the local node.Ú
local_rankz0The total number of processes on the local node.Úlocal_world_sizer   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r¤   r=   Ú__annotations__r¥   r¦   r§   Ú__static_attributes__r   r(   r   r    r    ú   sf   ‡ ññ ˜a¨6Ð3UÐ*VÑW€Dˆ#ÓWÙ A°Ð9fÐ0gÑh€J�ÓhÙ A°Ð9mÐ0nÑo€J�ÓoÙ!¨!°vÐ?qÐ6rÑsÐ�cÖsr(   r    c                  ó¤   • 0 n [        / SQS5      U S'   [        / SQS5      U S'   [        / SQS5      U S'   [        / S	QS5      U S
'   [        S0 U D6$ )z|
Returns various information about the environment in relation to CPU distributed training as a `CPUInformation`
dataclass.
)ÚRANKÚPMI_RANKÚOMPI_COMM_WORLD_RANKÚMV2_COMM_WORLD_RANKr   r¤   )Ú
WORLD_SIZEÚPMI_SIZEÚOMPI_COMM_WORLD_SIZEÚMV2_COMM_WORLD_SIZEr   r¥   )Ú
LOCAL_RANKÚMPI_LOCALRANKIDÚOMPI_COMM_WORLD_LOCAL_RANKÚMV2_COMM_WORLD_LOCAL_RANKr¦   )ÚLOCAL_WORLD_SIZEÚMPI_LOCALNRANKSÚOMPI_COMM_WORLD_LOCAL_SIZEÚMV2_COMM_WORLD_LOCAL_SIZEr§   r   )rE   r    )Úinformations    r   Úget_cpu_distributed_informationrÁ   
  sp   € ð
 €KÜ*Ò+nÐpqÓr€K�ÑÜ 0ÚQÐSTó!€K�Ñô !1ÚdÐfgó!€K�Ñô '7ÚjØ	ó'€KÐ"Ñ#ô Ñ(˜KÑ(Ð(r(   Úlocal_process_indexÚverbosec                 óü  • Uc  [        SS5      n[        R                  R                  5       (       Ga>  SSKJn  U" 5       (       d  [        S5      eSSKnUR                  5         [        R                  " [        R                  " 5       S-  5      nUR                  U 5      nSnUR                  XT5       H
  nUS	 U 3nM     U Vs/ s H  n[        U5      PM     n	nU	R!                  5         [#        U	5       V
Vs/ s H  u  p«US:w  d  M  U
PM     nn
n[        R$                  " SU5        U(       a>  [        R&                  " S5      n[(        R+                  S
[-        U5       SU  SU 35        gggs  snf s  snn
f )aÆ  
Overrides whatever NUMA affinity is set for the current process. This is very taxing and requires recalculating the
affinity to set, ideally you should use `utils.environment.set_numa_affinity` instead.

Args:
    local_process_index (int):
        The index of the current process on the current server.
    verbose (bool, *optional*):
        Whether to log out the assignment of each CPU. If `ACCELERATE_DEBUG_MODE` is enabled, will default to True.
NÚACCELERATE_DEBUG_MODEFr   )Úis_pynvml_availablezkTo set CPU affinity on CUDA GPUs the `nvidia-ml-py` package must be available. (`pip install nvidia-ml-py`)é@   Ú Ú064bz
Assigning z cpu cores to process z: )rI   rm   rf   rn   Úaccelerate.utilsrÆ   ÚImportErrorÚpynvmlÚnvmlInitÚmathÚceilr>   Ú	cpu_countÚnvmlDeviceGetHandleByIndexÚnvmlDeviceGetCpuAffinityr=   ÚreverseÚ	enumerateÚsched_setaffinityÚsched_getaffinityr#   Úinfor!   )rÂ   rÃ   rÆ   ÚnvmlÚnum_elementsÚhandleÚaffinity_stringÚjÚxÚaffinity_listÚirC   Úaffinity_to_setÚ	cpu_coress                 r   Úoverride_numa_affinityrâ     sS  € ð �Ü%Ð&=¸uÓEˆÜ‡z�z×Ñ× Ò Ý8á"×$Ñ$ÜØ}óð ó 	ð 	�‰ŒÜ—y’y¤§¢£°"Ñ!4Ó5ˆØ×0Ñ0Ð1DÓEˆØˆØ×.Ñ.¨vÖDˆAà!" 4 ¨Ð(9Ð:ŠOñ Eñ *9Ó9ª Aœ˜Qž©ˆÐ9Ø×ÑÔÜ)2°=Ô)AÔLÒ)A¡ ÀQÈ!ÁVŸ1Ñ)AˆÑLÜ
×Ò˜Q Ô0ÞÜ×,Ò,¨QÓ/ˆIÜ�K‰K˜*¤S¨£^Ð$4Ð4JÐK^ÐJ_Ð_aÐbkÐalÐmÕnð ð+ !ùò" :ùãLs   ÃE3Ã<E8ÄE8c                 ó   • [        XS9  g)a
  
Assigns the current process to a specific NUMA node. Ideally most efficient when having at least 2 cpus per node.

This result is cached between calls. If you want to override it, please use
`accelerate.utils.environment.override_numa_afifnity`.

Args:
    local_process_index (int):
        The index of the current process on the current server.
    verbose (bool, *optional*):
        Whether to print the new cpu cores assignment for each process. If `ACCELERATE_DEBUG_MODE` is enabled, will
        default to True.
©rÂ   rÃ   N)râ   rä   s     r   Úset_numa_affinityrå   E  s   € ô Ð/BÓTr(   c               #   óŒ  #   • [         R                  R                  5       n [         R                  R                  5          Sv •  [         R                  R                  5         [         R                  R	                  U 5        g! [         R                  R                  5         [         R                  R	                  U 5        f = f7f)a¶  
A context manager that will temporarily clear environment variables.

When this context exits, the previous environment variables will be back.

Example:

```python
>>> import os
>>> from accelerate.utils import clear_environment

>>> os.environ["FOO"] = "bar"
>>> with clear_environment():
...     print(os.environ)
...     os.environ["FOO"] = "new_bar"
...     print(os.environ["FOO"])
{}
new_bar

>>> print(os.environ["FOO"])
bar
```
N)r>   r?   ÚcopyÚclearÚupdate)Ú_old_os_environs    r   Úclear_environmentrë   W  sv   é € ô2 —j‘j—o‘oÓ'€OÜ‡J�J×ÑÔð+Ûä
�
‰
×ÑÔÜ
�
‰
×Ñ˜/Õ*øô 	�
‰
×ÑÔÜ
�
‰
×Ñ˜/Õ*üs   ‚=CÁ B Á>CÂ?CÃCc               +   óT  #   • 0 nU R                  5        HZ  u  p#UR                  5       nU[        R                  ;   a  [        R                  U   X'   [	        U5      [        R                  U'   M\      Sv •  U  HO  nUR                  5       nX!;   a  X   [        R                  U'   M/  [        R                  R                  US5        MQ     g! U  HO  nUR                  5       nX!;   a  X   [        R                  U'   M/  [        R                  R                  US5        MQ     f = f7f)aœ  
A context manager that will add each keyword argument passed to `os.environ` and remove them when exiting.

Will convert the values in `kwargs` to strings and upper-case all the keys.

Example:

```python
>>> import os
>>> from accelerate.utils import patch_environment

>>> with patch_environment(FOO="bar"):
...     print(os.environ["FOO"])  # prints "bar"
>>> print(os.environ["FOO"])  # raises KeyError
```
N)r   Úupperr>   r?   rG   Úpop)ÚkwargsÚexisting_varsr   r   s       r   Úpatch_environmentrñ   z  sØ   é € ð$ €MØ—l‘l–n‰
ˆØ�i‰i‹kˆØ”"—*‘*ÓÜ!#§¡¨C¡ˆMÑÜ˜e›*Œ�
‰
�3‹ñ	 %ð	*ÛãˆCØ—)‘)“+ˆCØÓ#à"/Ñ"4”—
‘
˜3“ä—
‘
—‘˜s DÖ)ò ø“6ˆCØ—)‘)“+ˆCØÓ#à"/Ñ"4”—
‘
˜3“ä—
‘
—‘˜s DÖ)ò üs    ‚A1D(Á4C Á8AD(ÃAD%Ä%D(c                 óº   ^^^^• Sm[         U4S j5       mU4S jm[        U [        5      (       d  T" U 5      $ U4S jmT" U 5        [        U4S j5      U l        U $ )aN  Decorator to clean up accelerate environment variables set by the decorated class or function.

In some circumstances, calling certain classes or functions can result in accelerate env vars being set and not
being cleaned up afterwards. As an example, when calling:

TrainingArguments(fp16=True, ...)

The following env var will be set:

ACCELERATE_MIXED_PRECISION=fp16

This can affect subsequent code, since the env var takes precedence over TrainingArguments(fp16=False). This is
especially relevant for unit testing, where we want to avoid the individual tests to have side effects on one
another. Decorate the unit test function or whole class with this decorator to ensure that after each test, the env
vars are cleaned up. This works for both unittest.TestCase and normal classes (pytest); it also works when
decorating the parent class.

ÚACCELERATE_c               3   óÄ  >#   • [         R                  R                  5        V Vs0 s H  u  pU R                  T5      (       d  M  X_M!     nn n S v •  [         R                   V s/ s H  o R                  T5      (       d  M  U PM     sn  H?  nX2;   a  X#   [         R                  U'   M  [         R                  R	                  US 5        MA     g s  snn f s  sn f ! [         R                   V s/ s H  o R                  T5      (       d  M  U PM     Os  sn f sn  H?  nX2;   a  X#   [         R                  U'   M  [         R                  R	                  US 5        MA     f = f7fr   )r>   r?   r   Ú
startswithrî   )ÚkÚvrð   r   Úprefixs       €r   Úenv_var_contextÚ5purge_accelerate_environment.<locals>.env_var_context´  sð   øé € ô +-¯*©*×*:Ñ*:Ô*<ÔUÒ*<¡$ !ÀÇÁÈV×@T›˜šÑ*<ˆÑUð	.Ûô $&§:¢:ÓF¢:˜a·±¸f×1EŸ¡:ÔF�ØÓ'Ø&3Ñ&8”B—J‘J˜s“Oä—J‘J—N‘N 3¨Ö-ò	 Gùó Vùò
 Gø¤2§:¢:ÓF¢:˜a·±¸f×1EŸ¢:ù×F�ØÓ'Ø&3Ñ&8”B—J‘J˜s“Oä—J‘J—N‘N 3¨Ö-ò	 GüsT   ƒ"E ¥CÁCÁE ÁC ÁE Á%CÂCÂAE ÃEÃ-DÄ
DÄAEÅE c                 óB   >^ • [        T 5      UU 4S j5       nSUl        U$ )Nc                  óX   >• T" 5          T" U 0 UD6sS S S 5        $ ! , (       d  f       g = fr   r   )Úargsrï   rù   Úfuncs     €€r   ÚwrapperÚDpurge_accelerate_environment.<locals>.wrap_function.<locals>.wrapperÃ  s"   ø€ á Õ"Ù˜TÐ, VÑ,÷ #×"×"ús   ‰›
)T)r   Ú)_accelerate_is_purged_environment_wrapped)rþ   rÿ   rù   s   ` €r   Úwrap_functionÚ3purge_accelerate_environment.<locals>.wrap_functionÂ  s)   ù€ Ü	ˆt‹õ	-ó 
ð	-ð =AˆÔ9Øˆr(   c                 óà   >• [        U 5       H]  nUR                  S5      (       d  M  [        X5      n[        U5      (       d  M8  [	        US5      (       a  MK  [        XT" U5      5        M_     U $ )NÚtestr  )Údirrõ   ÚgetattrÚcallableÚhasattrÚsetattr)Útest_class_instanceÚnameÚmethodr  s      €r   Úwrap_test_methodsÚ7purge_accelerate_environment.<locals>.wrap_test_methodsÏ  s]   ø€ ÜÐ+Ö,ˆDØ�‰˜v×&Ó&Ü Ð!4Ó;�Ü˜F×#Ó#¬G°FÐ<g×,hÓ,hÜÐ/±}ÀVÓ7LÖMñ	 -ð
 #Ð"r(   c                 ó   >• T" U 5      $ r   r   )ÚclsÚkwr  s     €r   Ú<lambda>Ú.purge_accelerate_environment.<locals>.<lambda>Ù  s   ø€ ÑBSÐTWÔBXr(   )r   Ú
isinstanceÚtypeÚclassmethodÚ__init_subclass__)Úfunc_or_clsrù   rø   r  r  s    @@@@r   Úpurge_accelerate_environmentr  Ÿ  s^   û€ ð& €Fäô.ó ð.õô �k¤4×(Ñ(Ù˜[Ó)Ð)õ#ñ �kÔ"Ü$/Ô0XÓ$Y€KÔ!ØÐr(   )F)r3   r   )2ÚloggingrÎ   r>   rs   r|   rN   Ú
contextlibr   Údataclassesr   r   Ú	functoolsr   r   Úshutilr   Útypingr	   r
   rm   Úpackaging.versionr   Ú	getLoggerr¨   r#   Údictr'   Úboolr=   r:   rE   rI   rK   rG   ÚlistrR   rš   ro   rv   r†   rˆ   r•   rž   r    rÁ   râ   rå   rë   rñ   r  r   r(   r   Ú<module>r&     s|  ðó Û Û 	Û Û Û 
Ý %ß (ß &Ý ß "ã Ý #ð 
×	Ò	˜8Ó	$€ð¨tô ñ29 ð 9°°s¸D°yÑ1Aõ 9òô#ôð
V¨cð V°d¸3±iô Vð2#  s¨C x¡ô 2#òjò ò$
'òð8 ñ(ó ð(ð* ÷tð tó ðtð)¨ô )ñ($o°ð $o¸hÀt¹nð $oÐX\õ $oðN ñU¨3ð U¸À$¹ð UÐSWô Uó ðUð" ñ+ó ð+ðD ñ!*ó ð!*óH;r(   