Ë
    ”Âiå  ã                   óä   — d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z
 ddlmZ ddlmZ d	Z ee«       ed
«      z  Z ej"                  d«      Zd„ Zd„ Zd„ Zdd„Zdd„Zd„ Zd„ Zd„ Zddefd„Zy)zWauthlib.util.urls.
~~~~~~~~~~~~~~~~~

Wrapper functions for URL encoding and decoding.
é    N©Úquote)Úunquote)Ú	urlencodeé   )Úto_bytes)Ú
to_unicodezAABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-z=&;:%+~,*@!()/?z&%[^0-9A-Fa-f]|%[0-9A-Fa-f][^0-9A-Fa-f]c                 óŒ   — g }| D ]*  \  }}|j                  t        |«      t        |«      f«       Œ, t        t        |«      «      S ©N)Úappendr   r	   Ú
_urlencode)ÚparamsÚencodedÚkÚvs       úK/var/www/timesheet/venv/lib/python3.12/site-packages/authlib/common/urls.pyÚ
url_encoder      sC   € Ø€GØò 3‰ˆˆ1Ø�‰œ ›¤X¨a£[Ð1Õ2ð3ä”j Ó)Ó*Ð*ó    c                 óB  — | r4t        | «      t        k  s"d}t        |t        | «      t        z
  | fz  «      ‚t        j	                  | «      rt        d«      ‚t        j                  | d¬«      }g }|D ]*  \  }}|j                  t        |«      t        |«      f«       Œ, |S )a‚  Decode a query string in x-www-form-urlencoded format into a sequence
    of two-element tuples.

    Unlike urlparse.parse_qsl(..., strict_parsing=True) urldecode will enforce
    correct formatting of the query string by validation. If validation fails
    a ValueError will be raised. urllib.parse_qsl will only raise errors if
    any of name-value pairs omits the equals sign.
    z£Error trying to decode a non urlencoded string. Found invalid characters: %s in the string: '%s'. Please ensure the request/response body is x-www-form-urlencoded.z%Invalid hex encoding in query string.T©Úkeep_blank_values)	ÚsetÚ
urlencodedÚ
ValueErrorÚINVALID_HEX_PATTERNÚsearchÚurlparseÚ	parse_qslr   r	   )ÚqueryÚerrorr   Údecodedr   r   s         r   Ú
url_decoder"      s¤   € ñ ”S˜“Z¤:Ò-ð%ð 	ô ˜¤# e£*¬zÑ"9¸5Ð!AÑAÓBÐBô ×!Ñ! %Ô(ÜÐ@ÓAÐAô& ×Ñ ¸Ô>€Fð €GØò 7‰ˆˆ1Ø�‰œ
 1›¤z°!£}Ð5Õ6ð7à€Nr   c                 ó¨   — t        |t        «      r|j                  «       }t        j                  | d¬«      }|j                  |«       t        |«      S )z)Extend a query with a list of two-tuples.Tr   )Ú
isinstanceÚdictÚitemsr   r   Úextendr   )r   r   Úqss      r   Úadd_params_to_qsr)   Q   s?   € ä�&œ$ÔØ—‘“ˆä	×	Ñ	˜E°TÔ	:€BØ‡I�IˆfÔÜ�b‹>Ðr   c                 ó¦   — t        j                   | «      \  }}}}}}|rt        ||«      }nt        ||«      }t        j                  ||||||f«      S )z5Add a list of two-tuples to the uri query components.)r   r)   Ú
urlunparse)	Úurir   ÚfragmentÚschÚnetÚpathÚparr   Úfras	            r   Úadd_params_to_urir3   [   sX   € ä&.×&7Ñ&7¸Ó&<Ñ#€Cˆˆd�C˜ ÙÜ˜s FÓ+‰ä  ¨Ó/ˆÜ×Ñ  S¨$°°U¸CÐ@ÓAÐAr   c                 ó>   — t        t        t        | «      |«      «      S r   )r	   Ú_quoter   )ÚsÚsafes     r   r   r   e   s   € Ü”fœX a›[¨$Ó/Ó0Ð0r   c                 ó*   — t        t        | «      «      S r   )r	   Ú_unquote©r6   s    r   r   r   i   s   € Ü”h˜q“kÓ"Ð"r   c                 ó   — t        | d«      S )Ns   ~@#$&()*!+=:;,.?/'r   r:   s    r   Ú	quote_urlr<   m   s   € Ü�Ð)Ó*Ð*r   c                 óN  — t        | t        t        f«      r	 t        | «      } t        | t        «      rAg }| j                  «       D ]*  \  }}|j                  t        |«      t        |«      f«       Œ, |S | sy	 t        | «      S # t        t
        f$ r Y yw xY w# t
        $ r Y yw xY w)a*  Extract parameters and return them as a list of 2-tuples.

    Will successfully extract parameters from urlencoded query strings,
    dicts, or lists of 2-tuples. Empty strings/dicts/lists will return an
    empty list of parameters. Any other input will result in a return
    value of None.
    N)
r$   ÚlistÚtupler%   Ú	TypeErrorr   r&   r   r	   r"   )Úrawr   r   r   s       r   Úextract_paramsrB   q   s©   € ô �#œœe�}Ô%ð	Ü�s“)ˆCô �#”tÔØˆØ—I‘I“Kò 	:‰DˆAˆqØ�M‰Mœ: a›=¬*°Q«-Ð8Õ9ð	:àˆáØðÜ˜#‹Ðøô œ:Ð&ò 	Ùð	ûô ò Ùðús#   ˜B Á8
B ÂBÂBÂ	B$Â#B$Úurlc                 ó†   — t        j                   | «      }|j                  xr |j                  xr |xs |j                   S r   )r   ÚschemeÚhostnamer-   )rC   Úfragments_allowedÚparseds      r   Úis_valid_urlrI   Ž   s9   € Ü×Ñ˜sÓ#€Fà�‰ÒX˜&Ÿ/™/ÒXÐ/@Ò/WÈÏÉÐDWðr   )F)ó   /)T)Ú__doc__ÚreÚurllib.parseÚparser   r   r5   r   r9   r   r   Úencodingr   r	   Úalways_safer   r   Úcompiler   r   r"   r)   r3   r<   rB   ÚstrrI   © r   r   ú<module>rT      sƒ   ðñó 
Ý Ý (Ý ,Ý 0å Ý  àQ€Ù�Ó¡Ð$5Ó 6Ñ6€
Ø �b—j‘jÐ!JÓKÐ ò+ò2òjóBó1ò#ò+òñ:�cô r   