
    +j]                     b   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mZm	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mZ d d	lmZ d
Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z  G d de          Z!dS )    N)vtkWindowToImageFilter)vtkPNGReadervtkPNGWritervtkJPEGWriter)vtkImageData)vtkUnsignedCharArray)vtkPResampleFilter)	iteritemsgetJSArrayType)update_cameracreate_spherical_cameracreate_cylindrical_camera)DataHandlerABCDEFGHIJKLMNOPQRSTUVWXYZc                   (    e Zd ZddZd Zd Zd ZdS )CaptureRenderWindow   c                     t                      | _        | j                            |           | j                                         | j                                         d | _        d S N)r   windowToImageSetScaleSetInputBufferTypeToRGBReadFrontBufferOnwriter)selfmagnifications     X/DATA/AppData/hermes/venv/lib/python3.11/site-packages/vtkmodules/web/dataset_builder.py__init__zCaptureRenderWindow.__init__   s\    355##M22222444,,...    c                 :    | j                             |           d S r   )r   SetInput)r   renderWindows     r   SetRenderWindowz#CaptureRenderWindow.SetRenderWindow!   s    ##L11111r   c                 6   |dk    rFt                      | _        | j                            | j                                                   d S |dk    rFt                      | _        | j                            | j                                                   d S d S )N	image/png	image/jpg)r   r   SetInputConnectionr   GetOutputPortr   )r   mimeTypes     r   	SetFormatzCaptureRenderWindow.SetFormat$   s    {""&..DKK**4+=+K+K+M+MNNNNN$$'//DKK**4+=+K+K+M+MNNNNN %$r   c                     | j         rg| j                                         | j                                         | j                             |           | j                                          d S d S r   )r   r   ModifiedUpdateSetFileNameWrite)r   paths     r   
writeImagezCaptureRenderWindow.writeImage,   sp    ; 	 '')))%%'''K##D)))K		  	 r   N)r   )__name__
__module____qualname__r   r#   r*   r1    r   r   r   r      sX           2 2 2O O O         r   r   c                   :    e Zd Zi i fdZd Zd Zd ZddZd ZdS )	DataSetBuilderc                 0   t          |          | _        || _        d | _        t	                      | _        t          |          D ] \  }}| j                            ||           !t          |          D ] \  }}| j                            ||           !d S r   )	r   dataHandlercameraDescriptioncamerar   imageCapturer
   addMetaData
addSection)r   locationcamera_datametadatasectionskeyvalues          r   r   zDataSetBuilder.__init__:   s    &x00!,/11#H-- 	5 	5JC((e4444#H-- 	4 	4JC''U3333	4 	4r   c                     | j         S r   )r9   r   s    r   getDataHandlerzDataSetBuilder.getDataHandlerF   s    r   c                     | j         S r   )r;   rF   s    r   	getCamerazDataSetBuilder.getCameraI   s
    {r   c                 b    t          | j        |           | j                                         d S r   )r   rendererr"   Render)r   r;   s     r   updateCamerazDataSetBuilder.updateCameraL   s/    dmV,,,  """""r   Nc                 `   |r|| _         || _        | j                            |           | j        r| j        d         dk    r3t          || j        | j        d         | j        d                   | _        nC| j        d         dk    r2t          || j        | j        d         | j        d                   | _        |	                                dt          fdt          d	          D                       z  }| j                            d
|           | j                                         d S )Ntype	sphericalphithetacylindricaltranslationzrgb(%d, %d, %d)c              3   H   K   | ]}t          |         d z            V  dS )   N)int).0ibgColors     r   	<genexpr>z'DataSetBuilder.start.<locals>.<genexpr>l   sE       6 6*+GAJ$%%6 6 6 6 6 6r      backgroundColor)r"   rK   r<   r#   r:   r   r9   r;   r   GetBackgroundtupleranger=   updateBasePattern)r   r"   rK   bgColorStringrZ   s       @r   startzDataSetBuilder.startP   sY    	K ,D$DM --l;;; % )&1[@@"9 (.u5.w7	# #DKK +F3}DD"; (.u5.}=	# #DK ,,..G- 6 6 6 6/4Qxx6 6 6 1 1 M (():MJJJ 	**,,,,,r   c                 8    | j                                          d S r   )r9   writeDataDescriptorrF   s    r   stopzDataSetBuilder.stopt   s    ,,.....r   )NN)	r2   r3   r4   r   rG   rI   rM   rc   rf   r5   r   r   r7   r7   9   s~        79B 
4 
4 
4 
4       # # #"- "- "- "-H/ / / / /r   r7   c                   &    e Zd Zi i fdZd Zd ZdS )ImageDataSetBuilderc                     t                               | ||||           d|                    d          d         z   }| j                            dd||           | j                            |           d S )N./r   imageblob)namerO   r)   fileName)r7   r   splitr9   registerDatar<   r*   )r   r?   imageMimeType
cameraInforA   rB   imageExtenstions          r   r   zImageDataSetBuilder.__init__~   s    h
HhOOO 3 3C 8 8 ;;%%v 	& 	
 	
 	
 	##M22222r   c                 j    | j                             | j                            d                     d S Nrl   )r<   r1   r9   getDataAbsoluteFilePathrF   s    r   r1   zImageDataSetBuilder.writeImage   s0    $$T%5%M%Mg%V%VWWWWWr   c                     | j         D ]b}t          | j        |           | j                                         | j                            | j                            d                     cd S rv   )	r;   r   rK   r"   rL   r<   r1   r9   rw   )r   cams     r   writeImageszImageDataSetBuilder.writeImages   sx    ; 	 	C$----$$&&&(( 88AA   	 	r   N)r2   r3   r4   r   r1   rz   r5   r   r   rh   rh   }   sO        EGRT 3 3 3 3X X X    r   rh   c                   F    e Zd Zi i fdZd Zd Zd Zd Zd Zd Z	dd	Z
d
S )VolumeCompositeDataSetBuilderc                 (   t                               | ||||           | j                            dd           || _        d|                    d          d         z   | _        |dk    rt                      | _        |dk    rt                      | _        t                      | _        | j                            | j                   t                      | _        d | _        i | _        i | _        g g i i g d| _        d	| _        d	| _        i | _        d S )
Nzvolume-compositez
rgba+depthrj   rk   r   r%   r&   )layers
dimensionsfieldslayer_fieldspipeline )r7   r   r9   addTypesrr   rp   rt   r   imageWriterr   r   imageDataColorSetInputDataimageDataDepthdepthToWrite	layerInfocolorByMappingcompositePipelineactiveDepthKeyactiveRGBKeynodeWithChildren)r   r?   rr   rs   rA   rB   s         r   r   z&VolumeCompositeDataSetBuilder.__init__   s   h
HhOOO!!"4lCCC*"]%8%8%=%=a%@@K''+~~DK'',D*nn%%d&9:::*nn  "
 "
 ! "r   c                     || j         v r| j         |         S t          t          | j                            }|| j         |<   || j        d         |<   |S )Nr   )r   encode_codeslenr   )r   colorBy	colorCodes      r   _getColorCodez+VolumeCompositeDataSetBuilder._getColorCode   sZ    d)))&w// %S)<%=%=>I+4D(:AD"8,Y7r   c                 `   || j         v r| j         |         d         dfS t          t          | j                            }|||d| j         |<   | j        d                             |           g | j        d         |<   |r|| j        vr0|g g d}|| j        |<   | j        d                             |           | j        |         d                             ||gd	           | j        |         d
                             |           n$| j        d                             ||gd	           |dfS )NcodeF)r   rn   parentr~   r   )rn   idschildrenr   r   )rn   r   r   T)r   r   r   r   appendr   )r   r   	layerName	layerCoderootNodes        r   _getLayerCodez+VolumeCompositeDataSetBuilder._getLayerCode   sl   &&N9-f5u==$S%8%89I!! ) )DN9%
 "8,33I>>>@BD">29=  !666(.rrJJH4<D)&1*:6==hGGG %f-j9@@&	{;;   %f-e4;;IFFFF &z299&	{;;   t$$r   c                     || j         d         |         v rdS | j         d         |                             |           dS )Nr   FT)r   r   )r   r   r   s      r   _needToRegisterColorz2VolumeCompositeDataSetBuilder._needToRegisterColor   sE    .~>yIII5">29=DDYOOO4r   c           	         |                      ||          \  }}|                     |          }|                     ||          }d|z  | _        ||d| _        |r'| j                            | j        dd|z  |g           |r=| j                            | j        dd||d| j        ||g| j                   d S d S )	Nz%s_depth_rgbarrayz/%s_depth.uint8rn   rO   ro   
categoriesrm   rk   )rn   rO   ro   r   r)   )	r   r   r   r   r   r9   rq   rt   rr   )r   r   rn   r   r   needToRegisterDepthr   needToRegisterColors           r   activateLayerz+VolumeCompositeDataSetBuilder.activateLayer   s   )-););FD)I)I&	&&&w//	"77	9MM )94*3)YYY?  	))(*Y6%;	 *     	))&V*3)YYY@T@TU&/i;<+ *     	 	r   c                    | j                                         d         }| j                                         d         }| j        st          ||z            | _        | j        D ]{}|                     |           | j                            | j                  }| j                            | j	                  }|
                    | j                   | j                            |           | j                                         |                    | j                   | j                                                            d          }|                                }t)          |          D ],}	t+          |                    |	                    | j        |	<   -t/          |d          5 }
|
                    | j                   d d d            n# 1 swxY w Y   }d S )Nr   r   wb)r"   GetSizer   	bytearrayr;   rM   r9   rw   r   r   GetColorImager   r   r.   r/   GetDepthImager   GetPointDataGetArrayGetNumberOfTuplesr`   rW   GetValueopenwrite)r   mapperwidthheightry   	imagePath	depthPath
inputArraysizeidxfs              r   	writeDataz'VolumeCompositeDataSetBuilder.writeData	  s   !))++A."**,,Q/  	: )%&. 9 9D; 	+ 	+Cc"""(@@ARSSI(@@ATUUI
   !4555((333""$$$
   !4555,99;;DDQGGJ//11DT{{ G G),Z-@-@-E-E)F)F!#&&i&& +!)***+ + + + + + + + + + + + + + ++	+ 	+s   -GG	G	c                 v    t                               | ||           | j                            ddg           d S )N   r   )r7   rc   r;   updatePriority)r   r"   rK   s      r   rc   z#VolumeCompositeDataSetBuilder.start(  s:    T<:::""Aq6*****r   Tc           
      t   | j                                         | j        d<   d                    | j        d                   dz   | j        d<   | j                            d| j                   t                              |            |r,t          j	        | j        
                                          D ]\  }}}t          d|           |D ]}d|v rd|vrt          t          j                            ||          d	          5 }t          j        t          j                            ||dz             d
          5 }t          j        ||           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          j        t          j                            ||                     d S d S )Nr   Ar~   default_pipelineCompositePipelineCompress.uint8.gzrbr   )r"   r   r   joinr9   r>   r7   rf   oswalkgetBasePathprintr   r0   gzipshutilcopyfileobjremover   compressrootdirsfilesrn   f_inf_outs           r   rf   z"VolumeCompositeDataSetBuilder.stop,  sG   /3/@/H/H/J/J|,HHT+H566< 	12 	##$79OPPP 	D!!! 
	<%'WT-=-I-I-K-K%L%L 	< 	<!dEj$'''! < <D4''E,=,=!"',,tT":":DAA @T!% "T4%< @ @$" " @!& & 24 ? ? ?@ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @
 	"',,tT":":;;;<
	< 
	<	< 	<s6   7E6=E	E6E##E6&E#'E66E:=E:NT)r2   r3   r4   r   r   r   r   r   r   rc   rf   r5   r   r   r|   r|      s        EGRT # # # #@  !% !% !%F    6+ + +>+ + +< < < < < <r   r|   c                   4    e Zd Zdi fdZd Zd Zd ZddZdS )	DataProberDataSetBuilderNc                    t                               | |d |           || _        t                      | _        | j                            |           |r5| j                            d           | j                            |           n| j                            d           | j        	                    dd           i |i g dd| _
        | j        D ]"}| j                            |dd|z  	           #d S )
Nr   r   zdata-proberbinary)r   r   r   )typesr   rangesspacingr   z	/%s.arrayrn   rO   ro   )r7   r   fieldsToWriter	   resamplerFilterSetSamplingDimensionSetUseInputBoundsSetCustomSamplingBoundsr9   r   
DataProberrq   )r   r?   sampling_dimesionsfields_to_keepcustom_probing_boundsrA   fields          r   r   z!DataProberDataSetBuilder.__init__H  s%    	hh???+133112DEEE  	6 221555 889NOOOO 221555 	!!-:::, yy	
 
 ' 	 	E));3F *    	 	r   c                 :    | j                             |           d S r   )r   r   )r   datasets     r   setDataToProbez'DataProberDataSetBuilder.setDataToProbeg  s    ))'22222r   c                 ^    | j                             |                                           d S r   )r   r'   r(   )r   sources     r   setSourceToProbez)DataProberDataSetBuilder.setSourceToProbej  s+    //0D0D0F0FGGGGGr   c                    | j                                          | j                                                                         }| j        D ]}|                    |          }|rht          |          }t          | j        	                    |          d          5 }|
                    |           d d d            n# 1 swxY w Y   t          |          | j        d         |<   || j        d         v r|                                }|d         | j        d         |         d         k     r|d         | j        d         |         d<   |d         | j        d         |         d         k    r|d         | j        d         |         d<   ?|                                d         |                                d         g| j        d         |<   t          d|           t          | j                                                    d S )Nr   r   r   r   r   zNo array for)r   r-   	GetOutputr   r   r   
memoryviewr   r9   rw   r   r   r   GetRanger   )r   arraysr   r   br   	dataRanges          r   r   z"DataProberDataSetBuilder.writeDatam  s   ##%%%%//11>>@@' 	8 	8EOOE**E 8u%%$*BB5II4PP TUGGAJJJ               3A2G2G(/DOH555 % 0 0I |doh&?&Fq&III>Gl1%8; |doh&?&Fq&III>Gl1%8; ((+((+8DOH-e44
 ne,,,d*44667777+	8 	8s   C  C	C	Tc           
         | j                             d| j                   t                              |            |r,t          j        | j                                                   D ]\  }}}t          d|           |D ]}d|v rd|vrt          t
          j
                            ||          d          5 }t          j	        t
          j
                            ||dz             d          5 }t          j        ||           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          j        t
          j
                            ||                     d S d S )Nr   r   z.arrayr   r   r   )r9   r>   r   r7   rf   r   r   r   r   r   r0   r   r   r   r   r   r   s           r   rf   zDataProberDataSetBuilder.stop  s   ##L$/BBB 	D!!! 
	<%'WT-=-I-I-K-K%L%L 	< 	<!dEj$'''! < <D4''E,=,=!"',,tT":":DAA @T!% "T4%< @ @$" " @!& & 24 ? ? ?@ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @
 	"',,tT":":;;;<
	< 
	<	< 	<s6   :7D*1D	D*DD*DD**D.1D.r   )r2   r3   r4   r   r   r   r   rf   r5   r   r   r   r   G  st         #   >3 3 3H H H8 8 84< < < < < <r   r   c                       e Zd Zd Zd ZdS )ConvertVolumeStackToSortedStackc                 0    || _         || _        d| _        d S Nr   )r   r   r~   )r   r   r   s      r   r   z(ConvertVolumeStackToSortedStack.__init__  s    
r   c           	         i }i }g }t          j        |          D ]}d|v sd|v r|                    d          d         d         }d|v r$t           j                            ||          ||<   S|                    |           t           j                            ||          ||<   |                                 t          |          dk    rd S g }t                      }| j	        | j
        z  t          |          z  }	| j	        | j
        z  }
t          |          | _        t                      }|                    d           |                    |	           t                      }|                    d           |                    |	           t          | j                  D ]E}|                    |||                             |                                 |                                                                                    d          }t          |
          D ]i}|                    ||
z  |z   |                    |dz                       |                    ||
z  |z   |                    |dz  dz                        jt/          |||                  d          5 }|                    |                                           d d d            n# 1 swxY w Y   Gt                      }|                    d           |                    |	           t                      }|                    d           |                    |	           t                      }|                    d           |                    |	           t          |
          D ]}g }|D ],}|                    ||         t          |          f           -|                    d	 
           t          t          |                    D ]}||         d         }|                    |
|z  |z   |           |                    |
|z  |z   |                    |
|z  |z                        |                    |
|z  |z   |                    |
|z  |z                        t/          t           j                            |d          d          5 }|                    t5          |                     d d d            n# 1 swxY w Y   t/          t           j                            |d          d          5 }|                    t5          |                     d d d            n# 1 swxY w Y   t/          t           j                            |d          d          5 }|                    t5          |                     d d d            d S # 1 swxY w Y   d S )Nr   _depth_r   r      r\   r   c                     | d         S r   r5   )tups    r   <lambda>z9ConvertVolumeStackToSortedStack.convert.<locals>.<lambda>  s
    CF r   )rC   zalpha.uint8r   zintensity.uint8zorder.uint8)r   listdirrp   r0   r   r   sortr   r   r   r   r~   r   SetNumberOfComponentsSetNumberOfTuplesr`   r.   r-   r   r   r   SetValuer   r   readr   r   )r   	directory
imagePaths
depthPaths
layerNamesro   fileIddepthArraysimageReadernumberOfValues	imageSizeopacity	intensitylayer	rgbaArrayr   	depthFile	destOrderopacityOrderintensityOrderpixelIdx
depthStack
depthArraydestLayerIdxsourceLayerIdxr   s                             r   convertz'ConvertVolumeStackToSortedStack.convert  s   



9-- 	K 	KH!!X%9%9!,,Q/2X%%)+i)J)JJv&&%%f---)+i)J)JJv&z??aF "nndk1C
OOCJ,	*oo '((%%a(((!!.111(**	''***##N3334;'' 	5 	5E##Jz%/@$ABBB   #--//<<>>GGJJIY''  ""Y&#-y/A/A#'/J/J     Y&#-y/A/A#'A+/N/N    jE!23T:: 5i""9>>#3#34445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 )**	''***##N333+--**1---&&~666-//,,Q///((888i(( 	 	HJ) K K
!!:h#7Z"IJJJJOO 2 2O333 %c*oo 6 6  !+L!9!!< ""-9>   %%-9$$i.&@H%LMM   ''-9&&	N(Bh'NOO     "',,y-88$?? 	.1GGJ|,,---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. "',,y*;<<dCC 	0qGGJ~..///	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 "',,y-88$?? 	+1GGJy))***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+sH   ,(K  K$	'K$	#S??TT8#U''U+.U+ #WWWN)r2   r3   r4   r   r#  r5   r   r   r   r     s7          
]+ ]+ ]+ ]+ ]+r   r   c                   4    e Zd Zi i fdZd Zd Zd ZddZdS )	SortedCompositeDataSetBuilderc                 :   t                               | |d|||           | j                            dd           g | _        | j                            ddd           | j                            ddd	           | j                            d
ddd
g           d S )Nr%   sorted-compositergbaorderr   z/order.uint8r   alphaz/alpha.uint8r  z/intensity.uint8r   )r|   r   r9   r   layerScalarsrq   )r   r?   rs   rA   rB   s        r   r   z&SortedCompositeDataSetBuilder.__init__  s    %..(KXx	
 	
 	
 	!!"4f=== %%w 	& 	
 	
 	
 	%%w 	& 	
 	
 	
 	%%'#}	 	& 	
 	
 	
 	
 	
r   c                     t                               | ||           | j                                        }t	          |d         |d                   | _        d S )Nr   r   )r|   rc   r"   r   r   dataConverter)r   r"   rK   r  s       r   rc   z#SortedCompositeDataSetBuilder.start  sO    %++D,III%--//	<Yq\9UV<XXr   c                 z    t                               | dd|z  |           | j                            |           d S )Nr   z%s)r|   r   r+  r   )r   r   scalars      r   r   z+SortedCompositeDataSetBuilder.activateLayer  sF    %33&$-	
 	
 	
 	  (((((r   c                     t                               | |           | j                            d           | j                            d           | j                            d           d S )Nr)  r*  r  )r|   r   r9   rw   )r   r   s     r   r   z'SortedCompositeDataSetBuilder.writeData%  se    %//f=== 	009990099900=====r   Tc           
         t                               | d           t          j        | j                                                  D ]q\  }}}|D ]h}t          dt          j                            ||                     | j	        
                    t          j                            ||                     irt          j        t          j                            | j                                        d          t          j                            | j                                        d                     t          t          j                            | j                                        d          d          5 }t          j        |          }|d         d         | j	        j        | j        d	| j	        j                 d
|d<   g }	|d= |d         D ]!}
|
d         dv r|	                    |
           "|	|d<   g d|d<   t          t          j                            | j                                        d          d          5 }|                    t          j        |                     d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |rt          j        | j                                                  D ][\  }}}t          d|           |D ]B}d|v s
d|v s|dk    r2t          j        t          j                            ||                     C\|r,t          j        | j                                                  D ]\  }}}t          d|           |D ]}d|v rd|vrt          t          j                            ||          d          5 }t+          j        t          j                            ||dz             d          5 }t-          j        ||           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          j        t          j                            ||                     d S d S )NF)r   Processz
index.jsonzindex_origin.jsonrr   r   r   )r   r~   scalarsSortedCompositedatarn   )r)  r*  r  )ztonic-query-data-modelr'  r*  rO   wCleanz_rgb.pngz_depth.uint8r   r   r   r   r   )r|   rf   r   r   r9   r   r   r0   r   r-  r#  renamer   jsonloadr~   r+  r   r   dumpsr   r   r   r   )r   cleanr   r   r   r   rn   infoFilerA   
dataToKeepitemnewMetaFiler   r   s                 r   rf   z"SortedCompositeDataSetBuilder.stop-  sX   %**4%*@@@ "$)9)E)E)G)G!H!H 	E 	ED$ E EidD!9!9:::"**27<<d+C+CDDDDE
 		GLL)5577FFGLL)55779LMM	
 	
 	
 GLL)55779LMMs
 
 	8y**H&':;LI,3,Q1C1J-JK+ +H&' J,- ( , ,<#BBB%%d+++)HVVVVHV T-99;;\JJC  8!!$*X"6"67778 8 8 8 8 8 8 8 8 8 8 8 8 8 8)	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	84  		<%'WT-=-I-I-K-K%L%L < <!dEgt$$$! < <D"d**)T11#666	"',,tT":":;;;<  
	<%'WT-=-I-I-K-K%L%L 	< 	<!dEj$'''! < <D4''E,=,=!"',,tT":":DAA @T!% "T4%< @ @$" " @!& & 24 ? ? ?@ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @
 	"',,tT":":;;;<
	< 
	<	< 	<sm   >CJ	(I=1J=J	JJ	JJJ'7PP 	4P PPPPPPN)TT)r2   r3   r4   r   rc   r   r   rf   r5   r   r   r%  r%    sq        682 
 
 
 
*Y Y Y
) ) )> > >?< ?< ?< ?< ?< ?<r   r%  )"r:  r   r   r   vtkmodules.vtkRenderingCorer   vtkmodules.vtkIOImager   r   r   vtkmodules.vtkCommonDataModelr   vtkmodules.vtkCommonCorer   vtkmodules.vtkFiltersParallelr	   vtkmodules.webr
   r   vtkmodules.web.camerar   r   r   vtkmodules.web.query_data_modelr   r   objectr   r7   rh   r|   r   r   r%  r5   r   r   <module>rK     sX                   > > > > > > K K K K K K K K K K 6 6 6 6 6 6 9 9 9 9 9 9 < < < < < < 4 4 4 4 4 4 4 4         
 8 7 7 7 7 7 ,         &      @</ </ </ </ </V </ </ </H    .   0l< l< l< l< l<N l< l< l<dQ< Q< Q< Q< Q<~ Q< Q< Q<nc+ c+ c+ c+ c+f c+ c+ c+Lh< h< h< h< h<$A h< h< h< h< h<r   