§
    #x»jµA  ã                   óN  — d Z ddlZddlmc mZ ddlZddlZddl	m
Z
mZ ddlmZmZmZmZmZmZ ddlmZmZ ddl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"m#Z#m$Z$ dd	l%m&Z&m'Z'  G d
„ d¦  «        Z( G d„ d¦  «        Z) G d„ d¦  «        Z* G d„ d¦  «        Z+ G d„ d¦  «        Z,dS )z–
Unit tests for FreeExile Account Management, Anti-Bot Captcha, OAuth, and Email Verification System.
Following Autonomous TDD Closed-Loop standards.
é    N)ÚDictÚAny)ÚAccountÚAccountStatusÚRoleÚOAuthProviderTypeÚOAuthIdentityÚAuthTokenPair)ÚPasswordHasherÚTokenService)ÚCaptchaEngineÚCaptchaTypeÚCaptchaChallengeÚRateLimiter)ÚEmailVerificationServiceÚMockEmailSenderÚVerificationCode)ÚOAuthServiceÚGoogleOAuthProviderÚAppleOAuthProviderÚFacebookOAuthProviderÚOAuthUserProfile)ÚAuthServiceÚAccountRepositoryc                   ó&   — e Zd Zdd„Zdd„Zdd„ZdS )ÚTestPasswordAndCryptoÚreturnNc           	      ó‚  — t          ¦   «         }d}|                     |¦  «        }||k    }|sÂt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d }|j
        }d	} ||¦  «        }|sžd
dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	t          t          j	        |	¦  «        ¦  «        ‚d x}x}}|j        } |||¦  «        }d}
||
u }|�s9t          j        d|fd||
f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}}
|j        }d} |||¦  «        }d}||u }
|
�st          j        d|
fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}x}
}d S )NzSavageExile!2026_Secure©ú!=)z%(py0)s != %(py2)sÚhashedÚraw_pwd)Úpy0Úpy2zassert %(py4)sÚpy4zpbkdf2_sha256$zLassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}(%(py4)s)
}©r#   r$   r%   Úpy6T©Úis)z^%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.verify_password
}(%(py3)s, %(py4)s)
} is %(py9)sÚhasher)r#   r$   Úpy3r%   r'   Úpy9úassert %(py11)sÚpy11ÚWrongPassword123F)z_%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.verify_password
}(%(py4)s, %(py5)s)
} is %(py10)s)r#   r$   r%   Úpy5Úpy7Úpy10úassert %(py12)sÚpy12)r   Úhash_passwordÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚ
startswithÚverify_password)Úselfr*   r"   r!   Ú@py_assert1Ú@py_format3Ú@py_format5Ú@py_assert3Ú@py_assert5Ú@py_format7Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12Ú@py_assert6Ú@py_assert9Ú@py_format11Ú@py_format13s                     ú<C:\Projects\FreeExile\tests\unit\test_account_auth_system.pyÚ&test_password_hashing_and_verificationz<TestPasswordAndCrypto.test_password_hashing_and_verification)   s´  € ÝÑ!Ô!ˆØ+ˆØ×%Ò% gÑ.Ô.ˆà˜Ò Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆv˜Ð Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆvÑ Ô Ð Õ Ô ˆvÑ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˜Ñ Ô Ð Õ Ô ˜Ñ Ô Ð Ð Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð ØÔ Ð2Ð!1Ð2Ð Ð Ð!1Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ˆvÑ2Ô2Ð2Õ2Ô2ˆvÑ2Ô2Ð2Ð2Õ2Ô2Ð Ñ2Ô2Õ2Ô2Ð!1Ñ2Ô2Õ2Ô2Ð2Ñ2Ô2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ØÔ%Ð>Ð%Ð% g¨vÑ6Ô6Ð>¸$Ð>Ð6¸$Ð>Ð>Ð>Ñ>Õ>Ô>Ð>Ð>Ð>Ð>Ð6¸$Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>ˆvÑ>Ô>Ð>Õ>Ô>ˆvÑ>Ô>Ð>Ð>Õ>Ô>Ð%Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô> gÑ>Ô>Ð>Õ>Ô> gÑ>Ô>Ð>Ð>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>¨vÑ>Ô>Ð>Õ>Ô>¨vÑ>Ô>Ð>Ð>Õ>Ô>Ð6Ñ>Ô>Õ>Ô>¸$Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ØÔ%ÐJÐ&8ÐJÐ%Ð%Ð&8¸&ÑAÔAÐJÀUÐJÐAÀUÐJÐJÐJÑJÕJÔJÐJÐJÐJÐJÐAÀUÐJÑJÔJÐJÕJÔJÑJÔJÐJÐJÕJÔJˆvÑJÔJÐJÕJÔJˆvÑJÔJÐJÐJÕJÔJÐ%ÑJÔJÕJÔJÐ&8ÑJÔJÐJÕJÔJÑJÔJÐJÐJÕJÔJ¸&ÑJÔJÐJÕJÔJ¸&ÑJÔJÐJÐJÕJÔJÐAÑJÔJÕJÔJÀUÑJÔJÐJÐJÑJÐJÐJÐJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJó    c                 ód	  — t          d¬¦  «        }|                     ddgd¬¦  «        }|j        }d }||u}|sªt          j        d|fd||f¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}x}}|j        }d }||u}|sªt          j        d|fd||f¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}x}}|                     |j        ¦  «        }d }	||	u}|s—t          j        d|fd||	f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        dœz  }
dd|
iz  }t          t          j
        |¦  «        ¦  «        ‚d x}}	|d         }d}||k    }	|	slt          j        d|	fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}x}	}|d         }d}||k    }	|	slt          j        d|	fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}x}	}d}|d         }||v }	|	slt          j        d|	fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}x}	}d S )NÚ3secret_test_key_freeexile_2026_super_secure_32bytes©Ú
secret_keyÚacc_001Úplayerzwarrior@freeexile.io©Ú
account_idÚrolesÚemail©úis not©z8%(py2)s
{%(py2)s = %(py0)s.access_token
} is not %(py5)sÚ
token_pair©r#   r$   r0   úassert %(py7)sr1   ©z9%(py2)s
{%(py2)s = %(py0)s.refresh_token
} is not %(py5)si„  ©ú==)z:%(py2)s
{%(py2)s = %(py0)s.expires_in_seconds
} == %(py5)s©z%(py0)s is not %(py3)sÚclaims©r#   r+   úassert %(py5)sr0   Úsub)z%(py1)s == %(py4)s)Úpy1r%   zassert %(py6)sr'   r[   rZ   ©Úin)z%(py1)s in %(py4)s)r   Úgenerate_token_pairÚaccess_tokenr6   r7   r8   r9   r:   r;   r<   r=   Úrefresh_tokenÚexpires_in_secondsÚverify_access_token)r@   Útoken_servicer_   rA   Ú@py_assert4rD   Ú@py_format6Ú@py_format8rf   Ú@py_assert2Ú@py_format4Ú@py_assert0rC   rF   s                 rO   Ú(test_jwt_token_generation_and_validationz>TestPasswordAndCrypto.test_jwt_token_generation_and_validation3   s®  € Ý$Ð0eÐfÑfÔfˆØ"×6Ò6Ø Ø�*Ø(ð 7ñ 
ô 
ˆ
ð Ô&Ð2¨dÐ2Ð&¨dÐ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð&¨dÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ˆzÑ2Ô2Ð2Õ2Ô2ˆzÑ2Ô2Ð2Ð2Õ2Ô2Ð&Ñ2Ô2Õ2Ô2¨dÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ØÔ'Ð3¨tÐ3Ð'¨tÐ3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð'¨tÐ3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3ˆzÑ3Ô3Ð3Õ3Ô3ˆzÑ3Ô3Ð3Ð3Õ3Ô3Ð'Ñ3Ô3Õ3Ô3¨tÑ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ØÔ,Ð3°Ð3Ð,°Ò3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð,°Ð3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3ˆzÑ3Ô3Ð3Õ3Ô3ˆzÑ3Ô3Ð3Ð3Õ3Ô3Ð,Ñ3Ô3Õ3Ô3°Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3à×2Ò2°:Ô3JÑKÔKˆØ!Ð!ˆv˜TÐ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆv˜TÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆvÑ!Ô!Ð!Õ!Ô!ˆvÑ!Ô!Ð!Ð!Õ!Ô!˜TÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ø�eŒ}Ð) 	Ð)ˆ} 	Ò)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)ˆ} 	Ð)Ñ)Ô)Õ)Ô)ˆ}Ñ)Ô)Õ)Ô) 	Ñ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø�gŒÐ8Ð"8Ð8ˆÐ"8Ò8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8ˆÐ"8Ð8Ñ8Ô8Õ8Ô8ˆÑ8Ô8Õ8Ô8Ð"8Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ØÐ*˜6 'œ?Ð*ˆx˜?Ð*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*ˆx˜?Ð*Ñ*Ô*Õ*Ô*ˆxÑ*Ô*Õ*Ô*˜?Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*rQ   c           	      óz  — t          d¬¦  «        }|                     ddgd¬¦  «        }|                     |j        ¦  «         |j        }|j        } ||¦  «        }d}||u }|�st          j        d|fd	||f¦  «        d
t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd
t          j
        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}x}x}}|                     |j        ¦  «        }
d }|
|u }|s—t          j        d|fd|
|f¦  «        dt          j        ¦   «         v st          j	        |
¦  «        rt          j
        |
¦  «        ndt          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d S )NrS   rT   Úacc_002rW   zhunter@freeexile.iorX   Tr(   )zy%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.is_token_revoked
}(%(py5)s
{%(py5)s = %(py3)s.access_token
})
} is %(py10)srr   r_   )r#   r$   r+   r0   r1   r2   r3   r4   ©z%(py0)s is %(py3)srf   rg   rh   r0   )r   rm   Úrevoke_tokenrn   Úis_token_revokedr6   r7   r8   r9   r:   r;   r<   r=   rq   )r@   rr   r_   rA   rs   rK   rL   rG   rM   rN   rf   rv   rw   rt   s                 rO   Útest_token_revocation_blacklistz5TestPasswordAndCrypto.test_token_revocation_blacklistE   s�  € Ý$Ð0eÐfÑfÔfˆØ"×6Ò6Ø Ø�*Ø'ð 7ñ 
ô 
ˆ
ð 	×"Ò" :Ô#:Ñ;Ô;Ð;ØÔ-ÐN¨jÔ.EÐNÐ-Ð-Ð.EÑFÔFÐNÈ$ÐNÐFÈ$ÐNÐNÐNÑNÕNÔNÐNÐNÐNÐNÐFÈ$ÐNÑNÔNÐNÕNÔNÑNÔNÐNÐNÕNÔNˆ}ÑNÔNÐNÕNÔNˆ}ÑNÔNÐNÐNÕNÔNÐ-ÑNÔNÐNÕNÔNÑNÔNÐNÐNÕNÔN¨jÑNÔNÐNÕNÔN¨jÑNÔNÐNÐNÕNÔNÐ.EÑNÔNÕNÔNÐFÑNÔNÕNÔNÈ$ÑNÔNÐNÐNÑNÐNÐNÐNÐNÐNÑNÐNÕNÕNÔNÐNÑNÔNÑNÔNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNØ×2Ò2°:Ô3JÑKÔKˆØÐˆv˜ˆ~ÐÐÐÕÔÐÐÐÐˆv˜ÐÑÔÐÕÔÑÔÐÐÕÔˆvÑÔÐÕÔˆvÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐrQ   ©r   N)Ú__name__Ú
__module__Ú__qualname__rP   ry   r   © rQ   rO   r   r   (   sT   € € € € € ðKð Kð Kð Kð+ð +ð +ð +ð$ð ð ð ð ð rQ   r   c                   ó.   — e Zd Zdd„Zdd„Zdd„Zdd„ZdS )ÚTestAntiBotCaptchaEnginer   Nc                 ó„  — t          d¬¦  «        }|                     ¦   «         }|j        }d }||u}|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}x}}|j        }t          j        }||k    }|sòt          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚d x}x}}g }d}|j        }||v }|}|s d}|j        }||v }|}|sd}|j        }||v }|}|�st          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |�s>t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |sžt          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }d d!|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}x}x}x}x}x}x}x}x}x}}|j        }d }||u}|sªt          j        d|fd"||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}x}}|j                             ¦   «         }t'          |d#         ¦  «        |d         t'          |d$         ¦  «        }}}|dk    r||z   n|dk    r||z
  n||z  }|                     |j        t+          |¦  «        |j        |j        ¬%¦  «        \  } }!d&}| |u }|s—t          j        d'|fd(| |f¦  «        d)t          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        nd)t          j        |¦  «        d*œz  }"d+d,|"iz  }t          t          j
        |¦  «        ¦  «        ‚d x}}d-}|!|k    }|s—t          j        d	|fd.|!|f¦  «        d/t          j        ¦   «         v st          j        |!¦  «        rt          j        |!¦  «        nd/t          j        |¦  «        d*œz  }"d+d,|"iz  }t          t          j
        |¦  «        ¦  «        ‚d x}}|                     |j        t+          |¦  «        |j        |j        ¬%¦  «        \  }#}$d0}|#|u }|s—t          j        d'|fd(|#|f¦  «        d1t          j        ¦   «         v st          j        |#¦  «        rt          j        |#¦  «        nd1t          j        |¦  «        d*œz  }"d+d,|"iz  }t          t          j
        |¦  «        ¦  «        ‚d x}}d2}|$j        } |¦   «         }||v }|s½t          j        d|fd3||f¦  «        t          j        |¦  «        d4t          j        ¦   «         v st          j        |$¦  «        rt          j        |$¦  «        nd4t          j        |¦  «        t          j        |¦  «        d5œz  }d6d|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}x}x}}d S )7NÚcaptcha_test_secret_123©Úhmac_secretr\   )z8%(py2)s
{%(py2)s = %(py0)s.challenge_id
} is not %(py5)sÚ	challenger`   ra   r1   rc   )zN%(py2)s
{%(py2)s = %(py0)s.captcha_type
} == %(py6)s
{%(py6)s = %(py4)s.MATH
}r   r&   úassert %(py8)sÚpy8ú+ú-Ú*rk   )z0%(py3)s in %(py7)s
{%(py7)s = %(py5)s.question
})r+   r0   r1   z%(py9)sr,   )z4%(py12)s in %(py16)s
{%(py16)s = %(py14)s.question
})r4   Úpy14Úpy16z%(py18)sÚpy18)z4%(py21)s in %(py25)s
{%(py25)s = %(py23)s.question
})Úpy21Úpy23Úpy25z%(py27)sÚpy27é   zassert %(py30)sÚpy30)z5%(py2)s
{%(py2)s = %(py0)s.signature
} is not %(py5)sr   é   ©Úchallenge_idÚuser_answerÚ	signatureÚ
expires_atTr(   r|   Úis_validrg   rh   r0   ÚOK©z%(py0)s == %(py3)sÚmsgFÚis_valid_replayzalready used©zD%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.lower
}()
}Ú
msg_replay©rj   r+   r0   r1   úassert %(py9)s)r   Úgenerate_math_challengerœ   r6   r7   r8   r9   r:   r;   r<   r=   Úcaptcha_typer   ÚMATHÚquestionÚappendÚ_format_booloprž   ÚsplitÚintÚverify_math_challengeÚstrÚexpires_at_msÚlower)%r@   Úenginer‹   rA   rs   rD   rt   ru   rE   rF   Ú@py_format9rv   rK   rx   Ú@py_assert11Ú@py_assert15Ú@py_assert13Ú@py_assert20Ú@py_assert24Ú@py_assert22rI   Ú@py_format17Ú@py_format19Ú@py_format26Ú@py_format28Ú@py_format29Ú@py_format31ÚpartsÚaÚopÚbÚansr    r£   rw   r¤   r¦   s%                                        rO   Ú-test_math_captcha_generation_and_verificationzFTestAntiBotCaptchaEngine.test_math_captcha_generation_and_verificationT   s@
  € ÝÐ+DÐEÑEÔEˆØ×2Ò2Ñ4Ô4ˆ	àÔ%Ð1¨TÐ1Ð%¨TÐ1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð%¨TÐ1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1ˆyÑ1Ô1Ð1Õ1Ô1ˆyÑ1Ô1Ð1Ð1Õ1Ô1Ð%Ñ1Ô1Õ1Ô1¨TÑ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ØÔ%Ð9­Ô)9Ð9Ð%Ð)9Ò9Ð9Ð9Ð9Õ9Ô9Ð9Ð9Ð9Ð9Ð%Ð)9Ð9Ñ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9ˆyÑ9Ô9Ð9Õ9Ô9ˆyÑ9Ô9Ð9Ð9Õ9Ô9Ð%Ñ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9­Ñ9Ô9Ð9Õ9Ô9­Ñ9Ô9Ð9Ð9Õ9Ô9Ð)9Ñ9Ô9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9ØbÐbˆsÐb�iÔ(ÐbˆsÐ(Ð(ÐbÐbÐbÐbÐb¨CÐb°9Ô3EÐb¨CÐ3EÐ,EÐbÐbÐbÐbÐbÈÐbÐPYÔPbÐbÈÐPbÐIbÐbÐbÐbÐbÑbÕbÔbÐbÐbÐbÐbˆsÐ(ÐbÑbÔbÕbÔbˆsÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔb�iÑbÔbÐbÕbÔb�iÑbÔbÐbÐbÕbÔbÐ(ÑbÔbÐbÐbÑbÐbÐbÐbÐbÐbÑbÐbÐb×bÒbÐbÑbÔbÐbÐbÑbÕbÔbÐbÐbÐbÐb¨CÐ3EÐbÑbÔbÕbÔb¨CÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔb°9ÑbÔbÐbÕbÔb°9ÑbÔbÐbÐbÕbÔbÐ3EÑbÔbÐbÐbÑbÐbÐbÐbÐbÐbÑbÐbÐb×bÒbÐbÑbÔbÐbÐbÐbÕbÔbÐbÐbÐbÐbÈÐPbÐbÑbÔbÕbÔbÈÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔbÐPYÑbÔbÐbÕbÔbÐPYÑbÔbÐbÐbÕbÔbÐPbÑbÔbÐbÐbÑbÐbÐbÐbÐbÐbÑbÐbÐb×bÒbÐbÑbÔbÐbÕbÔbÐbÐbÑbÔbÐbÑbÐbÐbÐbÐbÐbÑbÐbÕbÕbÔbÐbÑbÔbÑbÔbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbØÔ"Ð.¨$Ð.Ð"¨$Ð.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð"¨$Ð.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.ˆyÑ.Ô.Ð.Õ.Ô.ˆyÑ.Ô.Ð.Ð.Õ.Ô.Ð"Ñ.Ô.Õ.Ô.¨$Ñ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ð Ô"×(Ò(Ñ*Ô*ˆÝ�u˜Q”x‘=”= %¨¤(­C°°a´©M¬Mˆqˆ2ˆØ˜S’y�yˆa�!‰eˆe°°c²	°	 q¨1¡u u¸qÀ1¹uˆð ×4Ò4Ø"Ô/Ý˜C™œØÔ)Ø Ô.ð	 5ñ 
ô 
‰ˆ�#ð  Ðˆx˜4ÐÐÐÐÕÔÐÐÐÐˆx˜4ÐÑÔÐÕÔÑÔÐÐÕÔˆxÑÔÐÕÔˆxÑÔÐÐÕÔ˜4ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆs�dŠ{ÐÐÐÕÔÐÐÐÐˆs�dÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐð '-×&BÒ&BØ"Ô/Ý˜C™œØÔ)Ø Ô.ð	 'Cñ '
ô '
Ñ#ˆ˜ð #(Ð'ˆ %Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ %Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆÑ'Ô'Ð'Õ'Ô'ˆÑ'Ô'Ð'Ð'Õ'Ô' %Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'ØÐ3 Ô!1Ð3Ð!1Ð!1Ñ!3Ô!3Ð3ˆ~Ð!3Ð3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3ˆ~Ð!3Ð3Ñ3Ô3Õ3Ô3ˆ~Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3 Ñ3Ô3Ð3Õ3Ô3 Ñ3Ô3Ð3Ð3Õ3Ô3Ð!1Ñ3Ô3Õ3Ô3Ð!3Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3rQ   c                 óô  — t          d¬¦  «        }|                     ¦   «         }|                     |j        d|j        |j        ¬¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d}	|j        }
 |
¦   «         }|	|v }|s½t          j        d|fd|	|f¦  «        t          j        |	¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}x}
}|                     |j        dd|j        ¬¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d}	|j        }
 |
¦   «         }|	|v }|s½t          j        d|fd|	|f¦  «        t          j        |	¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}x}
}d S )Nrˆ   r‰   Ú999999r›   Fr(   r|   r    rg   rh   r0   Ú	incorrectrk   r¥   r£   r§   r¨   r,   Ú10Útampered_fake_signatureÚis_valid_tamperrž   Ú
msg_tamper)r   r©   r±   rœ   rž   r³   r6   r7   r8   r9   r:   r;   r<   r=   r´   )r@   rµ   r‹   r    r£   rv   rA   rw   rt   rx   rs   rK   ru   rI   rÎ   rÏ   s                   rO   Ú+test_math_captcha_wrong_answer_or_tamperingzDTestAntiBotCaptchaEngine.test_math_captcha_wrong_answer_or_tamperingv   s  € ÝÐ+DÐEÑEÔEˆØ×2Ò2Ñ4Ô4ˆ	ð ×4Ò4Ø"Ô/Ø ØÔ)Ø Ô.ð	 5ñ 
ô 
‰ˆ�#ð !Ð ˆx˜5Ð Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆx˜5Ð Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆxÑ Ô Ð Õ Ô ˆxÑ Ô Ð Ð Õ Ô ˜5Ñ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð ØÐ)˜cœiÐ)˜i˜i™kœkÐ)ˆ{˜kÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)ˆ{˜kÐ)Ñ)Ô)Õ)Ô)ˆ{Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)˜cÑ)Ô)Ð)Õ)Ô)˜cÑ)Ô)Ð)Ð)Õ)Ô)˜iÑ)Ô)Õ)Ô)˜kÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ð '-×&BÒ&BØ"Ô/ØØ/Ø Ô.ð	 'Cñ '
ô '
Ñ#ˆ˜ð #(Ð'ˆ %Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ %Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆÑ'Ô'Ð'Õ'Ô'ˆÑ'Ô'Ð'Ð'Õ'Ô' %Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'ØÐ0˜jÔ.Ð0Ð.Ð.Ñ0Ô0Ð0ˆ{Ð0Ð0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0ˆ{Ð0Ð0Ñ0Ô0Õ0Ô0ˆ{Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0˜jÑ0Ô0Ð0Õ0Ô0˜jÑ0Ô0Ð0Ð0Õ0Ô0Ð.Ñ0Ô0Õ0Ô0Ð0Ñ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0rQ   c                 óÞ  — t          d¬¦  «        }|                     d¬¦  «        }|j        }t          j        }||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndt          j
        |¦  «        d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}|                     |j        d¬¦  «        }d }	||	u}|s—t          j        d|fd||	f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |	¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚d x}}	|                     |j        |d|j        |j        ¬¦  «        \  }}d}	||	u }|s—t          j        d|fd||	f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |	¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚d x}}	d}	||	k    }|s—t          j        d|fd||	f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |	¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚d x}}	d S )Nrˆ   r‰   rš   )Ú
difficultyrc   )zM%(py2)s
{%(py2)s = %(py0)s.captcha_type
} == %(py6)s
{%(py6)s = %(py4)s.POW
}Úpow_challenger   r&   rŒ   r�   r\   re   Únoncerg   rh   r0   )ÚseedrÔ   rÒ   rž   rŸ   Tr(   r|   r    r¡   r¢   r£   )r   Úgenerate_pow_challengerª   r   ÚPOWr6   r7   r8   r9   r:   r;   r<   r=   Ú	solve_powrÕ   Úverify_pow_challengerž   r³   )r@   rµ   rÓ   rA   rE   rD   rF   r¶   rÔ   rv   rw   rt   r    r£   s                 rO   Útest_proof_of_work_challengez5TestAntiBotCaptchaEngine.test_proof_of_work_challengeŽ   sè  € ÝÐ+DÐEÑEÔEˆà×5Ò5ÀÐ5ÑCÔCˆØÔ)Ð<­[¬_Ð<Ð)¨_Ò<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð)¨_Ð<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<ˆ}Ñ<Ô<Ð<Õ<Ô<ˆ}Ñ<Ô<Ð<Ð<Õ<Ô<Ð)Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<­[Ñ<Ô<Ð<Õ<Ô<­[Ñ<Ô<Ð<Ð<Õ<Ô<¨_Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ð × Ò  Ô!3ÀÐ ÑBÔBˆØ Ð ˆu˜DÐ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆu˜DÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆuÑ Ô Ð Õ Ô ˆuÑ Ô Ð Ð Õ Ô ˜DÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð ð ×3Ò3ØÔ#ØØØ#Ô-Ø$Ô2ð 4ñ 
ô 
‰ˆ�#ð  Ðˆx˜4ÐÐÐÐÕÔÐÐÐÐˆx˜4ÐÑÔÐÕÔÑÔÐÐÕÔˆxÑÔÐÕÔˆxÑÔÐÐÕÔ˜4ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆs�dŠ{ÐÐÐÕÔÐÐÐÐˆs�dÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐrQ   c                 ó	  — t          dd¬¦  «        }d}|j        } ||¦  «        }d}||u }|sût          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}}|j        } ||¦  «        }d}||u }|sût          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}}|j        } ||¦  «        }d}||u }|sût          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}}|j        } ||¦  «        }d}||u }|sût          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}}d S )Né   g      $@)Úmax_requestsÚwindow_secondsz192.168.1.50Tr(   )zP%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.is_allowed
}(%(py3)s)
} is %(py8)sÚlimiterÚ	client_ip)r#   r$   r+   r0   r�   úassert %(py10)sr2   F)
r   Ú
is_allowedr6   r7   r8   r9   r:   r;   r<   r=   )	r@   rß   rà   rA   rs   rH   rK   r¶   rM   s	            rO   Ú test_rate_limiter_sliding_windowz9TestAntiBotCaptchaEngine.test_rate_limiter_sliding_window£   s#  € Ý¨1¸TÐBÑBÔBˆØ"ˆ	àÔ!Ð4Ð!Ð! )Ñ,Ô,Ð4°Ð4Ð,°Ð4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð,°Ð4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4ˆwÑ4Ô4Ð4Õ4Ô4ˆwÑ4Ô4Ð4Ð4Õ4Ô4Ð!Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4 )Ñ4Ô4Ð4Õ4Ô4 )Ñ4Ô4Ð4Ð4Õ4Ô4Ð,Ñ4Ô4Õ4Ô4°Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ØÔ!Ð4Ð!Ð! )Ñ,Ô,Ð4°Ð4Ð,°Ð4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð,°Ð4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4ˆwÑ4Ô4Ð4Õ4Ô4ˆwÑ4Ô4Ð4Ð4Õ4Ô4Ð!Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4 )Ñ4Ô4Ð4Õ4Ô4 )Ñ4Ô4Ð4Ð4Õ4Ô4Ð,Ñ4Ô4Õ4Ô4°Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ØÔ!Ð4Ð!Ð! )Ñ,Ô,Ð4°Ð4Ð,°Ð4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð,°Ð4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4ˆwÑ4Ô4Ð4Õ4Ô4ˆwÑ4Ô4Ð4Ð4Õ4Ô4Ð!Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4 )Ñ4Ô4Ð4Õ4Ô4 )Ñ4Ô4Ð4Ð4Õ4Ô4Ð,Ñ4Ô4Õ4Ô4°Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4àÔ!Ð5Ð!Ð! )Ñ,Ô,Ð5°Ð5Ð,°Ð5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð,°Ð5Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5ˆwÑ5Ô5Ð5Õ5Ô5ˆwÑ5Ô5Ð5Ð5Õ5Ô5Ð!Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5 )Ñ5Ô5Ð5Õ5Ô5 )Ñ5Ô5Ð5Ð5Õ5Ô5Ð,Ñ5Ô5Õ5Ô5°Ñ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5rQ   r€   )r�   r‚   rƒ   rÈ   rÐ   rÚ   rã   r„   rQ   rO   r†   r†   S   se   € € € € € ð 4ð  4ð  4ð  4ðD1ð 1ð 1ð 1ð0ð ð ð ð*6ð 6ð 6ð 6ð 6ð 6rQ   r†   c                   ó&   — e Zd Zdd„Zdd„Zdd„ZdS )ÚTestEmailVerificationServicer   Nc                 óš  — t          ¦   «         }t          |dd¬¦  «        }d}|                     |d¬¦  «        }|j        }t	          |¦  «        }d}||k    }|�st          j        d|fd	||f¦  «        d
t          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nd
dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        t          j
        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚d x}x}x}}|j        }|j        } |¦   «         }|sžddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        t          j
        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}|j        }t	          |¦  «        }d}||k    }|�st          j        d|fd||f¦  «        d
t          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nd
dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        t          j
        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚d x}x}x}}|j        }|j        d         d         }||v }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}|                     ||j        ¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dœz  }d d!|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d"}||k    }|s—t          j        d|fd#||f¦  «        d$t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd$t          j
        |¦  «        dœz  }d d!|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}|                     ||j        ¦  «        \  }}d%}||u }|s—t          j        d|fd||f¦  «        d&t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd&t          j
        |¦  «        dœz  }d d!|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}d S )'Né,  é<   ©Úemail_senderÚcode_ttl_secondsÚcooldown_secondszexile_survivor@freeexile.ioÚacc_999©r[   rY   é   rc   )zJ%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.code
})
} == %(py8)sÚlenÚ	code_info)r#   rj   r+   r0   r�   rá   r2   z\assert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.code
}.isdigit
}()
}r&   r˜   )zS%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.sent_messages
})
} == %(py8)sÚsenderr   Úbodyrk   )z,%(py2)s
{%(py2)s = %(py0)s.code
} in %(py5)sr`   ra   r1   Tr(   r|   r    rg   rh   r0   r¡   r¢   r£   FÚis_valid_reused)r   r   Úsend_activation_emailÚcoderð   r6   r7   r8   r9   r:   r;   r<   r=   ÚisdigitÚsent_messagesÚverify_code)r@   rò   Úservicer[   rñ   rv   rs   rH   rK   r¶   rM   rA   rD   rE   rF   rt   ru   r    r£   rw   rô   Ú_s                         rO   Ú,test_code_generation_dispatch_and_activationzITestEmailVerificationService.test_code_generation_dispatch_and_activation¯   sü  € Ý Ñ"Ô"ˆÝ*ØØ Øð
ñ 
ô 
ˆð .ˆØ×1Ò1¸È)Ð1ÑTÔTˆ	Ø”>Ð'�s�>Ñ"Ô"Ð' aÐ'Ð" aÒ'Ð'Ð'Ñ'Õ'Ô'Ð'Ð'Ð'Ð'Ð" aÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�sÑ'Ô'Ð'Õ'Ô'�sÑ'Ô'Ð'Ð'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�9Ñ'Ô'Ð'Õ'Ô'�9Ñ'Ô'Ð'Ð'Õ'Ô'�>Ñ'Ô'Õ'Ô'Ð"Ñ'Ô'Õ'Ô' aÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØŒ~Ð'ˆ~Ô%Ð'Ð%Ð%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆyÑ'Ô'Ð'Õ'Ô'ˆyÑ'Ô'Ð'Ð'Õ'Ô'ˆ~Ñ'Ô'Õ'Ô'Ð%Ñ'Ô'Õ'Ô'Ð'Ñ'Ô'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÔ'Ð-�sÐ'Ñ(Ô(Ð-¨AÐ-Ð(¨AÒ-Ð-Ð-Ñ-Õ-Ô-Ð-Ð-Ð-Ð-Ð(¨AÐ-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-�sÑ-Ô-Ð-Õ-Ô-�sÑ-Ô-Ð-Ð-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-�6Ñ-Ô-Ð-Õ-Ô-�6Ñ-Ô-Ð-Ð-Õ-Ô-Ð'Ñ-Ô-Õ-Ô-Ð(Ñ-Ô-Õ-Ô-¨AÑ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØŒ~Ð@ Ô!5°aÔ!8¸Ô!@Ð@ˆ~Ð!@Ð@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@ˆ~Ð!@Ð@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@ˆyÑ@Ô@Ð@Õ@Ô@ˆyÑ@Ô@Ð@Ð@Õ@Ô@ˆ~Ñ@Ô@Õ@Ô@Ð!@Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@ð  ×+Ò+¨E°9´>ÑBÔB‰ˆ�#ØÐˆx˜4ÐÐÐÐÕÔÐÐÐÐˆx˜4ÐÑÔÐÕÔÑÔÐÐÕÔˆxÑÔÐÕÔˆxÑÔÐÐÕÔ˜4ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆs�dŠ{ÐÐÐÕÔÐÐÐÐˆs�dÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐð %×0Ò0°¸	¼ÑGÔGÑˆ˜Ø"'Ð'ˆ %Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ %Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆÑ'Ô'Ð'Õ'Ô'ˆÑ'Ô'Ð'Ð'Õ'Ô' %Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'rQ   c                 ó8  — t          ¦   «         }t          |dd¬¦  «        }d}|                     |d¬¦  «         |                     |¦  «        \  }}d}||u }|s—t	          j        d|fd	||f¦  «        d
t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd
t	          j	        |¦  «        dœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚d x}}d}||k    }|s—t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚d x}}d S )Nrç   rè   ré   zcooldown_test@freeexile.ioÚacc_100rî   Fr(   r|   Ú
can_resendrg   rh   r0   r   )ú>)z%(py0)s > %(py3)sÚremaining_cd)r   r   rõ   rÿ   r6   r7   r8   r9   r:   r;   r<   r=   )
r@   rò   rú   r[   rÿ   r  rv   rA   rw   rt   s
             rO   Ú test_resend_cooldown_enforcementz=TestEmailVerificationService.test_resend_cooldown_enforcementÇ   sî  € Ý Ñ"Ô"ˆÝ*ØØ Øð
ñ 
ô 
ˆð -ˆØ×%Ò%¨E¸iÐ%ÑHÔHÐHð $+×#5Ò#5°eÑ#<Ô#<Ñ ˆ
�LØ"Ð"ˆz˜UÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆz˜UÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Õ"Ô"ˆzÑ"Ô"Ð"Ð"Õ"Ô"˜UÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ØÐˆ|˜aÒÐÐÐÕÔÐÐÐÐˆ|˜aÐÑÔÐÕÔÑÔÐÐÕÔˆ|ÑÔÐÕÔˆ|ÑÔÐÐÕÔ˜aÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐrQ   c                 ó¼  — t          ¦   «         }t          |ddd¬¦  «        }d}|                     |d¬¦  «         t          d¦  «        D ]}|                     |d¦  «         Œ|                     |¦  «        }d }||u}|s—t          j        d	|fd
||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}}|j        }d}
||
k    }|sªt          j        d|fd||
f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |
¦  «        dœz  }	dd|	iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}
d S )Nrç   rè   rÜ   )rê   rë   rì   Úmax_attemptszlock_test@freeexile.ioÚacc_101rî   Ú000000r\   re   Úrecordrg   rh   r0   )ú>=)z7%(py2)s
{%(py2)s = %(py0)s.failed_attempts
} >= %(py5)sr`   ra   r1   )r   r   rõ   Úrangerù   Úget_active_recordr6   r7   r8   r9   r:   r;   r<   r=   Úfailed_attempts)r@   rò   rú   r[   rû   r  rv   rA   rw   rt   rs   rD   ru   s                rO   Ú#test_max_failed_attempts_locks_codez@TestEmailVerificationService.test_max_failed_attempts_locks_code×   s9  € Ý Ñ"Ô"ˆÝ*ØØ ØØð	
ñ 
ô 
ˆð )ˆØ×%Ò%¨E¸iÐ%ÑHÔHÐHå�q‘”ð 	1ð 	1ˆAØ×Ò  xÑ0Ô0Ð0Ð0ð ×*Ò*¨5Ñ1Ô1ˆØ!Ð!ˆv˜TÐ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆv˜TÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆvÑ!Ô!Ð!Õ!Ô!ˆvÑ!Ô!Ð!Ð!Õ!Ô!˜TÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!ØÔ%Ð*¨Ð*Ð%¨Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð%¨Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆvÑ*Ô*Ð*Õ*Ô*ˆvÑ*Ô*Ð*Ð*Õ*Ô*Ð%Ñ*Ô*Õ*Ô*¨Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*rQ   r€   )r�   r‚   rƒ   rü   r  r  r„   rQ   rO   rå   rå   ®   sP   € € € € € ð(ð (ð (ð (ð0 ð  ð  ð  ð +ð +ð +ð +ð +ð +rQ   rå   c                   ó&   — e Zd Zdd„Zdd„Zdd„ZdS )ÚTestPluggableOAuthProvidersr   Nc                 ó†
  — t          dd¬¦  «        }|j        }t          j        }||k    }|sòt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        dœz  }d	d
|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}|                     dd¬¦  «        }d}||v }	|	s—t	          j        d|	fd||f¦  «        t	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nddœz  }
dd|
iz  }t          t	          j        |¦  «        ¦  «        ‚d x}}	d}||v }	|	s—t	          j        d|	fd||f¦  «        t	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nddœz  }
dd|
iz  }t          t	          j        |¦  «        ¦  «        ‚d x}}	|                     dd¬¦  «        }|j        }t          j        }||k    }|sòt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        dœz  }d	d
|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}|j        }d}||u }|sªt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}|j        }|j        }d } ||¦  «        }|s±d!dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        t	          j	        |¦  «        t	          j	        |¦  «        d"œz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}x}}d S )#NÚgoogle_client_id_freeexileÚgoogle_secret_freeexile)Ú	client_idÚclient_secretrc   )zQ%(py2)s
{%(py2)s = %(py0)s.provider_type
} == %(py6)s
{%(py6)s = %(py4)s.GOOGLE
}Úgoogle_provr   r&   rŒ   r�   Úrandom_state_123ú#https://freeexile.io/oauth/callback©ÚstateÚredirect_urizaccounts.google.comrk   ©z%(py1)s in %(py3)sÚauth_url©rj   r+   rh   r0   z$client_id=google_client_id_freeexileÚmock_google_token_user456©Útoken_or_coder  )zL%(py2)s
{%(py2)s = %(py0)s.provider
} == %(py6)s
{%(py6)s = %(py4)s.GOOGLE
}Úuser_profileTr(   ©z6%(py2)s
{%(py2)s = %(py0)s.email_verified
} is %(py5)sr`   ra   r1   Úgoogle_zrassert %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.provider_user_id
}.startswith
}(%(py6)s)
})r#   r$   r%   r'   r�   )r   Úprovider_typer   ÚGOOGLEr6   r7   r8   r9   r:   r;   r<   r=   Úget_authorization_urlÚverify_token_or_codeÚproviderÚemail_verifiedÚprovider_user_idr>   )r@   r  rA   rE   rD   rF   r¶   r  rx   rv   rw   rt   r   rs   ru   rH   s                   rO   Ú(test_google_provider_staged_verificationzDTestPluggableOAuthProviders.test_google_provider_staged_verificationí   s  € Ý)Ø2Ø3ð
ñ 
ô 
ˆð Ô(ÐDÕ,=Ô,DÐDÐ(Ð,DÒDÐDÐDÐDÕDÔDÐDÐDÐDÐDÐ(Ð,DÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔDˆ{ÑDÔDÐDÕDÔDˆ{ÑDÔDÐDÐDÕDÔDÐ(ÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔDÕ,=ÑDÔDÐDÕDÔDÕ,=ÑDÔDÐDÐDÕDÔDÐ,DÑDÔDÐDÐDÑDÐDÐDÐDÐDÐDÑDÐDÕDÕDÔDÐDÑDÔDÑDÔDÐDÐDÐDÐDÐDÐDÐDà×4Ò4Ð;Mð  ]BÐ4ñ  Cô  CˆØ$Ð0Ð$¨Ð0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð$¨Ð0Ñ0Ô0Õ0Ô0Ð$Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0¨Ñ0Ô0Ð0Õ0Ô0¨Ñ0Ô0Ð0Ð0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ø5ÐAÐ5¸ÐAÐAÐAÐAÕAÔAÐAÐAÐAÐAÐ5¸ÐAÑAÔAÕAÔAÐ5ÑAÔAÐAÕAÔAÑAÔAÐAÐAÕAÔA¸ÑAÔAÐAÕAÔA¸ÑAÔAÐAÐAÐAÐAÑAÐAÐAÐAÐAÐAÑAÐAÕAÕAÔAÐAÑAÔAÑAÔAÐAÐAÐAÐAÐAð #×7Ò7Ø5Ø>ð 8ñ 
ô 
ˆð Ô$Ð@Õ(9Ô(@Ð@Ð$Ð(@Ò@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@Ð$Ð(@Ð@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@ˆ|Ñ@Ô@Ð@Õ@Ô@ˆ|Ñ@Ô@Ð@Ð@Õ@Ô@Ð$Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@Õ(9Ñ@Ô@Ð@Õ@Ô@Õ(9Ñ@Ô@Ð@Ð@Õ@Ô@Ð(@Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@ØÔ*Ð2¨dÐ2Ð*¨dÐ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð*¨dÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ˆ|Ñ2Ô2Ð2Õ2Ô2ˆ|Ñ2Ô2Ð2Ð2Õ2Ô2Ð*Ñ2Ô2Õ2Ô2¨dÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ØÔ,ÐBÐ,Ô7ÐB¸	ÐBÐ7Ð7¸	ÑBÔBÐBÐBÐBÐBÐBÕBÔBÑBÔBÐBÐBÕBÔBˆ|ÑBÔBÐBÕBÔBˆ|ÑBÔBÐBÐBÕBÔBÐ,ÑBÔBÕBÔBÐ7ÑBÔBÕBÔB¸	ÑBÔBÕBÔBÐBÑBÔBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBrQ   c                 ó–  — t          ddd¬¦  «        }|j        }t          j        }||k    }|sòt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        d	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}|                     dd¬¦  «        }d}||v }	|	s—t	          j        d|	fd||f¦  «        t	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nddœz  }
dd|
iz  }t          t	          j        |¦  «        ¦  «        ‚d x}}	|                     dd¬¦  «        }|j        }t          j        }||k    }|sòt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        d	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}|j        }d}||u }|sªt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}d S ) NÚAPPLE_TEAM_IDzcom.freeexile.iosÚ	KEY_12345)Úteam_idr  Úkey_idrc   )zP%(py2)s
{%(py2)s = %(py0)s.provider_type
} == %(py6)s
{%(py6)s = %(py4)s.APPLE
}Ú
apple_provr   r&   rŒ   r�   Úapple_statez#https://freeexile.io/apple/callbackr  zappleid.apple.comrk   r  r  r  rh   r0   Úmock_apple_token_user789r  )zK%(py2)s
{%(py2)s = %(py0)s.provider
} == %(py6)s
{%(py6)s = %(py4)s.APPLE
}r   Tr(   r!  r`   ra   r1   )r   r#  r   ÚAPPLEr6   r7   r8   r9   r:   r;   r<   r=   r%  r&  r'  r(  )r@   r0  rA   rE   rD   rF   r¶   r  rx   rv   rw   rt   r   rs   ru   s                  rO   Ú'test_apple_provider_staged_verificationzCTestPluggableOAuthProviders.test_apple_provider_staged_verification  sP  € Ý'Ø#Ø)Øð
ñ 
ô 
ˆ
ð
 Ô'ÐBÕ+<Ô+BÐBÐ'Ð+BÒBÐBÐBÐBÕBÔBÐBÐBÐBÐBÐ'Ð+BÐBÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔBˆzÑBÔBÐBÕBÔBˆzÑBÔBÐBÐBÕBÔBÐ'ÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔBÕ+<ÑBÔBÐBÕBÔBÕ+<ÑBÔBÐBÐBÕBÔBÐ+BÑBÔBÐBÐBÑBÐBÐBÐBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBà×3Ò3¸-ÐV{Ð3Ñ|Ô|ˆØ"Ð.Ð" hÐ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð" hÐ.Ñ.Ô.Õ.Ô.Ð"Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô. hÑ.Ô.Ð.Õ.Ô. hÑ.Ô.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.à!×6Ò6Ø4Ø>ð 7ñ 
ô 
ˆð Ô$Ð?Õ(9Ô(?Ð?Ð$Ð(?Ò?Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?Ð$Ð(?Ð?Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?ˆ|Ñ?Ô?Ð?Õ?Ô?ˆ|Ñ?Ô?Ð?Ð?Õ?Ô?Ð$Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?Õ(9Ñ?Ô?Ð?Õ?Ô?Õ(9Ñ?Ô?Ð?Ð?Õ?Ô?Ð(?Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ØÔ*Ð2¨dÐ2Ð*¨dÐ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð*¨dÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ˆ|Ñ2Ô2Ð2Õ2Ô2ˆ|Ñ2Ô2Ð2Ð2Õ2Ô2Ð*Ñ2Ô2Õ2Ô2¨dÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2rQ   c                 ó”  — t          dd¬¦  «        }|j        }t          j        }||k    }|sòt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        dœz  }d	d
|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}|                     dd¬¦  «        }d}||v }	|	s—t	          j        d|	fd||f¦  «        t	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nddœz  }
dd|
iz  }t          t	          j        |¦  «        ¦  «        ‚d x}}	|                     dd¬¦  «        }|j        }t          j        }||k    }|sòt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        dœz  }d	d
|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}|j        }d}||u }|sªt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}d S )NÚfb_app_id_123Úfb_secret_456)Úapp_idÚ
app_secretrc   )zS%(py2)s
{%(py2)s = %(py0)s.provider_type
} == %(py6)s
{%(py6)s = %(py4)s.FACEBOOK
}Úfb_provr   r&   rŒ   r�   Úfb_statez https://freeexile.io/fb/callbackr  zfacebook.comrk   r  r  r  rh   r0   Úmock_fb_token_user321r  )zN%(py2)s
{%(py2)s = %(py0)s.provider
} == %(py6)s
{%(py6)s = %(py4)s.FACEBOOK
}r   Tr(   r!  r`   ra   r1   )r   r#  r   ÚFACEBOOKr6   r7   r8   r9   r:   r;   r<   r=   r%  r&  r'  r(  )r@   r:  rA   rE   rD   rF   r¶   r  rx   rv   rw   rt   r   rs   ru   s                  rO   Ú*test_facebook_provider_staged_verificationzFTestPluggableOAuthProviders.test_facebook_provider_staged_verification  sJ  € Ý'Ø"Ø&ð
ñ 
ô 
ˆð Ô$ÐBÕ(9Ô(BÐBÐ$Ð(BÒBÐBÐBÐBÕBÔBÐBÐBÐBÐBÐ$Ð(BÐBÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔBˆwÑBÔBÐBÕBÔBˆwÑBÔBÐBÐBÕBÔBÐ$ÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔBÕ(9ÑBÔBÐBÕBÔBÕ(9ÑBÔBÐBÐBÕBÔBÐ(BÑBÔBÐBÐBÑBÐBÐBÐBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBà×0Ò0°zÐPrÐ0ÑsÔsˆØÐ)ˆ~ Ð)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)ˆ~ Ð)Ñ)Ô)Õ)Ô)ˆ~Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô) Ñ)Ô)Ð)Õ)Ô) Ñ)Ô)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)à×3Ò3Ø1Ø;ð 4ñ 
ô 
ˆð Ô$ÐBÕ(9Ô(BÐBÐ$Ð(BÒBÐBÐBÐBÕBÔBÐBÐBÐBÐBÐ$Ð(BÐBÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔBˆ|ÑBÔBÐBÕBÔBˆ|ÑBÔBÐBÐBÕBÔBÐ$ÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔBÕ(9ÑBÔBÐBÕBÔBÕ(9ÑBÔBÐBÐBÕBÔBÐ(BÑBÔBÐBÐBÑBÐBÐBÐBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBØÔ*Ð2¨dÐ2Ð*¨dÐ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð*¨dÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ˆ|Ñ2Ô2Ð2Õ2Ô2ˆ|Ñ2Ô2Ð2Ð2Õ2Ô2Ð*Ñ2Ô2Õ2Ô2¨dÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2rQ   r€   )r�   r‚   rƒ   r*  r4  r>  r„   rQ   rO   r  r  ì   sT   € € € € € ðCð Cð Cð Cð(3ð 3ð 3ð 3ð$3ð 3ð 3ð 3ð 3ð 3rQ   r  c                   ót   — e Zd Zej        defd„¦   «         Zdeddfd„Zdeddfd„Zdeddfd„Z	deddfd„Z
dS )	ÚTestAuthServiceIntegrationr   c                 óÚ  — t          ¦   «         }t          ¦   «         }t          d¬¦  «        }t          d¬¦  «        }t	          ¦   «         }t          |dd¬¦  «        }t          ||¬¦  «        }|                     t          d	d
¦  «        ¦  «         |                     t          ddd¦  «        ¦  «         |                     t          dd¦  «        ¦  «         t          ||||||¬¦  «        S )NÚ2unit_test_jwt_secret_key_2026_super_secure_32bytesrT   rˆ   r‰   rç   rè   ré   )Ú
repositoryrr   Úclient_gÚsecret_gÚteam_azcom.freeexileÚkey_aÚapp_fbÚ	secret_fb)rC  r*   rr   Úcaptcha_engineÚemail_serviceÚoauth_service)r   r   r   r   r   r   r   Úregister_providerr   r   r   r   )r@   Úrepor*   rr   rJ  rê   rK  rL  s           rO   Úauth_systemz&TestAuthServiceIntegration.auth_system&  sÿ   € å Ñ"Ô"ˆÝÑ!Ô!ˆÝ$Ð0dÐeÑeÔeˆÝ&Ð3LÐMÑMÔMˆÝ&Ñ(Ô(ˆÝ0Ø%Ø Øð
ñ 
ô 
ˆõ %°ÀMÐRÑRÔRˆØ×'Ò'Õ(;¸JÈ
Ñ(SÔ(SÑTÔTÐTØ×'Ò'Õ(:¸8À_ÐV]Ñ(^Ô(^Ñ_Ô_Ð_Ø×'Ò'Õ(=¸hÈÑ(TÔ(TÑUÔUÐUåØØØ'Ø)Ø'Ø'ð
ñ 
ô 
ð 	
rQ   rO  Nc           	      óŽ  — |                      d¬¦  «        }|j                             ¦   «         }t          |d         ¦  «        |d         t          |d         ¦  «        }}}|dk    r||z   n|dk    r||z
  n||z  }|                     dd	d
|j        t          |¦  «        d¬¦  «        }|j        }	d}
|	|
u }|sªt          j	        d|fd|	|
f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}
|j        }	d}
|	|
u }|sªt          j	        d|fd|	|
f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}
|j        }	d }
|	|
u}|sªt          j	        d|fd|	|
f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}
|j                             d¦  «        }d }||u}	|	s—t          j	        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	}|j        }	t*          j        }|	|k    }|sòt          j	        d|fd|	|f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        dt          j        ¦   «         v st          j        t*          ¦  «        rt          j        t*          ¦  «        ndt          j        |¦  «        dœz  }dd |iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}|                     dd	d¬!¦  «        }|j        }	d"}
|	|
u }|sªt          j	        d|fd|	|
f¦  «        d#t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd#t          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}
d$}|j        }
|
j        } |¦   «         }||v }|sÐt          j	        d%|fd&||f¦  «        t          j        |¦  «        d#t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd#t          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        d'œz  }d(d)|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}x}
x}}|j                             d¦  «        }d }||u}	|	s—t          j	        d|	fd||f¦  «        d*t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd*t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	}|                     d|j        ¬+¦  «        }|j        }	d}
|	|
u }|sªt          j	        d|fd|	|
f¦  «        d,t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd,t          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}
|j        }	d }
|	|
u}|sªt          j	        d|fd-|	|
f¦  «        d,t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd,t          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}
|j        }	d }
|	|
u}|sªt          j	        d|fd.|	|
f¦  «        d,t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd,t          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}
|j                             d¦  «        }d }||u}	|	s—t          j	        d|	fd||f¦  «        d/t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd/t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	}|j        }	t*          j         }|	|k    }|sòt          j	        d|fd0|	|f¦  «        d/t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd/t          j        |	¦  «        dt          j        ¦   «         v st          j        t*          ¦  «        rt          j        t*          ¦  «        ndt          j        |¦  «        dœz  }dd |iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}|                     dd	d¬!¦  «        }|j        }	d}
|	|
u }|sªt          j	        d|fd|	|
f¦  «        d1t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd1t          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}
|j        }	d }
|	|
u}|sªt          j	        d|fd-|	|
f¦  «        d1t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd1t          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}
|j!        }	d
}
|	|
k    }|sªt          j	        d|fd2|	|
f¦  «        d1t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd1t          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}
d S )3Nú	127.0.0.1)rà   r   r˜   rš   rŽ   r�   zwanderer@freeexile.iozGrimExile#Password2026ÚWandererBlade©r[   ÚpasswordÚusernameÚ
captcha_idÚcaptcha_solutionrà   Tr(   ©z/%(py2)s
{%(py2)s = %(py0)s.success
} is %(py5)sÚreg_resr`   ra   r1   )z=%(py2)s
{%(py2)s = %(py0)s.requires_verification
} is %(py5)sr\   )z6%(py2)s
{%(py2)s = %(py0)s.account_id
} is not %(py5)sre   Úaccountrg   rh   r0   rc   )zV%(py2)s
{%(py2)s = %(py0)s.status
} == %(py6)s
{%(py6)s = %(py4)s.PENDING_ACTIVATION
}r   r&   rŒ   r�   ©r[   rT  rà   FÚlogin_before_actzpending activationrk   ©za%(py1)s in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.message
}.lower
}()
}©rj   r+   r0   r1   r,   r-   r.   Úactive_code)r[   Úverification_codeÚact_resr^   rb   Úaccount_active©zJ%(py2)s
{%(py2)s = %(py0)s.status
} == %(py6)s
{%(py6)s = %(py4)s.ACTIVE
}Úlogin_after_act)z0%(py2)s
{%(py2)s = %(py0)s.username
} == %(py5)s)"Úrequest_captchar¬   r¯   r°   Úquick_registerrœ   r²   Úsuccessr6   r7   r8   r9   r:   r;   r<   r=   Úrequires_verificationrY   rC  Úget_by_emailÚstatusr   ÚPENDING_ACTIVATIONÚloginÚmessager´   rK  r
  Úverify_emailrö   rn   ro   ÚACTIVErU  )r@   rO  ÚcaptcharÃ   rÄ   rÅ   rÆ   rÇ   rY  rA   rs   rD   rt   ru   rZ  rv   rw   rE   rF   r¶   r\  rx   rK   rG   rI   rJ   r_  ra  rb  rd  s                                 rO   Ú+test_quick_registration_flow_and_activationzFTestAuthServiceIntegration.test_quick_registration_flow_and_activationA  sé  € à×-Ò-¸Ð-ÑDÔDˆØÔ ×&Ò&Ñ(Ô(ˆÝ�u˜Q”x‘=”= %¨¤(­C°°a´©M¬Mˆqˆ2ˆØ˜S’y�yˆa�!‰eˆe°°c²	°	 q¨1¡u u¸qÀ1¹uˆð ×,Ò,Ø)Ø-Ø$ØÔ+Ý  ™XœXØ!ð -ñ 
ô 
ˆð ŒÐ& $Ð&ˆ $Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ $Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆwÑ&Ô&Ð&Õ&Ô&ˆwÑ&Ô&Ð&Ð&Õ&Ô&ˆÑ&Ô&Õ&Ô& $Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÔ,Ð4°Ð4Ð,°Ð4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð,°Ð4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4ˆwÑ4Ô4Ð4Õ4Ô4ˆwÑ4Ô4Ð4Ð4Õ4Ô4Ð,Ñ4Ô4Õ4Ô4°Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ØÔ!Ð-¨Ð-Ð!¨Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð!¨Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆwÑ-Ô-Ð-Õ-Ô-ˆwÑ-Ô-Ð-Ð-Õ-Ô-Ð!Ñ-Ô-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ð Ô(×5Ò5Ð6MÑNÔNˆØ"Ð"ˆw˜dÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆw˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆwÑ"Ô"Ð"Õ"Ô"ˆwÑ"Ô"Ð"Ð"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ØŒ~ÐA¥Ô!AÐAˆ~Ð!AÒAÐAÐAÐAÕAÔAÐAÐAÐAÐAˆ~Ð!AÐAÑAÔAÐAÕAÔAÑAÔAÐAÐAÕAÔAˆwÑAÔAÐAÕAÔAˆwÑAÔAÐAÐAÕAÔAˆ~ÑAÔAÐAÕAÔAÑAÔAÐAÐAÕAÔA¥ÑAÔAÐAÕAÔA¥ÑAÔAÐAÐAÕAÔAÐ!AÑAÔAÐAÐAÑAÐAÐAÐAÐAÐAÑAÐAÕAÕAÔAÐAÑAÔAÑAÔAÐAÐAÐAÐAÐAÐAÐAð '×,Ò,Ø)Ø-Ø!ð -ñ 
ô 
Ðð
  Ô'Ð0¨5Ð0Ð'¨5Ð0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð'¨5Ð0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0ÐÑ0Ô0Ð0Õ0Ô0ÐÑ0Ô0Ð0Ð0Õ0Ô0Ð'Ñ0Ô0Õ0Ô0¨5Ñ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ø#ÐGÐ'7Ô'?ÐGÐ'?Ô'EÐGÐ'EÐ'EÑ'GÔ'GÐGÐ#Ð'GÐGÐGÐGÐGÕGÔGÐGÐGÐGÐGÐ#Ð'GÐGÑGÔGÕGÔGÐ#ÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔGÐ'7ÑGÔGÐGÕGÔGÐ'7ÑGÔGÐGÐGÕGÔGÐ'?ÑGÔGÕGÔGÐ'EÑGÔGÕGÔGÐ'GÑGÔGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGð "Ô/×AÒAÐBYÑZÔZˆØ"&Ð&ˆ{ $Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ{ $Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ{Ñ&Ô&Ð&Õ&Ô&ˆ{Ñ&Ô&Ð&Ð&Õ&Ô& $Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&à×*Ò*Ø)Ø)Ô.ð +ñ 
ô 
ˆð ŒÐ& $Ð&ˆ $Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ $Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆwÑ&Ô&Ð&Õ&Ô&ˆwÑ&Ô&Ð&Ð&Õ&Ô&ˆÑ&Ô&Õ&Ô& $Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÔ#Ð/¨4Ð/Ð#¨4Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð#¨4Ð/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆwÑ/Ô/Ð/Õ/Ô/ˆwÑ/Ô/Ð/Ð/Õ/Ô/Ð#Ñ/Ô/Õ/Ô/¨4Ñ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ØÔ$Ð0¨DÐ0Ð$¨DÐ0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð$¨DÐ0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0ˆwÑ0Ô0Ð0Õ0Ô0ˆwÑ0Ô0Ð0Ð0Õ0Ô0Ð$Ñ0Ô0Õ0Ô0¨DÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ð %Ô/×<Ò<Ð=TÑUÔUˆØ%)Ð)ˆ~ TÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)ˆ~ TÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆ~Ñ)Ô)Ð)Õ)Ô)ˆ~Ñ)Ô)Ð)Ð)Õ)Ô) TÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)ØÔ$Ð<­Ô(<Ð<Ð$Ð(<Ò<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð$Ð(<Ð<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<ˆ~Ñ<Ô<Ð<Õ<Ô<ˆ~Ñ<Ô<Ð<Ð<Õ<Ô<Ð$Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<­Ñ<Ô<Ð<Õ<Ô<­Ñ<Ô<Ð<Ð<Õ<Ô<Ð(<Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ð &×+Ò+Ø)Ø-Ø!ð ,ñ 
ô 
ˆð
 Ô&Ð.¨$Ð.Ð&¨$Ð.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð&¨$Ð.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.ˆÑ.Ô.Ð.Õ.Ô.ˆÑ.Ô.Ð.Ð.Õ.Ô.Ð&Ñ.Ô.Õ.Ô.¨$Ñ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ØÔ+Ð7°4Ð7Ð+°4Ð7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð+°4Ð7Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7ˆÑ7Ô7Ð7Õ7Ô7ˆÑ7Ô7Ð7Ð7Õ7Ô7Ð+Ñ7Ô7Õ7Ô7°4Ñ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7ØÔ'Ð:¨?Ð:Ð'¨?Ò:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð'¨?Ð:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:ˆÑ:Ô:Ð:Õ:Ô:ˆÑ:Ô:Ð:Ð:Õ:Ô:Ð'Ñ:Ô:Õ:Ô:¨?Ñ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:rQ   c                 ó(  — |                      dddddd¬¦  «        }|j        }d}||u }|sªt          j        d	|fd
||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}}d}|j
        }|j        }	 |	¦   «         }
||
v }|sÐt          j        d|fd||
f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}x}	}
|j                             d¦  «        }d }||u }|s—t          j        d	|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}}d S )Nzbot_attacker@freeexile.iozBotPassword123!Ú
BotSpammerÚfake_challenge_idÚinvalid_answerz192.168.100.99rS  Fr(   rX  rY  r`   ra   r1   rp  rk   r]  r^  r-   r.   r|   rZ  rg   rh   r0   )rf  rg  r6   r7   r8   r9   r:   r;   r<   r=   rm  r´   rC  ri  )r@   rO  rY  rA   rs   rD   rt   ru   rx   rK   rG   rv   rI   rJ   rZ  rw   s                   rO   Ú3test_quick_registration_spam_bot_blocked_by_captchazNTestAuthServiceIntegration.test_quick_registration_spam_bot_blocked_by_captcha~  s  € à×,Ò,Ø-Ø&Ø!Ø*Ø-Ø&ð -ñ 
ô 
ˆð ŒÐ' %Ð'ˆ %Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ %Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Ð'Õ'Ô'ˆÑ'Ô'Õ'Ô' %Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÐ3˜GœOÐ3˜OÔ1Ð3Ð1Ð1Ñ3Ô3Ð3ˆyÐ3Ð3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3ˆyÐ3Ð3Ñ3Ô3Õ3Ô3ˆyÑ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3˜GÑ3Ô3Ð3Õ3Ô3˜GÑ3Ô3Ð3Ð3Õ3Ô3˜OÑ3Ô3Õ3Ô3Ð1Ñ3Ô3Õ3Ô3Ð3Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ð Ô(×5Ò5Ð6QÑRÔRˆØÐˆw˜$ˆÐÐÐÕÔÐÐÐÐˆw˜$ÐÑÔÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔ˜$ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐrQ   c                 ó’
  — |                      t          j        ddd¬¦  «        }|j        }d}||u }|sªt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}|j        }d}||u }|sªt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}|j        }d }||u}|sªt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}|j                             |j        ¦  «        }d }	||	u}|s—t	          j        d|fd||	f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |	¦  «        dœz  }
dd|
iz  }t          t	          j        |¦  «        ¦  «        ‚d x}}	|j        }t$          j        }||k    }|sòt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        t$          ¦  «        rt	          j	        t$          ¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}t          j        }|j        }||v }|sòt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}}d S )NÚmock_google_token_exile_heror  rQ  )r'  Úauth_code_or_tokenr  rà   Tr(   rX  Ú	oauth_resr`   ra   r1   )z6%(py2)s
{%(py2)s = %(py0)s.is_new_account
} is %(py5)sr\   r^   re   rZ  rg   rh   r0   rc   rc  r   r&   rŒ   r�   rk   )zT%(py2)s
{%(py2)s = %(py0)s.GOOGLE
} in %(py6)s
{%(py6)s = %(py4)s.oauth_identities
}r   )Úoauth_loginr   r$  rg  r6   r7   r8   r9   r:   r;   r<   r=   Úis_new_accountrn   rC  Ú	get_by_idrY   rj  r   ro  Úoauth_identities)r@   rO  rz  rA   rs   rD   rt   ru   rZ  rv   rw   rE   rF   r¶   s                 rO   Útest_oauth_login_and_bindingz7TestAuthServiceIntegration.test_oauth_login_and_binding�  sñ  € à×+Ò+Ý&Ô-Ø=Ø>Ø!ð	 ,ñ 
ô 
ˆ	ð Ô Ð( DÐ(Ð  DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð  DÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆyÑ(Ô(Ð(Õ(Ô(ˆyÑ(Ô(Ð(Ð(Õ(Ô(Ð Ñ(Ô(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÔ'Ð/¨4Ð/Ð'¨4Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð'¨4Ð/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆyÑ/Ô/Ð/Õ/Ô/ˆyÑ/Ô/Ð/Ð/Õ/Ô/Ð'Ñ/Ô/Õ/Ô/¨4Ñ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ØÔ%Ð1¨TÐ1Ð%¨TÐ1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð%¨TÐ1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1ˆyÑ1Ô1Ð1Õ1Ô1ˆyÑ1Ô1Ð1Ð1Õ1Ô1Ð%Ñ1Ô1Õ1Ô1¨TÑ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1àÔ(×2Ò2°9Ô3GÑHÔHˆØ"Ð"ˆw˜dÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆw˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆwÑ"Ô"Ð"Õ"Ô"ˆwÑ"Ô"Ð"Ð"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ØŒ~Ð5¥Ô!5Ð5ˆ~Ð!5Ò5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5ˆ~Ð!5Ð5Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5ˆwÑ5Ô5Ð5Õ5Ô5ˆwÑ5Ô5Ð5Ð5Õ5Ô5ˆ~Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5¥Ñ5Ô5Ð5Õ5Ô5¥Ñ5Ô5Ð5Ð5Õ5Ô5Ð!5Ñ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ý Ô'ÐC¨7Ô+CÐCÐ'Ð+CÐCÐCÐCÐCÕCÔCÐCÐCÐCÐCÐ'Ð+CÐCÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔCÕ ÑCÔCÐCÕCÔCÕ ÑCÔCÐCÐCÕCÔCÐ'ÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC¨7ÑCÔCÐCÕCÔC¨7ÑCÔCÐCÐCÕCÔCÐ+CÑCÔCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCÐCÐCÐCÐCrQ   c                 ól  — |j                              d|j                             d¦  «        dt          j        ¬¦  «        }|                     ddd¬¦  «        }|j        }d }||u}|sªt          j	        d|fd||f¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}|                     |j        ¦  «        }	|	j        }d }||u}|sªt          j	        d|fd||f¦  «        dt          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}|	j        }d }||u}|sªt          j	        d|fd||f¦  «        dt          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}|	j        }|j        }
||
k    }|sèt          j	        d|fd||
f¦  «        dt          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |¦  «        d	t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}
d S )Nzrefreshtest@freeexile.iozPass123!ÚTokenTester)r[   Úpassword_hashrU  rj  rQ  r[  r\   rb   Ú	login_resr`   ra   r1   r^   Úrefresh_resr   )zX%(py2)s
{%(py2)s = %(py0)s.refresh_token
} != %(py6)s
{%(py6)s = %(py4)s.refresh_token
}r&   rŒ   r�   )rC  Úcreate_accountr*   r5   r   ro  rl  ro   r6   r7   r8   r9   r:   r;   r<   r=   rn   )r@   rO  rZ  rƒ  rA   rs   rD   rt   ru   r„  rE   rF   r¶   s                rO   Útest_refresh_token_rotationz6TestAuthServiceIntegration.test_refresh_token_rotation   sH  € àÔ(×7Ò7Ø,Ø%Ô,×:Ò:¸:ÑFÔFØ"Ý Ô'ð	 8ñ 
ô 
ˆð  ×%Ò%Ø,ØØ!ð &ñ 
ô 
ˆ	ð
 Ô&Ð2¨dÐ2Ð&¨dÐ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð&¨dÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ˆyÑ2Ô2Ð2Õ2Ô2ˆyÑ2Ô2Ð2Ð2Õ2Ô2Ð&Ñ2Ô2Õ2Ô2¨dÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ð "×/Ò/°	Ô0GÑHÔHˆØÔ'Ð3¨tÐ3Ð'¨tÐ3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð'¨tÐ3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3ˆ{Ñ3Ô3Ð3Õ3Ô3ˆ{Ñ3Ô3Ð3Ð3Õ3Ô3Ð'Ñ3Ô3Õ3Ô3¨tÑ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ØÔ(Ð4°Ð4Ð(°Ð4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð(°Ð4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4ˆ{Ñ4Ô4Ð4Õ4Ô4ˆ{Ñ4Ô4Ð4Ð4Õ4Ô4Ð(Ñ4Ô4Õ4Ô4°Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ØÔ(ÐC¨IÔ,CÐCÐ(Ð,CÒCÐCÐCÐCÕCÔCÐCÐCÐCÐCÐ(Ð,CÐCÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔCˆ{ÑCÔCÐCÕCÔCˆ{ÑCÔCÐCÐCÕCÔCÐ(ÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC¨IÑCÔCÐCÕCÔC¨IÑCÔCÐCÐCÕCÔCÐ,CÑCÔCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCÐCÐCÐCÐCrQ   )r�   r‚   rƒ   ÚpytestÚfixturer   rO  rq  rv  r  r†  r„   rQ   rO   r@  r@  %  sÔ   € € € € € Ø„^ð
˜[ð 
ð 
ð 
ñ „^ð
ð4;;À{ð ;;ÐW[ð ;;ð ;;ð ;;ð ;;ðzÈ{ð Ð_cð ð ð ð ð"D¸ð DÈð Dð Dð Dð Dð"D°{ð DÀtð Dð Dð Dð Dð Dð DrQ   r@  )-Ú__doc__Úbuiltinsr8   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter6   Útimer‡  Útypingr   r   Úserver.auth.modelsr   r   r   r   r	   r
   Úserver.auth.cryptor   r   Úserver.auth.captchar   r   r   r   Úserver.auth.email_verificationr   r   r   Úserver.auth.oauthr   r   r   r   r   Úserver.auth.auth_servicer   r   r   r†   rå   r  r@  r„   rQ   rO   ú<module>r–     s€  ððð ð
 € € € € € € € € € € € € €€€€Ø €€€Ø Ð Ð Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð <Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð
ð ð ð ð ð ð ð ð ð ð ð ð ð ð DÐ CÐ CÐ CÐ CÐ CÐ CÐ Cð(ð (ð (ð (ð (ñ (ô (ð (ðVX6ð X6ð X6ð X6ð X6ñ X6ô X6ð X6ðv;+ð ;+ð ;+ð ;+ð ;+ñ ;+ô ;+ð ;+ð|63ð 63ð 63ð 63ð 63ñ 63ô 63ð 63ðrODð ODð ODð ODð ODñ ODô ODð ODð ODð ODrQ   