
    lKji              
       &   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Zddl	Z	ddl
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 ddlmZ dd	lmZmZ dd
lmZ ddlmZm Z  ddl!m"Z" ddl#m$Z$ ddl%Z%ddl&Z&ddl'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-m.Z. ddl/m0Z0m1Z1 ddl/m2Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@  G d dej                  j                        ZC ej                  d      ZE ej                  d      xs  ej                  d      xs eEZF ej                  d      xs  ej                  d      xs eFxs eEZG e1e%jv                        ZHi ZIdZJeFr| e"eF      ZKeKj                  j                  d      \  ZNZOZPeH e1d      k\  r*d e%j                  eF        e%j                  eG       d!iZInd"eFeGd!iZI eC       ZJeJj                  eNeP       d#eSdz  d$eTeUeSdz  f   fd%ZVd&e%j                  d'eSd(eSd)eSd$eXf
d*ZYd+ZZ G d, d-e>      Z[y).OExtension manager using pip as package manager and PyPi.org as packages source.    N)Callable)datetime	timedeltatimezone)partial)groupby)environ)Path)CalledProcessErrorrun)TarFile)AnyOptional)urlparse)ZipFile)
alru_cache)InvalidSpecifierSpecifierSet)InvalidNamecanonicalize_name)InvalidVersionVersion)parse)CFloatCIntUnicodeconfigobserve)__version__)ActionResultExtensionManagerExtensionManagerMetadataExtensionPackagec                       e Zd ZddZd Zy)ProxiedTransportNc                 $    ||f| _         || _        y N)proxyproxy_headers)selfhostportheaderss       k/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/jupyterlab/extensions/pypi.py	set_proxyzProxiedTransport.set_proxy.   s    4Z
$    c                     t        j                  j                  | j                   }|j	                  || j
                         ||f| _        |S )Nr.   )httpclientHTTPConnectionr)   
set_tunnelr*   _connection)r+   r,   
connections      r/   make_connectionz ProxiedTransport.make_connection2   sF    [[//<
dD,>,>?+r1   )NN)__name__
__module____qualname__r0   r:    r1   r/   r&   r&   -   s    %r1   r&   	ALL_PROXY
http_proxy
HTTP_PROXYhttps_proxyHTTPS_PROXY:z0.28.0mounts)r)   )zhttp://zhttps://proxiesrequires_pythonreturnc                     | sy	 t         j                  j                         d   }t        |      }t	        |       }||v rydd|  d| fS # t
        t        f$ r Y yw xY w)a  Check if the current Python version satisfies the requires_python specifier.

    Args:
        requires_python: The requires_python specifier string from PyPI (e.g., ">=3.10")

    Returns:
        (compatible, explanation)
        compatible: True if compatible or if requires_python is None/empty, False otherwise.
        explanation: A string explaining the mismatch if incompatible, otherwise None.
    )TNr   FzRequires Python z but detected Python )sysversionsplitr   r   r   r   )rG   current_version_strcurrent_version	specifiers       r/    _check_python_version_compatiblerP   ^   sz     	!kk//1!4!"56 1	i'((99NN_```n- s   ;A 	A AAr5   namelatest_versionbase_urlc                 $  K   | j                  |d| d| dz   ddi       d {   }|j                  dk  rNt        j                  |j                        j                  d      }dD ci c]  }||j                  |       c}S i S 7 cc c}w w)	N//jsonContent-Typeapplication/jsonr3     info)
authorbugtrack_urldocs_url	home_pagelicensepackage_urlproject_urlproject_urlsrG   summary)getstatus_codejsonloadstext)r5   rQ   rR   rS   responsedataks          r/   _fetch_package_metadatarl   w   s      ZZQtfAn-U33!34    H c!zz(--(,,V4

 txx{N
 	
  	1
s"   #BB	AB+BBB)zjupyterlab-language-pack-ar-SAzjupyterlab-language-pack-ca-ESzjupyterlab-language-pack-cs-CZzjupyterlab-language-pack-da-DKzjupyterlab-language-pack-de-DEzjupyterlab-language-pack-el-GRzjupyterlab-language-pack-es-ESzjupyterlab-language-pack-et-EEzjupyterlab-language-pack-fi-FIzjupyterlab-language-pack-fr-FRzjupyterlab-language-pack-he-ILzjupyterlab-language-pack-hu-HUzjupyterlab-language-pack-hy-AMzjupyterlab-language-pack-id-IDzjupyterlab-language-pack-it-ITzjupyterlab-language-pack-ja-JPzjupyterlab-language-pack-ko-KRzjupyterlab-language-pack-lt-LTzjupyterlab-language-pack-nl-NLzjupyterlab-language-pack-no-NOzjupyterlab-language-pack-pl-PLzjupyterlab-language-pack-pt-BRzjupyterlab-language-pack-ro-ROzjupyterlab-language-pack-ru-RUzjupyterlab-language-pack-tr-TRzjupyterlab-language-pack-uk-UAzjupyterlab-language-pack-vi-VNzjupyterlab-language-pack-zh-CNzjupyterlab-language-pack-zh-TWc                       e Zd ZdZ eddd      Z eddd      Z eddd	      Z	 ed
dd      Z
	 	 	 d'dedz  dedz  dej                  dz  ddf fdZedefd       Zd(dededz  defdZdededz  fdZdedefdZdededefdZ ed      d        Zded ed!edeeeef   edz  f   fd"Zde eeef      fd#Z!d(dede"e   de#fd$Z$dede#fd%Z%dedefd&Z& xZ'S ))PyPIExtensionManagerr   zhttps://pypi.org/pypiTzThe base URL of PyPI index.)r   helpg     r@z.PyPI extensions list cache timeout in seconds.i  z$The cache size for package metadata.g      ?zGThrottling time in seconds between PyPI requests using the XML-RPC API.Napp_optionsext_optionsparentrH   c                    t         |   |||       t        j                  d	i t        | _        t        t        | j
                        | _        | j                  d| j                  i       t        j                  j                  | j                  t              | _        t!        j"                  t$        j&                        t)        | j*                  dz        z
  | _        d | _        | j0                  j3                  d| j                   d       t        r-| j0                  j5                  dt        j6                          y y )
Nnew)	transporttz)\(?secondsz%Extensions list will be fetched from .z=Extensions will be fetched using proxy, proxy host and port: r>   )super__init__httpxAsyncClient_httpx_client_args_httpx_clientr   rl   $_observe_package_metadata_cache_sizepackage_metadata_cache_sizexmlrpcr5   ServerProxyrS   xmlrpc_transport_override_rpc_clientr   nowr   utcr   cache_timeout5_PyPIExtensionManager__last_all_packages_request_time)_PyPIExtensionManager__all_packages_cachelogdebugrZ   r)   )r+   rp   rq   rr   	__class__s       r/   r}   zPyPIExtensionManager.__init__   s    	k6:"..D1CD'./FHZHZ'[$115$:Z:Z2[\!==44MM%> 5 
 190MPY&&-Q
 1
- %)!>t}}oQOP$HHMMOPiPoPoOpq %r1   c                 8    t        ddt        j                        S )zExtension manager metadata.PyPIT)r#   rJ   prefix)r+   s    r/   metadatazPyPIExtensionManager.metadata   s     (cjjAAr1   rQ   rK   c                 f  K   	 t        |d       |t        |       | j                  |       d {   }|s| j                  j	                  d|        |S # t        $ r! | j                  j	                  d|       Y yt
        $ r" | j                  j	                  d|d       Y yw xY w7 |w)NT)validatezInvalid extension name: FzVersion z does not comply with PEP 440z/Installation denied by allowlist/blocklist for )r   parse_versionr   r   warningr   _is_allowed_by_listing)r+   rQ   rK   alloweds       r/   is_install_allowedz'PyPIExtensionManager.is_install_allowed   s     		dT2"g& 33D99HHNtfUV  	HH7x@A 	HHx{2OPQ	 :s=   B1A B1B/&B1'B, B1'B,)B1+B,,B1pkgc                   K   	 | j                   j                  | j                  d| dz   ddi       d{   }|j                  dk  r0t	        j
                  |j                        j                  di       }n| j                  j                  d	|       y	 t        j                  |j                  d
d            xs dS 7 # t        $ r Y yw xY ww)zReturn the latest available version for a given extension.

        Args:
            pkg: The extension to search for
        Returns:
            The latest available version
        rU   rV   rW   rX   r3   NrY   rZ   z+Failed to get package information on PyPI; rK    )r   rd   rS   re   rf   rg   contentr   r   r"   get_semver_version	Exception)r+   r   ri   rj   s       r/   get_latest_versionz'PyPIExtensionManager.get_latest_version   s     	X!//33!C5.I[8\ 4  H ##c)zz("2"2377C!LXLYZ  $66txx	27NOWSWW  		s?   C3C CA!C C)CC 	CCCC	extensionc                     |j                   (|j                   }|d   dk(  r| j                  |d         S | j                  |j                        S )a  Normalize extension name.

        Extension have multiple parts, npm package, Python package,...
        Sub-classes may override this method to ensure the name of
        an extension from the service provider and the local installed
        listing is matching.

        Args:
            extension: The extension metadata
        Returns:
            The normalized name
        packageManagerpythonpackageName)install_normalize_namerQ   )r+   r   install_metadatas      r/   get_normalized_namez(PyPIExtensionManager.get_normalized_name  sV     ((00 01X=++,<],KLL##INN33r1   	recursivefnc                   K   t         j                  j                  j                         }	  |j                  d|g|  d{   }|S 7 # t
        j                  j                  $ r}|j                  dk(  r|j                  j                  d      rd}t        j                  d|j                        }|t        |j                  d      xs d      }| j                  j!                  d| d	       t#        j$                  || j&                  z  d
z          d{  7   |r | j(                  d|g|  d{  7  }n |j                  d|g|  d{  7  }Y d}~S d}~ww xY ww)a/  Throttle XMLRPC API request

        Args:
            recursive: Whether to call the throttling recursively once or not.
            fn: API method to call
            *args: API method arguments
        Returns:
            Result of the method
        Raises:
            xmlrpc.client.Fault
        NizHTTPTooManyRequests:rx   z!Limit may reset in (\d+) seconds.   1z>HTTPTooManyRequests - Perform next call to PyPI XMLRPC API in zs.g{Gz?F)tornadoioloopIOLoopcurrentrun_in_executorr   r5   Fault	faultCodefaultString
startswithresearchintgroupr   rZ   asynciosleeprpc_request_throttling&_PyPIExtensionManager__throttleRequest)	r+   r   r   argscurrent_looprj   errdelaymatchs	            r/   __throttleRequestz&PyPIExtensionManager.__throttleRequest)  sM     ~~,,446	O555dBFFFD$ % G}}"" 	O}}&3??+E+E&, 		"FX$A 5#6ETUZT[[]^ mmED,G,G$G$$NOOO!7!7!7r!ID!IIID!=!=!=dB!N!NNND#	Ose   )E.A A
A E.
A E+*B3E&D E&<D?=E&EE& E.&E++E.r   c                 h     t        |d         t        t        | j                              | _        y )Nrt   )maxsize)r   r   rl   r   )r+   changes     r/   r   z9PyPIExtensionManager._observe_package_metadata_cache_sizeK  s+    'Hz&-'H+T-?-?@(
$r1   querypageper_pagec                   K   | j                          d{   }i }g }t        t        fd|      d       D ]  \  }}t        |      d   \  }	}
| j	                  ||
| j
                         d{   }| j                  |      }|j                  d      xs i }|j                  d      }|j                  d      xs |j                  d      }|j                  d	      xs |j                  d
      }|j                  d      xs |j                  d      }|xs0 |j                  d      xs |j                  d      xs
 |xs |xs |}|j                  d      }t        |      \  }}|j                  d      }|r|r
|d| dz  }n|}t        ||||j                  d      |j                  d      t        j                  |
      d||||j                  d      |      }d}|||fD cg c]  }|st        |      j                           }}ddg}|D ]*  |v rd} n"t        fddD              rd} n
dv s(d} n |j                  ||f       ! t!        |d  !      }|dz
  |z  }||z   }||| }|D ]  \  }	}|||j"                  <    t%        j&                  t)        |      |z        } || fS 7 7 Kc c}w w)"a  List the available extensions.

        Note:
            This will list the packages based on the classifier
                Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt

            Then it filters it with the query and sorts by organization priority:
            1. Project Jupyter (@jupyter)
            2. JupyterLab Community (@jupyterlab-contrib)
            3. Others

        Args:
            query: The search extension query
            page: The result page
            per_page: The number of results per page
        Returns:
            The available extensions in a mapping {name: metadata}
            The results last page; None if the manager does not support pagination
        Nc                     | d   v S Nr   r>   )mr   s    r/   <lambda>z4PyPIExtensionManager.list_packages.<locals>.<lambda>l  s    EQqTMr1   c                     | d   S r   r>   )es    r/   r   z4PyPIExtensionManager.list_packages.<locals>.<lambda>l  s    WXYZW[r1   rb   zSource Coder^   Homepager]   Documentationr\   zBug Trackerra   r`   rG   rc   z ()r[   r_   prebuilt)rQ   descriptionhomepage_urlr[   r_   rR   pkg_typer   bug_tracker_urldocumentation_urlpackage_manager_urlrepository_url   z-https://github.com/jupyterlab/jupyterlab_apodz0https://github.com/jupyterlab/extension-examples   c              3   &   K   | ]  }|v  
 y wr(   r>   ).0orgurls     r/   	<genexpr>z5PyPIExtensionManager.list_packages.<locals>.<genexpr>  s      _ 3J_s   )zgithub.com/jupyter/zjupyter.orgzgithub.com/jupyterlab/r   zgithub.com/jupyterlab-contrib/   c                 *    | d   | d   j                   fS )Nr   r   rQ   )xs    r/   r   z4PyPIExtensionManager.list_packages.<locals>.<lambda>  s    AaD!A$));Lr1   )key))_PyPIExtensionManager__get_all_extensionsr	   filterlistrl   rS   r   rd   rP   r$   r"   r   strloweranyappendsortedrQ   mathceillen)!r+   r   r   r   matches
extensionsall_matchesrQ   r   _rR   rj   normalized_namepackage_urls
source_urlr   r   r   best_guess_home_urlrG   python_compatibleversion_explanationr   r   priorityr   urls_to_checkexcludesorted_matches	start_idxend_idxpage_matchestotal_pagess!    `                       `       r/   list_packagesz"PyPIExtensionManager.list_packagesQ  s$    , 1133
"6*A7#K^\KD% $UBA~55dNDMMZZD"2248O88N39rL%))-8J88K0PL4D4DZ4PL $ 4 Y8H8H8Y"hh~6Y,:J:J=:YO  #88M*#88M*# %# 	#
 #   #hh'89O5U622 ((9-K"R(;'<A#>>K"5K($'0xx)+/BB>R#) /"3$(HH]$;)I  H-7GZ,[,[S_bC ,[   @BG
 %'> H _   !H5< H % )45S ]V  1LM AX)	h&%i8(LAy)2Jy~~& ) iiN 3h >?;&&y 4 [bsB   KJ;AK3J>4E;K/K7K/KA:K>KKc                 X   K    j                   It        j                  t        j                         j
                  t         j                        z   kD  r7 j                  j                  d        j                  d j                  j                  dg       d {    _          j                   D ch c]  }|d   	 }}t        D cg c]	  }||vs| }}t        j                   fd|D        ddi d {   }t!        ||d	      D ]S  \  }}t#        |t$              r j                  j'                  d
||       4|7 j                   j)                  ||f       U t        j                  t        j                         _         j                   S 7 c c}w c c}w 7 w)Nrv   ry   z?Requesting PyPI.org RPC API for prebuilt JupyterLab extensions.Tz<Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuiltr   c              3   @   K   | ]  }j                  |        y wr(   )r   )r   rQ   r+   s     r/   r   z<PyPIExtensionManager.__get_all_extensions.<locals>.<genexpr>  s     KND$))$/Ns   return_exceptions)strictz7Failed to fetch latest version for language pack %s: %s)r   r   r   r   r   r   r   r   r   r   r   r   browseLANGUAGE_PACKSr   gatherzip
isinstancer   rZ   r   )r+   pextension_namesrQ   packs_to_fetchlanguage_pack_resultsresults   `      r/   __get_all_extensionsz)PyPIExtensionManager.__get_all_extensions  s}    $$,||1
11IdFXFX4YY1Z HHNN\].2.D.D  ''OP/ )D% .2-F-FG-Fqt-FOG/=]~t_A\d~N]*1..KNK+"&+ %! !$N4IRV Wffi0HHMMQ
 '--44dF^D !X 5=LLHLL4QD1(((7) H]%sJ   BF*F F*7F
F*	F#F##F*>F(?AF*AF*F*c                   K   | j                  |      st        dd      S t        j                  j                  j                         }t        j                         5 }t        j                  d|d      5 }|j                  dt                |j                          t        j                  dd	d
ddddd|j                  g
}||j                   d|        n|j                         i }	 |j!                         }|j#                  dd       |j#                  dd       |j#                  dd       |j%                  dt'        t(        |dd             d{   }	t+        j,                  |	j.                  j1                  d            }
t3        t5        fd|
j7                  d
g                   }| j8                  j;                  dt+        j<                  |
       d       | j8                  j;                  dd jE                  |       d!       |j%                  dt'        t(        |d"             d{   }	| j8                  j;                  d#|	jF                          | j8                  j;                  d$|	j.                  j1                  d              |	j@                  j1                  d      }|	jF                  d%k(  r@| j8                  j;                  d&|        d}	 |j7                  d'i       j7                  d(      }|| jH                  j7                  |       d{   }|jJ                  d)k  rG|jM                  d*      rtO        tQ        jR                  |jT                              5 }t5        d+ |jW                               D ];  }t+        j,                  |jY                  |            }|j7                  d,      }|; n ddd       n|jM                  d-      rt[        tQ        jR                  |jT                              5 }t5        d. |j]                               D ]J  }t+        j^                  |ja                  |jc                  |                  }|j7                  d,      }|J n ddd       n!| j8                  j;                  d/| d0|       d2g}|<|j7                  d3i       }d4|v r|j                  d4       d5|v r|j                  d5       t        d6|7      cddd       cddd       S | j8                  je                  d8 d9|	jF                   d:|        t        d|      cddd       cddd       S 7 # t>        $ r5}| j8                  j;                  d|j@                   |       Y d}~d}~wtB        $ r(}| j8                  j;                  d|       Y d}~d}~ww xY w7 7 # 1 sw Y   0xY w# 1 sw Y   =xY w# tB        $ r(}| j8                  j;                  d1|       Y d}~ld}~ww xY w# 1 sw Y   nxY w	 ddd       y# 1 sw Y   yxY ww);a  Install the required extension.

        Note:
            If the user must be notified with a message (like asking to restart the
            server), the result should be
            {"status": "warning", "message": "<explanation for the user>"}

        Args:
            name: The extension name
            version: The version to install; default None (i.e. the latest possible)
        Returns:
            The action result
        errorzinstall is not allowedstatusmessagezw+F)modedirdeletezjupyterlab==-mpipr   
--no-inputz--quietz--progress-baroffz--constraintNz==r   z	--dry-runz--report-T)capture_outputcheckutf-8c                 l    | j                  di       j                  d      j                  dd      k(  S )Nr   rQ   r   r%  )rd   replace)r  rQ   s    r/   r   z.PyPIExtensionManager.install.<locals>.<lambda>  s-    !%%
B"7";";F"Ct||TWY\G]"]r1   zActions to be executed by pip r{   z!Fail to get installation report: exc_infoz Fail to get installation report.Executing ' 'r&  return code: stdout: r   stderr: download_infor   rY   z.whlc                 2    t        |       j                  dk(  S Nzpackage.jsonr   rQ   fs    r/   r   z.PyPIExtensionManager.install.<locals>.<lambda>?      $q',,.2Pr1   
jupyterlabztar.gzc                 2    t        |       j                  dk(  S r6  r7  r8  s    r/   r   z.PyPIExtensionManager.install.<locals>.<lambda>I  r:  r1   zFailed to get 'z'; zFail to get package.json.frontend	discoverykernelserverokr  needs_restartzFailed to install : code 
)3r   r!   r   r   r   r   tempfileTemporaryDirectoryNamedTemporaryFilewriter    flushrJ   
executablerQ   r   copyinsertr   r   r   rf   rg   stdoutdecodenextr   rd   r   r   dumpsr   stderrr   join
returncoder   re   endswithr   ioBytesIOr   namelistreadr   getnamesloadextractfile	getmemberr  )r+   rQ   rK   r   ve_dirfconstraintcmdline
pkg_actiontmp_cmdr  action_infor   r   r  jlab_metadatadownload_urlri   wheelfilenamerj   sdist
follow_upsr>  s    `                     r/   r   zPyPIExtensionManager.install  so     &&tW5w8PQQ~~,,446'')V''TveLP[[M:;    G "$r'34t$J\!,,.r;/r:.r3'+;;'#wt4P   #jj)=)=g)FG!]#	26
 !?

;@W?XXYZ[HHNN['):(;1=>'77gc74@ F HHNN]6+<+<*=>?HHNNXfmm&:&:7&C%DEFMM((1E  A%%12 $L(2(K(O(OPU(VL#/)-););)?)?)M#M#//#5+44V<%,RZZ8H8H-I%Je4:(P(-(85& 04zz%**X:N/O8<8N+8+D,15& &K%J ".!6!6x!@%,RZZ8H8H-I%Je4:(P(-(85& 04yy,1,=,=eooh>W,X0* 9=8N+8+D,15& &K%J !HHNN_\N#h\+Z[
 
 !, - 1 1+r BI9,"))(39,"))(3#4zJK ML *)P !3D6ARAR@SSUV[U\]^#7EBQ ML *): & [!B188*MXYZZ QACPPQ $N &K%J &K%J ! LHHNN#>NKKLq MLL *))s+  AYX78A9X!2A,UUAU9BX!>W?B.X!.AW-0W1AW->AWWAW-A%W  W *W--AX!:	X7
Y:X!	X7
YU	W
&*VX!W
"W?X!W

X!W-WW- W*%W--	X6XX!XX!!X*	&X7.	Y7Y <Yc           	        K   t         j                  j                  j                         }t        j
                  ddddd|g}d}	 |j                         }|j                  d       |j                  dt        t        |d             d{   }t        d	 t        d
 |j                  j                  d      j                                     }t        d t        t         |            D ]:  }t#        j$                  |j'                               }	|	j)                  d      }|: n | j,                  j/                  ddj1                  |       d       |j                  dt        t        |d             d{   }| j,                  j/                  d|j2                          | j,                  j/                  d|j                  j                  d              |j4                  j                  d      }|j2                  dk(  rl| j,                  j/                  d|        dg}|<|j)                  di       }d|v r|j7                  d       d|v r|j7                  d       t9        d|      S | j,                  j;                  d| d|j2                   d|        t9        d |!      S 7 $# t*        $ r(}
| j,                  j/                  d|
       Y d}
~
d}
~
ww xY w7 lw)"aj  Uninstall the required extension.

        Note:
            If the user must be notified with a message (like asking to restart the
            server), the result should be
            {"status": "warning", "message": "<explanation for the user>"}

        Args:
            extension: The extension name
        Returns:
            The action result
        r!  r"  	uninstallz--yesr#  NTr0  c                 $    | j                  d      S r6  )rU  lines    r/   r   z0PyPIExtensionManager.uninstall.<locals>.<lambda>  s    T]]>:r1   c                 "    | j                         S r(   )striprm  s    r/   r   z0PyPIExtensionManager.uninstall.<locals>.<lambda>  s
    r1   r(  c                      | j                   dk(  S r6  r   r8  s    r/   r   z0PyPIExtensionManager.uninstall.<locals>.<lambda>  s    !&&N2r1   r;  z%Fail to list files to be uninstalled.r+  r-  r.  r/  r1  r2  r   r3  r=  r>  r?  r@  rA  rB  zFailed to installed rD  rE  r  r  )r   r   r   r   rJ   rK  rL  remover   r   r   r   maprN  rO  
splitlinesr   rf   rg   
read_bytesrd   r   r   r   rS  rT  rR  r   r!   r  )r+   r   r   r`  rd  rb  r  linesfilepathrj   r   r  ri  r>  s                 r/   rk  zPyPIExtensionManager.uninstallf  s     ~~,,446NN
 	PllnGNN7#'77gc74@ F :-v}}/C/CG/L/W/W/YZE #2D%  zz("5"5"78 $ 6 , 	SXXg%6$7q9:#33'#wt<
 
 	v'8'8&9:;&--"6"6w"?!@AB$$W-!HHNNXeW-.J ()--k2>	y(%%h/y(%%h/t:FFHHNN1)GFDUDUCVVXY^X_`aw>>U  	PHHNNBQNOO	P

sX   AK)AJ2 J/BJ2 $J2 'AK):K&;D4K)/J2 2	K#;KK)K##K)c                 f    |j                  dd      j                  dd      j                  dd      S )zNormalize extension name.

        Remove `@` from npm scope and replace `/` and `_` by `-`.

        Args:
            name: Extension name
        Returns:
            Normalized name
        @r   rU   r%  r   )r*  )r+   rQ   s     r/   r   z$PyPIExtensionManager._normalize_name  s/     ||C$,,S#6>>sCHHr1   )NNNr(   )(r;   r<   r=   __doc__r   rS   r   r   r   r   r   dictr   Configurabler}   propertyr#   r   r   boolr   r   r$   r   r   r   r   r   r   r   tupler	  r   r   r   r!   r   rk  r   __classcell__)r   s   @r/   rn   rn      s   Y.tB_`H$TM #'T F# $V $(#'-1	D[ D[ ##d*	
 
4 B2 B BS 3: QU "XC XC$J X.4-= 4# 4&   8  s  D *+
 ,

r'r' #r'/2r'	tC))*C$J6	7r'h )DsCx,A  )D}C# }C }C }C~G? G? G?R
IC 
IC 
Ir1   rn   )\rz  r   http.clientr4   rV  rf   r   r   rJ   rF  xmlrpc.clientr   collections.abcr   r   r   r   	functoolsr   	itertoolsr	   osr
   pathlibr   
subprocessr   r   tarfiler   typingr   r   urllib.parser   zipfiler   r~   r   	async_lrur   packaging.specifiersr   r   packaging.utilsr   r   packaging.versionr   r   r   r   	traitletsr   r   r   r   r   jupyterlab._versionr    jupyterlab.extensions.managerr!   r"   r#   r$   r5   	Transportr&   rd   all_proxy_urlhttp_proxy_urlhttps_proxy_url_httpx_versionr   r   r@   netloc	partition
proxy_hostr   
proxy_portAsyncHTTPTransportr0   r   r  r~  rP   r   r{  rl   r  rn   r>   r1   r/   <module>r     s"   V   	   	 
   $ 2 2     .    !      ? : 5 4 < < + 	v}}.. 	 K( \*Xkgkk,.GX=GKK_+'++m"<__R_ 
 **+   .)J * 1 1 ; ;C @J:**3533.I4E44?K
 )+
 !1 2''
J?cDj U4QTW[Q[K[E\ 2
  	
 
HB}I+ }Ir1   