§
    eÒ³g/m  ã                   óø  — U d dl Z d dlZd dlZd dlZd dl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 ddlmZmZmZmZmZmZ ddlmZ ddlmZ dd	lmZ  ej        e ¦  «        Z!d
Z"d
Z#dZ$dZ%dZ&ee'd<   dZ(ee'd<   ddddddddœZ)dede	egef         fd„Z*dede	egeeef         f         fd„Z+ ed¦  «         ed
¦  «         ed ¦  «         ed¦  «        dœZ, ed¦  «         ed¦  «         ed ¦  «         ed!¦  «        dœZ-d>deded#e.ddfd$„Z/ G d%„ d&¦  «        Z0 G d'„ d(¦  «        Z1 G d)„ d*¦  «        Z2	 d?d,ed-e3d.edefd/„Z4 e j5        e1j6        ¦  «        j7         8                    ¦   «         Z9 e j5        e2¦  «        j7         8                    ¦   «         Z:d,ed.ede0fd0„Z;	 	 d@d,ed1ee         d2ee         d.ede.f
d3„Z<e"fd4ed5ede.fd6„Z=e"e#fd,ed7ed8ede.fd9„Z>	 	 dAd,ed5ed;eee.d<f                  defd=„Z?dS )Bé    N)Ú
itemgetter)
ÚAnyÚCallableÚDictÚ	GeneratorÚListÚMatchÚOptionalÚPatternÚTupleÚUnioné   )ÚT_bboxÚT_dirÚT_numÚT_objÚ
T_obj_iterÚ
T_obj_listé   )Úcluster_objects)Úto_list)Úobjects_to_bboxé   g      @é   ÚttbÚDEFAULT_LINE_DIRÚltrÚDEFAULT_CHAR_DIRÚffÚffiÚfflÚfiÚflÚst)u   ï¬€u   ï¬ƒu   ï¬„u   ï¬�u   ï¬‚u   ï¬†u   ï¬…Úline_dirÚreturnc                 ó$   — d„ d„ d„ d„ dœ|          S )Nc                 ó   — | d         S )NÚtop© ©Úxs    úS/var/www/html/mpstechhub/venv/lib/python3.11/site-packages/pdfplumber/utils/text.pyú<lambda>z&get_line_cluster_key.<locals>.<lambda>/   s
   € ˜˜5œ€ ó    c                 ó   — | d          S )NÚbottomr*   r+   s    r-   r.   z&get_line_cluster_key.<locals>.<lambda>0   s   € ˜!˜Hœ+˜€ r/   c                 ó   — | d         S ©NÚx0r*   r+   s    r-   r.   z&get_line_cluster_key.<locals>.<lambda>1   s
   € ˜˜4œ€ r/   c                 ó   — | d          S )NÚx1r*   r+   s    r-   r.   z&get_line_cluster_key.<locals>.<lambda>2   s   € ˜!˜Dœ'˜€ r/   ©r   Úbttr   Úrtlr*   )r%   s    r-   Úget_line_cluster_keyr:   -   s3   € à!Ð!Ø%Ð%Ø Ð Ø!Ð!ð	ð ð
 ôð r/   Úchar_dirc                 ó$   — d„ d„ d„ d„ dœ|          S )Nc                 ó"   — | d         | d         fS )Nr)   r1   r*   r+   s    r-   r.   z#get_char_sort_key.<locals>.<lambda>8   s   € ˜!˜Eœ( A h¤KÐ0€ r/   c                 ó8   — | d         | d         z    | d          fS )Nr)   Úheightr*   r+   s    r-   r.   z#get_char_sort_key.<locals>.<lambda>9   s!   € ˜A˜eœH q¨¤{Ñ2Ð3°a¸´h°YÐ?€ r/   c                 ó"   — | d         | d         fS r3   r*   r+   s    r-   r.   z#get_char_sort_key.<locals>.<lambda>:   s   € ˜!˜Dœ' 1 T¤7Ð+€ r/   c                 ó&   — | d          | d          fS )Nr6   r4   r*   r+   s    r-   r.   z#get_char_sort_key.<locals>.<lambda>;   s   € ˜1˜Tœ7˜( Q t¤W HÐ-€ r/   r7   r*   )r;   s    r-   Úget_char_sort_keyrB   6   s3   € à0Ð0Ø?Ð?Ø+Ð+Ø-Ð-ð	ð ð
 ôð r/   r7   r)   r1   r4   r6   Ú Úsuffixc           
      ó8  — t          t                               ¦   «         ¦  «        }| |vrt          d|› d|› d| › �¦  «        ‚||vrt          d|› d|› d|› �¦  «        ‚t          | ¦  «        t          |¦  «        k    rt          d|› d| › d|› d|› �¦  «        ‚d S )Nr%   z must be one of z, not r;   ú=z is incompatible with char_dir)ÚsetÚPOSITION_KEYSÚkeysÚ
ValueError)r%   r;   rD   Ú
valid_dirss       r-   Úvalidate_directionsrL   N   s÷   € Ý•]×'Ò'Ñ)Ô)Ñ*Ô*€JØ�zÐ!Ð!ÝØK�vÐKÐK¨zÐKÐKÀÐKÐKñ
ô 
ð 	
ð �zÐ!Ð!ÝØK�vÐKÐK¨zÐKÐKÀÐKÐKñ
ô 
ð 	
õ ˆ8�}„}�˜H™œÒ%Ð%Ýð0�vð 0ð 0 ð 0ð 0Ø"ð0ð 0Ø%-ð0ð 0ñ
ô 
ð 	
ð &Ð%r/   c                   ó:  — e Zd ZdZdeeeee         f                  de	de	ddfd„Z
defd„Z	 	 	 ddee         dedededeeef         f
d„Z	 	 	 	 	 ddeeee         f         dedededededeeeef                  fd„Z	 ddededeeeef                  fd„ZdS )ÚTextMapz–
    A TextMap maps each unicode character in the text to an individual `char`
    object (or, in the case of layout-implied whitespace, `None`).
    ÚtuplesÚline_dir_renderÚchar_dir_renderr&   Nc                 ó„   — t          ||d¦  «         || _        || _        || _        |                      ¦   «         | _        d S )NÚ_render)rL   rO   rP   rQ   Ú	to_stringÚ	as_string)ÚselfrO   rP   rQ   s       r-   Ú__init__zTextMap.__init__e   sB   € õ 	˜O¨_¸iÑHÔHÐHØˆŒØ.ˆÔØ.ˆÔØŸšÑ)Ô)ˆŒˆˆr/   c                 óN  ‡‡— | j         }| j        }d                     t          t	          d¦  «        | j        ¦  «        ¦  «        }|dk    r|dk    r|S |                     d¦  «        Š|dv rt          t          ‰¦  «        ¦  «        Š|dk    rd„ ‰D ¦   «         Š|d	v rst          t          t          ‰¦  «        ¦  «        Š|d
k    rˆfd„‰D ¦   «         Šnˆfd„‰D ¦   «         Šd                     ˆfd„t          ‰¦  «        D ¦   «         ¦  «        S d                     ‰¦  «        S )NrC   r   r   r   ú
©r8   r9   r9   c                 óR   — g | ]$}d                       t          |¦  «        ¦  «        ‘Œ%S ©rC   )ÚjoinÚreversed©Ú.0Úlines     r-   ú
<listcomp>z%TextMap.to_string.<locals>.<listcomp>   s*   € ÐCÐCÐC°T˜Ÿš¥¨$¡¤Ñ0Ô0ÐCÐCÐCr/   )r9   r   r8   c                 ó@   •— g | ]}d ‰t          |¦  «        z
  z  |z   ‘ŒS ©ú ©Úlen©r`   ra   Úmax_line_lengths     €r-   rb   z%TextMap.to_string.<locals>.<listcomp>„   s;   ø€ ð ð ð ØIM˜ µ#°d±)´)Ñ ;Ñ<ÀÑDðð ð r/   c                 ó@   •— g | ]}|d ‰t          |¦  «        z
  z  z   ‘ŒS rd   rf   rh   s     €r-   rb   z%TextMap.to_string.<locals>.<listcomp>ˆ   s;   ø€ ð ð ð ØIM˜  ½¸T¹¼Ñ'BÑ CÑDðð ð r/   c              3   ó\   •‡K  — | ]%Šd                       ˆfd„‰D ¦   «         ¦  «        V — Œ&dS )rC   c              3   ó(   •K  — | ]}|‰         V — Œd S ©Nr*   )r`   ra   Úis     €r-   ú	<genexpr>z.TextMap.to_string.<locals>.<genexpr>.<genexpr>Œ   s'   øè è € Ð6Ð6¨˜D œGÐ6Ð6Ð6Ð6Ð6Ð6r/   N©r]   )r`   rn   Úliness    @€r-   ro   z$TextMap.to_string.<locals>.<genexpr>‹   sV   øøè è € ð !ð !Ø;<�B—G’GÐ6Ð6Ð6Ð6°Ð6Ñ6Ô6Ñ6Ô6ð!ð !ð !ð !ð !ð !r/   )rQ   rP   r]   Úmapr   rO   ÚsplitÚlistr^   Úmaxrg   Úrange)rV   ÚcdÚldÚbaserq   ri   s       @@r-   rT   zTextMap.to_stringq   sm  øø€ ØÔ!ˆØÔ!ˆà�wŠw•s�: a™=œ=¨$¬+Ñ6Ô6Ñ7Ô7ˆà�Š;ˆ;˜2 š;˜;ØˆKà—J’J˜tÑ$Ô$ˆEØ�^Ð#Ð#Ý�X e™_œ_Ñ-Ô-�à�UŠ{ˆ{ØCÐC¸UÐCÑCÔC�à�^Ð#Ð#Ý"%¥c­#¨u¡o¤oÑ"6Ô"6�Ø˜’;�;ðð ð ð ØQVðñ ô �E�Eðð ð ð ØQVðñ ô �Eð —y’yð !ð !ð !ð !Ý@EÀoÑ@VÔ@Vð!ñ !ô !ñ ô ð ð —y’y Ñ'Ô'Ð'r/   r   TÚmÚ
main_groupÚreturn_groupsÚreturn_charsc                 ó&  — | j         |                     |¦  «        |                     |¦  «        …         }d„ |D ¦   «         }t          |¦  «        \  }}}	}
|                     |¦  «        |||	|
dœ}|r|                     ¦   «         |d<   |r||d<   |S )Nc                 ó   — g | ]	\  }}|®|‘Œ
S rm   r*   )r`   ÚtextÚcs      r-   rb   z)TextMap.match_to_dict.<locals>.<listcomp>™   s   € Ð<Ð<Ð<‘y˜˜a¨a¨m�¨m¨m¨mr/   )r€   r4   r)   r6   r1   ÚgroupsÚchars)rO   ÚstartÚendr   Úgroupr‚   )rV   rz   r{   r|   r}   Úsubsetrƒ   r4   r)   r6   r1   Úresults               r-   Úmatch_to_dictzTextMap.match_to_dict‘   s±   € ð ”˜QŸWšW ZÑ0Ô0°1·5²5¸Ñ3DÔ3DÐDÔEˆØ<Ð< FÐ<Ñ<Ô<ˆÝ-¨eÑ4Ô4ÑˆˆC��Vð —G’G˜JÑ'Ô'ØØØØð
ð 
ˆð ð 	*Ø Ÿxšx™zœzˆF�8Ñàð 	$Ø#ˆF�7‰Oàˆr/   ÚpatternÚregexÚcasec                 ó€  ‡ ‡‡‡— t          |t          ¦  «        r)|du rt          d¦  «        ‚|du rt          d¦  «        ‚|}n?|du rt          j        |¦  «        }|du rt          j        nd}t          j        ||¦  «        }t          j        |‰ j        ¦  «        }	t          ˆfd„|	¦  «        }
ˆˆˆˆ fd„|
D ¦   «         S )NFzACannot pass a compiled search pattern *and* regex=False together.z@Cannot pass a compiled search pattern *and* case=False together.r   c                 ól   •— t          |                      ‰¦  «                             ¦   «         ¦  «        S rm   )Úboolr†   Ústrip)rz   r{   s    €r-   r.   z TextMap.search.<locals>.<lambda>É   s'   ø€ ¥D¨¯ª°Ñ)<Ô)<×)BÒ)BÑ)DÔ)DÑ$EÔ$E€ r/   c                 óB   •— g | ]}‰                      |‰‰‰¬ ¦  «        ‘ŒS ))r|   r}   r{   )r‰   )r`   rz   r{   r}   r|   rV   s     €€€€r-   rb   z"TextMap.search.<locals>.<listcomp>Ê   sL   ø€ ð 
ð 
ð 
ð ð ×ÒØØ+Ø)Ø%ð	 ñ ô ð
ð 
ð 
r/   )
Ú
isinstancer   rJ   ÚreÚescapeÚIÚcompileÚfinditerrU   Úfilter)rV   rŠ   r‹   rŒ   r|   r}   r{   ÚcompiledÚflagsÚgenÚfiltereds   `   ```    r-   ÚsearchzTextMap.search¬   s  øøøø€ õ �g�wÑ'Ô'ð 	2Ø˜ˆ~ˆ~Ý ØWñô ð ð �uˆ}ˆ}Ý ØVñô ð ð ˆHˆHà˜ˆ~ˆ~Ýœ) GÑ,Ô,�à  E˜M˜M•B”D�D¨qˆEÝ”z '¨5Ñ1Ô1ˆHåŒk˜( D¤NÑ3Ô3ˆõ ÐEÐEÐEÐEÀsÑKÔKˆð
ð 
ð 
ð 
ð 
ð 
ð 
ð ð
ñ 
ô 
ð 	
r/   r�   c                 óB   — |rd}nd}|                       |d|d¬¦  «        S )af  
        `strip` is analogous to Python's `str.strip()` method, and returns
        `text` attributes without their surrounding whitespace. Only
        relevant when the relevant TextMap is created with `layout` = True

        Setting `return_chars` to False will exclude the individual
        character objects from the returned text-line dicts.
        z *([^\n]+?) *(\n|$)z([^\n]+)r   F)r{   r}   r|   )r�   )rV   r�   r}   Úpats       r-   Úextract_text_lineszTextMap.extract_text_linesÔ   s<   € ð ð 	Ø(ˆCˆCàˆCà�{Š{Ø˜A¨LÈð ñ 
ô 
ð 	
r/   )r   TT)TTTTr   )TT)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ústrr
   r   r   rW   rT   r	   Úintr�   r   r   r‰   r   r   r�   r    r*   r/   r-   rN   rN   _   s´  € € € € € ðð ð

*à�U˜3 ¨¤Ð/Ô0Ô1ð
*ð ð
*ð ð	
*ð
 
ð
*ð 
*ð 
*ð 
*ð(˜3ð (ð (ð (ð (ðF Ø"Ø!ðð à�Œ:ðð ðð ð	ð
 ðð 
ˆc�3ˆhŒðð ð ð ð< ØØ"Ø!Øð&
ð &
à�s˜G CœLÐ(Ô)ð&
ð ð&
ð ð	&
ð
 ð&
ð ð&
ð ð&
ð 
ˆd�3˜�8ŒnÔ	ð&
ð &
ð &
ð &
ðR 8<ð
ð 
Øð
Ø04ð
à	ˆd�3˜�8ŒnÔ	ð
ð 
ð 
ð 
ð 
ð 
r/   rN   c            +       óô   — e Zd ZdZdeeeef                  ddfd„Zdddddde	e
ddeeeddddddd	f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e         dee         dee         dee         dedededef*d„ZdS )ÚWordMapz&
    A WordMap maps words->chars.
    rO   r&   Nc                 ó   — || _         d S rm   )rO   )rV   rO   s     r-   rW   zWordMap.__init__î   s   € ØˆŒˆˆr/   Fr   )r   r   r   r   TÚlayoutÚlayout_widthÚlayout_heightÚlayout_width_charsÚlayout_height_charsÚlayout_bboxÚ	x_densityÚ	y_densityÚx_shiftÚy_shiftÚy_tolerancer%   r;   Úline_dir_rotatedÚchar_dir_rotatedrQ   rP   Úuse_text_flowÚ	presortedÚexpand_ligaturesc                 ó¾  ‡2‡3— g }t          | j        ¦  «        st          ||p||p|¬¦  «        S |rt          ni }|rm|r|rt	          d¦  «        ‚nt          t          ||z  ¦  «        ¦  «        }|r|rt	          d¦  «        ‚nt          t          ||z  ¦  «        ¦  «        }dg|z  }ng }d}t          |¦  «        Š3t          |¦  «        Š2t          |         }t          |         }t          |         |¦  «        }t          |         |¦  «        }|s|r| j        nt          | j        ˆ3fd„¬¦  «        }t          |ˆ3fd„||p|¬	¦  «        }t          |¦  «        D �]›\  }} |r0 || d         d         ¦  «        }!|!||
z   z
  }"|d
v rdnd}#|"|#z  |z  }$nd}$t          t          |dk    ¦  «        t          |$¦  «        |z
  ¦  «        }%t          |%¦  «        D ]=}t          |¦  «        r|d         d         dk    r||z  }|                     d¦  «         Œ>||%z  }d}&|s|r| nt          | ˆ2fd„¬¦  «        }'|'D ]±\  }(})|r$ ||(¦  «        }*|*||	z   z
  }+|d
v rdnd}#|+|#z  |z  },nd},t          t#          d|&¦  «        t          |,¦  «        |&z
  ¦  «        }-|dg|-z  z  }|&|-z  }&|)D ]E}.|                     |.d         |.d         ¦  «        }/|/D ]}0|                     |0|.f¦  «         |&dz  }&ŒŒFŒ²|r|dg||&z
  z  z  }�Œ�|rP||dz   z
  }1t          |1¦  «        D ]"}|dk    r||z  }|                     d¦  «         Œ#|d         dk    r
|dd…         }t          ||p||p|¬¦  «        S )a¹  
        Given a list of (word, chars) tuples (i.e., a WordMap), return a list of
        (char-text, char) tuples (i.e., a TextMap) that can be used to mimic
        the structural layout of the text on the page(s), using the following
        approach for top-to-bottom, left-to-right text:

        - Sort the words by (top, x0) if not already sorted.

        - Cluster the words by top (taking `y_tolerance` into account), and
          iterate through them.

        - For each cluster, divide (top - y_shift) by `y_density` to calculate
          the minimum number of newlines that should come before this cluster.
          Append that number of newlines *minus* the number of newlines already
          appended, with a minimum of one.

        - Then for each cluster, iterate through each word in it. Divide each
          word's x0, minus `x_shift`, by `x_density` to calculate the minimum
          number of characters that should come before this cluster.  Append that
          number of spaces *minus* the number of characters and spaces already
          appended, with a minimum of one. Then append the word's text.

        - At the termination of each line, add more spaces if necessary to
          mimic `layout_width`.

        - Finally, add newlines to the end if necessary to mimic to
          `layout_height`.

        For other line/character directions (e.g., bottom-to-top,
        right-to-left), these steps are adjusted.
        ©rP   rQ   z;`layout_width` and `layout_width_chars` cannot both be set.z=`layout_height` and `layout_height_chars` cannot both be set.)re   Nr   c                 ó&   •—  ‰| d         ¦  «        S ©Nr   r*   ©r,   Úline_cluster_keys    €r-   r.   z$WordMap.to_textmap.<locals>.<lambda>U  s   ø€ Ð3CÐ3CÀAÀaÄDÑ3IÔ3I€ r/   ©Úkeyc                 ó&   •—  ‰| d         ¦  «        S r½   r*   r¾   s    €r-   r.   z$WordMap.to_textmap.<locals>.<lambda>Z  s   ø€ Ð&Ð& q¨¤tÑ,Ô,€ r/   )Úpreserve_orderrZ   éÿÿÿÿr   rY   )rY   Nc                 ó&   •—  ‰| d         ¦  «        S r½   r*   )r,   Úchar_sort_keys    €r-   r.   z$WordMap.to_textmap.<locals>.<lambda>z  s   ø€ °}°}ÀQÀqÄTÑ7JÔ7J€ r/   r€   N)rg   rO   rN   Ú	LIGATURESrJ   r¦   Úroundr:   rB   rH   ÚBBOX_ORIGIN_KEYSÚsortedr   Ú	enumerateru   rv   ÚappendÚminÚget)4rV   rª   r«   r¬   r­   r®   r¯   r°   r±   r²   r³   r´   r%   r;   rµ   r¶   rQ   rP   r·   r¸   r¹   Ú_textmapÚ
expansionsÚ
blank_lineÚnum_newlinesÚline_position_keyÚchar_position_keyÚy_originÚx_originÚwords_sorted_line_dirÚtuples_by_linern   Úline_tuplesÚline_positionÚ
y_dist_rawÚadjÚy_distÚnum_newlines_prependÚline_lenÚline_tuples_sortedÚwordrƒ   Úchar_positionÚ
x_dist_rawÚx_distÚnum_spaces_prependr�   ÚlettersÚletterÚnum_newlines_appendrÆ   r¿   s4                                                     @@r-   Ú
to_textmapzWordMap.to_textmapñ   sÜ  øø€ ðl 79ˆå�4”;ÑÔð 	ÝØØ /Ð ;°8Ø /Ð ;°8ðñ ô ð ð #3Ð:•Y�Y¸ˆ
àð 	Ø!ð JØð Ý$ØUñô ð ðõ
 &)­¨|¸iÑ/GÑ)HÔ)HÑ%IÔ%IÐ"à"ð LØ ð Ý$ØWñô ð ðõ
 '*­%°À	Ñ0IÑ*JÔ*JÑ&KÔ&KÐ#à%˜Ð);Ñ;ˆJˆJàˆJàˆå/°Ñ9Ô9ÐÝ)¨(Ñ3Ô3ˆå)¨(Ô3ÐÝ)¨(Ô3Ðå# HÔ-¨kÑ:Ô:ˆÝ# HÔ-¨kÑ:Ô:ˆð ðKØ)ðKˆDŒKˆKå˜œÐ)IÐ)IÐ)IÐ)IÐJÑJÔJð 	õ )Ø!Ø,Ð,Ð,Ð,ØØ$Ð5¨ð	
ñ 
ô 
ˆõ (¨Ñ7Ô7ð 3	Lñ 3	L‰NˆAˆ{Øð Ø 1Ð 1°+¸a´.ÀÔ2CÑ DÔ D�Ø*¨h¸Ñ.@ÑA�
Ø$¨Ð6Ð6�b�b¸A�Ø# cÑ)¨IÑ5��à�Ý#&å�A˜’E‘
”
å�f‘” Ñ,ñ	$ô $Ð õ Ð/Ñ0Ô0ð .ð .�Ý˜8‘}”}ð +¨°¬°Q¬¸4Ò(?Ð(?Ø 
Ñ*�HØ—’ Ñ-Ô-Ð-Ð-àÐ0Ñ0ˆLàˆHð ðLØ -ðL��å˜KÐ-JÐ-JÐ-JÐ-JÐKÑKÔKð ð  2ð &ð &‘��eØð Ø$5Ð$5°dÑ$;Ô$;�MØ!.°(¸WÑ2DÑ!E�JØ (¨NÐ :Ð :˜"˜"À�CØ'¨#Ñ-°	Ñ9�F�Fà�Få%(­¨Q°Ñ)9Ô)9½5À¹=¼=È8Ñ;SÑ%TÔ%TÐ"Ø˜[˜MÐ,>Ñ>Ñ>�ØÐ.Ñ.�àð &ð &�AØ(Ÿnšn¨Q¨v¬Y¸¸&¼	ÑBÔB�GØ")ð &ð &˜Ø Ÿš¨°¨Ñ4Ô4Ð4Ø  A™˜˜ð&ð&ð ð LØ˜[˜MÐ-?À(Ñ-JÑKÑK�ùð ð 		)Ø"5¸ÈÑ9IÑ"JÐÝÐ.Ñ/Ô/ð .ð .�Ø�q’5�5Ø 
Ñ*�HØ—’ Ñ-Ô-Ð-Ð-ð ˜Œ|˜|Ò+Ð+Ø# C R Cœ=�åØØ+Ð7¨xØ+Ð7¨xð
ñ 
ô 
ð 	
r/   )r¡   r¢   r£   r¤   r   r   r   r   rW   ÚDEFAULT_X_DENSITYÚDEFAULT_Y_DENSITYÚDEFAULT_Y_TOLERANCEr   r   r�   r   r¦   r   r   r
   rN   ré   r*   r/   r-   r¨   r¨   é   s¢  € € € € € ðð ð˜t E¨%°Ð*;Ô$<Ô=ð À$ð ð ð ð ð
 ØØ Ø"#Ø#$Ø*Ø,Ø,ØØØ0Ø*Ø*Ø,0Ø,0Ø+/Ø+/Ø#ØØ!%ð+s
ð s
àðs
ð ðs
ð ð	s
ð
  ðs
ð !ðs
ð ðs
ð ðs
ð ðs
ð ðs
ð ðs
ð ðs
ð ðs
ð ðs
ð # 5œ/ðs
ð  # 5œ/ð!s
ð" " %œð#s
ð$ " %œð%s
ð& ð's
ð( ð)s
ð* ð+s
ð, 
ð-s
ð s
ð s
ð s
ð s
ð s
r/   r¨   c                   óÈ  — e Zd Zeeddddddeedddddfdededee	e
df         dee	e
df         ded	ed
ededededee         dee         deee                  deeef         defd„Zde	defd„Zdedefd„Zdedededededefd„Zdededeeddf         fd„Zdedeeeef         ddf         fd„Zdedeeeef         ddf         fd „Zdedefd!„Z	 d$ded"edefd#„ZdS )%ÚWordExtractorNFTÚx_tolerancer´   Úx_tolerance_ratioÚy_tolerance_ratioÚkeep_blank_charsr·   Úvertical_ttbÚhorizontal_ltrr%   r;   rµ   r¶   Úextra_attrsÚsplit_at_punctuationr¹   c                 ó   — || _         || _        || _        || _        || _        || _        || _        || _        |du rt           	                    d¦  «         |du rt           	                    d¦  «         |	| _
        |
| _        |p|
| _        |p|	| _        t          | j
        | j        ¦  «         t          | j        | j        d¦  «         |€g n|| _        |du rt           j        n|pd| _        |rt&          ni | _        d S )NFzNvertical_ttb is deprecated and will be removed; use line_dir/char_dir instead.zPhorizontal_ltr is deprecated and will be removed; use line_dir/char_dir instead.Ú_rotatedTrC   )rï   r´   rð   rñ   rò   r·   rô   ró   ÚloggerÚwarningr%   r;   rµ   r¶   rL   rõ   ÚstringÚpunctuationrö   rÇ   rÐ   )rV   rï   r´   rð   rñ   rò   r·   ró   rô   r%   r;   rµ   r¶   rõ   rö   r¹   s                   r-   rW   zWordExtractor.__init__¨  s7  € ð$ 'ˆÔØ&ˆÔØ!2ˆÔØ!2ˆÔØ 0ˆÔØ*ˆÔØ,ˆÔØ(ˆÔØ˜5Ð Ð Ý�NŠNð2ñô ð ð ˜UÐ"Ð"Ý�NŠNð2ñô ð ð !ˆŒØ ˆŒà 0Ð <°HˆÔØ 0Ð <°HˆÔÝ˜DœM¨4¬=Ñ9Ô9Ð9Ý˜DÔ1°4Ô3HÈ*ÑUÔUÐUØ!,Ð!4˜2˜2¸+ˆÔð
 $ tÐ+Ð+õ ÔÐà&Ð,¨"ð 	Ô!ð (8Ð?�)˜)¸RˆŒˆˆr/   Úuprightr&   c                 óN   — |s	| j         sdS |r	| j        sdS |r| j        n| j        S )Nr8   r9   )ró   rô   r;   r¶   )rV   rý   s     r-   Úget_char_dirzWordExtractor.get_char_dirÞ  sF   € ð ð 	˜tÔ0ð 	Ø�5àð 	˜TÔ0ð 	Ø�5à 'ÐBˆtŒ}ˆ}¨TÔ-BÐBr/   Úordered_charsc                 óP  ‡ — t          |¦  «        \  }}}}|d         d         |d         d         z
  }|d         d         }‰                      |¦  «        }d                     ˆ fd„|D ¦   «         ¦  «        |||||z   ||||z
  ||z
  |dœ
}	‰ j        D ]}
|d         |
         |	|
<   Œ|	S )Nr   Údoctopr)   rý   rC   c              3   óf   •K  — | ]+}‰j                              |d          |d          ¦  «        V — Œ,dS ©r€   N)rÐ   rÎ   )r`   r�   rV   s     €r-   ro   z,WordExtractor.merge_chars.<locals>.<genexpr>ñ  sN   øè è € ð ð Ø>?�”×#Ò# A f¤I¨q°¬yÑ9Ô9ðð ð ð ð ð r/   )
r€   r4   r6   r)   r  r1   rý   r?   ÚwidthÚ	direction)r   rÿ   r]   rõ   )rV   r   r4   r)   r6   r1   Ú
doctop_adjrý   r;   rá   rÁ   s   `          r-   Úmerge_charszWordExtractor.merge_charsê  sö   ø€ Ý-¨mÑ<Ô<ÑˆˆC��VØ" 1Ô% hÔ/°-ÀÔ2BÀ5Ô2IÑIˆ
Ø Ô" 9Ô-ˆØ×$Ò$ WÑ-Ô-ˆð —G’Gð ð ð ð ØCPðñ ô ñ ô ð ØØØ˜JÑ&ØØØ˜s‘lØ˜"‘WØ!ð
ð 
ˆð Ô#ð 	.ð 	.ˆCØ% aÔ(¨Ô-ˆD�‰IˆIàˆr/   Ú	prev_charÚ	curr_charr  c                 óŽ  — |dv rO|}|}|d         }|d         }	|dk    r|d         }
|d         }|d         }nj|d          }
|d          }|d          }nN|}|}|d         }|d         }	|dk    r|d         }
|d         }|d         }n|d          }
|d          }|d          }t          ||
k     p|||z   k    p|	||z   k    ¦  «        S )a”  This method takes several factors into account to determine if
        `curr_char` represents the beginning of a new word:

        - Whether the text is "upright" (i.e., non-rotated)
        - Whether the user has specified that horizontal text runs
          left-to-right (default) or right-to-left, as represented by
          self.horizontal_ltr
        - Whether the user has specified that vertical text the text runs
          top-to-bottom (default) or bottom-to-top, as represented by
          self.vertical_ttb
        - The x0, top, x1, and bottom attributes of prev_char and
          curr_char
        - The self.x_tolerance and self.y_tolerance settings. Note: In
          this case, x/y refer to those directions for non-rotated text.
          For vertical text, they are flipped. A more accurate terminology
          might be "*intra*line character distance tolerance" and
          "*inter*line character distance tolerance"

        An important note: The *intra*line distance is measured from the
        *end* of the previous character to the *beginning* of the current
        character, while the *inter*line distance is measured from the
        *top* of the previous character to the *top* of the next
        character. The reasons for this are partly repository-historical,
        and partly logical, as successive text lines' bounding boxes often
        overlap slightly (and we don't want that overlap to be interpreted
        as the two lines being the same line).

        The upright-ness of the character determines the attributes to
        compare, while horizontal_ltr/vertical_ttb determine the direction
        of the comparison.
        )r   r9   r)   r   r4   r6   r   r1   )r�   )rV   r	  r
  r  rï   r´   r,   ÚyÚayÚcyÚaxÚbxÚcxs                r-   Úchar_begins_new_wordz"WordExtractor.char_begins_new_word  s'  € ðR ˜Ð&Ð&ØˆAØˆAØ˜5Ô!ˆBØ˜5Ô!ˆBØ˜EÒ!Ð!Ø˜t”_�Ø˜t”_�Ø˜t”_��à ”oÐ%�Ø ”oÐ%�Ø ”oÐ%��ð ˆAØˆAØ˜4”ˆBØ˜4”ˆBØ˜EÒ!Ð!Ø˜uÔ%�Ø˜xÔ(�Ø˜uÔ%��à Ô)Ð)�Ø Ô&Ð&�Ø Ô)Ð)�åà�"ŠWð Ø�R˜!‘V’ðð �R˜!‘V’ñ
ô 
ð 	
r/   c           
   #   ó\  ‡
K  — g Š
dt           t                   dt          t          d d f         fˆ
fd„}| j        }| j        }| j        }| j        }|D ]Ò}|d         }	| j        s&|	 	                    ¦   «         r |d ¦  «        E d {V —† Œ7|	| j
        v r# ||¦  «        E d {V —†  |d ¦  «        E d {V —† Œc‰
rX|                      ‰
d         |||€|n|‰
d         d         z  |€|n|‰
d         d         z  ¬¦  «        r ||¦  «        E d {V —† Œ½‰
                     |¦  «         ŒÓ‰
r‰
V — d S d S )NÚnew_charr&   c              3   ó&   •K  — ‰r‰V — | €g n| gŠd S rm   r*   )r  Úcurrent_words    €r-   Ústart_next_wordz:WordExtractor.iter_chars_to_words.<locals>.start_next_wordX  s1   øè è € ð
 ð #Ø"Ð"Ð"Ð"à!)Ð!1˜2˜2¸°zˆLˆLˆLr/   r€   rÄ   Úsize)rï   r´   )r
   r   r   r   rï   rð   r´   rñ   rò   Úisspacerö   r  rÌ   )rV   r   r  r  ÚxtÚxtrÚytÚytrÚcharr€   r  s             @r-   Úiter_chars_to_wordsz!WordExtractor.iter_chars_to_wordsQ  sî  øè è € ð
 $&ˆð	BÝ�u”oð	Bå•z 4¨Ð-Ô.ð	Bð 	Bð 	Bð 	Bð 	Bð 	Bð ÔˆØÔ$ˆØÔˆØÔ$ˆà!ð 	*ð 	*ˆDØ˜”<ˆDàÔ(ð *¨T¯\ª\©^¬^ð *Ø*˜?¨4Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0à˜Ô2Ð2Ð2Ø*˜?¨4Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ø*˜?¨4Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0àð 
* $×";Ò";Ø˜RÔ ØØØ#& ;˜R˜R°C¸,ÀrÔ:JÈ6Ô:RÑ4RØ#& ;˜R˜R°C¸,ÀrÔ:JÈ6Ô:RÑ4Rð #<ñ #ô #ð 
*ð +˜?¨4Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ð ×#Ò# DÑ)Ô)Ð)Ð)ð ð 	ØÐÐÐÐÐð	ð 	r/   rƒ   c              #   óD  K  — t          |¦  «        }|d         d         }|r| j        n| j        }|                      |¦  «        }t	          |¦  «        }t          |¦  «        }t          |||dv r| j        n| j        ¦  «        }|D ]}t          ||¬¦  «        }	|	|fV — Œd S )Nr   rý   ©r   r8   rÀ   )
rt   r%   rµ   rÿ   r:   rB   r   r´   rï   rÊ   )
rV   rƒ   rý   r%   r;   r¿   rÆ   ÚsubclustersÚscÚchars_sorteds
             r-   Úiter_chars_to_linesz!WordExtractor.iter_chars_to_lines�  sÒ   è è € õ �U‘”ˆØ˜”(˜9Ô%ˆØ$+ÐF�4”=�=°Ô1FˆØ×$Ò$ WÑ-Ô-ˆå/°Ñ9Ô9ÐÝ)¨(Ñ3Ô3ˆõ &ØØØ!)¨^Ð!;Ð!;ˆTÔÐÀÔAQñ
ô 
ˆð ð 	+ð 	+ˆBå! "¨-Ð8Ñ8Ô8ˆLØ Ð*Ð*Ð*Ð*Ð*ð	+ð 	+r/   c              #   ó(  K  — t          dg| j        ¢R Ž }t          j        ||¦  «        }|D ]e\  }}| j        r
|| j        fgn|                      |¦  «        }|D ]7\  }}|                      ||¦  «        D ]}	|                      |	¦  «        |	fV — ŒŒ8Œfd S )Nrý   )	r   rõ   Ú	itertoolsÚgroupbyr·   r;   r%  r  r  )
rV   rƒ   Úgrouping_keyÚgrouped_charsÚkeyvalsÚ
char_groupÚline_groupsÚ
line_charsr  Ú
word_charss
             r-   Úiter_extract_tuplesz!WordExtractor.iter_extract_tuples˜  sí   è è € õ " )Ð?¨dÔ.>Ð?Ð?Ð?ˆÝ!Ô)¨%°Ñ>Ô>ˆà#0ð 	Eð 	EÑˆG�Zð Ô%ð:�*˜dœmÐ,Ð-Ð-à×-Ò-¨jÑ9Ô9ð ð
 *5ð Eð EÑ%�
˜IØ"&×":Ò":¸:ÀyÑ"QÔ"Qð Eð E�JØ×+Ò+¨JÑ7Ô7¸ÐDÐDÐDÐDÐDðEðEð	Eð 	Er/   c                 ó`   — t          t          |                      |¦  «        ¦  «        ¦  «        S rm   )r¨   rt   r0  )rV   rƒ   s     r-   Úextract_wordmapzWordExtractor.extract_wordmap¨  s&   € Ý•t˜D×4Ò4°UÑ;Ô;Ñ<Ô<Ñ=Ô=Ð=r/   r}   c                 ó¶   — |r,t          d„ |                      |¦  «        D ¦   «         ¦  «        S t          d„ |                      |¦  «        D ¦   «         ¦  «        S )Nc              3   ó,   K  — | ]\  }}i |¥d |i¥V — ŒdS )rƒ   Nr*   ©r`   rá   r/  s      r-   ro   z.WordExtractor.extract_words.<locals>.<genexpr>¯  sI   è è € ð ð á$�D˜*ð .�4Ð-˜ *Ð-Ð-ðð ð ð ð ð r/   c              3   ó    K  — | ]	\  }}|V — Œ
d S rm   r*   r5  s      r-   ro   z.WordExtractor.extract_words.<locals>.<genexpr>´  s'   è è € ÐUÐUÑ!1  z˜ÐUÐUÐUÐUÐUÐUr/   )rt   r0  )rV   rƒ   r}   s      r-   Úextract_wordszWordExtractor.extract_words«  sv   € ð ð 	VÝð ð à(,×(@Ò(@ÀÑ(GÔ(Gðñ ô ñ ô ð õ
 ÐUÐU°T×5MÒ5MÈeÑ5TÔ5TÐUÑUÔUÑUÔUÐUr/   ©F)r¡   r¢   r£   ÚDEFAULT_X_TOLERANCErì   r   r   r   r   r¦   Úfloatr�   r   r
   r   r¥   rW   rÿ   r   r   r  r  r   r   r  r   r%  r0  r¨   r2  r7  r*   r/   r-   rî   rî   §  só  € € € € € ð 1Ø0Ø59Ø59Ø!&Ø#Ø!Ø#Ø*Ø*Ø,0Ø,0Ø+/Ø16Ø!%ð!4@ð 4@àð4@ð ð4@ð !  e¨TÐ!1Ô2ð	4@ð
 !  e¨TÐ!1Ô2ð4@ð ð4@ð ð4@ð ð4@ð ð4@ð ð4@ð ð4@ð # 5œ/ð4@ð # 5œ/ð4@ð ˜d 3œiÔ(ð4@ð $ D¨# IÔ.ð4@ð  ð!4@ð 4@ð 4@ð 4@ðl
C Cð 
C¨Eð 
Cð 
Cð 
Cð 
Cð¨ð ¸ð ð ð ð ð4K
àðK
ð ðK
ð ð	K
ð
 ðK
ð ðK
ð 
ðK
ð K
ð K
ð K
ðZ.à!ð.ð ð.ð 
�:˜t TÐ)Ô	*ð	.ð .ð .ð .ð`+Øð+à	�5˜ UÐ*Ô+¨T°4Ð7Ô	8ð+ð +ð +ð +ð.EØðEà	�5˜ 
Ð*Ô+¨T°4Ð7Ô	8ðEð Eð Eð Eð > Zð >°Gð >ð >ð >ð >ð 7<ð	Vð 	VØð	VØ/3ð	Và	ð	Vð 	Vð 	Vð 	Vð 	Vð 	Vr/   rî   Frƒ   r}   Úkwargsc                 óB   — t          di |¤Ž                     | |¦  «        S )Nr*   )rî   r7  )rƒ   r}   r;  s      r-   r7  r7  ·  s(   € õ Ð"Ð"˜6Ð"Ð"×0Ò0°¸ÑEÔEÐEr/   c                 ó  ‡— ‰                      d‰                     d¦  «        pt          | ¦  «        dœ¦  «         t          di ˆfd„t          D ¦   «         ¤Ž}|                     | ¦  «        } |j        di ˆfd„t          D ¦   «         ¤Ž}|S )NTr¯   )r¸   r¯   c                 ó*   •— i | ]}|‰v ¯|‰|         “ŒS r*   r*   ©r`   Úkr;  s     €r-   ú
<dictcomp>z$chars_to_textmap.<locals>.<dictcomp>Ê  s$   ø€ Ð
FÐ
FÐ
F˜A¸!¸v¸+¸+ˆ1ˆf�QŒi¸+¸+¸+r/   c                 ó*   •— i | ]}|‰v ¯|‰|         “ŒS r*   r*   r?  s     €r-   rA  z$chars_to_textmap.<locals>.<dictcomp>Î  s$   ø€ Ð
?Ð
?Ð
?˜A°1¸°;°;ˆ1ˆf�QŒi°;°;°;r/   r*   )ÚupdaterÎ   r   rî   ÚWORD_EXTRACTOR_KWARGSr2  ré   ÚTEXTMAP_KWARGS)rƒ   r;  Ú	extractorÚwordmapÚtextmaps    `   r-   Úchars_to_textmaprI  Á  sÆ   ø€ Ø
‡M‚MàØ!Ÿ:š: mÑ4Ô4ÐN½ÈÑ8NÔ8Nð	
ð 	
ñô ð õ ð ð Ø
FÐ
FÐ
FÐ
FÕ!6Ð
FÑ
FÔ
Fðð €Ið ×'Ò'¨Ñ.Ô.€GØ ˆgÔ ð ð Ø
?Ð
?Ð
?Ð
?¥Ð
?Ñ
?Ô
?ðð €Gð €Nr/   rP   rQ   c                 ór  ‡— t          | ¦  «        } t          | ¦  «        dk    rdS ‰                     d¦  «        ri ‰¥||dœ¥}t          | fi |¤Žj        S t          di ˆfd„t          D ¦   «         ¤Ž}|                     | ¦  «        }|p|j        }|p|j	        }t          |j        ¦  «        }‰                     dt          ¦  «        }‰                     dt          ¦  «        }	t          |||dv r|	n|¦  «        }
t          d	„ d
                     d„ |
D ¦   «         ¦  «        D ¦   «         ||¬¦  «        j        S )Nr   rC   rª   r»   c                 ó*   •— i | ]}|‰v ¯|‰|         “ŒS r*   r*   r?  s     €r-   rA  z extract_text.<locals>.<dictcomp>å  s$   ø€ ÐJÐJÐJ ¸aÀ6¸k¸kˆq�&˜”)¸k¸k¸kr/   rï   r´   r!  c                 ó   — g | ]}|d f‘ŒS rm   r*   )r`   r  s     r-   rb   z extract_text.<locals>.<listcomp>ø  s,   € ð ð ð àð �t�ðð ð r/   rY   c              3   óT   K  — | ]#}d                       d„ |D ¦   «         ¦  «        V — Œ$dS )re   c              3   ó&   K  — | ]}|d          V — ŒdS r  r*   )r`   rá   s     r-   ro   z)extract_text.<locals>.<genexpr>.<genexpr>û  s&   è è € Ð&EÐ&E¸ t¨F¤|Ð&EÐ&EÐ&EÐ&EÐ&EÐ&Er/   Nrp   r_   s     r-   ro   zextract_text.<locals>.<genexpr>û  s=   è è € ÐXÐXÈ$˜cŸhšhÐ&EÐ&EÀÐ&EÑ&EÔ&EÑEÔEÐXÐXÐXÐXÐXÐXr/   r*   )r   rg   rÎ   rI  rU   rî   rD  r7  r%   r;   r:   r9  rì   r   rN   r]   )rƒ   rP   rQ   r;  Útextmap_kwargsrF  Úwordsr¿   rï   r´   rq   s      `       r-   Úextract_textrQ  Ó  s‘  ø€ õ �E‰NŒN€EÝ
ˆ5�z„z�Q‚€Øˆrà‡z‚z�(ÑÔð #ð
Øð
à"1ÀoÐVÐVð
ˆõ   Ð8Ð8¨Ð8Ð8ÔBÐBå!ð 
ð 
ØJÐJÐJÐJÕ%:ÐJÑJÔJð
ð 
ˆ	ð ×'Ò'¨Ñ.Ô.ˆà)Ð?¨YÔ-?ˆØ)Ð?¨YÔ-?ˆå/°	Ô0BÑCÔCÐà—j’j Õ0CÑDÔDˆØ—j’j Õ0CÑDÔDˆåØØØ*¨nÐ<Ð<ˆKˆKÀ+ñ
ô 
ˆõ ðð ð —I’IÐXÐXÐRWÐXÑXÔXÑXÔXðñ ô ð ,Ø+ð	
ñ 	
ô 	
ô ð		r/   r.  Ú	tolerancec                 ó¢   — d}d }t          | t          d¦  «        ¬¦  «        D ]+}|�|d         ||z   k    r|dz  }|d         }||d         z  }Œ,|S )NrC   r4   rÀ   re   r6   r€   )rÊ   r   )r.  rR  ÚcollÚlast_x1r  s        r-   Úcollate_linerV    sr   € ð €DØ€GÝ�z¥z°$Ñ'7Ô'7Ð8Ñ8Ô8ð ð ˆØÐ d¨4¤j°G¸iÑ4GÒ&HÐ&HØ�C‰KˆDØ�t”*ˆØ��V”ÑˆˆØ€Kr/   rï   r´   c                 ó‚   ‡— t          | t          d¦  «        |¦  «        }d                     ˆfd„|D ¦   «         ¦  «        S )Nr  rY   c              3   ó8   •K  — | ]}t          |‰¦  «        V — Œd S rm   )rV  )r`   r�   rï   s     €r-   ro   z&extract_text_simple.<locals>.<genexpr>  s-   øè è € ÐEÐE°a•\ ! [Ñ1Ô1ÐEÐEÐEÐEÐEÐEr/   )r   r   r]   )rƒ   rï   r´   Ú	clustereds    `  r-   Úextract_text_simplerZ    sE   ø€ õ
   ¥z°(Ñ';Ô';¸[ÑIÔI€IØ�9Š9ÐEÐEÐEÐE¸9ÐEÑEÔEÑEÔEÐEr/   ©Úfontnamer  rõ   .c                 óê   ‡‡‡— t          g d¢|pt          ¦   «         ¢R Ž Št          dd¦  «        Šdt          dt          t          ddf         fˆˆˆfd„} || ¦  «        }t          || j        ¬¦  «        S )	uç   
    Removes duplicate chars â€”Â those sharing the same text and positioning
    (within `tolerance`) as other characters in the set. Use extra_args to
    be more restrictive with the properties shared by the matching chars.
    )rý   r€   r  r4   rƒ   r&   Nc              3   ó6  •K  — t          | ‰¬¦  «        }t          j        |‰¬¦  «        D ]m\  }}t          t	          |¦  «        t          d¦  «        ‰¦  «        D ]<}t          |t          d¦  «        ‰¦  «        D ]}t          |‰¬¦  «        d         V — ŒŒ=Œnd S )NrÀ   r  r4   r   )rÊ   r'  r(  r   rt   r   )	rƒ   Úsorted_charsÚgrpÚ	grp_charsÚ	y_clusterÚ	x_clusterrÁ   Úpos_keyrR  s	         €€€r-   Úyield_unique_charsz(dedupe_chars.<locals>.yield_unique_chars'  sË   øè è € Ý˜e¨Ð-Ñ-Ô-ˆÝ'Ô/°À#ÐFÑFÔFð 	<ð 	<‰NˆC�Ý,Ý�Y‘”¥¨HÑ!5Ô!5°yñô ð <ð <�	õ "1Ø�z¨$Ñ/Ô/°ñ"ô "ð <ð <�Iõ ! °Ð8Ñ8Ô8¸Ô;Ð;Ð;Ð;Ð;ð<ð<ð	<ð 	<r/   rÀ   )r   Útupler   r   r   rÊ   Úindex)rƒ   rR  rõ   re  ÚdedupedrÁ   rd  s    `   @@r-   Údedupe_charsri    s¡   øøø€ õ Ð
EÐ)Ð
E¨[Ð-C½E¹G¼GÐ
EÐ
EÐ
E€CÝ˜ 4Ñ(Ô(€Gð	<¥*ð 	<µ½5À$ÈÐ;LÔ1Mð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð !Ð  Ñ'Ô'€GÝ�'˜uœ{Ð+Ñ+Ô+Ð+r/   r\   r8  )NN)r   r[  )@Úinspectr'  Úloggingr“   rû   Úoperatorr   Útypingr   r   r   r   r   r	   r
   r   r   r   Ú_typingr   r   r   r   r   r   Ú
clusteringr   Úgenericr   Úgeometryr   Ú	getLoggerr¡   rù   r9  rì   rê   rë   r   Ú__annotations__r   rÇ   r:   rB   rÉ   rH   r¥   rL   rN   r¨   rî   r�   r7  Ú	signatureré   Ú
parametersrI   rE  rD  rI  rQ  rV  rZ  ri  r*   r/   r-   ú<module>rv     s<  ðØ €€€€Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð JÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %à	ˆÔ	˜8Ñ	$Ô	$€àÐ ØÐ ØÐ ØÐ ØÐ �%Ð Ð Ñ ØÐ �%Ð Ð Ñ ð ØØØØØØðð €	ð 5ð ¨X°u°g¸u°nÔ-Eð ð ð ð ð ð ¨(°E°7¸EÀ%ÈÀ,Ô<OÐ3OÔ*Pð ð ð ð ð ˆ:�a‰=Œ=Øˆ:�a‰=Œ=Øˆ:�a‰=Œ=Øˆ:�a‰=Œ=ð	ð Ð ð ˆ:�eÑÔØˆ:�hÑÔØˆ:�dÑÔØˆ:�dÑÔð	ð €ð
ð 
 %ð 
°5ð 
À#ð 
Ètð 
ð 
ð 
ð 
ð"G
ð G
ð G
ð G
ð G
ñ G
ô G
ð G
ðT{
ð {
ð {
ð {
ð {
ñ {
ô {
ð {
ð|MVð MVð MVð MVð MVñ MVô MVð MVðb -2ðFð FØðFØ%)ðFØ=@ðFàðFð Fð Fð Fð #�Ô" 7Ô#5Ñ6Ô6ÔA×FÒFÑHÔH€Ø)˜Ô)¨-Ñ8Ô8ÔC×HÒHÑJÔJÐ ð˜Jð °#ð ¸'ð ð ð ð ð( (,Ø'+ð-ð -Øð-à˜e”_ð-ð ˜e”_ð-ð ð	-ð
 	ð-ð -ð -ð -ðd +ðð Øðàðð 	ðð ð ð ð  -Ø,ðFð FØðFàðFð ðFð 	ð	Fð Fð Fð Fð Ø-Að,ð ,Øð,àð,ð ˜%  S œ/Ô*ð,ð ð	,ð ,ð ,ð ,ð ,ð ,r/   