a
    kÄ#dwY  ã                   @   sö  d Z ddlmZ ddlmZ ddlm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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mZ dd
lmZ ddlmZm Z m!Z!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9  m:Z: ddlm;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC dZDdZEdZFdZGdZHdZIdZJdZKdZLdZMdZNdZOdZPd ZQd!ZRd"ZSd#ZTd$ZUd%ZVd&ZWdZXdZYd'ZZd(Z[d)Z\dZ]dZ^dZ_dZ`d*ZadZbdZcdZdd'Zed Zfd(Zgd)Zhd+Zid!Zjd)Zkd,d-„ Zld.d/„ Zmd0d1„ ZndNd2d3„Zod4d5„ Zpd6d7„ Zqd8d9„ Zrd:d;„ Zsd<d=„ ZtG d>d?„ d?e,ƒZue+ veu¡ e w¡ d  d@v �r¢dAdB„ ZxndCdB„ ZxdDdE„ ZyG dFdG„ dGe7ƒZzG dHdI„ dIezƒZ{G dJdK„ dKezƒZ|G dLdM„ dMe}ƒZ~dS )Oz
Linux specific functions.
é    )Úabsolute_import)Úioctl)ÚselectN)ÚrawÚ	plain_str)ÚLINUX)Ú
_iff_flagsÚcompile_filter)Úget_ifÚget_if_raw_hwaddr)Úconf)ÚMTUÚ	ETH_P_ALLÚ
SOL_PACKETÚSO_ATTACH_FILTERÚSO_TIMESTAMPNS)ÚScapyInvalidPlatformExceptionÚScapy_ExceptionÚlog_loadingÚlog_runtimeÚwarning)ÚIFACESÚInterfaceProviderÚNetworkInterfaceÚnetwork_name)Ú
sock_fprog)ÚPacketÚPadding)Ú	inet_ntop)ÚSuperSocket)	ÚAnyÚCallableÚDictÚListÚNoReturnÚOptionalÚTupleÚTypeÚUnioni'‰  i‰  i‰  i‰  i‰  i‰  i‰  i‰  i3‰  i8‰  i‰  é   é   é   é   é   é    é@   é€   é   é   é   é   i   é   c                 C   s.   zt | tƒdd… W S  ty(   Y dS 0 dS )z^
    Return the raw IPv4 address of an interface.
    If unavailable, returns b"\0\0\0\0"
    é   é   s       N)r
   ÚSIOCGIFADDRÚIOError©Úiff© r<   úG/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/arch/linux.pyÚget_if_raw_addrx   s    r>   c                  C   s–   zt ddƒ} W n@ tyN   z|  ¡  W n ty:   Y n0 t d¡ g  Y S 0 g }|  ¡  |  ¡  | D ] }| t|ƒ 	d¡d  
¡ ¡ qh|  ¡  |S )z<
    Function to read the interfaces from /proc/net/dev
    z/proc/net/devÚrbzCan't open /proc/net/dev !ú:r   )Úopenr9   ÚcloseÚ	Exceptionr   ÚcriticalÚreadlineÚappendr   ÚsplitÚstrip)ÚfÚlstÚliner<   r<   r=   Ú_get_if_list„   s     

rL   c                 C   sX   t ||ƒ}tjr6tjdkr6t d|jt 	|j
j¡¡}nt|j|j
ƒ}|  tjt|¡ dS )zÂ
    Compile bpf filter and attach it to a socket

    :param sock: the python socket
    :param bpf_filter: the bpf string filter to compile
    :param iface: the interface used to compile
    )r5   r2   r*   ZHLN)r	   r   Zuse_pypyÚsysÚpypy_version_infoÚstructÚpackZbf_lenÚctypesZ	addressofZbf_insnsÚcontentsr   Ú
setsockoptÚsocketÚ
SOL_SOCKETr   )ÚsockZ
bpf_filterÚifaceÚbpr<   r<   r=   Úattach_filter›   s    	
þrY   c                 C   s6   t  dt|ƒtdd¡}|r t}nt}|  t||¡ d S )NZIHH8sr   ó    )rO   rP   Úget_if_indexÚPACKET_MR_PROMISCÚPACKET_ADD_MEMBERSHIPÚPACKET_DROP_MEMBERSHIPrS   r   )Úsr;   ÚvalZmreqÚcmdr<   r<   r=   Úset_promisc±   s
    rb   c              	      sr  t jjrd\‰}nd\‰}t tjtj¡}t dd¡}t| ¡ t	t
 dt|ƒ| ¡ d ¡ƒ}t
 d|¡d }tjrz| ¡ n| ¡ ‰ ‡ ‡fdd„td||ƒD ƒ}	|	D ]Â}
t|
ƒ}| | ¡sºq¢t|tt
 d	|
¡ƒ}t
 d
|dd… ¡d }t|tt
 d	|
¡ƒ}t
 d
|dd… ¡d }d|v r¢|d| d¡… }nq¢||@ |kr¢| ¡  ||@ |||t j |¡|f  S q¢| ¡  dS )zA
    Get the correct source IP address of an interface alias
    )r-   é(   )r.   r.   ÚBs                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   ZiLr   c                    s(   g | ] }ˆ ||ˆ …   d d¡d ‘qS )ó    r)   r   )rG   )Ú.0Úi©Znames_bÚoffsetr<   r=   Ú
<listcomp>Ô   rZ   z%get_alias_address.<locals>.<listcomp>Ú16s16xz>Ir6   r7   r@   N)ÚscapyZconstsZ	IS_64BITSrT   ÚAF_INETÚ
SOCK_DGRAMÚarrayr   ÚfilenoÚSIOCGIFCONFrO   rP   ÚlenÚbuffer_infoÚunpackÚsixÚPY3ÚtobytesZtostringÚranger   Ú
startswithr8   ÚSIOCGIFNETMASKÚindexrB   ÚutilsZltoa)Ú
iface_nameZip_maskÚgw_strÚmetricZname_lenZsckZnames_arÚifreqÚoutÚnamesZifname_bZifnameÚifaddrÚmskr<   rh   r=   Úget_alias_address»   s:    

ÿ
ÿ
r…   c                  C   s$  zt ddƒ} W n  ty.   t d¡ g  Y S 0 g }t tjtj¡}zàt|tt	 
dtj d¡¡ƒ}t	 d|dd… ¡d	 }|tjk�rt|tt	 
dtj d¡¡ƒ}t t	 d
|dd… ¡d	 ¡}t t	 d
|dd… ¡d	 ¡|@ }tj |dd… ¡}| ||dtj|df¡ ntdtj|f ƒ W nX t�y| }	 z>|	jdk�rRtdtj ƒ ntdtjt|	ƒf ƒ W Y d }	~	n
d }	~	0 0 |  ¡ dd … D �]~}
t|
ƒ}| ¡ \}}}}}}}}}}}t|dƒ}|t@ d	k�rÖ�qŽ|t@ �rä�qŽzt|tt	 
d| d¡¡ƒ}W n t�y   d}d	}Y nd0 t	 d|dd… ¡d	 }|tjk�rrtj |dd… ¡}t	 d|dd… ¡d	 }ntd||ƒ �qŽt t|dƒ¡d@ }t t|dƒ¡d@ }tj t	 
d
t|dƒ¡¡}t|ƒ}||||||f}||@ |k�rt||||ƒ}|�r|}| |¡ �qŽ|   ¡  |  ¡  |S )Nz/proc/net/router?   zCan't open /proc/net/route !rk   Úutf8Úhr-   é   r   ÚIr6   r7   ú0.0.0.0r)   z)Interface %s: unknown address family (%i)éc   z!Interface %s: no address assignedz/Interface %s: failed to get address config (%s)z!Il   ÿÿ )!rA   r9   r   rD   rT   rm   rn   r   r8   rO   rP   r   Úloopback_nameÚencodert   rz   Úntohlrl   r|   Ú	inet_ntoarF   r   ÚerrnoÚstrÚ	readlinesr   rG   ÚintÚRTF_UPÚ
RTF_REJECTÚhtonlr…   rB   )rI   Úroutesr_   r€   Z
addrfamilyZifreq2r„   Údstrƒ   ÚerrZline_brK   r;   Zdst_bZgwZflags_bÚ_Úmetric_bZmsk_bÚflagsZ
ifaddr_intZdst_intZmsk_intr~   r   ÚrouteZ	tmp_router<   r<   r=   Úread_routesó   sj    

",


rž   c               
   C   s�   g } zt ddƒ}W n ty(   |  Y S 0 |D ]T}t|ƒ ¡ }tj d t 	d|d  
¡ ¡¡ ¡ ¡}|  |t|d dƒ|d f¡ q.| ¡  | S )	zõ
    Returns a list of 3-tuples of the form (addr, scope, iface) where
    'addr' is the address of scope 'scope' associated to the interface
    'iface'.

    This is the list of all addresses of all interfaces available on
    the system.
    z/proc/net/if_inet6r?   ó   :Ú4s4s4s4s4s4s4s4sr   r2   r-   r3   )rA   r9   r   rG   rl   Úutils6Úin6_ptopÚjoinrO   rt   r�   ÚdecoderF   r“   rB   )ÚretZfdescrK   ÚtmpÚaddrr<   r<   r=   Úin6_getifaddr9  s    

ÿÿ r¨   c                     s   zt ddƒ} W n ty$   g  Y S 0 g }dd„ }tƒ }|  ¡ D ]Ò}| ¡ \
}}}}}}	}
}}}t|	dƒ}t|dƒ}t|ƒ‰ |t@ dkrŠq@|t@ r”q@||ƒ}t|dƒ}||ƒ}g }ˆ t	j
krÎ|dkrÆq@dg}n"‡ fd	d
„|D ƒ}tj |||¡}t|ƒdkr@| |||ˆ ||f¡ q@|  ¡  |S )Nz/proc/net/ipv6_router?   c                 S   s&   t  d| ¡}d |¡ ¡ }tj |¡S )Nr    rŸ   )rO   rt   r£   r¤   rl   r¡   r¢   )Úpr¥   r§   r<   r<   r=   Úproc2rh  s    zread_routes6.<locals>.proc2rr-   r   z::z::1c                 3   s   | ]}|d  ˆ kr|V  qdS )r*   Nr<   ©rf   Úx©Údevr<   r=   Ú	<genexpr>„  rZ   zread_routes6.<locals>.<genexpr>)rA   r9   r¨   r’   rG   r“   r   r”   r•   r   rŒ   rl   r¡   Zconstruct_source_candidate_setrr   rF   rB   )rI   r—   rª   ZlifaddrrK   Zd_bZdp_brš   Znh_br›   ÚrcÚusZfl_bZdev_br   ÚflÚdZdpZnhZcsetZdevaddrsr<   r­   r=   Úread_routes6V  s<    




r´   c                 C   s"   t t dt| tƒdd… ¡d ƒS )Nr‰   r-   r6   r   )r“   rO   rt   r
   ÚSIOCGIFINDEXr:   r<   r<   r=   r[   �  s    r[   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚLinuxInterfaceProviderrM   c                 C   s   t |jt@ ƒS ©N)Úboolrœ   ÚIFF_UP)Úselfr®   r<   r<   r=   Ú	_is_valid•  s    z LinuxInterfaceProvider._is_validc           	   
      sì   ddl m} i }tƒ }tƒ D ]Ê‰ zNt dtˆ tƒ¡d }tˆ ƒ}t	j
 tˆ td�d ¡}d }ttjtˆ ƒƒ}W n  tyŽ   tdˆ ƒ Y qY n0 |dkrœd }||tƒ}ˆ ˆ ˆ ||||rÎ‡ fdd	„|D ƒ|g ng |d
œ}t| |ƒ|ˆ < q|S )Nr   )Ú	FlagValueZ16xH14x)Zsiocgifhwaddrr)   zInterface %s does not exist!rŠ   c                    s    g | ]}|d  ˆ kr|d ‘qS )r*   r   r<   r«   ©rg   r<   r=   rj   ´  rZ   z/LinuxInterfaceProvider.load.<locals>.<listcomp>)Únamer   Údescriptionrœ   r{   ÚipÚipsÚmac)Zscapy.fieldsr¼   r¨   rL   rO   rt   r
   ÚSIOCGIFFLAGSr[   rl   r|   Zstr2macr   ÚSIOCGIFHWADDRr   rT   rm   r>   r9   r   r   r   )	rº   r¼   ÚdatarÁ   Zifflagsr{   rÂ   rÀ   Zif_datar<   r½   r=   Úload™  s:    
ÿ


ø
zLinuxInterfaceProvider.loadN)Ú__name__Ú
__module__Ú__qualname__r¾   r»   rÆ   r<   r<   r<   r=   r¶   ’  s   r¶   )Úx86_64Úaarch64c                 C   s(   t | tdƒ}t d|¡\}}||d  S )NZ1234567890123456ZQQç    €„.A©r   Ú
SIOCGSTAMPrO   rt   ©rV   Útsr_   r±   r<   r<   r=   Úget_last_packet_timestamp¾  s    rÑ   c                 C   s(   t | tdƒ}t d|¡\}}||d  S )NZ12345678ZIIrÌ   rÍ   rÏ   r<   r<   r=   rÑ   Ä  s    c                 C   s0   t | gg g dƒ\}}}|r,t | t¡ q q,q d S ©Nr   )r   ÚosÚreadr   )ÚfdÚrÚwÚer<   r<   r=   Ú	_flush_fdË  s    rÙ   c                   @   sB   e Zd ZdZdeddddfdd„Zdd„ Zefdd	„Zd
d„ Z	dS )ÚL2Socketz;read/write packets at layer 2 using Linux PF_PACKET socketsNr   c           
   
   C   s6  t |p
tjƒ| _|| _|d u r$tjn|| _t tjtjt 	|¡¡| _
| j
 tjtjd¡ |sÒtjr€|rvd|tjf }n
dtj }|d urÒzt| j
|| jƒ W n4 ttfyÐ } zt d|¡ W Y d }~n
d }~0 0 | jræt| j
| jƒ | j
 | j|f¡ t| j
 ¡ ƒ | j
 tjtjtj¡ tj�stz,| j
 ttd¡ | j
 tjtd¡ d| _W n" t�yr   d}t  |¡ Y n0 t!| t"ƒ�s | j
| _#| j# tjtj$tj¡ nd | _#| j
 %¡ }	|	d tj&v �rÚtj&j'|	d  | _(d	| _)nX|	d tj*v �rtj*j'|	d  | _(d| _)n.tj+| _(d	| _)t,d
|	d |	d |	d | j(j-ƒ d S )Nr   z(%s) and not (%s)znot (%s)zCannot set filter: %sr)   Tz2Your Linux Kernel does not support Auxiliary Data!r2   r*   zDUnable to guess type (interface=%s protocol=%#x family=%i). Using %s).r   r   rW   ÚtypeZsniff_promiscÚpromiscrT   Ú	AF_PACKETÚSOCK_RAWÚhtonsÚinsrS   rU   Ú	SO_RCVBUFZexcept_filterrY   ÚImportErrorr   r   Úerrorrb   ÚbindrÙ   rp   Úbufsizeru   ÚPY2r   ÚPACKET_AUXDATAr   Zauxdata_availableÚOSErrorÚinfoÚ
isinstanceÚL2ListenSocketÚoutsÚ	SO_SNDBUFÚgetsocknameÚl2typesÚ	num2layerÚLLÚlvlÚl3typesZ
default_l2r   r¾   )
rº   rW   rÛ   rÜ   ÚfilterZnofilterZmonitorÚexÚmsgÚsa_llr<   r<   r=   Ú__init__Ø  sp    	ÿ
"ýý
ý
zL2Socket.__init__c              	   C   sV   | j r
d S z&| jr.t| dd ƒr.t| j| jdƒ W n ttfyF   Y n0 t 	| ¡ d S )Nrà   r   )
ÚclosedrÜ   Úgetattrrb   rà   rW   ÚAttributeErrorrè   r   rB   ©rº   r<   r<   r=   rB     s    zL2Socket.closec                 C   sJ   |   | j|¡\}}}| jr,|d tjkr,dS |du r>t| jƒ}| j||fS )zHReceives a packet, then returns a tuple containing (cls, pkt_data, time)r*   )NNNN)Z	_recv_rawrà   rì   rT   ÚPACKET_OUTGOINGrÑ   rñ   )rº   r¬   Úpktr÷   rÐ   r<   r<   r=   Úrecv_raw*  s    
zL2Socket.recv_rawc              
   C   s²   zt  | |¡W S  tjy¬ } z„|jdkr–t|ƒtjk r–dtjt|ƒ  }t|t	ƒrvt  | |t
|d� ¡W  Y d }~S t  | t|ƒ| ¡W  Y d }~S ‚ W Y d }~n
d }~0 0 d S )Né   re   )rÆ   )r   ÚsendrT   rã   r�   rr   r   Úmin_pkt_sizerê   r   r   r   )rº   r¬   rö   Úpaddingr<   r<   r=   r  4  s    
" zL2Socket.send)
rÇ   rÈ   rÉ   Údescr   rø   rB   r   rÿ   r  r<   r<   r<   r=   rÚ   Õ  s   ú
G
rÚ   c                   @   s   e Zd ZdZdd„ ZdS )rë   zZread packets at layer 2 using Linux PF_PACKET sockets. Also receives the packets going OUTc                 C   s   t dƒ‚d S )Nz'Can't send anything with L2ListenSocket)r   )rº   r¬   r<   r<   r=   r  E  s    zL2ListenSocket.sendN)rÇ   rÈ   rÉ   r  r  r<   r<   r<   r=   rë   B  s   rë   c                   @   s$   e Zd ZdZefdd„Zdd„ ZdS )ÚL3PacketSocketz;read/write packets at layer 3 using Linux PF_PACKET socketsc                 C   s.   t  | |¡}|r*| jdkr*|j|j_|jS |S )Nr*   )r   Úrecvrò   ÚtimeÚpayload)rº   r¬   rþ   r<   r<   r=   r  M  s
    
zL3PacketSocket.recvc           
   
      s˜  |  ¡ d }|d u rttjƒ}|| jf}| j |¡ | j ¡ ‰ dd„ }t|ƒ}|tjv rh|tjj	| f}ˆ d tj
v r‚‡ fdd„}| jdkrª|| jkrªtd|| jƒ || _t||ƒƒ}t ¡ |_z| j ||¡W S  tj�y’ } z¦|jdk�r*t|ƒtjk �r*| j |dtjt|ƒ   ¡W  Y d }~S tj�r||jd	k�r|d}| ¡ D ] }	|| j t||	ƒƒ|¡7 }�qJ|W  Y d }~S ‚ W Y d }~n
d }~0 0 d S )
Nr   c                 S   s   | S r·   r<   ©r¬   r<   r<   r=   Ú<lambda>]  rZ   z%L3PacketSocket.send.<locals>.<lambda>r2   c                    s   t jjˆ d  ƒ |  S )Nr2   )r   rï   rð   r	  ©Zsnr<   r=   r
  b  rZ   z7Incompatible L3 types detected using %s instead of %s !r   re   éZ   )r�   r   r   rW   rÛ   rì   rä   rî   ró   Z	layer2numrï   rò   rñ   r   r   r  Z	sent_timeÚsendtorT   rã   r�   rr   r  r  Zauto_fragmentÚfragment)
rº   r¬   r;   ZsdtoÚllZtype_xÚsxrö   rg   r©   r<   r  r=   r  U  s@    



ÿ
ÿzL3PacketSocket.sendN)rÇ   rÈ   rÉ   r  r   r  r  r<   r<   r<   r=   r  J  s   r  c                   @   sX   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚVEthPairz8
    encapsulates a virtual Ethernet interface pair
    c                 C   s   t stdƒ‚||g| _d S )Nz7Virtual Ethernet interface pair only available on Linux)r   r   Úifaces)rº   r}   Z	peer_namer<   r<   r=   rø   ~  s
    ÿzVEthPair.__init__c                 C   s
   | j d S rÒ   ©r  rü   r<   r<   r=   rW   ˆ  s    zVEthPair.ifacec                 C   s
   | j d S )Nr)   r  rü   r<   r<   r=   ÚpeerŒ  s    zVEthPair.peerc                 C   s,   t  ddd| jd dddd| jd	 g	¡ d
S )zi
        create veth pair links
        :raises subprocess.CalledProcessError if operation fails
        rÀ   ÚlinkÚaddr   rÛ   Zvethr  r¾   r)   N©Ú
subprocessÚ
check_callr  rü   r<   r<   r=   Úsetup�  s    zVEthPair.setupc                 C   s   t  ddd| jd g¡ dS )zi
        remove veth pair links
        :raises subprocess.CalledProcessError if operation fails
        rÀ   r  Údelr   Nr  rü   r<   r<   r=   Údestroy˜  s    zVEthPair.destroyc                 C   s(   dD ]}t  ddd| j| dg¡ qdS )zi
        set veth pair links up
        :raises subprocess.CalledProcessError if operation fails
        ©r   r)   rÀ   r  ÚsetÚupNr  ©rº   Úidxr<   r<   r=   r     s    zVEthPair.upc                 C   s(   dD ]}t  ddd| j| dg¡ qdS )zk
        set veth pair links down
        :raises subprocess.CalledProcessError if operation fails
        r  rÀ   r  r  ÚdownNr  r   r<   r<   r=   r"  ©  s    zVEthPair.downc                 C   s   |   ¡  |  ¡  tj ¡  | S r·   )r  r  r   r  Úreloadrü   r<   r<   r=   Ú	__enter__²  s    
zVEthPair.__enter__c                 C   s   |   ¡  tj ¡  d S r·   )r  r   r  r#  )rº   Úexc_typeÚexc_valÚexc_tbr<   r<   r=   Ú__exit__¹  s    zVEthPair.__exit__N)rÇ   rÈ   rÉ   Ú__doc__rø   rW   r  r  r  r  r"  r$  r(  r<   r<   r<   r=   r  y  s   
		r  )r)   )r)  Ú
__future__r   Zfcntlr   r   ro   rQ   rÓ   rT   rO   r  rM   r  Zscapy.utilsrl   Zscapy.utils6Zscapy.compatr   r   Zscapy.constsr   Zscapy.arch.commonr   r	   Zscapy.arch.unixr
   r   Zscapy.configr   Z
scapy.datar   r   r   r   r   Zscapy.errorr   r   r   r   r   Zscapy.interfacesr   r   r   r   Zscapy.libs.structuresr   Zscapy.packetr   r   Zscapy.pton_ntopr   Zscapy.supersocketr   Zscapy.libs.sixZlibsru   r    r!   r"   r#   r$   r%   r&   r'   r(   rÄ   r8   rz   ZSIOCGIFNAMEZSIOCSIFLINKrq   rÃ   ZSIOCSIFFLAGSrµ   ZSIOCGIFCOUNTrÎ   r¹   ZIFF_BROADCASTZ	IFF_DEBUGZIFF_LOOPBACKZIFF_POINTOPOINTZIFF_NOTRAILERSZIFF_RUNNINGZ	IFF_NOARPZIFF_PROMISCr]   r^   ZPACKET_RECV_OUTPUTZPACKET_RX_RINGZPACKET_STATISTICSZPACKET_MR_MULTICASTr\   ZPACKET_MR_ALLMULTIr”   r•   ÚPACKET_HOSTÚPACKET_BROADCASTÚPACKET_MULTICASTÚPACKET_OTHERHOSTrý   ÚPACKET_LOOPBACKZPACKET_USERZPACKET_KERNELrç   ÚPACKET_FASTROUTEr>   rL   rY   rb   r…   rž   r¨   r´   r[   r¶   Zregister_providerÚunamerÑ   rÙ   rÚ   rë   r  Úobjectr  r<   r<   r<   r=   Ú<module>   s¬   ,

8F7)


m/