
    <i                     T    S r SSKrSSKrSSKrSSKJrJrJr  SS jr	 " S S\5      r
g)z
Parsing for `TorDNSEL <https://www.torproject.org/projects/tordnsel.html.en>`_
exit list files.

::

  TorDNSEL - Exit list provided by TorDNSEL
    N)
Descriptor_read_until_keywords_descriptor_componentsc              +      #    [        SU SS9   [        SU 5      nU[        SU 5      -  nU(       a$  [        [        R                  SU5      U40 UD6v   OgMI  7f)z
Iterates over a tordnsel file.

:returns: iterator for :class:`~stem.descriptor.tordnsel.TorDNSEL`
  instances in the file

:raises:
  * **ValueError** if the contents is malformed and validate is **True**
  * **IOError** if the file can't be read
ExitNodeT)skipExitAddress    N)r   TorDNSELbytesjoin)tordnsel_filevalidatekwargscontentss       R/home/james-whalen/.local/lib/python3.13/site-packages/stem/descriptor/tordnsel.py_parse_filer      s\      z=>#M=AH$Z??HUZZX.CFCC 	s   AAc                   6   ^  \ rS rSrSrSrU 4S jrS rSrU =r	$ )r   1   aR  
TorDNSEL descriptor (`exitlist specification
<https://www.torproject.org/tordnsel/exitlist-spec.txt>`_)

:var str fingerprint: **\*** authority's fingerprint
:var datetime published: **\*** time in UTC when this descriptor was made
:var datetime last_status: **\*** time in UTC when the relay was seen in a v2 network status
:var list exit_addresses: **\*** list of (str address, datetime date) tuples consisting of the found IPv4 exit address and the time

**\*** attribute is either required when we're parsed with validation or has
a default value, others are left as **None** if undefined
tordnselc                    > [         [        U ]  U5        [        R                  R
                  R                  U5      n[        X5      nS U l        S U l	        S U l
        / U l        U R                  X25        g )N)superr   __init__stemutil	str_tools_to_unicoder   fingerprint	publishedlast_statusexit_addresses_parse)selfraw_contentsr   entries	__class__s       r   r   TorDNSEL.__init__A   sa    	(D"<099&&22<@L$\<GDDNDDKK"r
   c                    [        UR                  5       5       GH  u  p4US   u  pVnU(       a  U(       a  [        SU-  5      eUS:X  aK  U(       a<  [        R                  R
                  R                  U5      (       d  [        SU-  5      eXPl        M{  US:X  a1   [        R                  R                  R                  U5      U l
        M  US:X  a1   [        R                  R                  R                  U5      U l        M  US	:X  a  U H  u  pVnUR                  S
S5      u  pU(       aQ  [        R                  R                  R                  U5      (       d  [        SU-  5      eU(       a  [        SU-  5      e [        R                  R                  R                  U	5      n	U R                  R!                  X45        M     GM  U(       d  GM  [        SU-  5      e   g ! [         a    U(       a  [        SU-  5      e GM  f = f! [         a    U(       a  [        SU-  5      e GM  f = f! [         a    U(       a  [        SU-  5      e GMK  f = f)Nr   zUnexpected block content: %sr   z6Tor relay fingerprints consist of forty hex digits: %s	Publishedz"Published time wasn't parsable: %s
LastStatusz#LastStatus time wasn't parsable: %sr	       z*ExitAddress isn't a valid IPv4 address: %sz*ExitAddress found time wasn't parsable: %szUnrecognized keyword: %s)listitems
ValueErrorr   r   	tor_toolsis_valid_fingerprintr   r   _parse_timestampr   r    split
connectionis_valid_ipv4_addressr!   append)
r#   r%   r   keywordvaluesvalue
block_typeblock_contentaddressdates
             r   r"   TorDNSEL._parseM   s   0)/&e	m7-GHH	J	DII//DDUKKSV[[\
\ k!	K99..??F$. l"	L!YY00AA%H$
 m#06,E}++c1--'99''==gFFKgUVV=MNNU99&&77=D&&7 17 83g=>>Q 1  	KAEIJJ 	K  	LBUJKK 	L   UKeSTT Us7   .G%.H>AH3%H	H	H0/H03II)r!   r   r    r   )
__name__
__module____qualname____firstlineno____doc__TYPE_ANNOTATION_NAMEr   r"   __static_attributes____classcell__)r&   s   @r   r   r   1   s     $
#*? *?r
   r   )F)rC   stem.util.connectionr   stem.util.str_toolsstem.util.tor_toolsstem.descriptorr   r   r   r   r    r
   r   <module>rL      s2       2F?z F?r
   