
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ct„jú/ ã               @   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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               @   s   e Zd ZdS )ÚAddressValueErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú!/usr/lib64/python3.6/ipaddress.pyr      s   r   c               @   s   e Zd ZdS )ÚNetmaskValueErrorN)r   r   r   r   r   r   r	   r
      s   r
   c             C   sT   yt | ƒS  ttfk
r    Y nX yt| ƒS  ttfk
rB   Y nX td|  ƒ‚d S )Nz0%r does not appear to be an IPv4 or IPv6 address)ÚIPv4Addressr   r
   ÚIPv6AddressÚ
ValueError)Úaddressr   r   r	   Ú
ip_address   s    r   Tc             C   sX   y
t | |ƒS  ttfk
r"   Y nX y
t| |ƒS  ttfk
rF   Y nX td|  ƒ‚d S )Nz0%r does not appear to be an IPv4 or IPv6 network)ÚIPv4Networkr   r
   ÚIPv6Networkr   )r   Ústrictr   r   r	   Ú
ip_network9   s    

r   c             C   sT   yt | ƒS  ttfk
r    Y nX yt| ƒS  ttfk
rB   Y nX td|  ƒ‚d S )Nz2%r does not appear to be an IPv4 or IPv6 interface)ÚIPv4Interfacer   r
   ÚIPv6Interfacer   )r   r   r   r	   Úip_interfaceW   s    r   c             C   s.   y| j ddƒS  tk
r(   tdƒ‚Y nX d S )Né   Úbigz&Address negative or too large for IPv4)Úto_bytesÚOverflowErrorr   )r   r   r   r	   Úv4_int_to_packedz   s    r   c             C   s.   y| j ddƒS  tk
r(   tdƒ‚Y nX d S )Né   r   z&Address negative or too large for IPv6)r   r   r   )r   r   r   r	   Úv6_int_to_packedŽ   s    
r   c             C   s*   t | ƒjdƒ}t|ƒdkr&td|  ƒ‚|S )Nú/é   zOnly one '/' permitted in %r)ÚstrÚsplitÚlenr   )r   Úaddrr   r   r	   Ú_split_optional_netmaskž   s    r$   c             c   sR   t | ƒ}t|ƒ }}x.|D ]&}|j|jd kr<||fV  |}|}qW ||fV  d S )Né   )ÚiterÚnextÚ_ip)Ú	addressesÚitÚfirstÚlastÚipr   r   r	   Ú_find_address_range¦   s    


r.   c             C   s$   | dkr|S t ||  | d @ jƒ ƒS )Nr   r%   )ÚminÚ
bit_length)ZnumberÚbitsr   r   r	   Ú_count_righthand_zero_bitsº   s    r2   c             c   sæ   t | tƒot |tƒstdƒ‚| j|jkr8td| |f ƒ‚| |krHtdƒ‚| jdkrXt}n| jdkrht}ntdƒ‚| j}| j}|j}x^||kràt	t
||ƒ|| d jƒ d ƒ}|||| fƒ}|V  |d|> 7 }|d |jkr„P q„W d S )Nz1first and last must be IP addresses, not networksz%%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_prefixlenr(   r/   r2   r0   Ú	_ALL_ONES)r+   r,   r-   Zip_bitsZ	first_intZlast_intZnbitsÚnetr   r   r	   Úsummarize_address_rangeÊ   s0    





r;   c             c   s˜   t | ƒ}i }xL|rX|jƒ }|jƒ }|j|ƒ}|d kr>|||< q||kr||= |j|ƒ qW d }x4t|jƒ ƒD ]$}|d k	r†|j|jkr†ql|V  |}qlW d S )N)ÚlistÚpopÚsupernetÚgetÚappendÚsortedÚvaluesÚbroadcast_address)r)   Zto_mergeÚsubnetsr:   r>   Zexistingr,   r   r   r	   Ú_collapse_addresses_internal  s$    

rE   c             C   s8  g }g }g }xä| D ]Ü}t |tƒrT|rH|d j|jkrHtd||d f ƒ‚|j|ƒ q|j|jkr¼|rˆ|d j|jkrˆtd||d f ƒ‚y|j|jƒ W qî tk
r¸   |j|j	ƒ Y qîX q|rä|d j|jkrätd||d f ƒ‚|j|ƒ qW t
t|ƒƒ}|�r,x&t|ƒD ]\}}|jt||ƒƒ �qW t|| ƒS )	Nr%   z%%s and %s are not of the same versionéÿÿÿÿrF   rF   rF   rF   rF   )r4   r5   Ú_versionr6   r@   Ú
_prefixlenr8   r-   ÚAttributeErrorÚnetwork_addressrA   Úsetr.   Úextendr;   rE   )r)   ZaddrsZipsZnetsr-   r+   r,   r   r   r	   Úcollapse_addresses2  s4    

rM   c             C   s(   t | tƒr| jƒ S t | tƒr$| jƒ S tS )N)r4   Ú_BaseNetworkÚ_get_networks_keyr5   Ú_get_address_keyÚNotImplemented)Úobjr   r   r	   Úget_mixed_type_keyh  s
    

rS   c               @   s”   e Zd Zf 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dd„ ZdS )Ú_IPAddressBasec             C   s   | j ƒ S )N)Ú_explode_shorthand_ip_string)Úselfr   r   r	   Úexploded‡  s    z_IPAddressBase.explodedc             C   s   t | ƒS )N)r    )rV   r   r   r	   Ú
compressedŒ  s    z_IPAddressBase.compressedc             C   s   | j ƒ S )N)Ú_reverse_pointer)rV   r   r   r	   Úreverse_pointer‘  s    	z_IPAddressBase.reverse_pointerc             C   s   dt | ƒf }t|ƒ‚d S )Nz%200s has no version specified)ÚtypeÚNotImplementedError)rV   Úmsgr   r   r	   r7   œ  s    z_IPAddressBase.versionc             C   sF   |dk rd}t ||| jf ƒ‚|| jkrBd}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   rG   r9   r8   )rV   r   r]   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   rG   )rV   r   Zexpected_lenZaddress_lenr]   r   r   r	   Ú_check_packed_addressª  s
    z$_IPAddressBase._check_packed_addressc             C   s   | j | j |? A S )N)r9   )ÚclsÚ	prefixlenr   r   r	   Ú_ip_int_from_prefix±  s    z"_IPAddressBase._ip_int_from_prefixc       	      C   s\   t || jƒ}| j| }||? }d|> d }||krX| jd }|j|dƒ}d}t|| ƒ‚|S )Nr%   é   r   z&Netmask pattern %r mixes zeroes & ones)r2   r8   r   r   )	r`   Úip_intZtrailing_zeroesra   Zleading_onesZall_onesZbyteslenZdetailsr]   r   r   r	   Ú_prefix_from_ip_int¾  s    

z"_IPAddressBase._prefix_from_ip_intc             C   s   d| }t |ƒd ‚d S )Nz%r is not a valid netmask)r
   )r`   Znetmask_strr]   r   r   r	   Ú_report_invalid_netmask×  s    z&_IPAddressBase._report_invalid_netmaskc             C   sj   t jj|ƒs| j|ƒ yt|ƒ}W n tk
r@   | j|ƒ Y nX d|  koV| jkn  sf| j|ƒ |S )Nr   )Ú_BaseV4Ú_DECIMAL_DIGITSÚ
issupersetrf   Úintr   r8   )r`   Zprefixlen_strra   r   r   r	   Ú_prefix_from_prefix_stringÜ  s    

z)_IPAddressBase._prefix_from_prefix_stringc             C   s†   y| j |ƒ}W n tk
r,   | j|ƒ Y nX y
| j|ƒS  tk
rL   Y nX || jN }y
| j|ƒS  tk
r€   | j|ƒ Y nX d S )N)Ú_ip_int_from_stringr   rf   re   r   r9   )r`   Úip_strrd   r   r   r	   Ú_prefix_from_ip_stringõ  s    


z%_IPAddressBase._prefix_from_ip_stringc             C   s   | j t| ƒffS )N)Ú	__class__r    )rV   r   r   r	   Ú
__reduce__  s    z_IPAddressBase.__reduce__N)r   r   r   Ú	__slots__ÚpropertyrW   rX   rZ   r7   r^   r_   Úclassmethodrb   re   rf   rk   rn   rp   r   r   r   r	   rT   �  s   	"rT   c               @   s`   e Zd Zf 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dS )r5   c             C   s   | j S )N)r(   )rV   r   r   r	   Ú__int__&  s    z_BaseAddress.__int__c             C   s2   y| j |j ko| j|jkS  tk
r,   tS X d S )N)r(   rG   rI   rQ   )rV   Úotherr   r   r	   Ú__eq__)  s
    z_BaseAddress.__eq__c             C   sF   t |tƒstS | j|jkr*td| |f ƒ‚| j|jkrB| j|jk S dS )Nz%%s and %s are not of the same versionF)r4   r5   rQ   rG   r6   r(   )rV   ru   r   r   r	   Ú__lt__0  s    
z_BaseAddress.__lt__c             C   s    t |tƒstS | jt| ƒ| ƒS )N)r4   rj   rQ   ro   )rV   ru   r   r   r	   Ú__add__<  s    
z_BaseAddress.__add__c             C   s    t |tƒstS | jt| ƒ| ƒS )N)r4   rj   rQ   ro   )rV   ru   r   r   r	   Ú__sub__A  s    
z_BaseAddress.__sub__c             C   s   d| j jt| ƒf S )Nz%s(%r))ro   r   r    )rV   r   r   r	   Ú__repr__F  s    z_BaseAddress.__repr__c             C   s   t | j| jƒƒS )N)r    Ú_string_from_ip_intr(   )rV   r   r   r	   Ú__str__I  s    z_BaseAddress.__str__c             C   s   t tt| jƒƒƒS )N)ÚhashÚhexrj   r(   )rV   r   r   r	   Ú__hash__L  s    z_BaseAddress.__hash__c             C   s
   | j | fS )N)rG   )rV   r   r   r	   rP   O  s    z_BaseAddress._get_address_keyc             C   s   | j | jffS )N)ro   r(   )rV   r   r   r	   rp   R  s    z_BaseAddress.__reduce__N)r   r   r   rq   rt   rv   rw   rx   ry   rz   r|   r   rP   rp   r   r   r   r	   r5     s   	r5   c               @   sD  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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d#d$„ ƒZed%d&„ ƒZd'd(„ Zd)d*„ Zd+d,„ ZdAd/d0„ZdBd1d2„Zed3d4„ ƒZed5d6„ ƒZed7d8„ ƒZed9d:„ ƒZed;d<„ ƒZ ed=d>„ ƒZ!ed?d@„ ƒZ"d.S )CrN   c             C   s
   i | _ d S )N)Ú_cache)rV   r   r   r   r	   Ú__init___  s    z_BaseNetwork.__init__c             C   s   d| j jt| ƒf S )Nz%s(%r))ro   r   r    )rV   r   r   r	   rz   b  s    z_BaseNetwork.__repr__c             C   s   d| j | jf S )Nz%s/%d)rJ   ra   )rV   r   r   r	   r|   e  s    z_BaseNetwork.__str__c             c   s<   t | jƒ}t | jƒ}x"t|d |ƒD ]}| j|ƒV  q$W d S )Nr%   )rj   rJ   rC   ÚrangeÚ_address_class)rV   ÚnetworkÚ	broadcastÚxr   r   r	   Úhostsh  s    

z_BaseNetwork.hostsc             c   s<   t | jƒ}t | jƒ}x"t||d ƒD ]}| j|ƒV  q$W d S )Nr%   )rj   rJ   rC   r‚   rƒ   )rV   r„   r…   r†   r   r   r	   Ú__iter__t  s    

z_BaseNetwork.__iter__c             C   sl   t | jƒ}t | jƒ}|dkr>|| |kr0tdƒ‚| j|| ƒS |d7 }|| |k rZtdƒ‚| j|| ƒS d S )Nr   zaddress out of ranger%   )rj   rJ   rC   Ú
IndexErrorrƒ   )rV   Únr„   r…   r   r   r	   Ú__getitem__z  s    

z_BaseNetwork.__getitem__c             C   s^   t |tƒstS | j|jkr*td| |f ƒ‚| j|jkrB| j|jk S | j|jkrZ| j|jk S dS )Nz%%s and %s are not of the same versionF)r4   rN   rQ   rG   r6   rJ   Únetmask)rV   ru   r   r   r	   rw   ‡  s    
z_BaseNetwork.__lt__c             C   sF   y,| j |j ko,| j|jko,t| jƒt|jƒkS  tk
r@   tS X d S )N)rG   rJ   rj   rŒ   rI   rQ   )rV   ru   r   r   r	   rv   “  s    z_BaseNetwork.__eq__c             C   s   t t| jƒt| jƒA ƒS )N)r}   rj   rJ   rŒ   )rV   r   r   r	   r   ›  s    z_BaseNetwork.__hash__c             C   sL   | j |j krdS t|tƒrdS t| jƒt|jƒ  koBt| jƒkS   S d S )NF)rG   r4   rN   rj   rJ   r(   rC   )rV   ru   r   r   r	   Ú__contains__ž  s    
z_BaseNetwork.__contains__c             C   s(   | j |kp&| j|kp&|j | kp&|j| kS )N)rJ   rC   )rV   ru   r   r   r	   Úoverlaps«  s    


z_BaseNetwork.overlapsc             C   s<   | j jdƒ}|d kr8| jt| jƒt| jƒB ƒ}|| j d< |S )NrC   )r€   r?   rƒ   rj   rJ   Úhostmask)rV   r†   r   r   r	   rC   ²  s    
z_BaseNetwork.broadcast_addressc             C   s8   | j jdƒ}|d kr4| jt| jƒ| jA ƒ}|| j d< |S )Nr�   )r€   r?   rƒ   rj   rŒ   r9   )rV   r†   r   r   r	   r�   »  s
    
z_BaseNetwork.hostmaskc             C   s   d| j | jf S )Nz%s/%d)rJ   rH   )rV   r   r   r	   Úwith_prefixlenÃ  s    z_BaseNetwork.with_prefixlenc             C   s   d| j | jf S )Nz%s/%s)rJ   rŒ   )rV   r   r   r	   Úwith_netmaskÇ  s    z_BaseNetwork.with_netmaskc             C   s   d| j | jf S )Nz%s/%s)rJ   r�   )rV   r   r   r	   Úwith_hostmaskË  s    z_BaseNetwork.with_hostmaskc             C   s   t | jƒt | jƒ d S )Nr%   )rj   rC   rJ   )rV   r   r   r	   Únum_addressesÏ  s    z_BaseNetwork.num_addressesc             C   s   dt | ƒf }t|ƒ‚d S )Nz%%200s has no associated address class)r[   r\   )rV   r]   r   r   r	   rƒ   Ô  s    z_BaseNetwork._address_classc             C   s   | j S )N)rH   )rV   r   r   r	   ra   Ü  s    z_BaseNetwork.prefixlenc             c   sD  | j |j kstd| |f ƒ‚t|tƒs2td| ƒ‚|j| jkoH|j| jksZtd|| f ƒ‚|| krfd S |jd|j|jf ƒ}| j	ƒ \}}x€||ko˜||k�r|j|jkrÈ|j|jkrÈ|V  |j	ƒ \}}qŠ|j|jkrô|j|jkrô|V  |j	ƒ \}}qŠt
d|||f ƒ‚qŠW ||k�r|V  n$||k�r.|V  nt
d|||f ƒ‚d S )Nz%%s and %s are not of the same versionz%s is not a network objectz%s not contained in %sz%s/%sz3Error performing exclusion: s1: %s s2: %s other: %s)rG   r6   r4   rN   rJ   rC   r   ro   ra   rD   ÚAssertionError)rV   ru   Ús1Ús2r   r   r	   Úaddress_excludeà  s<    $



z_BaseNetwork.address_excludec             C   s`   | j |j krtd| |f ƒ‚| j|jk r,dS | j|jkr<dS | j|jk rLdS | j|jkr\dS dS )Nz"%s and %s are not of the same typer%   r   rF   rF   )rG   r6   rJ   rŒ   )rV   ru   r   r   r	   Úcompare_networks.  s    !z_BaseNetwork.compare_networksc             C   s   | j | j| jfS )N)rG   rJ   rŒ   )rV   r   r   r	   rO   ^  s    z_BaseNetwork._get_networks_keyr%   Nc       	      c   sÖ   | j | jkr| V  d S |d k	rJ|| j k r0tdƒ‚|dkr@tdƒ‚|| j  }|dk rZtdƒ‚| j | }|| jkr~td|| f ƒ‚t| jƒ}t| jƒd }t| jƒd |? }x(t|||ƒD ]}| j||fƒ}|V  q¶W d S )Nznew prefix must be longerr%   z(cannot set prefixlen_diff and new_prefixr   zprefix length diff must be > 0z0prefix length diff %d is invalid for netblock %s)	rH   r8   r   rj   rJ   rC   r�   r‚   ro   )	rV   Úprefixlen_diffÚ
new_prefixÚnew_prefixlenÚstartÚendÚstepZnew_addrZcurrentr   r   r	   rD   h  s,    




z_BaseNetwork.subnetsc             C   sˆ   | j dkr| S |d k	rB|| j kr(tdƒ‚|dkr8tdƒ‚| j | }| j| }|dk rftd| j|f ƒ‚| jt| jƒt| jƒ|> @ |fƒS )Nr   znew prefix must be shorterr%   z(cannot set prefixlen_diff and new_prefixz;current prefixlen is %d, cannot have a prefixlen_diff of %d)rH   r   ra   ro   rj   rJ   rŒ   )rV   r™   rš   r›   r   r   r	   r>   �  s     



z_BaseNetwork.supernetc             C   s   | j jo| jjS )N)rJ   Úis_multicastrC   )rV   r   r   r	   rŸ   Æ  s    	z_BaseNetwork.is_multicastc             C   s   | j jo| jjS )N)rJ   Úis_reservedrC   )rV   r   r   r	   r    Ò  s    	z_BaseNetwork.is_reservedc             C   s   | j jo| jjS )N)rJ   Úis_link_localrC   )rV   r   r   r	   r¡   Þ  s    z_BaseNetwork.is_link_localc             C   s   | j jo| jjS )N)rJ   Ú
is_privaterC   )rV   r   r   r	   r¢   é  s    	z_BaseNetwork.is_privatec             C   s   | j  S )N)r¢   )rV   r   r   r	   Ú	is_globalõ  s    	z_BaseNetwork.is_globalc             C   s   | j jo| jjS )N)rJ   Úis_unspecifiedrC   )rV   r   r   r	   r¤      s    	z_BaseNetwork.is_unspecifiedc             C   s   | j jo| jjS )N)rJ   Úis_loopbackrC   )rV   r   r   r	   r¥     s    	z_BaseNetwork.is_loopback)r%   N)r%   N)#r   r   r   r�   rz   r|   r‡   rˆ   r‹   rw   rv   r   r�   rŽ   rr   rC   r�   r�   r‘   r’   r“   rƒ   ra   r—   r˜   rO   rD   r>   rŸ   r    r¡   r¢   r£   r¤   r¥   r   r   r   r	   rN   V  s>   		N0

5
)rN   c            
   @   s²   e Zd Zf ZdZde d ZedƒZeddddd	d
dddh	ƒ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dd„ Zdd„ Zedd„ ƒZed d!„ ƒZd"S )#rg   r   r   r%   Ú
0123456789éÿ   éþ   éü   éø   éð   éà   éÀ   r   r   c             C   s   t | ƒS )N)r    )rV   r   r   r	   rU   0  s    z$_BaseV4._explode_shorthand_ip_stringc             C   sn   || j krdt|tƒr|}n.y| j|ƒ}W n tk
rF   | j|ƒ}Y nX t| j|ƒƒ}||f| j |< | j | S )N)Ú_netmask_cacher4   rj   rk   r
   rn   r   rb   )r`   Úargra   rŒ   r   r   r	   Ú_make_netmask3  s    	

z_BaseV4._make_netmaskc             C   s|   |st dƒ‚|jdƒ}t|ƒdkr.t d| ƒ‚ytjt| j|ƒdƒS  tk
rv } zt d||f ƒd ‚W Y d d }~X nX d S )NzAddress cannot be emptyÚ.r   zExpected 4 octets in %rr   z%s in %r)r   r!   r"   rj   Ú
from_bytesÚmapÚ_parse_octetr   )r`   rm   ZoctetsÚexcr   r   r	   rl   K  s    
z_BaseV4._ip_int_from_stringc             C   sŠ   |st dƒ‚| jj|ƒs(d}t || ƒ‚t|ƒdkrDd}t || ƒ‚t|dƒ}|dkrr|d dkrrd	}t || ƒ‚|d
kr†t d| ƒ‚|S )NzEmpty octet not permittedz#Only decimal digits permitted in %ré   z$At most 3 characters permitted in %ré
   é   r   Ú0z3Ambiguous (octal/decimal) value in %r not permittedr§   zOctet %d (> 255) not permitted)r   rh   ri   r"   rj   )r`   Z	octet_strr]   Z	octet_intr   r   r	   r´   e  s    
z_BaseV4._parse_octetc             C   s   dj tt|jddƒƒƒS )Nr±   r   r   )Újoinr³   r    r   )r`   rd   r   r   r	   r{   Š  s    z_BaseV4._string_from_ip_intc             C   sÂ   |j dƒ}t|ƒdkr†y$x|D ]}t|ƒ| jkrdS qW W n tk
rN   dS X x0t|ƒD ]$\}}|dkrZ|||d  krZdS qZW dS yt|ƒ}W n tk
r¦   dS X d|  ko¼| jkS   S )Nr±   r   Fr   r%   T)r!   r"   rj   Ú_valid_mask_octetsr   Ú	enumerater8   )rV   rŒ   Úmaskr†   ÚidxÚyr   r   r	   Ú_is_valid_netmask—  s"    

z_BaseV4._is_valid_netmaskc                sh   |j dƒ}y‡ fdd„tt|ƒD ƒ}W n tk
r:   dS X t|ƒt|ƒkrPdS |d |d k rddS dS )	Nr±   c                s   g | ]}|ˆ j kr|‘qS r   )r»   )Ú.0r†   )rV   r   r	   ú
<listcomp>Â  s    z(_BaseV4._is_hostmask.<locals>.<listcomp>Fr   r%   TrF   )r!   r³   rj   r   r"   )rV   rm   r1   Úpartsr   )rV   r	   Ú_is_hostmask¶  s    

z_BaseV4._is_hostmaskc             C   s&   t | ƒjdƒd d d… }dj|ƒd S )Nr±   r%   z.in-addr.arparF   )r    r!   rº   )rV   Zreverse_octetsr   r   r	   rY   Ë  s    z_BaseV4._reverse_pointerc             C   s   | j S )N)r8   )rV   r   r   r	   Úmax_prefixlenÔ  s    z_BaseV4.max_prefixlenc             C   s   | j S )N)rG   )rV   r   r   r	   r7   Ø  s    z_BaseV4.versionN)r   r   r   rq   rG   Ú
IPV4LENGTHr9   Ú	frozensetrh   r»   r8   r®   rU   rs   r°   rl   r´   r{   rÀ   rÄ   rY   rr   rÅ   r7   r   r   r   r	   rg     s"   	%	rg   c               @   sˆ   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZeej	ƒ d	d
„ ƒƒZ
eej	ƒ dd„ ƒƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdS )r   r(   Ú__weakref__c             C   sr   t |tƒr| j|ƒ || _d S t |tƒrF| j|dƒ tj|dƒ| _d S t|ƒ}d|krbtd| ƒ‚| j	|ƒ| _d S )Nr   r   r   zUnexpected '/' in %r)
r4   rj   r^   r(   Úbytesr_   r²   r    r   rl   )rV   r   Úaddr_strr   r   r	   r�   ã  s    


zIPv4Address.__init__c             C   s
   t | jƒS )N)r   r(   )rV   r   r   r	   Úpacked  s    zIPv4Address.packedc             C   s   | | j jkS )N)Ú
_constantsÚ_reserved_network)rV   r   r   r	   r      s    	zIPv4Address.is_reservedc                s4   t ‡ fdd„ˆ jjD ƒƒo2t‡ fdd„ˆ jjD ƒƒS )Nc             3   s   | ]}ˆ |kV  qd S )Nr   )rÁ   r:   )rV   r   r	   ú	<genexpr>(  s    z)IPv4Address.is_private.<locals>.<genexpr>c             3   s   | ]}ˆ |kV  qd S )Nr   )rÁ   r:   )rV   r   r	   rÎ   )  s    )ÚanyrÌ   Ú_private_networksÚallÚ_private_networks_exceptions)rV   r   )rV   r	   r¢     s    zIPv4Address.is_privatec             C   s   | | j jko| j S )N)rÌ   Ú_public_networkr¢   )rV   r   r   r	   r£   ,  s    zIPv4Address.is_globalc             C   s   | | j jkS )N)rÌ   Ú_multicast_network)rV   r   r   r	   rŸ   >  s    	zIPv4Address.is_multicastc             C   s   | | j jkS )N)rÌ   Ú_unspecified_address)rV   r   r   r	   r¤   I  s    	zIPv4Address.is_unspecifiedc             C   s   | | j jkS )N)rÌ   Ú_loopback_network)rV   r   r   r	   r¥   T  s    zIPv4Address.is_loopbackc             C   s   | | j jkS )N)rÌ   Ú_linklocal_network)rV   r   r   r	   r¡   ^  s    zIPv4Address.is_link_localN)r(   rÈ   )r   r   r   rq   r�   rr   rË   r    Ú	functoolsÚ	lru_cacher¢   r£   rŸ   r¤   r¥   r¡   r   r   r   r	   r   Ý  s   #
r   c               @   sj   e Zd Z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   sÞ   t |ttfƒr2tj| |ƒ t| jƒ| _| j| _	d S t |t
ƒr–tj| |d ƒ t|ƒdkrht|d ƒ| _	n| j| _	t|dd�| _| jj| _| jj| _d S t|ƒ}tj| |d ƒ t|dd�| _| jj	| _	| jj| _| jj| _d S )Nr   r%   F)r   )r4   rÉ   rj   r   r�   r   r(   r„   r8   rH   Útupler"   rŒ   r�   r$   )rV   r   r#   r   r   r	   r�   k  s(    




zIPv4Interface.__init__c             C   s   d| j | jƒ| jjf S )Nz%s/%d)r{   r(   r„   ra   )rV   r   r   r	   r|   ‡  s    zIPv4Interface.__str__c             C   sD   t j| |ƒ}| s|tkr|S y| j|jkS  tk
r>   dS X d S )NF)r   rv   rQ   r„   rI   )rV   ru   Úaddress_equalr   r   r	   rv   ‹  s    zIPv4Interface.__eq__c             C   sN   t j| |ƒ}|tkrtS y| j|jk p4| j|jko4|S  tk
rH   dS X d S )NF)r   rw   rQ   r„   rI   )rV   ru   Úaddress_lessr   r   r	   rw   —  s    zIPv4Interface.__lt__c             C   s   t | j| jt| jjƒfƒS )N)r}   r(   rH   rj   r„   rJ   )rV   r   r   r	   r   £  s    zIPv4Interface.__hash__c             C   s
   t | jƒS )N)r   r(   )rV   r   r   r	   r-   ¨  s    zIPv4Interface.ipc             C   s   d| j | jƒ| jf S )Nz%s/%s)r{   r(   rH   )rV   r   r   r	   r�   ¬  s    zIPv4Interface.with_prefixlenc             C   s   d| j | jƒ| jf S )Nz%s/%s)r{   r(   rŒ   )rV   r   r   r	   r‘   ±  s    zIPv4Interface.with_netmaskc             C   s   d| j | jƒ| jf S )Nz%s/%s)r{   r(   r�   )rV   r   r   r	   r’   ¶  s    zIPv4Interface.with_hostmaskN)r   r   r   r�   r|   rv   rw   r   rT   rp   rr   r-   r�   r‘   r’   r   r   r   r	   r   i  s   r   c               @   s.   e Zd ZeZddd„Zeejƒ dd„ ƒƒZ	dS )r   Tc             C   sþ   t j| |ƒ t|ttfƒr&|}| j}n^t|tƒrT|d }t|ƒdkrL|d n| j}n0t|ƒ}| j	|d ƒ}t|ƒdkr~|d n| j}t
|ƒ| _| j|ƒ\| _| _t| jƒ}|t| jƒ@ |krâ|rÎtd|  ƒ‚nt
|t| jƒ@ ƒ| _| j| jd krú| j| _d S )Nr   r%   r   z%s has host bits set)rN   r�   r4   rj   rÉ   r8   rÚ   r"   r$   rl   r   rJ   r°   rŒ   rH   r   rˆ   r‡   )rV   r   r   r#   r½   ÚargsrË   r   r   r	   r�   Ë  s(    %


zIPv4Network.__init__c             C   s&   | j tdƒko| jtdƒk o$| j S )Nz100.64.0.0/10)rJ   r   rC   r¢   )rV   r   r   r	   r£     s    
zIPv4Network.is_globalN)T)
r   r   r   r   rƒ   r�   rr   rØ   rÙ   r£   r   r   r   r	   r   ¼  s   
C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ƒ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/4z100.64.0.0/10z	0.0.0.0/8z
10.0.0.0/8z172.16.0.0/12z192.0.0.0/24z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192.0.0.9/32z192.0.0.10/32z0.0.0.0N)r   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f 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dS )Ú_BaseV6r3   r   r%   rc   Z0123456789ABCDEFabcdefc             C   sJ   || j kr@t|tƒr|}n
| j|ƒ}t| j|ƒƒ}||f| j |< | j | S )N)r®   r4   rj   rk   r   rb   )r`   r¯   ra   rŒ   r   r   r	   r°   Z  s    	


z_BaseV6._make_netmaskc             C   sê  |st dƒ‚|jdƒ}d}t|ƒ|k r:d||f }t |ƒ‚d|d kr¶yt|jƒ ƒj}W n4 t k
rŒ } zt d||f ƒd ‚W Y d d }~X nX |jd|d	? d
@  ƒ |jd|d
@  ƒ | jd }t|ƒ|kräd|d |f }t |ƒ‚d }xDtdt|ƒd ƒD ].}	||	 � sü|d k	�r$d| }t |ƒ‚|	}� qüW |d k	�rÐ|}
t|ƒ| d }|d �st|
d8 }
|
�rtd}t || ƒ‚|d �sœ|d8 }|�rœd}t || ƒ‚| j|
|  }|dk �r:d}t || jd |f ƒ‚njt|ƒ| jk�röd}t || j|f ƒ‚|d �sd}t || ƒ‚|d �s*d}t || ƒ‚t|ƒ}
d}d}ytd}x,t|
ƒD ] }	|d	K }|| j	||	 ƒO }�qJW |d	| K }x0t| dƒD ] }	|d	K }|| j	||	 ƒO }�qˆW |S  t
k
�rä } zt d||f ƒd ‚W Y d d }~X nX d S )NzAddress cannot be emptyú:r¶   z At least %d parts expected in %rr±   r%   z%s in %rz%xr   iÿÿ  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 %rrF   rF   rF   )r   r!   r"   r   r=   r(   r@   Ú_HEXTET_COUNTr‚   Ú_parse_hextetr   )r`   rm   rÃ   Z
_min_partsr]   Zipv4_intrµ   Z
_max_partsZ
skip_indexÚiZparts_hiZparts_loZparts_skippedrd   r   r   r	   rl   l  s„    
$









z_BaseV6._ip_int_from_stringc             C   s>   | j j|ƒstd| ƒ‚t|ƒdkr4d}t|| ƒ‚t|dƒS )NzOnly hex digits permitted in %rr   z$At most 4 characters permitted in %rr   )Ú_HEX_DIGITSri   r   r"   rj   )r`   Z
hextet_strr]   r   r   r	   râ   Ô  s    z_BaseV6._parse_hextetc       	      C   s¦   d}d}d}d}xJt |ƒD ]>\}}|dkrP|d7 }|dkr>|}||krX|}|}qd}d}qW |dkr¢|| }|t|ƒkr‚|dg7 }dg|||…< |dkr¢dg| }|S )	Nr%   r   r¹   Ú rF   rF   rF   rF   )r¼   r"   )	r`   ÚhextetsZbest_doublecolon_startZbest_doublecolon_lenZdoublecolon_startZdoublecolon_lenÚindexZhextetZbest_doublecolon_endr   r   r	   Ú_compress_hextetsî  s.    

z_BaseV6._compress_hextetsNc                sZ   |d krt | jƒ}|| jkr$tdƒ‚d| ‰ ‡ fdd„tdddƒD ƒ}| j|ƒ}dj|ƒS )	NzIPv6 address is too largez%032xc                s&   g | ]}d t ˆ ||d … dƒ ‘qS )z%xr   r   )rj   )rÁ   r†   )Úhex_strr   r	   rÂ   3  s    z/_BaseV6._string_from_ip_int.<locals>.<listcomp>r   r   r   rà   )rj   r(   r9   r   r‚   rè   rº   )r`   rd   ræ   r   )ré   r	   r{     s    


z_BaseV6._string_from_ip_intc                sŒ   t | tƒrt| jƒ}nt | tƒr,t| jƒ}nt| ƒ}| j|ƒ}d| ‰ ‡ fdd„tdddƒD ƒ}t | ttfƒr‚ddj	|ƒ| j
f S dj	|ƒS )	Nz%032xc                s   g | ]}ˆ ||d  … ‘qS )r   r   )rÁ   r†   )ré   r   r	   rÂ   K  s    z8_BaseV6._explode_shorthand_ip_string.<locals>.<listcomp>r   r   r   z%s/%drà   )r4   r   r    rJ   r   r-   rl   r‚   rN   rº   rH   )rV   rm   rd   rÃ   r   )ré   r	   rU   8  s    



z$_BaseV6._explode_shorthand_ip_stringc             C   s&   | j d d d… jddƒ}dj|ƒd S )Nr%   rà   rå   r±   z	.ip6.arparF   )rW   Úreplacerº   )rV   Zreverse_charsr   r   r	   rY   P  s    z_BaseV6._reverse_pointerc             C   s   | j S )N)r8   )rV   r   r   r	   rÅ   Y  s    z_BaseV6.max_prefixlenc             C   s   | j S )N)rG   )rV   r   r   r	   r7   ]  s    z_BaseV6.version)N)r   r   r   rq   rG   Ú
IPV6LENGTHr9   rá   rÇ   rä   r8   r®   rs   r°   rl   râ   rè   r{   rU   rY   rr   rÅ   r7   r   r   r   r	   rß   F  s"   	h0	rß   c               @   s°   e Zd Z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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S )r   r(   rÈ   c             C   sr   t |tƒr| j|ƒ || _d S t |tƒrF| j|dƒ tj|dƒ| _d S t|ƒ}d|krbtd| ƒ‚| j	|ƒ| _d S )Nr   r   r   zUnexpected '/' in %r)
r4   rj   r^   r(   rÉ   r_   r²   r    r   rl   )rV   r   rÊ   r   r   r	   r�   h  s    


zIPv6Address.__init__c             C   s
   t | jƒS )N)r   r(   )rV   r   r   r	   rË   Œ  s    zIPv6Address.packedc             C   s   | | j jkS )N)rÌ   rÔ   )rV   r   r   r	   rŸ   ‘  s    	zIPv6Address.is_multicastc                s   t ‡ fdd„ˆ jjD ƒƒS )Nc             3   s   | ]}ˆ |kV  qd S )Nr   )rÁ   r†   )rV   r   r	   rÎ   ¥  s    z*IPv6Address.is_reserved.<locals>.<genexpr>)rÏ   rÌ   Ú_reserved_networks)rV   r   )rV   r	   r    œ  s    	zIPv6Address.is_reservedc             C   s   | | j jkS )N)rÌ   r×   )rV   r   r   r	   r¡   §  s    zIPv6Address.is_link_localc             C   s   | | j jkS )N)rÌ   Ú_sitelocal_network)rV   r   r   r	   Úis_site_local±  s    zIPv6Address.is_site_localc                sH   ˆ j }|d k	r|jS t‡ fdd„ˆ jjD ƒƒoFt‡ fdd„ˆ jjD ƒƒS )Nc             3   s   | ]}ˆ |kV  qd S )Nr   )rÁ   r:   )rV   r   r	   rÎ   Ô  s    z)IPv6Address.is_private.<locals>.<genexpr>c             3   s   | ]}ˆ |kV  qd S )Nr   )rÁ   r:   )rV   r   r	   rÎ   Õ  s    )Úipv4_mappedr¢   rÏ   rÌ   rÐ   rÑ   rÒ   )rV   rï   r   )rV   r	   r¢   ¿  s
    zIPv6Address.is_privatec             C   s   | j  S )N)r¢   )rV   r   r   r	   r£   Ø  s    zIPv6Address.is_globalc             C   s
   | j dkS )Nr   )r(   )rV   r   r   r	   r¤   é  s    	zIPv6Address.is_unspecifiedc             C   s
   | j dkS )Nr%   )r(   )rV   r   r   r	   r¥   ô  s    	zIPv6Address.is_loopbackc             C   s    | j d? dkrd S t| j d@ ƒS )Nr   iÿÿ  l   ÿÿ )r(   r   )rV   r   r   r	   rï   ÿ  s    	zIPv6Address.ipv4_mappedc             C   s4   | j d? dkrd S t| j d? d@ ƒt| j  d@ ƒfS )Né`   i   é@   l   ÿÿ )r(   r   )rV   r   r   r	   Úteredo  s    
zIPv6Address.teredoc             C   s$   | j d? dkrd S t| j d? d@ ƒS )Nép   i   éP   l   ÿÿ )r(   r   )rV   r   r   r	   Ú	sixtofour  s    	zIPv6Address.sixtofourN)r(   rÈ   )r   r   r   rq   r�   rr   rË   rŸ   r    r¡   rî   rØ   rÙ   r¢   r£   r¤   r¥   rï   rò   rõ   r   r   r   r	   r   b  s   $
r   c               @   s‚   e Zd Z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e
dd„ ƒZe
dd„ ƒZdS )r   c             C   sÞ   t |ttfƒr2tj| |ƒ t| jƒ| _| j| _	d S t |t
ƒr–tj| |d ƒ t|ƒdkrht|d ƒ| _	n| j| _	t|dd�| _| jj| _| jj| _d S t|ƒ}tj| |d ƒ t|dd�| _| jj| _| jj	| _	| jj| _d S )Nr   r%   F)r   )r4   rÉ   rj   r   r�   r   r(   r„   r8   rH   rÚ   r"   rŒ   r�   r$   )rV   r   r#   r   r   r	   r�   +  s(    




zIPv6Interface.__init__c             C   s   d| j | jƒ| jjf S )Nz%s/%d)r{   r(   r„   ra   )rV   r   r   r	   r|   C  s    zIPv6Interface.__str__c             C   sD   t j| |ƒ}| s|tkr|S y| j|jkS  tk
r>   dS X d S )NF)r   rv   rQ   r„   rI   )rV   ru   rÛ   r   r   r	   rv   G  s    zIPv6Interface.__eq__c             C   sN   t j| |ƒ}|tkrtS y| j|jk p4| j|jko4|S  tk
rH   dS X d S )NF)r   rw   rQ   r„   rI   )rV   ru   rÜ   r   r   r	   rw   S  s    zIPv6Interface.__lt__c             C   s   t | j| jt| jjƒfƒS )N)r}   r(   rH   rj   r„   rJ   )rV   r   r   r	   r   _  s    zIPv6Interface.__hash__c             C   s
   t | jƒS )N)r   r(   )rV   r   r   r	   r-   d  s    zIPv6Interface.ipc             C   s   d| j | jƒ| jf S )Nz%s/%s)r{   r(   rH   )rV   r   r   r	   r�   h  s    zIPv6Interface.with_prefixlenc             C   s   d| j | jƒ| jf S )Nz%s/%s)r{   r(   rŒ   )rV   r   r   r	   r‘   m  s    zIPv6Interface.with_netmaskc             C   s   d| j | jƒ| jf S )Nz%s/%s)r{   r(   r�   )rV   r   r   r	   r’   r  s    zIPv6Interface.with_hostmaskc             C   s   | j dko| jjS )Nr   )r(   r„   r¤   )rV   r   r   r	   r¤   w  s    zIPv6Interface.is_unspecifiedc             C   s   | j dko| jjS )Nr%   )r(   r„   r¥   )rV   r   r   r	   r¥   {  s    zIPv6Interface.is_loopbackN)r   r   r   r�   r|   rv   rw   r   rT   rp   rr   r-   r�   r‘   r’   r¤   r¥   r   r   r   r	   r   )  s   r   c               @   s.   e Zd ZeZd	dd„Zdd„ Zedd„ ƒZdS )
r   Tc             C   sþ   t j| |ƒ t|ttfƒr&|}| j}n^t|tƒrT|d }t|ƒdkrL|d n| j}n0t|ƒ}| j	|d ƒ}t|ƒdkr~|d n| j}t
|ƒ| _| j|ƒ\| _| _t| jƒ}|t| jƒ@ |krâ|rÎtd|  ƒ‚nt
|t| jƒ@ ƒ| _| j| jd krú| j| _d S )Nr   r%   r   z%s has host bits set)rN   r�   r4   rj   rÉ   r8   rÚ   r"   r$   rl   r   rJ   r°   rŒ   rH   r   rˆ   r‡   )rV   r   r   r#   r½   rÝ   rË   r   r   r	   r�   �  s(     


zIPv6Network.__init__c             c   s@   t | jƒ}t | jƒ}x&t|d |d ƒD ]}| j|ƒV  q(W d S )Nr%   )rj   rJ   rC   r‚   rƒ   )rV   r„   r…   r†   r   r   r	   r‡   Î  s    

zIPv6Network.hostsc             C   s   | j jo| jjS )N)rJ   rî   rC   )rV   r   r   r	   rî   Ú  s    zIPv6Network.is_site_localN)T)	r   r   r   r   rƒ   r�   r‡   rr   rî   r   r   r   r	   r   €  s   
>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ƒ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64:ff9b:1::/48z100::/64z	2001::/23z2001:db8::/32z	2002::/16zfc00::/7z2001:1::1/128z2001:1::2/128z2001:3::/32z2001:4:112::/48z2001:20::/28z2001:30::/28z::/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   r	   rö   ê  s6   


rö   )T)"Ú__version__rØ   rÆ   rë   r   r   r
   r   r   r   r   r   r$   r.   r2   r;   rE   rM   rS   rT   Útotal_orderingr5   rN   rg   r   r   r   rÞ   rÌ   rß   r   r   r   rö   r   r   r   r	   Ú<module>   sV   
#716 :   E E Sa&   HWj-