
    IЦive                    ~   % S SK Jr  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rS SK	r	S SK
Jr  S SKJrJrJrJrJrJr  S SKJ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Jr  S SK J!r!  S SK"J#r#  \(       a  S SK$r$S S	K%J&r&  S S
K'J(r(J)r)   " S S\*5      r+\RX                  " \-5      r.Sr/\R`                  " SS9 " S S5      5       r1\R`                   " S S5      5       r2Sq3S\4S'   Sq5S\4S'   \R`                  " SS9 " S S5      5       r6\" S5      r7 " S S\Rp                  5      r9\9Rt                  r; " S S\Rp                  5      r<\<Rt                  r=\R`                   " S S5      5       r>S S!.         S.S" jjr?S S!.         S.S# jjr@S/S$ jrAS0S% jrBS1S& jrCS2S' jrDS3S( jrES4S) jrFS5S* jrGS6S+ jrHS6S, jrIS5S- jrJg)7    )annotationsN)defaultdict)DefaultDictOptionalTupleTYPE_CHECKINGTypeVarUnion)Self)dynamo_timedget_chromium_event_logger	warn_once)	is_fbcode)trace_structured_artifact)InstructionTranslator)
JsonDataTyRemoteCachec                      \ rS rSrSrg)ReservedWorkflowIdUserError    N)__name__
__module____qualname____firstlineno____static_attributes__r       P/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/torch/_dynamo/pgo.pyr   r      s    r   r   
   T)frozenc                  H    \ rS rSr% S\S'   S\S'   S\S'   \S
S j5       rSrg	)CodeIdZ   strfilenameintfirstlinenonamec                X    [        U R                  U R                  U R                  5      $ N)r"   co_filenameco_firstlinenoco_name)codes    r   makeCodeId.make`   s!    d&&(;(;T\\JJr   r   N)r.   ztypes.CodeTypereturnr"   )r   r   r   r   __annotations__staticmethodr/   r   r   r   r   r"   r"   Z   s&    M
IK Kr   r"   c                  B    \ rS rSr% \R
                  " S S9rS\S'   Srg)	CodeStatee   c                      [        [        5      $ r*   )r   FrameStateSizeEntryr   r   r   <lambda>CodeState.<lambda>h   s
    ,? @r   )default_factoryz%DefaultDict[str, FrameStateSizeEntry]automatic_dynamicr   N)	r   r   r   r   dataclassesfieldr<   r2   r   r   r   r   r5   r5   e   s    ?J?P?P@@< r   r5   z(Optional[DefaultDict[CodeId, CodeState]]_INIT_CODE_STATE_CODE_STATEc                  $    \ rS rSr% SrS\S'   Srg)InferStridep   a(  
Denotes the quantity stride[dim] * size[dim], which is what the stride would
be for the next physical dimension that results in a contiguous layout.

For example, given size = [2, 3], stride = [3, 1], we can replace this with
stride = [InferStride(1), 1], because InferStride(1) = stride[1] * size[1] = 1 * 3 = 3

Indirecting the representation in this way is important for the join operation
on strides as if we join [2, 3][3, 1] and [2, 4][4, 1],
we don't want [2, None][None, 1] which would get eventually symbolized into
[2, s0][s1, 1] (notice that the relationship between s0 and s1 is broken).
If we instead rewrite the expressions as InferStride so we have [2, 3][InferStride(1), 1]
and [2, 4][InferStride(1), 1] we now join to [2, None][InferStride(1), 1] will
result in [2, s0][s0, 1], as desired.
r&   dimr   N)r   r   r   r   __doc__r2   r   r   r   r   rB   rB   p   s      
Hr   rB   _Tc                      \ rS rSrSrSrSrg)	AutoUnset   z
The identity element of our semilattice, a generic "don't know" element that
is always subsumed when we get more information.
r   r   Nr   r   r   r   rE   tokenr   r   r   r   rH   rH          
 Er   rH   c                      \ rS rSrSrSrSrg)AutoDynamic   zv
The top element of our (bounded) semilattice, whenever you merge this with
any other element you always get it again
r   r   NrJ   r   r   r   rN   rN      rL   r   rN   c                  V   \ rS rSr% \R
                  " \S9rS\S'   \R
                  " \S9r	S\S'   \R
                  " \S9r
S\S'   SS	 jrSS
 jrSS jrSS jr\SS j5       r\SS j5       r\      SS j5       r\SS j5       r\SS j5       r\      SS j5       rSS jrSrg) r8      )defaultz"Union[int, AutoDynamic, AutoUnset]scalarzBUnion[AutoDynamic, AutoUnset, Tuple[Union[int, AutoDynamic], ...]]sizezOUnion[AutoDynamic, AutoUnset, Tuple[Union[int, AutoDynamic, InferStride], ...]]stridec                  ^ SS jmS	U4S jjnU R                   [        L a6  U R                  [        L a#  U R                  [        L a  gSU R                   3$ U R                  [        L af  [	        U R                   [
        5      (       aG  [	        U R                  [
        5      (       a(  SU" U R                   5       SU" U R                  5       3$ g)
Nc                    U [         L a  gU [        L a  g[        U [        5      (       a  SU R                   S3$ [        U 5      $ )N?z
auto unsetzS())auto_dynamic
auto_unset
isinstancerB   rD   r$   )ss    r   render_single1FrameStateSizeEntry.render.<locals>.render_single   s?    L j#A{++AEE7!}$1vr   c                F   > SSR                  U4S jU  5       5      -   S-   $ )N[z, c              3  4   >#    U  H  nT" U5      v   M     g 7fr*   r   ).0r]   r^   s     r   	<genexpr>CFrameStateSizeEntry.render.<locals>.render_tuple.<locals>.<genexpr>   s     "@R=#3#3Rs   ])join)ssr^   s    r   render_tuple0FrameStateSizeEntry.render.<locals>.render_tuple   s"    "@R"@@@3FFr   zfully dynamic scalar or tensorzscalar ztensor size=z stride=zunusual {repr(self)})r]   z/Union[int, AutoDynamic, AutoUnset, InferStride]r1   r$   )rh   z0Tuple[Union[int, AutoDynamic, InferStride], ...]r1   r$   )rT   rZ   rU   rS   r\   tuple)selfri   r^   s     @r   renderFrameStateSizeEntry.render   s    			G 99$)D{{l*7 ..[[L($))U++
4;;0N0N%l499&=%>h|TXT_T_G`Fabb &r   c                   [        U R                  [        R                  5      (       a   U R                  5       e[        U R                  [
        5      (       a9  U R                   H)  n[        U[        R                  5      (       d  M$   U5       e   [        U R                  [
        5      (       a:  U R                   H)  n[        U[        R                  5      (       d  M$   U5       e   g g r*   )r\   rS   torchSymIntrT   rk   rU   )rl   r]   s1s      r   __post_init__!FrameStateSizeEntry.__post_init__   s    dkk5<<88E$++E8dii''YY%a66996 dkk5))kk%b%,,77;;7 " *r   c                |    U R                   [        L a  gU R                   [        L a  gU R                   U   [        L $ )NTF)rT   rZ   r[   rl   rD   s     r   is_size_dynamic#FrameStateSizeEntry.is_size_dynamic   s3    99$99
"yy~--r   c                    [        U R                  [        5      (       a!  [        S U R                   5       5      (       d  gU R                  [
        L a  gU R                  [        L a  gU R                  U   [
        L $ )Nc              3  D   #    U  H  n[        U5      [        L v   M     g 7fr*   )typer&   )rc   r]   s     r   rd   8FrameStateSizeEntry.is_stride_dynamic.<locals>.<genexpr>   s     0SAaCs    FT)r\   rT   rk   allrU   rZ   r[   rv   s     r   is_stride_dynamic%FrameStateSizeEntry.is_stride_dynamic   s^    " tyy%((S0S0S-S-S;;,&;;*${{3<//r   c                &    [        S U  5       5      $ )Nc              3  p   #    U  H,  n[        U[        R                  5      (       a  [        OUv   M.     g 7fr*   )r\   rp   rq   rZ   )rc   xs     r   rd   4FrameStateSizeEntry._munge_symint.<locals>.<genexpr>   s'     TQSAZ5<<%@%@\aGQSs   46)rk   )xss    r   _munge_symint!FrameStateSizeEntry._munge_symint   s    TQSTTTr   c                (    [        U[        [        S9$ NrS   rT   rU   )r8   rZ   )clsr   s     r   make_scalarFrameStateSizeEntry.make_scalar   s    "!,|TTr   c                \    [        [        U R                  U5      U R                  U5      S9$ r   )r8   rZ   r   )r   rT   rU   s      r   make_tensorFrameStateSizeEntry.make_tensor   s0     #""4($$V,
 	
r   c                F    [        [        U R                  U5      [        S9$ r   )r8   r[   r   )r   rT   s     r   	make_sizeFrameStateSizeEntry.make_size  s#    """4(
 	
r   c                l    U [         L a  U$ U[         L a  U $ U [        L d  U[        L d  X:w  a  [        $ U $ r*   )r[   rZ   )r   ys     r   _merge_atomFrameStateSizeEntry._merge_atom  s8    
?H
?H\ 1QVr   c                   ^  U[         L a  U$ U[         L a  U$ U[        L d	  U[        L a  [        $ [        U5      [        U5      :w  a  [        $ [        U 4S j[	        X5       5       5      $ )Nc              3  J   >#    U  H  u  pTR                  X5      v   M     g 7fr*   )r   )rc   r   r   r   s      r   rd   6FrameStateSizeEntry._merge_atom_tup.<locals>.<genexpr>%  s     C{tqS__Q**{s    #)r[   rZ   lenrk   zip)r   r   yss   `  r   _merge_atom_tup#FrameStateSizeEntry._merge_atom_tup  s_     II|!3r7c"gCs2{CCCr   c                   U R                  U R                  UR                  5      U l        U R                  U R                  UR                  5      U l        U R                  U R                  UR                  5      U l        U $ r*   )r   rS   r   rT   rU   )rl   others     r   __ior__FrameStateSizeEntry.__ior__'  s[    &&t{{ELLA((EJJ?	**4;;Er   r   N)r1   r$   r1   None)rD   r&   r1   bool)r   Tuple[int, ...]r1   z#Tuple[Union[AutoDynamic, int], ...])r   r&   r1   r8   )rT   r   rU   r   r1   r8   )rT   r   r1   r8   )r   rF   r   rF   r1   zUnion[AutoDynamic, _T])r   -Union[AutoDynamic, AutoUnset, Tuple[_T, ...]]r   r   r1   zAUnion[AutoDynamic, AutoUnset, Tuple[Union[AutoDynamic, _T], ...]])r   r   r1   r   )r   r   r   r   r=   r>   r[   rS   r2   rT   rU   rm   rs   rw   r~   r3   r   classmethodr   r   r   r   r   r   r   r   r   r   r8   r8      s%   1<1B1B:1VF.V
 	*- 	  .
 	*-   .&:<.04 U U U U 
"
,;
	
 
 
 
   D9D :D 
K	D Dr   r8   Fis_unspecialized_nn_modulec               l  ^^^
 [         R                  U R                  5      n[        5       U   nTUR                  ;   nUR                  T   n[
        R
                  " U5      m
UT-  nU(       a  T
R                  UR                  :w  a  [        R                  STTR                  T
R                  5        [        5       R                  S[        R                  " 5       TSS[        T
R                  5      [        TR                  5      S.5        U(       a  [        R                  ST5         S         SUUU
4S jjjnU(       a  T
R                  UR                  :w  a  [!        T
R                  ["        5      (       a  [!        TR                  ["        5      (       a  [%        T
R                  5      [%        TR                  5      :w  a  U" SS	S
5        Oa['        [%        TR                  5      5       H4  n	T
R                  U	   TR                  U	   :w  d  M%  U" SSU	 S3SU	5        M6     O
U" SSS5        U(       a  T
R(                  UR(                  :w  a  [!        T
R(                  ["        5      (       a  [!        TR(                  ["        5      (       a  [%        T
R(                  5      [%        TR(                  5      :w  a  U" SS	S
5        U$ ['        [%        TR(                  5      5       H4  n	T
R(                  U	   TR(                  U	   :w  d  M%  U" SSU	 S3SU	5        M6      U$ U" SSS5        U$ )Nz%automatic dynamic int %s val %s != %sr<   rS   zscalar changer(   dim_changedreasoncachednewz%s is converted to a symbolic integer. It is an attribute of a user defined nn module class. If you wish to keep it static, you can mark the nn module class as `torch._dynamo.mark_static`.c                H  > Uc  [        TU 5      O[        TU 5      U   nUc  [        TU 5      O[        TU 5      U   n[        R                  SU TUUU5        [        5       R	                  S[
        R                  " 5       TUc  SOUU[        U5      [        U5      S.5        g )Nz#automatic dynamic %s %s %s %s != %sr<   r}   r   )getattrlogdebugr   log_instant_eventtimetime_nsr$   )	tup_nameshort_reasonlong_reasoni	entry_tupold_entry_tupentryr(   	old_entrys	         r   log_tup)update_automatic_dynamic.<locals>.log_tupX  s     )*	GE8$wuh7OPQ7R 	
 y Ix(H-a0 	
 			1	
 	"#55LLN()	uq%m,9~
	
r   rT   rD   zdimensionality changezsize(rY   zsize changer   rU   zstride(zstride changer*   )
r   r$   r   r$   r   r$   r   zOptional[int]r1   r   )r"   r/   f_codeget_code_stater<   copyrS   r   r   r   r   r   r   r$   inforT   r\   rk   r   rangerU   )txr(   r   r   code_idframe_state	is_update	mut_entryr   r   r   s    ``       @r   update_automatic_dynamicr   .  s    kk"))$G "7+K555I--d3I		)$II Y%%)9)99		3LL		
 	"#55LLN')i../5<<(
	
 &HHK 	 PT

%(
7:
?L
	
 
@ Y^^y~~5inne,,EJJ1N1N9>>"c%**o5'>?s5::/A ~~a(EJJqM9%s!mQG 0 FGW-Y%%)9)99i&&..:ellE3R3R9##$ELL(99%)@A  s5<<01A ''*ell1o=GA3a./1M 2  Hgw/r   c                  U R                   =nc  [        U UUUS9$ UR                  c  X$R                  R                  U'   U$ S nUR                   H-  nXR                  ;   d  M  [        U UUR                  U   US9nM/     Uc   eU$ )Nr   )distributed_stater   
all_stateslocal_stater<   )r   r(   r   r   stres	sub_states          r   process_automatic_dynamicr     s     """+''A	
 	
 
	 27((. I222.//5/I	 ' 
r   c                 V   [         R                  R                  R                  (       a  [	        S5        g S n [
        R                  " 5       (       a/  [
        R                  " 5       (       a  [
        R                  " 5       n [         R                  R                  R                  n[         R                  R                  R                  =nb+  UR                  S5      (       a  [        S5      eU SU  SU 3$ [         R                  R                  5       =nb  Uu  pESU SU SU  SU 3$ g )NzHdynamo_pgo force disabled by torch._inductor.config.force_disable_cacheszmast:ztorch.compiler.config.job_id with prefix 'mast:' is reserved for automatically generated job id associated with a specific MAST job name and version.:)rp   	_inductorconfigforce_disable_cachesr   distis_availableis_initializedget_rankcompilercache_key_tagjob_id
startswithr   _utils_internalget_mast_job_name_version)ranktagrname_versionmast_job_namemast_job_versions         r   get_cache_keyr     s   22V	
  Dt2244}}
..


-
-C ^^"")))6<<  -$ 
 AdV1SE""--GGIIV*6'}oQ'7&8$qFFr   c                    [         R                  R                  R                  (       d  [        R                  S5        g SSKJn  [        R                  R                  U" 5       SSU  S35      $ )Nz'automatic_dynamic_local_pgo not enabledr   )	cache_dirdynamocode_state_z.pkl)rp   _dynamor   automatic_dynamic_local_pgor   r   %torch._inductor.runtime.runtime_utilsr   ospathrg   )	cache_keyr   s     r   code_state_pathr     sJ    ==;;		;<?77<<	XYKt/LMMr   c                    [         R                  R                  R                  (       a  g[         R                  R                  R
                  =n b  U $ [        5       (       d  g[         R                  R                  5       (       a  g SSK	J
n  U[         R                  R                  S5      :  $ ! [         a     gf = f)NFr   )REMOTE_CACHE_VERSIONz'pytorch/remote_cache:dynamo_pgo_version)rp   r   r   r   r   automatic_dynamic_remote_pgor   r   is_fb_unit_testtorch._inductor.fb.remote_cacher   ModuleNotFoundErrorjustknobs_getval_int)r   r   s     r   "should_use_remote_dynamo_pgo_cacher     s    22]]!!>>>K;;,,..H  5#8#8#M#M1$    s   	B1 1
B>=B>c                 T    SSK Jn   [        5       (       d  g U " S[        5       SS5      $ )Nr   create_cachez
dynamo-pgoFbRemoteDynamoPGOCacheRemoteDynamoPGOCache)torch._inductor.remote_cacher   r   r   r   s    r   get_remote_cacher    s,    9-// 	 r   c                N    SR                  S U R                  5        5       5      $ )N
c              3     #    U  Ha  u  pUR                    S UR                   S UR                   S3SR                  S UR                  R                  5        5       5      -   v   Mc     g7f)r   z:
r  c              3  R   #    U  H  u  pS U SUR                  5        3v   M     g7f)z  z: N)rm   )rc   srcfss      r   rd   .render_code_state.<locals>.<genexpr>.<genexpr>  s)      
5P'#bR		}%5Ps   %'N)r%   r'   r(   rg   r<   items)rc   kvs      r   rd   $render_code_state.<locals>.<genexpr>  si      
 DA	 ::,aaxs3
)) 
565H5H5N5N5P
 
	
 s   A)A+)rg   r  )css    r   render_code_stater    s(    99 
 HHJ  r   c            	     ^  ^	 [         b  [         $ [        5       n [        [        5      q [	        5       nUc  [         $ SU	4S jjn[        U5      m	T	b  [        R                  R                  T	5      (       aw  [        S=nSS9   U R                  X1S9  [        T	S5       n [        R                  " U5      q U R                  X4R                  5       S9  U" S5      sS S S 5        sS S S 5        $ [%        5       nUb  [        S=nSS9   U R                  X1S9   UR'                  U5      nUb   [)        U[*        5      (       d   eUS   n[)        U[,        5      (       d   e[.        R0                  " U5      nU R                  U[3        U5      S9  [        R4                  " U5      q U" S5      sS S S 5        $ [         R7                  SU5         S S S 5        [         R7                  S5        [         c   e[         $ ! [         a    [         R#                  S	T	SS
9   Of = f S S S 5        O! , (       d  f       O= fS S S 5        GMV  ! , (       d  f       GNe= f! [         a    [         R#                  SUSS
9   Nf = f! [         a    [         R#                  SUSS
9   Nf = f! , (       d  f       N= f)Nc                   > [        [        [        5      (       d   e[        R	                  STU [        [        5      5        [        SU  S3SS 5        [        R                  " [        5      q	[        $ )Nz$get_code_state %s hit %s, %d entriesget__code_statestringc                      [        [        5      $ r*   r  r@   r   r   r   r9   -get_code_state.<locals>.hit.<locals>.<lambda>0  
    %k2r   )
r\   r@   r   r   r   r   r   r   deepcopyr?   )tyr   s    r   hitget_code_state.<locals>.hit)  s_    +{33337r3{CST!2$k"2	

  ==5r   zpgo.get_local_code_stateTlog_pt2_compile_eventr   rbcache_size_byteslocalz&get_code_state failed while reading %s)exc_infozpgo.get_remote_code_statedataremotez1get_code_state failed parsing remote result on %sz get_code_state remote miss on %sz'get_code_state failed remote read on %szget_code_state using default)r  r$   r1   DefaultDict[CodeId, CodeState])r@   r   r   r5   r   r   r   r   existsr   add_event_dataopenpickleloadtell	Exceptionr   warningr  getr\   dictr$   base64	b64decoder   loadsr   )
chromium_logr   r  r(   fremote_cache
cache_datar'  payloadr   s
            @r   r   r     s   ,.L i(KI
 9%DBGGNN400..Dd
 '''B dD!Q("(++a.K //vvx/P w< "!
 
$ $%L//Dt
 '''BL)--i8
 )-)*d;;;;)&1)$4444"("2"24"8$33D3w<3X&,ll7&;  #8}7
 
: HH?K;
> HH+,"""Y ! KK@$QU    "!!
 
 
 
P % O%%) $   =ySW  
 
s   IH&3G7H&	IJI9'J+A8I#J4J7HH&HH&	I&
H4	0I
II63J5I66J9JJJJ
J,c                     [         c  [        R                  S5        g [         [        :X  a  [        R                  S5        g [	        5       n U c  [        R                  S5        g [        U 5        [        U 5        g )Nz1put_code_state: never initialized, will not writez#put_code_state: no change, skippingz&put_code_state: no cache key, skipping)r@   r   r   r?   r   put_local_code_stateput_remote_code_stater!  s    r   put_code_stater?  q  s^    DE&&67I9:#)$r   c           	        [        S=nSS9   [        5       nUR                  XS9  [        c   e[	        U 5      nUc  [
        R                  S5         S S S 5        g US-   nUS-   nSS	KJn  [        R                  " [        R                  R                  U5      SS
9  U" U[        S9   [        US5       n[        R                   " [        U5        UR                  XR#                  5       S9  S S S 5        [        R$                  " XC5        [
        R                  SU['        [        5      5        [)        SSS 5        S S S 5        S S S 5        g ! , (       d  f       Ng= f! , (       d  f       N(= f! , (       d  f       g = f)Nzpgo.put_local_code_stateTr  r!  z$put_code_state: local cache disabledz.tmpz.lockr   )FileLock)exist_ok)timeoutwbr#  z*put_code_state: wrote local %s, %d entriesr=  r  c                      [        [        5      $ r*   r  r   r   r   r9   &put_local_code_state.<locals>.<lambda>  s
    )+6r   )r   r   r+  r@   r   r   r   filelockrA  r   makedirsr   dirnameLOCK_TIMEOUTr,  r-  dumpr/  renamer   r   )r   r(   r7  r   tmp_path	lock_pathrA  r8  s           r   r=  r=    s7   	88dPT	U02##D#>&&&y)<HH;< 
V	U &=7N	 	&
BGGOOD)D9i6h%K+++D668+L & IIh%HH<dCDT &&6 7- 
V	U. &% 76- 
V	UsD   AE3AE3*E"79E0AE" E3
EE""
E0	,E33
Fc                &   [        S=nSS9   [        5       nUR                  XS9  [        c   e[	        5       nUc  [
        R                  S5         S S S 5        g [        R                  " [        5      nUR                  U[        U5      S9  S[        R                  " U5      R                  S5      0nUR                  X5        [
        R                  S	U [        [        5      5        [        S
SS 5        S S S 5        g ! , (       d  f       g = f)Nzpgo.put_remote_code_stateTr  r!  z%put_code_state: remote cache disabledr#  r'  asciiz+put_code_state: wrote remote %s, %d entriesr>  r  c                      [        [        5      $ r*   r  r   r   r   r9   'put_remote_code_state.<locals>.<lambda>  r  r   )r   r   r+  r@   r  r   r   r-  dumpsr   r4  	b64encodedecodeputr   )r   r(   r7  r9  contentr:  s         r   r>  r>    s    	99dQU	V02##D#>&&&')HH<= 
W	V ,,{+##D3w<#HF$$W-44W="

 	/99c+FV	
 	"#2	
+ 
W	V	Vs   ADBD
Dc                     S q S qg r*   )r@   r?   r   r   r   reset_code_staterY    s    Kr   )
r   r   r(   r$   r   r8   r   r   r1   r8   )r1   Optional[str])r   r$   r1   rZ  )r1   r   )r1   z!Optional[RemoteCache[JsonDataTy]])r  r)  r1   r$   )r1   r)  r   )r   r$   r1   r   )K
__future__r   r4  r   r=   enumloggingr   r-  r   collectionsr   typingr   r   r   r   r	   r
   typing_extensionsr   torch._dynamo.configrp   torch._utils_internaltorch.compiler.configtorch.distributeddistributedr   torch._dynamo.utilsr   r   r   torch._environmentr   torch._logging._internalr   typestorch._dynamo.symbolic_convertr   r  r   r   
ValueErrorr   	getLoggerr   r   rJ  	dataclassr"   r5   r?   r2   r@   rB   rF   EnumrH   rK   r[   rN   rZ   r8   r   r   r   r   r   r  r  r   r?  r=  r>  rY  r   r   r   <module>ro     s   "      	   # N N "      R R ( > DD	* 	 !j d#K K $K    >B : A8<5 < d#  $( T]		  __
$))     J J Jd (-``
` `
 !%` `P (-++
+ +
 !%+ +\FN.Sl%$#L
<r   