§
    �ØjQ1  ã                   óZ  — d Z ddlZddlZddlmZmZ ddlmZ dedede	fd„Z
e G d	„ d
¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Z ed¬¦  «         G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Ze G d„ d¦  «        ¦   «         Z ej        d¦  «        Ze G d„ d¦  «        ¦   «         Zdefd„Zded edefd!„Zdefd"„Zded ed#edefd$„Zd(d&edee         fd'„ZdS ))aI  Data models for the chunking pipeline.

ID formats are a public contract (stable across versions, snapshot-tested):

- element:  ``p{page}.b{box}``  (1-based original page number, 0-based box
  index on that page).  Element ids are scoped to (document bytes, package
  version, parse options): parse modes that re-split boxes (e.g. HTML table
  rendering) produce different box indices, so ids must not be cached
  across parse-option changes.
- chunk:    ``c{n}``
- table:    ``t{n}``
- figure:   ``f{n}``  (same numbering as ``[Figure f{n}: WxH]`` placeholders)
- section:  ``s{n}``
é    N)Ú	dataclassÚfield)ÚOptionalÚpageÚboxÚreturnc                 ó   — d| › d|› �S )z$Public element id: 'p{page}.b{box}'.Úpz.b© )r   r   s     ú˜/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/pymupdf4llm/helpers/chunking/models.pyÚ
element_idr      s   € àˆtÐÐ�sÐÐÐó    c                   óð  — e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   d	Zeed
<   dZ	e
ed<   d	Zeed<   dZee
         ed<   dZee
         ed<   dZeed<   dZee         ed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<    edd¬¦  «        Zee         ed<    eed¬ ¦  «        Z eed!<   dS )"ÚSentenceUnitz‡A sentence-level unit extracted from a LayoutBox.

    For table/figure boxes, this represents the entire box content as one unit.
    Úsent_idÚtextÚ	norm_textÚpage_noÚ	box_indexÚboxclassÚbboxr   Útoken_countç        Úfont_size_dominantÚfont_flags_dominantNÚline_gap_beforeÚline_gap_afterFÚis_heading_hintÚheading_level_hintÚis_list_itemÚis_table_contentÚis_figure_relatedÚis_footnoteÚis_header_footerÚ
is_captionÚcaption_target_typeÚtable_markdownÚ
table_htmlÚfigure_number©ÚdefaultÚreprÚ
image_data©Údefault_factoryr,   Ú_source_box_indices)!Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚ__annotations__ÚstrÚtupler   r   Úfloatr   r   r   r   r   Úboolr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r   r-   ÚbytesÚlistr0   r   r   r   r   r      så  € € € € € € ðð ð €L€L�LØ
€I€I�IØ€N€N�Nð €L€L�LØ€N€N�NØ€M€M�MØ
€K€K�Kð €K�ÐÐÑð !$Ð˜Ð#Ð#Ñ#Ø Ð˜Ð Ð Ñ ð (,€O�X˜e”_Ð+Ð+Ñ+Ø&*€N�H˜U”OÐ*Ð*Ñ*ð "€O�TÐ!Ð!Ñ!Ø(,Ð˜ œÐ,Ð,Ñ,Ø€L�$ÐÐÑØ"Ð�dÐ"Ð"Ñ"Ø#Ð�tÐ#Ð#Ñ#Ø€K�ÐÐÑØ"Ð�dÐ"Ð"Ñ"Ø€J�ÐÐÑØ)-Ð˜ #œÐ-Ð-Ñ-ð
 %)€N�H˜S”MÐ(Ð(Ñ(Ø $€J�˜”Ð$Ð$Ñ$ð $(€M�8˜C”=Ð'Ð'Ñ'ð #( %°¸5Ð"AÑ"AÔ"A€J�˜”ÐAÐAÑAð !& °dÀÐ GÑ GÔ GÐ˜ÐGÐGÑGÐGÐGr   r   c                   ó*  — e Zd ZU dZeed<    ee¬¦  «        Zeed<   dZ	e
ed<   dZeed<   d	Zeed
<   dZeed<   dZeed<    ee¬¦  «        Zeed<    ee¬¦  «        Zeed<   dZee
         ed<    ee¬¦  «        Zeed<    eed¬¦  «        Zeed<   dS )Ú
ProtoChunkzøAn intermediate chunk before split/merge refinement.

    Holds a contiguous run of units; ``text`` is only materialized at
    serialization time (``unit_range`` + precomputed token sums keep
    assembly free of repeated joining/tokenizing).
    Úchunk_id©r/   Úsent_idsÚ r   r   r   ©r   r   Ú
unit_rangeÚ
page_startÚpage_endÚbox_indicesÚbboxesNÚprimary_typeÚtypesFr.   Ú
_sentences)r1   r2   r3   r4   r5   r6   r   r<   rA   r   r7   r   rD   r8   rE   rF   rG   rH   rI   r   rJ   rK   r   r   r   r>   r>   Q   s!  € € € € € € ðð ð €M€M�MØ�U¨4Ð0Ñ0Ô0€HˆdÐ0Ð0Ñ0Ø€Dˆ#€N€N�NØ€K�ÐÐÑØ€J�ÐÐÑð €J�ÐÐÑØ€HˆcÐÐÑØ˜¨dÐ3Ñ3Ô3€K�Ð3Ð3Ñ3Ø�5¨Ð.Ñ.Ô.€FˆDÐ.Ð.Ñ.ð #'€L�(˜3”-Ð&Ð&Ñ&Ø�%¨Ð-Ñ-Ô-€Eˆ4Ð-Ð-Ñ-ð �u¨T¸Ð>Ñ>Ô>€J�Ð>Ð>Ñ>Ð>Ð>r   r>   T)Úfrozenc                   ó^   — e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   dZe	ed	<   d
S )ÚElementuØ   One layout box, chunk-addressable evidence with canonical text.

    The registry keeps every box â€” including header/footer boxes excluded
    from chunk text â€” so nothing the parser saw is unreachable (D8).
    Úidr   r   r   r   r   Fr$   N)
r1   r2   r3   r4   r7   r6   r5   r8   r$   r:   r   r   r   rN   rN   m   se   € € € € € € ðð ð
 	€G€G�GØ
€I€I�IØ	€H€H�HØ€M€M�MØ
€K€K�KØ
€I€I�IØ"Ð�dÐ"Ð"Ñ"Ð"Ð"r   rN   c                   ó   — e Zd ZU dZeed<   ee         ed<   eed<   eed<   eed<   dZ	ee         ed<   dZ
ee         ed	<    ee¬
¦  «        Zeed<   dZee         ed<   dZee         ed<   dZee         ed<   dZeed<   edefd„¦   «         ZdS )Ú
TableChunkaM  A table exposed in the tables view; links back to its chunk.

    ``markdown`` and ``html`` are mutually exclusive per parse mode: in
    HTML table mode the parser carries markdown=None and html is the
    canonical rendering; otherwise markdown is canonical (possibly ``""``
    for a degenerate table) and html is None (D15).
    rO   r?   r   r   r   NÚmarkdownÚhtmlr@   ÚheadersÚcaptionÚcaption_element_idÚ
section_idr   r   r   c                 ó0   — | j         �| j         S | j        pdS )z'Canonical rendering for the parse mode.NrB   )rS   rR   ©Úselfs    r   r   zTableChunk.text“   s!   € ð Œ9Ð Ø”9ÐØŒ}Ð" Ð"r   )r1   r2   r3   r4   r7   r6   r   r5   r8   rR   rS   r   r<   rT   rU   rV   rW   r   Úpropertyr   r   r   r   rQ   rQ   }   s  € € € € € € ðð ð 	€G€G�GØ�sŒmÐÐÑØ€O€O�OØ
€I€I�IØ
€K€K�KØ"€Hˆh�sŒmÐ"Ð"Ñ"Ø€Dˆ(�3Œ-ÐÐÑØ�E¨$Ð/Ñ/Ô/€GˆTÐ/Ð/Ñ/Ø!€GˆX�cŒ]Ð!Ð!Ñ!Ø(,Ð˜ œÐ,Ð,Ñ,Ø $€J�˜”Ð$Ð$Ñ$Ø€K�ÐÐÑàð#�cð #ð #ð #ñ „Xð#ð #ð #r   rQ   c                   ó"  — e Zd ZU dZeed<   ee         ed<   eed<   eed<   eed<   dZ	eed<   d	Z
ee         ed
<   dZeed<   d	Zee         ed<   d	Zee         ed<   d	Zee         ed<    ed	d¬¦  «        Zee         ed<   edefd„¦   «         Zd	S )ÚFigureChunkzFA figure/formula exposed in the figures view; links back to its chunk.rO   r?   r   r   r   Úpicturer   NÚocr_textrB   ÚplaceholderrU   rV   rW   Fr*   Úimager   c                 ó\   — t          | j        o| j                             ¦   «         ¦  «        S ©N)r:   r_   ÚstriprY   s    r   Úhas_textzFigureChunk.has_text«   s%   € å�D”MÐ; d¤m×&9Ò&9Ñ&;Ô&;Ñ<Ô<Ð<r   )r1   r2   r3   r4   r7   r6   r   r5   r8   r   r_   r`   rU   rV   rW   r   ra   r;   r[   r:   re   r   r   r   r]   r]   ›   s	  € € € € € € àPÐPØ€G€G�GØ�sŒmÐÐÑØ€O€O�OØ
€I€I�IØ
€K€K�KØ€HˆcÐÐÑØ"€Hˆh�sŒmÐ"Ð"Ñ"Ø€K�ÐÐÑØ!€GˆX�cŒ]Ð!Ð!Ñ!Ø(,Ð˜ œÐ,Ð,Ñ,Ø $€J�˜”Ð$Ð$Ñ$Ø"˜U¨4°eÐ<Ñ<Ô<€Eˆ8�EŒ?Ð<Ð<Ñ<àð=˜$ð =ð =ð =ñ „Xð=ð =ð =r   r]   c                   ó  — e Zd ZU dZeed<   eed<   eed<   eed<   eed<   dZee         ed<    e	e
¬	¦  «        Ze
ed
<   dZeed<    e	e
¬	¦  «        Ze
ed<   dZeed<    e	ddd¬¦  «        Zeed<   edefd„¦   «         ZdS )ÚSectionChunkz6A section (heading span) exposed in the sections view.rO   ÚtitleÚlevelrE   rF   NÚheading_element_idr@   ÚpathrC   Úelement_spanÚchild_chunk_idsr   r   r   F©r+   r,   ÚcompareÚ	_elementsr   c                 óJ   — d                      d„ | j        D ¦   «         ¦  «        S )z>Section body text, assembled lazily from the element registry.z

c              3   ó@   K  — | ]}|j         ¯	|j        °|j         V — Œd S rc   )r   r$   )Ú.0Úes     r   ú	<genexpr>z$SectionChunk.text.<locals>.<genexpr>Ã   sK   è è € ð 
ð 
ØØŒvð
àÔ0ð
ØŒFð
ð 
ð 
ð 
ð 
ð 
r   )Újoinrp   rY   s    r   r   zSectionChunk.textÀ   s8   € ð �{Š{ð 
ð 
Ø œNð
ñ 
ô 
ñ 
ô 
ð 	
r   )r1   r2   r3   r4   r7   r6   r5   rj   r   r   r<   rk   rl   r8   rm   r   rp   r[   r   r   r   r   rg   rg   °   sþ   € € € € € € à@Ð@Ø€G€G�GØ€J€J�JØ€J€J�JØ€O€O�OØ€M€M�MØ(,Ð˜ œÐ,Ð,Ñ,Ø� tÐ,Ñ,Ô,€Dˆ$Ð,Ð,Ñ,Ø €L�%Ð Ð Ñ Ø!˜E°$Ð7Ñ7Ô7€O�TÐ7Ð7Ñ7Ø€K�ÐÐÑà�u R¨e¸UÐCÑCÔC€IˆuÐCÐCÑCàð
�cð 
ð 
ð 
ñ „Xð
ð 
ð 
r   rg   c                   ól   — e Zd ZU dZdZeed<   dZeed<   dZ	e
e         ed<    ee¬¦  «        Zeed	<   dS )
ÚSectionNodezCA node in ChunkedDocument.hierarchy (root has level 0, no section).rB   rh   r   ri   NrW   r@   Úchildren)r1   r2   r3   r4   rh   r7   r6   ri   r5   rW   r   r   r<   ry   r   r   r   rx   rx   É   sc   € € € € € € àMÐMØ€Eˆ3€O€O�OØ€Eˆ3€N€N�NØ $€J�˜”Ð$Ð$Ñ$Ø�U¨4Ð0Ñ0Ô0€HˆdÐ0Ð0Ñ0Ð0Ð0r   rx   c                   óˆ  — e Zd ZU dZdZeed<   dZeed<    ee	¬¦  «        Z
e	ed<    ee	¬¦  «        Ze	ed<   dZee         ed	<    ee	¬¦  «        Ze	ed
<   dZeed<    ee	¬¦  «        Ze	ed<    ee	¬¦  «        Ze	ed<    ee	¬¦  «        Ze	ed<    ee	¬¦  «        Ze	ed<   dZeed<   dZee         ed<   dZee         ed<   dS )ÚChunkMetadatazsMetadata attached to a final chunk (payload-ready: every field is
    json-safe and lands in ``to_dicts()`` as-is).r   rE   rF   r@   rH   rJ   NrW   Úsection_pathr   Úelement_idsÚ	table_idsÚ
figure_idsÚlistsFÚocrÚ	file_pathÚ
page_count)r1   r2   r3   r4   rE   r5   r6   rF   r   r<   rH   rJ   rW   r   r7   r|   r   r}   r~   r   r€   r�   r:   r‚   rƒ   r   r   r   r{   r{   Ò   sk  € € € € € € ð5ð 5à€J�ÐÐÑØ€HˆcÐÐÑØ�5¨Ð.Ñ.Ô.€FˆDÐ.Ð.Ñ.Ø�%¨Ð-Ñ-Ô-€Eˆ4Ð-Ð-Ñ-Ø $€J�˜”Ð$Ð$Ñ$Ø˜¨tÐ4Ñ4Ô4€L�$Ð4Ð4Ñ4Ø€K�ÐÐÑØ˜¨dÐ3Ñ3Ô3€K�Ð3Ð3Ñ3ð �e¨DÐ1Ñ1Ô1€IˆtÐ1Ð1Ñ1Ø�u¨TÐ2Ñ2Ô2€J�Ð2Ð2Ñ2ð �%¨Ð-Ñ-Ô-€Eˆ4Ð-Ð-Ñ-ð €CˆÐÐÑð  $€Iˆx˜Œ}Ð#Ð#Ñ#Ø $€J�˜”Ð$Ð$Ñ$Ð$Ð$r   r{   z\s+c                   ó¦   — e Zd ZU dZeed<   eed<   dZeed<    ee¬¦  «        Z	eed<    edd	d	¬
¦  «        Z
ee         ed<   edefd„¦   «         ZdS )ÚChunka  A finalized, retrieval-ready chunk.

    Treat a chunk as read-only once ``to_chunks()`` has returned it.
    ``content_hash`` is computed once and cached, and
    ``ChunkedDocument.text`` / ``ChunkedDocument.get()`` cache over the
    chunk list, so assigning to ``text`` (or mutating ``metadata``) leaves
    those caches describing the previous content. To change chunk
    boundaries call ``reassemble_chunks()``; to carry your own fields,
    keep them beside the chunk (its id is the stable key) rather than on
    it.
    rO   r   rB   Útagged_contentr@   ÚmetadataNFrn   Ú_content_hashr   c                 óþ   — | j         €pt                               d| j        ¦  «                             ¦   «         }t          j        |                     d¦  «        ¦  «                             ¦   «         | _         | j         S )zóLazy sha256 of whitespace-normalized text (D17).

        Stable across runs for identical content; whitespace-normalized so
        that byte-identical content is not reported as changed by
        rendering-neutral whitespace drift.
        Nú zutf-8)	rˆ   Ú_WS_REÚsubr   rd   ÚhashlibÚsha256ÚencodeÚ	hexdigest)rZ   Únorms     r   Úcontent_hashzChunk.content_hash  sa   € ð ÔÐ%Ý—:’:˜c 4¤9Ñ-Ô-×3Ò3Ñ5Ô5ˆDÝ!(¤°·²¸GÑ0DÔ0DÑ!EÔ!E×!OÒ!OÑ!QÔ!QˆDÔØÔ!Ð!r   )r1   r2   r3   r4   r7   r6   r†   r   r{   r‡   rˆ   r   r[   r’   r   r   r   r…   r…   ñ   s«   € € € € € € ð
ð 
ð 	€G€G�GØ
€I€I�IØ€N�CÐÐÑØ#˜e°MÐBÑBÔB€HˆmÐBÐBÑBà#( 5°¸EÈ5Ð#QÑ#QÔ#Q€M�8˜C”=ÐQÐQÑQàð
"˜cð 
"ð 
"ð 
"ñ „Xð
"ð 
"ð 
"r   r…   c                 ó¨   — | j         sdS |j        s|j        s	|j        sdS | j        €dS | j        dk    r	|j        rdS | j        dk    r	|j        rdS dS )zÌCheck if a caption SentenceUnit matches an element SentenceUnit (one direction).

    Returns True if caption targets the element type, or if target_type is None
    and element is table/figure/list.
    FNTÚtableÚfigure)r%   r!   r"   r    r&   )rU   Úelements     r   Úcaption_matches_elementr—     s�   € ð Ôð ØˆuØÔ$ð ¨Ô(Að ÀWÔEYð ØˆuØÔ"Ð*ØˆtØÔ" gÒ-Ð-°'Ô2JÐ-ØˆtØÔ" hÒ.Ð.°7Ô3LÐ.ØˆtØˆ5r   Úbbox_aÚbbox_bc                 óÂ   — | \  }}}}|\  }}}}t          ||z
  ||z
  ¦  «        }|dk    rdS t          dt          ||¦  «        t          ||¦  «        z
  ¦  «        }||z  S )z�Compute horizontal overlap ratio between two bboxes.

    Returns overlap / min_width, or 1.0 if either bbox has zero width.
    r   g      ð?r   )ÚminÚmax)	r˜   r™   Úax0Ú_Úax1Úbx0Úbx1Ú	min_widthÚoverlaps	            r   Úhorizontal_overlap_ratior¤   &  sr   € ð
 �N€CˆˆC�Ø�N€CˆˆC�Ý�C˜#‘I˜s S™yÑ)Ô)€IØ�A‚~€~ØˆsÝ�#•s˜3 ‘}”}¥s¨3°¡}¤}Ñ4Ñ5Ô5€GØ�YÑÐr   c                 ó  — t          d¦  «        x}}t          d¦  «        x}}| D ]G\  }}}}t          ||¦  «        }t          ||¦  «        }t          ||¦  «        }t          ||¦  «        }ŒH|t          d¦  «        k    rdS ||||fS )zKCompute the union bounding box from an iterable of (x0, y0, x1, y1) tuples.Úinfz-inf)r   r   r   r   )r9   r›   rœ   )	rH   Úx0Úy0Úx1Úy1r    Úby0r¡   Úby1s	            r   Ú
union_bboxr­   4  s•   € å�E‰lŒlÐ€BˆÝ�F‰mŒmÐ€BˆØ$ð ð ÑˆˆS�#�sÝ��S‰\Œ\ˆÝ��S‰\Œ\ˆÝ��S‰\Œ\ˆÝ��S‰\Œ\ˆˆØ	�U�5‰\Œ\ÒÐØˆ|Ø��B˜ÐÐr   Útolc                 óÖ   — | \  }}}}|\  }}}	}
t          ||z
  ¦  «        |k    ot          ||	z
  ¦  «        |k    }t          ||z
  ¦  «        |k    ot          ||
z
  ¦  «        |k    }|p|S )u  Check if two bboxes share a matching edge *pair*.

    Returns True when (x0 AND x1) or (y0 AND y1) both match within *tol*.
    A single edge match (e.g. only x1) is not enough â€” it would cause
    chain-reaction grouping across spatially unrelated boxes.
    )Úabs)r˜   r™   r®   r�   Úay0rŸ   Úay1r    r«   r¡   r¬   Úx_pairÚy_pairs                r   Ú_has_shared_edgerµ   B  s{   € ð  Ñ€Cˆˆc�3ØÑ€Cˆˆc�3Ý��s‘‰^Œ^˜sÒ"Ð<¥s¨3°©9¡~¤~¸Ò'<€FÝ��s‘‰^Œ^˜sÒ"Ð<¥s¨3°©9¡~¤~¸Ò'<€FØÐ�VÐr   ç      $@Ú	tolerancec                 ó|  — t          | ¦  «        }|sg S t          |¦  «        dk    rt          |¦  «        S |d         gg}|dd…         D ]g}t          t          |d         ¦  «        ¦  «        }t	          |||¦  «        r|d                              |¦  «         ŒQ|                     |g¦  «         Œhd„ |D ¦   «         S )aÄ  Group sequential bboxes that share a matching edge pair.

    Only the *last* (most recent) group is checked for each incoming box.
    If it doesn't match, a new group is created.  This respects reading
    order: once a spatially different region appears (e.g. an indented
    code block), subsequent boxes continue from that break rather than
    jumping back to an earlier group.

    *tolerance* defaults to 10 PDF points (~3.5 mm at 72 dpi).
    é   r   Néÿÿÿÿc                 óF   — g | ]}t          t          |¦  «        ¦  «        ‘ŒS r   )r­   Úiter)rs   Úgs     r   ú
<listcomp>z group_bboxes.<locals>.<listcomp>i  s&   € Ð0Ð0Ð0 A�J•t˜A‘w”wÑÔÐ0Ð0Ð0r   )r<   Úlenr­   r¼   rµ   Úappend)rH   r·   ÚboxesÚgroupsr   Ú
last_unions         r   Úgroup_bboxesrÄ   P  sÎ   € õ �‰LŒL€EØð Øˆ	Ý
ˆ5�z„z�Q‚€Ý�E‰{Œ{Ðà"'¨¤(  €FØ�Q�R�RŒyð !ð !ˆÝ¥ V¨B¤ZÑ 0Ô 0Ñ1Ô1ˆ
Ý˜J¨¨YÑ7Ô7ð 	!Ø�2ŒJ×Ò˜cÑ"Ô"Ð"Ð"à�MŠM˜3˜%Ñ Ô Ð Ð à0Ð0¨Ð0Ñ0Ô0Ð0r   )r¶   )r4   r�   ÚreÚdataclassesr   r   Útypingr   r5   r7   r   r   r>   rN   rQ   r]   rg   rx   r{   Úcompiler‹   r…   r:   r—   r8   r9   r¤   r­   rµ   r<   rÄ   r   r   r   ú<module>rÉ      s9  ððð ð €€€Ø 	€	€	€	Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð ð�Sð ˜sð  sð ð ð ð ð
 ð2Hð 2Hð 2Hð 2Hð 2Hñ 2Hô 2Hñ „ð2Hðj ð?ð ?ð ?ð ?ð ?ñ ?ô ?ñ „ð?ð6 €�$ÐÑÔð#ð #ð #ð #ð #ñ #ô #ñ Ôð#ð ð#ð #ð #ð #ð #ñ #ô #ñ „ð#ð: ð=ð =ð =ð =ð =ñ =ô =ñ „ð=ð( ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ „ð
ð0 ð1ð 1ð 1ð 1ð 1ñ 1ô 1ñ „ð1ð ð%ð %ð %ð %ð %ñ %ô %ñ „ð%ð6 
ˆŒ�FÑ	Ô	€ð ð"ð "ð "ð "ð "ñ "ô "ñ „ð"ðB°ð ð ð ð ð& Uð °Eð ¸eð ð ð ð ð˜%ð ð ð ð ð˜Uð ¨Eð ¸ð À$ð ð ð ð ð1ð 1 Eð 1°T¸%´[ð 1ð 1ð 1ð 1ð 1ð 1r   