ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     3
]5                 @   s
  d Z ddljZddlZddlmZmZ ddl	m
Z
mZ ddlmZmZmZmZ ddlmZmZ i i i i dZG dd	 d	ejZG d
d de
ZG dd deZG dd deZG dd de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 e  dS )a  
Routines for accessing data published by IANA (Internet Assigned Numbers
Authority).

More details can be found at the following URLs :-

    - IANA Home Page - http://www.iana.org/
    - IEEE Protocols Information Home Page - http://www.iana.org/protocols/
    N)make_parserhandler)	Publisher
Subscriber)	IPAddress	IPNetworkIPRangecidr_abbrev_to_verbose)_dict_items	_callable)IPv4IPv6IPv6_unicast	multicastc               @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )SaxRecordParserNc             C   s.   d| _ d| _d | _d | _d | _d | _|| _d S )Nr   F)_level
_is_active_record
_tag_level_tag_payload_tag_feeding	_callback)selfcallback r   /usr/lib/python3.6/iana.py__init__3   s    zSaxRecordParser.__init__c             C   s   |  j d7  _ | jdkrL|dkrd| _| j | _i | _d|kr|d | jd< n^| j | jd kr|dkrd|krd|kr| jj|d g }|j|d  qg | _d| _nd| _d S )	N   FrecordTdatexreftypedata)r   r   r   r   
setdefaultappendr   r   )r   nameZattrslr   r   r   startElement<   s     
zSaxRecordParser.startElementc             C   s   | j dkr~|dkrH| j| jkrHd| _ d | _t| jr@| j| j d | _n6| j| jd kr~|dkr~dj| j| j|< d | _d| _|  jd8  _d S )NTr   Fr   r     )	r   r   r   r   r   r   joinr   r   )r   r%   r   r   r   
endElementQ   s    

zSaxRecordParser.endElementc             C   s   | j dkr| jj| d S )NT)r   r   r$   )r   Zcontentr   r   r   
charactersa   s    
zSaxRecordParser.characters)N)__name__
__module____qualname__r   r'   r*   r+   r   r   r   r   r   2   s   
	r   c                   s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
XMLRecordParserzP
    A configurable Parser that understands how to parse XML based records.
    c                s>   t t| j  t | _| jjt| j || _| j	j
| dS )z`
        Constructor.

        fh - a valid, open file handle to XML based record data.
        N)superr/   r   r   	xmlparserZsetContentHandlerr   consume_recordfh__dict__update)r   r3   kwargs)	__class__r   r   r   k   s
    zXMLRecordParser.__init__c             C   s   |S )a  
        This is the callback method invoked for every record. It is usually
        over-ridden by base classes to provide specific record-based logic.

        Any record can be vetoed (not passed to registered Subscriber objects)
        by simply returning None.
        r   )r   recr   r   r   process_recordz   s    zXMLRecordParser.process_recordc             C   s    | j |}|d k	r| j| d S )N)r9   Znotify)r   r8   r   r   r   r   r2      s    
zXMLRecordParser.consume_recordc             C   s   | j j| j dS )z
        Parse and normalises records, notifying registered subscribers with
        record data as it is encountered.
        N)r1   parser3   )r   r   r   r   r:      s    zXMLRecordParser.parse)	r,   r-   r.   __doc__r   r9   r2   r:   __classcell__r   r   )r7   r   r/   f   s
   
r/   c                   s(   e Zd ZdZ fddZdd Z  ZS )
IPv4Parserz
    A XMLRecordParser that understands how to parse and retrieve data records
    from the IANA IPv4 address space file.

    It can be found online here :-

        - http://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xml
    c                s   t t| j| dS )z
        Constructor.

        fh - a valid, open file handle to an IANA IPv4 address space file.

        kwargs - additional parser options.
        N)r0   r=   r   )r   r3   r6   )r7   r   r   r      s    zIPv4Parser.__init__c             C   st   i }x$d	D ]}t |j|dj ||< q
W d|d kr`|d jd\}}dt|t|f |d< |d j |d< |S )
zl
        Callback method invoked for every record.

        See base class method for more details.
        prefixdesignationr   whoisstatusr(   /z%d/%d)r>   r?   r   r@   rA   )strgetstripsplitint
capitalize)r   r8   r   keyZoctetr>   r   r   r   r9      s    
zIPv4Parser.process_record)r,   r-   r.   r;   r   r9   r<   r   r   )r7   r   r=      s   
r=   c                   s(   e Zd ZdZ fddZdd Z  ZS )
IPv6Parserz
    A XMLRecordParser that understands how to parse and retrieve data records
    from the IANA IPv6 address space file.

    It can be found online here :-

        - http://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xml
    c                s   t t| j| dS )z
        Constructor.

        fh - a valid, open file handle to an IANA IPv6 address space file.

        kwargs - additional parser options.
        N)r0   rJ   r   )r   r3   r6   )r7   r   r   r      s    zIPv6Parser.__init__c             C   sF   t |jddj t |jddj t |jddgd j d}|S )zl
        Callback method invoked for every record.

        See base class method for more details.
        r>   r(   descriptionZrfcr   )r>   Z
allocationZ	reference)rC   rD   rE   )r   r8   r   r   r   r   r9      s    zIPv6Parser.process_record)r,   r-   r.   r;   r   r9   r<   r   r   )r7   r   rJ      s   
rJ   c                   s(   e Zd ZdZ fddZdd Z  ZS )IPv6UnicastParsera!  
    A XMLRecordParser that understands how to parse and retrieve data records
    from the IANA IPv6 unicast address assignments file.

    It can be found online here :-

        - http://www.iana.org/assignments/ipv6-unicast-address-assignments/ipv6-unicast-address-assignments.xml
    c                s   t t| j| dS )z
        Constructor.

        fh - a valid, open file handle to an IANA IPv6 address space file.

        kwargs - additional parser options.
        N)r0   rL   r   )r   r3   r6   )r7   r   r   r      s    zIPv6UnicastParser.__init__c             C   sd   t |jddj t |jddj t |jddj t |jddj t |jddj d}|S )zl
        Callback method invoked for every record.

        See base class method for more details.
        rA   r(   rK   r>   r   r@   )rA   rK   r>   r   r@   )rC   rD   rE   )r   r8   r   r   r   r   r9      s    z IPv6UnicastParser.process_record)r,   r-   r.   r;   r   r9   r<   r   r   )r7   r   rL      s   
rL   c                   s0   e Zd ZdZ fddZdd Zdd Z  ZS )MulticastParserz
    A XMLRecordParser that knows how to process the IANA IPv4 multicast address
    allocation file.

    It can be found online here :-

        - http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xml
    c                s   t t| j| dS )z
        Constructor.

        fh - a valid, open file handle to an IANA IPv4 multicast address
             allocation file.

        kwargs - additional parser options.
        N)r0   rM   r   )r   r3   r6   )r7   r   r   r     s    	zMulticastParser.__init__c             C   s   d|kr^|j d\}}|j j d}|j j d}ddjdd |D djdd |D f S |j j d}djdd |D S dS )	zX
        Removes variations from address entries found in this particular file.
        -.z%s-%sc             S   s   g | ]}t t|qS r   )rC   rG   ).0ir   r   r   
<listcomp>  s    z2MulticastParser.normalise_addr.<locals>.<listcomp>c             S   s   g | ]}t t|qS r   )rC   rG   )rP   rQ   r   r   r   rR      s    c             S   s   g | ]}t t|qS r   )rC   rG   )rP   rQ   r   r   r   rR   #  s    N)rF   rE   r)   )r   addrZa1Za2Zo1Zo2r   r   r   normalise_addr  s    zMulticastParser.normalise_addrc             C   s4   d|kr0| j t|d t|jddd}|S dS )zl
        Callback method invoked for every record.

        See base class method for more details.
        rS   rK   r(   )addressZdescrN)rT   rC   rD   )r   r8   r   r   r   r   r9   %  s    zMulticastParser.process_record)r,   r-   r.   r;   r   rT   r9   r<   r   r   )r7   r   rM     s   rM   c               @   s    e Zd ZdZdd Zdd ZdS )DictUpdaterzc
    Concrete Subscriber that inserts records received from a Publisher into a
    dictionary.
    c             C   s   || _ || _|| _dS )z
        Constructor.

        dct - lookup dict or dict like object to insert records into.

        topic - high-level category name of data to be processed.

        unique_key - key name in data dict that uniquely identifies it.
        N)dcttopic
unique_key)r   rW   rX   rY   r   r   r   r   :  s    
zDictUpdater.__init__c             C   s   || j  }| jdkr,tt|}|| j|< n| jdkrNtt|}|| j|< n|| jdkrlt|}|| j|< n^| jdkrd}d|kr|jd\}}t||}|j }t|dkr|d }nt	|}|| j|< dS )	z
        Callback function used by Publisher to notify this Subscriber about
        an update. Stores topic based information into dictionary passed to
        constructor.
        r   r   r   r   NrN   r   r   )
rY   rX   r   r	   rW   rF   r   cidrslenr   )r   r"   Zdata_idcidriprangefirstZlastrZ   r   r   r   r5   H  s(    






zDictUpdater.updateN)r,   r-   r.   r;   r   r5   r   r   r   r   rV   4  s   rV   c              C   s   t jt} ttt j| d}|jttd dd |j	  t
tt j| d}|jttd dd |j	  ttt j| d}|jttd dd |j	  ttt j| d}|jttd	 d	d
 |j	  dS )zd
    Parse and load internal IANA data lookups with the latest information from
    data files.
    zipv4-address-space.xmlr   r>   zipv6-address-space.xmlr   z$ipv6-unicast-address-assignments.xmlr   zmulticast-addresses.xmlr   rU   N)_pathdirname__file__r=   openr)   ZattachrV   	IANA_INFOr:   rJ   rL   rM   )PATHZipv4Zipv6Zipv6uaZmcastr   r   r   	load_infog  s    
re   c             C   s   | dkrt j} xttD ]v}| jdt| d  | j|d  | jdt| d  t| }x.t|D ]"}|| }| jd| | d  qhW qW dS )z7
    Pretty prints IANA information to filehandle.
    NrN   
z%-45r)_sysstdoutsortedrc   writer[   )r3   categoryZiprangesr]   Zdetailsr   r   r   pprint_info  s    rl   c             C   s4   t |dr| |kS t |dr$| |kS td| d S )Nr^   valuez$Unsupported IP range or address: %r!)hasattr	Exception)ZipZip_ranger   r   r   _within_bounds  s
    

rp   c             C   s   i }| j dkrx<ttd D ],\}}t| |r|jdg  |d j| qW | j rxttd D ],\}}t| |rb|jdg  |d j| qbW n| j dkrx<ttd D ],\}}t| |r|jdg  |d j| qW x<ttd D ],\}}t| |r|jdg  |d j| qW |S )z7Returns informational data specific to this IP address.   r   r   Z	Multicast   r   r   )versionr
   rc   rp   r#   r$   Zis_multicast)Zip_addrinfor\   r   r]   r   r   r   query  s*    




ru   )N)!r;   Zos.pathpathr_   sysrg   Zxml.saxr   r   Znetaddr.corer   r   Z
netaddr.ipr   r   r   r	   Znetaddr.compatr
   r   rc   ZContentHandlerr   r/   r=   rJ   rL   rM   rV   re   rl   rp   ru   r   r   r   r   <module>   s,   
4+)$$23
