
    kjZf              )          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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 d dlmZ d dlmZ d dlmZ d ej                         v xs d ej                         v Zd Zd}dZdZ	 	 	 d~deeedez  ej@                  z  f      dedede!de"ejF                     f
dZ$dededeee!ejJ                  f   fdZ&ejN                  jP                  rdZ)dZ*dZ+dZ,d Z-d!Z.d"Z/d#Z0nd$Z)d%Z*d&Z+d'Z,d(Z-d)Z.d*Z/d%Z0d+d,d-d.d/d0d1d2d3Z1d4d5d6d7d8d9Z2d:d;d<d=d>Z3 G d? d@e jh                        Z5dedAe!defdBZ6dedAe!defdCZ7dDedefdEZ8 G dF dGej@                        Z9ddHZ:dI Z;dJefdKZ<defdLZ=dMedeeef   fdNZ>dOe?deeef   fdPZ@dQe!deeef   fdRZAdSeBdTeBdUe?fdVZCdWeBdXefdYZD edZ[      d\e5dSeBdXed]eBd^ed_ed`edaedbedcedde?deeBdTeBdfe!dz  dgedz  dhe!dz  diedz  dOe?dz  djedz  dej@                  f(dk       ZE edZ[      d\e5dSeBdXed]edz  d^ed_ed`edaedbedcedde?deeBdTeBdfe!dz  dgedz  dhe!dz  diedz  dOe?dz  djedz  dej@                  f(dl       ZF edZ[      d\e5dSeBdme?dXednedoe!dOe?dz  djedz  fdp       ZG edZ[      d\e5dSeBdTeBdXed]edz  dqedde?dredsedfedz  dte!duedz  djedOe?dz  fdv       ZHdwdxdydzej                  d\e5d{eBdSeBdej@                  f
d|ZJy)    N)Iterable)	lru_cache)get_sld)get_tld)dns)flow)DNSFlow)HTTPFlow)TCPFlow)UDPFlow)emoji)human	MicrosoftWindowsc                 &    t        | t              ryy)z)
    Is this input event a keypress?
    TN)
isinstancestr)ks    g/home/ubuntu/.cache/pipx/cdb5059130eadca/lib/python3.12/site-packages/mitmproxy/tools/console/common.pyis_keypressr      s     !S     c                     g }| j                  |d      }|d   r|j                  ||d   f       |j                  ||f       |d   r|j                  ||d   f       |S )N   r   )splitappend)textkeytextattrkeyattrlstpartss         r   highlight_keyr"   "   sd    
CJJsAEQx

HeAh'(JJ~Qx

HeAh'(Jr      entries
key_formatvalue_formatindentreturnc                    t        d | D        d      }t        |t              }|dkD  r|dz  }g }| D ]  \  }}|t        j                  d      }n2t        |t        j                        st        j                  ||fg      }|j                  t        j                  d|t        j                  d      fd|t        j                  ||fg      f|gd              |S )a  
    Format a list of (key, value) tuples.

    Args:
        entries: The list to format. keys must be strings, values can also be None or urwid widgets.
            The latter makes it possible to use the result of format_keyvals() as a value.
        key_format: The display attribute for the key.
        value_format: The display attribute for the value.
        indent: Additional indent to apply.
    c              3   >   K   | ]  \  }}|	t        |        y wN)len).0r   vs      r   	<genexpr>z!format_keyvals.<locals>.<genexpr>@   s     C$!QQ]s1vCs   
r   )default    fixeddividechars)	maxminKEY_MAXurwidTextr   Widgetr   Columns)r$   r%   r&   r'   max_key_lenretr   r.   s           r   format_keyvalsr?   0   s      C'CQOKk7+Kz!
C 
19

2AAu||,

\1-./A

MMfejjn5k5::
A6G+HI
 		

 Jr   sattrc                 `    t        |       } dt        |       t        j                  || fg      fS )Nr3   )r   r,   r9   r:   )r@   rA   s     r   fcolrC   Y   s+    AASVUZZ$455r   u   ↺u   ←u   ●u   ⇧u   ⇩u   …u   ⇒u   ⇐z[r]z<-#^ ~z->scheme_httpscheme_https	scheme_ws
scheme_wss
scheme_tcp
scheme_udp
scheme_dnsscheme_quic)httphttpswswsstcpudpr   quic
method_getmethod_postmethod_deletemethod_head
method_put)GETPOSTDELETEHEADPUTcode_200code_300code_400code_500)r1            c                       e Zd ZdZ	 dZ	 dZy)
RenderModer   r1   re   N)__name__
__module____qualname__TABLELIST
DETAILVIEW r   r   ri   ri      s    E?DPJ+r   ri   maxlenc                 x    t        |       |k  r| j                  |      S | d|t        t              z
   t        z   S Nr   )r,   ljustSYMBOL_ELLIPSISr@   rq   s     r   fixlenrw      s8    
1vwwvVc/223oEEr   c                     t        |       |k  r| j                  |      S t        | t        |       |z
  t        t              z   d  z   S r+   )r,   rjustru   rv   s     r   fixlen_rrz      sA    
1vwwv3q6F?S5I#I#K!LLLr   markerc                 T    t         j                   j                  | t              }|d   S rs   )r   getSYMBOL_MARK)r{   rendereds     r   render_markerr      s"    {{v{3H A;r   c                   8     e Zd Zd fd	ZddZddZddZ xZS )TruncatedTextc                 L    || _         || _        || _        t        |           y r+   )r   rA   alignsuper__init__)selfr   rA   r   	__class__s       r   r   zTruncatedText.__init__   s#    		
r   c                 0    t        | j                        dfS Nr   )r,   r   r   sizefocuss      r   packzTruncatedText.pack   s    DII""r   c                      yr   rp   r   s      r   rowszTruncatedText.rows   s    r   c                    | j                   }| j                  }| j                  dk(  r|d d d   }|d d d   }t        j                  |dt        |            }|t        |      dkD  r|d   }n|}||k\  r ||z
  }|dkD  r|d|z  z   }|d|fgz   }	n|}|}	nt        j                  j                  |d|dz
  d|dz
        }
|d|
d    }|
d   dk(  r|dz  }|t        z   }t        j                  j                  |dt        |j                                     dt        t        j                               fgz   }	| j                  dk(  r|d d d   }|	d d d   }	t        j                  |j                         g|	g|	      S )
Nrightr   rF   r   r   re   r   )maxcol)r   rA   r   r9   
calc_widthr,   utilcalc_trim_textru   
rle_subsegencode
TextCanvas)r   r   r   r   rA   text_lenwidth	remainingc_textc_attrtrimvisible_texts               r   renderzTruncatedText.render   s   yyyy:: ":D":D##D!SY7D	AGEEH(I1}i/&)!4 55::,,T1eaiEAINDDG,LAw!|#!O3FZZ**4C8K8K8M4NO#o44678S F :: DbD\FDbD\F 1F8EJJr   left)F)rj   rk   rl   r   r   r   r   __classcell__)r   s   @r   r   r      s    ##Kr   r   c                 P    t        | |t        | j                               fg|      S r+   )r   r,   r   )r   rA   r   s      r   truncated_plainr      s$    s4;;='9 :;UCCr   c                 d    |\  }}| s	||fg| dd y| d   \  }}||k(  r|||z   f| d<   y||fg| dd y)z
    Append (a, r) (unpacked from *a_r*) to BEGINNING of rle.
    Merge with first run when possible

    MODIFIES rle parameter contents. Returns None.
    Nr   rp   )rlea_raralruns         r   rle_append_beginning_modifyr      sU     DAqa&Aa&C7q\CFAxC!Hr   hostc           	      Z   | sg S t        |       }t        |       }g }t        |      }t        |      |z
  }t        t	        t        |                   D ]U  }| |   }|dkD  rd}|dz  }n|dk(  rd}|dz  }n|dkD  r|dz  }d}nd}t        ||t        |j                               f       W |S )Nr   
url_domainr   r   url_extension)r   r   r,   reversedranger   r   )	r   tldsldrA   tld_sizesld_sizeletter	characterstyles	            r   colorize_hostr      s    	
$-C
$-CD3xH3x("H5T+, LL	a< EMH]EMH\MH#EE#D5#i6F6F6H2I*JKL Kr   c           	         | j                  dd      d   }t        |      }|j                  d      }||dz   d  j                  d      }|dk\  r||z   n
t        |       }d}g }t        t        |             D ]  }| |   }||k  r|dk(  s||k  r
||kD  r|dk(  s||k(  rd}	n3||kD  r|r|d	k(  rd}d}	n"d
}	n|dk(  rd}d}	nd}	n||kD  rd}	n
||kD  rd}	nd}	t        j
                  j                  ||	t        |j                               f        |S )N?r1   r   /r   .Furl_punctuation&url_query_value=Turl_query_keyr   url_filenamer   )r   r,   rfindr   r9   r   rle_append_modifyr   )
r@   pathi_queryi_last_slashi_extin_valrA   icr   s
             r   colorize_reqr     s6   773?1D$iG::c?L!#$**3/E$)QJL5 CFEFD3q6] AaD[Q#XGL 0Q#XW!A[8"F)A)A8!F)A'AYAAA

$$TAs188:+?@7A8 Kr   content_typec                    | j                  d      d   } | j                  d      rd}| |fS | j                  d      rd}| |fS | j                  d      s&| j                  d      s| j                  d	      sd
| v rd}| |fS | j                  d      s| j                  d      rd}| |fS | j                  d      rd}| |fS d}| |fS )N;r   z/javascriptcontent_scriptztext/content_textzimage/zvideo/zfont/z/x-font-content_mediaz/jsonz/xmlcontent_datazapplication/content_rawcontent_other)r   endswith
startswith)r   r   s     r   format_http_content_typer   9  s   %%c*1-L]+    
	 	 	)  	)""8,""7+%  
		w	'<+@+@+H
 	 
	 	 	0   r   durationc                     t        j                  |       }dt        ddt        t	        j
                  t        dd| z              dz  d      z  z
        z  }||fS )Ngradient_%02dc   d         ?i     Gz?)r   pretty_durationintr7   mathlog2r6   )r   r   r   s      r   format_durationr   O  s]    ++H5Oc
S3tyyS$/!:;b@$GGG E E!!r   	num_bytesc                     t        j                  |       }dt        ddt        t	        j
                  d| z         dz  d      z  z
        z  }||fS )Nr   r   r   r      r   )r   pretty_sizer   r7   r   r   )r   r   r   s      r   format_sizer   W  sP    ##I.Kc"sS1y=1IB1NPT-U'U"UVVEr   focusedintercepted	timestampc                    g }| r|j                  d       n|j                  d       t        j                  |      dd  }|r|j                  d|f       n|j                  d|f       ddt        j                  |      fS )N)r   >>  i	interceptr   r3   
   )r   r   format_timestampr9   r:   )r   r   r   
indicatorspretty_timestamps        r   format_left_indicatorsr   ]  s    .0J/*$--i8=;(89:6#345B

:...r   replaymarkedc                     g }| r|j                  dt        f       n|j                  d       t        |      r|j                  dt        |      f       n|j                  d       ddt	        j
                  |      fS )Nr   rF   markr   r3   re   )r   SYMBOL_REPLAYboolr   r9   r:   )r   r   r   s      r   format_right_indicatorsr  k  sp    
 /1J8]34#F|6=#89:$Auzz*---r   i   )maxsizerender_mode	is_replayrequest_methodrequest_schemerequest_hostrequest_pathrequest_urlrequest_http_versionrequest_timestamprequest_is_push_promiseresponse_coderesponse_reasonresponse_content_lengthresponse_content_typeerror_messagec                    g }| t         j                  u r/|j                  t        t	        j
                  |
      d             n9|r|j                  t        dd             n|j                  t        dd             t        j                  |d      }|j                  t        ||             |r|j                  t        dd             t        d |D              t        |      z   d	z
  }|	d
vr|d|	z   z  }|r|sd}n	|s|rd}nd}| t         j                  u r(|j                  t        j                  ||fg             n|j                  t        ||             |j                  t        ||             d|t        j                  d      fg}|r3|rd}nd}|xs t        j                  |dz  d      }|j                  t        t        |             |j                  t        t!        |      |             |r-| t         j                  u r|j                  t        ||             |r-t#        |      \  }}|j                  t        ||xs |             |rt%        |      \  }}n|dk(  rd}d}nd}d}|j                  t        ||xs |             |rvt'        |      \  }}|j                  t        ||xs |             nH|rF|j                  t        t        d             |j                  t        j                  d|fg             t        j(                  t        j*                  |d	      t        j*                  |d	      g      S )N	highlightr   r   r   method_otherPUSH_PROMISEmethod_http2_pushc              3   &   K   | ]	  }|d      yw)r   Nrp   r-   xs     r   r/   z(format_http_flow_list.<locals>.<genexpr>  s     )qt)s   r   )zHTTP/1.0zHTTP/1.1rF   r   r   titler   r   r3   r2   r   
code_otherr   [no content][content missing]errorr4   )ri   ro   r   rC   r   r   HTTP_REQUEST_METHOD_STYLESr}   sumr,   r9   r:   r   r  HTTP_RESPONSE_CODE_STYLESYMBOL_RETURNr   r   r   r   Piler<   ) r  r   r   r  r  r  r  r	  r
  r  r  r  r   r  r  r  r  r   r  reqmethod_stylepreamble_len	url_stylerespr   status_stylectct_styler   
size_styledur	dur_styles                                    r   format_http_flow_listr1  |  s   . Cj+++

4../@A;OPJJtD'*+JJtD'*+-11..QLJJtNL12

4(;<=)S))CH4q8L#;;s111=		-		j+++

5::	;789:

?;	:;JJ&iGHlEJJrN34DEE 
 8 < <S ,!
 	D56D]+\:;{j.C.CCKK_l;< 34IJLBKKR!2(34"*+BCD*$)!DJ&DJDu2
34,X6NCKKS%"4956	D01EJJ- 89:;::	s	*EMM$A,NO r   c           
      d   t        |||
      g}|r|sd}nd}|xs t        j                  |d      }|j                  t	        t        |j                         d      |             |rd}n|xs t        j                  |d      }|j                  t	        t        |d      |             |j                  d	d
t        |t        |      d      f       |j                  d	dt        |t        |      d      f       |r|rd}nd}|rWt        |      }|xs t        j                  |dz  d      }|r|rt        |      \  }}|xs |}n)|rd}d}n"|dk(  rd}d}nd}d}n|r	d}d}|}d}nd}d}d}d}|j                  t	        t        |d      |             |j                  d	dt        ||d      f       |r8t        |      \  }}|j                  t	        t!        |d      |xs |             n'|j                  ddt#        j$                  d      f       |r8t'        |      \  }}|j                  t	        t!        |d      |xs |             n'|j                  ddt#        j$                  d      f       |j                  t)        t+        |      |             t#        j,                  |dd      S )Nr   r   r   r   r2   scheme_otherrg   r  r  rf   weightg      ?r   r   r   r   r  content_noner   r  r  errr   r   re   g333333?r3   r  r      r5   	min_width)r   SCHEME_STYLESr}   r   rC   rw   upperr!  r   r   r   r   r#  r   r   r   rz   r9   r:   r   r  r  r<   ) r  r   r   r  r  r  r  r	  r
  r  r  r  r   r  r  r  r  r   r  itemsrequest_stylescheme_styler'  response_stylestatusr+  contentcontent_styler   r.  duration_prettyduration_styles                                    r   format_http_flow_tablerF    s   0 	@Q	
E =# UM$5$5nn$UL	LLf^113Q7FG*$ 
(B(F(FN)
 
LLf^Q/>?	LL,l(CWM	
 
LL	3lL4NPVWX }$]#% 
)A)E)ES ,*
 #'<%=>S%T"G]*;mM$G*M$)$G*M)G*M	 	LLfVQ'67	LL(D/'='"RST&'>?jT(4+^-IzJKgq%**R.12*9(*C'/1-~/OP	
 	gq%**R.12	LL	?	
 ==A<<r   timestamp_startprotocol
total_sizec        
   	         t        j                  |       dt        j                  |       }
g }| t        j                  t        j                  fv r|j                  t        |d|             n9|r|j                  t        dd             n|j                  t        dd             | t        j                  u r;|j                  t        t        |j                         d      t        |                n0|j                  t        |j                         t        |                |j                  dd	t        |
d
d      f       |	r|j                  dd	t        |	dd      f       |r4t        |      \  }}|j                  t        t        |d      |             n'|j                  ddt        j                  d      f       |r4t!        |      \  }}|j                  t        t        |d      |             n'|j                  ddt        j                  d      f       |j                  t#        d|             t        j$                  t        j&                  |dd      g      S )Nz <-> Fr3  r   r   r   rg   r5  r   r   r   r   r3   r2   r  r   r8  r9  )r   format_addressri   rm   ro   r   r   rC   rw   r<  r;  r   r   rz   r9   r:   r   r  r%  r<   )r  r   rG  r   rH  client_addressserver_addressrI  r   r  connr=  r   r.  rD  rE  s                   r   format_message_flowrO  T  s    "">2359M9Mn9]8^_DEz'')>)>??"Uo	
 LLdG,-LLdG,-j&&&T&!115}X7NOPT(..*M(,CDE	LL(Cvv!FGHh_]GV%TUV&z2jT(4+Z89gq%**R.12*9(*C'T(?A6GHgq%**R.12	LL(fEF::u}}URHIJJr   op_codedomaintyperesponse_code_http_equivanswerc           
      h   g }| t         j                  t         j                  fv r|j                  t	        |||             n|j                  t        |rdndd             |rdnt        d   }d| }| t         j                  u rt        |d      }|j                  t        ||             |j                  d	d
t        |t        |      d      f       |j                  t        dt        |d      d t        |       z   dz   d             |j                  d	d|t        |dn|sdn|d      nt        |d      f       |rdnt        j                  |
dz  d      }|j                  t        t        |	dn|	d      |             |r4t        |      \  }}|j                  t        t        |d      |             n'|j                  ddt!        j"                  d      f       |j                  t%        t'        |      |             t!        j(                  t!        j*                  |dd      g      S )Nr3  r   r   r   r   r   zDNS r   r5  g      ?r   (rg   z) =r   r   z...r   r   r   r  r2   	   r3   r  r8  r9  )ri   rm   ro   r   r   rC   r;  rw   r   r   r,   r   r#  r}   r   rz   r9   r:   r  r  r%  r<   )r  r   r   r   r  rP  r  rQ  rR  r  rS  rT  r  r   r=  r?  tr+  rD  rE  s                       r   format_dns_flowrY    s   $ Ez'')>)>??"[DU	
 	T'$tW=>$/=]55IL
wiAj&&&1bM	LLa&'	LL(Cv}V7Lg!VWX	LLcF4OKc$i885@&IJ	LL
 !(  #^EFPV %]G<
	
  	%))*Bc*I<X 
 
LLV-/B]AFU *9(*C'T(?A6GHgq%**R.12	LL	?	
 ::u}}URHIJJr   FT)
hostheaderr   frZ  c                   | j                   r| j                   j                  }nd}t        | t        t        f      rd}| j
                  D ]  }|t        |j                        z  } | j
                  r1| j
                  d   j                  | j                  j                  z
  }nd}| j                  j                  dk(  rd}n| j                  }t        ||| j                  j                  | j                  || j                  j                  | j                   j"                  |||
      S t        | t$              r| j&                  j                  rP| j(                  rD| j(                  j                  r.| j(                  j                  | j&                  j                  z
  }nd}| j(                  rt*        j,                  j/                  | j(                  j0                        }	t*        j,                  j3                  | j(                  j0                        }
dj5                  d | j(                  j6                  D              }nd}	d}
d}t9        ||| j:                  | j                  | j<                  t*        j>                  j/                  | j&                  j@                        | j&                  j                  | j&                  jB                  r#| j&                  jB                  d   jD                  nd	| j&                  jB                  r@t*        jF                  j/                  | j&                  jB                  d   j                        nd	|	|
|||
      S t        | tH              rd| j:                  }| j(                  r| j(                  jJ                   t        | j(                  jJ                        }nd}| j(                  jL                  }| j(                  jN                  }| j(                  jP                  jS                  d      }| j(                  jT                  r9tW        | j(                  jT                  | j&                  j                  z
  dg      }nd}n
d}d}d}d}d}| j&                  jX                  }| jZ                  |dk(  rd}n|dk(  rd}|t\        j^                  t\        j`                  fv rtb        }ntd        } |d$i d|d|d| j                  d| j<                  d| j&                  jf                  d|d|r| j&                  jh                  n| j&                  jj                  d| j&                  jl                  d|r| j&                  jn                  n| j&                  jp                  d| j&                  jr                  d| j&                  j                  dd| jt                  v d|d|d|d |d!|d"|d#|S tw               )%a  
    This functions calls the proper renderer depending on the flow type.
    We also want to cache the renderer output, so we extract all attributes
    relevant for display and call the render with only that. This assures that rows
    are updated if the flow is changed.
    Nr   r   QUICv1rV   )
r  r   rG  r   rH  rL  rM  rI  r   r  z, c              3   2   K   | ]  }t        |        y wr+   )r   r  s     r   r/   zformat_flow.<locals>.<genexpr>  s     B!s1vBs   r2   )r  r   r   r   r  rP  r  rQ  rR  r  rS  rT  r  r   zcontent-typerQ   rS   rP   rR   r  r   r   r  r  r  r  r	  r
  r  r  r  zh2-pushed-streamr   r  r  r  r  r   r  rp   )<r   msgr   r   r   messagesr,   rB  r   client_connrG  tls_versionrR  rO  r   peernameserver_connaddressr	   requestresponser   response_codesto_strr  http_equiv_status_codejoinanswersrY  r   r  op_codesrP  	questionsnametypesr
   raw_contentstatus_codereasonheadersr}   timestamp_endr6   scheme	websocketri   rn   ro   r1  rF  methodpretty_hostr   r   
pretty_urlurlhttp_versionmetadataNotImplementedError)r[  r  rZ  r   r  rI  messager   rH  response_code_strrS  rT  r   r  r  r  r  rv  render_funcs                      r   format_flowr    s    	ww!gw'(
zz 	/G#goo..J	/::zz"~//!--2O2OOHH==$$0HvvH"#MM9988==11==00!'
 	
 
Aw	991::!**2F2Fzz++aii.A.AAHH::,/,>,>,E,E

((- (+'9'9'P'P

((($ YYBqzz/A/ABBF $'($F#88kkLL''		(9(9:ii1123))2E2E199&&q)..2yy"" !!!))"5"5a"8"="=>+%='!
 	
$ 
Ax	 mm::zz%%1*-ajj.D.D*E'*.'()

(>(>M*+***;*;O$%JJ$6$6$:$:>$J!zz''ZZ--		0I0II1M  &*# M"O$(!H!!;;" 6!:??J,A,ABB/K0K 
#

 88
 kk	

 99++
 "
 3=..!))..
 
 1;		,,		
 "#!7!7
  ii77
 %7!**$D
 $
 (
 ,
  %<!
" #8#
$ %
& ('
 	
. "##r   )r   r   )r   r   r   r   )Kenumr   platformcollections.abcr   	functoolsr   
urwid.utilr9   publicsuffix2r   r   	mitmproxyr   r   mitmproxy.dnsr	   mitmproxy.httpr
   mitmproxy.tcpr   mitmproxy.udpr   mitmproxy.utilsr   r   IS_WINDOWS_OR_WSLr   r"   r8   tupler   r;   r   listr<   r?   r:   rC   r   detected_encodingr   r$  r~   	SYMBOL_UPSYMBOL_DOWNru   SYMBOL_FROM_CLIENTSYMBOL_TO_CLIENTr;  r!  r#  Enumri   rw   rz   r   r   r   r   r   r   r   floatr   r   r  r   r  r1  rF  rO  rY  Flowr  rp   r   r   <module>r     s      $   ! !   ! # ! ! ! ! $8$$&&J)7Hx7H7H7J*J 
 
 	&eCell!::;<&& & 	&
 
%--&R6C 6s 6uS#uzz%9: 6
 	::MMKIKO!MMKIKO 
	   	 , ,Fc F3 F3 FM MS MS M# # 0KELL 0KfD
 $ :$C $N3 5c? ,"e "c3h "3 5c? /t /$ /5 /.. ." 3^^ ^ 	^
 ^ ^ ^ ^ ^ ^ ^ ^ "^ ^ :^  4Z!^" !4Z#^$ :%^& dl'^( :)^* \\+^ ^B 3r=r= r= 	r=
 Tzr= r= r= r= r= r= r= r= "r= r= :r=  4Z!r=" !4Z#r=$ :%r=& dl'r=( :)r=* \\+r= r=j 34K4K 4K 	4K
 4K 4K 4K dl4K :4K 4Kn 3FKFK FK 	FK
 FK TzFK FK FK FK FK :FK "FK $JFK FK dlFK FKZ I$yyI$ I$ 	I$
 I$ \\I$r   