+
    ¢THiðj  ã                  óÚ  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^ RIHt ^ RIHtHt ^ RIHtHtHtHtHtHtHtH t H!t!H"t"H#t#H$t$H%t% ^ RI&H't'H(t(H)t)H*t*H+t+ ^ RI,H-t-H.t.H/t/H0t0H1t1 . R	NR
NRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNR NR!NR"NR#NR$NR%NR&NR'NR(NR)NR*NR+NR,NR-NR.NR/NR0NR1NR2NR3Nt2]3! ]Ph                  ! ]Pj                  4      R4,           4      t6. RzOt7R5R6.t8R7t9R8t:R9t;]3! ]	Px                  P{                  R:4      ;'       g    R;4      t> ! R< R=4      t?]P€                  P‚                  tB]B]P€                  P†                  0tDR> tER{R@ ltFRA tGRB tHR|RC ltIR}RD ltJRE tKRF tLRG tM]'! ]LRH4       ]'! ]MRI4       RJ RK ltNRL RM ltORN RO ltPRPtQRQtRR~RR RS lltSRT RU ltTRVtU]UP­                  RW4      tWRX RY ltXRZ R[ ltY^€tZR\t[R] R^ lt\RR_ R` llt]R€Ra Rb llt^R€Rc Rd llt_].! ReRfRg7      R�Rh l4       t`]a! . R‚O4      tb]a! . RƒO4      tc]a! R8Ri.4      tdR„Rj Rk llteR?tf]PÎ                  th]hti ]	PÔ                  ! ^4       RltkR~Rm ltm]k'       d   ]
PÜ                  ! 4       toRn]pR(&   M]
Pâ                  ! ]m! 4       4      toRo trRp tsRqtt].! RfRrRsRt7      ^
]t3Ru l4       tuR…tvRv twR†txRw tyRx tzRy t{R#   ]l d    R?tk Lui ; i)‡z4passlib.utils -- helpers for writing password hashes)ÚannotationsN)ÚIterableÚSequence)ÚAnyStr)ÚExpectedStringErrorÚExpectedTypeError)Ú
AB64_CHARSÚBASE64_CHARSÚBCRYPT_CHARSÚHASH64_CHARSÚBase64EngineÚLazyBase64EngineÚab64_decodeÚab64_encodeÚb64s_decodeÚb64s_encodeÚbcrypt64Úh64Úh64big)Úadd_docÚget_method_functionÚ
join_bytesÚjoin_unicodeÚunicode_or_bytes)ÚclasspropertyÚdeprecated_functionÚdeprecated_methodÚhybrid_methodÚmemoized_propertyr   r	   r
   r   r   r   r   r   r   r   r   r   Úconsteqr   Úgenerate_passwordÚgetrandbytesÚ
getrandstrr   r   Ú	has_cryptÚhas_rounds_infoÚhas_salt_infor   Úis_ascii_safeÚis_crypt_contextÚis_crypt_handlerÚis_same_codecr   r   r   Úrender_bytesÚrngÚrounds_cost_valuesÚ
safe_cryptÚsaslprepÚsys_bitsÚ
test_cryptÚtickÚto_bytesÚto_native_strÚ
to_unicodeÚunix_crypt_schemesÚ	xor_bytesg      ø?ÚlinearÚlog2ó    Ú Ú ÚPASSLIB_MAX_PASSWORD_SIZEi   c                  óP   € ] tR t^}tRtR tR tR tR tR t	R t
R R	 ltR
 tRtR# )ÚSequenceMixinzw
helper which lets result object act like a fixed-length sequence.
subclass just needs to provide :meth:`_as_tuple()`.
c                	ó   € \        R 4      h)zimplement in subclass)ÚNotImplementedError©Úselfs   &Ú8/usr/lib/python3/dist-packages/passlib/utils/__init__.pyÚ	_as_tupleÚSequenceMixin._as_tupleƒ   s   € Ü!Ð"9Ó:Ð:r9   c                	ó4   € \        V P                  4       4      # ©N)ÚreprrD   rA   s   &rC   Ú__repr__ÚSequenceMixin.__repr__†   ó   € Ü�D—N‘NÓ$Ó%Ð%r9   c                	ó0   € V P                  4       V,          # rG   ©rD   )rB   Úidxs   &&rC   Ú__getitem__ÚSequenceMixin.__getitem__‰   s   € Ø�~‰~Ó Õ$Ð$r9   c                	ó4   € \        V P                  4       4      # rG   )ÚiterrD   rA   s   &rC   Ú__iter__ÚSequenceMixin.__iter__Œ   rK   r9   c                	ó4   € \        V P                  4       4      # rG   )ÚlenrD   rA   s   &rC   Ú__len__ÚSequenceMixin.__len__�   s   € Ü�4—>‘>Ó#Ó$Ð$r9   c                	ó(   € V P                  4       V8H  # rG   rM   ©rB   Úothers   &&rC   Ú__eq__ÚSequenceMixin.__eq__’   s   € Ø�~‰~Ó 5Ñ(Ð(r9   c               ó   € V ^8„  d   QhRR/# )é   ÚreturnÚint© )Úformats   "rC   Ú__annotate__ÚSequenceMixin.__annotate__•   s   € ÷ &ñ &˜#ñ &r9   c                	ó4   € \        V P                  4       4      # rG   )ÚhashrD   rA   s   &rC   Ú__hash__ÚSequenceMixin.__hash__•   rK   r9   c                	ó.   € V P                  V4      '       * # rG   )r\   rZ   s   &&rC   Ú__ne__ÚSequenceMixin.__ne__˜   s   € Ø—;‘;˜uÓ%Ô%Ð%r9   rb   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rD   rI   rO   rS   rW   r\   rh   rk   Ú__static_attributes__rb   r9   rC   r>   r>   }   s/   † ñò
;ò&ò%ò&ò%ò)õ&ö&r9   r>   c                ó  € \         P                  ! \        V 4      4      P                  pV'       g   R# VP	                  V4      pV'       d   VP
                  \        9  d   R# V\        V4      R,          ,          P
                  \        8H  # )z*test if function accepts specified keywordFTéÿÿÿÿ)	ÚinspectÚ	signaturer   Ú
parametersÚgetÚkindÚ_VAR_ANY_SETÚlistÚ_VAR_KEYWORD)ÚfuncÚkeyÚparamsÚargs   &&  rC   Úaccepts_keywordr�   £   sa   € ä×ÒÔ2°4Ó8Ó9×DÑD€FßÙØ
�*‰*�S‹/€Cß
ˆs�x‰xœ|Ô+Ùà”$�v“,˜rÕ"Õ#×(Ñ(¬LÑ8Ð8r9   Fc                óŽ  a€ \        V\        4      '       d   V.p\        V P                  4      pV'       dN   \        V\        4      '       d   V.pV F.  oV'       d
   SV9   d   K  SV9   g   K  VP	                  S4       K0  	  V'       Ed   V EF  o\
        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       d   KF  V'       dR   \        V4       F6  w  r‰\        SV	4      '       d    M’V'       g   K#  \        W”4      '       g   K6   Ms	  \        V4      pMeV'       d\   \        \        V4      4       F@  w  r©\        W•4      '       g   K  \        V4      V
,
          pWx^,
          ,          V	8X  g   Q h M	  ^ pM^ pVP                  VS4       EK  	  V'       g   \        V4      V n        R# R# )a´  
helper to update mixin classes installed in target class.

:param target:
    target class whose bases will be modified.

:param add:
    class / classes to install into target's base class list.

:param remove:
    class / classes to remove from target's base class list.

:param append:
    by default, prepends mixins to front of list.
    if True, appends to end of list instead.

:param after:
    optionally make sure all mixins are inserted after
    this class / classes.

:param before:
    optionally make sure all mixins are inserted before
    this class / classes.

:param dryrun:
    optionally perform all calculations / raise errors,
    but don't actually modify the class.
c              3  ó<   <"  € T F  p\        VS4      x € K  	  R # 5irG   )Ú
issubclass)Ú.0ÚbaseÚmixins   & €rC   Ú	<genexpr>Ú'update_mixin_classes.<locals>.<genexpr>á   s   øé € Ð=±u¨t”:˜d E×*Ð*³uùó   ƒTFN)Ú
isinstanceÚtyper{   Ú	__bases__ÚremoveÚanyÚ	enumerater„   rV   ÚreversedÚinsertÚtuple)ÚtargetÚaddrŽ   ÚappendÚbeforeÚafterÚdryrunÚbasesrN   r†   Úend_idxr‡   s   &&&&&&&    @rC   Úupdate_mixin_classesrœ   ¯   sa  ø€ ô> �#”t×ÒØˆeˆä�×!Ñ!Ó"€E÷ Ü�fœd×#Ò#Ø�XˆFÛˆEß�u ”|ÙØ˜Ž~Ø—‘˜UÖ#ñ	 ÷ €sÜˆEç‹sÔ=±uÓ=�s�sŠsÔ=±uÓ=×=Ò=Ù÷ Ü!*¨5Ö!1‘I�CÜ! %¨×.Ò.áß‘v¤*¨T×":Ô":áñ "2ô ˜e›*‘CßÜ%.¬x¸«Ö%?‘M�GÜ! $×.Ô.ä! %›j¨7Õ2˜Ø$¨1¥W�~°Ô5Ð5Ð5Ùñ &@ð ‘Cð �ð �L‰L˜˜e×$ñ? ÷D Ü  ›<ˆÖñ r9   c              #  ó¢  "  € V^8  d   \        R4      h\        V \        4      '       d(   \        V 4      p^ pW28  d   W1,           pWV x € TpK  R# \        V \        4      '       dK   \        V 4      p \        P                  ! WQ4      p \        V4      p\        P                  ! T3T4      x € K?  \        R4      h  \         d     R# i ; i5i)z0
split iterable into chunks of <size> elements.
zsize must be positive integerzsource must be iterableN)Ú
ValueErrorr‹   r   rV   r   rR   Ú	itertoolsÚisliceÚnextÚStopIterationÚchainÚ	TypeError)ÚsourceÚsizeÚendÚiÚnÚitrÚ	chunk_itrÚfirsts   &&      rC   Úbatchr­     sÂ   é € ð ˆa„xÜÐ8Ó9Ð9Ü�&œ(×#Ò#Ü�&‹kˆØˆØŒgØ•ˆAØ˜1�+ÒØŠAñ ô 
�FœH×	%Ò	%Ü�6‹lˆØÜ!×(Ò(¨Ó3ˆIðÜ˜Y›�ô —/’/ 5 (¨IÓ6Ô6äÐ1Ó2Ð2øô	 !ô Úðüs*   ‚BCÂB= Â'CÂ=CÃCÃCÃCc                ó
  € \        V 4      \        V4      Jd   \        h\        V \        4      '       d   V P	                  4       MT p \        V\        4      '       d   VP	                  4       MTp\
        P                  ! W4      # rG   )rŒ   r¤   r‹   ÚstrÚencodeÚhmacÚcompare_digest©ÚleftÚrights   &&rC   r   r     sZ   € ÜˆDƒzœ˜e›Ó$Üˆä& t¬S×1Ò1ˆ4�;‰;Œ=°t€DÜ(¨´×4Ò4ˆE�L‰LŒN¸%€EÜ×Ò˜tÓ+Ð+r9   c                óÔ   € V P                  4       p V P                  V4      '       d   V RR p V '       g   . # V P                  V4       Uu. uF  q"P                  4       NK  	  up# u upi )zJsplit comma-separated string into list of elements,
stripping whitespace.
Nrt   )ÚstripÚendswithÚsplit)r¥   ÚsepÚelems   && rC   Ú
splitcommar¼   (  sX   € ð �\‰\‹^€FØ‡��s×ÒØ˜˜�ˆßØˆ	Ø%+§\¡\°#Ô%6Ó7Ñ%6˜T�J‰JŽLÑ%6Ñ7Ð7ùÒ7s   Á
A%c                ó  € \        V \        4      '       g   \        R\        V 4       24      hRP	                  R V  4       4      p\
        P                  ! RV4      pV'       g   \        # \        P                  pV! V^ ,          4      '       d9   V! VR,          4      '       g   \        RV,           4      h\        P                  pMTp\        P                  R3\        P                  R3\        P                  R3\        P                  R	3\        P                  R	3\        P                  R	3\        P                   R
3\        P"                  R3\        P$                  R3\        P&                  R3\        P(                  R3VR3.pV Fr  p\        P*                  ! V4      '       d   Q R4       h\        P,                  ! V4      '       d   Q R4       hV F#  w  rxV! V4      '       g   K  \        V RV 24      h	  Kt  	  V# )aŸ  Normalizes unicode strings using SASLPrep stringprep profile.

The SASLPrep profile is defined in :rfc:`4013`.
It provides a uniform scheme for normalizing unicode usernames
and passwords before performing byte-value sensitive operations
such as hashing. Among other things, it normalizes diacritic
representations, removes non-printing characters, and forbids
invalid characters such as ``\n``. Properly internationalized
applications should run user passwords through this function
before hashing.

:arg source:
    unicode string to normalize & validate

:param param:
    Optional noun identifying source parameter in error messages
    (Defaults to the string ``"value"``). This is mainly useful to make the caller's error
    messages make more sense contextually.

:raises ValueError:
    if any characters forbidden by the SASLPrep profile are encountered.

:raises TypeError:
    if input is not :class:`!unicode`

:returns:
    normalized unicode string

.. note::

    This function is not available under Jython,
    as the Jython stdlib is missing the :mod:`!stringprep` module
    (`Jython issue 1758320 <http://bugs.jython.org/issue1758320>`_).

.. versionadded:: 1.6
zinput must be string, not r:   c              3  ó¦   "  € T FG  p\         P                  ! V4      '       d   K!  \         P                  ! V4      '       d   \        MTx € KI  	  R # 5irG   )Ú
stringprepÚin_table_b1Úin_table_c12Ú_USPACE)r…   Úcs   & rC   rˆ   Úsaslprep.<locals>.<genexpr>f  s<   é € ð áˆAÜ×%Ò% a×(ô 	5”:×*Ò*¨1×-Ò-�°1Ô4Ûùs   ‚A¥AÁAÚNFKCzmalformed bidi sequence in z$unassigned code points forbidden in z control characters forbidden in z$private use characters forbidden in z"non-char code points forbidden in zsurrogate codes forbidden in z!non-plaintext chars forbidden in z!non-canonical chars forbidden in z1display-modifying / deprecated chars forbidden inztagged characters forbidden in zforbidden bidi character in z$failed to strip B.1 in mapping stagez(failed to replace C.1.2 in mapping stager;   rt   )r‹   r¯   r¤   rŒ   ÚjoinÚunicodedataÚ	normalizeÚ_UEMPTYr¿   Úin_table_d1rž   Úin_table_d2Úin_table_a1Úin_table_c21_c22Úin_table_c3Úin_table_c4Úin_table_c5Úin_table_c6Úin_table_c7Úin_table_c8Úin_table_c9rÀ   rÁ   )	r¥   ÚparamÚdataÚis_ral_charÚis_forbidden_bidi_charÚ
forbidden_rÃ   r}   Úerr_msgs	   &&       rC   r.   r.   4  së  € ôX �fœc×"Ò"ÜÐ4´T¸&³\°NÐCÓDÐDð
 �7‰7ñ áóó €Dô × Ò  ¨Ó.€DßÜˆô ×(Ñ(€KÙ�4˜•7×ÒÙ˜4 �8×$Ò$ÜÐ:¸UÕBÓCÐCä!+×!7Ñ!7Ñð "-Ðô 
×	Ñ	Ð!GÐHÜ	×	$Ñ	$Ð&HÐIÜ	×	Ñ	Ð!GÐHÜ	×	Ñ	Ð!EÐFÜ	×	Ñ	Ð!EÐFÜ	×	Ñ	Ð!EÐFÜ	×	Ñ	Ð!@ÐAÜ	×	Ñ	Ð!DÐEÜ	×	Ñ	Ð!DÐEä×"Ñ"Ø?ð	
ô 
×	Ñ	Ð!BÐCà	Ð!?Ð@ð!€Jó$ ˆä×)Ò)¨!×,Ò,ÐTÐ.TÓTÐ,Ü×*Ò*¨1×-Ò-ð 	
Ø6ó	
Ð-ó (‰MˆDÙ�A�wŒwÜ  G 9¨A¨e¨WÐ!5Ó6Ð6ó (ñ ð €Kr9   c                óØ   € \        V \        4      '       d   V P                  R4      p T \        ;QJ d    . R V 4       F  NK  	  5M! R V 4       4      ,          pVP	                  R4      # )at  Peform ``%`` formating using bytes in a uniform manner across Python 2/3.

This function is motivated by the fact that
:class:`bytes` instances do not support ``%`` or ``{}`` formatting under Python 3.
This function is an attempt to provide a replacement:
it converts everything to unicode (decoding bytes instances as ``latin-1``),
performs the required formatting, then encodes the result to ``latin-1``.

Calling ``render_bytes(source, *args)`` should function roughly the same as
``source % args`` under Python 2.

.. todo::
    python >= 3.5 added back limited support for bytes %,
    can revisit when 3.3/3.4 is dropped.
úlatin-1c              3  ót   "  € T F.  p\        V\        4      '       d   VP                  R 4      MTx € K0  	  R# 5i)rÜ   N)r‹   ÚbytesÚdecode)r…   r€   s   & rC   rˆ   Úrender_bytes.<locals>.<genexpr>·  s-   é € ð ÙLPÀS¤¨C´×!7Ò!7ˆ�
‰
�9Ô¸SÔ@ËDùs   ‚68)r‹   rÞ   rß   r“   r°   )r¥   ÚargsÚresults   &* rC   r*   r*   ¥  sa   € ô  �&œ%× Ò Ø—‘˜yÓ)ˆØ—e”eñ ÙLPó—e‘eñ ÙLPóó õ €Fð �=‰=˜Ó#Ð#r9   c                ó.   € \         P                  V R 4      # ©Úbig)ra   Ú
from_bytes©Úvalues   &rC   Úbytes_to_intré   ½  s   € Ü�>‰>˜% Ó'Ð'r9   c                ó&   € V P                  VR 4      # rä   )r2   )rè   Úcounts   &&rC   Úint_to_bytesrì   Á  s   € Ø�>‰>˜% Ó'Ð'r9   z/decode byte string as single big-endian integerz/encode integer as single big-endian byte stringc               ó$   € V ^8„  d   QhRRRRRR/# )r_   r´   rÞ   rµ   r`   rb   )rc   s   "rC   rd   rd   É  s&   € ÷ Mñ M�Eð M %ð M¨Eñ Mr9   c                ó^   € \        \        V 4      \        V4      ,          \        V 4      4      # )z;Perform bitwise-xor of two byte strings (must be same size))rì   ré   rV   r³   s   &&rC   r6   r6   É  s"   € äœ TÓ*¬\¸%Ó-@Õ@Ä#ÀdÃ)ÓLÐLr9   c               ó$   € V ^8„  d   QhRRRRRR/# )r_   r¥   r   r¦   ra   r`   rb   )rc   s   "rC   rd   rd   Î  s!   € ÷ "ñ "˜&ð "¨ð "°ñ "r9   c                óX   € ^V^,
          \        V 4      ,          ,           pW,          RV # )z=
repeat or truncate <source> string, so it has length <size>
N)rV   ©r¥   r¦   Úmults   && rC   Úrepeat_stringró   Î  s*   € ð ��q•œS ›[Õ(Õ(€DØ�M˜5˜DÐ!Ð!r9   c               ó$   € V ^8„  d   QhRRRRRR/# )r_   r¥   rÞ   r¦   ra   r`   rb   )rc   s   "rC   rd   rd   Ö  s!   € ÷ .ñ .˜uð .¨Cð .°Eñ .r9   c                óf   € ^V^,
          \        V 4      ,          ,           p\        W,          V4      # )zF
variant of repeat_string() which truncates to nearest UTF8 boundary.
)rV   Úutf8_truncaterñ   s   && rC   Úutf8_repeat_stringr÷   Ö  s*   € ð ��q•œS ›[Õ(Õ(€DÜ˜�¨Ó-Ð-r9   ó    Ú c               ó(   € V ^8„  d   QhRRRRRRRR/# )r_   r¥   r   r¦   ra   ÚpadzAnyStr | Noner`   rb   )rc   s   "rC   rd   rd   â  s(   € ÷ ñ ˜Vð ¨3ð °]ð Èfñ r9   c                ó¤   € Vf#   \        V \        4      '       d   \        M\        p\	        V 4      pW8”  d   WW,
          ,          ,           # V RV # )z>right-pad or truncate <source> string, so it has length <size>N)r‹   r¯   Ú_UNULLÚ_BNULLrV   )r¥   r¦   rû   Úlengths   &&& rC   Úright_pad_stringr   â  sD   € à
‚{Ü" 6¬3×/Ò/�f´Vˆä�‹[€FØ„}Ø˜t�}Õ-Õ-Ð-Ø�%�4ˆ=Ðr9   c               ó$   € V ^8„  d   QhRRRRRR/# )r_   r¥   rÞ   Úindexra   r`   rb   )rc   s   "rC   rd   rd   í  s!   € ÷ =ñ =˜%ð =¨ð =°ñ =r9   c                ój  a a€ \        S \        4      '       g   \        S \        R4      h\        S 4      pV^ 8  d   \	        ^ W,           4      pW8¼  d   S # \        V^,           V4      pW8  d"   S V,          ^À,          ^€8w  d   MV^,          pK'  W8X  g   Q hS RV oVV 3R lpV! 4       '       g   Q hS# )ai  
helper to truncate UTF8 byte string to nearest character boundary ON OR AFTER <index>.
returned prefix will always have length of at least <index>, and will stop on the
first byte that's not a UTF8 continuation byte (128 - 191 inclusive).
since utf8 should never take more than 4 bytes to encode known unicode values,
we can stop after ``index+3`` is reached.
r¥   Nc                 ó    <€  SP                  R 4      p T P                  SP                  R 4      4      '       g   Q hR#   \         d     R# i ; i)úutf-8T)rß   ÚUnicodeDecodeErrorÚ
startswith)Útextrâ   r¥   s    €€rC   Úsanity_checkÚ#utf8_truncate.<locals>.sanity_check  sM   ø€ ð	Ø—=‘= Ó)ˆDð �‰˜vŸ}™}¨WÓ5×6Ò6Ð6Ð6Ùøô "ô 	âð	ús   ƒ> ¾AÁA)r‹   rÞ   r   rV   ÚmaxÚmin)r¥   r  r§   r	  râ   s   f&  @rC   rö   rö   í  s°   ù€ ô* �fœe×$Ò$Ü ¬¨xÓ8Ð8ô ˆf‹+€CØˆq„yÜ�A�u•{Ó#ˆØ„|Øˆô ˆe�a�i˜Ó
€Cð Œ+Ø�%�=˜4Õ 4Ô'àà��
ŠàŒ|Ðˆ|ð �F�Uˆ^€Fö
ñ �>Š>Ðˆ>à€Mr9   s	    
 aA:#!Úasciic               ó    € V ^8„  d   QhRRRR/# )r_   Úcodecr¯   r`   Úboolrb   )rc   s   "rC   rd   rd   1  s   € ÷ Bñ B˜#ð B $ñ Br9   c                ó:   € \         P                  V 4      \        8H  # )zRTest if codec is compatible with 7-bit ascii (e.g. latin-1, utf-8; but not utf-16))Ú_ASCII_TEST_UNICODEr°   Ú_ASCII_TEST_BYTES)r  s   &rC   Úis_ascii_codecr  1  s   € ä×%Ñ% eÓ,Ô0AÑAÐAr9   c               ó$   € V ^8„  d   QhRRRRRR/# )r_   r´   r¯   rµ   r`   r  rb   )rc   s   "rC   rd   rd   6  s&   € ÷ Añ A˜ð A Cð A¨Dñ Ar9   c                ó¸   € W8X  d   R# V '       d	   V'       g   R# \         P                  ! V 4      P                  \         P                  ! V4      P                  8H  # )z3Check if two codec names are aliases for same codecTF)ÚcodecsÚlookupÚnamer³   s   &&rC   r)   r)   6  s;   € à„}Ùß—UÙÜ�=Š=˜Ó×#Ñ#¤v§}¢}°UÓ';×'@Ñ'@Ñ@Ð@r9   ô   Â€c               ó    € V ^8„  d   QhRRRR/# )r_   r¥   r   r`   r  rb   )rc   s   "rC   rd   rd   C  s   € ÷ &ñ &˜&ð & Tñ &r9   c                ó¼   a€ \        V \        4      '       d   \        M\        o\        ;QJ d    V3R lV  4       F  '       d   K   R# 	  R# ! V3R lV  4       4      # )z<Check if string (bytes or unicode) contains only 7-bit asciic              3  ó,   <"  € T F	  qS8  x € K  	  R # 5irG   rb   )r…   rÃ   Úrs   & €rC   rˆ   Ú is_ascii_safe.<locals>.<genexpr>F  s   øé € Ð%™f˜�1Žu›fùs   ƒFT)r‹   rÞ   Ú_B80Ú_U80Úall)r¥   r  s   &@rC   r&   r&   C  s?   ø€ ä˜6¤5×)Ò)�¬t€Aß‹3Ô%™fÓ%�3Œ3Ð%Š3Ð%ˆ3Ô%™fÓ%Ó%Ð%r9   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r_   r¥   zstr | bytesÚencodingr¯   rÕ   Úsource_encodingz
str | Noner`   rÞ   rb   )rc   s   "rC   rd   rd   I  s:   € ÷ &-ñ &-Øð&-àð&-ð ð&-ð  ð	&-ð
 ñ&-r9   c                ó  € V'       g   Q h\        V \        4      '       d<   V'       d2   \        W14      '       g!   V P                  V4      P	                  V4      # V # \        V \
        4      '       d   V P	                  V4      # \        W4      h)aÍ  Helper to normalize input to bytes.

:arg source:
    Source bytes/unicode to process.

:arg encoding:
    Target encoding (defaults to ``"utf-8"``).

:param param:
    Optional name of variable/noun to reference when raising errors

:param source_encoding:
    If this is specified, and the source is bytes,
    the source will be transcoded from *source_encoding* to *encoding*
    (via unicode).

:raises TypeError: if source is not str or bytes.

:returns:
    * unicode strings will be encoded using *encoding*, and returned.
    * if *source_encoding* is not specified, byte strings will be
      returned unchanged.
    * if *source_encoding* is specified, byte strings will be transcoded
      to *encoding*.
)r‹   rÞ   r)   rß   r°   r¯   r   )r¥   r$  rÕ   r%  s   &&&&rC   r2   r2   I  sk   € ÷> €Oˆ8Ü�&œ%× Ò ß¤=°×#KÒ#KØ—=‘= Ó1×8Ñ8¸ÓBÐBØˆÜ�&œ#×ÒØ�}‰}˜XÓ&Ð&Ü
˜fÓ
,Ð,r9   c               ó    € V ^8„  d   QhRRRR/# ©r_   r¥   r   r`   r¯   rb   )rc   s   "rC   rd   rd   r  s   € ÷ -ñ -�vð -À3ñ -r9   c                óª   € V'       g   Q h\        V \        4      '       d   V # \        V \        4      '       d   V P                  V4      # \	        W4      h)aŒ  Helper to normalize input to unicode.

:arg source:
    source bytes/unicode to process.

:arg encoding:
    encoding to use when decoding bytes instances.

:param param:
    optional name of variable/noun to reference when raising errors.

:raises TypeError: if source is not str or bytes.

:returns:
    * returns unicode strings unchanged.
    * returns bytes strings decoded using *encoding*
)r‹   r¯   rÞ   rß   r   ©r¥   r$  rÕ   s   &&&rC   r4   r4   r  sD   € ÷$ €Oˆ8Ü�&œ#×ÒØˆÜ�&œ%× Ò Ø�}‰}˜XÓ&Ð&ä
˜fÓ
,Ð,r9   c               ó    € V ^8„  d   QhRRRR/# r(  rb   )rc   s   "rC   rd   rd   �  s   € ÷ -ñ -˜&ð -Àcñ -r9   c                ó–   € \        V \        4      '       d   V P                  V4      # \        V \        4      '       d   V # \	        W4      h)a#  Take in str or bytes, returns str.
leaves str alone, decodes bytes using specified encoding.

:param source: source unicode or bytes string
:param encoding: encoding to use when encoding unicode or decoding bytes
:param param: optional name of variable/noun to reference when raising errors
)r‹   rÞ   rß   r¯   r   r*  s   &&&rC   r3   r3   �  s=   € ô �&œ%× Ò Ø�}‰}˜XÓ&Ð&Ü�&œ#×ÒØˆÜ
˜fÓ
,Ð,r9   z1.6z1.7)Ú
deprecatedÚremovedc                ó   € \        WRR7      # )z'deprecated, use to_native_str() insteadrg   )rÕ   )r3   )r¥   r$  s   &&rC   Úto_hash_strr0  œ  s   € ô ˜°Ô8Ð8r9   Únonec               ó$   € V ^8„  d   QhRRRRRR/# )r_   rè   zstr | bytes | Noner1  zbool | Noner`   rb   )rc   s   "rC   rd   rd   §  s$   € ÷ ñ ØðØ%0ðàñr9   c                ó@  € VR9   g   Q h\        V \        4      '       dX   V P                  4       P                  4       pV\        9   d   R# V\
        9   d   R# V\        9   d   V# \        RV RV : 24      h\        V \        4      '       d   V # V f   V# \        V 4      # )zP
helper to convert value to boolean.
recognizes strings such as "true", "false"
TFzunrecognized z value: )TFN)	r‹   r   Úlowerr·   Ú	_true_setÚ
_false_setÚ	_none_setrž   r  )rè   r1  rÕ   Úcleans   &&& rC   Úas_boolr9  §  s–   € ð Ð&Ô&Ð&Ð&Ü�%Ô)×*Ò*Ø—‘“×#Ñ#Ó%ˆØ”IÔÙØ”JÔÙØ”IÔØˆKÜ˜=¨¨¨x¸±yÐAÓBÐBÜ�%œ×ÒØˆØ‚}ØˆÜ�‹;Ðr9   Tc           
     óV  € ^ RI Hp \        V R4      '       d$   \        V R4      '       d    V P                  4       p RP                  T \        \        R4      '       d   \        P                  ! 4       MR\        \        4       4      \        P                  ! 4       \        4       \        '       d&   \        P                  ! ^ 4      P                  R4      M^ 4      p\!        V! VP#                  R4      4      P%                  4       ^4      #   \         d    T P                  R	4      p  Lëi ; i)
z.generate prng seed value from system resources)Úsha512ÚgetstateÚgetrandbitsz{} {} {} {:.15f} {:.15f} {}ÚgetpidNrÜ   r  i €  )Úhashlibr;  Úhasattrr<  r@   r=  rc   Úosr>  ÚidÚobjectÚtimer1   Úhas_urandomÚurandomrß   ra   r°   Ú	hexdigest)rè   r;  r  s   &  rC   ÚgenseedrH  Ô  sÛ   € åäˆu�j×!Ò!¤g¨e°]×&CÒ&Cð	/Ø—N‘NÓ$ˆEð
 )×/Ñ/àô œr 8×,Ò,Œ�	Š	Œ°$ô 	Œ6‹8‹ä�	Š	‹Ü‹ç,7«KŒ�
Š
�2‹×Ñ˜iÔ(¸Qó€Dô  ‰v�d—k‘k 'Ó*Ó+×5Ñ5Ó7¸Ó<Ð<øô) #ô 	/ð ×%Ñ% gÓ.ŠEð	/ús   ¬D	 Ä	D(Ä'D(zrandom.Randomc                óP   a a€ S'       g   \         # VV 3R lp\        V! 4       4      # )z]return byte-string containing *count* number of randomly generated bytes, using specified rngc               3  ó�   <"  € SP                  S^,          4      p ^ pVS8  d    V ^ÿ,          x € V ^,          p V^,          pK&  R# 5i)é   N)r=  )rè   r¨   rë   r+   s     €€rC   ÚhelperÚgetrandbytes.<locals>.helper
  sE   øé € à—‘ ¨¥
Ó+ˆØˆØ�%ŒiØ˜$•,ÒØ�a�KˆEØ��FŠAñ ùs   ƒAA)Ú_BEMPTYrÞ   )r+   rë   rL  s   ff rC   r!   r!   þ  s    ù€ ÷ Üˆöô ‘“‹?Ðr9   c                ó  a aaa€ S^ 8  d   \        R4      h\        S4      oS^ 8X  d   \        R4      hS^8X  d
   SS,          # VVVV 3R lp\        S\        4      '       d   RP	                  V! 4       4      # \        V! 4       4      # )z|return string containing *count* number of chars/bytes, whose elements are drawn from specified charset, using specified rngzcount must be >= 0zalphabet must not be emptyc               3  ó    <"  € SP                  ^ SS,          4      p ^ pVS8  d'   SV S,          ,          x € V S,          p V^,          pK-  R# 5i)é    N)Ú	randrange)rè   r¨   Úcharsetrë   Úlettersr+   s     €€€€rC   rL  Úgetrandstr.<locals>.helper%  sM   øé € à—‘˜a ¨%¥Ó0ˆØˆØ�%ŒiØ˜% '�/Õ*Ò*Ø�gÕˆEØ��FŠAñ ùs   ƒAAr:   )rž   rV   r‹   r¯   rÆ   rÞ   )r+   rS  rë   rL  rT  s   fff @rC   r"   r"     s{   û€ ð ˆq„yÜÐ-Ó.Ð.Ü�'‹l€GØ�!„|ÜÐ5Ó6Ð6Ø�!„|Ø˜�Ð÷ð ô �'œ3×ÒØ�w‰w‘v“xÓ Ð Ü‘“‹?Ðr9   Ú42346789ABCDEFGHJKMNPQRTUVWXYZabcdefghjkmnpqrstuvwxyzz2.0z/passlib.pwd.genword() / passlib.pwd.genphrase())r-  r.  Úreplacementc                ó"   € \        \        W4      # )aG  generate random password using given length & charset

:param size:
    size of password.

:param charset:
    optional string specified set of characters to draw from.

    the default charset contains all normal alphanumeric characters,
    except for the characters ``1IiLl0OoS5``, which were omitted
    due to their visual similarity.

:returns: :class:`!str` containing randomly generated password.

.. note::

    Using the default character set, on a OS with :class:`!SystemRandom` support,
    this function should generate passwords with 5.7 bits of entropy per character.
)r"   r+   )r¦   rS  s   &&rC   r    r    6  s   € ô2 ”c˜7Ó)Ð)r9   c                óˆ   a € \         ;QJ d#    V 3R l\         4       F  '       d   K   R# 	  R# ! V 3R l\         4       4      # )z4check if object follows the :ref:`password-hash-api`c              3  ó<   <"  € T F  p\        SV4      x € K  	  R # 5irG   ©r@  ©r…   r  Úobjs   & €rC   rˆ   Ú#is_crypt_handler.<locals>.<genexpr>_  ó   øé € Ð=©n dŒw�s˜D×!Ð!«nùrŠ   FT)r"  Ú_handler_attrs©r]  s   frC   r(   r(   \  ó.   ø€ ÷ ‹3Ô=­nÓ=�3Œ3Ð=Š3Ð=ˆ3Ô=­nÓ=Ó=Ð=r9   c                óˆ   a € \         ;QJ d#    V 3R l\         4       F  '       d   K   R# 	  R# ! V 3R l\         4       4      # )zOcheck if object appears to be a :class:`~passlib.context.CryptContext` instancec              3  ó<   <"  € T F  p\        SV4      x € K  	  R # 5irG   r[  r\  s   & €rC   rˆ   Ú#is_crypt_context.<locals>.<genexpr>o  r_  rŠ   FT)r"  Ú_context_attrsra  s   frC   r'   r'   l  rb  r9   c                óN   € RV P                   9   ;'       d    \        V RR4      RJ# )z_check if handler provides the optional :ref:`rounds information <rounds-attributes>` attributesÚroundsÚ
min_roundsN©Úsetting_kwdsÚgetattr©Úhandlers   &rC   r$   r$   x  s2   € ð 	�G×(Ñ(Ñ(÷ 	=ð 	=Ü�G˜\¨4Ó0¸Ð<ðr9   c                óN   € RV P                   9   ;'       d    \        V RR4      RJ# )z[check if handler provides the optional :ref:`salt information <salt-attributes>` attributesÚsaltÚmin_salt_sizeNrj  rm  s   &rC   r%   r%   €  s4   € ð 	�'×&Ñ&Ñ&÷ 	@ð 	@Ü�G˜_¨dÓ3¸4Ð?ðr9   )Úsha512_cryptÚsha256_cryptÚ
sha1_cryptÚbcryptÚ	md5_cryptÚ
bsdi_cryptÚ	des_crypt)NNFNNF)Ú,rç   rG   )r  rè   N)r  rè   )r  )ÚtrueÚtÚyesÚyÚonÚ1ÚenableÚenabled)ÚfalseÚfÚnor©   ÚoffÚ0ÚdisableÚdisabled)NÚboolean)r  rk  Úcontext_kwdsÚverifyrg   Úidentify)Úneeds_updateÚ	genconfigÚgenhashr‹  ÚencryptrŒ  )|Ú__conditional_annotations__rq   Ú
__future__r   r  r±   ru   rŸ   ÚmathrA  Úrandomr¿   ÚsysrD  ÚtimeitrÇ   Úcollections.abcr   r   Útypingr   Úpasslib.excr   r   Úpasslib.utils.binaryr   r	   r
   r   r   r   r   r   r   r   r   r   r   Úpasslib.utils.compatr   r   r   r   r   Úpasslib.utils.decorr   r   r   r   r   Ú__all__ra   r8   Úmaxsizer/   r5   r,   rN  rÉ   rÂ   Úenvironrx   ÚMAX_PASSWORD_SIZEr>   Ú	ParameterÚVAR_KEYWORDr|   ÚVAR_POSITIONALrz   r�   rœ   r­   r   r¼   r.   r*   ré   rì   r6   ró   r÷   rþ   rý   r   rö   r  rß   r  r  r)   r   r!  r&   r2   r4   r3   r0  Úsetr5  r6  r7  r9  r#   Údefault_timerÚtimerr1   rF  rE  r@   rH  ÚSystemRandomr+   Ú__annotations__ÚRandomr!   r"   Ú
_52charsetr    r`  r(   rf  r'   r$   r%   )r‘  s   @rC   Ú<module>r«     s‘  øðÜ :å "ã Û Û Û Û Û 	Û Û Û 
Û Û Û ß .Ý ç >÷÷ ÷ õ ÷ õ ÷õ ð,Øð,àð,ð ð,ð ð	,ð
 ð,ð ð,ð ð,ð ð,ð ð,ð ð,ð ð,ð ð,ð ð,ð ð,ð ð,ð  ð!,ð" ð#,ð$ 
ð%,ð& ð',ð( ð),ð* ð+,ð, ð-,ð. ð/,ð0 ð1,ð2 ð3,ð4 ð5,ð6 ð7,ð8 ð9,ð: ð;,ð< ð=,ð> ð?,ð@ 
ðA,ðB ðC,ðD ðE,ðF ðG,ðH ðI,ðJ ðK,ðL ðM,ðN ðO,ðP ðQ,ðR ðS,ðT ðU,ðV ðW,€ñ^ ˆt�yŠy˜Ÿ™Ó%¨Õ+Ó,€ò	Ð ð  Ð'Ð à
€Ø
€Ø
€ñ ˜Ÿ
™
Ÿ™Ð'BÓC×KÐKÀtÓLÐ ÷&ñ &ðD × Ñ ×,Ñ,€Ø˜g×/Ñ/×>Ñ>Ð?€ò	9ôS(òl3ò4,ô	8ônòb$ò0(ò(ñ ˆÐGÔ HÙ ˆÐGÔ HõMõ
"õ.ð 
€Ø	€÷õ=ð@ (Ð Ø'×.Ñ.¨wÓ7Ð õBõ
Að €Ø€õ&÷&-÷R-÷6-ñ  ¨uÔ5ó9ó 6ð9ñ
 ÒIÓJ€	ÙÒMÓN€
Ù��V�Ó€	÷ð0 €	ð 	×Ñ€à€ðØ‡J‚Jˆq„MØ€Kô
=÷> Ø×,Ò,Ó.€CˆÔ.ð �-Š-™›	Ó
"€Còò0ð: D€
ñ ØØØAôð
  zó *óð
*ð.€ò>ð€ò>òôøða ô Ø‚Kðús   É K Ë	K*Ë)K*