o
    Żhv  ć                   @   s,  d dl Z ddlmZmZ ddlT ddlT ddlmZmZm	Z	m
Z
mZ ddlmZmZmZ dd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Z d*d+ Z!d,d- Z"d.d/ Z#d0d1 Z$d2d3 Z%d4d5 Z&d6d7 Z'd8d9 Z(d:d; Z)dS )<é    Né   )ŚLocalProtocolErrorŚRemoteProtocolError)Ś*)Ś_keep_aliveŚ_body_framingŚ
ConnectionŚ	NEED_DATAŚPAUSEDé   )ŚConnectionPairŚget_all_eventsŚreceive_and_getc                   C   s¾   t tdddgdsJ t tddddgdrJ t tddddgdr&J t tddg ddr2J t td	g d
s<J t td	dgd
rGJ t td	dgd
rRJ t td	g ddr]J d S )NŚGETś/)ŚHostzExample.com©ŚmethodŚtargetŚheaders©r   Śclose)r   za, b, cLOse, fooś1.0©r   r   r   Śhttp_versionéČ   ©Śstatus_coder   ©r   r   r   )r   ŚRequestŚResponse© r!   r!   śa/var/www/html/magazine_api/magazine_env/lib/python3.10/site-packages/h11/tests/test_connection.pyŚtest__keep_alive   s@   ’’’’’’’
’’’’’r#   c                     sX  dd  d fdd	} d fdd	}i d	d
iddid
ddfD ].}d| di |¤fd| dddi|¤fd| dddi|¤ffD ]\}}t ||dksLJ q?qddid
ddfD ]"}d |di |¤fd| di |¤ffD ]\}}t ||dksxJ qkqWd |d
dfd| d
dffD ]\}}t ||dksJ qt d | dks J t d|  dksŖJ d S )Nc                 S   s0   g }| d ur|  dt| f” |r|  d” |S )NśContent-Length©zTransfer-EncodingŚchunked)ŚappendŚstr)ŚclŚter   r!   r!   r"   r   &   s   
z#test__body_framing.<locals>.headersr   Fc                    s   t |  ||dS )Nr   )r    )r   r)   r*   ©r   r!   r"   Śresp.   s   z test__body_framing.<locals>.respc                    s"    | |}|dg7 }t dd|dS )N©r   zexample.comr   r   r   )r   )r)   r*   Śhr+   r!   r"   Śreq1   s   

ztest__body_framing.<locals>.reqr)   éd   r*   T)r)   r*   ó   HEADó   GETr   éĢ   i0  )ścontent-length)r   )r&   r!   )r)   )r4   )r0   )zhttp/1.0r!   )r   NF)NFr!   )r   )r,   r/   ŚkwargsŚmethŚrr!   r+   r"   Śtest__body_framing%   s$   žż,’$r8   c                  C   s  t  t” td W d    n1 sw   Y  t } | jt jtu s&J | jt jt	u s0J | jt	 jt	u s:J | jt	 jtu sDJ |  
ttddddgd”}|dksWJ | jD ]}|jttt	tiksgJ qZ| jt jtu srJ | jt jtu s|J | jt	 jtu sJ | jt	 jtu sJ | jt jd u sJ | jt	 jdks¤J |  
t	td	g d
”}|dks“J |  
t	tddgd
”}|dksÅJ | jD ]}|jttt	tiksÕJ qČ| jt jdksąJ | jt	 jdksźJ |  
ttdd”}|dksłJ | j
ttddtddt gd}|dksJ | j
tt g d}|dks!J | jD ]}|jttt	tiks2J q$|  
t	tdd”}|dksDJ | j
t	tddtddt gd}|dks\J | j
t	t g d}|dkslJ | jD ]}|jttt	tiks}J qod S )NŚCLIENTr   r   r-   ©r$   Ś10r   s9   GET / HTTP/1.1
host: example.com
content-length: 10

ó   1.1r0   r   s   HTTP/1.1 100 

r   )r$   Z11s%   HTTP/1.1 200 
content-length: 11

ó   12345©Śdataó   67890©Śexpectó    ó
   1234567890ó   1)ŚpytestŚraisesŚ
ValueErrorr   r   Śconnr9   Śour_roleZ
their_roleŚSERVERŚsendr   ŚconnsŚstatesŚ	SEND_BODYŚSEND_RESPONSEŚ	our_stateŚtheir_stateZtheir_http_versionŚInformationalResponser    ŚDataŚEndOfMessageŚDONE©Śpr?   rI   r!   r!   r"   Ś)test_Connection_basics_and_content_lengthK   sz   
’’’’’

’’’
’
’
’rY   c                  C   s  t  } |  ttddddgd” |  ttdddd”}|d	ks!J |  ttd
ddd”}|dks2J | jttddg d}|dksCJ |  ttdgd”}|dksSJ |  ttddgd” |  ttdddd” |  ttdddd” |  tt ” | jD ]}|j	tt
tt
iksJ q~d S )Nr   r   r-   r%   r   rD   T©r?   Zchunk_startZ	chunk_ends   a
1234567890
s   abcdes
   5
abcde
rC   r>   rA   )ZhelloZtherer+   s   0
hello: there

r   r   s   54321r=   )r   rL   r9   r   rT   rU   rK   r    rM   rN   rV   rW   r!   r!   r"   Śtest_chunked   s>   ’’’’’’’
’r[   c                  C   s4  t td} d}|  |” |  ” tddddgdksJ |  ” tu s#J |  d” |  ” td	d
d
dks5J |  d” |  ” tdd
ddksGJ |  d” |  ” tddddksYJ |  d” |  ” tddd
dkskJ |  d” |  ” td	d
d
dks}J |  d” |  ” tksJ |  d” |  ” t ksJ d S )N©rJ   óB   POST / HTTP/1.1
Host: example.com
Transfer-Encoding: chunked

ŚPOSTr   r-   r%   r   s
   5
hello
s   helloTrZ   s   5
hels   helFó   ls   o
ó   os   5
helloó   
s   0

)r   rK   Śreceive_dataŚ
next_eventr   r	   rT   rU   )rI   Śrequestr!   r!   r"   Śtest_chunk_boundaries©   sD   
’
ż
’
’
’
’
’

re   c                  C   sĘ   t t} |  tdddgd” |  t ” | jtu sJ t| dtdg ddd	gks,J | jt	u s3J t| d
t
d
dgks@J t| dt
ddgksMJ t| dt t gksZJ | jtu saJ d S )Nr   r   r-   r   s   HTTP/1.0 200 OK

r   r   s   OK)r   r   r   Śreasonr=   r>   r@   rC   )r   r9   rL   r   rU   rQ   rV   r   r    Ś
MUST_CLOSErT   ŚConnectionClosedrR   ŚCLOSED©Ścr!   r!   r"   Ś$test_client_talking_to_http10_serverŁ   s   
’’rl   c                  C   s  t t} t| dtddg ddt gksJ | jtu sJ |  tdg d”dks*J |  t	d	d
”d	ks6J |  t ”dks@J | j
tu sGJ t t} t| dtdddgddt	dd
gks`J t| dt	dd
t gksoJ | jtu svJ t| dt gksJ d S )Nó   GET / HTTP/1.0

r   r   r   r   r   r   ó$   HTTP/1.1 200 
connection: close

r=   r>   rC   s(   POST / HTTP/1.0
Content-Length: 10

1r^   r:   rE   s	   234567890)r   rK   r   r   rU   rR   rg   rL   r    rT   rQ   rh   rj   r!   r!   r"   Ś$test_server_talking_to_http10_clientč   s>   ž
ü’’žżž’ro   c               	   C   s¤   dgg ddgfD ]G} t  }| ttdddgdt g” |jttd| dtddgdd	 tt}t|d
 | td| d”dksCJ | t	dd”dksOJ qd S )Nr%   ©r$   Ś100r   r   r-   r   r   r   rA   rm   rn   r=   r>   )
r   rL   r9   r   rU   rK   r    r   r   rT   )Zuser_headersrX   rk   r!   r!   r"   Ś,test_automatic_transfer_encoding_in_response
  s8   ’ü’ż’’ż
’ęrr   c                  C   s   t  } |  ttddddgdt g” | jD ]}|jt tu s!J q| jtt	dg dt gt	ddgdt gd	 | jD ]}|jttttiksIJ q<d S )
Nr   r   r-   r   r   r3   r   )Ś
connectionr   rA   )
r   rL   r9   r   rU   rM   rN   rg   rK   r    ©rX   rI   r!   r!   r"   Ś(test_automagic_connection_close_handling+  s2   ’’ż’

’’žū
’ru   c                  C   sŗ   dd } |  }|  ttdg d” |jD ]}|jrJ |jr J q|  }|  ttddgd” |jD ]}|jr9J |jr>J q2|  }|  ttdd” |jD ]}|jrUJ |jrZJ qNd S )	Nc                  S   sZ   t  } |  ttddg d¢d” | jD ]}|jsJ q| jt jr#J | jt js+J | S )Nr   r   )r-   rp   )ZExpectz100-continuer   )	r   rL   r9   r   rM   Ś"client_is_waiting_for_100_continuerI   Ś!they_are_waiting_for_100_continuerK   rt   r!   r!   r"   ŚsetupD  s   ’’
z test_100_continue.<locals>.setupr0   r   r   r%   r=   r>   )	rL   rK   rS   rM   rv   rw   r    r9   rT   ©rx   rX   rI   r!   r!   r"   Śtest_100_continueC  s.   
’

’’



žrz   c                  C   s6  t t} |  d” |  ” tu sJ t t” 	 |  d” |  ”  q1 s%w   Y  t tdd} |  d” |  d” |  d” t| t	d	d
ddgdt
 gksQJ t tdd} |  d” |  d” t t” |  ”  W d    n1 suw   Y  t tdd} |  d” |  ddd  ” t| t	d	d
ddgdtdd dt
 gks¦J t tdd} |  d” t| t	d	ddgdt
 gksĀJ |  d” |  tdg d” |  t
 ” |  ”  t| t	d	ddgdt
 gksėJ |  tdg d” |  t
 ” |  ”  t t” |  ”  W d    d S 1 sw   Y  d S )Ns   GET / HTTP/1.0
Endless: Ts   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaai  )Zmax_incomplete_event_sizes   GET / HTTP/1.0
Big: s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas   

r   r   r   )ŚbigA   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)r   r   r   r   i   s%   GET / HTTP/1.0
Content-Length: 10000ó   ai'  )r$   Z10000r>   r0   s   GET /1 HTTP/1.1
Host: a

GET /2 HTTP/1.1
Host: b

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXś/1)ŚhostŚar   sč  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr   r   ś/2)r~   Śb)r   rK   rb   rc   r	   rF   rG   r   r   r   rU   rT   rL   r    Śstart_next_cyclerj   r!   r!   r"   Ś-test_max_incomplete_event_size_countermeasurei  sn   

ž’


’
ż


’
’
ü

ž

ž
$’r   c                  C   s¤   t  } |  ttdddgdt g” |  ttdg dt g” | jD ]}|jtt	tt	iks/J | 
”  q"|  ttdddgdt g” |  ttd	g dt g” d S )
Nr   r   ©r   r   r   r   r   ŚDELETEś/fooé  )r   rL   r9   r   rU   rK   r    rM   rN   rV   r   rt   r!   r!   r"   Śtest_reuse_simple®  s0   ’’
’’

’’
’’r   c                  C   s$  t t} |  ” tu sJ |  d” t| tddddgdtddt gks'J | j	t
u s.J | jtu s5J |  ” tu s=J |  td	g d
” |  t ” | j	t
u sSJ | jt
u sZJ |  ”  t| tddddgdtddt gkstJ |  ” tu s|J |  td	g d
” |  t ” |  ”  t| tdddgdt gks J |  ” tu sØJ |  td	g d
” |  t ” |  ” tu sæJ |  d” |  ” tu sĢJ | jdksÓJ |  d” | jdksßJ |  ” tu sēJ |  d” |  ” tu sōJ t t” |  d” W d    d S 1 sw   Y  d S )Ns   GET /1 HTTP/1.1
Host: a.com
Content-Length: 5

12345GET /2 HTTP/1.1
Host: a.com
Content-Length: 5

67890GET /3 HTTP/1.1
Host: a.com

r   r}   )r   śa.com)r$   Ś5r   r=   r>   r   r   r   r@   z/3ó   SADF)r   FrC   )r   Ts   FDSA)r   rK   rc   r	   rb   r   r   rT   rU   rR   rV   rQ   rP   r
   rL   r    r   Śtrailing_datarF   rG   ŚRuntimeErrorrj   r!   r!   r"   Śtest_pipeliningĮ  sh   ’’
ü’
ü’
ż


$’r   c               	      s^  t ddddgdtdg dtdg dft d	d
g d¢dtdg dtddgdft ddg d¢dtdg dtdg dft ddg d¢dtdg dtddgdffD ][\ } } fdd}| }| t| ” |jD ]}|jtttt	iksuJ qh| tt
 ” |jD ]}| ”  q| }| t|” |jD ].}|jttttiks J | d” | ” tu s­J | d” | ” tu sŗJ |jdksĮJ q| }|jt }| d” | ” tu s×J |jdksŽJ | | ” | ” tu sėJ | t
 ” | ”  t|t d	d
g ddt
 gksJ | }|jt }| d” | ” tu sJ |jdks%J | t|” | ” tu s4J | }|jt }| d”g k | ” tu sLJ | | ” | ” t ks[J | }t t” |jt  t d	d
dgd” W d    n	1 s}w   Y  | }| t|” t t” |jt  tdd” W d    n	1 s§w   Y  qPd S )NZCONNECTzexample.com:443©r   Zfoo©r$   Ś1r   r   r   r   r   r   )r   r   )ŚUpgradeza, bée   )r   r   )r   r   c                     s   t  } |  t ” | jD ]}|jt tu sJ q|  ttddt g” | jD ]}|jt tu s2J q'| j	t
  ” tu s>J | S )NrE   r>   )r   rL   r9   rM   rN   rO   rT   rU   ZMIGHT_SWITCH_PROTOCOLrI   rK   rc   r
   rt   ©r/   r!   r"   rx   #  s   

z#test_protocol_switch.<locals>.setupó   123s   456)s   123456Frm   )rm   Fr   r   rC   )rC   Tr   r>   )r   r    rS   rL   rK   rM   rN   r9   rV   rO   rU   r   ZSWITCHED_PROTOCOLrb   rc   r
   r   rI   r   rh   rF   rG   r   rT   )ZdenyŚacceptrx   rX   rI   Śscr!   r   r"   Śtest_protocol_switch  s®   ’

ż’
’ū’

ś’
’śź 




’




ž




’’’r   c               	      sT  t tftt ffD ]\  fdd} |  }|j  ” t ks"J |j  ” t ks.J |j  d” |j  ” t ksBJ |  }| t ” |jD ]}|jt	u sXJ |j
t	u s_J qO|  }t t” |j  d” W d    n1 s{w   Y  |  }|j   d” t t” |j   ”  W d    n1 s¢w   Y  qd S )Nc                     s:   t  } |   t ” | jD ]}|j ttiksJ q| S ©N)r   rL   rh   rM   rN   ri   rg   rt   ©Zwho_shot_firstZwho_shot_secondr!   r"   rx   }  s   
žz test_close_simple.<locals>.setuprC   r   r2   )r9   rK   rI   rc   rh   rb   rL   rM   rQ   ri   rR   rF   rG   r   r   ry   r!   r   r"   Śtest_close_simplev  s2   ž
’’Żr   c                  C   s  t dddgdt g} tdg dt g}t }| tt ” |jD ]}|jtt	t
tiks.J q!t }| t| ” | tt ” |jD ]}|jtt	t
tiksOJ qBt }| t| ” t t” |jt
  t ” W d    n1 srw   Y  |jt  d” t t” |jt  ”  W d    n1 sw   Y  t }| t| ” | t
|” | t
t ” |jD ]}|jttt
t	iksĮJ q“t }| t| ” | t
|” | tt ” | t
t ” | tt ” | t
t ” t }| tt dddd	gd” t t” |jt  t ” W d    n	1 sw   Y  |jt
  d” t t” |jt
  ”  W d    d S 1 s=w   Y  d S )
Nr   r   r   r   r   r   rC   r   r:   )r   rU   r    r   rL   r9   rh   rM   rN   ri   rK   rg   rP   rF   rG   r   rI   rb   r   rc   )r/   r,   rX   rI   r!   r!   r"   Śtest_close_different_states  s`   ’

’’
’’’$’r   c                  C   s2  t t} |  d” |  d” t| tddddgdtdd	t gks$J | jt t	u s-J |  
td
g d” |  
t ” | jt t	u sEJ |  ”  t| tddddgdtdd	t t gksaJ | jttttikslJ |  
td
g d” |  
t ” | jttttiksJ |  
t ” | jttttiksJ d S )Nsp   GET /1 HTTP/1.1
Host: a.com
Content-Length: 5

12345GET /2 HTTP/1.1
Host: a.com
Content-Length: 5

67890rC   r   r}   )r~   r   )r4   r   r   r=   r>   r   r   r   r@   )r   rK   rb   r   r   rT   rU   rN   r9   rV   rL   r    r   rh   ri   rP   rg   rj   r!   r!   r"   Śtest_pipelined_closeŲ  s>   ’
’
ü’
ūr   c                     s°   G dd d} |    fdd}|dd\}}| gksJ |  t ” |dd\}} |v s1J d||  ”< d	 |”d
ksAJ |d d\}}| gksOJ |jtu sVJ d S )Nc                   @   s   e Zd Zdd ZdS )z*test_sendfile.<locals>.SendfilePlaceholderc                 S   s   dS )Né
   r!   )Śselfr!   r!   r"   Ś__len__ü  s   z2test_sendfile.<locals>.SendfilePlaceholder.__len__N)Ś__name__Ś
__module__Ś__qualname__r    r!   r!   r!   r"   ŚSendfilePlaceholderū  s    r¤   c                    sV   t t}t|d |” d” g }| r| | ” | td|d” || t	 d”fS )NzGET / HTTP/{}
Host: a

Śasciir   r   r>   )
r   rK   r   ŚformatŚencoder'   rL   r    Zsend_with_data_passthroughrT   )Śheaderr   rk   r   ©Śplaceholderr!   r"   rx      s   ż
ztest_sendfile.<locals>.setupr:   z1.1r%   s
   xxxxxxxxxxrC   s   a
xxxxxxxxxx
r   )rL   rU   ŚindexŚjoinrQ   rO   )r¤   rx   rk   r?   Ś_r!   r©   r"   Śtest_sendfileś  s   r®   c               	   C   s:  t tfD ]c} t| d}| d” t t” | ”  W d    n1 s$w   Y  |jt	u s0J |j
t	us7J t|jj t t” | ”  W d    n1 sQw   Y  | tu rg| tdg d”dksgJ qdd }t tfD ]Ŗ} | t u rtdd	d
gd}tdd	d
gdd}n| tu rtdg d}tdg dd}|| }| |” |j
t	us©J || }t t” | |” W d    n1 sĀw   Y  |j
t	u sĪJ |jt	usÕJ t t” | |” W d    n1 sźw   Y  || }| ”  |j
t	u sžJ |jt	usJ | ”  |j
t	u sJ |jt	usJ qpd S )Nr\   s   gibberish

i  r   s$   HTTP/1.1 400 
connection: close

c                 S   s.   t | d}| tu rt|d |jtu sJ |S )Nr\   rm   )r   rK   r   rQ   rP   ©Śrolerk   r!   r!   r"   rI   0  s
   

ztest_errors.<locals>.connr   r   r-   r   r   r   r   r   )r9   rK   r   rb   rF   rG   r   rc   rR   ŚERRORrQ   ŚprintZ_cstaterN   rL   r    r   r   Zsend_failed)r°   rk   rI   ZgoodŚbadr!   r!   r"   Śtest_errors  sd   


’
’’’ž
’’Žr“   c                  C   s*   t tfD ]} t| }| ” tu sJ qd S r   )r9   rK   r   rc   r	   rÆ   r!   r!   r"   Śtest_idle_receive_nothing\  s   žrµ   c                  C   sd   t t} |  d” |  ” tu sJ |  d” t t” |  ”  W d    d S 1 s+w   Y  d S )Ns   GET /rC   )r   rK   rb   rc   r	   rF   rG   r   rj   r!   r!   r"   Śtest_connection_dropb  s   


"’r¶   c                  C   s   t  } |  ttdg d” d S )Ni  r   )r   rL   rK   r    )rX   r!   r!   r"   Śtest_408_request_timeoutj  s   r·   c                  C   sJ   t t} |  d” t t” |  ”  W d    d S 1 sw   Y  d S )Nra   )r   rK   rb   rF   rG   r   rc   rj   r!   r!   r"   Śtest_empty_requestq  s
   

"’rø   c                  C   s`   t t} |  tdddgd” |  d” t t” |  ”  W d    d S 1 s)w   Y  d S )Nr   r   r   r   ra   )	r   r9   rL   r   rb   rF   rG   r   rc   rj   r!   r!   r"   Śtest_empty_responsex  s   

"’r¹   c                  C   s   dd } dD ]:}| |d}|  tdg d”dksJ | |d}|  tdg d”d	ks,J | |d}|  tdd
dgd”dks@J qd S )Nc                 S   sN   t t}| | d | d d ” t| ” tu sJ t| ” tu s%J |S )Ns    / HTTP/ra   s   Host: example.com

)r   rK   rb   Śtyperc   r   rU   )r   r   rk   r!   r!   r"   rx     s   ’z(test_HEAD_framing_headers.<locals>.setup)r2   r1   r<   r   r   s-   HTTP/1.1 200 
transfer-encoding: chunked

s   1.0rn   rp   r%   )rL   r    )rx   r   rk   r!   r!   r"   Śtest_HEAD_framing_headers  s&   
’
’
’’
żńr»   c                  C   sZ  t t} |  d” t|  ” tu sJ |  ” tu sJ |  d” |  ” tddks+J |  d” t 	t
”}|  ”  W d    n1 sDw   Y  dt|jv sRJ dt|jv s[J t t} |  d” t|  ” tu snJ |  ” tu svJ |  d” |  ” jd	ksJ |  d” t 	t
”}|  ”  W d    n1 sw   Y  d
t|jv s«J d S )Ns;   POST / HTTP/1.1
Host: example.com
Content-Length: 100

r=   r>   rC   zreceived 5 byteszexpected 100r]   s	   8
012345s   012345zincomplete chunked read)r   rK   rb   rŗ   rc   r   r	   rT   rF   rG   r   r(   Śvaluer?   )rk   Śexcinfor!   r!   r"   Ś;test_special_exceptions_for_lost_connection_in_message_body”  s.   



’



’r¾   )*rF   Z_utilr   r   Z_eventsŚ_stateŚ_connectionr   r   r   r	   r
   Zhelpersr   r   r   r#   r8   rY   r[   re   rl   ro   rr   ru   rz   r   r   r   r   r   r   r   r®   r“   rµ   r¶   r·   rø   r¹   r»   r¾   r!   r!   r!   r"   Ś<module>   s@    &B0"!&EAt)9"!A