§
    ‹Ÿj[  ã                   ó‚  — d dl Z d dlmZmZmZmZmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lmZmZmZ 	 d d
l mZ n# e$ r dZY nw xY w G d„ dee¦  «        Z G d„ de¦  «        Z G d„ dee¦  «        Z G d„ de¦  «        Z G d„ dee¦  «        Z G d„ de¦  «        Z  G d„ de¦  «        Z! G d„ dee¦  «        Z" G d„ dee¦  «        Z# G d„ de¦  «        Z$ G d„ d e¦  «        Z% G d!„ d"ee¦  «        Z& G d#„ d$e&¦  «        Z' G d%„ d&e&¦  «        Z( G d'„ d(e&¦  «        Z) G d)„ d*e&¦  «        Z* G d+„ d,e¦  «        Z+ G d-„ d.e¦  «        Z, G d/„ d0e¦  «        Z- G d1„ d2e¦  «        Z. G d3„ d4ee¦  «        Z/ G d5„ d6e¦  «        Z0 G d7„ d8e¦  «        Z1 G d9„ d:e¦  «        Z2 G d;„ d<e¦  «        Z3dS )=é    N)ÚOpenIdMixinÚ
OAuthMixinÚOAuth2MixinÚGoogleOAuth2MixinÚFacebookGraphMixinÚTwitterMixin)Újson_decode)Úgen)ÚHTTPClientError)Ú
url_concat)Úapp_log)ÚAsyncHTTPTestCaseÚ	ExpectLog)ÚRequestHandlerÚApplicationÚ	HTTPError)Úmockc                   ó4   — e Zd Zd„ Zej        d„ ¦   «         ZdS )ÚOpenIdClientLoginHandlerc                 ó:   — |                      d¦  «        | _        d S )Nú/openid/server/authenticate)Úget_urlÚ_OPENID_ENDPOINT©ÚselfÚtests     úc/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/tornado/test/auth_test.pyÚ
initializez#OpenIdClientLoginHandler.initialize   s   € Ø $§¢Ð-JÑ KÔ KˆÔÐÐó    c              #   óü   K  — |                       dd ¦  «        rK|                      | j        d         ¬¦  «        V —}|€t          d¦  «        ‚|                      |¦  «         d S |                      ¦   «         }|�J ‚d S )Núopenid.modeÚhttp_client©r"   úuser is None)Úget_argumentÚget_authenticated_userÚsettingsÚ	ExceptionÚfinishÚauthenticate_redirect)r   ÚuserÚress      r   ÚgetzOpenIdClientLoginHandler.get"   s–   è è € à×Ò˜]¨DÑ1Ô1ð 	Ø×4Ò4Ø œM¨-Ô8ð 5ñ ô ð ð ˆDð ˆ|Ý Ñ/Ô/Ð/Ø�KŠK˜ÑÔÐØˆFØ×(Ò(Ñ*Ô*ˆØˆ{ˆ{ˆ{ˆ{ˆ{r   N©Ú__name__Ú
__module__Ú__qualname__r   r
   Ú	coroutiner-   © r   r   r   r      sC   € € € € € ðLð Lð Lð 	„]ð
ð 
ñ „]ð
ð 
ð 
r   r   c                   ó   — e Zd Zd„ ZdS )ÚOpenIdServerAuthenticateHandlerc                 ó€   — |                       d¦  «        dk    rt          d¦  «        ‚|                      d¦  «         d S )Nr!   Úcheck_authenticationzincorrect openid.mode %rzis_valid:true)r%   r(   Úwrite©r   s    r   Úpostz$OpenIdServerAuthenticateHandler.post1   sC   € Ø×Ò˜]Ñ+Ô+Ð/EÒEÐEÝÐ6Ñ7Ô7Ð7Ø�
Š
�?Ñ#Ô#Ð#Ð#Ð#r   N©r/   r0   r1   r:   r3   r   r   r5   r5   0   s#   € € € € € ð$ð $ð $ð $ð $r   r5   c                   óZ   — e Zd Zd„ Zd„ Zej        d„ ¦   «         Zej        d„ ¦   «         ZdS )ÚOAuth1ClientLoginHandlerc                 ó°   — || _         |                     d¦  «        | _        |                     d¦  «        | _        |                     d¦  «        | _        d S )Nú/oauth1/server/request_tokenú/oauth1/server/authorizeú/oauth1/server/access_token)Ú_OAUTH_VERSIONr   Ú_OAUTH_REQUEST_TOKEN_URLÚ_OAUTH_AUTHORIZE_URLÚ_OAUTH_ACCESS_TOKEN_URL)r   r   Úversions      r   r   z#OAuth1ClientLoginHandler.initialize8   sO   € Ø%ˆÔØ(,¯ªÐ5SÑ(TÔ(TˆÔ%Ø$(§L¢LÐ1KÑ$LÔ$LˆÔ!Ø'+§|¢|Ð4QÑ'RÔ'RˆÔ$Ð$Ð$r   c                 ó$   — t          dd¬¦  «        S ©NÚasdfÚqwer©ÚkeyÚsecret©Údictr9   s    r   Ú_oauth_consumer_tokenz.OAuth1ClientLoginHandler._oauth_consumer_token>   ó   € Ý˜ vÐ.Ñ.Ô.Ð.r   c              #   ó  K  — |                       dd ¦  «        rK|                      | j        d         ¬¦  «        V —}|€t          d¦  «        ‚|                      |¦  «         d S |                      | j        d         ¬¦  «        V — d S )NÚoauth_tokenr"   r#   r$   )r%   r&   r'   r(   r)   Úauthorize_redirect©r   r+   s     r   r-   zOAuth1ClientLoginHandler.getA   s¢   è è € à×Ò˜]¨DÑ1Ô1ð 	Ø×4Ò4Ø œM¨-Ô8ð 5ñ ô ð ð ˆDð ˆ|Ý Ñ/Ô/Ð/Ø�KŠK˜ÑÔÐØˆFØ×%Ò%°$´-ÀÔ2NÐ%ÑOÔOÐOÐOÐOÐOÐOr   c                 óº   — |                       dd ¦  «        rt          d¦  «        ‚|t          dd¬¦  «        k    rt          d|z  ¦  «        ‚t          d¬¦  «        S )	NÚfail_in_get_userzfailing in get_userÚuiopÚ5678rK   zincorrect access token %rúfoo@example.com)Úemail)r%   r(   rO   )r   Úaccess_tokens     r   Ú_oauth_get_user_futurez/OAuth1ClientLoginHandler._oauth_get_user_futureM   sh   € à×ÒÐ/°Ñ6Ô6ð 	3ÝÐ1Ñ2Ô2Ð2Ø�4 F°6Ð:Ñ:Ô:Ò:Ð:ÝÐ7¸,ÑFÑGÔGÐGÝÐ+Ð,Ñ,Ô,Ð,r   N)	r/   r0   r1   r   rP   r
   r2   r-   r]   r3   r   r   r=   r=   7   sr   € € € € € ðSð Sð Sð/ð /ð /ð 	„]ð	Pð 	Pñ „]ð	Pð 	„]ð-ð -ñ „]ð-ð -ð -r   r=   c                   ó2   — e Zd ZdZej        d„ ¦   «         ZdS )Ú!OAuth1ClientLoginCoroutineHandlerzDReplaces OAuth1ClientLoginCoroutineHandler's get() with a coroutine.c              #   ó  K  — |                       dd ¦  «        r^	 |                      ¦   «         V — d S # t          $ r8}|                      d¦  «         |                      d|z  ¦  «         Y d }~d S d }~ww xY w|                      ¦   «         V — d S )NrS   é÷  zgot exception: %s)r%   r&   r(   Ú
set_statusr8   rT   )r   Úes     r   r-   z%OAuth1ClientLoginCoroutineHandler.getY   s¼   è è € à×Ò˜]¨DÑ1Ô1ð 		,ð4Ø×1Ò1Ñ3Ô3Ð3Ð3Ð3Ð3Ð3øÝð 4ð 4ð 4Ø—’ Ñ$Ô$Ð$Ø—
’
Ð.°Ñ2Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3øøøøð4øøøð ×)Ò)Ñ+Ô+Ð+Ð+Ð+Ð+Ð+s   š2 ²
A4¼-A/Á/A4N)r/   r0   r1   Ú__doc__r
   r2   r-   r3   r   r   r_   r_   V   s5   € € € € € ØNÐNà„]ð
,ð 
,ñ „]ð
,ð 
,ð 
,r   r_   c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )Ú$OAuth1ClientRequestParametersHandlerc                 ó   — || _         d S ©N)rB   )r   rF   s     r   r   z/OAuth1ClientRequestParametersHandler.initializeh   s   € Ø%ˆÔÐÐr   c                 ó$   — t          dd¬¦  «        S rH   rN   r9   s    r   rP   z:OAuth1ClientRequestParametersHandler._oauth_consumer_tokenk   rQ   r   c                 óš   — |                       dt          dd¬¦  «        t          d¬¦  «        ¬¦  «        }|                      |¦  «         d S )Nzhttp://www.example.com/api/asdfrX   rY   rK   Úbar)Úfoo)Ú
parameters)Ú_oauth_request_parametersrO   r8   )r   Úparamss     r   r-   z(OAuth1ClientRequestParametersHandler.getn   sT   € Ø×/Ò/Ø-Ý�V FÐ+Ñ+Ô+Ý �‘”ð 0ñ 
ô 
ˆð
 	�
Š
�6ÑÔÐÐÐr   N)r/   r0   r1   r   rP   r-   r3   r   r   rf   rf   g   sA   € € € € € ð&ð &ð &ð/ð /ð /ðð ð ð ð r   rf   c                   ó   — e Zd Zd„ ZdS )ÚOAuth1ServerRequestTokenHandlerc                 ó0   — |                       d¦  «         d S )Nz(oauth_token=zxcv&oauth_token_secret=1234©r8   r9   s    r   r-   z#OAuth1ServerRequestTokenHandler.getx   ó   € Ø�
Š
Ð=Ñ>Ô>Ð>Ð>Ð>r   N©r/   r0   r1   r-   r3   r   r   rq   rq   w   ó#   € € € € € ð?ð ?ð ?ð ?ð ?r   rq   c                   ó   — e Zd Zd„ ZdS )ÚOAuth1ServerAccessTokenHandlerc                 ó0   — |                       d¦  «         d S )Nz(oauth_token=uiop&oauth_token_secret=5678rs   r9   s    r   r-   z"OAuth1ServerAccessTokenHandler.get}   rt   r   Nru   r3   r   r   rx   rx   |   rv   r   rx   c                   ó   — e Zd Zd„ Zd„ ZdS )ÚOAuth2ClientLoginHandlerc                 ó:   — |                      d¦  «        | _        d S )Nz/oauth2/server/authorize)r   rD   r   s     r   r   z#OAuth2ClientLoginHandler.initialize‚   s   € Ø$(§L¢LÐ1KÑ$LÔ$LˆÔ!Ð!Ð!r   c                 ó6   — |                       ¦   «         }|�J ‚d S rh   )rT   )r   r,   s     r   r-   zOAuth2ClientLoginHandler.get…   s    € Ø×%Ò%Ñ'Ô'ˆØˆ{ˆ{ˆ{ˆ{ˆ{r   N)r/   r0   r1   r   r-   r3   r   r   r{   r{   �   s5   € € € € € ðMð Mð Mðð ð ð ð r   r{   c                   ó4   — e Zd Zd„ Zej        d„ ¦   «         ZdS )ÚFacebookClientLoginHandlerc                 ó¢   — |                      d¦  «        | _        |                      d¦  «        | _        |                      d¦  «        | _        d S )Nz/facebook/server/authorizeú/facebook/server/access_tokenz/facebook/server)r   rD   rE   Ú_FACEBOOK_BASE_URLr   s     r   r   z%FacebookClientLoginHandler.initialize‹   sG   € Ø$(§L¢LÐ1MÑ$NÔ$NˆÔ!Ø'+§|¢|Ð4SÑ'TÔ'TˆÔ$Ø"&§,¢,Ð/AÑ"BÔ"BˆÔÐÐr   c              #   ó’  K  — |                       dd ¦  «        rr|                      | j                             ¦   «         | j        d         | j        d         |                       d¦  «        ¬¦  «        V —}|                      |¦  «         d S |                      | j                             ¦   «         | j        d         ddi¬¦  «         d S )NÚcodeÚfacebook_api_keyÚfacebook_secret)Úredirect_uriÚ	client_idÚclient_secretr„   Úscopezread_stream,offline_access)r‡   rˆ   Úextra_params)r%   r&   ÚrequestÚfull_urlr'   r8   rT   rU   s     r   r-   zFacebookClientLoginHandler.get�   sà   è è € à×Ò˜V TÑ*Ô*ð 	Ø×4Ò4Ø!œ\×2Ò2Ñ4Ô4Øœ-Ð(:Ô;Ø"œmÐ,=Ô>Ø×&Ò& vÑ.Ô.ð	 5ñ ô ð ð ˆDð �JŠJ�tÑÔÐÐÐà×#Ò#Ø!œ\×2Ò2Ñ4Ô4Øœ-Ð(:Ô;Ø%Ð'CÐDð $ñ ô ð ð ð r   Nr.   r3   r   r   r   r   Š   sC   € € € € € ðCð Cð Cð
 	„]ðð ñ „]ðð ð r   r   c                   ó   — e Zd Zd„ ZdS )Ú FacebookServerAccessTokenHandlerc                 óN   — |                       t          dd¬¦  «        ¦  «         d S )NrI   i  ©r\   Ú
expires_in)r8   rO   r9   s    r   r-   z$FacebookServerAccessTokenHandler.get£   s'   € Ø�
Š
•4 V¸Ð=Ñ=Ô=Ñ>Ô>Ð>Ð>Ð>r   Nru   r3   r   r   r�   r�   ¢   rv   r   r�   c                   ó   — e Zd Zd„ ZdS )ÚFacebookServerMeHandlerc                 ó0   — |                       d¦  «         d S )Nz{}rs   r9   s    r   r-   zFacebookServerMeHandler.get¨   s   € Ø�
Š
�4ÑÔÐÐÐr   Nru   r3   r   r   r”   r”   §   s#   € € € € € ðð ð ð ð r   r”   c                   ó   — e Zd Zd„ Zd„ ZdS )ÚTwitterClientHandlerc                 ó
  — |                      d¦  «        | _        |                      d¦  «        | _        |                      d¦  «        | _        |                      d¦  «        | _        |                      d¦  «        | _        d S )Nr?   ú/twitter/server/access_tokenr@   z/twitter/server/authenticatez/twitter/api)r   rC   rE   rD   Ú_OAUTH_AUTHENTICATE_URLÚ_TWITTER_BASE_URLr   s     r   r   zTwitterClientHandler.initialize­   sp   € Ø(,¯ªÐ5SÑ(TÔ(TˆÔ%Ø'+§|¢|Ð4RÑ'SÔ'SˆÔ$Ø$(§L¢LÐ1KÑ$LÔ$LˆÔ!Ø'+§|¢|Ð4RÑ'SÔ'SˆÔ$Ø!%§¢¨nÑ!=Ô!=ˆÔÐÐr   c                 ó   — | j         d         S )Nr"   )r'   r9   s    r   Úget_auth_http_clientz)TwitterClientHandler.get_auth_http_client´   s   € ØŒ}˜]Ô+Ð+r   N)r/   r0   r1   r   r�   r3   r   r   r—   r—   ¬   s2   € € € € € ð>ð >ð >ð,ð ,ð ,ð ,ð ,r   r—   c                   ó.   — e Zd Zej        d„ ¦   «         ZdS )ÚTwitterClientLoginHandlerc              #   óÞ   K  — |                       dd ¦  «        r>|                      ¦   «         V —}|€t          d¦  «        ‚|                      |¦  «         d S |                      ¦   «         V — d S ©NrS   r$   )r%   r&   r(   r)   rT   rU   s     r   r-   zTwitterClientLoginHandler.get¹   s}   è è € à×Ò˜]¨DÑ1Ô1ð 	Ø×4Ò4Ñ6Ô6Ð6Ð6ˆDØˆ|Ý Ñ/Ô/Ð/Ø�KŠK˜ÑÔÐØˆFØ×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'r   N©r/   r0   r1   r
   r2   r-   r3   r   r   rŸ   rŸ   ¸   s/   € € € € € Ø„]ð(ð (ñ „]ð(ð (ð (r   rŸ   c                   ó.   — e Zd Zej        d„ ¦   «         ZdS )Ú TwitterClientAuthenticateHandlerc              #   óÞ   K  — |                       dd ¦  «        r>|                      ¦   «         V —}|€t          d¦  «        ‚|                      |¦  «         d S |                      ¦   «         V — d S r¡   )r%   r&   r(   r)   r*   rU   s     r   r-   z$TwitterClientAuthenticateHandler.getÇ   s}   è è € à×Ò˜]¨DÑ1Ô1ð 	Ø×4Ò4Ñ6Ô6Ð6Ð6ˆDØˆ|Ý Ñ/Ô/Ð/Ø�KŠK˜ÑÔÐØˆFØ×(Ò(Ñ*Ô*Ð*Ð*Ð*Ð*Ð*r   Nr¢   r3   r   r   r¤   r¤   Ä   s1   € € € € € ð 	„]ð+ð +ñ „]ð+ð +ð +r   r¤   c                   ó.   — e Zd Zej        d„ ¦   «         ZdS )Ú%TwitterClientLoginGenCoroutineHandlerc              #   ó¼   K  — |                       dd ¦  «        r-|                      ¦   «         V —}|                      |¦  «         d S |                      ¦   «         V — d S )NrS   )r%   r&   r)   rT   rU   s     r   r-   z)TwitterClientLoginGenCoroutineHandler.getÓ   sm   è è € à×Ò˜]¨DÑ1Ô1ð 	,Ø×4Ò4Ñ6Ô6Ð6Ð6ˆDØ�KŠK˜ÑÔÐÐÐð ×)Ò)Ñ+Ô+Ð+Ð+Ð+Ð+Ð+r   Nr¢   r3   r   r   r§   r§   Ò   s/   € € € € € Ø„]ð,ð ,ñ „]ð,ð ,ð ,r   r§   c                   ó.   — e Zd Zej        d„ ¦   «         ZdS )ÚTwitterClientShowUserHandlerc              #   ó(  K  — 	 |                       d|                      d¦  «        z  t          dd¬¦  «        ¬¦  «        V —}|                      |¦  «         d S # t          $ r. |                      d¦  «         |                      d¦  «         Y d S w xY w)	Nz/users/show/%sÚnameÚhjklÚvbnmrK   ©r\   éô  zerror from twitter request)Útwitter_requestr%   rO   r)   r   rb   ©r   Úresponses     r   r-   z TwitterClientShowUserHandler.getß   s¼   è è € ð	"Ø!×1Ò1Ø  4×#4Ò#4°VÑ#<Ô#<Ñ<Ý! f°VÐ<Ñ<Ô<ð 2ñ ô ð ð ˆHð �KŠK˜Ñ!Ô!Ð!Ð!Ð!øõ ð 	6ð 	6ð 	6ð �OŠO˜CÑ Ô Ð Ø�KŠKÐ4Ñ5Ô5Ð5Ð5Ð5Ð5ð		6øøøs   „>A Á4BÂBNr¢   r3   r   r   rª   rª   Þ   s/   € € € € € Ø„]ð"ð "ñ „]ð"ð "ð "r   rª   c                   ó   — e Zd Zd„ ZdS )ÚTwitterServerAccessTokenHandlerc                 ó0   — |                       d¦  «         d S )Nz8oauth_token=hjkl&oauth_token_secret=vbnm&screen_name=foors   r9   s    r   r-   z#TwitterServerAccessTokenHandler.getò   s   € Ø�
Š
ÐMÑNÔNÐNÐNÐNr   Nru   r3   r   r   rµ   rµ   ñ   s(   € € € € € ðOð Oð Oð Oð Or   rµ   c                   ó   — e Zd Zd„ ZdS )ÚTwitterServerShowUserHandlerc                 óÔ  — |dk    rt          d¦  «        ‚d| j        j        v sJ ‚d| j        j        v sJ ‚d| j        j        v sJ ‚|                      d¦  «        dk    sJ ‚|                      d¦  «        d	k    sJ ‚|                      d
¦  «        dk    sJ ‚|                      d¦  «        dk    sJ ‚|                      t          ||                     ¦   «         ¬¦  «        ¦  «         d S )NÚerrorr°   Úoauth_nonceÚoauth_timestampÚoauth_signatureÚoauth_consumer_keyÚtest_twitter_consumer_keyÚoauth_signature_methodú	HMAC-SHA1Úoauth_versionú1.0rS   r­   ©Úscreen_namer¬   )r   rŒ   Ú	argumentsr%   r8   rO   Ú
capitalize)r   rÅ   s     r   r-   z TwitterServerShowUserHandler.get÷   s  € Ø˜'Ò!Ð!Ý˜C‘.”.Ð Ø ¤Ô 6Ð6Ð6Ð6Ð6Ø  D¤LÔ$:Ð:Ð:Ð:Ð:Ø  D¤LÔ$:Ð:Ð:Ð:Ð:Ø× Ò Ð!5Ñ6Ô6Ð:UÒUÐUÐUÐUØ× Ò Ð!9Ñ:Ô:¸kÒIÐIÐIÐIØ× Ò  Ñ1Ô1°UÒ:Ð:Ð:Ð:Ø× Ò  Ñ/Ô/°6Ò9Ð9Ð9Ð9Ø�
Š
•4 K°k×6LÒ6LÑ6NÔ6NÐOÑOÔOÑPÔPÐPÐPÐPr   Nru   r3   r   r   r¸   r¸   ö   s(   € € € € € ð
Qð 
Qð 
Qð 
Qð 
Qr   r¸   c                   ó   — e Zd Zd„ ZdS )Ú%TwitterServerVerifyCredentialsHandlerc                 ó†  — d| j         j        v sJ ‚d| j         j        v sJ ‚d| j         j        v sJ ‚|                      d¦  «        dk    sJ ‚|                      d¦  «        dk    sJ ‚|                      d¦  «        d	k    sJ ‚|                      d
¦  «        dk    sJ ‚|                      t	          dd¬¦  «        ¦  «         d S )Nr»   r¼   r½   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rS   r­   rl   ÚFoorÄ   )rŒ   rÆ   r%   r8   rO   r9   s    r   r-   z)TwitterServerVerifyCredentialsHandler.get  sè   € Ø ¤Ô 6Ð6Ð6Ð6Ð6Ø  D¤LÔ$:Ð:Ð:Ð:Ð:Ø  D¤LÔ$:Ð:Ð:Ð:Ð:Ø× Ò Ð!5Ñ6Ô6Ð:UÒUÐUÐUÐUØ× Ò Ð!9Ñ:Ô:¸kÒIÐIÐIÐIØ× Ò  Ñ1Ô1°UÒ:Ð:Ð:Ð:Ø× Ò  Ñ/Ô/°6Ò9Ð9Ð9Ð9Ø�
Š
•4 E°Ð6Ñ6Ô6Ñ7Ô7Ð7Ð7Ð7r   Nru   r3   r   r   rÉ   rÉ     s#   € € € € € ð8ð 8ð 8ð 8ð 8r   rÉ   c                   ó¸   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	 e
j        edu d	¦  «        d
„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚAuthTestc                 óä  — t          dt          t          | ¬¦  «        fdt          t          | d¬¦  «        fdt          t          d¬¦  «        fdt          t          | d	¬¦  «        fd
t
          t          | d	¬¦  «        fdt          t          d	¬¦  «        fdt          t          | ¬¦  «        fdt          t          | ¬¦  «        fdt          t          | ¬¦  «        fdt          t          | ¬¦  «        fdt          t          | ¬¦  «        fdt          t          | ¬¦  «        fdt          fdt          fdt          fdt          fdt           fdt"          fdt$          fdt&          fg| j        dddd¬¦  «        S )Nú/openid/client/login©r   ú/oauth10/client/loginrÃ   )r   rF   ú/oauth10/client/request_params)rF   ú/oauth10a/client/loginz1.0az /oauth10a/client/login_coroutineú/oauth10a/client/request_paramsú/oauth2/client/loginú/facebook/client/loginú/twitter/client/loginú/twitter/client/authenticateú#/twitter/client/login_gen_coroutinez/twitter/client/show_userr   r?   rA   r�   z/facebook/server/mer™   z"/twitter/api/users/show/(.*)\.jsonz-/twitter/api/account/verify_credentials\.jsonr¿   Útest_twitter_consumer_secretÚtest_facebook_api_keyÚtest_facebook_secret)r"   Útwitter_consumer_keyÚtwitter_consumer_secretr…   r†   )r   r   rO   r=   rf   r_   r{   r   rŸ   r¤   r§   rª   r5   rq   rx   r�   r”   rµ   r¸   rÉ   r"   r9   s    r   Úget_appzAuthTest.get_app  s§  € Ýð (Õ)AÅ4ÈTÀ?Á?Ä?ÐSà+Ý,Ý˜d¨EÐ2Ñ2Ô2ðð 5Ý8Ý Ð'Ñ'Ô'ðð -Ý,Ý˜d¨FÐ3Ñ3Ô3ðð 7Ý5Ý˜d¨FÐ3Ñ3Ô3ðð 6Ý8Ý Ð(Ñ(Ô(ðð
 (Õ)AÅ4ÈTÀ?Á?Ä?ÐSØ)Õ+EÅtÐQUÀÁÄÐWØ(Õ*CÅTÈtÀ_Á_Ä_ÐUà2Ý4Ý˜d�O‘O”Oðð :Ý9Ý˜d�O‘O”Oðð 0Ý0Ý˜d�O‘O”Oðð /Õ0OÐPØ/Õ1PÐQØ.Õ0NÐOØ0Õ2RÐSØ&Õ(?Ð@Ø/Õ1PÐQØ6Õ8TÐUàDÝ9ððm:ðv Ô(Ø!<Ø$BØ4Ø2ðAA
ñ A
ô A
ð A	
r   c                 ó¬   — |                       dd¬¦  «        }|                      |j        d¦  «         |                      d|j        d         ¦  «         d S )NrÏ   F©Úfollow_redirectsé.  z/openid/server/authenticate?ÚLocation©ÚfetchÚassertEqualr„   ÚassertInÚheadersr²   s     r   Útest_openid_redirectzAuthTest.test_openid_redirectU  sS   € Ø—:’:Ð4Àu�:ÑMÔMˆØ×Ò˜œ¨Ñ,Ô,Ð,Ø�ŠÐ4°hÔ6FÀzÔ6RÑSÔSÐSÐSÐSr   c                 ó¸   — |                       d¦  «        }|                     ¦   «          t          |j        ¦  «        }|                      |d         d¦  «         d S )Nz¬/openid/client/login?openid.mode=blah&openid.ns.ax=http://openid.net/srv/ax/1.0&openid.ax.type.email=http://axschema.org/contact/email&openid.ax.value.email=foo@example.comr[   rZ   ©ræ   Úrethrowr	   Úbodyrç   ©r   r³   Úparseds      r   Útest_openid_get_userzAuthTest.test_openid_get_userZ  s^   € Ø—:’:ð5ñ
ô 
ˆð 	×ÒÑÔÐÝ˜Xœ]Ñ+Ô+ˆØ×Ò˜ œÐ*;Ñ<Ô<Ð<Ð<Ð<r   c                 ó*  — |                       dd¬¦  «        }|                      |j        d¦  «         |                      |j        d                              d¦  «        ¦  «         |                      d|j        d         |j        d         ¦  «         d S )	NrÑ   Frá   rã   rä   ú)/oauth1/server/authorize?oauth_token=zxcvú(_oauth_request_token="enhjdg==|MTIzNA=="ú
Set-Cookie©ræ   rç   r„   Ú
assertTrueré   Úendswithrè   r²   s     r   Útest_oauth10_redirectzAuthTest.test_oauth10_redirecte  sŸ   € Ø—:’:Ð5È�:ÑNÔNˆØ×Ò˜œ¨Ñ,Ô,Ð,Ø�ŠØÔ˜ZÔ(×1Ò1Ø;ñô ñ	
ô 	
ð 	
ð 	�ŠØ6ØÔ˜\Ô*ØÔ˜\Ô*ñ	
ô 	
ð 	
ð 	
ð 	
r   c                 ó  — |                       dddi¬¦  «        }|                     ¦   «          t          |j        ¦  «        }|                      |d         d¦  «         |                      |d         t          dd	¬
¦  «        ¦  «         d S )Nz&/oauth10/client/login?oauth_token=zxcvÚCookieú&_oauth_request_token=enhjdg==|MTIzNA==©ré   r[   rZ   r\   rX   rY   rK   ©ræ   rí   r	   rî   rç   rO   rï   s      r   Útest_oauth10_get_userzAuthTest.test_oauth10_get_usert  s’   € Ø—:’:Ø4ØÐGÐHð ñ 
ô 
ˆð 	×ÒÑÔÐÝ˜Xœ]Ñ+Ô+ˆØ×Ò˜ œÐ*;Ñ<Ô<Ð<Ø×Ò˜ Ô/µ¸&ÈÐ1PÑ1PÔ1PÑQÔQÐQÐQÐQr   c                 óH  — |                       d¦  «        }|                     ¦   «          t          |j        ¦  «        }|                      |d         d¦  «         |                      |d         d¦  «         |                      d|¦  «         |                      d|¦  «         d S )NrÒ   r¾   rI   rS   rX   r»   r½   ©ræ   rí   r	   rî   rç   rè   rï   s      r   Útest_oauth10_request_parametersz(AuthTest.test_oauth10_request_parameters~  s›   € Ø—:’:Ð>Ñ?Ô?ˆØ×ÒÑÔÐÝ˜Xœ]Ñ+Ô+ˆØ×Ò˜Ð 4Ô5°vÑ>Ô>Ð>Ø×Ò˜ Ô.°Ñ7Ô7Ð7Ø�Š�m VÑ,Ô,Ð,Ø�ŠÐ'¨Ñ0Ô0Ð0Ð0Ð0r   c                 ó,  — |                       dd¬¦  «        }|                      |j        d¦  «         |                      |j        d                              d¦  «        ¦  «         |                      d|j        d         v |j        d         ¦  «         d S )	NrÓ   Frá   rã   rä   ró   rô   rõ   )ræ   rç   r„   r÷   ré   rø   r²   s     r   Útest_oauth10a_redirectzAuthTest.test_oauth10a_redirect‡  s¤   € Ø—:’:Ð6È�:ÑOÔOˆØ×Ò˜œ¨Ñ,Ô,Ð,Ø�ŠØÔ˜ZÔ(×1Ò1Ø;ñô ñ	
ô 	
ð 	
ð 	�ŠØ6ØÔ Ô-ð.àÔ˜\Ô*ñ	
ô 	
ð 	
ð 	
ð 	
r   Nzmock package not presentc                 óh  — t           j                             t          d¦  «        5 }t	          d¦  «        |_        t          t          d¦  «        5  |                      dd¬¦  «        }d d d ¦  «         n# 1 swxY w Y   |  	                    |j
        d¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nr-   ÚboomzUncaught exceptionrÓ   Frá   r°   )r   ÚpatchÚobjectrq   r(   Úside_effectr   r   ræ   rç   r„   )r   r-   r³   s      r   Útest_oauth10a_redirect_errorz%AuthTest.test_oauth10a_redirect_error–  s1  € åŒZ×ÒÕ>ÀÑFÔFð 	1È#Ý'¨Ñ/Ô/ˆCŒOÝ�7Ð$8Ñ9Ô9ð Xð XØŸ:š:Ð&>ÐQV˜:ÑWÔW�ðXð Xð Xñ Xô Xð Xð Xð Xð Xð Xð Xøøøð Xð Xð Xð Xà×Ò˜Xœ]¨CÑ0Ô0Ð0ð		1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1s5   ¦*B'ÁA4Á(B'Á4A8	Á8B'Á;A8	Á<B'Â'B+Â.B+c                 ó  — |                       dddi¬¦  «        }|                     ¦   «          t          |j        ¦  «        }|                      |d         d¦  «         |                      |d         t          dd	¬
¦  «        ¦  «         d S )Nz'/oauth10a/client/login?oauth_token=zxcvrû   rü   rý   r[   rZ   r\   rX   rY   rK   rþ   rï   s      r   Útest_oauth10a_get_userzAuthTest.test_oauth10a_get_userž  s’   € Ø—:’:Ø5ØÐGÐHð ñ 
ô 
ˆð 	×ÒÑÔÐÝ˜Xœ]Ñ+Ô+ˆØ×Ò˜ œÐ*;Ñ<Ô<Ð<Ø×Ò˜ Ô/µ¸&ÈÐ1PÑ1PÔ1PÑQÔQÐQÐQÐQr   c                 óH  — |                       d¦  «        }|                     ¦   «          t          |j        ¦  «        }|                      |d         d¦  «         |                      |d         d¦  «         |                      d|¦  «         |                      d|¦  «         d S )NrÔ   r¾   rI   rS   rX   r»   r½   r  rï   s      r   Ú test_oauth10a_request_parametersz)AuthTest.test_oauth10a_request_parameters¨  s›   € Ø—:’:Ð?Ñ@Ô@ˆØ×ÒÑÔÐÝ˜Xœ]Ñ+Ô+ˆØ×Ò˜Ð 4Ô5°vÑ>Ô>Ð>Ø×Ò˜ Ô.°Ñ7Ô7Ð7Ø�Š�m VÑ,Ô,Ð,Ø�ŠÐ'¨Ñ0Ô0Ð0Ð0Ð0r   c                 ón   — |                       dddi¬¦  «        }|                      |j        d¦  «         d S )NzG/oauth10a/client/login_coroutine?oauth_token=zxcv&fail_in_get_user=truerû   rü   rý   ra   )ræ   rç   r„   r²   s     r   Ú*test_oauth10a_get_user_coroutine_exceptionz3AuthTest.test_oauth10a_get_user_coroutine_exception±  sF   € Ø—:’:ØUØÐGÐHð ñ 
ô 
ˆð 	×Ò˜œ¨Ñ,Ô,Ð,Ð,Ð,r   c                 ó¬   — |                       dd¬¦  «        }|                      |j        d¦  «         |                      d|j        d         ¦  «         d S )NrÕ   Frá   rã   z/oauth2/server/authorize?rä   rå   r²   s     r   Útest_oauth2_redirectzAuthTest.test_oauth2_redirect¸  sS   € Ø—:’:Ð4Àu�:ÑMÔMˆØ×Ò˜œ¨Ñ,Ô,Ð,Ø�ŠÐ1°8Ô3CÀJÔ3OÑPÔPÐPÐPÐPr   c                 óª  — |                       dd¬¦  «        }|                      |j        d¦  «         |                      d|j        d         v ¦  «         |                       dd¬¦  «        }|                      |j        d¦  «         t          |j        ¦  «        }|                      |d	         d
¦  «         |                      |d         d¦  «         d S )NrÖ   Frá   rã   z/facebook/server/authorize?rä   z /facebook/client/login?code=1234éÈ   r\   rI   Úsession_expiresÚ3600)ræ   rç   r„   r÷   ré   r	   rî   )r   r³   r+   s      r   Útest_facebook_loginzAuthTest.test_facebook_login½  sÓ   € Ø—:’:Ð6È�:ÑOÔOˆØ×Ò˜œ¨Ñ,Ô,Ð,Ø�ŠÐ5¸Ô9IÈ*Ô9UÐUÑVÔVÐVØ—:’:Ø.Àð ñ 
ô 
ˆð 	×Ò˜œ¨Ñ,Ô,Ð,Ý˜8œ=Ñ)Ô)ˆØ×Ò˜˜nÔ-¨vÑ6Ô6Ð6Ø×Ò˜Ð/Ô0°&Ñ9Ô9Ð9Ð9Ð9r   c                 ó*  — |                       |d¬¦  «        }|                      |j        d¦  «         |                      |j        d                              d¦  «        ¦  «         |                      d|j        d         |j        d         ¦  «         d S )NFrá   rã   rä   ró   rô   rõ   rö   )r   Úurlr³   s      r   Úbase_twitter_redirectzAuthTest.base_twitter_redirectÉ  sž   € à—:’:˜c°E�:Ñ:Ô:ˆØ×Ò˜œ¨Ñ,Ô,Ð,Ø�ŠØÔ˜ZÔ(×1Ò1Ø;ñô ñ	
ô 	
ð 	
ð 	�ŠØ6ØÔ˜\Ô*ØÔ˜\Ô*ñ	
ô 	
ð 	
ð 	
ð 	
r   c                 ó0   — |                       d¦  «         d S )Nr×   ©r  r9   s    r   Útest_twitter_redirectzAuthTest.test_twitter_redirectÙ  s   € Ø×"Ò"Ð#:Ñ;Ô;Ð;Ð;Ð;r   c                 ó0   — |                       d¦  «         d S )NrÙ   r  r9   s    r   Ú#test_twitter_redirect_gen_coroutinez,AuthTest.test_twitter_redirect_gen_coroutineÜ  s   € Ø×"Ò"Ð#HÑIÔIÐIÐIÐIr   c                 óB  — |                       dd¬¦  «        }|                      |j        d¦  «         |                      |j        d                              d¦  «        |j        d         ¦  «         |                      d|j        d         |j        d         ¦  «         d S )	NrØ   Frá   rã   rä   z-/twitter/server/authenticate?oauth_token=zxcvrô   rõ   rö   r²   s     r   Ú"test_twitter_authenticate_redirectz+AuthTest.test_twitter_authenticate_redirectß  s¬   € Ø—:’:Ð<Èu�:ÑUÔUˆØ×Ò˜œ¨Ñ,Ô,Ð,Ø�ŠØÔ˜ZÔ(×1Ò1Ø?ñô ð Ô˜ZÔ(ñ		
ô 	
ð 	
ð 	�ŠØ6ØÔ˜\Ô*ØÔ˜\Ô*ñ	
ô 	
ð 	
ð 	
ð 	
r   c                 óÆ   — |                       dddi¬¦  «        }|                     ¦   «          t          |j        ¦  «        }|                      |ddddœd	ddd
œ¦  «         d S )Nz&/twitter/client/login?oauth_token=zxcvrû   rü   rý   r­   rl   r®   )rL   rÅ   rM   rË   )r\   r¬   rÅ   Úusernamerì   rï   s      r   Útest_twitter_get_userzAuthTest.test_twitter_get_userï  s˜   € Ø—:’:Ø4ØÐGÐHð ñ 
ô 
ˆð 	×ÒÑÔÐÝ˜Xœ]Ñ+Ô+ˆØ×ÒØð "Ø#(Ø$ð!ð !ð
 Ø$Ø!ð	ð 	ñ	
ô 	
ð 	
ð 	
ð 	
r   c                 ó®   — |                       d¦  «        }|                     ¦   «          |                      t          |j        ¦  «        dddœ¦  «         d S )Nz'/twitter/client/show_user?name=somebodyÚSomebodyÚsomebody)r¬   rÅ   )ræ   rí   rç   r	   rî   r²   s     r   Útest_twitter_show_userzAuthTest.test_twitter_show_user  s_   € Ø—:’:ÐGÑHÔHˆØ×ÒÑÔÐØ×ÒÝ˜œÑ&Ô&°ÈJÐ(WÐ(Wñ	
ô 	
ð 	
ð 	
ð 	
r   c                 óœ   — |                       d¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         d S )Nz$/twitter/client/show_user?name=errorr°   s   error from twitter request)ræ   rç   r„   rî   r²   s     r   Útest_twitter_show_user_errorz%AuthTest.test_twitter_show_user_error  sK   € Ø—:’:ÐDÑEÔEˆØ×Ò˜œ¨Ñ,Ô,Ð,Ø×Ò˜œÐ(EÑFÔFÐFÐFÐFr   )r/   r0   r1   rß   rê   rñ   rù   rÿ   r  r  ÚunittestÚskipIfr   r
  r  r  r  r  r  r  r  r  r!  r$  r(  r*  r3   r   r   rÍ   rÍ     sx  € € € € € ðB
ð B
ð B
ðHTð Tð Tð
	=ð 	=ð 	=ð
ð 
ð 
ðRð Rð Rð1ð 1ð 1ð
ð 
ð 
ð €X„_�T˜T�\Ð#=Ñ>Ô>ð1ð 1ñ ?Ô>ð1ðRð Rð Rð1ð 1ð 1ð-ð -ð -ðQð Qð Qð

:ð 
:ð 
:ð
ð 
ð 
ð <ð <ð <ðJð Jð Jð
ð 
ð 
ð 
ð 
ð 
ð*
ð 
ð 
ðGð Gð Gð Gð Gr   rÍ   c                   ó4   — e Zd Zd„ Zej        d„ ¦   «         ZdS )ÚGoogleLoginHandlerc                 ó°   — || _         |                     d¦  «        | _        |                     d¦  «        | _        |                     d¦  «        | _        d S )Nú/client/loginú/google/oauth2/authorizeú/google/oauth2/token)r   r   Ú_OAUTH_REDIRECT_URIrD   rE   r   s     r   r   zGoogleLoginHandler.initialize  sM   € ØˆŒ	Ø#'§<¢<°Ñ#@Ô#@ˆÔ Ø$(§L¢LÐ1KÑ$LÔ$LˆÔ!Ø'+§|¢|Ð4JÑ'KÔ'KˆÔ$Ð$Ð$r   c              #   óŽ  K  — |                       dd ¦  «        }|�v|                      | j        |¦  «        V —}|                      | j                             d¦  «        |d         ¬¦  «        V —}|d         |d<   |                      |¦  «         d S |                      | j        | j        d         d         ddgdd	d
i¬¦  «         d S )Nr„   ú/google/oauth2/userinfor\   r¯   Úgoogle_oauthrL   Úprofiler[   ÚpromptÚselect_account)r‡   rˆ   rŠ   Úresponse_typer‹   )	r%   r&   r3  Úoauth2_requestr   r   r8   rT   r'   )r   r„   Úaccessr+   s       r   r-   zGoogleLoginHandler.get  sù   è è € à× Ò  ¨Ñ.Ô.ˆØÐà×6Ò6°tÔ7OÐQUÑVÔVÐVÐVˆFØ×,Ò,Ø”	×!Ò!Ð";Ñ<Ô<Ø# NÔ3ð -ñ ô ð ð ˆDð
 $*¨.Ô#9ˆD�Ñ Ø�JŠJ�tÑÔÐÐÐà×#Ò#Ø!Ô5Øœ-¨Ô7¸Ô>Ø  'Ð*Ø$Ø&Ð(8Ð9ð $ñ ô ð ð ð r   Nr.   r3   r   r   r.  r.    sC   € € € € € ðLð Lð Lð 	„]ðð ñ „]ðð ð r   r.  c                   ó   — e Zd Zd„ ZdS )ÚGoogleOAuth2AuthorizeHandlerc                 ó’   — d}|                       t          |                      d¦  «        t          |¬¦  «        ¦  «        ¦  «         d S )Núfake-authorization-coder‡   )r„   )Úredirectr   r%   rO   )r   r„   s     r   r-   z GoogleOAuth2AuthorizeHandler.get0  s?   € à(ˆØ�Š•j ×!2Ò!2°>Ñ!BÔ!BÅDÈdÀOÁOÄOÑTÔTÑUÔUÐUÐUÐUr   Nru   r3   r   r   r>  r>  /  s(   € € € € € ðVð Vð Vð Vð Vr   r>  c                   ó   — e Zd Zd„ ZdS )ÚGoogleOAuth2TokenHandlerc                 ól   — |                       d¦  «        dk    sJ ‚|                      dddœ¦  «         d S )Nr„   r@  úfake-access-tokenznever-expiresr‘   ©r%   r)   r9   s    r   r:   zGoogleOAuth2TokenHandler.post7  sM   € Ø× Ò  Ñ(Ô(Ð,EÒEÐEÐEÐEà�ŠØ0ÀÐPÐPñ	
ô 	
ð 	
ð 	
ð 	
r   Nr;   r3   r   r   rC  rC  6  s#   € € € € € ð
ð 
ð 
ð 
ð 
r   rC  c                   ó   — e Zd Zd„ ZdS )ÚGoogleOAuth2UserinfoHandlerc                 ól   — |                       d¦  «        dk    sJ ‚|                      dddœ¦  «         d S )Nr\   rE  rË   rZ   )r¬   r[   rF  r9   s    r   r-   zGoogleOAuth2UserinfoHandler.get@  sC   € Ø× Ò  Ñ0Ô0Ð4GÒGÐGÐGÐGà�Š˜UÐ->Ð?Ð?Ñ@Ô@Ð@Ð@Ð@r   Nru   r3   r   r   rH  rH  ?  s(   € € € € € ðAð Að Að Að Ar   rH  c                   ó   — e Zd Zd„ Zd„ ZdS )ÚGoogleOAuth2Testc                 óˆ   — t          dt          t          | ¬¦  «        fdt          fdt          fdt
          fgdddœ¬	¦  «        S )
Nr0  rÐ   r1  r2  r5  Úfake_google_client_idÚfake_google_client_secretrK   )r6  )r   r.  rO   r>  rC  rH  r9   s    r   rß   zGoogleOAuth2Test.get_appG  s`   € Ýð !Õ"4µdÀ°o±o´oÐFà+Õ-IÐJØ'Õ)AÐBØ*Õ,GÐHðð /Ø5ðð ð
ñ 
ô 
ð 	
r   c                 óˆ   — |                       d¦  «        }|                      ddddœt          |j        ¦  «        ¦  «         d S )Nr0  rË   rZ   rE  )r¬   r[   r\   )ræ   ÚassertDictEqualr	   rî   r²   s     r   Útest_google_loginz"GoogleOAuth2Test.test_google_loginW  sW   € Ø—:’:˜oÑ.Ô.ˆØ×ÒàØ*Ø 3ðð õ
 ˜œÑ&Ô&ñ	
ô 	
ð 	
ð 	
ð 	
r   N)r/   r0   r1   rß   rQ  r3   r   r   rK  rK  F  s2   € € € € € ð
ð 
ð 
ð 	
ð 	
ð 	
ð 	
ð 	
r   rK  )4r+  Útornado.authr   r   r   r   r   r   Útornado.escaper	   Útornador
   Útornado.httpclientr   Útornado.httputilr   Útornado.logr   Útornado.testingr   r   Útornado.webr   r   r   r   ÚImportErrorr   r5   r=   r_   rf   rq   rx   r{   r   r�   r”   r—   rŸ   r¤   r§   rª   rµ   r¸   rÉ   rÍ   r.  r>  rC  rH  rK  r3   r   r   ú<module>r[     sœ  ðð €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 'Ð &Ð &Ð &Ð &Ð &Ø Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >ðØÐÐÐÐÐÐøØð ð ð Ø€D€D€Dðøøøðð ð ð ð ˜~¨{ñ ô ð ð$$ð $ð $ð $ð $ nñ $ô $ð $ð-ð -ð -ð -ð -˜~¨zñ -ô -ð -ð>,ð ,ð ,ð ,ð ,Ð(@ñ ,ô ,ð ,ð"ð ð ð ð ¨>¸:ñ ô ð ð ?ð ?ð ?ð ?ð ? nñ ?ô ?ð ?ð
?ð ?ð ?ð ?ð ? ^ñ ?ô ?ð ?ð
ð ð ð ð ˜~¨{ñ ô ð ðð ð ð ð  Ð1Cñ ô ð ð0?ð ?ð ?ð ?ð ? ~ñ ?ô ?ð ?ð
ð ð ð ð ˜nñ ô ð ð
	,ð 	,ð 	,ð 	,ð 	,˜>¨<ñ 	,ô 	,ð 	,ð	(ð 	(ð 	(ð 	(ð 	(Ð 4ñ 	(ô 	(ð 	(ð+ð +ð +ð +ð +Ð';ñ +ô +ð +ð	,ð 	,ð 	,ð 	,ð 	,Ð,@ñ 	,ô 	,ð 	,ð"ð "ð "ð "ð "Ð#7ñ "ô "ð "ð&Oð Oð Oð Oð O nñ Oô Oð Oð
Qð Qð Qð Qð Q >ñ Qô Qð Qð	8ð 	8ð 	8ð 	8ð 	8¨Nñ 	8ô 	8ð 	8ð~Gð ~Gð ~Gð ~Gð ~GÐ ñ ~Gô ~Gð ~GðBð ð ð ð ˜Ð):ñ ô ð ð<Vð Vð Vð Vð V >ñ Vô Vð Vð
ð 
ð 
ð 
ð 
˜~ñ 
ô 
ð 
ðAð Að Að Að A .ñ Aô Að Að
ð 
ð 
ð 
ð 
Ð(ñ 
ô 
ð 
ð 
ð 
s   ÁA ÁAÁA