§
    ìXÊjƒO  ã                   ó4  — U d Z ddlZddlZddlZddlZddl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mZmZ d	d
lmZ d	dlmZ d	dlmZmZ dZdZdededdfd„Zda e
¦   «         Zda edz  e!d<    ej"        e#¦  «        Z$dedz  fd„Z%dedz  fd„Z&dedz  fd„Z'dedz  fd„Z( G d„ de¦  «        Z) e
¦   «         Z*da+e)dz  e!d<   dZ,dedz  fd„Z- G d„ de¦  «        Z. e
¦   «         Z/da0e.dz  e!d <   d!Z1dZ2da3dedz  fd"„Z4d#edefd$„Z5d%eddfd&„Z6d'e7eef         de8dz  fd(„Z9de7eef         fd)„Z:de7ee7eef         f         fd*„Z;d+e7ee7eef         f         ddfd,„Z<d-ededz  fd.„Z=ddd/œd#ed-ed0edz  d1e8dz  ddf
d2„Z>d#edz  dedz  fd3„Z?dS )4zVContains a helper to get the token from machine (env variable, secret or config file).é    N)ÚPath)ÚLock)Ú	TypedDicté   )Ú	constants)ÚDeviceCodeErrorÚOAuthErrorCodeÚ	OIDCErroré   )ÚWeakFileLock)Úrefresh_access_token)Úis_colab_enterpriseÚis_google_colabi€  iÀ  ÚpathÚcontentÚreturnc                 ó  — | j                              ddt          ¬¦  «         t          j        t          | ¦  «        t          j        t          j        z  t          j        z  t          ¦  «        }t          j
        |dd¬¦  «        5 }|                     |¦  «         ddd¦  «         n# 1 swxY w Y   	 |                      t          ¦  «         | j                              t          ¦  «         dS # t          t          f$ r Y dS w xY w)ziWrite content to file, restricting both the file and its parent directory to owner-only on POSIX systems.T)ÚparentsÚexist_okÚmodeÚwúutf-8©ÚencodingN)ÚparentÚmkdirÚ_SECRET_DIR_MODEÚosÚopenÚstrÚO_WRONLYÚO_CREATÚO_TRUNCÚ_SECRET_FILE_MODEÚfdopenÚwriteÚchmodÚOSErrorÚNotImplementedError)r   r   ÚfdÚfs       úLC:\Projects\Historical\venv\Lib\site-packages\huggingface_hub/utils/_auth.pyÚ_write_secretr-   %   s$  € à„K×Ò˜d¨TÕ8HÐÑIÔIÐIÝ	Œ•�T‘”�BœK­"¬*Ñ4µr´zÑAÕCTÑ	UÔ	U€Bõ 
Œ�2�s WÐ	-Ñ	-Ô	-ð °Ø	�Š�ÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ðØ�
Š
Õ$Ñ%Ô%Ð%ØŒ×ÒÕ*Ñ+Ô+Ð+Ð+Ð+øÝÕ(Ð)ð ð ð àˆˆðøøøs$   ÂB(Â(B,Â/B,Â49C/ Ã/DÄDFÚ_GOOGLE_COLAB_SECRETc                  ór   — t          ¦   «         p)t          ¦   «         pt          ¦   «         pt          ¦   «         S )a]  
    Get token if user is logged in.

    Note: in most cases, you should use [`huggingface_hub.utils.build_hf_headers`] instead. This method is only useful
          if you want to retrieve the token for other purposes than sending an HTTP request.

    If `HF_OIDC_RESOURCE` is set (Trusted Publishers, typically in CI), a short-lived token obtained via OIDC token
    exchange takes precedence. Otherwise the token is retrieved from the `HF_TOKEN` environment variable, then from the
    token file in the Hugging Face home folder. Returns None if user is not logged in. To log in, use [`login`] or
    `hf auth login`.

    OAuth tokens obtained with the browser-based login come with a refresh token: when such a token is close to
    expiry, it is transparently refreshed and persisted before being returned.

    Note: if `HF_OIDC_RESOURCE` is set but the OIDC token exchange fails, this raises instead of returning `None`,
    opting into OIDC is explicit, so a failure surfaces as a clear error rather than a silent fallback.

    Returns:
        `str` or `None`: The token, `None` if it doesn't exist.
    )Ú_get_token_from_oidcÚ_get_token_from_environmentÚ_get_token_from_file_refreshedÚ_get_token_from_google_colab© ó    r,   Ú	get_tokenr6   <   s>   € õ, 	ÑÔð 	*Ý&Ñ(Ô(ð	*å)Ñ+Ô+ð	*õ (Ñ)Ô)ð	r5   c                  óh  — t          ¦   «         rt          ¦   «         rdS t          5  t          rt          cddd¦  «         S 	 ddlm}  ddlm} n# t          $ r Y ddd¦  «         dS w xY w	 |  
                    d¦  «        }t          |¦  «        an�# | j        $ r t          j        d¦  «         daY n_| j        $ r t                                d¦  «         daY n8|$ r1}t          j        dt%          |¦  «        › d	�¦  «         daY d}~nd}~ww xY wd
at          cddd¦  «         S # 1 swxY w Y   dS )zãGet token from Google Colab secrets vault using `google.colab.userdata.get(...)`.

    Token is read from the vault only once per session and then stored in a global variable to avoid re-requesting
    access to the vault.
    Nr   )Úuserdata)ÚErrorÚHF_TOKENz¥
Access to the secret `HF_TOKEN` has not been granted on this notebook.
You will not be requested again.
Please restart the session if you want to be prompted again.z¯The secret `HF_TOKEN` does not exist in your Colab secrets. Run `huggingface_hub.login()` to authenticate (recommended but still optional to access public models or datasets).z@
Error while fetching `HF_TOKEN` secret value from your vault: 'z'.T)r   r   Ú_GOOGLE_COLAB_SECRET_LOCKÚ_IS_GOOGLE_COLAB_CHECKEDr.   Úgoogle.colabr8   Úgoogle.colab.errorsr9   ÚImportErrorÚgetÚ_clean_tokenÚNotebookAccessErrorÚwarningsÚwarnÚSecretNotFoundErrorÚloggerÚinfor    )r8   Ú
ColabErrorÚtokenÚes       r,   r3   r3   Y   sE  € õ ÑÔð Õ 3Ñ 5Ô 5ð Øˆtõ 
#ð ($ð ($õ $ð 	(Ý'ð($ð ($ð ($ð ($ñ ($ô ($ð ($ð ($ð	Ø-Ð-Ð-Ð-Ð-Ð-Ø?Ð?Ð?Ð?Ð?Ð?Ð?øÝð 	ð 	ð 	Øð($ð ($ð ($ñ ($ô ($ð ($ð ($ð ($ð	øøøð	(Ø—L’L Ñ,Ô,ˆEÝ#/°Ñ#6Ô#6Ð Ð øØÔ+ð 	(ð 	(ð 	(õ ŒMðQñô ð ð
 $(Ð Ð Ð ØÔ+ð 	(ð 	(ð 	(õ �KŠKðfñô ð ð $(Ð Ð Ð Øð 	(ð 	(ð 	(åŒMÐhÕ^aÐbcÑ^dÔ^dÐhÐhÐhÑiÔiÐiØ#'Ð Ð Ð Ð Ð Ð øøøøð	(øøøð
 $(Ð Ý#ðQ($ð ($ð ($ð ($ñ ($ô ($ð ($ð ($ð ($ð ($ð ($ð ($øøøð ($ð ($ð ($ð ($ð ($ð ($sw   ¦D'ÁAÁD'Á
A(ÁD'Á'A(Á(D'Á,$BÂD'Â DÂ1D'Â3%DÃD'ÃDÃ'D
ÄD'Ä
DÄD'Ä'D+Ä.D+c                  ó˜   — t          t          j                             d¦  «        pt          j                             d¦  «        ¦  «        S )Nr:   ÚHUGGING_FACE_HUB_TOKEN)rA   r   Úenvironr@   r4   r5   r,   r1   r1   “   s2   € å�œ
Ÿš zÑ2Ô2Ð^µb´j·n²nÐE]Ñ6^Ô6^Ñ_Ô_Ð_r5   c                  ó–   — 	 t          t          t          j        ¦  «                             ¦   «         ¦  «        S # t
          $ r Y d S w xY w)N)rA   r   r   ÚHF_TOKEN_PATHÚ	read_textÚFileNotFoundErrorr4   r5   r,   Ú_get_token_from_filerR   ˜   sN   € ðÝ�D¥Ô!8Ñ9Ô9×CÒCÑEÔEÑFÔFÐFøÝð ð ð Øˆtˆtðøøøs   ‚7: º
AÁAc                   ó.   — e Zd ZU eed<   eed<   eed<   dS )Ú_OidcTokenCacheÚresourcerI   Ú
expires_atN©Ú__name__Ú
__module__Ú__qualname__r    Ú__annotations__Úfloatr4   r5   r,   rT   rT   Ÿ   s0   € € € € € € Ø€M€M�MØ€J€J�JØÐÐÑÐÐr5   rT   Ú_OIDC_TOKEN_CACHEi,  c                  óz  — t           j                             d¦  «        } | sdS ddlm}m} t          5  t          j        ¦   «         }t          �;t          d         | k    r*|t          d         k     rt          d         cddd¦  «         S t           j                             d¦  «        pd}|€ |¦   «         €t          d	¦  «        ‚ || |¬
¦  «        }|d         }t          |                     dd¦  «        ¦  «        }|�dnt          }| ||t          ||z
  d¦  «        z   dœa	|cddd¦  «         S # 1 swxY w Y   dS )aë  Get a short-lived OIDC token in CI (Trusted Publishers).

    Enabled by setting `HF_OIDC_RESOURCE`, which scopes the token to a repo or user.
    The ID token is read from `HF_OIDC_ID_TOKEN` if available, or minted from a supported CI provider (e.g. GitHub Actions).

    Returns `None` when OIDC is not enabled.
    If enabled, any failure is raised explicitly rather than falling back silently.

    See `huggingface_hub._oidc` and https://huggingface.co/docs/hub/trusted-publishers.
    ÚHF_OIDC_RESOURCENr   )Údetect_providerÚ
oidc_loginrU   rV   rI   ÚHF_OIDC_ID_TOKENzçHF_OIDC_RESOURCE is set but no OIDC id token is available: not running in a supported CI provider (github) and HF_OIDC_ID_TOKEN is not set. Set HF_OIDC_ID_TOKEN to the id token minted by your CI provider, or unset HF_OIDC_RESOURCE.)rU   Úsubject_tokenÚaccess_tokenÚ
expires_ini  r   )rU   rI   rV   )r   rM   r@   Ú_oidcr`   ra   Ú_OIDC_TOKEN_LOCKÚtimeÚ	monotonicr]   r
   ÚintÚ_OIDC_REFRESH_MARGINÚmax)	rU   r`   ra   Únowrc   ÚresultrI   re   Úmargins	            r,   r0   r0   ¬   sÎ  € õ Œz�~Š~Ð0Ñ1Ô1€HØð Øˆtà3Ð3Ð3Ð3Ð3Ð3Ð3Ð3õ 
ð ð ÝŒnÑÔˆåÐ)Ý! *Ô-°Ò9Ð9ØÕ'¨Ô5Ò5Ð5å$ WÔ-ðð ð ð ñ ô ð ð õ œ
ŸšÐ'9Ñ:Ô:ÐB¸dˆØÐ  _ _Ñ%6Ô%6Ð%>ÝðOñô ð ð � X¸]ÐKÑKÔKˆØ�~Ô&ˆÝ˜Ÿš L°$Ñ7Ô7Ñ8Ô8ˆ
ð $Ð/��Õ5Iˆà ØØ¥ J°Ñ$7¸Ñ ;Ô ;Ñ;ð
ð 
Ðð
 ð=ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s   ³A	D0Â	BD0Ä0D4Ä7D4c                   ó.   — e Zd ZU eed<   eed<   eed<   dS )Ú_OAuthRefreshCacheÚ
file_tokenÚresolved_tokenÚ
recheck_atNrW   r4   r5   r,   rq   rq   ß   s3   € € € € € € Ø€O€O�OØÐÐÑØÐÐÑÐÐr5   rq   Ú_OAUTH_REFRESH_CACHEi€Q c                  óD   — t          ¦   «         } | €dS t          | ¦  «        S )zSGet the token from `HF_TOKEN_PATH`, transparently refreshing it if close to expiry.N)rR   Ú_refresh_oauth_token_if_needed©rI   s    r,   r2   r2   î   s%   € å Ñ"Ô"€EØ€}ØˆtÝ)¨%Ñ0Ô0Ð0r5   rI   c           	      óÆ  ‡ — t           5  t          j        ¦   «         }t          }|�,|d         ‰ k    r ||d         k     r|d         cddd¦  «         S t          ˆ fd„t	          ¦   «                              ¦   «         D ¦   «         di f¦  «        \  }}|                     d¦  «        }t          |¦  «        }|�|�|€@t          ¦   «         }|�|‰ k    r|cddd¦  «         S ‰ ‰ |t          z   dœa‰ cddd¦  «         S |t          z
  |k    r‰ ‰ |t          z
  dœa‰ cddd¦  «         S 	 t          t          j        dz   d	¬
¦  «        5  t	          ¦   «                              |i ¦  «        }|                     d¦  «        ‰ k    r'|                     d¦  «        p‰ }t          |¦  «        }	nÁt          |¦  «        }
|
d         }d|
v r%t          |¦  «        t          |
d         ¦  «        z   nd}	t!          |||
                     d¦  «        p||	¬¦  «         t          ¦   «         ‰ k    r't#          t%          t          j        ¦  «        |¦  «         t(                               d|› d�¦  «         ddd¦  «         n# 1 swxY w Y   n # t,          $ r“}t/          |t0          ¦  «        rC|j        t4          j        k    r.t(                               d|› d�¦  «         t;          d¦  «        }nt=          d|› d�¦  «         |t          z   }‰ ‰ |dœa‰ cY d}~cddd¦  «         S d}~ww xY w||t?          |t          z   |	r
|	t          z
  nd¦  «        dœa|cddd¦  «         S # 1 swxY w Y   dS )a“  Refresh an OAuth access token if it is close to expiry. Best-effort: never raises.

    OAuth tokens obtained with the browser-based login are stored with a `refresh_token` and an
    `expires_at` timestamp (see `_save_token`). When the active token is one of them and about to
    expire, exchange the refresh token for a new access token and persist it. Any other token is
    returned unchanged.
    Nrr   rt   rs   c              3   óX   •K  — | ]$\  }}|                      d ¦  «        ‰k    ¯||fV — Œ%dS )Úhf_tokenN©r@   )Ú.0ÚnameÚfieldsrI   s      €r,   ú	<genexpr>z1_refresh_oauth_token_if_needed.<locals>.<genexpr>  sF   øè è € ÐvÐv¡  fÐV\×V`ÒV`ÐakÑVlÔVlÐpuÒVuÐVuˆd�Fˆ^ÐVuÐVuÐVuÐVuÐvÐvr5   Úrefresh_token)rr   rs   rt   z.locké   )Útimeoutr{   rd   re   )rI   Ú
token_namer�   rV   zAccess token `z` has been refreshed.z�Your Hugging Face access token has expired and could not be refreshed (session expired or revoked). Run `hf auth login` to re-authenticate. (ú)Úinfz2Could not refresh your Hugging Face access token: z. Will retry later.r   ) Ú_OAUTH_REFRESH_LOCKrh   ru   ÚnextÚ_read_stored_tokens_fullÚitemsr@   Ú_parse_expires_atrR   Ú_OAUTH_RECHECK_INTERVALÚ_OAUTH_REFRESH_MARGINr   r   ÚHF_STORED_TOKENS_PATHr   rj   Ú_save_tokenr-   r   rO   rF   rG   Ú	ExceptionÚ
isinstancer   Ú
error_coder	   ÚINVALID_GRANTÚwarningr\   Ú_warn_refresh_failure_oncerl   )rI   rm   Úcacher„   r   r�   rV   Úcurrent_file_tokenÚ	new_tokenÚnew_expires_atÚresponserJ   rt   s   `            r,   rw   rw   ö   sZ  ø€ õ 
ð Wð WÝŒi‰kŒkˆÝ$ˆØÐ  |Ô!4¸Ò!=Ð!=À#ÈÈlÔH[ÒB[ÐB[ØÐ)Ô*ð	Wð Wð Wð Wñ Wô Wð Wð Wõ "ØvÐvÐvÐvÕ0HÑ0JÔ0J×0PÒ0PÑ0RÔ0RÐvÑvÔvØ�2ˆJñ
ô 
Ñˆ
�Fð Ÿ
š
 ?Ñ3Ô3ˆÝ& vÑ.Ô.ˆ
ØÐ Ð!6¸*Ð:Lõ "6Ñ!7Ô!7ÐØ!Ð-Ð2DÈÒ2MÐ2MØ)ð#Wð Wð Wð Wñ Wô Wð Wð Wð( $Ø"'Ø!Õ$;Ñ;ð$ð $Ð ð
 ð1Wð Wð Wð Wñ Wô Wð Wð Wð4 Õ-Ñ-°Ò3Ð3à#Ø"'Ø(Õ+@Ñ@ð$ð $Ð ð
 ðAWð Wð Wð Wñ Wô Wð Wð WðD)	õ �iÔ=ÀÑGÐQSÐTÑTÔTð Tð Tå1Ñ3Ô3×7Ò7¸
ÀBÑGÔG�Ø—:’:˜jÑ)Ô)¨UÒ2Ð2à &§
¢
¨:Ñ 6Ô 6Ð ?¸%�IÝ%6°vÑ%>Ô%>�N�Nå3°MÑBÔB�HØ (¨Ô 8�IØO[Ð_gÐOgÐOg¥S¨¡X¤Xµ°H¸\Ô4JÑ0KÔ0KÑ%KÐ%KÐmq�NÝØ'Ø#-à&.§l¢l°?Ñ&CÔ&CÐ&TÀ}Ø#1ðñ ô ð õ ,Ñ-Ô-°Ò6Ð6Ý%¥d­9Ô+BÑ&CÔ&CÀYÑOÔOÐOÝ—K’KÐ R°Ð RÐ RÐ RÑSÔSÐSð+Tð Tð Tñ Tô Tð Tð Tð Tð Tð Tð Tøøøð Tð Tð Tð Tøøõ, ð 	ð 	ð 	Ý˜!�_Ñ-Ô-ð ;°!´,Å.ÔB^Ò2^Ð2^õ —’ðcØ^_ðcð cð cñô ð õ # 5™\œ\�
�
õ +Ð+vÐ`aÐ+vÐ+vÐ+vÑwÔwÐwØ Õ#:Ñ:�
à27È5Ð`jÐ#kÐ#kÐ ØˆLˆLˆLˆLˆLðWWð Wð Wð Wñ Wô Wð Wð Wøøøøðv	øøøð& $Ø'õ ØÕ-Ñ-Ø:HÐO�Õ!6Ñ6Ð6Èañô ð	 
ð 	 
Ðð ðoWð Wð Wð Wñ Wô Wð Wð Wð Wð Wð Wð Wøøøð Wð Wð Wð Wð Wð Wsz   ‰<MÁB MÃMÃ;MÄ&J ÅD$I4É(J É4I8	É8J É;I8	É<J É?MÊ 
LÊ
A<LÌLÌMÌLÌ,MÍMÍMÚmessagec                 óP   — t           st                               | ¦  «         da d S d S )NT)Ú_OAUTH_REFRESH_WARNEDrF   r”   )r›   s    r,   r•   r•   Y  s2   € å ð %Ý�Š�wÑÔÐØ $ÐÐÐð%ð %r5   r   c                 ó^   — 	 t          | d         ¦  «        S # t          t          f$ r Y dS w xY w)zVParse the `expires_at` field of a stored-tokens section, `None` if missing or corrupt.rV   N)rj   ÚKeyErrorÚ
ValueError)r   s    r,   r‹   r‹   `  sA   € ðÝ�6˜,Ô'Ñ(Ô(Ð(øÝ•jÐ!ð ð ð Øˆtˆtðøøøs   ‚ —,«,c                  óV   — d„ t          ¦   «                              ¦   «         D ¦   «         S )aA  
    Returns the parsed INI file containing the access tokens.
    The file is located at `HF_STORED_TOKENS_PATH`, defaulting to `~/.cache/huggingface/stored_tokens`.
    If the file does not exist, an empty dictionary is returned.

    Returns: `dict[str, str]`
        Key is the token name and value is the token.
    c                 óB   — i | ]\  }}||                      d d¦  «        “ŒS )r{   Ú r|   )r}   r„   r   s      r,   ú
<dictcomp>z%get_stored_tokens.<locals>.<dictcomp>q  s-   € ÐpÐpÐpÑ7I°zÀ6ˆJ˜Ÿ
š
 :¨rÑ2Ô2ÐpÐpÐpr5   )r‰   rŠ   r4   r5   r,   Úget_stored_tokensr¥   h  s,   € ð qÐpÕMeÑMgÔMg×MmÒMmÑMoÔMoÐpÑpÔpÐpr5   c                  ó€  ‡— t          t          j        ¦  «        } |                      ¦   «         si S t	          j        d¬¦  «        Š	 ‰                     | d¬¦  «         ˆfd„‰                     ¦   «         D ¦   «         S # t          j        t          f$ r)}t                               d|› �¦  «         i cY d}~S d}~ww xY w)zõRead all sections of the stored tokens INI file, with all their fields.

    Beside `hf_token`, sections for OAuth tokens also carry `refresh_token` and `expires_at`
    (unix timestamp), used by [`get_token`] to transparently refresh them.
    N©Úinterpolationr   r   c                 óV   •— i | ]%}|t          ‰                     |¦  «        ¦  «        “Œ&S r4   )ÚdictrŠ   )r}   r„   Úconfigs     €r,   r¤   z,_read_stored_tokens_full.<locals>.<dictcomp>ƒ  s/   ø€ Ð_Ð_Ð_¸z�
�D §¢¨jÑ!9Ô!9Ñ:Ô:Ð_Ð_Ð_r5   z"Error parsing stored tokens file: )r   r   rŽ   ÚexistsÚconfigparserÚConfigParserÚreadÚsectionsr9   ÚUnicodeDecodeErrorrF   Úerror)Útokens_pathrJ   r«   s     @r,   r‰   r‰   t  sÔ   ø€ õ •yÔ6Ñ7Ô7€KØ×ÒÑÔð Øˆ	õ Ô&°TÐ:Ñ:Ô:€FðØ�Š�K¨'ˆÑ2Ô2Ð2Ø_Ð_Ð_Ð_ÈVÏ_Ê_ÑM^ÔM^Ð_Ñ_Ô_Ð_øÝÔÕ 2Ð3ð ð ð Ý�ŠÐ=¸!Ð=Ð=Ñ>Ô>Ð>Øˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøs   Á6A> Á>B=ÂB8Â2B=Â8B=Ústored_tokensc                 óÒ  — t          j        d¬¦  «        }t          |                      ¦   «         ¦  «        D ]N}|                     |¦  «         | |                              ¦   «         D ]\  }}|                     |||¦  «         ŒŒOt          j        ¦   «         }| 	                    |¦  «         t          t          t          j        ¦  «        |                     ¦   «         ¦  «         dS )zBWrite all sections and their fields to the stored tokens INI file.Nr§   )r­   r®   ÚsortedÚkeysÚadd_sectionrŠ   ÚsetÚioÚStringIOr&   r-   r   r   rŽ   Úgetvalue)r´   r«   r„   ÚkeyÚvalueÚbufs         r,   Ú_save_stored_tokens_fullrÀ   ‰  sÖ   € åÔ&°TÐ:Ñ:Ô:€FÝ˜]×/Ò/Ñ1Ô1Ñ2Ô2ð /ð /ˆ
Ø×Ò˜:Ñ&Ô&Ð&Ø'¨
Ô3×9Ò9Ñ;Ô;ð 	/ð 	/‰JˆC�Ø�JŠJ�z 3¨Ñ.Ô.Ð.Ð.ð	/õ Œ+‰-Œ-€CØ
‡L‚L�ÑÔÐÝ•$•yÔ6Ñ7Ô7¸¿º¹¼ÑHÔHÐHÐHÐHr5   r„   c                 óT   — t          ¦   «         }| |vrdS t          ||          ¦  «        S )zÀ
    Get the token by name.

    Args:
        token_name (`str`):
            The name of the token to get.

    Returns:
        `str` or `None`: The token, `None` if it doesn't exist.

    N)r¥   rA   )r„   r´   s     r,   Ú_get_token_by_namerÂ   –  s2   € õ &Ñ'Ô'€MØ˜Ð&Ð&ØˆtÝ˜ jÔ1Ñ2Ô2Ð2r5   )r�   rV   r�   rV   c                óÜ   — t          ¦   «         }d| i}|�||d<   |�t          |¦  «        |d<   |||<   t          |¦  «         t                               d|› dt
          j        › �¦  «         dS )aÂ  
    Save the given token.

    If the stored tokens file does not exist, it will be created.
    Args:
        token (`str`):
            The token to save.
        token_name (`str`):
            The name of the token.
        refresh_token (`str`, *optional*):
            OAuth refresh token used to renew the access token when it expires.
        expires_at (`int`, *optional*):
            Unix timestamp at which the access token expires.
    r{   Nr�   rV   zThe token `z` has been saved to )r‰   r    rÀ   rF   rG   r   rŽ   )rI   r„   r�   rV   r´   r   s         r,   r�   r�   ¨  sƒ   € õ" -Ñ.Ô.€MØ˜%Ð €FØÐ Ø"/ˆˆÑØÐÝ" :™œˆˆ|Ñà &€M�*ÑÝ˜]Ñ+Ô+Ð+Ý
‡K‚KÐ_˜jÐ_Ð_½iÔ>]Ð_Ð_Ñ`Ô`Ð`Ð`Ð`r5   c                 ó†   — | €dS |                       dd¦  «                              dd¦  «                             ¦   «         pdS )zuClean token by removing trailing and leading spaces and newlines.

    If token is an empty string, return None.
    Núr£   ú
)ÚreplaceÚstriprx   s    r,   rA   rA   Å  sC   € ð
 €}ØˆtØ�=Š=˜˜rÑ"Ô"×*Ò*¨4°Ñ4Ô4×:Ò:Ñ<Ô<ÐDÀÐDr5   )@Ú__doc__r­   rº   Úloggingr   rh   rC   Úpathlibr   Ú	threadingr   Útypingr   r£   r   Úerrorsr   r	   r
   Ú_fixesr   Ú_oauth_devicer   Ú_runtimer   r   r$   r   r    r-   r<   r;   r.   r[   Ú	getLoggerrX   rF   r6   r3   r1   rR   rT   rg   r]   rk   r0   rq   r‡   ru   r�   rŒ   r�   r2   rw   r•   rª   rj   r‹   r¥   r‰   rÀ   rÂ   r�   rA   r4   r5   r,   ú<module>rÓ      s£  ðð ]Ð \Ð \à Ð Ð Ð Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø  Ð  Ð  Ð  Ð  Ð  Ø /Ð /Ð /Ð /Ð /Ð /Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :ð Ð ØÐ ð˜ð  sð ¨tð ð ð ð ð  !Ð Ø ˜D™FœFÐ Ø#'Ð �c˜D‘jÐ 'Ð 'Ñ 'à	ˆÔ	˜8Ñ	$Ô	$€ð�3˜‘:ð ð ð ð ð:7$ c¨D¡jð 7$ð 7$ð 7$ð 7$ðt` S¨4¡Zð `ð `ð `ð `ð
˜c D™jð ð ð ð ðð ð ð ð �iñ ô ð ð �4‘6”6Ð Ø,0Ð �? TÑ)Ð 0Ð 0Ñ 0ØÐ ð0˜c D™jð 0ð 0ð 0ð 0ðfð ð ð ð ˜ñ ô ð ð �d‘f”fÐ Ø26Ð Ð(¨4Ñ/Ð 6Ð 6Ñ 6Ø!Ð ØÐ ØÐ ð1¨¨d©
ð 1ð 1ð 1ð 1ð`¨#ð `°#ð `ð `ð `ð `ðF%¨ð %°ð %ð %ð %ð %ð˜d 3¨ 8œnð °°t±ð ð ð ð ð	q˜4  S œ>ð 	qð 	qð 	qð 	qð $ s¨D°°c°¬NÐ':Ô";ð ð ð ð ð*
I¨D°°d¸3À¸8´nÐ1DÔ,Eð 
IÈ$ð 
Ið 
Ið 
Ið 
Ið3 3ð 3¨3°©:ð 3ð 3ð 3ð 3ð& AEÐ_cðað að aØðaØðaØ36¸±:ðaØRUÐX\ÑR\ðaà	ðað að að að:E˜˜d™
ð E s¨T¡zð Eð Eð Eð Eð Eð Er5   