+
    yj                        a  0 t $ ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RItRtRt	]
! R ]P                  ]P                  P                  3 4       4      tR]R&   R R	 ltR
 R ltRR R lltR R ltR R ltR# )    )annotationsN>abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789i'	 c              #  B   "   T F  qf   K  VR8w  g   K  Vx  K  	  R # 5i)N/ ).0seps   & E/var/www/html/2rare/lib/python3.14/site-packages/werkzeug/security.py	<genexpr>r      s      +CC3#:CC+s   
z	list[str]_os_alt_sepsc                    V ^8  d   QhRRRR/# )   lengthintreturnstrr   )formats   "r
   __annotate__r      s     F FS FS F    c                h    V ^ 8:  d   \        R4      hRP                  R \        V 4       4       4      # )zAGenerate a random string of SALT_CHARS with specified ``length``.zSalt length must be at least 1. c              3  V   "   T F  p\         P                  ! \        4      x  K!  	  R # 5iN)secretschoice
SALT_CHARS)r   _s   & r
   r   gen_salt.<locals>.<genexpr>   s     E}!7>>*--}s   '))
ValueErrorjoinrange)r   s   &r
   gen_saltr"      s.    {:;;77EuV}EEEr   c               (    V ^8  d   QhRRRRRRRR/# )r   methodr   saltpasswordr   ztuple[str, str]r   )r   s   "r
   r   r      s(     -= -=3 -=c -=S -=_ -=r   c           	        V P                  R 4      vrVP                  4       pVP                  4       pV R8X  dm   V'       g   Rp^p^pM \        \        V4      w  rgp^V,          V,          V,          p	\
        P                  ! WTWgWR7      P                  4       RV R V R V 23# V R8X  d   \        V4      p
V
^ 8X  d
   Rp\        pMEV
^8X  d   V^ ,          p\        pM.V
^8X  d   V^ ,          p\        V^,          4      pM\	        R4      h\
        P                  ! WWL4      P                  4       R	V R V 23# \	        R
V  R24      h  \         d    \	        R4      Rhi ; i):scryptz'scrypt' takes 3 arguments.N)r%   nrpmaxmemzscrypt:pbkdf2sha256z'pbkdf2' takes 2 arguments.zpbkdf2:zInvalid hash method 'z'.i   )splitencodemapr   r   hashlibr)   hexlenDEFAULT_PBKDF2_ITERATIONSpbkdf2_hmac)r$   r%   r&   args
salt_bytespassword_bytesr*   r+   r,   r-   len_args	hash_name
iterationss   &&&          r
   _hash_internalr>      sv   LL%MFJ__&NAAAJc4.a q1qNN1QceaS!AaS!	
 	
 
8	t9q= I2J]QI2J]QIT!WJ:;; :cei[*.	
 	
 0;<<A  J !>?TIJs   
E	 	E!c               (    V ^8  d   QhRRRRRRRR/# )r   r&   r   r$   salt_lengthr   r   r   )r   s   "r
   r   r   I   s,     !) !)!)!)8;!)!)r   c                H    \        V4      p\        WV 4      w  rEV RV RV 2# )a  Securely hash a password for storage. A password can be compared to a stored hash
using :func:`check_password_hash`.

The following methods are supported:

-   ``scrypt``, the default. The parameters are ``n``, ``r``, and ``p``, the default
    is ``scrypt:32768:8:1``. See :func:`hashlib.scrypt`.
-   ``pbkdf2``, less secure. The parameters are ``hash_method`` and ``iterations``,
    the default is ``pbkdf2:sha256:600000``. See :func:`hashlib.pbkdf2_hmac`.

Default parameters may be updated to reflect current guidelines, and methods may be
deprecated and removed if they are no longer considered secure. To migrate old
hashes, you may generate a new hash when checking an old hash, or you may contact
users with a link to reset their password.

:param password: The plaintext password.
:param method: The key derivation function and parameters.
:param salt_length: The number of characters to generate for the salt.

.. versionchanged:: 2.3
    Scrypt support was added.

.. versionchanged:: 2.3
    The default iterations for pbkdf2 was increased to 600,000.

.. versionchanged:: 2.3
    All plain hashes are deprecated and will not be supported in Werkzeug 3.0.
$)r"   r>   )r&   r$   r@   r%   hactual_methods   &&&   r
   generate_password_hashrE   I   s4    > K D%fH=A_AdV1QC((r   c               $    V ^8  d   QhRRRRRR/# )r   pwhashr   r&   r   boolr   )r   s   "r
   r   r   m   s&     S S Ss St Sr   c                     V P                  R^4      w  r#p\        P                  ! \	        Y#T4      ^ ,          T4      #   \         d     R# i ; i)a  Securely check that the given stored password hash, previously generated using
:func:`generate_password_hash`, matches the given password.

Methods may be deprecated and removed if they are no longer considered secure. To
migrate old hashes, you may generate a new hash when checking an old hash, or you
may contact users with a link to reset their password.

:param pwhash: The hashed password.
:param password: The plaintext password.

.. versionchanged:: 2.3
    All plain hashes are deprecated and will not be supported in Werkzeug 3.0.
rB   F)r0   r   hmaccompare_digestr>   )rG   r&   r$   r%   hashvals   &&   r
   check_password_hashrM   m   sQ     &S! 4g ~fHEaH'RR  s   ? AAc               $    V ^8  d   QhRRRRRR/# )r   	directoryr   	pathnamesr   z
str | Noner   )r   s   "r
   r   r      s!     " " "# "* "r   c                  a V '       g   Rp V .pV F  oSR8w  d   \         P                  ! S4      o\        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      '       gD   \        P
                  P                  S4      '       g   SR8X  g   SP                  R4      '       d    R# VP                  S4       K  	  \         P                  ! V!  # )	a  Safely join zero or more untrusted path components to a base
directory to avoid escaping the base directory.

:param directory: The trusted base directory.
:param pathnames: The untrusted path components relative to the
    base directory.
:return: A safe path, otherwise ``None``.
.r   c              3  ,   <"   T F	  qS9   x  K  	  R # 5ir   r   )r   r	   filenames   & r
   r   safe_join.<locals>.<genexpr>   s     8<Cx<s   TFz..z../N)
	posixpathnormpathanyr   ospathisabs
startswithappendr    )rO   rP   partsrT   s   &* @r
   	safe_joinr_      s      	KEr> ))(3H C8<8CCC8<888ww}}X&&4""5))X  >>5!!r   )r)      )__conditional_annotations__
__future__r   r3   rJ   rY   rV   r   r   r6   listr	   rZ   altsepr   __annotations__r"   r>   rE   rM   r_   )ra   s   @r
   <module>rf      sr    " "   	  M
"  FFBGGNN+ i 
F-=`!)HS,"r   