
    V=^,~                     "   d dl mZmZmZ d dlmZ d dlmZmZ d dl	Z	d dl
Z
d dlmZmZ d dlZddlmZmZmZmZ ddlmZ dd	lmZ  eeD  cg c]  } | j1                  d
       c}       Z eeD  cg c]  } | j1                  d
       c}       Z eeD  cg c]  } | j1                  d
       c}       Ze eddg      z  ZdZej<                  r@ed   dk(  rej?                  d      dk(  sJ  e
j@                  edd  e!d      z   dz         Z"n e
j@                  e      Z"h dZ# e
j@                  d      Z$i Z% G d de&      Z'd Z( G d de&      Z) G d de)      Z* G d de+      Z, G d de&      Z- G d de&      Z.d  Z/yc c} w c c} w c c} w )!    )absolute_importdivisionunicode_literals)	text_type)http_clienturllibN)BytesIOStringIO   )EOFspaceCharactersasciiLettersasciiUppercase)_ReparseException)_utilsascii   >   <u   [---﷐-﷯￾￿🿾🿿𯿾𯿿𿿾𿿿񏿾񏿿񟿾񟿿񯿾񯿿񿿾񿿿򏿾򏿿򟿾򟿿򯿾򯿿򿿾򿿿󏿾󏿿󟿾󟿿󯿾󯿿󿿾󿿿􏿾􏿿]]z"\uD800-\uDFFF">            	 
               	 
       z[	- -/:-@\[-`{-~]c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
BufferedStreamzBuffering for streams that do not have buffering of their own

    The buffer is implemented as a list of chunks on the assumption that
    joining many strings will be slow since it is O(n**2)
    c                 2    || _         g | _        ddg| _        y )Nr   r   )streambufferposition)selfr:   s     7/usr/lib/python3/dist-packages/html5lib/_inputstream.py__init__zBufferedStream.__init__:   s    Q    c                     d}| j                   d | j                  d    D ]  }|t        |      z  } || j                  d   z  }|S Nr   r   )r;   r<   len)r=   poschunks      r>   tellzBufferedStream.tell?   sQ    [[!2$--"23 	E3u:C	t}}Q
r@   c                     || j                         k  sJ |}d}t        | j                  |         |k  r<|t        | j                  |         z  }|dz  }t        | j                  |         |k  r<||g| _        y rB   )_bufferedBytesrC   r;   r<   )r=   rD   offsetis       r>   seekzBufferedStream.seekF   s|    d))++++$++a.!F*c$++a.))FFA $++a.!F* Fr@   c                    | j                   s| j                  |      S | j                  d   t        | j                         k(  r9| j                  d   t        | j                   d         k(  r| j                  |      S | j	                  |      S )Nr   r   r   )r;   _readStreamr<   rC   _readFromBufferr=   bytess     r>   readzBufferedStream.readO   st    {{##E**mmA#dkk"22mmA#dkk"o"66##E**''..r@   c                 d    t        | j                  D cg c]  }t        |       c}      S c c}w N)sumr;   rC   )r=   items     r>   rH   zBufferedStream._bufferedBytesX   s#    $++6$CI6776s   -c                     | j                   j                  |      }| j                  j                  |       | j                  dxx   dz  cc<   t        |      | j                  d<   |S rB   )r:   rQ   r;   appendr<   rC   )r=   rP   datas      r>   rM   zBufferedStream._readStream[   sS    {{&4 aAt9ar@   c                    |}g }| j                   d   }| j                   d   }|t        | j                        k  r|dk7  r|dkD  sJ | j                  |   }|t        |      |z
  k  r|}|||z   g| _         n%t        |      |z
  }|t        |      g| _         |dz  }|j                  ||||z           ||z  }d}|t        | j                        k  r|dk7  r|r |j                  | j	                  |             dj                  |      S )Nr   r   r@   )r<   rC   r;   rW   rM   join)r=   rP   remainingBytesrvbufferIndexbufferOffsetbufferedDatabytesToReads           r>   rN   zBufferedStream._readFromBufferb   s   mmA&}}Q'C,,11D!A%%%;;{3L\!2\!AA,!,l[.H I!,/,>!,c,.? @q IIl<{0JKLk)NL C,,11D  IId&&~67xx|r@   N)__name__
__module____qualname____doc__r?   rF   rK   rQ   rH   rM   rN    r@   r>   r8   r8   3   s*     
$/8r@   r8   c                    t        | t        j                        sHt        | t        j                  j
                        r't        | j                  t        j                        rd}n<t        | d      r t        | j                  d      t              }nt        | t              }|r=|D cg c]  }|j                  d      s| }}|rt        d|z        t        | fi |S t        | fi |S c c}w )NFrQ   r   	_encodingz3Cannot set an encoding with a unicode input, set %r)
isinstancer   HTTPResponser   responseaddbasefphasattrrQ   r   endswith	TypeErrorHTMLUnicodeInputStreamHTMLBinaryInputStream)sourcekwargs	isUnicodex	encodingss        r>   HTMLInputStreamrw   }   s     	6;334	FFOO33	4	FII{77	8			 v{{1~y9	vy1	 &B1!**[*AQB	BQT]]^^%f777$V6v66 Cs   (C-?C-c                   Z    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
dd
Zd Zd ZddZd Zy	)rp   Provides a unicode stream of characters to the HTMLTokenizer.

    This class takes care of character encoding and removing or replacing
    incorrect byte-sequences and also provides column and line tracking.

    i (  c                    t         j                  sd| _        n1t        d      dk(  r| j                  | _        n| j
                  | _        dg| _        t        d      df| _        | j                  |      | _
        | j                          y)  Initialises the HTMLInputStream.

        HTMLInputStream(source, [encoding]) -> Normalized stream from source
        for use by html5lib.

        source can be either a file-object, local filename or a string.

        The optional encoding parameter must be a string that indicates
        the encoding.  If specified, that encoding will be used,
        regardless of any BOM or later declaration (such as in a meta
        element)

        Nu   􏿿r   r   utf-8certain)r   supports_lone_surrogatesreportCharacterErrorsrC   characterErrorsUCS4characterErrorsUCS2newLineslookupEncodingcharEncoding
openStream
dataStreamreset)r=   rr   s     r>   r?   zHTMLUnicodeInputStream.__init__   sv     .. *.D&!#)-)A)AD&)-)A)AD& +G4i@//&1

r@   c                 f    d| _         d| _        d| _        g | _        d| _        d| _        d | _        y )N r   )rE   	chunkSizechunkOffseterrorsprevNumLinesprevNumCols_bufferedCharacterr=   s    r>   r   zHTMLUnicodeInputStream.reset   s;    
  #'r@   c                 <    t        |d      r|}|S t        |      }|S zvProduces a file object from source.

        source can be either a file object, local filename or a string.

        rQ   )rm   r
   r=   rr   r:   s      r>   r   z!HTMLUnicodeInputStream.openStream   s+     66"F  f%Fr@   c                     | j                   }|j                  dd|      }| j                  |z   }|j                  dd|      }|dk(  r| j                  |z   }||fS ||dz   z
  }||fS )N
r   r   r   )rE   countr   rfindr   )r=   rI   rE   nLinespositionLinelastLinePospositionColumns          r>   	_positionz HTMLUnicodeInputStream._position   s    

T1f-((61kk$62"!--6N n-- ${Q7Nn--r@   c                 L    | j                  | j                        \  }}|dz   |fS )z:Returns (line, col) of the current position in the stream.r   )r   r   )r=   linecols      r>   r<   zHTMLUnicodeInputStream.position   s(    NN4#3#34	cq#r@   c                     | j                   | j                  k\  r| j                         st        S | j                   }| j                  |   }|dz   | _         |S )zo Read one character from the stream or queue if available. Return
            EOF when EOF is reached.
        r   )r   r   	readChunkr   rE   )r=   r   chars      r>   r   zHTMLUnicodeInputStream.char   sO    
 t~~->>#
&&zz+&&?r@   Nc                 H   || j                   }| j                  | j                        \  | _        | _        d| _        d| _        d| _        | j                  j                  |      }| j                  r| j                  |z   }d | _	        n|syt        |      dkD  r0t        |d         }|dk(  sd|cxk  rdk  rn n|d   | _	        |d d }| j                  r| j                  |       |j                  d	d
      }|j                  dd
      }|| _        t        |      | _        y)Nr   r   Fr   r         i  z
r   T)_defaultChunkSizer   r   r   r   rE   r   r   rQ   r   rC   ordr   replace)r=   r   rX   lastvs       r>   r   z HTMLUnicodeInputStream.readChunk   s   ..I.2nnT^^.L+4+
##I. ""**T1D&*D#t9q=RME}% 96 9*.r('CRy%%&&t, ||FD)||D$'
Tr@   c                     t        t        t        j                  |                  D ]  }| j                  j                  d        y )Ninvalid-codepoint)rangerC   invalid_unicode_refindallr   rW   )r=   rX   _s      r>   r   z*HTMLUnicodeInputStream.characterErrorsUCS4  s:    s-55d;<= 	4AKK23	4r@   c                    d}t         j                  |      D ]  }|rt        |j                               }|j	                         }t        j                  |||dz          rAt        j                  |||dz          }|t        v r| j                  j                  d       d}|dk\  r2|dk  r-|t        |      dz
  k(  r| j                  j                  d       d}| j                  j                  d        y )NF   r   Tr   i  r   )r   finditerr   groupstartr   isSurrogatePairsurrogatePairToCodepointnon_bmp_invalid_codepointsr   rW   rC   )r=   rX   skipmatch	codepointrD   char_vals          r>   r   z*HTMLUnicodeInputStream.characterErrorsUCS2#  s     '006 	8EEKKM*I++-C%%d3sQw&78!::4C!G;LM99KK&&':;v%)v*=TQ&""#67""#67#	8r@   c           
         	 t         ||f   }g }	 |j                  | j                  | j                        }|| j                  | j                  k7  rPn|j                         }|| j                  k7  r0|j                  | j                  | j                  |        || _        n:|j                  | j                  | j                  d        | j                         sndj                  |      }	|	S # t        $ rw 	 |D ]  }t        |      dk  rJ  dj                  |D cg c]  }dt        |      z   nc c}w c}      }|sd|z  }t	        j
                  d|z        x}t         ||f<   Y `w xY w)z Returns a string of characters from the stream up to but not
        including any character in 'characters' or EOF. 'characters' must be
        a container that supports the 'in' method and iteration over its
        characters.
           r   z\x%02xz^%sz[%s]+N)charsUntilRegExKeyErrorr   rZ   recompiler   rE   r   r   endrW   r   )
r=   
charactersoppositecharscregexr\   mr   rs
             r>   
charsUntilz!HTMLUnicodeInputStream.charsUntil:  sg   		Z#Z$:;E DJJ(8(89Ay ##t~~5eeg $..(IIdjj)9)9#>?'*D$ IIdjj!1!1!234>>#+ . GGBKG  	Z# )Aq6C<(<)GGDAYQ/DDEE>@jjSX>YYEOZ$:;	Zs#   C. .E.E.D4
37E.-E.c                     |t         urm| j                  dk(  r*|| j                  z   | _        | xj                  dz  c_        y | xj                  dz  c_        | j                  | j                     |k(  sJ y y rB   )r   r   rE   r   )r=   r   s     r>   ungetzHTMLUnicodeInputStream.ungeti  sl     s?1$ "DJJ.
!#  A% zz$"2"23t;;; r@   rS   )F)ra   rb   rc   rd   r   r?   r   r   r   r<   r   r   r   r   r   r   re   r@   r>   rp   rp      sI     @'	.
$L48.-^<r@   rp   c                   D    e Zd ZdZ	 	 	 d
dZd Zd ZddZd Zd Z	d	 Z
y)rq   ry   Nc                 @   | j                  |      | _        t        j                  | | j                         d| _        d| _        || _        || _        || _        || _	        || _
        | j                  |      | _        | j                  d   J | j                          y)r{   i   d   r   N)r   	rawStreamrp   r?   numBytesMetanumBytesChardetoverride_encodingtransport_encodingsame_origin_parent_encodinglikely_encodingdefault_encodingdetermineEncodingr   r   )r=   rr   r   r   r   r   r   
useChardets           r>   r?   zHTMLBinaryInputStream.__init__  s    $ 0''dnn=
 !"!2"4+F(. 0 !22:>  #/// 	

r@   c                     | j                   d   j                  j                  | j                  d      | _        t
        j                  |        y )Nr   r   )r   
codec_infostreamreaderr   r   rp   r   r   s    r>   r   zHTMLBinaryInputStream.reset  s:    ++A.99FFt~~W`a$$T*r@   c                     t        |d      r|}nt        |      }	 |j                  |j                                |S # t        $ r t        |      }Y |S w xY wr   )rm   r	   rK   rF   	Exceptionr8   r   s      r>   r   z HTMLBinaryInputStream.openStream  sZ     66"FV_F	,KK&   	,#F+F	,s   = AAc                    | j                         df}|d   |S t        | j                        df}|d   |S t        | j                        df}|d   |S | j	                         df}|d   |S t        | j
                        df}|d    |d   j                  j                  d      s|S t        | j                        df}|d   |S |r	 ddl	m
} g } |       }|j                  si| j                  j                  | j                        }t        |t               sJ |sn/|j#                  |       |j%                  |       |j                  si|j'                          t        |j(                  d         }| j                  j+                  d       ||dfS t        | j.                        df}|d   |S t        d      dfS # t,        $ r Y 6w xY w)Nr}   r   	tentativezutf-16)UniversalDetectorencodingwindows-1252)	detectBOMr   r   r   detectEncodingMetar   name
startswithr   chardet.universaldetectorr   doner   rQ   r   rh   rP   rW   feedcloseresultrK   ImportErrorr   )r=   chardetr   r   buffersdetectorr;   r   s           r>   r   z'HTMLBinaryInputStream.determineEncoding  s     ~~'2?& &d&<&<=yH?& &d&=&=>	I?& ..0+=?& &d&F&FGT?&|A/C/C/N/Nx/X &d&:&:;[H?& 1G ,."--!^^001E1EFF%fe444!NN6*MM&) #--  )(//**EF##A&'#[00 &d&;&;<kI?& n-{::1  s   G 	GGc                 x   | j                   d   dk7  sJ t        |      }|y |j                  dv rt        d      }|J y || j                   d   k(  r| j                   d   df| _         y | j                  j	                  d       |df| _         | j                          t        d| j                   d   d|      )Nr   r}   utf-16beutf-16ler|   r   zEncoding changed from z to )r   r   r   r   rK   r   r   )r=   newEncodings     r>   changeEncodingz$HTMLBinaryInputStream.changeEncoding  s      #y000$[177(1K***D--a00!%!2!21!5y ADNN"!,i 8DJJL#HYHYZ[H\^i$jkkr@   c           
         t         j                  dt         j                  dt         j                  dt         j                  dt         j
                  di}| j                  j                  d      }t        |t              sJ |j                  |dd       }d}|s+|j                  |      }d}|s|j                  |dd	       }d	}|r&| j                  j                  |       t        |      S | j                  j                  d
       y)zAttempts to detect at BOM at the start of the stream. If
        an encoding can be determined from the BOM return the name of the
        encoding otherwise return Noner|   r   r   zutf-32lezutf-32be   N   r   r   )codecsBOM_UTF8BOM_UTF16_LEBOM_UTF16_BEBOM_UTF32_LEBOM_UTF32_BEr   rQ   rh   rP   getrK   r   )r=   bomDictstringr   rK   s        r>   r   zHTMLBinaryInputStream.detectBOM  s    
 OOWV-@-@*V-@-@*
 $$Q'&%((( ;;vbqz*{{6*HD";;vbqz2 NN%!(++NN"r@   c                    | j                   j                  | j                        }t        |t              sJ t        |      }| j                   j                  d       |j                         }||j                  dv rt        d      }|S )z9Report the encoding declared by the meta element
        r   r   r|   )
r   rQ   r   rh   rP   EncodingParserrK   getEncodingr   r   )r=   r;   parserr   s       r>   r   z(HTMLBinaryInputStream.detectEncodingMeta3  sy     $$T%6%67&%((('A%%'HMM5M$M%g.Hr@   )NNNNr   T)T)ra   rb   rc   rd   r?   r   r   r   r   r   r   re   r@   r>   rq   rq   z  s;     KOCG=A(T+&<;|l  Dr@   rq   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Z eee
      Zd
 Z ee      ZefdZd Zd Zd Zy)EncodingByteszString-like object with an associated position and various extra methods
    If the position is ever greater than the string length then an exception is
    raisedc                 n    t        |t              sJ t        j                  | |j                               S rS   )rh   rP   __new__lowerr=   values     r>   r  zEncodingBytes.__new__F  s)    %'''}}T5;;=11r@   c                     d| _         y )Nr   )r   r  s     r>   r?   zEncodingBytes.__init__J  s	    r@   c                     | S rS   re   r   s    r>   __iter__zEncodingBytes.__iter__N  s    r@   c                 |    | j                   dz   x}| _         |t        |       k\  rt        |dk  rt        | ||dz    S )Nr   r   r   rC   StopIterationro   r=   ps     r>   __next__zEncodingBytes.__next__Q  sD    !^^a//DND	>UOAa!e}r@   c                 "    | j                         S rS   )r  r   s    r>   nextzEncodingBytes.nextY  s    }}r@   c                     | j                   }|t        |       k\  rt        |dk  rt        |dz
  x| _         }| ||dz    S rB   r  r  s     r>   previouszEncodingBytes.previous]  sH    NND	>UOU"Aa!e}r@   c                 N    | j                   t        |       k\  rt        || _         y rS   r   rC   r  )r=   r<   s     r>   setPositionzEncodingBytes.setPositionf  s    >>SY&!r@   c                 v    | j                   t        |       k\  rt        | j                   dk\  r| j                   S y )Nr   r  r   s    r>   getPositionzEncodingBytes.getPositionk  s1    >>SY&>>Q>>!r@   c                 :    | | j                   | j                   dz    S Nr   )r<   r   s    r>   getCurrentBytezEncodingBytes.getCurrentByteu  s    DMM$--!"344r@   c                     | j                   }|t        |       k  r)| ||dz    }||vr	|| _        |S |dz  }|t        |       k  r)|| _        y)zSkip past a list of charactersr   Nr<   rC   r   r=   r   r  r   s       r>   r   zEncodingBytes.skipz  sZ    MM#d)mQq1uA~!"FA #d)m r@   c                     | j                   }|t        |       k  r)| ||dz    }||v r	|| _        |S |dz  }|t        |       k  r)|| _        y r"  r%  r&  s       r>   	skipUntilzEncodingBytes.skipUntil  sZ    MM#d)mQq1uAEz!"FA #d)m r@   c                 ~    | j                  || j                        }|r| xj                  t        |      z  c_        |S )zLook for a sequence of bytes at the start of a string. If the bytes
        are found return True and advance the position to the byte after the
        match. Otherwise return False and leave the position alone)r   r<   rC   )r=   rP   r\   s      r>   
matchByteszEncodingBytes.matchBytes  s2     __UDMM2MMSZ'M	r@   c                     	 | j                  || j                        t        |      z   dz
  | _        y# t        $ r t
        w xY w)zLook for the next sequence of bytes matching a given sequence. If
        a match is found advance the position to the last byte of the matchr   T)indexr<   rC   r   
ValueErrorr  rO   s     r>   jumpTozEncodingBytes.jumpTo  sG    	 !ZZt}}=E
JQNDN   	 	 s	   03 AN)ra   rb   rc   rd   r  r?   r  r  r  r  r  r   propertyr<   r#  currentBytespaceCharactersBytesr   r(  r*  r.  re   r@   r>   r	  r	  B  se    2"
 [1H5 >*K- 
	r@   r	  c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)r  z?Mini parser for detecting character encoding from meta elementsc                 2    t        |      | _        d| _        y)z3string - the data to work on for encoding detectionN)r	  rX   r   r=   rX   s     r>   r?   zEncodingParser.__init__  s    !$'	r@   c                    d| j                   vry d| j                  fd| j                  fd| j                  fd| j                  fd| j                  fd| j
                  ff}| j                   D ]^  }d}	 | j                   j                  d       |D ]*  \  }}| j                   j                  |      s"	  |       } n |rS | j                  S  | j                  S # t        $ r Y  | j                  S w xY w# t        $ r d}Y  Fw xY w)	Ns   <metas   <!--s   </s   <!s   <?r   TF)
rX   handleComment
handleMetahandlePossibleEndTaghandleOtherhandlePossibleStartTagr.  r  r*  r   )r=   methodDispatchr   keepParsingkeymethods         r>   r  zEncodingParser.getEncoding  s)   499$ d(()t'D--.D$$%D$$%4../1  	AK		  &  . V99'',&,h	 }}#	" }} !  }} ) &+s$   2C2C4	C10C14DDc                 8    | j                   j                  d      S )zSkip over commentss   -->rX   r.  r   s    r>   r6  zEncodingParser.handleComment  s    yy''r@   c                 ~   | j                   j                  t        vryd}d }	 | j                         }|y|d   dk(  r|d   dk(  }|rv|t|| _        y|d   dk(  r|d   }t        |      }|R|| _        y|d   dk(  rBt        t        |d               }|j                         }|t        |      }||r|| _        y|})	NTFr   s
   http-equivr   s   content-type   charsets   content)	rX   r0  r1  getAttributer   r   ContentAttrParserr	  parse)r=   	hasPragmapendingEncodingattrtentativeEncodingcodeccontentParsers          r>   r7  zEncodingParser.handleMeta  s    99  (<<	$$&D|7m+ $Q? :I _%@(7$!W
*(,Q%*+<=E((-$!W
*$5mDG6L$MM(5(;(;(=%(4 ./@ A ,(05',277 r@   c                 $    | j                  d      S )NF)handlePossibleTagr   s    r>   r:  z%EncodingParser.handlePossibleStartTag  s    %%e,,r@   c                 N    t        | j                         | j                  d      S )NT)r  rX   rM  r   s    r>   r8  z#EncodingParser.handlePossibleEndTag  s    TYY%%d++r@   c                 &   | j                   }|j                  t        vr#|r |j                          | j	                          y|j                  t              }|dk(  r|j                          y| j                         }|| j                         }|y)NTr   )rX   r0  asciiLettersBytesr  r9  r(  spacesAngleBracketsrC  )r=   endTagrX   r   rH  s        r>   rM  z EncodingParser.handlePossibleTag  s    yy#44   "NN./9 MMO  $$&D"((* "r@   c                 8    | j                   j                  d      S )Nr   r@  r   s    r>   r9  zEncodingParser.handleOther  s    yy%%r@   c                    | j                   }|j                  t        t        dg      z        }|t	        |      dk(  sJ |dv ryg }g }	 |dk(  r|rnx|t        v r|j                         }n_|dv rdj                  |      dfS |t        v r |j                  |j                                n|y|j                  |       t        |      }|dk7  r#|j                          dj                  |      dfS t        |       |j                         }|dv rz|}	 t        |      }||k(  r-t        |       dj                  |      dj                  |      fS |t        v r |j                  |j                                n|j                  |       w|d	k(  rdj                  |      dfS |t        v r |j                  |j                                n|y|j                  |       	 t        |      }|t        v r"dj                  |      dj                  |      fS |t        v r |j                  |j                                n|y|j                  |       r)
z_Return a name,value pair for the next attribute in the stream,
        if one is found, or None   /Nr   )r   N   =)rU  r   r@   )   '   "r   )rX   r   r1  	frozensetrC   rZ   asciiUppercaseBytesrW   r  r  r  rQ  )r=   rX   r   attrName	attrValue	quoteChars         r>   rC  zEncodingParser.getAttribute  s9    yyII*Yv->>?yCFaK''	DyX**IIKl"xx)3..))	*"T
A! $ 9MMO88H%s**T
IIKIJ	>J88H-sxx	/BBB--$$QWWY/ $$Q'  $Y88H%s**%%QWWY'YQT
A''xx)388I+>>>))  +  # r@   N)ra   rb   rc   rd   r?   r  r6  r7  r:  r8  rM  r9  rC  re   r@   r>   r  r    s4    I
<("8H-,.&J$r@   r  c                       e Zd Zd Zd Zy)rD  c                 6    t        |t              sJ || _        y rS   )rh   rP   rX   r4  s     r>   r?   zContentAttrParser.__init__a  s    $&&&	r@   c                    	 | j                   j                  d       | j                   xj                  dz  c_        | j                   j                          | j                   j                  dk(  sy | j                   xj                  dz  c_        | j                   j                          | j                   j                  dv r| j                   j                  }| j                   xj                  dz  c_        | j                   j                  }| j                   j                  |      r#| j                   || j                   j                   S y | j                   j                  }	 | j                   j                  t               | j                   || j                   j                   S # t        $ r | j                   |d  cY S w xY w# t        $ r Y y w xY w)NrB  r   rV  )rX  rW  )rX   r.  r<   r   r0  r(  r1  r  )r=   	quoteMarkoldPositions      r>   rE  zContentAttrParser.parsee  sb   	 IIZ(II!#IINN99((D0II!#IINNyy$$4 II11			""a'""ii0099##I.99[1C1CDD #ii003II''(<=99[1C1CDD$ 399[\223  		s>   A-G 0CG G "AF$ $F?<G >F??G 	GGN)ra   rb   rc   r?   rE  re   r@   r>   rD  rD  `  s    r@   rD  c                     t        | t              r	 | j                  d      } | 	 t	        j
                  |       S y# t        $ r Y yw xY w# t        $ r Y yw xY w)z{Return the python codec name corresponding to an encoding or None if the
    string doesn't correspond to a valid encoding.r   N)rh   rP   decodeUnicodeDecodeErrorwebencodingslookupAttributeError)r   s    r>   r   r     sk     (E"	w/H 	&&x00  " 		  		s    < A 	AA	AA)0
__future__r   r   r   sixr   	six.movesr   r   r   r   ior	   r
   rf  	constantsr   r   r   r   r   r   r   rY  encoder1  rP  rZ  rQ  invalid_unicode_no_surrogater~   r   r   evalr   r   ascii_punctuation_rer   objectr8   rw   rp   rq   rP   r	  r  rD  r   )rU   s   0r>   <module>rs     s   B B  )  	    I I (  !?!S4$++g"6!ST Mt{{73MN . Q$W!5 QR *Yd|-DD   j 	""
 (+s27S7Y7YZ]7^bc7ccc#$@"$E$()<$=%>$'%( ) $$@A2  "rzz"mn  GV GT7.c<V c<LE2 EP_E _Dy$V y$x$ $Nm "TM Qs   F0FF