B
    Ce@                 @   s  d dl mZmZmZmZmZmZmZ d dlZddl	m
Z
mZmZmZmZ ddlmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z" ddl#m$Z$m%Z%m&Z& dd	l'm(Z(m)Z)m*Z* dd
ddZ+dd
ddZ,dd
ddZ-dd
ddZ.dd
ddZ/dd
ddZ0dd
ddZ1dd
ddZ2dd
ddZ3dd
ddZ4dd
dd Z5dd
d!d"Z6dd
d#d$Z7dd
d%d&Z8dd
d'd(Z9dd
d)d*Z:dd
d+d,Z;dd
d-d.Z<dd
d/d0Z=dd
d1d2Z>dd
d3d4Z?dd
d5d6Z@dd
d7d8ZAdd
d9d:ZBejCDd;d<d=d>geEdd?d@dAZFejCDd;d<d=dBgeEdd?dCdDZGdd
dEdFZHdd
dGdHZIdS )I    )AnycastDictListOptionalTupleTypeN   )_body_framing_keep_alive
Connection	NEED_DATAPAUSED)ConnectionClosedDataEndOfMessageEventInformationalResponseRequestResponse)CLIENTCLOSEDDONEERRORIDLEMIGHT_SWITCH_PROTOCOL
MUST_CLOSE	SEND_BODYSEND_RESPONSESERVERSWITCHED_PROTOCOL)LocalProtocolErrorRemoteProtocolErrorSentinel   )ConnectionPairget_all_eventsreceive_and_get)returnc               C   s   t tdddgdstt tddddgdr2tt tddddgdrLtt tddg ddrdtt td	g d
sxtt td	dgd
rtt td	dgd
rtt td	g ddrtd S )NGET/)HostzExample.com)methodtargetheaders)r   close)r   za, b, cLOse, fooz1.0)r,   r-   r.   http_version   )status_coder.   )r2   r.   r0   )r   r   AssertionErrorr    r4   r4   m/var/www/downstreamdata.science/rtclock/rtclock-venv/lib/python3.7/site-packages/h11/tests/test_connection.pytest__keep_alive    s&    r6   c                 s  t t tttttf  ddd dtt t ttd fdd} dt t ttd fd	d
}xi ddiddidddgD ]n}tt	tt
f |}xVd| f |fd| f ddi|fd| f ddi|fgD ]\}}t||dkstqW qxW xnddidddgD ]X}tt	tt
f |}x>d |f |fd| f |fgD ]\}}t||dks2tq2W  qW x>d |ddfd| ddfgD ]\}}t||dksxtqxW td | dksttd|  dkstd S )N)clter(   c             S   s0   g }| d k	r| dt| f |r,| d |S )NzContent-Length)zTransfer-Encodingchunked)appendstr)r7   r8   r.   r4   r4   r5   r.   ?   s    
z#test__body_framing.<locals>.headersr1   F)r2   r7   r8   r(   c                s   t |  ||dS )N)r2   r.   )r   )r2   r7   r8   )r.   r4   r5   respG   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   )r7   r8   h)r.   r4   r5   reqL   s    

ztest__body_framing.<locals>.reqr7   d   r8   T)r7   r8   s   HEADs   GETr2      i0  )zcontent-length)r   )r9   r4   )r7   )zcontent-length)r?   )zhttp/1.0r4   )r1   NF)NF)r   intboolr   r   r;   r   r   r   r   r   r
   r3   )r<   r>   kwargsmethrr4   )r.   r5   test__body_framing>   s&    "	  & &rF   c           	   C   s  t t td W d Q R X t } | jt jtks8t| jt j	t
ksLt| jt
 jt
ks`t| jt
 j	tkstt| ttddddgd}|dkstx$| jD ]}|jttt
tikstqW | jt jtkst| jt jtkst| jt
 jtkst| jt
 jtkst| jt jd ks(t| jt
 jdks>t| t
td	g d
}|dks`t| t
tddgd
}|dkstx(| jD ]}|jttt
tikstqW | jt jdkst| jt
 jdkst| ttdd}|dkst| jttddtddt gd}|dks*t| jtt g d}|dksJtx(| jD ]}|jttt
tiksRtqRW | t
tdd}|dkst| jt
tddtddt gd}|dkst| jt
t g d}|dkstx(| jD ]}|jttt
tikstqW d S )Nr   r)   r*   )r+   zexample.com)zContent-Length10)r,   r-   r.   s9   GET / HTTP/1.1
Host: example.com
Content-Length: 10

s   1.1r?   )r2   r.   s   HTTP/1.1 100 

r1   )zContent-LengthZ11s%   HTTP/1.1 200 
Content-Length: 11

s   12345)datas   67890)expect    s
   1234567890   1)pytestraises
ValueErrorr   r%   connr   our_roler3   Z
their_roler   sendr   connsstatesr   r   	our_statetheir_stateZtheir_http_versionr   r   r   r   r   )prH   rO   r4   r4   r5   )test_Connection_basics_and_content_lengthj   s`    
"rW   c              C   s   t  } | ttddddgd | ttdddd}|d	ksBt| ttd
ddd}|dksdt| jttddg d}|dkst| ttdgd}|dkst| ttddgd | ttdddd | ttdddd | tt  x$| j	D ]}|j
ttttikstqW d S )Nr)   r*   )r+   zexample.com)zTransfer-Encodingr9   )r,   r-   r.   s
   1234567890T)rH   chunk_start	chunk_ends   a
1234567890
s   abcdes
   5
abcde
rJ   )rH   )rI   )ZhelloZthere)r.   s   0
hello: there

r1   )r2   r.   s   54321s   12345)r%   rQ   r   r   r   r3   r   r   r   rR   rS   r   )rV   rH   rO   r4   r4   r5   test_chunked   s,    rZ   c              C   s8  t td} d}| | |  tddddgdks6t|  tksFt| d |  td	d
d
dksjt| d |  tdd
ddkst| d |  tddddkst| d |  tddd
dkst| d |  td	d
d
dkst| d |  tkst| d |  t ks4td S )N)rP   sB   POST / HTTP/1.1
Host: example.com
Transfer-Encoding: chunked

POSTr*   )r+   zexample.com)zTransfer-Encodingr9   )r,   r-   r.   s
   5
hello
s   helloT)rH   rX   rY   s   5
hels   helF   ls   o
   os   5
hellos   
s   0

)	r   r   receive_data
next_eventr   r3   r   r   r   )rO   requestr4   r4   r5   test_chunk_boundaries   s,    








ra   c              C   s   t t} | tdddgd | t  | jtks8tt| dt	dg ddd	gksXt| jt
ksftt| d
td
dgkstt| dtddgkstt| dt t gkst| jtkstd S )Nr)   r*   )r+   zexample.com)r,   r-   r.   s   HTTP/1.0 200 OK

r1   z1.0s   OK)r2   r.   r0   reasons   12345)rH   s   67890rJ   )r   r   rQ   r   r   rT   r   r3   r'   r   r   r   r   rU   r   )cr4   r4   r5   $test_client_talking_to_http10_server   s    rd   c              C   s  t t} t| dtddg ddt gks,t| jtks:t| t	dg ddksTt| t
d	d
d	kslt| t dkst| jtkstt t} t| dtdddgddt
dd
gkstt| dt
dd
t gkst| jtkstt| dt gkstd S )Ns   GET / HTTP/1.0

r)   r*   z1.0)r,   r-   r.   r0   r1   )r2   r.   s$   HTTP/1.1 200 
Connection: close

s   12345)rH   rJ   s(   POST / HTTP/1.0
Content-Length: 10

1r[   )zContent-LengthrG   rK   s	   234567890)r   r   r'   r   r   r3   rU   r   rQ   r   r   rT   r   )rc   r4   r4   r5   $test_server_talking_to_http10_client  s*    
re   c           	   C   s   xdgg ddggD ]} t ttttf  | } 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st|tdddkstqW d S )N)zTransfer-Encodingr9   )zContent-Length100r)   r*   )r+   zexample.com)r,   r-   r.   r1   )r2   r.   )rI   s   GET / HTTP/1.0

s$   HTTP/1.1 200 
Connection: close

s   12345)rH   )r   r   r   r;   r%   rQ   r   r   r   r   r   r   r'   r3   r   )Zuser_headersrV   rc   r4   r4   r5   ,test_automatic_transfer_encoding_in_response(  s(    



rg   c              C   s   t  } | ttddddgdt g x | jD ]}|jt tks.tq.W | jt	t
dg dt gt
ddgdt gd	 x$| jD ]}|jttt	tiks~tq~W d S )
Nr)   r*   )r+   zexample.com)r   r/   )r,   r-   r.   r@   )r2   r.   )
connectionr/   )rI   )r%   rQ   r   r   r   rR   rS   r   r3   r   r   )rV   rO   r4   r4   r5   (test_automagic_connection_close_handlingR  s"    

ri   c              C   s   t ddd} |  }|ttdg d x"|jD ]}|jr>t|jr0tq0W |  }|ttddgd x"|jD ]}|jr~t|jrptqpW |  }|t	t
dd	 x"|jD ]}|jrt|jrtqW d S )
N)r(   c           	   S   s`   t  } | ttdddddgd x| jD ]}|js*tq*W | jt jrLt| jt	 js\t| S )Nr)   r*   )r+   zexample.com)zContent-Lengthrf   )ZExpectz100-continue)r,   r-   r.   )
r%   rQ   r   r   rR   "client_is_waiting_for_100_continuer3   rO   !they_are_waiting_for_100_continuer   )rV   rO   r4   r4   r5   setups  s    z test_100_continue.<locals>.setupr?   )r2   r.   r1   )zTransfer-Encodingr9   s   12345)rH   )r%   rQ   r   r   rR   rj   r3   rk   r   r   r   )rl   rV   rO   r4   r4   r5   test_100_continuer  s"    


rm   c           	   C   s  t t} | d |  tks"ttt x| d |   q0W W d Q R X t tdd} | d | d | d t	| t
dd	d
dgdt gkstt tdd} | d | d tt |   W d Q R X t tdd} | d | ddd   t	| t
dd	d
dgdtdd dt gks6tt tdd} | d t	| t
dddgdt gkspt| d | tdg d | t  |   t	| t
dddgdt gkst| tdg d | t  |   tt |   W d Q R X d S )Ns   GET / HTTP/1.0
Endless: s   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaai  )Zmax_incomplete_event_sizes   GET / HTTP/1.0
Big: s  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas   

r)   r*   z1.0)bigA  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)r,   r-   r0   r.   i  s%   GET / HTTP/1.0
Content-Length: 10000   ai'  )zContent-LengthZ10000)rH   r?   s   GET /1 HTTP/1.1
Host: a

GET /2 HTTP/1.1
Host: b

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXz/1)hosta)r,   r-   r.   s  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXr1   )r2   r.   z/2)rp   b)r   r   r^   r_   r   r3   rL   rM   r"   r&   r   r   r   rQ   r   start_next_cycle)rc   r4   r4   r5   -test_max_incomplete_event_size_countermeasure  sb    








rt   c              C   s   t  } | ttdddgdt g | ttddgdt g x,| jD ]"}|jtt	tt	iksbt
|  qHW | ttdd	dgdt g | ttd
dgdt g d S )Nr)   r*   )r+   rq   )r,   r-   r.   r1   )s   transfer-encodings   chunked)r2   r.   DELETEz/fooi  )r%   rQ   r   r   r   r   r   rR   rS   r   r3   rs   )rV   rO   r4   r4   r5   test_reuse_simple  s&    

rv   c           	   C   s  t t} |  tkst| d t| tddddgdtddt	 gksNt| j
tks\t| jtksjt|  tkszt| td	g d
 | t	  | j
tkst| jtkst|   t| tddddgdtddt	 gkst|  tkst| td	g d
 | t	  |   t| tdddgdt	 gksBt|  tksTt| td	g d
 | t	  |  tkst| d |  tkst| jdkst| d | jdkst|  tkst| d |  tksttt | d W d Q R X 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)   z/1)r+   za.com)zContent-Length5)r,   r-   r.   s   12345)rH   r1   )r2   r.   z/2s   67890z/3s   SADF)s   SADFFrJ   )s   SADFTs   FDSA)r   r   r_   r   r3   r^   r&   r   r   r   rU   r   rT   r   r   rQ   r   rs   trailing_datarL   rM   RuntimeError)rc   r4   r4   r5   test_pipelining  s^    




rz   c           
      sj  xbt ddddgdtddgdtd	dgdft d
ddddgdtd	dgdtddgdft dddddgdtddgdtd	dgdft dddddgdtddgdtddgdfgD ]\ } }td fdd}| }|t|  x$|jD ]}|jtt	tt
ikstqW |tt  x|jD ]}|  q"W | }|t| xp|jD ]f}|jttttiksjt|d | tkst|d | tkst|jdksNtqNW | }|jt }|d | tkst|jdkst||  | tkst|t  |  t|t d
dg ddt gksHt| }|jt }|d | tkstt|jdkst|t| | tkst| }|jt }|d | tkst||  | t kst| }tt" |jt t d
ddgd W d Q R X | }|t| tt |jt tdd W d Q R X qW d S )NZCONNECTzexample.com:443)r+   Zfoo)zContent-Length1)r,   r-   r.   i  )s   transfer-encodings   chunked)r2   r.   r1   r)   r*   )Upgradeza, be   )r|   rq   )r|   rr   )r(   c                 s   t  } | t  x | jD ]}|jt tkstqW | ttddt g x | jD ]}|jt t	ksTtqTW | j
t  tkst| S )NrK   )rH   )r%   rQ   r   rR   rS   r   r3   r   r   r   rO   r   r_   r   )rV   rO   )r>   r4   r5   rl   ~  s    z#test_protocol_switch.<locals>.setups   123s   456)s   123456Fs   GET / HTTP/1.0

)s   GET / HTTP/1.0

Fz1.0)r,   r-   r.   r0   rJ   )rJ   T)r+   rq   )rH   )r   r   r   r%   rQ   r   rR   rS   r   r   r   r3   r   rs   r    r^   r_   r   rx   rO   r&   r   rL   rM   r!   r   )Zdenyacceptrl   rV   rO   scr4   )r>   r5   test_protocol_switchT  s    











r   c           
      s>  x6t tftt fgD ] \ td fdd} |  }|j  t ksPt|j  t ksht|j d |j  t kst|  }|t  x*|j	D ] }|j
tkst|jtkstqW |  }tt |j d W d Q R X |  }|j  d tt |j    W d Q R X qW d S )N)r(   c                 s>   t  } |  t  x$| jD ]}|j ttikstqW | S )N)r%   rQ   r   rR   rS   r   r   r3   )rV   rO   )who_shot_firstwho_shot_secondr4   r5   rl     s    z test_close_simple.<locals>.setuprJ   s   123s   GET)r   r   r%   rO   r_   r   r3   r^   rQ   rR   rT   r   rU   rL   rM   ry   r"   )rl   rV   rO   r4   )r   r   r5   test_close_simple  s&    r   c           	   C   sD  t dddgdt g} tddgdt g}t }|tt  x$|jD ]}|jtt	t
tiksFtqFW t }|t|  |tt  x$|jD ]}|jtt	t
tikstqW t }|t|  tt |jt
 t  W d Q R X |jt d tt |jt   W d Q R X t }|t|  |t
| |t
t  x(|jD ]}|jttt
t	iksLtqLW 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 Q R X |jt
 d tt |jt
   W d Q R X d S )Nr)   z/foo)r+   rq   )r,   r-   r.   r1   )s   transfer-encodings   chunked)r2   r.   rJ   r*   )zContent-LengthrG   )r   r   r   r%   rQ   r   r   rR   rS   r   r   r   r3   r   rL   rM   r!   rO   r^   r"   r_   )r>   r<   rV   rO   r4   r4   r5   test_close_different_states  sV    r   c              C   s6  t t} | d | d t| tddddgdtdd	t gksHt| jt	 t
ksZt| td
g d | t  | jt t
kst|   t| tddddgdtdd	t t gkst| jt	tttikst| td
g d | t  | jt	tttikst| t  | jt	tttiks2t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

67890rJ   r)   z/1)rp   za.com)zcontent-lengthrw   )r,   r-   r.   s   12345)rH   r1   )r2   r.   z/2s   67890)r   r   r^   r&   r   r   r   r3   rS   r   r   rQ   r   rs   r   r   r   r   )rc   r4   r4   r5   test_pipelined_close<  s<    


r   c                 s   G dd d} |   t ttf tt tttt  f d fdd}|dd\}}| gks^t|t  |dd\}} |kstd	||	 < d

|dkst|d d\}}| gkst|jtkstd S )Nc               @   s   e Zd ZedddZdS )z*test_sendfile.<locals>.SendfilePlaceholder)r(   c             S   s   dS )N
   r4   )selfr4   r4   r5   __len__h  s    z2test_sendfile.<locals>.SendfilePlaceholder.__len__N)__name__
__module____qualname__rA   r   r4   r4   r4   r5   SendfilePlaceholderg  s   r   )headerr0   r(   c                sV   t t}t|d|d g }| r0||  |td|d ||t	 dfS )NzGET / HTTP/{}
Host: a

asciir1   )r2   r.   )rH   )
r   r   r'   formatencoder:   rQ   r   Zsend_with_data_passthroughr   )r   r0   rc   r.   )placeholderr4   r5   rl   m  s    
ztest_sendfile.<locals>.setup)zContent-LengthrG   z1.1)zTransfer-Encodingr9   s
   xxxxxxxxxxrJ   s   a
xxxxxxxxxx
z1.0)r   r;   r   r   r   bytesr3   rQ   r   indexjoinrT   r   )r   rl   rc   rH   _r4   )r   r5   test_sendfilef  s    "r   c           
   C   s
  xt tgD ]} t| d}|d tt |  W d Q R X |jt	ksNt
|jt	k	s\t
t|jj tt |  W d Q R X | tkr
|tdg ddks
t
q
W tt tddd}xBt tgD ]4} | t krtd	d
dgd}td	d
dgdd}n$| tkr"tdg d}tdg dd}|| }|| |jt	k	sDt
|| }tt || W d Q R X |jt	ks|t
|jt	k	st
tt || W d Q R X || }|  |jt	kst
|jt	k	st
|  |jt	kst
|jt	k	st
qW d S )N)rP   s   gibberish

i  )r2   r.   s$   HTTP/1.1 400 
Connection: close

)roler(   c             S   s.   t | d}| tkr*t|d |jtks*t|S )N)rP   s   GET / HTTP/1.0

)r   r   r'   rT   r   r3   )r   rc   r4   r4   r5   rO     s
    

ztest_errors.<locals>.connr)   r*   )r+   zexample.com)r,   r-   r.   z1.0)r,   r-   r.   r0   r1   )r2   r.   r0   )r   r   r   r^   rL   rM   r"   r_   rU   r   r3   rT   printZ_cstaterS   rQ   r   r   r#   r   r!   Zsend_failed)r   rc   rO   Zgoodbadr4   r4   r5   test_errors  sT    




r   c              C   s.   x(t tgD ]} t| }| tks
tq
W d S )N)r   r   r   r_   r   r3   )r   rc   r4   r4   r5   test_idle_receive_nothing  s    r   c           	   C   sN   t t} | d |  tks"t| d tt |   W d Q R X d S )Ns   GET /rJ   )	r   r   r^   r_   r   r3   rL   rM   r"   )rc   r4   r4   r5   test_connection_drop  s    

r   c              C   s    t  } | ttddgd d S )Ni  )s
   connections   close)r2   r.   )r%   rQ   r   r   )rV   r4   r4   r5   test_408_request_timeout  s    r   c           	   C   s4   t t} | d tt |   W d Q R X d S )Ns   
)r   r   r^   rL   rM   r"   r_   )rc   r4   r4   r5   test_empty_request  s    
r   c           	   C   sJ   t t} | tdddgd | d tt |   W d Q R X d S )Nr)   r*   )r+   rq   )r,   r-   r.   s   
)	r   r   rQ   r   r^   rL   rM   r"   r_   )rc   r4   r4   r5   test_empty_response  s
    
r   rH           s    )rH   r(   c          	   C   s4   t t}||  tt |  W d Q R X d S )N)r   r   r^   rL   rM   r"   r_   )rH   rc   r4   r4   r5   'test_early_detection_of_invalid_request  s    	
r   s    1c          	   C   s4   t t}||  tt |  W d Q R X d S )N)r   r   r^   rL   rM   r"   r_   )rH   rc   r4   r4   r5   (test_early_detection_of_invalid_response  s    	
r   c              C   s   t t tddd} x|dD ]t}| |d}|tdg ddks@t| |d	}|tdg dd
ksdt| |d}|tdddgddkstqW d S )N)r,   r0   r(   c             S   sN   t t}|| d | d d  t| tks6tt| tksJt|S )Ns    / HTTP/s   
s   Host: example.com

)r   r   r^   typer_   r   r3   r   )r,   r0   rc   r4   r4   r5   rl     s    z(test_HEAD_framing_headers.<locals>.setup)s   GETs   HEADs   1.1r1   )r2   r.   s-   HTTP/1.1 200 
Transfer-Encoding: chunked

s   1.0s$   HTTP/1.1 200 
Connection: close

)zContent-Lengthrf   )zTransfer-Encodingr9   )r   r   rQ   r   r3   )rl   r,   rc   r4   r4   r5   test_HEAD_framing_headers  s    	




r   c           	   C   s4  t t} | d t|  tks&t|  tks6t| d |  tddksVt| d t	
t}|   W d Q R X dt|jkstdt|jkstt t} | d t|  tkst|  tkst| d |  jd	kst| d t	
t}|   W d Q R X d
t|jks0td S )Ns;   POST / HTTP/1.1
Host: example.com
Content-Length: 100

s   12345)rH   rJ   zreceived 5 byteszexpected 100sB   POST / HTTP/1.1
Host: example.com
Transfer-Encoding: chunked

s	   8
012345s   012345zincomplete chunked read)r   r   r^   r   r_   r   r3   r   r   rL   rM   r"   r;   valuerH   )rc   excinfor4   r4   r5   ;test_special_exceptions_for_lost_connection_in_message_bodyF  s.    



r   )Jtypingr   r   r   r   r   r   r   rL   _connectionr
   r   r   r   r   Z_eventsr   r   r   r   r   r   r   _stater   r   r   r   r   r   r   r   r   r   r    Z_utilr!   r"   r#   helpersr%   r&   r'   r6   rF   rW   rZ   ra   rd   re   rg   ri   rm   rt   rv   rz   r   r   r   r   r   r   r   r   r   r   r   markZparametrizer   r   r   r   r   r4   r4   r4   r5   <module>   sX   $$	4,C'%* -L!H})B*$F	*