o
     JAf#                    @   s  	 d Z ddlZdZdZG dd deZG dd deZd	d
 Zd<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d Zd d! ZG d"d# d#ZdaejG d$d% d%eZejG d&d' d'eZG d(d) d)ZG d*d+ d+eeZG d,d- d-eZG d.d/ d/eeZG d0d1 d1Zee_G d2d3 d3ZG d4d5 d5eeZG d6d7 d7eZ G d8d9 d9eeZ!G d:d; d;Z"e"e_dS )=z1.0    N       c                   @      e Zd ZdS )AddressValueErrorN__name__
__module____qualname__ r
   r
    /usr/lib/python3.10/ipaddress.pyr          r   c                   @   r   )NetmaskValueErrorNr   r
   r
   r
   r   r      r   r   c              	   C   T   	 zt | W S  ttfy   Y nw zt| W S  ttfy"   Y nw t| d)Nz. does not appear to be an IPv4 or IPv6 address)IPv4Addressr   r   IPv6Address
ValueErroraddressr
   r
   r   
ip_address   s   

r   Tc              	   C   sX   	 zt | |W S  ttfy   Y nw zt| |W S  ttfy$   Y nw t| d)Nz. does not appear to be an IPv4 or IPv6 network)IPv4Networkr   r   IPv6Networkr   )r   strictr
   r
   r   
ip_network9   s   r   c              	   C   r   )Nz0 does not appear to be an IPv4 or IPv6 interface)IPv4Interfacer   r   IPv6Interfacer   r   r
   r
   r   ip_interfaceV   s   

r   c                 C   (   	 z|  ddW S  ty   tdw )N   bigz&Address negative or too large for IPv4to_bytesOverflowErrorr   r   r
   r
   r   v4_int_to_packedx   s   r"   c                 C   r   )N   r   z&Address negative or too large for IPv6r   r   r
   r
   r   v6_int_to_packed   s   	r$   c                 C   s.   	 t | d}t|dkrtd| |S )N/   zOnly one '/' permitted in )strsplitlenr   )r   addrr
   r
   r   _split_optional_netmask   s
   r+   c                 c   sR    	 t | }t| }}|D ]}|j|jd kr||fV  |}|}q||fV  d S N   )iternext_ip)	addressesitfirstlastipr
   r
   r   _find_address_range   s   	
r6   c                 C   s&   	 | dkr|S t ||  | d @  S )Nr   r-   )min
bit_length)Znumberbitsr
   r
   r   _count_righthand_zero_bits   s   
r:   c                 c   s    	 t | trt |tstd| j|jkrtd| |f | |kr&td| jdkr.t}n| jdkr6t}ntd| j}| j}|j}||krwt	t
|||| d  d }|||| f}|V  |d|> 7 }|d |jkrqd S ||ksGd S d S )Nz1first and last must be IP addresses, not networks%%s and %s are not of the same versionz*last IP address must be greater than firstr      zunknown IP versionr-   )
isinstance_BaseAddress	TypeErrorversionr   r   r   _max_prefixlenr0   r7   r:   r8   	_ALL_ONES)r3   r4   r5   Zip_bitsZ	first_intZlast_intZnbitsnetr
   r
   r   summarize_address_range   s<   



rD   c                 c   s    	 t | }i }|r.| }| }||}|d u r |||< n||kr,||= || |s
d }t| D ]}|d urC|j|jkrCq6|V  |}q6d S N)listpopsupernetgetappendsortedvaluesbroadcast_address)r1   Zto_mergesubnetsrC   rH   Zexistingr4   r
   r
   r   _collapse_addresses_internal   s,   


rO   c              	   C   s*  	 g }g }g }| D ]l}t |tr*|r$|d j|jkr$td||d f || q	|j|jkr\|rD|d j|jkrDtd||d f z||j W q	 ty[   ||j	 Y q	w |rp|d j|jkrptd||d f || q	t
t|}|rt|D ]\}}|t|| qt|| S )Nr;   )r=   r>   _versionr?   rJ   
_prefixlenrA   r5   AttributeErrornetwork_addressrK   setr6   extendrD   rO   )r1   ZaddrsZipsZnetsr5   r3   r4   r
   r
   r   collapse_addresses0  s>   
rW   c                 C   s*   	 t | tr
|  S t | tr|  S tS rE   )r=   _BaseNetwork_get_networks_keyr>   _get_address_keyNotImplemented)objr
   r
   r   get_mixed_type_keyf  s   

r]   c                   @   s   e Zd Z	 dZedd Zedd Zedd Zedd	 Zd
d Z	dd Z
edd Zedd Zedd Zedd Zedd Zedd Zdd ZdS )_IPAddressBaser
   c                 C   
   	 |   S rE   )_explode_shorthand_ip_stringselfr
   r
   r   exploded     z_IPAddressBase.explodedc                 C   s
   	 t | S rE   r'   ra   r
   r
   r   
compressed  rd   z_IPAddressBase.compressedc                 C   r_   rE   )_reverse_pointerra   r
   r
   r   reverse_pointer     z_IPAddressBase.reverse_pointerc                 C      dt | f }t|)Nz%200s has no version specifiedtypeNotImplementedErrorrb   msgr
   r
   r   r@     s   z_IPAddressBase.versionc                 C   sF   |dk rd}t ||| jf || jkr!d}t ||| j| jf d S )Nr   z-%d (< 0) is not permitted as an IPv%d addressz2%d (>= 2**%d) is not permitted as an IPv%d address)r   rQ   rB   rA   )rb   r   ro   r
   r
   r   _check_int_address  s   

z!_IPAddressBase._check_int_addressc                 C   s.   t |}||krd}t||||| jf d S )Nz6%r (len %d != %d) is not permitted as an IPv%d address)r)   r   rQ   )rb   r   Zexpected_lenZaddress_lenro   r
   r
   r   _check_packed_address  s   z$_IPAddressBase._check_packed_addressc                 C   s   	 | j | j |? A S rE   )rB   )cls	prefixlenr
   r
   r   _ip_int_from_prefix  s   	z"_IPAddressBase._ip_int_from_prefixc           	      C   s^   	 t || j}| j| }||? }d|> d }||kr-| jd }||d}d}t|| |S )Nr-      r   z&Netmask pattern %r mixes zeroes & ones)r:   rA   r    r   )	rr   ip_intZtrailing_zeroesrs   Zleading_onesZall_onesZbyteslenZdetailsro   r
   r
   r   _prefix_from_ip_int  s   

z"_IPAddressBase._prefix_from_ip_intc                 C   s   d| }t |d )Nz%r is not a valid netmask)r   )rr   Znetmask_strro   r
   r
   r   _report_invalid_netmask  s   
z&_IPAddressBase._report_invalid_netmaskc                 C   sl   	 |  r	| s| | zt|}W n ty"   | | Y nw d|  kr.| jks4n | | |S Nr   )isasciiisdigitrx   intr   rA   )rr   Zprefixlen_strrs   r
   r
   r   _prefix_from_prefix_string  s   

z)_IPAddressBase._prefix_from_prefix_stringc                 C   s   	 z|  |}W n ty   | | Y nw z| |W S  ty&   Y nw || jN }z| |W S  tyA   | | Y d S w rE   )_ip_int_from_stringr   rx   rw   r   rB   )rr   ip_strrv   r
   r
   r   _prefix_from_ip_string  s"   
z%_IPAddressBase._prefix_from_ip_stringc                 C   sJ   	 t |ttfr|| jfS t |tst|}t|dkr|S |d | jfS )Nr-   r   )r=   bytesr|   rA   tupler+   r)   )rr   r   r
   r
   r   _split_addr_prefix  s   	

z!_IPAddressBase._split_addr_prefixc                 C   s   | j t| ffS rE   )	__class__r'   ra   r
   r
   r   
__reduce__-     z_IPAddressBase.__reduce__N)r   r   r	   	__slots__propertyrc   rf   rh   r@   rp   rq   classmethodrt   rw   rx   r}   r   r   r   r
   r
   r
   r   r^     s4    




	




!
r^   c                       sr   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d Z fddZ  ZS )r>   r
   c                 C      | j S rE   r0   ra   r
   r
   r   __int__>  s   z_BaseAddress.__int__c                 C   s2   z| j |j ko| j|jkW S  ty   t Y S w rE   )r0   rQ   rS   r[   rb   otherr
   r
   r   __eq__A  s   
z_BaseAddress.__eq__c                 C   sF   t |tstS | j|jkrtd| |f | j|jkr!| j|jk S dS Nr;   F)r=   r>   r[   rQ   r?   r0   r   r
   r
   r   __lt__H  s   
z_BaseAddress.__lt__c                 C   s    t |tstS | t| | S rE   r=   r|   r[   r   r   r
   r
   r   __add__T     
z_BaseAddress.__add__c                 C   s    t |tstS | t| | S rE   r   r   r
   r
   r   __sub__Y  r   z_BaseAddress.__sub__c                 C      d| j jt| f S Nz%s(%r)r   r   r'   ra   r
   r
   r   __repr__^     z_BaseAddress.__repr__c                 C   s   t | | jS rE   )r'   _string_from_ip_intr0   ra   r
   r
   r   __str__a  r   z_BaseAddress.__str__c                 C   s   t tt| jS rE   )hashhexr|   r0   ra   r
   r
   r   __hash__d  s   z_BaseAddress.__hash__c                 C   s
   | j | fS rE   rQ   ra   r
   r
   r   rZ   g  s   
z_BaseAddress._get_address_keyc                 C   s   | j | jffS rE   )r   r0   ra   r
   r
   r   r   j  s   z_BaseAddress.__reduce__c                    s   	 |r	|d dkrt t| |S td u rdd l}|dat|}|s*t |S | \}}}|dkr?| j	dkr=d}nd}|dkrG| j
}n| j
d }|rV||d d	 7 }|r\|d
7 }t t| | d| | | S )NrP   sr   z(#?)(_?)([xbnX])nr   bxr-   r&   0)formatr'   _address_fmt_rerecompile	fullmatchsuper
__format__groupsrQ   rA   r|   )rb   fmtr   mZ	alternategroupingZfmt_baseZpadlenr   r
   r   r   m  s,   



 z_BaseAddress.__format__)r   r   r	   r   r   r   r   r   r   r   r   r   rZ   r   r   __classcell__r
   r
   r   r   r>   3  s    r>   c                   @   s^  e 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d Zejdd Zejdd Zedd Zedd Zedd Zedd  Zed!d" Zed#d$ Zd%d& Zd'd( Zd)d* ZdEd-d.ZdEd/d0Zed1d2 Zed3d4 Zd5d6 Z d7d8 Z!ed9d: Z"ed;d< Z#ed=d> Z$ed?d@ Z%edAdB Z&edCdD Z'd,S )FrX   c                 C   r   r   r   ra   r
   r
   r   r     r   z_BaseNetwork.__repr__c                 C      d| j | jf S N%s/%d)rT   rs   ra   r
   r
   r   r     r   z_BaseNetwork.__str__c                 c   s<    	 t | j}t | j}t|d |D ]}| |V  qd S r,   r|   rT   rM   range_address_classrb   network	broadcastr   r
   r
   r   hosts  s   

z_BaseNetwork.hostsc                 c   s:    t | j}t | j}t||d D ]}| |V  qd S r,   r   r   r
   r
   r   __iter__  s   

z_BaseNetwork.__iter__c                 C   sh   t | j}t | j}|dkr|| |krtd| || S |d7 }|| |k r-td| || S )Nr   zaddress out of ranger-   )r|   rT   rM   
IndexErrorr   )rb   r   r   r   r
   r
   r   __getitem__  s   

z_BaseNetwork.__getitem__c                 C   s^   t |tstS | j|jkrtd| |f | j|jkr!| j|jk S | j|jkr-| j|jk S dS r   )r=   rX   r[   rQ   r?   rT   netmaskr   r
   r
   r   r     s   
z_BaseNetwork.__lt__c                 C   sF   z| j |j ko| j|jkot| jt|jkW S  ty"   t Y S w rE   )rQ   rT   r|   r   rS   r[   r   r
   r
   r   r     s   
z_BaseNetwork.__eq__c                 C   s   t t| jt| jA S rE   )r   r|   rT   r   ra   r
   r
   r   r     s   z_BaseNetwork.__hash__c                 C   s4   | j |j krdS t|trdS |j| jj@ | jjkS NF)rQ   r=   rX   r0   r   rT   r   r
   r
   r   __contains__  s
   
z_BaseNetwork.__contains__c                 C   s*   	 | j |v p| j|v p|j | v p|j| v S rE   )rT   rM   r   r
   r
   r   overlaps  s   


z_BaseNetwork.overlapsc                 C   s   |  t| jt| jB S rE   )r   r|   rT   hostmaskra   r
   r
   r   rM     s   z_BaseNetwork.broadcast_addressc                 C   s   |  t| j| jA S rE   )r   r|   r   rB   ra   r
   r
   r   r     s   z_BaseNetwork.hostmaskc                 C   r   r   )rT   rR   ra   r
   r
   r   with_prefixlen     z_BaseNetwork.with_prefixlenc                 C   r   N%s/%s)rT   r   ra   r
   r
   r   with_netmask  r   z_BaseNetwork.with_netmaskc                 C   r   r   )rT   r   ra   r
   r
   r   with_hostmask  r   z_BaseNetwork.with_hostmaskc                 C   s   	 t | jt | j d S r,   )r|   rM   rT   ra   r
   r
   r   num_addresses  s   z_BaseNetwork.num_addressesc                 C   rj   )Nz%%200s has no associated address classrk   rn   r
   r
   r   r     s   z_BaseNetwork._address_classc                 C   r   rE   )rR   ra   r
   r
   r   rs        z_BaseNetwork.prefixlenc                 c   s"   	 | j |j kstd| |f t|tstd| || s(td|| f || kr.d S |d|j|jf }| 	 \}}||krv||krv||rV|V  |	 \}}n||re|V  |	 \}}n	t
d|||f ||krv||ksG||kr|V  d S ||kr|V  d S t
d|||f )Nr;   z%s is not a network objectz%s not contained in %sr   z3Error performing exclusion: s1: %s s2: %s other: %s)rQ   r?   r=   rX   	subnet_ofr   r   rT   rs   rN   AssertionError)rb   r   s1s2r
   r
   r   address_exclude  sD   #






z_BaseNetwork.address_excludec                 C   sb   	 | j |j krtd| |f | j|jk rdS | j|jkrdS | j|jk r'dS | j|jkr/dS dS )Nz"%s and %s are not of the same typerP   r-   r   )rQ   r?   rT   r   r   r
   r
   r   compare_networksg  s    z_BaseNetwork.compare_networksc                 C   s   	 | j | j| jfS rE   )rQ   rT   r   ra   r
   r
   r   rY     s   z_BaseNetwork._get_networks_keyr-   Nc           	      c   s    	 | j | jkr| V  d S |d ur'|| j k rtd|dkr"td|| j  }|dk r/td| j | }|| jkrAtd|| f t| j}t| jd }t| jd |? }t|||D ]}| ||f}|V  q\d S )Nznew prefix must be longerr-   (cannot set prefixlen_diff and new_prefixr   zprefix length diff must be > 0z0prefix length diff %d is invalid for netblock %s)	rR   rA   r   r|   rT   rM   r   r   r   )	rb   prefixlen_diff
new_prefixnew_prefixlenstartendstepZnew_addrcurrentr
   r
   r   rN     s6   




z_BaseNetwork.subnetsc                 C   s   	 | j dkr| S |d ur"|| j krtd|dkrtd| j | }| j| }|dk r4td| j|f | t| jt| j|> @ |fS )Nr   znew prefix must be shorterr-   r   z;current prefixlen is %d, cannot have a prefixlen_diff of %d)rR   r   rs   r   r|   rT   r   )rb   r   r   r   r
   r
   r   rH     s(   



z_BaseNetwork.supernetc                 C      	 | j jo| jjS rE   )rT   is_multicastrM   ra   r
   r
   r   r        z_BaseNetwork.is_multicastc                 C   s^   z| j |j krt|  d| d|j| jko|j| jkW S  ty.   td|  d| w )Nz and z are not of the same versionz*Unable to test subnet containment between )rQ   r?   rT   rM   rS   )ar   r
   r
   r   _is_subnet_of  s   
z_BaseNetwork._is_subnet_ofc                 C   s   	 |  | |S rE   r   r   r
   r
   r   r        z_BaseNetwork.subnet_ofc                 C   s   	 |  || S rE   r   r   r
   r
   r   supernet_of  r   z_BaseNetwork.supernet_ofc                 C   r   rE   )rT   is_reservedrM   ra   r
   r
   r   r     r   z_BaseNetwork.is_reservedc                 C   r   rE   )rT   is_link_localrM   ra   r
   r
   r   r   +  s   z_BaseNetwork.is_link_localc                 C   r   rE   )rT   
is_privaterM   ra   r
   r
   r   r   6  r   z_BaseNetwork.is_privatec                 C   
   	 | j  S rE   r   ra   r
   r
   r   	is_globalB  ri   z_BaseNetwork.is_globalc                 C   r   rE   )rT   is_unspecifiedrM   ra   r
   r
   r   r   M  r   z_BaseNetwork.is_unspecifiedc                 C   r   rE   )rT   is_loopbackrM   ra   r
   r
   r   r   Y  r   z_BaseNetwork.is_loopback)r-   N)(r   r   r	   r   r   r   r   r   r   r   r   r   r   	functoolscached_propertyrM   r   r   r   r   r   r   r   rs   r   r   rY   rN   rH   r   staticmethodr   r   r   r   r   r   r   r   r   r
   r
   r
   r   rX     sf    







K0


5)








rX   c                   @   s   e Zd Z	 dZdZde d ZeZi Zdd Z	e
dd Ze
d	d
 Ze
dd Ze
dd Zdd Zedd Zedd ZdS )_BaseV4r
   r   r&   r-   c                 C   s   t | S rE   re   ra   r
   r
   r   r`   x  s   z$_BaseV4._explode_shorthand_ip_stringc                 C   s   	 || j vrCt|tr|}d|  kr| jksn | | nz| |}W n ty4   | |}Y nw t| 	|}||f| j |< | j | S ry   )
_netmask_cacher=   r|   rA   rx   r}   r   r   r   rt   rr   argrs   r   r
   r
   r   _make_netmask{  s   



z_BaseV4._make_netmaskc              
   C   sr   	 |st d|d}t|dkrt d| ztt| j|dW S  ty8 } z	t d||f d d }~ww )NAddress cannot be empty.r   zExpected 4 octets in %rr   %s in %r)r   r(   r)   r|   
from_bytesmap_parse_octetr   )rr   r   Zoctetsexcr
   r
   r   r~     s   
z_BaseV4._ip_int_from_stringc                 C   s   	 |st d| r| sd}t || t|dkr%d}t || |dkr7|d dkr7d}t || t|d}|d	krFt d
| |S )NzEmpty octet not permittedz#Only decimal digits permitted in %r   z$At most 3 characters permitted in %rr   r   z%Leading zeros are not permitted in %r
      zOctet %d (> 255) not permitted)r   rz   r{   r)   r|   )rr   Z	octet_strro   Z	octet_intr
   r
   r   r     s    
z_BaseV4._parse_octetc                 C   s   	 d tt|ddS )Nr   r   r   )joinr   r'   r    )rr   rv   r
   r
   r   r     s   	z_BaseV4._string_from_ip_intc                 C   s(   	 t | dd d d }d|d S )Nr   rP   z.in-addr.arpa)r'   r(   r   )rb   Zreverse_octetsr
   r
   r   rg        z_BaseV4._reverse_pointerc                 C   r   rE   rA   ra   r
   r
   r   max_prefixlen  r   z_BaseV4.max_prefixlenc                 C   r   rE   r   ra   r
   r
   r   r@     r   z_BaseV4.versionN)r   r   r	   r   rQ   
IPV4LENGTHrB   rA   r   r`   r   r   r~   r   r   rg   r   r   r@   r
   r
   r
   r   r   e  s*    


#
	
r   c                   @   s   e Zd Z	 dZdd Zedd Zedd Zee	 dd	 Z
ee	 d
d Zedd Zedd Zedd Zedd ZdS )r   )r0   __weakref__c                 C   sv   	 t |tr| | || _d S t |tr$| |d t|d| _d S t|}d|v r3td|| 	|| _d S )Nr   r   r%   Unexpected '/' in )
r=   r|   rp   r0   r   rq   r   r'   r   r~   rb   r   Zaddr_strr
   r
   r   __init__  s   


zIPv4Address.__init__c                 C      	 t | jS rE   )r"   r0   ra   r
   r
   r   packed     
zIPv4Address.packedc                 C      	 | | j jv S rE   )
_constants_reserved_networkra   r
   r
   r   r         zIPv4Address.is_reservedc                       	 t  fdd jjD S )Nc                 3       | ]} |v V  qd S rE   r
   .0rC   ra   r
   r   	<genexpr>5      z)IPv4Address.is_private.<locals>.<genexpr>)anyr
  _private_networksra   r
   ra   r   r   +  s   zIPv4Address.is_privatec                 C   s   | | j jvo	| j S rE   )r
  _public_networkr   ra   r
   r
   r   r   7  s   zIPv4Address.is_globalc                 C   r	  rE   r
  _multicast_networkra   r
   r
   r   r   <  r  zIPv4Address.is_multicastc                 C   s   	 | | j jkS rE   )r
  _unspecified_addressra   r
   r
   r   r   G  r  zIPv4Address.is_unspecifiedc                 C   r	  rE   )r
  _loopback_networkra   r
   r
   r   r   R     zIPv4Address.is_loopbackc                 C   r	  rE   r
  _linklocal_networkra   r
   r
   r   r   \  r  zIPv4Address.is_link_localN)r   r   r	   r   r  r   r  r   r   	lru_cacher   r   r   r   r   r   r
   r
   r
   r   r     s,    #








	r   c                   @   sx   e Zd Zdd Zejdd Zdd Zdd Zd	d
 Z	dd Z
ejZedd Zedd Zedd Zedd ZdS )r   c                 C   D   |  |\}}t| | t||fdd| _| jj| _| jj| _d S NF)r   )r   r   r  r   r   r   rR   rb   r   r*   maskr
   r
   r   r  i  
   
zIPv4Interface.__init__c                 C      | j jS rE   r   r   ra   r
   r
   r   r   q     zIPv4Interface.hostmaskc                 C      d|  | j| jf S r   r   r0   rR   ra   r
   r
   r   r   u  s   zIPv4Interface.__str__c                 C   @   t | |}|tu s|s|S z| j|jkW S  ty   Y dS w r   )r   r   r[   r   rS   rb   r   Zaddress_equalr
   r
   r   r   y     zIPv4Interface.__eq__c                 C   sL   t | |}|tu rtS z| j|jk p| j|jko|W S  ty%   Y dS w r   )r   r   r[   r   rS   rb   r   Zaddress_lessr
   r
   r   r        zIPv4Interface.__lt__c                 C      t | j| jt| jjfS rE   r   r0   rR   r|   r   rT   ra   r
   r
   r   r        zIPv4Interface.__hash__c                 C   
   t | jS rE   )r   r0   ra   r
   r
   r   r5        
zIPv4Interface.ipc                 C   r&  r   r'  ra   r
   r
   r   r        zIPv4Interface.with_prefixlenc                 C   r&  r   r   r0   r   ra   r
   r
   r   r     r2  zIPv4Interface.with_netmaskc                 C   r&  r   r   r0   r   ra   r
   r
   r   r     r2  zIPv4Interface.with_hostmaskN)r   r   r	   r  r   r   r   r   r   r   r   r^   r   r   r5   r   r   r   r
   r
   r
   r   r   g  s"    



r   c                   @   s0   e Zd Z	 eZdddZee dd Z	dS )r   Tc                       	 |  |\ }t | _| |\| _| _t| j}|t| j@ |kr6|r,td|  t|t| j@ | _| j| jd krD| j	| _
d S | j| jkrS fdd| _
d S d S )N%s has host bits setr-   c                      
   t  gS rE   )r   r
   r*   r
   r   <lambda>     
 z&IPv4Network.__init__.<locals>.<lambda>)r   r   rT   r   r   rR   r|   r   rA   r   r   rb   r   r   r!  r  r
   r8  r   r    s    "

zIPv4Network.__init__c                 C   s(   	 | j tdv o| jtdv  o| j S )N100.64.0.0/10)rT   r   rM   r   ra   r
   r
   r   r     s   zIPv4Network.is_globalNT)
r   r   r	   r   r   r  r   r   r  r   r
   r
   r
   r   r     s    
4r   c                   @   s   e Zd ZedZedZedZedZededededededed	ed
ededededededgZedZ	e
dZdS )_IPv4Constantsz169.254.0.0/16z127.0.0.0/8z224.0.0.0/4r<  z	0.0.0.0/8z
10.0.0.0/8z172.16.0.0/12z192.0.0.0/29z192.0.0.170/31z192.0.2.0/24z192.168.0.0/16z198.18.0.0/15z198.51.100.0/24z203.0.113.0/24z240.0.0.0/4z255.255.255.255/32z0.0.0.0N)r   r   r	   r   r  r  r  r  r  r  r   r  r
   r
   r
   r   r>    s,    r>  c                   @   s   e Zd Z	 dZdZde d ZdZedZ	eZ
i Zedd Zed	d
 Zedd Zedd ZedddZdd Zdd Zedd Zedd Zedd ZdS )_BaseV6r
   r<   r&   r-   ru   0123456789ABCDEFabcdefc                 C   sn   	 || j vr2t|tr|}d|  kr| jksn | | n| |}t| |}||f| j |< | j | S ry   )r   r=   r|   rA   rx   r}   r   rt   r   r
   r
   r   r   2  s   




z_BaseV6._make_netmaskc              
   C   s  	 |st d|d}d}t||k rd||f }t |d|d v rWz	t| j}W n t yB } z	t d||f d d }~ww |d|d	? d
@   |d|d
@   | jd }t||krnd|d |f }t |d }tdt|d D ]}	||	 s|d urd| }t ||	}qy|d ur|}
t|| d }|d s|
d8 }
|
rd}t || |d s|d8 }|rd}t || | j|
|  }|dk rd}t || jd |f n3t|| jkrd}t || j|f |d sd}t || |d sd}t || t|}
d}d}z7d}t|
D ]}	|d	K }|| 	||	 O }q|d	| K }t| dD ]}	|d	K }|| 	||	 O }q0|W S  t
yY } z	t d||f d d }~ww )Nr   :r   z At least %d parts expected in %rr   rP   r   %xr#     r-   z!At most %d colons permitted in %rz At most one '::' permitted in %rr   z0Leading ':' only permitted as part of '::' in %rz1Trailing ':' only permitted as part of '::' in %rz/Expected at most %d other parts with '::' in %rz,Exactly %d parts expected without '::' in %r)r   r(   r)   r   rG   r0   rJ   _HEXTET_COUNTr   _parse_hextetr   )rr   r   partsZ
_min_partsro   Zipv4_intr   Z
_max_partsZ
skip_indexiZparts_hiZparts_loZparts_skippedrv   r
   r
   r   r~   F  s   


z_BaseV6._ip_int_from_stringc                 C   s@   	 | j |std| t|dkrd}t|| t|dS )NzOnly hex digits permitted in %rr   z$At most 4 characters permitted in %rr#   )_HEX_DIGITS
issupersetr   r)   r|   )rr   Z
hextet_strro   r
   r
   r   rE    s   
z_BaseV6._parse_hextetc           	      C   s   	 d}d}d}d}t |D ]\}}|dkr(|d7 }|dkr|}||kr'|}|}qd}d}q|dkrP|| }|t|kr@|dg7 }dg|||< |dkrPdg| }|S )NrP   r   r   r-    )	enumerater)   )	rr   hextetsZbest_doublecolon_startZbest_doublecolon_lenZdoublecolon_startZdoublecolon_lenindexZhextetZbest_doublecolon_endr
   r
   r   _compress_hextets  s4   

z_BaseV6._compress_hextetsNc                    s\   	 |d u r
t | j}|| jkrtdd|   fddtdddD }| |}d|S )	NzIPv6 address is too large%032xc                    s&   g | ]}d t  ||d  d qS )rB  r   r#   )r|   r  r   Zhex_strr
   r   
<listcomp>  s   & z/_BaseV6._string_from_ip_int.<locals>.<listcomp>r   r   r   rA  )r|   r0   rB   r   r   rN  r   )rr   rv   rL  r
   rQ  r   r     s   



z_BaseV6._string_from_ip_intc                    s   	 t | trt| j}nt | trt| j}nt| }| |}d|   fddtdddD }t | ttfrBdd	|| j
f S d	|S )	NrO  c                    s   g | ]
} ||d   qS )r   r
   rP  rQ  r
   r   rR  %  s    z8_BaseV6._explode_shorthand_ip_string.<locals>.<listcomp>r   r   r   r   rA  )r=   r   r'   rT   r   r5   r~   r   rX   r   rR   )rb   r   rv   rF  r
   rQ  r   r`     s   
	


z$_BaseV6._explode_shorthand_ip_stringc                 C   s(   	 | j d d d dd}d|d S )NrP   rA  rJ  r   z	.ip6.arpa)rc   replacer   )rb   Zreverse_charsr
   r
   r   rg   *  r   z_BaseV6._reverse_pointerc                 C   sB   	 |  d\}}}|sd }||fS |rd|v rtd|  ||fS )N%zInvalid IPv6 address: "%r")	partitionr   )r   r*   sepscope_idr
   r
   r   _split_scope_id3  s   z_BaseV6._split_scope_idc                 C   r   rE   r   ra   r
   r
   r   r   G  r   z_BaseV6.max_prefixlenc                 C   r   rE   r   ra   r
   r
   r   r@   K  r   z_BaseV6.versionrE   )r   r   r	   r   rQ   
IPV6LENGTHrB   rD  	frozensetrH  rA   r   r   r   r~   rE  rN  r   r`   rg   r   rX  r   r   r@   r
   r
   r
   r   r?    s6    

g

/	

r?  c                       s   e Zd Z	 dZdd Z fddZdd Z fdd	Zed
d Z	edd Z
edd Zedd Zedd Zedd Zee dd Zedd Zedd Zedd Zedd Zed d! Zed"d# Z  ZS )$r   )r0   	_scope_idr  c                 C   s   	 t |tr| | || _d | _d S t |tr*| |d t|d| _d | _d S t|}d|v r9t	d|| 
|\}| _| || _d S )Nr#   r   r%   r  )r=   r|   rp   r0   r[  r   rq   r   r'   r   rX  r~   r  r
   r
   r   r  V  s    


zIPv6Address.__init__c                    s"   t   }| jr|d | j S |S )NrT  )r   r   r[  )rb   r   r   r
   r   r   ~  s   
zIPv6Address.__str__c                 C   s   t | j| jfS rE   )r   r0   r[  ra   r
   r
   r   r     r   zIPv6Address.__hash__c                    s2   t  |}|tu rtS |sdS | jt|dd kS )NFr[  )r   r   r[   r[  getattrr)  r   r
   r   r     s   zIPv6Address.__eq__c                 C   s   	 | j S rE   )r[  ra   r
   r
   r   rW    s   zIPv6Address.scope_idc                 C   r  rE   )r$   r0   ra   r
   r
   r   r    r  zIPv6Address.packedc                 C   r	  rE   r  ra   r
   r
   r   r     r  zIPv6Address.is_multicastc                    r  )Nc                 3   r  rE   r
   rP  ra   r
   r   r    r  z*IPv6Address.is_reserved.<locals>.<genexpr>)r  r
  _reserved_networksra   r
   ra   r   r     s   zIPv6Address.is_reservedc                 C   r	  rE   r  ra   r
   r
   r   r     r  zIPv6Address.is_link_localc                 C   r	  rE   )r
  _sitelocal_networkra   r
   r
   r   is_site_local  s   
zIPv6Address.is_site_localc                    s0   	  j }|d ur|jS t fdd jjD S )Nc                 3   r  rE   r
   r  ra   r
   r   r    r  z)IPv6Address.is_private.<locals>.<genexpr>)ipv4_mappedr   r  r
  r  )rb   r`  r
   ra   r   r     s
   zIPv6Address.is_privatec                 C   r   rE   r   ra   r
   r
   r   r     ri   zIPv6Address.is_globalc                 C      	 | j dkS ry   r   ra   r
   r
   r   r        
zIPv6Address.is_unspecifiedc                 C   ra  r,   r   ra   r
   r
   r   r     rb  zIPv6Address.is_loopbackc                 C   s"   	 | j d? dkr
d S t| j d@ S )Nr   rC      r0   r   ra   r
   r
   r   r`    s   zIPv6Address.ipv4_mappedc                 C   s6   	 | j d? dkr
d S t| j d? d@ t| j  d@ fS )N`   i   @   rc  rd  ra   r
   r
   r   teredo
  s   zIPv6Address.teredoc                 C   s&   	 | j d? dkr
d S t| j d? d@ S )Np   i   P   rc  rd  ra   r
   r
   r   	sixtofour  s   zIPv6Address.sixtofour)r   r   r	   r   r  r   r   r   r   rW  r  r   r   r   r_  r   r  r   r   r   r   r`  rg  rj  r   r
   r
   r   r   r   P  sD    (






	








r   c                       s   e Zd Zdd Zejdd Z fddZdd Zd	d
 Z	dd Z
ejZedd Zedd Zedd Zedd Zedd Zedd Z  ZS )r   c                 C   r  r  )r   r   r  r   r   r   rR   r   r
   r
   r   r  )  r"  zIPv6Interface.__init__c                 C   r#  rE   r$  ra   r
   r
   r   r   1  r%  zIPv6Interface.hostmaskc                    s   dt   | jf S r   )r   r   rR   ra   r   r
   r   r   5  s   
zIPv6Interface.__str__c                 C   r(  r   )r   r   r[   r   rS   r)  r
   r
   r   r   9  r*  zIPv6Interface.__eq__c                 C   sL   t | |}|tu r|S z| j|jk p| j|jko|W S  ty%   Y dS w r   )r   r   r[   r   rS   r+  r
   r
   r   r   E  r,  zIPv6Interface.__lt__c                 C   r-  rE   r.  ra   r
   r
   r   r   Q  r/  zIPv6Interface.__hash__c                 C   r0  rE   )r   r0   ra   r
   r
   r   r5   V  r1  zIPv6Interface.ipc                 C   r&  r   r'  ra   r
   r
   r   r   Z  r2  zIPv6Interface.with_prefixlenc                 C   r&  r   r3  ra   r
   r
   r   r   _  r2  zIPv6Interface.with_netmaskc                 C   r&  r   r4  ra   r
   r
   r   r   d  r2  zIPv6Interface.with_hostmaskc                 C      | j dko| jjS ry   )r0   r   r   ra   r
   r
   r   r   i     zIPv6Interface.is_unspecifiedc                 C   rk  r,   )r0   r   r   ra   r
   r
   r   r   m  rl  zIPv6Interface.is_loopback)r   r   r	   r  r   r   r   r   r   r   r   r^   r   r   r5   r   r   r   r   r   r   r
   r
   r   r   r   '  s*    





r   c                   @   s0   e Zd Z	 eZd	ddZdd Zedd ZdS )
r   Tc                    r5  )Nr6  r-   c                      r7  rE   )r   r
   r8  r
   r   r9    r:  z&IPv6Network.__init__.<locals>.<lambda>)r   r   rT   r   r   rR   r|   r   rA   r   r   r;  r
   r8  r   r    s    

zIPv6Network.__init__c                 c   s@    	 t | j}t | j}t|d |d D ]}| |V  qd S r,   r   r   r
   r
   r   r     s   

zIPv6Network.hostsc                 C   r   rE   )rT   r_  rM   ra   r
   r
   r   r_    s   
zIPv6Network.is_site_localNr=  )	r   r   r	   r   r   r  r   r   r_  r
   r
   r
   r   r   r  s    
0r   c                   @   s   e Zd ZedZedZededededededed	ed
ededg
ZedededededededededededededededgZedZdS )_IPv6Constantsz	fe80::/10zff00::/8z::1/128z::/128z::ffff:0:0/96z100::/64z	2001::/23z2001:2::/48z2001:db8::/32z2001:10::/28zfc00::/7z::/8z100::/8z200::/7z400::/6z800::/5z1000::/4z4000::/3z6000::/3z8000::/3zA000::/3zC000::/3zE000::/4zF000::/5zF800::/6zFE00::/9z	fec0::/10N)	r   r   r	   r   r  r  r  r]  r^  r
   r
   r
   r   rm    s0    rm  r=  )#__version__r   r  rY  r   r   r   r   r   r   r"   r$   r+   r6   r:   rD   rO   rW   r]   r^   r   total_orderingr>   rX   r   r   r   r   r>  r
  r?  r   r   r   rm  r
   r
   r
   r   <module>   sZ   
"716 3k   H uCR  4 XK\
!