§
    ŒŸj¨…  ã                   ó¨  — d Z ddlZddlZddlmZ ddlZddlmZ ddlm	Z	 ddl
mZ ddlmZmZ ddlmZ  ej        e¦  «        Zd	Zd
Zej        Zej        Zej        Zej        Zej        Zd„ 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„ Z(d„ Z) G d„ de*¦  «        Z+d„ Z, G d„ d¦  «        Z- G d „ d!¦  «        Z. G d"„ d#¦  «        Z/dS )%aa  
The diff parser is trying to be a faster version of the normal parser by trying
to reuse the nodes of a previous pass over the same file. This is also called
incremental parsing in parser literature. The difference is mostly that with
incremental parsing you get a range that needs to be reparsed. Here we
calculate that range ourselves by using difflib. After that it's essentially
incremental parsing.

The biggest issue of this approach is that we reuse nodes in a mutable way. The
intial design and idea is quite problematic for this parser, but it is also
pretty fast. Measurements showed that just copying nodes in Python is simply
quite a bit slower (especially for big files >3 kLOC). Therefore we did not
want to get rid of the mutable nodes, since this is usually not an issue.

This is by far the hardest software I ever wrote, exactly because the initial
design is crappy. When you have to account for a lot of mutable state, it
creates a ton of issues that you would otherwise not have. This file took
probably 3-6 months to write, which is insane for a parser.

There is a fuzzer in that helps test this whole thing. Please use it if you
make changes here. If you run the fuzzer like::

    test/fuzz_diff_parser.py random -n 100000

you can be pretty sure that everything is still fine. I sometimes run the
fuzzer up to 24h to make sure everything is still ok.
é    N)Ú
namedtuple)Úsplit_lines)ÚParser)Ú	EndMarker)ÚPythonTokenÚBOM_UTF8_STRING)ÚPythonTokenTypesF)ÚINDENTÚERROR_DEDENTÚDEDENTc                 ó4   — | j         dk    o| j        t          v S )NÚ
error_leaf)ÚtypeÚ
token_typeÚ_INDENTATION_TOKENS©Únodes    ú^/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/parso/python/diff.pyÚ_is_indentation_error_leafr   3   s   € ØŒ9˜Ò$ÐO¨¬Õ<OÐ)OÐOó    c                 ór   — | r4t          | ¦  «        r%|                      ¦   «         } | rt          | ¦  «        °%| S ©N)r   Úget_previous_leaf©Úleafs    r   Ú!_get_previous_leaf_if_indentationr   7   sJ   € Ø
ð (Õ-¨dÑ3Ô3ð (Ø×%Ò%Ñ'Ô'ˆð ð (Õ-¨dÑ3Ô3ð (à€Kr   c                 ór   — | r4t          | ¦  «        r%|                      ¦   «         } | rt          | ¦  «        °%| S r   )r   Úget_next_leafr   s    r   Ú_get_next_leaf_if_indentationr   =   sJ   € Ø
ð $Õ-¨dÑ3Ô3ð $Ø×!Ò!Ñ#Ô#ˆð ð $Õ-¨dÑ3Ô3ð $à€Kr   c                 ó6   — t          | j        d         ¦  «        S ©Né   )Ú_get_indentationÚchildren©Ú	tree_nodes    r   Ú_get_suite_indentationr'   C   s   € Ý˜IÔ.¨qÔ1Ñ2Ô2Ð2r   c                 ó   — | j         d         S r!   )Ú	start_posr%   s    r   r#   r#   G   s   € ØÔ˜qÔ!Ð!r   c                 ó@  — 	 | j         }|D ](}|j        | k    sJ | |f¦   «         ‚t          |¦  «         Œ)dS # t          $ �r\ | j        dk    r#| j        t          v r| j        rJ ‚| j        rJ ‚Y dS t          |  
                    ¦   «         ¦  «        }|€
| j        }d}n2|j        | j        k    sJ || f¦   «         ‚|j        | j        z   }|j        }d|v sd|v rBt          |¦  «        }|d         t          |¦  «        z   dz
  }|t          |d         ¦  «        f}ne|d         |d         t          |¦  «        z   f}|                     t           ¦  «        r+|                      ¦   «         dk    r|d         |d         dz
  f}| j        |k    sJ | j        |f¦   «         ‚Y dS w xY w)	z~
    Checks if the parent/children relationship is correct.

    This is a check that only runs during debugging/testing.
    r   N)r"   r   ú
úr   r"   éÿÿÿÿ)r$   ÚparentÚ_assert_valid_graphÚAttributeErrorr   r   r   ÚvalueÚprefixr   r   Úend_posr)   r   ÚlenÚ
startswithr   Úget_start_pos_of_prefix)	r   r$   ÚchildÚprevious_leafÚcontentÚprevious_start_posÚsplittedÚlineÚactuals	            r   r/   r/   K   s
  € ð%'Ø”=ˆðD ð 	'ð 	'ˆEØ”< 4Ò'Ð'Ð'¨$°¨Ñ'Ô'Ð'Ý Ñ&Ô&Ð&Ð&ð	'ð 	'øõC ð Bñ Bð Bð Œ9˜Ò$Ð$¨¬Õ<OÐ)OÐ)OØ”zÐ!Ð!Ð!Ø”{Ð"Ð"Ð"ØˆFˆFõ :¸$×:PÒ:PÑ:RÔ:RÑSÔSˆØÐ Ø”kˆGØ!%ÐÐà Ô(¨D¬NÒ:Ð:Ð:Ø Ð%ñ ;Ô:Ð:ð $Ô)¨D¬KÑ7ˆGØ!.Ô!8Ðà�7ˆ?ˆ?˜d g˜o˜oÝ" 7Ñ+Ô+ˆHØ% aÔ(­3¨x©=¬=Ñ8¸1Ñ<ˆDØ�3˜x¨œ|Ñ,Ô,Ð,ˆFˆFà'¨Ô*Ð,>¸qÔ,AÅCÈÁLÄLÑ,PÐPˆFØ×!Ò!¥/Ñ2Ô2ð 2Ø×4Ò4Ñ6Ô6¸&Ò@Ð@à œ F¨1¤I°¡MÐ1�àŒ~ Ò'Ð'Ð'¨$¬.¸&Ð)AÑ'Ô'Ð'Ð'Ð'Ð'ð?Bøøøs   ‚6 ¶6FÁ/D*FÆFc                 ó|  — 	 | j         }	 |j         }n·# t          $ r J | |f¦   «         ‚w xY w# t          $ r� t          |d¦  «        rJ | |f¦   «         ‚| j        |j        k    sJ | |f¦   «         ‚| j        |j        k    sJ | |f¦   «         ‚| j        |j        k    sJ | |f¦   «         ‚| j        |j        k    sJ | |f¦   «         ‚Y d S w xY wt          ||¦  «        D ]\  }}t          ||¦  «         Œt          |¦  «        t          |¦  «        k    s-J dt          |¦  «        z   dz   t          |¦  «        z   ¦   «         ‚d S )NFr$   r+   )r$   r0   Úhasattrr1   r   r2   r)   ÚzipÚ_assert_nodes_are_equalr4   Úrepr)Únode1Únode2Ú	children1Ú	children2Ún1Ún2s         r   rA   rA   y   sŒ  € ð)Ø”Nˆ	ð	)ØœˆIˆIøÝð 	)ð 	)ð 	)Ø(˜5 %˜.Ñ(Ô(Ð(ð	)øøøøõ ð ð ð Ý˜5 *Ñ-Ô-Ð=Ð=°°u¨~Ñ=Ô=Ð=ØŒ{˜eœkÒ)Ð)Ð)¨E°5¨>Ñ)Ô)Ð)ØŒz˜UœZÒ'Ð'Ð'¨%°¨Ñ'Ô'Ð'ØŒ|˜uœ|Ò+Ð+Ð+¨e°U¨^Ñ+Ô+Ð+ØŒ %¤/Ò1Ð1Ð1°E¸5°>Ñ1Ô1Ð1Øˆˆðøøøõ �i Ñ+Ô+ð (ð (‰ˆˆBÝ  BÑ'Ô'Ð'Ð'Ýˆy‰>Œ>�S ™^œ^Ò+Ð+Ð+¨TµD¸±O´OÑ-CÀdÑ-JÍTÐR[É_Ì_Ñ-\Ñ+Ô+Ð+Ð+Ð+s   ‚, Š ’)¬BCÃCc                 ó  — t          |                      ¦   «         d¬¦  «        }t          j        ||¦  «        }t          j        ||¦  «        }dd l}d|j        ›dd                     |¦  «        ›dd                     |¦  «        ›�S )NT©Úkeependsr   z=There's an issue with the diff parser. Please report (parso vz) - Old/New:
Ú z
Actual Diff (May be empty):
)r   Úget_codeÚdifflibÚunified_diffÚparsoÚ__version__Újoin)ÚmoduleÚ	old_linesÚ	new_linesÚcurrent_linesÚcurrent_diffÚold_new_diffrP   s          r   Ú_get_debug_error_messagerY   �   s‹   € Ý §¢Ñ 1Ô 1¸DÐAÑAÔA€MÝÔ'¨	°=ÑAÔA€LÝÔ'¨	°9Ñ=Ô=€LØ€L€L€L€Lð ÔÐÐ˜bŸgšg lÑ3Ô3Ð3Ð3°R·W²W¸\Ñ5JÔ5JÐ5Jð	Lðr   c                 óì   — |                       ¦   «         }t          |¦  «        r|j        d         S |                     ¦   «         }|j        dk    rd|j        v r|j        d         dz   S |j        d         S )Nr   Ú	endmarkerr+   r"   )Úget_last_leafÚ_ends_with_newliner)   r   r   r2   r3   )Únode_or_leafÚ	last_leafÚns      r   Ú_get_last_linera   ™   s~   € Ø×*Ò*Ñ,Ô,€IÝ˜)Ñ$Ô$ð $ØÔ" 1Ô%Ð%à×#Ò#Ñ%Ô%ˆØŒ6�[Ò Ð  T¨Q¬XÐ%5Ð%5ð Ô$ QÔ'¨!Ñ+Ð+ØÔ  Ô#Ð#r   c                 óŽ   — | �B| j         dk    r7| j        dk    r,|                      ¦   «         } | �| j         dk    r| j        dk    °,| S )Nr   r   )r   r   r   r   s    r   Ú_skip_dedent_error_leavesrc   ª   sX   € Ø
Ð
˜tœy¨LÒ8Ð8¸T¼_ÐPXÒ=XÐ=XØ×%Ò%Ñ'Ô'ˆð Ð
˜tœy¨LÒ8Ð8¸T¼_ÐPXÒ=XÐ=Xà€Kr   rL   c                 óØ   — t          | ¦  «        } | j        dk    r| j                             ¦   «         }n| j        }|dk    p)|                     d¦  «        p|                     d¦  «        S )Nr   Únewliner+   r,   )rc   r   r   ÚlowerÚendswith)r   ÚsuffixÚtyps      r   r]   r]   °   se   € Ý$ TÑ*Ô*€Dà„y�LÒ Ð ØŒo×#Ò#Ñ%Ô%ˆˆàŒiˆà�)ÒÐM˜vŸš¨tÑ4Ô4ÐM¸¿ºÈÑ8MÔ8MÐMr   c                 ó(   — |D ]}|j         dv r dS ŒdS )zg
    if, while, for and try might not be finished, because another part might
    still be parsed.
    )Úif_stmtÚ
while_stmtÚfor_stmtÚtry_stmtFT)Únonterminal©Úpgen_grammarÚstackÚ
stack_nodes      r   Ú_flows_finishedrt   »   s4   € ð
 ð ð ˆ
ØÔ!Ð%VÐVÐVØ�5�5ð Wàˆ4r   c                 óœ   — | j         dk    r| j        d         } | j         dv r| j        d         } | j         dv o| j        d         j         dk    S )NÚ	decoratedr-   ©Úasync_funcdefÚ
async_stmt©ÚclassdefÚfuncdefÚsuite)r   r$   r   s    r   Ú_func_or_class_has_suiter~   Æ   sW   € Ø„y�KÒÐØŒ}˜RÔ ˆØ„yÐ3Ð3Ð3ØŒ}˜RÔ ˆØŒ9Ð/Ð/ÐU°D´MÀ"Ô4EÔ4JÈgÒ4UÐUr   c                 ó´   — t          | |¦  «        sdS t          |¦  «        D ]5}|j        dk    r dS |j        dk    rt          |j        ¦  «        dk    c S Œ6dS )NFÚ	decoratorr}   r"   T)rt   Úreversedro   r4   Únodesrp   s      r   Ú_suite_or_file_input_is_validrƒ   Î   sy   € Ý˜<¨Ñ/Ô/ð Øˆuå˜u‘o”oð -ð -ˆ
ØÔ! [Ò0Ð0à�5�5àÔ! WÒ,Ð,å�zÔ'Ñ(Ô(¨1Ò,Ð,Ð,Ð,ð -ð
 ˆ4r   c                 ó„   — | j         dk    r| j        d         } 	 | j        d         j        }n# t          $ r Y dS w xY w|dv S )Nry   r"   r   F)ÚifÚforÚwhileÚtryÚwith)r   r$   r1   r0   )r   r1   s     r   Ú_is_flow_noderŠ   ß   s_   € Ø„y�LÒ Ð ØŒ}˜QÔˆðØ”˜aÔ Ô&ˆˆøÝð ð ð ØˆuˆuðøøøàÐ9Ð9Ð9s   š- ­
;º;c                   ó   — e Zd ZdS )Ú_PositionUpdatingFinishedN)Ú__name__Ú
__module__Ú__qualname__© r   r   rŒ   rŒ   é   s   € € € € € Ø€Dr   rŒ   c                 ó˜   — | D ]F}	 |j         }t          |||¦  «         Œ# t          $ r |xj        |z  c_        ||u rt          ‚Y ŒCw xY wd S r   )r$   Ú_update_positionsr0   r<   rŒ   )r‚   Úline_offsetr_   r   r$   s        r   r’   r’   í   s‰   € Øð 	@ð 	@ˆð	@Ø”}ˆHõ ˜h¨°YÑ?Ô?Ð?Ð?øõ ð 	0ð 	0ð 	0àˆIŒI˜Ñ$ˆIŒIØ�yÐ Ð Ý/Ð/ð !Ð ð	0øøøð	@ð 	@s   †Ÿ%AÁAc                   óJ   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zdd„ZdS )Ú
DiffParserz�
    An advanced form of parsing a file faster. Unfortunately comes with huge
    side effects. It changes the given module.
    c                 ó0   — || _         || _        || _        d S r   )Ú_pgen_grammarÚ
_tokenizerÚ_module)Úselfrq   Ú	tokenizerrS   s       r   Ú__init__zDiffParser.__init__ÿ   s   € Ø)ˆÔØ#ˆŒØˆŒˆˆr   c                 óT   — d| _         d| _        t          | j        ¦  «        | _        d S ©Nr   )Ú_copy_countÚ_parser_countÚ
_NodesTreer™   Ú_nodes_tree©rš   s    r   Ú_resetzDiffParser._reset  s*   € ØˆÔØˆÔå% d¤lÑ3Ô3ˆÔÐÐr   c           	      ó`  — t                                d¦  «         d| j        _        || _        |                      ¦   «          t          |¦  «        }t          j        d|| j        ¦  «        }| 	                    ¦   «         }t                                dt          |¦  «        ›d|›�¦  «         |D ]­\  }}}}	}
t                                d||dz   ||	dz   |
¦  «         |
|k    r|d         dk    r|
dz  }
|d	k    r!|	|z
  }|  
                    ||dz   ||
¦  «         Œk|d
k    r|                      |
¬¦  «         Œˆ|dk    r|                      |
¬¦  «         Œ¥|dk    sJ ‚Œ®| j                             ¦   «          t          rÍ	 d                     |¦  «        }| j                             ¦   «         |k    sJ ‚t#          | j        ¦  «         t%          | j        d¬¦  «                             |                      |¦  «        ¦  «        }t-          | j        |¦  «         n2# t.          $ r% t1          t3          | j        ||¦  «        ¦  «         ‚ w xY w| j        j        d         }||k    r-t7          d|›d|›d�t3          | j        ||¦  «        z   ¦  «        ‚t                                d¦  «         | j        S )añ  
        The algorithm works as follows:

        Equal:
            - Assure that the start is a newline, otherwise parse until we get
              one.
            - Copy from parsed_until_line + 1 to max(i2 + 1)
            - Make sure that the indentation is correct (e.g. add DEDENT)
            - Add old and change positions
        Insert:
            - Parse from parsed_until_line + 1 to min(j2 + 1), hopefully not
              much more.

        Returns the new module node.
        zdiff parser startNzline_lengths old: z; new: z!-> code[%s] old[%s:%s] new[%s:%s]r"   r-   rL   ÚequalÚreplace)Ú
until_lineÚinsertÚdeleteT©Úerror_recoveryr   ú(z != z) zdiff parser end)ÚLOGÚdebugr™   Ú_used_namesÚ_parser_lines_newr¤   r4   rN   ÚSequenceMatcherÚget_opcodesÚ_copy_from_old_parserÚ_parser¢   ÚcloseÚDEBUG_DIFF_PARSERrR   rM   r/   r   r—   Úparser˜   rA   ÚAssertionErrorÚprintrY   r3   Ú	Exception)rš   rT   rU   Úline_lengthÚsmÚopcodesÚ	operationÚi1Úi2Új1Új2r“   ÚcodeÚwithout_diff_parser_moduleÚlast_poss                  r   ÚupdatezDiffParser.update
  sé  € õ  	�	Š	Ð%Ñ&Ô&Ð&à#'ˆŒÔ à!*ˆÔà�Š‰Œˆå˜)‘n”nˆÝÔ$ T¨9°dÔ6LÑMÔMˆØ—.’.Ñ"Ô"ˆÝ�	Š	ˆ	µS¸±^´^°^°^À[À[ÐQÑRÔRÐRà)0ð 	-ð 	-Ñ%ˆI�r˜2˜r 2Ý�IŠIÐ9Ø  a¡¨¨R°!©V°Rñ9ô 9ð 9ð �[Ò Ð  Y¨r¤]°bÒ%8Ð%8à�a‘�à˜GÒ#Ð#Ø  2™g�Ø×*Ò*¨;¸¸Q¹ÀÀBÑGÔGÐGÐGØ˜iÒ'Ð'Ø—’ r�Ñ*Ô*Ð*Ð*Ø˜hÒ&Ð&Ø—’ r�Ñ*Ô*Ð*Ð*à  HÒ,Ð,Ð,Ð,Ð,ð 	Ô×ÒÑ Ô Ð åð 	ðØ—w’w˜yÑ)Ô)�Ø”|×,Ò,Ñ.Ô.°$Ò6Ð6Ð6Ð6Ý# D¤LÑ1Ô1Ð1Ý-3ØÔ&Ø#'ð.ñ .ô .÷ ’%˜Ÿš¨	Ñ2Ô2Ñ3Ô3ð +õ (¨¬Ð6PÑQÔQÐQÐQøÝ!ð ð ð ÝÕ.¨t¬|¸YÈ	ÑRÔRÑSÔSÐSØðøøøð ”<Ô'¨Ô*ˆØ�{Ò"Ð"Ý�)Ø"* ( (¨K¨K¨KÐ8Ý*¨4¬<¸ÀIÑNÔNñOñô ð õ 	�	Š	Ð#Ñ$Ô$Ð$ØŒ|Ðs   Å>BH È/Ic                 óî   — | j                              ¦   «         d                     |¦  «        k    rDt                               dd                     |¦  «        d                     |¦  «        ¦  «         d S d S )NrL   zparser issue:
%s
%s)r™   rM   rR   r®   Úwarning)rš   rT   Ú	lines_news      r   Ú_enabled_debuggingzDiffParser._enabled_debuggingV  sd   € ØŒ<× Ò Ñ"Ô" b§g¢g¨iÑ&8Ô&8Ò8Ð8Ý�KŠKÐ/°·²¸Ñ1CÔ1CÀRÇWÂWÈYÑEWÔEWÑXÔXÐXÐXÐXð 9Ð8r   c                 óh  — d}|| j         j        k    �rž| j         j        |z
  }|                      |dz   ¦  «        }|€$|                      | j         j        dz   ¦  «         �n|j        j        }|                     |¦  «        }	|dk    r:|d                              ¦   «         j         	                    t          ¦  «        rg }
n3| j         j        dz   }| j                              ||	d …         ||¦  «        }
|
r`| xj        dz  c_        | j         j        }t                               d|
d         j        d         |
d         j        d         dz
  ||¦  «         n"|                      | j         j        dz   ¦  «         || j         j        k    s
J |¦   «         ‚| j         j        }|| j         j        k    �°œd S d S )Nr-   r"   r   zcopy old[%s:%s] new[%s:%s])r¢   Úparsed_until_lineÚ_get_old_line_stmtrµ   r.   r$   ÚindexÚget_first_leafr2   r5   r   Ú
copy_nodesrŸ   r®   r¯   r)   r3   )rš   r“   Ústart_line_oldÚuntil_line_oldÚuntil_line_newÚlast_until_lineÚparsed_until_line_oldÚ	line_stmtÚ
p_childrenrÏ   Úcopied_nodesÚfrom_Útos                r   r´   z DiffParser._copy_from_old_parserZ  sÞ  € ØˆØ˜tÔ/ÔAÒAÑAØ$(Ô$4Ô$FÈÑ$TÐ!Ø×/Ò/Ð0EÈÑ0IÑJÔJˆIØÐ ð —’˜DÔ,Ô>ÀÑBÑCÔCÐCÑCà&Ô-Ô6�
Ø"×(Ò(¨Ñ3Ô3�à! QÒ&Ð&Ø& qœM×8Ò8Ñ:Ô:ÔA×LÒLÍ_Ñ]Ô]ð 'ð $&�L�Là Ô,Ô>ÀÑB�EØ#'Ô#3×#>Ò#>Ø" 5 6 6Ô*Ø&Ø#ñ$ô $�Lð  ð HØÐ$Ô$¨Ñ)Ð$Ô$àÔ)Ô;�Bå—I’IÐ:Ø*¨1œoÔ7¸Ô:Ø*¨2Ô.Ô6°qÔ9¸AÑ=¸uÀbñJô Jð Jð Jð —K’K Ô 0Ô BÀQÑ FÑGÔGÐGð # dÔ&6Ô&HÒHÐHÐHÈ/ÑHÔHÐHØ"Ô.Ô@ˆOðQ ˜tÔ/ÔAÒAÑAÐAÐAÐAÐAr   c                 ó4  — | j                              |dfd¬¦  «        }t          |¦  «        r|                     ¦   «         }|                     ¦   «         d         |k    r8|}|j        j        dvr|j        }|j        j        dv°|j        d         |k    r|S d S )Nr   T)Úinclude_prefixes)Ú
file_inputr}   )r™   Úget_leaf_for_positionr]   r   r6   r.   r   r)   )rš   Úold_liner   r   s       r   rÎ   zDiffParser._get_old_line_stmt†  s¬   € ØŒ|×1Ò1°8¸Q°-ÐRVÐ1ÑWÔWˆå˜dÑ#Ô#ð 	(Ø×%Ò%Ñ'Ô'ˆDØ×'Ò'Ñ)Ô)¨!Ô,°Ò8Ð8ØˆDØ”+Ô"Ð*AÐAÐAØ”{�ð ”+Ô"Ð*AÐAÐAð
 Œ~˜aÔ  HÒ,Ð,Ø�àˆtr   c                 óî  — d}|| j         j        k    râ|                      |¦  «        }|j        }| j                              || j        ¦  «         | j        �| j        | j         j        d<   t           	                    d|d          
                    ¦   «         d         | j         j        |j        d         dz
  ¦  «         || j         j        k    s
J |¦   «         ‚| j         j        }|| j         j        k    °àdS dS )zy
        Parses at least until the given line, but might just parse more until a
        valid state is reached.
        r   Nr-   z/parse_part from %s to %s (to %s in part parser)r"   )r¢   rÍ   Ú_try_parse_partr$   Úadd_parsed_nodesÚ_keyword_token_indentsÚ_replace_tos_indentÚindentsr®   r¯   r6   r3   )rš   r¨   rÕ   r   r‚   s        r   rµ   zDiffParser._parse—  sÿ   € ð
 ˆØ˜4Ô+Ô=Ò=Ð=Ø×'Ò'¨
Ñ3Ô3ˆDØ”MˆEàÔ×-Ò-¨e°TÔ5PÑQÔQÐQØÔ'Ð3Ø/3Ô/G�Ô Ô(¨Ñ,å�IŠIØAØ�a”×0Ò0Ñ2Ô2°1Ô5ØÔ Ô2Ø”˜Q” !Ñ#ñ	ô ð ð # dÔ&6Ô&HÒHÐHÐHÈ/ÑHÔHÐHØ"Ô.Ô@ˆOð% ˜4Ô+Ô=Ò=Ð=Ð=Ð=Ð=Ð=r   c                 óô   — | xj         dz  c_         | j        j        }| j        |d…         }|                      |||¬¦  «        }t          | j        d¬¦  «        | _        | j                             |¬¦  «        S )z²
        Sets up a normal parser that uses a spezialized tokenizer to only parse
        until a certain position (or a bit longer if the statement hasn't
        ended.
        r"   N)r“   Tr«   )Útokens)	r    r¢   rÍ   r±   Ú_diff_tokenizer   r—   Ú_active_parserr¸   )rš   r¨   rÍ   Úlines_afterrè   s        r   râ   zDiffParser._try_parse_part±  s›   € ð 	ÐÔ˜aÑÐÔð !Ô,Ô>ÐØÔ,Ð->Ð-?Ð-?Ô@ˆØ×$Ò$ØØØ)ð %ñ 
ô 
ˆõ
 %ØÔØð
ñ 
ô 
ˆÔð Ô"×(Ò(°Ð(Ñ7Ô7Ð7r   r   c              #   óô  K  — d}| j         j        }t          |¦  «        }|                      ||dz   df||dk    ¬¦  «        }| j        j        }d | _        i | _        |D �]˜}	|	j        }
|
t          k    rãt          |¦  «        |k     rÏ	 t          |¦  «        x\  }
}}}}	|
t          t          fv r|
t          k    r|d         dz   | _        	 nnŒEd|v sd|v rt          j        dd	|¦  «        }nN|d         t          |¦  «        k    sJ t          |¦  «        ¦   «         ‚|d         t          |¦  «        z
  dk    rd	}t          t           d	||¦  «        V —  d S nl|
t"          k    r|	j        d         |k    rd}nM|rKd}t          |¦  «        |k    r6t'          | j        |¦  «        r!t          t           d	|	j        d	¦  «        V —  d S |
t*          k    r%|	j        d
v rt/          |¦  «        | j        |	j        <   |	V — �Œšd S )NFr"   r   )r)   ræ   Úis_first_tokenTr+   r,   z
[^\n\r]+\ZrL   )ÚclassÚdef)r¢   ræ   r4   r˜   rê   rr   rå   rä   r   r   Únextr   ÚreÚsubrB   r   Ú	ENDMARKERÚNEWLINEr)   rƒ   r—   ÚNAMEÚstringÚlist)rš   Úlinesr¨   r“   Úwas_newlineræ   Úinitial_indentation_countrè   rr   Útokenri   rö   r)   r2   s                 r   ré   zDiffParser._diff_tokenizeÇ  s[  è è € ØˆØÔ"Ô*ˆÝ$'¨¡L¤LÐ!à—’ØØ" Q‘¨Ð*ØØ&¨!Ò+ð	 !ñ 
ô 
ˆð Ô#Ô)ˆØ#'ˆÔ Ø&(ˆÔ#àð ,	ñ ,	ˆEà”*ˆCØ•fŠ}ˆ}Ý�w‘<”<Ð";Ò;Ð;ð
"ÝAEÀfÁÄÐMÑ6˜˜V Y°¸Ø¥6­<Ð"8Ð8Ð8Ø"¥lÒ2Ð2ð <EÀQ¼<È!Ñ;K Ô 8Ø $øà!ð
"ð ˜v�~�~¨°¨¨Ý!#¤¨°r¸6Ñ!BÔ!B˜˜à(¨œ|­s°6©{¬{Ò:Ð:Ð:½DÀ¹L¼LÑ:Ô:Ð:Ø$ Qœ<­#¨f©+¬+Ñ5¸Ò:Ð:Ø%'˜FÝ%Ý! 2Ø!Øñô ð ð ð ð
 �E�Eð5 <ð6 �’� E¤O°AÔ$6¸*Ò$DÐ$DØ"��Øð Ø#�Ý�w‘<”<Ð#<Ò<Ð<å4°TÔ5GÈÑOÔOð Ý)­)°R¸¼È"ÑMÔMÐMÐMÐMØ˜˜à•dŠ{ˆ{˜uœ|Ð/?Ð?Ð?Ý?CÀG¹}¼}�Ô+¨E¬OÑ<àˆKˆKˆK‰KðY,	ð ,	r   N)r   )r�   rŽ   r�   Ú__doc__rœ   r¤   rÇ   rË   r´   rÎ   rµ   râ   ré   r�   r   r   r•   r•   ú   s¸   € € € € € ðð ðð ð ð
4ð 4ð 4ðJð Jð JðXYð Yð Yð*Að *Að *AðXð ð ð"Að Að Að48ð 8ð 8ð,;ð ;ð ;ð ;ð ;ð ;r   r•   c                   óR   — e Zd Z edd¦  «        Zdd„Zd„ Zd„ Z	 	 dd„Zd	„ Z	d
„ Z
dS )Ú_NodesTreeNodeÚ_ChildrenGroupz1prefix children line_offset last_line_offset_leafNr   c                 óL   — || _         g | _        || _        g | _        || _        d S r   )r&   Ú_children_groupsr.   Ú_node_childrenÚindentation)rš   r&   r.   r  s       r   rœ   z_NodesTreeNode.__init__
  s.   € Ø"ˆŒØ "ˆÔØˆŒØ ˆÔØ&ˆÔÐÐr   c                 óf  — g }| j         D ]k\  }}}}t          |d                              ¦   «         ¦  «        }||j        z   |_        |dk    r#	 t	          |||¦  «         n# t
          $ r Y nw xY w||z  }Œl|| j        _        |D ]}| j        |_        Œ| j	        D ]}| 
                    ¦   «          Œd S rž   )r  r   rÐ   r2   r’   rŒ   r&   r$   r.   r  Úfinish)	rš   r$   r2   Úchildren_partr“   Úlast_line_offset_leafÚ
first_leafr   Ú
node_childs	            r   r  z_NodesTreeNode.finish  s  € ØˆØIMÔI^ð 	&ð 	&ÑEˆF�M ;Ð0EÝ6Ø˜aÔ ×/Ò/Ñ1Ô1ñô ˆJð !'¨Ô):Ñ :ˆJÔØ˜aÒÐðÝ%Ø% {Ð4IñKô Kð Kð Køå0ð ð ð Ø�Dðøøøà˜Ñ%ˆHˆHØ"*ˆŒÔàð 	)ð 	)ˆDØœ.ˆDŒKˆKàÔ-ð 	 ð 	 ˆJØ×ÒÑÔÐÐð	 ð 	 s   ÁA Á 
A-Á,A-c                 ó:   — | j                              |¦  «         d S r   )r  Úappend)rš   Ú
child_nodes     r   Úadd_child_nodez_NodesTreeNode.add_child_node(  s   € ØÔ×"Ò" :Ñ.Ô.Ð.Ð.Ð.r   c                 ó¢   — |€|d                               ¦   «         }|                      ||||¦  «        }| j                             |¦  «         d S ©Nr-   )r\   rÿ   r  r  )rš   r2   r$   r“   r  Úgroups         r   Úadd_tree_nodesz_NodesTreeNode.add_tree_nodes+  s\   € à Ð(Ø$,¨R¤L×$>Ò$>Ñ$@Ô$@Ð!Ø×#Ò#Ø�H˜kÐ+@ñ
ô 
ˆð 	Ô×$Ò$ UÑ+Ô+Ð+Ð+Ð+r   c                 ó¾  — d}| j         rK| j         d         }t          |j        ¦  «        }|j        d         |j        z   }t          ||¦  «        r|dz  }|t          t          |¦  «        ¦  «        dz
  z  }|r/|                     d¦  «        s|                     d¦  «        s|dz  }| j	        r.t          || j	        d                              |¦  «        ¦  «        S |S )Nr   r-   r"   r+   r,   )r  r   r  r3   r“   r]   r4   r   rg   r  ÚmaxÚget_last_line)rš   rh   r<   Úchildren_groupr_   s        r   r  z_NodesTreeNode.get_last_line4  sõ   € ØˆØÔ ð 	Ø!Ô2°2Ô6ˆNÝ9ØÔ4ñô ˆIð Ô$ QÔ'¨.Ô*DÑDˆDõ " )¨VÑ4Ô4ð Ø˜‘	�Ø••K Ñ'Ô'Ñ(Ô(¨1Ñ,Ñ,ˆàð 	˜&Ÿ/š/¨$Ñ/Ô/ð 	¸¿ºÈÑ8MÔ8Mð 	à�A‰IˆDàÔð 	LÝ�t˜TÔ0°Ô4×BÒBÀ6ÑJÔJÑKÔKÐKØˆr   c                 ó2   — d| j         j        ›d| j        ›d�S )Nú<z: ú>)Ú	__class__r�   r&   r£   s    r   Ú__repr__z_NodesTreeNode.__repr__L  s    € € Ø!œ^Ô4Ð4Ð4°d´n°n°nÐEÐEr   rž   )r   N)r�   rŽ   r�   r   rÿ   rœ   r  r  r  r  r  r�   r   r   rþ   rþ     sœ   € € € € € Ø�ZØØ;ñ=ô =€Nð'ð 'ð 'ð 'ð ð  ð  ð./ð /ð /ð <=Ø-1ð,ð ,ð ,ð ,ðð ð ð0Fð Fð Fð Fð Fr   rþ   c                   ó^   — e Zd Zd„ Zed„ ¦   «         Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Z	 dd„Zd„ ZdS )r¡   c                 ó‚   — t          |¦  «        | _        | j        g| _        || _        d| _        d| _        dg| _        d S )NrL   r   )rþ   Ú
_base_nodeÚ_working_stackr™   Ú_prefix_remainderr2   ræ   )rš   rS   s     r   rœ   z_NodesTree.__init__Q  sA   € Ý(¨Ñ0Ô0ˆŒØ#œÐ/ˆÔØˆŒØ!#ˆÔØˆŒØ�sˆŒˆˆr   c                 óL   — | j         d                              | j        ¦  «        S r  )r  r  r2   r£   s    r   rÍ   z_NodesTree.parsed_until_lineY  s    € àÔ" 2Ô&×4Ò4°T´[ÑAÔAÐAr   c                 ó¼   — t          t          | j        ¦  «        ¦  «        D ]9}|j        |k     s|| j        d         u r|c S | j                             ¦   «          Œ:d S rž   )r�   r÷   r  r  Úpop)rš   r  r   s      r   Ú_update_insertion_nodez!_NodesTree._update_insertion_node]  so   € Ý�T $Ô"5Ñ6Ô6Ñ7Ô7ð 	&ð 	&ˆDØÔ +Ò-Ð-°¸Ô9LÈQÔ9OÐ1OÐ1OØ���ØÔ×#Ò#Ñ%Ô%Ð%Ð%ð	&ð 	&r   c                 óZ  — | j         }|                      |¦  «        }|s|| j         z   | _         d S |d         j        dk    sJ ‚|                      |d         j        d         ¦  «        }|j        j        dv sJ ‚|                     ||¦  «         |                      |d         |¦  «         d S )Nr   re   r"   )r}   rÞ   r-   )r2   Ú_remove_endmarkerr   r#  r)   r&   r  Ú_update_parsed_node_tos)rš   Ú
tree_nodesÚkeyword_token_indentsÚ
old_prefixr   s        r   rã   z_NodesTree.add_parsed_nodesc  s¼   € Ø”[ˆ
Ø×+Ò+¨JÑ7Ô7ˆ
Øð 	Ø$ t¤{Ñ2ˆDŒKØˆFà˜!Œ}Ô! YÒ.Ð.Ð.Ð.à×*Ò*¨:°a¬=Ô+BÀ1Ô+EÑFÔFˆØŒ~Ô"Ð&=Ð=Ð=Ð=Ð=Ø×Ò˜J¨
Ñ3Ô3Ð3à×$Ò$ Z°¤^Ð5JÑKÔKÐKÐKÐKr   c                 óò  — |j         dk    r¹|j        j        d         }t          |||j                 d         ¬¦  «        }|                     dt          |j        ¦  «        ¦  «         | j        d                              |¦  «         | j         	                    |¦  «         |  
                    |j        d         |¦  «         d S t          |¦  «        r#|  
                    |j        d         |¦  «         d S d S )Nr}   r   r-   ©r  rL   )r   r.   r$   rþ   r)   r  r÷   r  r  r  r&  r~   )rš   r&   r(  Údef_leafÚnew_toss        r   r&  z"_NodesTree._update_parsed_node_tosr  s  € ØŒ>˜WÒ$Ð$Ø Ô'Ô0°Ô3ˆHÝ$ØØ1°(Ô2DÔEÀbÔIðñ ô ˆGð ×"Ò" 2¥t¨IÔ,>Ñ'?Ô'?Ñ@Ô@Ð@àÔ Ô#×2Ò2°7Ñ;Ô;Ð;ØÔ×&Ò& wÑ/Ô/Ð/à×(Ò(¨Ô);¸BÔ)?ÐAVÑWÔWÐWÐWÐWÝ% iÑ0Ô0ð 	XØ×(Ò(¨Ô);¸BÔ)?ÐAVÑWÔWÐWÐWÐWð	Xð 	Xr   c                 ó„  — |d                               ¦   «         }|j        dk    }d| _        |rr|j        }t	          |                     d¦  «        |                     d¦  «        ¦  «        }|dk    r/|j        d|dz   …         |j        |dz   d…         c|_        | _        d| _        |r|j        | _        |dd…         }|S )zE
        Helps cleaning up the tree nodes that get inserted.
        r-   r[   rL   r+   r,   Nr"   )r\   r   r  r2   r  Úrfind)rš   r'  r_   Úis_endmarkerr2   Ú
separations         r   r%  z_NodesTree._remove_endmarker‚  sÓ   € ð ˜r”N×0Ò0Ñ2Ô2ˆ	Ø ”~¨Ò4ˆØ!#ˆÔØð 	YØÔ%ˆFÝ˜VŸ\š\¨$Ñ/Ô/°·²¸dÑ1CÔ1CÑDÔDˆJØ˜BŠˆð
 Ô$ _ j°1¡n _Ô5°yÔ7GÈ
ÐUVÉÈÈÔ7Xð 9�	Ô  $Ô"8ð ˆŒàð 	)Ø#Ô*ˆDŒKà# C R CœˆJØÐr   c              #   óê   K  — t          |¦  «        }|rt          |¦  «        V — t          |¦  «        }t          |¦  «        }|s|| j        vrd S |V — |D ]}t          |¦  «        |k    r d S |V — Œd S r   )Úiterrð   r#   ræ   )rš   r'  Úis_new_suiteÚnode_iteratorÚ
first_nodeÚindentr`   s          r   Ú_get_matching_indent_nodesz%_NodesTree._get_matching_indent_nodes›  s®   è è € õ
 ˜ZÑ(Ô(ˆØð 	&Ý�}Ñ%Ô%Ð%Ð%Ð%å˜-Ñ(Ô(ˆ
Ý! *Ñ-Ô-ˆØð 	 ¨d¬lÐ :Ð :ØˆFØÐÐÐàð 	ð 	ˆAÝ Ñ"Ô" fÒ,Ð,Ø��ØˆGˆGˆGˆGð	ð 	r   c                 óÀ  ‡	— |d         j         dv rg S t          |d         ¦  «        Š	t          | j        ¦  «        }| j        }| j        }ˆ	fd„| j        D ¦   «         | _        |                      ‰	¦  «         |                      t          | j        ¦  «        |||| j        ¦  «        \  }| _        | _        }|r| xj        |z  c_        n|| _        || _        || _        |S )zy
        Copies tree nodes from the old parser tree.

        Returns the number of tree nodes that were copied.
        r   ©r   Ú
error_nodec                 ó    •— g | ]
}|‰k    ¯|‘ŒS r�   r�   )Ú.0Úir  s     €r   ú
<listcomp>z)_NodesTree.copy_nodes.<locals>.<listcomp>¾  s#   ø€ ÐDÐDÐD˜a°1¸Ò3CÐ3C˜Ð3CÐ3CÐ3Cr   )r   r#   r÷   r  r2   ræ   r#  Ú_copy_nodes)
rš   r'  r¨   r“   Úold_working_stackr)  Úold_indentsÚ	new_nodesÚadded_indentsr  s
            @r   rÑ   z_NodesTree.copy_nodes¯  sù   ø€ ð �aŒ=ÔÐ!=Ð=Ð=ð ˆIå& z°!¤}Ñ5Ô5ˆÝ  Ô!4Ñ5Ô5ÐØ”[ˆ
Ø”lˆØDÐDÐDÐD 4¤<ÐDÑDÔDˆŒà×#Ò# KÑ0Ô0Ð0àEI×EUÒEUÝ�Ô$Ñ%Ô%ØØØØŒKñF
ô F
ÑBˆ	�4Ô&¨¬°]ð ð 	'ØˆLŒL˜MÑ)ˆLŒLˆLà"3ˆDÔØ$ˆDŒKØ&ˆDŒLØÐr   rL   Fc                 óÌ  — g }g }t          |                      ||¬¦  «        ¦  «        }d}	|D ]ù}
|
j        d         |k    r nå|
j        dk    r nØ|
j        dk    r|
j        dv r nÂt          |
¦  «        |k    r&t          |
¦  «        r|                     |
¦  «          n‰	 |
j        }|
}|j        dk    r|j        d         }|j        d	v r|j        d         }|j        d
v r|j        d         }n|d         }|j        dv r n'n# t          $ r Y nw xY w|                     |
¦  «         Œú|r·|rµ|d         }|j        dv st          |d         ¦  «        rUd}	|                     ¦   «          |r<|d         }|                     ¦   «         j        dk    rn|                     ¦   «          |°<Œ}t          |¦  «        dk    r&|d         j        dk    r|                     ¦   «          Œ¶	 |sg |||fS |d         }|d         }d}t          |¦  «        rÛ|}|j        dk    r|j        d         }|j        dk    °t          |¦  «        }|                     |¦  «         t          |t!          |¦  «        ¬¦  «        }|                      ||gz   |j        ||d¬¦  «        \  }}}	}||z  }t          |¦  «        dk     r|                     ¦   «          d}	n|sJ ‚|                     |¦  «         |}d}|rút'          |d                              ¦   «         ¦  «        s8|s6|d                              ¦   «         j        }t-          |d¬¦  «        d         }	|r^|d         }|j        dk    r|j        d         }|j        d	v r|j        d         }|j        d                              ¦   «         }|dk    sJ ‚n|d                              ¦   «         }|                     ||||¦  «         |	}d| _        ||||fS )N)r4  rL   r   r[   r   )r   r   rv   r-   rw   rz   r:  re   r"   éþÿÿÿr;  Fr}   r+  T)Ú	is_nestedé   rJ   ú:)r÷   r8  r)   r   r   ra   r~   r  r$   r0   rŠ   r"  r\   r4   r'   rþ   r#   r@  r  r]   r   r2   r   r  r  )rš   Úworking_stackr‚   r¨   r“   r2   rG  rC  rD  Ú
new_prefixr   Úcr`   Ú
suite_nodeÚ	last_nodeÚtosÚhad_valid_suite_lastr}   r7  Ú	suite_tosÚsuite_nodesÚnew_working_stackÚaiÚpÚlastr  s                             r   r@  z_NodesTree._copy_nodesÑ  sÒ  € àˆ	Øˆå�T×4Ò4ØØ"ð 5ñ 
ô 
ñ ô ˆð
 ˆ
Øð '	#ð '	#ˆDØŒ~˜aÔ  :Ò-Ð-Ø�àŒy˜KÒ'Ð'Ø�àŒy˜LÒ(Ð(¨T¬_Ð@ZÐ-ZÐ-ZØ�õ ˜dÑ#Ô# jÒ0Ð0å+¨DÑ1Ô1ð +Ø×$Ò$ TÑ*Ô*Ð*Ø�ðØ”M�ð �Ø”6˜[Ò(Ð(Øœ
 2œ�AØ”6Ð<Ð<Ð<Øœ
 2œ�AØ”6Ð4Ð4Ð4Ø!"¤¨B¤�J�Jà!" 2¤�Jà”?Ð&BÐBÐBØ�Eð Cøõ# "ð ð ð Ø�ðøøøð( ×Ò˜TÑ"Ô"Ð"Ð"ð ð 	Øð Ø% bœM�	Ø”NÐ&BÐBÐBÝ(¨°2¬Ñ7Ô7ð Cð "$�JØ—M’M‘O”O�OØ#ð (Ø$-¨b¤M˜	Ø$×2Ò2Ñ4Ô4Ô9¸YÒFÐFØ!Ø!Ÿš™œ˜ð	 $ð (ð
 Ý�y‘>”> AÒ%Ð%¨)°B¬-Ô*<ÀÒ*LÐ*Lð
 —M’M‘O”O�OØØàð 	<Ø�} f¨mÐ;Ð;à˜BÔˆØ˜b”Mˆ	Ø$Ðå# IÑ.Ô.ð 	,ØˆEØ”* Ò'Ð'Øœ rÔ*�ð ”* Ò'Ð'õ ,¨EÑ2Ô2ˆFØ× Ò  Ñ(Ô(Ð(å& uÕ:JÈ9Ñ:UÔ:UÐVÑVÔVˆIð >B×=MÒ=MØ  Ñ+¨U¬^¸ZÈØð >Nñ >ô >Ñ:ˆKÐ*¨J¸ð ˜RÑˆMÝ�;ÑÔ !Ò#Ð#à—’‘”�Ø�
�
à Ð Ð Ð Ø×"Ò" 9Ñ-Ô-Ð-Ø 1�Ø'+Ð$àð 	(Ý% i°¤m×&AÒ&AÑ&CÔ&CÑDÔDð >ÐMað >Ø˜b”M×/Ò/Ñ1Ô1Ô8�õ
 )¨°TÐ:Ñ:Ô:¸1Ô=�
à#ð 	FØ  ”}�Ø”9 Ò+Ð+Øœ=¨Ô,�DØ”9Ð ?Ð?Ð?Øœ=¨Ô,�DØ(,¬°bÔ(9×(GÒ(GÑ(IÔ(IÐ%Ø,°Ò3Ð3Ð3Ð3Ð3à(1°"¬×(CÒ(CÑ(EÔ(EÐ%Ø×ÒØ˜	 ;Ð0Eñô ð ð  ˆFØ%'ˆDÔ"à˜-¨°Ð>Ð>s   ÂDÄ
DÄDc                 ó*  — | j                              ¦   «          	 | j                             ¦   «         }t	          |¦  «        }t          |j        ¦  «        }n# t          $ r ddg}Y nw xY wt          | j	        ¦  «        }t          |¦  «        dk    sJ ‚t          |¦  «        dk    r\|d                              t          ¦  «        r|ddgk    r|dxx         dz  cc<   |dxx         t          |d         ¦  «        z  cc<   n8|dxx         t          |¦  «        dz
  z  cc<   t          |d         ¦  «        |d<   t          d|d         |d         f| j	        | j        z   ¦  «        }| j        |_        | j        j                             |¦  «         d S )Nr"   r   r-   rL   )r  r  r™   r\   rc   r÷   r3   Ú
IndexErrorr   r2   r4   r5   r   r   r  r.   r$   r  )rš   r_   r3   rø   r[   s        r   r¶   z_NodesTree.close_  s�  € ØŒ×ÒÑ Ô Ð ð	.Øœ×2Ò2Ñ4Ô4ˆIõ 2°)Ñ<Ô<ˆIÝ˜9Ô,Ñ-Ô-ˆGˆGøõ	 ð 	ð 	ð 	Ø˜!�fˆGˆGˆGð	øøøõ
 ˜DœKÑ(Ô(ˆÝ�5‰zŒz˜AŠ~ˆ~ˆ~ˆ~Ýˆu‰:Œ:˜Š?ˆ?Ø�QŒx×"Ò"¥?Ñ3Ô3ð  ¸ÀAÀqÀ6Ò8IÐ8IØ˜�
�
”
˜a‘�
�
‘
Ø�AˆJˆJŒJ�#˜e Aœh™-œ-Ñ'ˆJˆJ‰JˆJà�AˆJˆJŒJ�#˜e™*œ* q™.Ñ(ˆJˆJ‰JÝ˜U 2œY™œˆG�A‰Jå˜b 7¨1¤:¨w°q¬zÐ":¸D¼KÈ$ÔJ`Ñ<`ÑaÔaˆ	Øœ<ˆ	ÔØŒÔ×$Ò$ YÑ/Ô/Ð/Ð/Ð/s   ›A ÁA)Á(A)N)rL   F)r�   rŽ   r�   rœ   ÚpropertyrÍ   r#  rã   r&  r%  r8  rÑ   r@  r¶   r�   r   r   r¡   r¡   P  sÏ   € € € € € ðð ð ð ðBð Bñ „XðBð&ð &ð &ðLð Lð LðXð Xð Xð ð ð ð2ð ð ð( ð  ð  ðF */ðL?ð L?ð L?ð L?ð\0ð 0ð 0ð 0ð 0r   r¡   )rL   )0rü   rñ   rN   Úcollectionsr   ÚloggingÚparso.utilsr   Úparso.python.parserr   Úparso.python.treer   Úparso.python.tokenizer   r   Úparso.python.tokenr	   Ú	getLoggerr�   r®   r·   r   rô   r   rõ   r   ró   r   r   r   r'   r#   r/   rA   rY   ra   rc   r]   rt   r~   rƒ   rŠ   r»   rŒ   r’   r•   rþ   r¡   r�   r   r   ú<module>rb     sº  ððð ð6 
€	€	€	Ø €€€Ø "Ð "Ð "Ð "Ð "Ð "Ø €€€à #Ð #Ð #Ð #Ð #Ð #Ø &Ð &Ð &Ð &Ð &Ð &Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ø /Ð /Ð /Ð /Ð /Ð /à€gÔ˜Ñ!Ô!€ØÐ à8Ð à
Ô
"€Ø	Ô	 €ØÔ€ØÔ,€ØÔ&€	ðPð Pð Pðð ð ðð ð ð3ð 3ð 3ð"ð "ð "ð+'ð +'ð +'ð\]ð ]ð ]ð(	ð 	ð 	ð$ð $ð $ð"ð ð ðNð Nð Nð Nðð ð ðVð Vð Vðð ð ð":ð :ð :ð	ð 	ð 	ð 	ð 	 	ñ 	ô 	ð 	ð
@ð 
@ð 
@ðHð Hð Hð Hð Hñ Hô Hð HðVHFð HFð HFð HFð HFñ HFô HFð HFðVf0ð f0ð f0ð f0ð f0ñ f0ô f0ð f0ð f0ð f0r   