U
    £�©j§‰  ã                   @  sè  U d dl mZ d dlmZ d dlmZ ddlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZm Z m!Z!m"Z"m#Z# eeB eB eB eB Z$de%d< G d	d
„ d
ƒZ&edd�dd
dœdd„ƒZ'dd„ e(dƒD ƒZ)de%d< G dd„ dƒ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*ƒZ0G d$d%„ d%e*ƒZ1G d&d'„ d'e*ƒZ2G d(d)„ d)e*ƒZ3G d*d+„ d+e*ƒZ4edd�d,d,d-d.œd/d0„ƒZ5d7dd3d-d3d4œd5d6„Z6dS )8é    )Úannotations)Ú	lru_cache)Ú	getLoggeré   )ÚCOMMON_CJK_CHARACTERSÚCOMMON_SAFE_ASCII_CHARACTERSÚTRACEÚCompatibleFamillyRangeÚ_ACCENTUATEDÚ_ARABICÚ_ARABIC_ISOLATED_FORMÚ&_BASIC_LATIN_COMPATIBLE_RANGE_FAMILIESÚ_CJKÚ_COMPATIBLE_RANGE_FAMILIESÚ#_COMPATIBLE_WITH_ANY_RANGE_FAMILIESÚ_HANGULÚ_HALFWIDTH_KATAKANAÚ	_HIRAGANAÚ	_KATAKANAÚ_LATINÚ	_LIGATUREÚ_RANGE_FAMILIESÚ_SENTENCE_OPEN_PUNCTUATIONÚ_SUPERSCRIPTÚ_THAI)Ú_character_flagsÚis_emoticonÚis_punctuationÚis_separatorÚ	is_symbolÚremove_accentÚunicode_rangeÚintÚ_GLYPH_MASKc                   @  s  e Zd ZU dZdZded< ded< ded< ded< ded	< ded
< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded < ded!< ded"< dd#d$œd%d&„Zd'S )(ÚCharInfoz>Pre-computed character properties shared across all detectors.)Ú	characterÚ	printableÚalphaÚupperÚlowerÚspaceÚdigitÚis_asciiÚcase_variableÚflagsÚaccentuatedÚlatinÚis_cjkÚis_katakanaÚis_halfwidth_katakanaÚ	is_arabicÚis_ligatureÚis_superscriptÚis_sentence_open_punctuationÚis_glyphÚpunctÚsymÚrangeÚsepÚemoticonÚsafeÚ
common_cjkÚ
unaccentedÚstrr%   Úboolr&   r'   r(   r)   r*   r+   r,   r-   r"   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   ú
str | Noner;   r<   r=   r>   r?   r@   ÚNone©r%   Úreturnc                 C  sæ  || _ t|ƒ}|dk �rfd| _d| _|| _d| _d| _|tk| _d| _	d| _
d| _d| _d| _d| _d| _d| _d|  kr„dkrÎn nFd| _d| _d| _d| _d| _d| _d| _t| _d| _d| _d| _�qÎd|  krädk�r.n nFd| _d| _d| _d| _d| _d| _d| _t| _d| _d| _d| _�qÎd|  k�rFd	k�rŽn nDd| _d| _d| _d| _d| _d| _d| _d
| _d| _d| _d| _nÔ|dk�s´d|  k�r°dk�rün nHd| _d| _d| _d| _d| _|dk| _d| _d
| _d| _d| _d| _nf| ¡ | _d| _d| _d| _d| _d| _d| _d
| _d| _| j�rFt|ƒnd| _| j�r\t|ƒnd| _�nhd| _d| _| ¡ | _|  ¡ | _| !¡ | _| "¡ | _| #¡ | _| $¡ | _| j| jk| _t%|ƒ}| j�rÔd| _n
t&|ƒ| _|| _t'|t(@ ƒ| _t'|t@ ƒ| _t'|t)@ ƒ| _	t'|t*@ ƒ| _
t'|t+@ ƒ| _t'|t,@ ƒ| _t'|t-@ ƒ| _t'|t.@ ƒ| _t'|t/@ ƒ| _t'|t0@ ƒ| _| j�rŒ| j�rŒt1|ƒ| _n|| _| j	�o |t2k| _| j�rÂt|ƒ| _t|ƒ| _nd| _d| _t3|ƒ| _4t5|ƒ| _6dS )zkCompute all properties for *character* (built once per codepoint,
        every branch assigns every slot).é€   TFéA   éZ   éa   éz   é0   é9   r   é    é	   é   N)7r%   Úordr,   r/   r@   r=   r?   r   r>   r1   r2   r3   r4   r5   r6   r7   r8   r'   r(   r)   r*   r+   r&   r-   r   r.   r0   r9   r:   Úisprintabler   r   ÚisalphaÚisupperÚislowerÚisspaceÚisdigitr   r   rB   r
   r   r   r   r   r   r   r   r#   r    r   r!   r;   r   r<   )Úselfr%   Úor.   © rZ   ú9/tmp/pip-unpacked-wheel-bwd693va/charset_normalizer/md.pyÚ__init__k   sÞ    



&










zCharInfo.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__Ú__annotations__r\   rZ   rZ   rZ   r[   r$   ,   s>   
r$   N)ÚmaxsizerA   rE   c                 C  s   t | ƒS )zBBuild (once per codepoint) and cache the CharInfo for *character*.)r$   )r%   rZ   rZ   r[   Ú
_char_infoø   s    rd   c                 C  s   g | ]}t t|ƒƒ‘qS rZ   )r$   Úchr)Ú.0Z
_codepointrZ   rZ   r[   Ú
<listcomp>ÿ   s    rg   rG   zlist[CharInfo]Ú_ASCII_CHAR_INFOc                   @  sF   e Zd ZdZdZddddœdd„Zdd	œd
d„Zedd	œdd„ƒZdS )ÚMessDetectorPluginzy
    Base abstract class used for mess detection plugins.
    All detectors MUST extend and implement given methods.
    rZ   rA   r$   rD   ©r%   ÚinforF   c                 C  s   t ‚dS )z‰
        The main routine to be executed upon character.
        Insert the logic in witch the text would be considered chaotic.
        N©ÚNotImplementedError©rX   r%   rk   rZ   rZ   r[   Ú	feed_info  s    zMessDetectorPlugin.feed_info©rF   c                 C  s   t ‚dS )zB
        Permit to reset the plugin to the initial state.
        Nrl   ©rX   rZ   rZ   r[   Úreset  s    zMessDetectorPlugin.resetÚfloatc                 C  s   t ‚dS )z…
        Compute the chaos ratio based on what your feed() has seen.
        Must NOT be lower than 0.; No restriction gt 0.
        Nrl   rq   rZ   rZ   r[   Úratio  s    zMessDetectorPlugin.ratioN)	r]   r^   r_   r`   ra   ro   rr   Úpropertyrt   rZ   rZ   rZ   r[   ri     s   ri   c                   @  sP   e Zd ZdZddœdd„Zddddœd	d
„Zddœdd„Zeddœdd„ƒZdS )Ú TooManySymbolOrPunctuationPlugin©Ú_punctuation_countÚ_symbol_countÚ_character_countÚ_last_printable_charrD   rp   c                 C  s   d| _ d| _d| _d | _d S ©Nr   rw   rq   rZ   rZ   r[   r\   *  s    z)TooManySymbolOrPunctuationPlugin.__init__rA   r$   rj   c                 C  s^   |  j d7  _ || jkrT|jsT|jr4|  jd7  _n |jsT|jrT|jsT|  jd7  _|| _dS )ú1Optimized feed using pre-computed character info.r   é   N)	rz   r{   r>   r9   rx   r+   r:   r=   ry   rn   rZ   rZ   r[   ro   1  s    z*TooManySymbolOrPunctuationPlugin.feed_infoc                 C  s   d| _ d| _d| _d S r|   )rx   rz   ry   rq   rZ   rZ   r[   rr   =  s    z&TooManySymbolOrPunctuationPlugin.resetrs   c                 C  s0   | j dkrdS | j| j | j  }|dkr,|S dS )Nr   ç        ç333333Ó?)rz   rx   ry   )rX   Zratio_of_punctuationrZ   rZ   r[   rt   B  s    

þz&TooManySymbolOrPunctuationPlugin.ratioN©	r]   r^   r_   ra   r\   ro   rr   ru   rt   rZ   rZ   rZ   r[   rv   "  s   rv   c                   @  sP   e Zd ZdZddœdd„Zddddœd	d
„Zddœdd„Zeddœdd„ƒZdS )ÚTooManyAccentuatedPlugin©rz   Ú_accentuated_countrD   rp   c                 C  s   d| _ d| _d S r|   rƒ   rq   rZ   rZ   r[   r\   Q  s    z!TooManyAccentuatedPlugin.__init__rA   r$   rj   c                 C  s&   |  j d7  _ |jr"|  jd7  _dS ©r}   r   N)rz   r/   r„   rn   rZ   rZ   r[   ro   U  s    z"TooManyAccentuatedPlugin.feed_infoc                 C  s   d| _ d| _d S r|   rƒ   rq   rZ   rZ   r[   rr   \  s    zTooManyAccentuatedPlugin.resetrs   c                 C  s*   | j dk rdS | j| j  }|dkr&|S dS )Né   r   gffffffÖ?rƒ   )rX   Zratio_of_accentuationrZ   rZ   r[   rt   `  s    
zTooManyAccentuatedPlugin.ratioNr�   rZ   rZ   rZ   r[   r‚   N  s   r‚   c                   @  sP   e Zd ZdZddœdd„Zddddœd	d
„Zddœdd„Zeddœdd„ƒZdS )ÚUnprintablePlugin©Ú_unprintable_countrz   Ú_has_escaperD   rp   c                 C  s   d| _ d| _d| _d S ©Nr   Frˆ   rq   rZ   rZ   r[   r\   l  s    zUnprintablePlugin.__init__rA   r$   rj   c                 C  sJ   |dkrd| _ |js8|js8|dkr8|dkr8|  jd7  _|  jd7  _dS )r}   úTúu   ï»¿r   N)rŠ   r&   r*   r‰   rz   rn   rZ   rZ   r[   ro   q  s    ÿþýüzUnprintablePlugin.feed_infoc                 C  s   d| _ d| _d S r‹   )r‰   rŠ   rq   rZ   rZ   r[   rr     s    zUnprintablePlugin.resetrs   c                 C  s(   | j dkrdS | jrdS | jd | j  S )Nr   r   ç      ð?r†   )rz   rŠ   r‰   rq   rZ   rZ   r[   rt   ƒ  s
    
zUnprintablePlugin.ratioNr�   rZ   rZ   rZ   r[   r‡   i  s   r‡   c                   @  sP   e Zd ZdZddœdd„Zddddœd	d
„Zddœdd„Zeddœdd„ƒZdS )ÚSuspiciousDuplicateAccentPlugin©Ú_successive_countrz   Ú_last_latin_characterÚ_last_was_accentuatedrD   rp   c                 C  s   d| _ d| _d | _d| _d S r‹   r�   rq   rZ   rZ   r[   r\   –  s    z(SuspiciousDuplicateAccentPlugin.__init__rA   r$   rj   c                 C  sn   |  j d7  _ | jdk	r\|jr\| jr\|jr@| jjr@|  jd7  _|j| jjkr\|  jd7  _|| _|j| _dS r…   )rz   r’   r/   r“   r(   r‘   r@   rn   rZ   rZ   r[   ro   �  s    ÿþýz)SuspiciousDuplicateAccentPlugin.feed_infoc                 C  s   d| _ d| _d | _d| _d S r‹   r�   rq   rZ   rZ   r[   rr   ¬  s    z%SuspiciousDuplicateAccentPlugin.resetrs   c                 C  s   | j dkrdS | jd | j  S )Nr   r   r~   )rz   r‘   rq   rZ   rZ   r[   rt   ²  s    
z%SuspiciousDuplicateAccentPlugin.ratioNr�   rZ   rZ   rZ   r[   r�   Ž  s   r�   c                   @  sP   e Zd ZdZddœdd„Zddddœd	d
„Zddœdd„Zeddœdd„ƒZdS )ÚSuspiciousRange©Ú"_suspicious_successive_range_countrz   Ú_last_printable_seenÚ_last_printable_rangerD   rp   c                 C  s   d| _ d| _d | _d | _d S r|   r•   rq   rZ   rZ   r[   r\   Â  s    zSuspiciousRange.__init__rA   r$   rj   c                 C  s�   |  j d7  _ |js |js |jr0d| _d| _dS | jdkrL|| _|j| _dS | j}|j}||ksh|dkr€t||ƒr€|  jd7  _|| _|| _dS r…   )	rz   r*   r9   r>   r—   r˜   r;   Ú is_suspiciously_successive_ranger–   )rX   r%   rk   Úunicode_range_aÚunicode_range_brZ   rZ   r[   ro   È  s     

zSuspiciousRange.feed_infoc                 C  s   d| _ d| _d | _d | _d S r|   )rz   r–   r—   r˜   rq   rZ   rZ   r[   rr   á  s    zSuspiciousRange.resetrs   c                 C  s"   | j dkrdS | jd | j  }|S )NrP   r   r~   )rz   r–   )rX   Zratio_of_suspicious_range_usagerZ   rZ   r[   rt   ç  s    
þzSuspiciousRange.ratioNr�   rZ   rZ   rZ   r[   r”   º  s   r”   c                   @  sP   e Zd ZdZddœdd„Zddddœd	d
„Zddœdd„Zeddœdd„ƒZdS )ÚSuperWeirdWordPlugin©Ú_word_countÚ_bad_word_countÚ_foreign_long_countÚ_is_current_word_badÚ_foreign_long_watchrz   Ú_bad_character_countÚ_buffer_lengthÚ_buffer_last_charÚ_buffer_last_char_accentuatedÚ_buffer_accent_countÚ_buffer_glyph_countÚ_buffer_upper_countÚ_buffer_first_lowerÚ_buffer_has_non_asciiÚ_buffer_last_char_ligatureÚ_buffer_has_internal_ligatureÚ_is_current_word_invalidÚ_invalid_word_countrD   rp   c                 C  sv   d| _ d| _d| _d| _d| _d| _d| _d| _d | _d| _	d| _
d| _d| _d| _d| _d| _d| _d| _d| _d S r‹   r�   rq   rZ   rZ   r[   r\   
  s&    zSuperWeirdWordPlugin.__init__rA   r$   rj   c                 C  sÈ  |j r®| jrd| _|j| _| jdkr,|j| _|  jd7  _|| _|jrT|  j	d7  _	|j
s`d| _|j| _|jr||  jd7  _|jr’|  jd7  _n| jsª|jr¤|jrªd| _dS | js¸dS |jsÊ|jrÖ| jrÖd| _d| _|jsê|jsê|j�rŠ|  jd7  _| j}|  j|7  _|dk�rº| j| dk�r.d| _nŒ| j�rd| j ¡ �rd| j	|k�rd|  jd7  _d| _nV| jdk�r†d| _|  jd7  _n4| j�rº| j�rº| j	|d k�rº|  jd7  _d| _|dk�r | j�r | j	dk�oä| j	| dk}|�s |  jd7  _d| _| j�r*|  jd7  _|  j|7  _d	| _| j�rF|  j d7  _ d	| _d	| _d| _d| _d	| _d| _d| _d| _	d	| _d	| _d	| _d	| _n:|d
k�rÄ|j!�sÄ|j"�rÄd| _|  jd7  _|| _d	| _dS )r}   Tr   r   Né   ç      à?é   r€   F>   ú|ú=ú~Ú_ú-ú<ú>)#r'   r¬   r­   r5   r¤   r)   rª   r¥   r(   r©   r,   r«   r/   r¦   r§   r8   r¨   r¢   r0   r7   r6   r¡   r®   r*   r9   r<   rž   rz   rT   r    rŸ   r£   r¯   r+   r:   )rX   r%   rk   Zbuffer_lengthZprobable_camel_casedrZ   rZ   r[   ro   "  s´    
ÿÿ
ÿþýÿþýþÿþýzSuperWeirdWordPlugin.feed_infoc                 C  sv   d| _ d | _d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _d| _d| _d| _d| _d| _d| _d S r‹   )r¤   r¥   r¦   r¡   r¢   rŸ   rž   rz   r£   r    r§   r¨   r©   rª   r«   r¬   r­   r®   r¯   rq   rZ   rZ   r[   rr   †  s&    zSuperWeirdWordPlugin.resetrs   c                 C  s.   | j r
dS | jdkr"| jdkr"dS | j| j S )NrŽ   é
   r   r   )r¯   rž   r    r£   rz   rq   rZ   rZ   r[   rt   ›  s
    zSuperWeirdWordPlugin.ratioNr�   rZ   rZ   rZ   r[   rœ   ó  s   drœ   c                   @  sT   e Zd ZdZdZddœdd„Zdddd	œd
d„Zddœdd„Zeddœdd„ƒZ	dS )ÚCjkUncommonPluginz<
    Detect messy CJK text that probably means nothing.
    ©rz   Ú_uncommon_countrD   rp   c                 C  s   d| _ d| _d S r|   r¼   rq   rZ   rZ   r[   r\   ­  s    zCjkUncommonPlugin.__init__rA   r$   rj   c                 C  s&   |  j d7  _ |js"|  jd7  _dS r…   )rz   r?   r½   rn   rZ   rZ   r[   ro   ±  s    zCjkUncommonPlugin.feed_infoc                 C  s   d| _ d| _d S r|   r¼   rq   rZ   rZ   r[   rr   ¸  s    zCjkUncommonPlugin.resetrs   c                 C  s.   | j dk rdS | j| j  }|dkr*|d S dS )Nr°   r   r±   é   r¼   )rX   Zuncommon_form_usagerZ   rZ   r[   rt   ¼  s    
zCjkUncommonPlugin.ratioN©
r]   r^   r_   r`   ra   r\   ro   rr   ru   rt   rZ   rZ   rZ   r[   r»   ¦  s   r»   c                   @  sT   e Zd ZdZdZddœdd„Zdddd	œd
d„Zddœdd„Zeddœdd„ƒZ	dS )ÚSuspiciousKatakanaPluginzDDetect implausible halfwidth Katakana and uncommon CJK combinations.©Ú_katakana_countÚ_halfwidth_katakana_countÚ
_cjk_countÚ_uncommon_cjk_countrD   rp   c                 C  s   d| _ d| _d| _d| _d S r|   rÁ   rq   rZ   rZ   r[   r\   Ò  s    z!SuspiciousKatakanaPlugin.__init__rA   r$   rj   c                 C  sR   |j r,|  jd7  _|jr(|  jd7  _dS |  jd7  _|jsN|  jd7  _dS r…   )r2   rÂ   r3   rÃ   rÄ   r?   rÅ   rn   rZ   rZ   r[   ro   Ø  s    z"SuspiciousKatakanaPlugin.feed_infoc                 C  s   d| _ d| _d| _d| _d S r|   rÁ   rq   rZ   rZ   r[   rr   ä  s    zSuspiciousKatakanaPlugin.resetrs   c                 C  s:   | j dkr6| j | jkr6d| j  kr.| jkr6n ndS dS )Nr°   é   rŽ   r   )rÃ   rÂ   rÄ   rÅ   rq   rZ   rZ   r[   rt   ê  s    ÿ
þ ýý
zSuspiciousKatakanaPlugin.ratioNr¿   rZ   rZ   rZ   r[   rÀ   È  s   rÀ   c                   @  sP   e Zd ZdZddœdd„Zddddœd	d
„Zddœdd„Zeddœdd„ƒZdS )ÚArchaicUpperLowerPlugin©Ú_bufÚ_character_count_since_last_sepÚ_successive_upper_lower_countÚ#_successive_upper_lower_count_finalrz   Ú_last_alpha_seen_upperÚ_last_alpha_seen_lowerÚ_current_ascii_onlyrD   rp   c                 C  s4   d| _ d| _d| _d| _d| _d| _d| _d| _d S )NFr   TrÈ   rq   rZ   rZ   r[   r\     s    z ArchaicUpperLowerPlugin.__init__rA   r$   rj   c                 C  sþ   |j o
|j}| }|rp| jdkrp| jdkrF|jsF| jsF|  j| j7  _d| _d| _d| _|  jd7  _d| _dS | jr‚|j	s‚d| _| jdkrÎ|j
r˜| js¤|jrÈ| jrÈ| jrÀ|  jd7  _d| _qÎd| _nd| _|  jd7  _|  jd7  _|j
| _|j| _dS )r}   r   é@   Fr   TNr~   )r'   r-   rÊ   r+   rÏ   rÌ   rË   rÉ   rz   r,   r(   rÎ   r)   rÍ   )rX   r%   rk   Zis_concernedZ	chunk_seprZ   rZ   r[   ro     sF    ÿþýÿ
ÿÿz!ArchaicUpperLowerPlugin.feed_infoc                 C  s4   d| _ d| _d| _d| _d| _d| _d| _d| _d S )Nr   FT)rz   rÊ   rË   rÌ   rÍ   rÎ   rÉ   rÏ   rq   rZ   rZ   r[   rr   ;  s    zArchaicUpperLowerPlugin.resetrs   c                 C  s   | j dkrdS | j| j  S )Nr   r   )rz   rÌ   rq   rZ   rZ   r[   rt   E  s    
zArchaicUpperLowerPlugin.ratioNr�   rZ   rZ   rZ   r[   rÇ   ö  s   +
rÇ   c                   @  sP   e Zd ZdZddœdd„Zddœdd„Zdd	dd
œdd„Zeddœdd„ƒZdS )ÚArabicIsolatedFormPlugin©rz   Ú_isolated_form_countrD   rp   c                 C  s   d| _ d| _d S r|   rÒ   rq   rZ   rZ   r[   r\   P  s    z!ArabicIsolatedFormPlugin.__init__c                 C  s   d| _ d| _d S r|   rÒ   rq   rZ   rZ   r[   rr   T  s    zArabicIsolatedFormPlugin.resetrA   r$   rj   c                 C  s*   |  j d7  _ |jt@ r&|  jd7  _dS r…   )rz   r.   r   rÓ   rn   rZ   rZ   r[   ro   X  s    
z"ArabicIsolatedFormPlugin.feed_infors   c                 C  s   | j dk rdS | j| j  }|S )Nr†   r   rÒ   )rX   Zisolated_form_usagerZ   rZ   r[   rt   _  s    
zArabicIsolatedFormPlugin.ratioN)	r]   r^   r_   ra   r\   rr   ro   ru   rt   rZ   rZ   rZ   r[   rÑ   M  s   rÑ   rC   rB   )rš   r›   rF   c                 C  sz   | dks|dkrdS t |  }t | }||kr0dS |tks@|tkrDdS t||ƒtkrVdS | dkrf|tkS |dkrv|tkS dS )z_
    Determine if two Unicode ranges seen next to each other can be considered suspicious.
    NTFzBasic Latin)r   r   r	   r   r   )rš   r›   Z	familly_aZ	familly_brZ   rZ   r[   r™   i  s$    ÿþr™   çš™™™™™É?Frs   )Údecoded_sequenceÚmaximum_thresholdÚdebugrF   c           $   
   C  s  t | ƒ}|dk rd}n|dk r$d}nd}|  ¡ }t}t}tƒ }tƒ }	tƒ }
tƒ }tƒ }t	ƒ }t
ƒ }tƒ }tƒ }tƒ }|j}|	j}|
j}|j}|j}|j}|j}|j}|j}|j}td||ƒD �]:}| ||| … D ]Ú}t|ƒ}|dk rð|| }n||ƒ}|||ƒ |||ƒ |�r$|jrÒ|||ƒ qÒ|||ƒ |j�rJ|||ƒ |||ƒ |jrÒ|||ƒ |j�rl|||ƒ |j�rŠ|||ƒ |||ƒ n|j�rœ|||ƒ |jrÒ|||ƒ qÒ|j|	j |
j |j |j |j |j |j |j |j } | |kr¼ �qbq¼|d }!|d|!ƒ |�s|d|!ƒ |d|!ƒ |j|	j |
j |j |j |j |j |j |j |j } |�rtd	ƒ}"|" td
|› d| › d|› �¡ |dk�rÌ|" td| dd… › �¡ |" td| dd… › �¡ ||	|
|||||||f
D ] }#|" t|#j› d|#j› �¡ �qät| dƒS )zw
    Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier.
    iÿ  rN   i   rÐ   rG   r   rº   Ú
Zcharset_normalizerzIMess-detector extended-analysis start. intermediary_mean_mess_ratio_calc=z mean_mess_ratio=z maximum_threshold=é   zStarting with: NzEnding with: iðÿÿÿz: rÆ   )ÚlenÚisasciirh   rd   rv   r‚   r‡   r�   r”   rœ   r»   rÀ   rÇ   rÑ   ro   r;   rQ   r&   r'   r0   r1   r2   r4   rt   r   Úlogr   Ú	__class__Úround)$rÕ   rÖ   r×   Zseq_lenÚstepZis_pure_asciiZ
ascii_infoZ	char_infoZd_spZd_taZd_upZd_sdaZd_srZd_swZd_cuZd_skZd_auZd_aiZ	d_sp_feedZ	d_ta_feedZ	d_up_feedZ
d_sda_feedZ	d_sr_feedZ	d_sw_feedZ	d_cu_feedZ	d_sk_feedZ	d_au_feedZ	d_ai_feedZblock_startr%   Ú	codepointrk   Zmean_mess_ratioZnl_infoÚloggerÚdtrZ   rZ   r[   Ú
mess_ratio�  sæ    	










ÿþýüûúùø	÷ÿ


ÿþýüûúùø	÷ÿþ
rã   )rÔ   F)7Ú
__future__r   Ú	functoolsr   Úloggingr   Zconstantr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Úutilsr   r   r   r   r   r    r!   r#   rb   r$   rd   r;   rh   ri   rv   r‚   r‡   r�   r”   rœ   r»   rÀ   rÇ   rÑ   r™   rã   rZ   rZ   rZ   r[   Ú<module>   s<    \$ Mÿ,%,9 4".W$   ÿ