o
    Ii6                     @   s@  d dl Z d dl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ZddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZ ddlmZ dd	lmZmZmZ dd
l m!Z! ddl"m#Z# ddl$m%Z%m&Z& g fddZ'dd Z(de j)de*e+e+f fddZ,de j)de-e.e+ e*e+e+f f fddZ/de j)de*e+e+f fddZ0de j)de*de-e.e+ e*e+e+f f fddZ1de j)de-e.e+ e*e+e+f f fddZ2	d-de j)de*e+e+f d e3de-e j)e*e+e+f f fd!d"Z4d#e.e+ de*e+e+f fd$d%Z5d&ede j)de-e j)e*e+e
f f fd'd(Z6d)d* Z7G d+d, d,Z8dS ).    Nliteral_evalwhich)Any   )SageMakerConfig)DynamoBackendPrecisionTypeis_fp8_availableis_hpu_availableis_mlu_availableis_musa_availableis_neuron_availableis_npu_availableis_sdaa_availableis_torch_xla_availableis_xpu_available)DEEPSPEED_MULTINODE_LAUNCHERS)get_free_portis_port_in_usemerge_dicts)compare_versions   )parse_flag_from_env)DistributedTypeSageMakerDistributedTypec                 C   sD   | |\}}t|  D ]\}}|t| v rt||| q|S )z4
    Filters out all `accelerate` specific args
    )parse_known_argsvarsitemskeyssetattr)argsparserdefault_argsnew_args_keyvalue r)   K/home/ubuntu/.local/lib/python3.10/site-packages/accelerate/utils/launch.py_filter_args/   s   r+   c                  C   s\   dd dD } t | dkrtd| d }t|dg}d|v r'|dd	d
dfS |dd	ddfS )a  
    Determines the executable and argument names for mpirun, based on the type of install. The supported MPI programs
    are: OpenMPI, Intel MPI, or MVAPICH.

    Returns: Program name and arg names for hostfile, num processes, and processes per node
    c                 S   s   g | ]}t |r|qS r)   r   ).0xr)   r)   r*   
<listcomp>B   s    z$_get_mpirun_args.<locals>.<listcomp>)mpirunmpiexecr   z\mpirun or mpiexec were not found. Ensure that Intel MPI, Open MPI, or MVAPICH are installed.z	--versions   Open MPI
--hostfilez-nz
--npernodez	--bind-toz-fz-ppn )lenOSError
subprocesscheck_output)mpi_appsmpi_appmpirun_versionr)   r)   r*   _get_mpirun_args:   s   r:   r"   current_envc                 C   s   d}t | D ]B}|drHt| |}|durH|dkr9t|d ||d < t|d ||d < t|d	 ||d
 < qtt| ||| |  < q|S )z.
    Setup the FP8 environment variables.
    ACCELERATE_fp8_Nfp8_override_linear_precisionr   FP8_OVERRIDE_FPROPr   FP8_OVERRIDE_DGRADr   FP8_OVERRIDE_WGRAD)r   
startswithgetattrstrupper)r"   r;   prefixargr(   r)   r)   r*   setup_fp8_envR   s   

rH   returnc              	   C   sd  g }| j r| jrtdt| dd}| j}| jdurPt \}}}}}t| dd}	|r2|r2t|| nd}
|||| j||
g7 }|rH||t|g7 }|rP|||	g7 }| j sa|t	j
 | jra|d || j || j tj }t| jpx| j|d< | jrd	|d
< | jdkr| jdurt r| j|d< n;t r| j|d< n2t r| j|d< n)t r| j|d< n t r| j|d< nt r| j|d< nt r| j|d< n| j|d< |dkr| jdusJ d| jdusJ d|dur|dks|dkr| jdur| jnd|d< | jdurt| jnd|d< t|d dr!d|d< td|d< z	t| j ! }W n tyB   td| j !  d t"  d!w t||d"< | j ! d#kr^t# sYt$d$t%| |}z	t&| j'( }W n ty   td%| j'(  d t&"  d!w |j)|d&< | j*|d'< t| j+|d(< t| j,|d)< t| j-|d*< t| j.|d+< | j/rd|d,< ||fS )-zz
    Prepares and returns the command list and an environment with the correct simple launcher environment variables.
    0--module and --no_python cannot be used togethernum_processesNzbind-tosocket1z-mACCELERATE_USE_CPUtrueACCELERATE_DEBUG_MODEallZE_AFFINITY_MASKMLU_VISIBLE_DEVICESSDAA_VISIBLE_DEVICESMUSA_VISIBLE_DEVICESASCEND_RT_VISIBLE_DEVICESHABANA_VISIBLE_MODULESNEURON_RT_VISIBLE_CORESCUDA_VISIBLE_DEVICESr   zFWhen using multiple machines, you need to specify the main process IP.zHWhen using multiple machines, you need to specify the main process port.z	127.0.0.1MASTER_ADDR29500MASTER_PORTFzgranularity=fine,compact,1,0KMP_AFFINITYKMP_BLOCKTIMEUnknown mixed_precision mode: . Choose between .ACCELERATE_MIXED_PRECISIONfp8rFP8 is not available on this machine. Please ensure that either Transformer Engine, MSAMP or torchao is installed.Unknown dynamo backend: ACCELERATE_DYNAMO_BACKENDACCELERATE_DYNAMO_MODEACCELERATE_DYNAMO_USE_FULLGRAPHACCELERATE_DYNAMO_USE_DYNAMIC*ACCELERATE_DYNAMO_USE_REGIONAL_COMPILATIONOMP_NUM_THREADSACCELERATE_CPU_AFFINITY)0	no_pythonmodule
ValueErrorrC   num_machinesmpirun_hostfiler:   rD   appendsys
executabletraining_scriptextendtraining_script_argsosenvironcopycpuuse_cpudebuggpu_idsr   r   r   r   r   r   r   main_process_ipmain_process_portr   r
   mixed_precisionlowerlistr   RuntimeErrorrH   r	   dynamo_backendrE   r(   dynamo_modedynamo_use_fullgraphdynamo_use_dynamicdynamo_use_regional_compilationnum_cpu_threads_per_processenable_cpu_affinity)r"   cmdrK   rp   mpi_app_namehostfile_argnum_proc_argproc_per_node_argbind_to_argbind_tonproc_per_noder;   r   r   r)   r)   r*   prepare_simple_launcher_cmd_envd   s   






r   c              	   C   s  | j dkr
t | _ n| j du rd| _ | j}| j}| j}| j }|dkrNt|| | _t|| _t| j	| _
t| ddrEt|| _t|| _n| d| | _nt|| _|dur\t|| _|dkpft| j	dk}|rt|r|dkr~d| _td	| d
 ntd| d| jr| jrtd| jrd| _n| jrd| _tj }| jrd|d< t| dd}|dkr| jdurt r||d< n4t r||d< n,t r||d< n$t r||d< nt  r||d< nt! r||d< nt" r||d< n||d< | j#$ }zt%|}W n ty   td| dt%&  dw t||d< | j#$ dkr0t' s+t(dt)| |}z	t*| j+, }	W n tyQ   td | j+,  dt*&  dw |	j-|d!< | j.|d"< t| j/|d#< t| j0|d$< t| j1|d%< | j2r%d|d&< | j3r| j4std't5| d(rt| j6nd)|d*< t| j7|d+< t| j8$ |d,< t| j9$ |d-< t| j:|d.< | j;durt| j;|d/< | j<durt| j<|d0< | j=durt| j=|d1< | j>durt| j>|d2< t| j?$ |d3< t| j@$ |d4< t| j3$ |d5< t| j4$ |d6< t| jA$ |d7< t| d8ddur%t| jB|d9< | jCrd:}
d|d;< t| jD||
d< < t| jE||
d= < | jFdurPt| jF||
d> < | jGdur_t| jG||
d? < | jHdurnt| jH||
d@ < | jIdur}t| jI||
dA < | jJdurt| jJ||
dB < | jKdurt| jK||
dC < | jLdurt| jL||
dD < t| jM||
dE < t| jN||
dF < | jOdurt| jO||
dG < | jPdurt| jP||
dH < | jQdurt| jQ||
dI < | jRdurt| jR||
dJ < | jSdurt| jS||
dK < | jTdurt| jT||
dL < | jUdur%t| jU||
dM < | jVdur4t| jV||
dN < | jWdurCt| jW||
dO < | jXdurRt| jX||
dP < | jYdurat| jY||
dQ < | jZdurpt| jZ||
dR < | j[durt| j[||
dS < | j\durt| j\||
dT < | j]durt| j]||
dU < | j^durt| j^||
dV < t| j_|dW< | j`rd)|dX< | jartb| |}|S )Yz_
    Prepares and returns an environment with the correct multi-GPU environment variables.
    r   N<s  r   same_networkF:TPort `  ` is already in use. Accelerate will attempt to launch in a standalone-like mode by finding an open port automatically for this session. If this current attempt fails, or for more control in future runs, please specify a different port (e.g., `--main_process_port <your_chosen_port>`) or use `--main_process_port 0` for automatic selection in your launch command or Accelerate config file.3Tried to launch distributed communication on port `$  `, but another process is utilizing it. Please specify a different port (such as using the `--main_process_port` flag or specifying a different `main_process_port` in your config file) and rerun your script. To automatically use the next open port (on a single node), you can set this to `0`.rJ   rO   rP   r~   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   ACCELERATE_USE_FSDPzWWhen using `--fsdp_cpu_ram_efficient_loading` set `--fsdp_sync_module_states` to `True`fsdp_versionrM   FSDP_VERSIONFSDP_SHARDING_STRATEGYFSDP_RESHARD_AFTER_FORWARDFSDP_OFFLOAD_PARAMSFSDP_MIN_NUM_PARAMSFSDP_AUTO_WRAP_POLICYFSDP_TRANSFORMER_CLS_TO_WRAPFSDP_BACKWARD_PREFETCHFSDP_STATE_DICT_TYPEFSDP_FORWARD_PREFETCHFSDP_USE_ORIG_PARAMSFSDP_CPU_RAM_EFFICIENT_LOADINGFSDP_SYNC_MODULE_STATESFSDP_ACTIVATION_CHECKPOINTINGfsdp_ignored_modulesFSDP_IGNORED_MODULESMEGATRON_LM_ACCELERATE_USE_MEGATRON_LM	TP_DEGREEUSE_CUSTOM_FSDPNO_LOAD_OPTIMEOD_MASK_LOSSNO_SAVE_OPTIMOPTIMIZER_CPU_OFFLOADUSE_PRECISION_AWARE_OPTIMIZEROVERLAP_CPU_OPTIMIZER_D2H_H2D DECODER_LAST_PIPELINE_NUM_LAYERS	PP_DEGREEGRADIENT_CLIPPINGNUM_MICRO_BATCHESSEQUENCE_PARALLELISMRECOMPUTE_ACTIVATIONSUSE_DISTRIBUTED_OPTIMIZERRECOMPUTE_GRANULARITYRECOMPUTE_METHODRECOMPUTE_NUM_LAYERSATTENTION_BACKENDEXPERT_MODEL_PARALLEL_SIZECONTEXT_PARALLEL_SIZEATTENTION_DROPOUTHIDDEN_DROPOUTATTENTION_SOFTMAX_IN_FP32EXPERT_TENSOR_PARALLEL_SIZECALCULATE_PER_TOKEN_LOSSUSE_ROTARY_POSITION_EMBEDDINGSrk   rl   )cr   r   rK   rp   r   rD   r   nnodesintmachine_rank	node_rankrC   master_addrmaster_portrdzv_endpointr   
standalonewarningswarnConnectionErrorrn   rm   ro   rx   ry   rz   r}   r~   r   r   r   r   r   r   r   r   r   r
   r   r   r   rH   r	   r   rE   r(   r   r   r   r   use_fsdpfsdp_cpu_ram_efficient_loadingfsdp_sync_module_stateshasattrr   fsdp_sharding_strategyfsdp_reshard_after_forwardfsdp_offload_paramsfsdp_min_num_paramsfsdp_auto_wrap_policy"fsdp_transformer_layer_cls_to_wrapfsdp_backward_prefetchfsdp_state_dict_typefsdp_forward_prefetchfsdp_use_orig_paramsfsdp_activation_checkpointingr   use_megatron_lmmegatron_lm_tp_degreemegatron_lm_use_custom_fsdpmegatron_lm_no_load_optimmegatron_lm_eod_mask_lossmegatron_lm_no_save_optim!megatron_lm_optimizer_cpu_offload)megatron_lm_use_precision_aware_optimizer)megatron_lm_overlap_cpu_optimizer_d2h_h2d,megatron_lm_decoder_last_pipeline_num_layersmegatron_lm_pp_degreemegatron_lm_gradient_clippingmegatron_lm_num_micro_batches megatron_lm_sequence_parallelism!megatron_lm_recompute_activations%megatron_lm_use_distributed_optimizer!megatron_lm_recompute_granularitymegatron_lm_recompute_method megatron_lm_recompute_num_layersmegatron_lm_attention_backend&megatron_lm_expert_model_parallel_size!megatron_lm_context_parallel_sizemegatron_lm_attention_dropoutmegatron_lm_hidden_dropout%megatron_lm_attention_softmax_in_fp32'megatron_lm_expert_tensor_parallel_size$megatron_lm_calculate_per_token_loss*megatron_lm_use_rotary_position_embeddingsr   r   use_parallelism_config%prepare_extend_env_parallelism_config)r"   rK   rp   r   r   need_port_checkr;   r~   r   r   rF   r)   r)   r*   prepare_multi_gpu_env   sN  





















r  c                 C   s   d}d|d< t | j||d < t | j||d < t | j||d < t | j||d < t | j||d < t | j||d	 < t | j||d
 < | jdkrSt | j||d < | jdkrst | j	||d < t | j
||d < t | j||d < |S )zV
    Extends `current_env` with context parallelism env vars if any have been set
    PARALLELISM_CONFIG_rO   !ACCELERATE_USE_PARALLELISM_CONFIGDP_REPLICATE_SIZEDP_SHARD_SIZETP_SIZECP_SIZE
CP_BACKENDSP_SIZE
SP_BACKENDr   CP_COMM_STRATEGYSP_SEQ_LENGTHSP_SEQ_LENGTH_IS_VARIABLESP_ATTN_IMPLEMENTATION)rD   $parallelism_config_dp_replicate_size parallelism_config_dp_shard_sizeparallelism_config_tp_sizeparallelism_config_cp_sizeparallelism_config_cp_backendparallelism_config_sp_sizeparallelism_config_sp_backend#parallelism_config_cp_comm_strategy parallelism_config_sp_seq_length,parallelism_config_sp_seq_length_is_variable)parallelism_config_sp_attn_implementation)r"   r;   rF   r)   r)   r*   r    s    

r  c           
   	   C   sZ  | j dkr
t | _ n| j du rd| _ | j}| j}| j}| j }d}| jdu r*td | _|dkr| jtd krdg}|dt| j	g | jdkr]t
ddd	rQtd
|dt| jdg n|ddt| jg | jdurx|dt| jg n| jdur|dt| jg n|dt| j| j g |r|dt|g |dt|g | jr| jrtd| jr|d n| jr|d || j || j nI|dkr| jtd krt|| | _t|| _t| j| _t| ddrt|| _t|| _n| d| | _nt|| _|durt|| _|dkp%t| jdk}|rHt|rH|dkr@d| _td| d nt d| d| jrT| jrTtd| jr\d| _n| jrcd| _t!j"# }| j$rpd|d < t| d!d"}|d"kr| j%durt& r||d#< n:t' r||d$< n1t( r||d%< n(t) r||d&< nt* r||d'< nt+ r||d(< nt, r||d)< n||d*< z	t-| j./ }	W n ty   td+| j./  d,t-0  d-w t1d.t!j23d-|d.< t|	|d/< | j./ d0krt4 st5d1t6| |}t| j7/ |d2< d|d3< | j8dur&t| j8|d4< | j9dur3t| j9|d5< | j:durBt| j:/ |d6< | j;durQt| j;/ |d7< | j<dur`t| j</ |d8< | j=durot| j=/ |d9< | j>dur~t| j>/ |d:< | j?durt| j?|d;< | j@rd<|d=< | jAdurt| jA|d>< | jBrtC| |}||fS )?zt
    Prepares and returns the command list and an environment with the correct DeepSpeed environment variables.
    r   Nr   r   	deepspeedr1   nossh<z0.14.5z+nossh launcher requires DeepSpeed >= 0.14.5z--node_rankz--no_sshz--no_local_rankz
--launcherz	--excludez	--includez
--num_gpusz--master_addrz--master_portrJ   z--modulez--no_pythonr   Fr   Tr   r   r   r   rO   rP   r~   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r_   r`   ra   
PYTHONPATHrb   rc   rd   ACCELERATE_CONFIG_DS_FIELDSACCELERATE_USE_DEEPSPEEDACCELERATE_DEEPSPEED_ZERO_STAGE&ACCELERATE_GRADIENT_ACCUMULATION_STEPSACCELERATE_GRADIENT_CLIPPING-ACCELERATE_DEEPSPEED_OFFLOAD_OPTIMIZER_DEVICE)ACCELERATE_DEEPSPEED_OFFLOAD_PARAM_DEVICEACCELERATE_DEEPSPEED_ZERO3_INIT+ACCELERATE_DEEPSPEED_ZERO3_SAVE_16BIT_MODEL ACCELERATE_DEEPSPEED_CONFIG_FILErM   rl   (ACCELERATE_DEEPSPEED_MOE_LAYER_CLS_NAMES)Dr   r   rK   rp   r   deepspeed_multinode_launcherr   rv   rD   deepspeed_hostfiler   ro   r   deepspeed_exclusion_filterdeepspeed_inclusion_filterrn   rm   rr   ru   rw   r   r   r   r   rC   r   r   r   r   r   r   r   r   rx   ry   rz   r}   r~   r   r   r   r   r   r   r   r
   r   r   r   env_var_path_addpathabspathr   r   rH   'deepspeed_fields_from_accelerate_config
zero_stagegradient_accumulation_stepsgradient_clippingoffload_optimizer_deviceoffload_param_devicezero3_init_flagzero3_save_16bit_modeldeepspeed_config_filer   deepspeed_moe_layer_cls_namesr  r  )
r"   rK   rp   r   r   r   r  r;   r~   r   r)   r)   r*   prepare_deepspeed_cmd_env  s  


























r=  Fpodc                 C   sV   | j dkrtddr| jrd|d< nd|d< | jrd|d< |r'| j| _| j| _| |fS )	zY
    Prepares and returns an environment with the correct TPU environment variables.
    bf16T)check_is_tpurM   XLA_DOWNCAST_BF16XLA_USE_BF16rO   rP   )r   r   downcast_bf16r}   tpu_vmvmtpu_nametpu)r"   r;   r>  r)   r)   r*   prepare_tpuQ  s   
rH  nargsc                 C   s   t | dk ri S dd }t }|| \}}t|D ]8\}}|drSd }|d t |k r<||d  dr;tdntd|d u rL|j||d q|j||d qd	d
 || j	
 D S )Nr   c                 S   s<   zt | } | d | krt| W S | W S  ty   |  Y S w )Nr   )floatr   ro   )sr)   r)   r*   _infer_typej  s   
z+_convert_nargs_to_dict.<locals>._infer_type)-z--r   ul   SageMaker doesn’t support argparse actions for `store_true` or `store_false`. Please define explicit types)type)actionc                 S   s&   i | ]\}}||d v rt |n|qS ))TrueFalser   )r,   r'   r(   r)   r)   r*   
<dictcomp>  s    z*_convert_nargs_to_dict.<locals>.<dictcomp>)r3   argparseArgumentParserr   	enumeraterB   ro   add_argument
parse_args__dict__r   )rI  rL  r#   r&   unknownindexargumentrO  r)   r)   r*   _convert_nargs_to_dicte  s0   

r\  sagemaker_configc                 C   sR  t d | jtjd< | jd ur| jtjd< n|jd ur-|jd ur-|jtjd< |jtjd< ntdtj	|j
}|s<d}tj|j
}|dsPtd	| d
t d t|j}z	t|j }W n tyy   td|j  dt  dw z	t|j }W n ty   td|j  dt  dw dt||j|jt|jt|jt|j| jjd}|j dkrt stdt ||}d }| jt!j"krddddiii}d }	| j#d ur%t d| j# d i }	t$| j#%}
t%|
D ]\}}|dkrq|&d}|d ' |	|d < qW d    n	1 sw   Y  t d|	  d }| j(d ur{t d| j( d g }t$| j(.}
t%|
D ]!\}}|dkrMqB|&d}|d |d ' d}|)| qBW d    n	1 sow   Y  t d|  t d  | j*||| j+| j,| j-| j.| j/| j0| j1d!||||d"}| j2d urt3| j2|}||	fS )#Nz(Configuring Amazon SageMaker environmentAWS_DEFAULT_REGIONAWS_PROFILEAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYz]You need to provide an aws_access_key_id and aws_secret_access_key when not using aws_profilera   z.pyz8Your training script should be a python script and not ""z'Converting Arguments to Hyperparametersr_   r`   re   rO   )ACCELERATE_USE_SAGEMAKERrb   rf   rg   rh   ri   rj   %ACCELERATE_SAGEMAKER_DISTRIBUTED_TYPErc   rd   smdistributeddataparallelenabledTzLoading SageMaker Inputs from z filer   	r   zLoaded SageMaker Inputs: zLoading SageMaker Metrics from )NameRegexzLoaded SageMaker Metrics: zCreating EstimatorF)	image_urientry_point
source_dirroletransformers_versionpytorch_version
py_versionbase_job_nameinstance_countinstance_typedebugger_hook_configdistributionhyperparametersenvironmentmetric_definitions)4printregionrx   ry   profileaws_access_key_idaws_secret_access_keyr4   r1  dirnameru   basenameendswithro   r\  rw   r
   r   r   r   r	   r   rE   rD   r(   r   r   r   r   distributed_typer   r   rH   r   DATA_PARALLELsagemaker_inputs_fileopenrU  splitstripsagemaker_metrics_filerr   rk  iam_role_namero  rp  rq  rr  rp   ec2_instance_typeadditional_argsr   )r]  r"   rm  rl  rw  r   r   rx  rv  sagemaker_inputsfileilinelsagemaker_metricsmetric_dictr)   r)   r*   prepare_sagemager_args_inputs  s   









r  c                 C   s6   dd t j| ddD }|t| d|S )z
    Extends a path-based environment variable's value with a new path and returns the updated value. It's up to the
    caller to set it in os.environ.
    c                 S   s   g | ]
}t |d kr|qS )r   )r3   )r,   pr)   r)   r*   r.   
  s    z$env_var_path_add.<locals>.<listcomp>r2   r   )rx   ry   getr  rr   rD   join)env_var_namepath_to_addpathsr)   r)   r*   r0    s   
r0  c                   @   s"   e Zd ZdZd	ddZdd ZdS )
PrepareForLaunchai  
    Prepare a function that will launched in a distributed setup.

    Args:
        launcher (`Callable`):
            The function to launch.
        distributed_type ([`~state.DistributedType`]):
            The distributed type to prepare for.
        debug (`bool`, *optional*, defaults to `False`):
            Whether or not this is a debug launch.
    NOFc                 C   s   || _ t|| _|| _d S )N)launcherr   r  r}   )selfr  r  r}   r)   r)   r*   __init__  s   

zPrepareForLaunch.__init__c                 G   s   | j r!ttjd}tjd}tjjd|tj|||d n7| j	t
jt
jt
jt
jt
jt
jt
jfv rXt|tjd< ttjdd}ttjdd	}t|| | tjd
< tdtjd< | j|  d S )N
WORLD_SIZEACCELERATE_DEBUG_RDV_FILEgloo)rankstore
world_size
LOCAL_RANKNPROCr   	NODE_RANKr   RANKFORK_LAUNCHED)r}   r   rx   ry   r  torchdistributedinit_process_group	FileStorer  r   	MULTI_GPU	MULTI_MLU
MULTI_MUSA	MULTI_NPU	MULTI_XPU	MULTI_CPUMULTI_NEURONrD   r  )r  rZ  r"   r  rdv_filenprocr   r)   r)   r*   __call__!  s0   
zPrepareForLaunch.__call__N)r  F)__name__
__module____qualname____doc__r  r  r)   r)   r)   r*   r    s    
r  )F)9rS  rx   r5   rs   r   astr   shutilr   typingr   r  commands.config.config_argsr   utilsr	   r
   r   r   r   r   r   r   r   r   r   utils.constantsr   utils.otherr   r   r   utils.versionsr   r2   r   dataclassesr   r   r+   r:   	NamespacedictrD   rH   tupler   r   r  r  r=  boolrH  r\  r  r0  r  r)   r)   r)   r*   <module>   sf   4(e J
( &

*
v
