
    .`ird                        U d dl mZmZmZ d dlmZmZmZmZ d dl	Z
d dlZd dlmZ d dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlm Z m!Z!m"Z" d dl#m$Z$m%Z%m&Z&m'Z' d dl(m)Z) d dl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@mAZAmBZBmCZCmDZD  eeE          ZFdZG edddddddddd 
  
        ZH	 d7d"ed#edz  d$eId%e8fd&ZJ G d' d(e5          ZK G d) d*e5          ZLeKeLz  ZMeeNd+<    G d, d-ejO                  ZP G d. d/e,          ZQ G d0 d1e)eQ                   ZR G d2 d3e+eQ                   ZS ejT        eSeQeR4           G d5 d6ejO        e;e<e=                      ZUdS )8    )IterableMappingSequence)	AnnotatedAnyLiteral	TypeAliasN)BatchFeatureCLIPVisionConfigPretrainedConfigProcessorMixin)
VllmConfig)BaseDummyOptions)init_logger)QuantizationConfig)VocabParallelEmbedding)MULTIMODAL_REGISTRY)MultiModalDataDictMultiModalFieldConfigMultiModalKwargsItems)ImageEmbeddingItemsImageProcessorItems	ImageSizeMultiModalDataItems)BaseDummyInputsBuilder)BaseMultiModalProcessorBaseProcessingInfoMultiModalPromptUpdatesPlaceholderFeaturesInfoPromptReplacementPromptUpdateResolvedPromptUpdate)IntermediateTensors)TensorSchemaTensorShape   )CLIPVisionModel)MultiModalEmbeddingsSupportsMultiModal
SupportsPPSupportsQuant_require_is_multimodal)AutoWeightsLoaderWeightsMapper_merge_multimodal_embeddingsinit_vllm_registered_modelmaybe_prefixi,}  g        
quick_gelu   P  i               i   )
dropout
hidden_acthidden_size
image_sizeintermediate_sizenum_attention_headsnum_channelsnum_hidden_layers
patch_sizeprojection_dim 	hf_configquant_configprefixreturnc                     t           }| j                            dd          }|dk     r|j        |z   dz   }n|dz   }t	          ||||          }|S )N	layer_idxr   r&   )rE   num_hidden_layers_overriderF   )!CLIP_VIT_LARGE_PATCH14_336_CONFIGimg_processorgetr@   r'   )rD   rE   rF   clip_configrI   r@   rM   s          t/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/model_executor/models/phi3v.py_init_img_processorrQ   `   st    
 4K'++K<<I 1}}'9IEI%M#!#4	  M     c            
           e Zd ZU dZdZed         ed<   eej	        e
ej	                 z   eddddd	dh
          f         ed<   eej	        dz   edd          f         ed<   dS )Phi3VImagePixelInputsz
    Dimensions:
        - b: Batch size
        - n: Number of images
        - p: Number of patches
        - h: Height of each patch
        - w: Width of each patch
    pixel_values)rU   image_embedstypebnpr6   hw)dynamic_dimsN   image_sizes__name__
__module____qualname____doc__rW   r   __annotations__r   torchTensorlistr%    rR   rP   rT   rT   x   s           5CD'0
1BBB tEL))#q#s#	
 	
 	
	    5<$.D!0D0DDEEEEEErR   rT   c                       e Zd ZU dZdZed         ed<   eej	        e
ej	                 z   eddd          f         ed<   dS )	Phi3VImageEmbeddingInputsz
    Dimensions:
        - b: Batch size
        - n: Number of images
        - f: Image feature size (e.g., number of tokens per image)
        - h: Hidden size (must match language model backbone)
    rV   rW   rX   frZ   dataNr_   rh   rR   rP   rj   rj      su           %3D'.
!222
tEL))D#s##	%     rR   rj   Phi3VImageInputsc            	            e Zd ZdZ	 ddededz  deddf fdZd	ej	        dej	        fd
Z
dej	        dej        dej	        fdZd Zd Zd Z xZS )Phi3HDImageEmbeddingz'Phi3 Image embedding with HD transform.rC   configrE   NrF   rG   c           	         t                                                       t          |d          r|j        n|j        }t          ||| d          | _        |j        d         }|j        d         | _        || _        |j	        
                    dd          | _        |j	        
                    dd          | _        |j	        
                    d	d
          | _        | j        r| j        sJ t          j        t!          j        dd| j        dz  g                    | _        t          j        t!          j        ddd| j        dz  g                    | _        |}d}t          j        |dz  |          g}t+          d|          D ]=}	|                    t          j                    t          j        ||          g           >t          j        | | _        |j        
                    dd          | _        d S )Nn_embdz.img_processorrE   rF   image_dim_outnum_img_tokensuse_hd_transformFwith_learnable_separatorhd_transform_orderglb_subr&      r]   type_featurepatch)super__init__hasattrrr   r;   rQ   rM   ru   rt   
embd_layerrN   rv   rw   rx   nn	Parameterre   emptyglb_GNsub_GNLinearrangeextendGELU
Sequentialimg_projectionr{   )selfrp   rE   rF   r;   rt   dim_projectiondepthlayers_	__class__s             rP   r~   zPhi3HDImageEmbedding.__init__   s    	 (/vx'@'@XfmmfFX0%,,,
 
 
 ,_=$23CD* !' 1 5 56H% P P(.(9(=(=&)
 )
% #)"3"7"78Li"X"X$F)FFFF l5;1d6H16L/M#N#NOOl5;1a9Ka9O/P#Q#QRR$#%9]Q->#O#O"Pq% 	R 	RAMM2799bi&O&OPQQQQ mV4"044^WMMrR   
img_embedsc                     | j         }|                     |          }|dk    r|d d dd f         }|S |dk    r|S t          |          )Nr|   r&   	cls_patch)r{   rM   NotImplementedError)r   r   r{   img_featurepatch_features        rP   get_img_featuresz%Phi3HDImageEmbedding.get_img_features   se    ( ((447""'122.M  ;&&!,///rR   rU   r^   c                     |j         \  }}}}}|                    dd          }|                     |          }|                    ||d| j                  }|                     ||          }	|	S )z
        process image and return vision embeddings.

        pixel_values: (num_images, num_crops, c, h, w)
        output: (num_images, num_img_tokens, hidden_size)
        r   r&   )shapeflattenr   reshapert   hd_feature_transform)
r   rU   r^   
num_images	num_cropscrZ   r[   img_featuresimage_features_projs
             rP   forwardzPhi3HDImageEmbedding.forward   s~     *6);&
Iq!Q#++Aq11,,\::#++	2t'9
 
 #77kRR""rR   c                 j   | j         dk    sJ d| j          d            t          | j        t          j                  r/| j        d         j        j        }| j        d         j        j        }n"| j        j        j        }| j        j        j        }|dddf         }|                     |dd          }| 	                    |          }g }t          |          D ]\  }	}
|
\  }}|dz  }|dz  }||z  }||	dd|z   f         }|                     |||          }| 	                    |          }t          j        |                    d          | j                            d          ||	         g          }|                     |                    ||                    }|                    |           |S )zH
        image_features: (num_images, num_crops+1, 24*24, 1024)
        sub_glbzhd_transform_order `z` not implementedr   Nr&   r4   )rx   
isinstancer   r   r   biasdevicedtypereshape_hd_patches_2x2mergeadd_image_newline	enumeratere   catsqueezer   toappend)r   image_featuresr^   target_devicetarget_dtypeglobal_image_featuresglobal_image_features_hd global_image_features_hd_newlinebatch_image_features_projiimg_sizerZ   r[   h_cropw_cropr   sub_image_featuressub_image_features_hdsub_image_features_hd_newlineimage_embeddingsimg_projs                        rP   r   z)Phi3HDImageEmbedding.hd_feature_transform   s
    &)333M4#:MMM 433 d)2=99 	: /27>M.q16<LL /4;M.39L .qqq!t 4#'#C#C!1a$
 $
  ,0+A+A$,
 ,
( %'! %[11 	7 	7KAxDAq#XF#XFI "01q9}3D0D!E$($D$D"FF% %! -1,B,B%- -)
  %y199  K''**4Q7    ** ##M<@@ H &,,X6666((rR   c                    |j         \  }}}|dk    r|dk    r|||z  z  dk    sJ |||z  z  }t          |dz            }|                    ||||                              ||dz  d|dz  d|                              dddddd	                              |d
d|z                                ||||dz  |dz  d
                              dddddd	                              |||z  dz  ||z  dz  d|z            }	|	S )z
        image_features: (num_images*num_crops, 24*24, 1024)
        output: (num_images, h_crop*12, w_crop*12, 4096)
        where h_crop*w_crop == num_crops
        i@  r3   r   g      ?r]   r&   r6   rz      r   )r   intr   permute)
r   r   r   r   NLCr   Himage_features_hds
             rP   r   z0Phi3HDImageEmbedding.reshape_hd_patches_2x2merge0  s1    !&1aCxxAII!v*?1*D*D*DD6F?+
3KK""1aA..WQQ161a00WQ1aA&&WQAE""WFFAFAFB  WQ1aA&&WFQJ!OVaZ1_a!e  	 ! rR   c                     |j         \  }}}}| j                            ||dd          }t          j        ||gd                              |d|          }|S )z
        image_features_hd: (num_images, h_crop*12, w_crop*12, 4096)
        output: (num_images, (h_crop*12) * (w_crop*12+1), 4096)
        r   r]   )dim)r   r   expandre   r   r   )r   r   r   rZ   r[   hid_dimnewline_embeddingsimage_features_hd_newlines           rP   r   z&Phi3HDImageEmbedding.add_image_newlineI  su    
 %6$;!
Aq'![//2r
 
 %*I 23%
 %
 %

'*b'
*
* 	" )(rR   rC   )r`   ra   rb   rc   r   r   strr~   re   FloatTensorr   rf   r   r   r   r   __classcell__r   s   @rP   ro   ro      s       11 	*N *N *N )4/*N 	*N
 
*N *N *N *N *N *NX05+< 0AR 0 0 0 0 #!-#<AL#		# # # #$9) 9) 9)v! ! !2) ) ) ) ) ) )rR   ro   c            	       `    e Zd Zdeeedz  f         fdZdddedededz  defdZde	fd	Z
dS )
Phi3VProcessingInforG   Nc                 
    dd iS Nimagerh   r   s    rP   get_supported_mm_limitsz+Phi3VProcessingInfo.get_supported_mm_limitsZ  s    rR   )	processorimage_widthimage_heightr   c                \    ||                                  }|                    ||          S )N)widthheight)get_hf_processor%calc_num_image_tokens_from_image_size)r   r   r   r   s       rP   get_num_image_tokensz(Phi3VProcessingInfo.get_num_image_tokens]  s>     --//I>> ? 
 
 	
rR   c                 $    t          dd          S )Ni@  2   )r   r   )r   r   s    rP   !get_image_size_with_most_featuresz5Phi3VProcessingInfo.get_image_size_with_most_featuresl  s    B////rR   )r`   ra   rb   r   r   r   r   r   r   r   r   rh   rR   rP   r   r   Y  s        cDj)A     ,0
 
 
 
 	

 "D(
 

 
 
 
09 0 0 0 0 0 0rR   r   c            	       p    e Zd Zdeeef         defdZ	 ddedeeef         deeef         dz  defdZ	dS )	Phi3VDummyInputsBuilder	mm_countsrG   c                     |                     dd          }| j                                        }|j        }d                    |d |                   S )Nr   r   rC   )rN   infor   
img_tokensjoin)r   r   r   hf_processorimage_tokenss        rP   get_dummy_textz&Phi3VDummyInputsBuilder.get_dummy_textr  sK    ]]7A..
y1133"."9ww|KZK0111rR   Nseq_len
mm_optionsc                     |                     dd          }| j                                        \  }}|r|                     d          nd }d|                     ||||          iS )Nr   r   )r   r   r   	overrides)rN   r   r   _get_dummy_images)r   r   r   r   r   target_widthtarget_heightimage_overridess           rP   get_dummy_mm_dataz)Phi3VDummyInputsBuilder.get_dummy_mm_dataz  s|     ]]7A..
&*i&Q&Q&S&S#m5?I*..111T T++"$%)	 ,  
 	
rR   N)
r`   ra   rb   r   r   r   r   r   r   r   rh   rR   rP   r   r   q  s        2S(9 2c 2 2 2 2 =A	
 

 38$
 C!112T9	

 

 
 
 
 
 
rR   r   c                   @    e Zd Zdedeeef         deeef         deeef         def
 fdZdedeeef         deeef         fd	Z	d
e
deeef         dedee         fdZdededef fdZdee         dedeee         eeee         f         f         f fdZ xZS )Phi3VMultiModalProcessorpromptmm_data	mm_kwargs
tok_kwargsrG   c                     t                                          ||||          }|d         }t          |t          j                  sJ |                    |dk     t                     |S )N)r   r   r  r  	input_idsr   )r}   _call_hf_processorr   re   rf   masked_fill__IMAGE_TOKEN_ID)r   r   r   r  r  processed_outputsr  r   s          rP   r  z+Phi3VMultiModalProcessor._call_hf_processor  sv     "GG66!	 7 
 
 &k2	)U\22222
 	y1}o>>>  rR   	hf_inputshf_processor_mm_kwargsc                     t          t          j        d          t          j        d          t          j        d                    S )Nr   )rU   r^   rV   )dictr   batched)r   r	  r
  s      rP   _get_mm_fields_configz.Phi3VMultiModalProcessor._get_mm_fields_config  sE    
 .6w??-5g>>.6w??
 
 
 	
rR   mm_itemsout_mm_kwargsc                        j         j        di |j        }dt          f fd}t	          d|j        |          gS )Nitem_idxc                 ,                        dt          t          f          }t          |t                    r|                    |           }n<|                    |           }j                            |j        |j	                  }t          g|z  S )Nr   )r   r   r   )	get_itemsr   r   r   get_feature_sizeget_image_sizer   r   r   r   r  )r  imagesnum_image_tokensr<   r   r  r   s       rP   get_replacement_phi3vzKPhi3VMultiModalProcessor._get_prompt_updates.<locals>.get_replacement_phi3v  s    ''-/BC F &"566 #)#:#:8#D#D  #228<<
#'9#A#A * 0!+!2* $B $ $  $$'777rR   r   )modalitytargetreplacementrh   )r   r   r   r   r    __getitem__)r   r  r
  r  r   r  r   s   ``    @rP   _get_prompt_updatesz,Phi3VMultiModalProcessor._get_prompt_updates  s     2ty1KK4JKK"."9	8C 	8 	8 	8 	8 	8 	8 	8 	8$  #/1  
 	
rR   cached_updatenew_item_idxc                     t                                          ||          }|j        dk    r;| j                                        }|j        }|                    ||                   }|S r   )r}   _recompute_cached_prompt_updater  r   r   r   with_target)r   r  r   
new_updater   r   r   s         rP   r"  z8Phi3VMultiModalProcessor._recompute_cached_prompt_update  sm    
 WW<<
 


 !W,,95577L&2&=L#//\0JKKJrR   	token_idsmm_prompt_updatesc                   
 t          |          ri| j                                        
t          |          r|d         
j        k    r
|dd          }
                    |          }
j                                        D ]d}t          |t                    r|	                    | d|          }1t          |t                    r|D ]}|	                    | d|          }ed}
fdt          j        ||          D             }
fdt          j        ||          D             }t          |          t          |          k    r|                    g            d t          ||          D             }t!                                          ||          \  }}	t          |          rT|d d	         
                    d
d          k    r1|d         g|d	d          }d |	                                D             }	||	fS )Nr   r&    z<\|image_\d+\|>c                 0    g | ]} |          j         S rh   r  .0chunk	tokenizers     rP   
<listcomp>zBPhi3VMultiModalProcessor._apply_prompt_updates.<locals>.<listcomp>  s3       /4		%  *  rR   c                 4    g | ]} |d           j         S )Fadd_special_tokensr*  r+  s     rP   r/  zBPhi3VMultiModalProcessor._apply_prompt_updates.<locals>.<listcomp>  s;        	%E:::D  rR   c                 &    g | ]}|D ]	}|D ]}|
S rh   rh   )r,  sublistelees       rP   r/  zBPhi3VMultiModalProcessor._apply_prompt_updates.<locals>.<listcomp>  sV       "  	       rR   )r%  r&  r]   z<s> <|image|>Fr1  c                 .    i | ]\  }}|d  |D             S )c           	      n    g | ]2}t          |j        |j        |j        d z
  |j        |j                  3S )r&   )r  r  	start_idxtokensis_embed)r   r  r  r9  r:  r;  )r,  rY   s     rP   r/  zMPhi3VMultiModalProcessor._apply_prompt_updates.<locals>.<dictcomp>.<listcomp>  sV     	 	 	  ,!"!""#+/ x!"  	 	 	rR   rh   )r,  r  pss      rP   
<dictcomp>zBPhi3VMultiModalProcessor._apply_prompt_updates.<locals>.<dictcomp>  sL        !Hb  	 	  	 	 	  rR   )lenr   get_tokenizerbos_token_iddecodespecial_tokens_mapvaluesr   r   replacerg   resplitfindallr   zipr}   _apply_prompt_updatesencodeitems)r   r%  r&  textspecial_tokensspecial_tokenpatternprompt_chunks
image_tagsplaceholdersr.  r   s             @rP   rI  z.Phi3VMultiModalProcessor._apply_prompt_updates  s}     !!  		//11I
 9~~ *)A,)2H"H"H%abbM	##I..D"+">"E"E"G"G P Pnc22 P<<>(<(<(<nMMDD55 P)7 P P#||},?,?,?OO )G   8:$8O8O  M   Z66  J =!!C
OO33!!"%%% "=*==  I #(''"?"?/ #@ #
 #
	<  !! 	bqbMY--oRW-XXXX"16	!""6I  %1$6$6$8$8  L ,&&rR   )r`   ra   rb   r   r   objectr
   r  r   r  r   r   r   r   r!   r  r"   r   r"  rg   r   tupler   rI  r   r   s   @rP   r   r     s       !! f%! 3;'	!
 CK(! 
! ! ! ! ! !0	
	
 !(V 4	
 
++	,		
 	
 	
 	
 
% 
 !(S 1 
 -	 

 
,	 
  
  
  
D+  
	     "@'9@' 3@' 
tCy'#t,C'D"DEE	F	@' @' @' @' @' @' @' @' @' @'rR   r   )r   dummy_inputsc                       e Zd Z eddddd          Zededed	ed
z  fd            Zddde	def fdZ
ded	ed
z  fdZded	ej        fdZded	efdZ	 d%d
dddej        ded
z  dej        d
z  ded	ej        f
dZ	 	 d&dej        dej        ded
z  dej        d
z  def
d Zd!ej        d	ej        d
z  fd"Zd#eeeej        f                  d	ee         fd$Z xZS )'Phi3VForCausalLMembed_tokenszvision_embed_tokens.zlanguage_model.lm_head.zlanguage_model.model.)zmodel.vision_embed_tokens.wtezmodel.vision_embed_tokens.zlm_head.zmodel.)orig_to_new_prefixr  r   rG   Nc                 V    |                     d          rd| dS t          d          )Nr   z<|image_z|>z Only image modality is supported)
startswith
ValueError)clsr  r   s      rP   get_placeholder_strz$Phi3VForCausalLM.get_placeholder_str9  s8    w'' 	$#a####;<<<rR   rC   )rF   vllm_configrF   c          
      l   t                                                       |j        j        }|j        }|j        j        }|| _        || _        t          | _        | 	                    |d          5  t          |j        |j        |t          |d                    | _        t          ||t          |d                    | _        d d d            n# 1 swxY w Y   |                     |          5  t%          |ddg          | _        d d d            n# 1 swxY w Y   | j        j        | _        d S )Nr   zmodel.embed_tokensrs   zmodel.vision_embed_tokensrC   LlamaForCausalLM)r_  rF   architectures)r}   r~   model_configrD   rE   multimodal_configrp   r  image_token_id_mark_tower_modelr   
vocab_sizer;   r1   rX  ro   vision_embed_tokens_mark_language_modelr0   language_modelmake_empty_intermediate_tensors)r   r_  rF   rp   rE   rd  r   s         rP   r~   zPhi3VForCausalLM.__init__@  s   )3"/'4F!2-##K99 	 	 6!")#F,@AA	! ! !D (<)#F,GHH( ( (D$	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 &&{33 
	 
	"<'   22	# 	# 	#D
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 ? 	,,,s%   1ACCC3DDDkwargsc                 .   |                     dd           }|                     dd           }|                     dd           }||d S |*t          d||t          j        t          j        d          S |t	          d|          S t          d          )NrU   r^   rV   )rZ   r[   )rW   rU   r^   resolve_bindings)rW   rl   z This line should be unreachable.)poprT   rL   r<   rj   AssertionError)r   rl  rU   r^   rV   s        rP   _parse_and_validate_image_inputz0Phi3VForCausalLM._parse_and_validate_image_inputf  s     zz.$77jj55zz.$77L$84#(#)':E:E" "	    #,#!   
 ?@@@rR   image_inputc                 r    |d         dk    r|d         S |                      |d         |d                   }|S )NrW   rV   rl   rU   r^   )rh  )r   rr  rV   s      rP   _process_image_inputz%Phi3VForCausalLM._process_image_input  sK     v.00v&&//'])C
 
 rR   c                 R     | j         di |}|g S |                     |          }|S )Nrh   )rq  rt  )r   rl  rr  vision_embeddingss       rP   embed_multimodalz!Phi3VForCausalLM.embed_multimodal  s?    :d:DDVDDI 55kBB  rR   Fis_multimodalhandle_oov_mm_tokenr  multimodal_embeddingsry  rz  c                    |                      || j        ||          }|t          |          dk    r|S t          ||t	          |                    S )Nrx  r   )inputs_embedsr{  ry  )_embed_text_input_idsrX  r>  r/   r,   )r   r  r{  ry  rz  r}  s         rP   embed_input_idsz Phi3VForCausalLM.embed_input_ids  sv     22' 3	 3 
 
 !(C0E,F,F!,K,K  +'"70??
 
 
 	
rR   	positionsintermediate_tensorsr}  c                 J    |d }| j                             ||||          }|S )N)r}  )rj  model)r   r  r  r  r}  rl  hidden_statess          rP   r   zPhi3VForCausalLM.forward  s>      + M+11y"6m 2 
 
 rR   r  c                 6    | j                             |          S r   )rj  compute_logits)r   r  s     rP   r  zPhi3VForCausalLM.compute_logits  s     "11-@@@rR   weightsc                     t          |           }|                    || j                  }d|vr+| j        j        j        | _        |                    d           |S )N)mapperzembed_tokens.weight)r-   load_weightshf_to_vllm_mapperrj  r  rX  add)r   r  loaderautoloaded_weightss       rP   r  zPhi3VForCausalLM.load_weights  se    "4((#00AW0XX !(::: $ 3 9 FD""#8999!!rR   r   )NN)r`   ra   rb   r.   r  classmethodr   r   r^  r   r~   rS  rm   rq  re   rf   rt  r(   rw  boolr  r#   r   r  r   rT  setr  r   r   s   @rP   rW  rW  *  s~        &-;*@1-	
 
   =3 =3 =3: = = = [= BD $
 $
 $
z $
3 $
 $
 $
 $
 $
 $
LAA	D	 A A A A:% 
   ! !4H ! ! ! ! >B

 .2$)
 
 
<
  4d:

 |d*
 "
 

 
 
 
8 <@-1 < < 2D8	
 |d*    "A|A 
	A A A A	"HU33D-E$F 	"3s8 	" 	" 	" 	" 	" 	" 	" 	"rR   rW  r   )Vcollections.abcr   r   r   typingr   r   r   r	   regexrE  re   torch.nnr   transformersr
   r   r   r   vllm.configr   vllm.config.multimodalr   vllm.loggerr   'vllm.model_executor.layers.quantizationr   3vllm.model_executor.layers.vocab_parallel_embeddingr   vllm.multimodalr   vllm.multimodal.inputsr   r   r   vllm.multimodal.parser   r   r   r   vllm.multimodal.processingr   $vllm.multimodal.processing.processorr   r   r   r   r    r!   r"   vllm.sequencer#   vllm.utils.tensor_schemar$   r%   clipr'   
interfacesr(   r)   r*   r+   r,   utilsr-   r.   r/   r0   r1   r`   loggerr  rL   r   rQ   rT   rj   rm   rd   Modulero   r   r   r   register_processorrW  rh   rR   rP   <module>r     s  $ 8 7 7 7 7 7 7 7 7 7 7 5 5 5 5 5 5 5 5 5 5 5 5                       # " " " " " 3 3 3 3 3 3 # # # # # # F F F F F F V V V V V V / / / / / /         
            > = = = = =                  . - - - - - > > > > > > > > ! ! ! ! ! !                           
X		 $4$4% % % !"  $t+  	   0F F F F FL F F F0         46OO ) O O Or) r) r) r) r)29 r) r) r)j0 0 0 0 0, 0 0 00
 
 
 
 
45HI 
 
 
>W' W' W' W' W'67JK W' W' W't ('	(  
`" `" `" `" `"ry"4j- `" `" 
`" `" `"rR   