ó
    °"³jf  ã                  ó
  • % S r SSKJr  SSKJrJrJr  SSKJrJ	r	J
r
Jr  SSKrSSKrSSKJrJrJr  SSKJr  SS	KJr  SS
KJrJrJrJrJrJrJrJrJrJ r   SSK!J"r"  \(       a  SSKJ#r#J$r$J%r%J&r&  Sr'  " S S\5      r( " S S\5      r) " S S\5      r*\" SS9 " S S\5      5       r+\" SS9 " S S\5      5       r,\" SS9 " S S\5      5       r-\" SS9 " S S\ 5      5       r.\R^                  " \
\0\)S4   5      r1S\2S'   \R^                  " \*5      r3S \2S!'   S4S" jr4S5S# jr5S6S$ jr6S7S% jr7\4\S&'   \5\S&'   \6\S&'   \7\S&'   S'\S('   S)\S*'   S+\S,'   S-\S.'   S'\\+'   S)\\,'   S+\\-'   S-\\.'   S8S/ jr8S9S0 jr9S:S1 jr:SS2.     S;S3 jjr;g)<aD  Tool-search typed message parts and cross-provider history translation.

Tool search has two execution paths that produce typed message parts:

* **Native server-side** (Anthropic BM25/regex, OpenAI Responses): the provider runs
  the search and emits typed
  [`NativeToolSearchCallPart`][pydantic_ai.messages.NativeToolSearchCallPart] /
  [`NativeToolSearchReturnPart`][pydantic_ai.messages.NativeToolSearchReturnPart].
* **Local fallback** (any provider): the model calls the regular `search_tools`
  function tool; the toolset emits typed
  [`ToolSearchCallPart`][pydantic_ai.messages.ToolSearchCallPart] /
  [`ToolSearchReturnPart`][pydantic_ai.messages.ToolSearchReturnPart].

User code can match these typed subclasses via `isinstance` (e.g. for UI rendering)
and synthesize them directly to inject discoveries mid-run.

`synthesize_local_tool_search_messages` translates `NativeToolSearch*Part` history
into the local-shape typed parts when the next turn cannot replay that provider's
native representation, so previously discovered tools remain accessible across
provider boundaries.
é    )Úannotations)Ú	dataclassÚfieldÚreplace)ÚTYPE_CHECKINGÚLiteralÚUnionÚcastN)ÚNotRequiredÚ	TypedDictÚassert_neveré   )Úmessages)Úcopy_dataclass_fields)
Ú_NATIVE_CALL_NARROWERSÚ_NATIVE_RETURN_NARROWERSÚ_TOOL_CALL_NARROWERSÚ_TOOL_RETURN_NARROWERSÚ_TYPED_PART_TAGSÚ_TYPED_PART_TAGS_BY_TYPEÚNativeToolCallPartÚNativeToolReturnPartÚToolCallPartÚToolReturnPart)ÚRequestUsage)ÚModelMessageÚModelRequestPartÚModelResponseÚModelResponsePartzANo matching tools found. The tools you need may not be available.c                  ó$   • \ rS rSr% SrS\S'   Srg)ÚToolSearchMatchéA   z'A single match in a tool-search result.ÚstrÚname© N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__Ú__static_attributes__r%   ó    ÚU/home/mande/repo/quber/.venv/lib/python3.13/site-packages/pydantic_ai/_tool_search.pyr!   r!   A   s   ‡ Ù1à
ƒIòr.   r!   c                  ó$   • \ rS rSr% SrS\S'   Srg)ÚToolSearchArgséM   a²  Typed arguments for a tool-search call.

Carried on
[`NativeToolSearchCallPart.args`][pydantic_ai.messages.NativeToolSearchCallPart.args]
(native server-side path) and
[`ToolSearchCallPart.args`][pydantic_ai.messages.ToolSearchCallPart.args]
(local-fallback path) as the canonical cross-provider shape. Each adapter
normalizes its provider's wire format into this shape on parse, and rebuilds the
wire format from this shape on emit.
ú	list[str]Úqueriesr%   Nr&   r%   r.   r/   r1   r1   M   s   ‡ ñ	ð Óòr.   r1   c                  ó0   • \ rS rSr% SrS\S'    S\S'   Srg)	ÚToolSearchReturnContentéc   a\  Typed return value of the framework-managed tool-search builtin.

Carried on
[`NativeToolSearchReturnPart.content`][pydantic_ai.messages.NativeToolSearchReturnPart.content]
(native server-side path) and
[`ToolSearchReturnPart.content`][pydantic_ai.messages.ToolSearchReturnPart.content]
(local-fallback path) as the canonical cross-provider shape.
úlist[ToolSearchMatch]Údiscovered_toolszNotRequired[str]Úmessager%   Nr&   r%   r.   r/   r6   r6   c   s   ‡ ñð ,Ó+ØZàÓòr.   r6   F)Úreprc                  ór   • \ rS rSr% SrSrS\S'    SrS\S'    S	rS
\S'    \	SS j5       r
\	SS j5       rSrg)ÚNativeToolSearchCallPartéy   u  Typed view of a [`NativeToolCallPart`][pydantic_ai.messages.NativeToolCallPart] for tool search.

Used on the native server-side tool-search path (Anthropic BM25/regex, OpenAI
Responses) where the provider executes the search and emits a native result.
The local-fallback path uses
[`ToolSearchCallPart`][pydantic_ai.messages.ToolSearchCallPart] instead.

To detect a tool-search part regardless of execution path (native server-side
vs. local fallback), check `part.tool_kind == 'tool-search'` â€” this works
across both call/return and both server/local variants.

Shadows `args` with a narrower type. The `str` variant covers the
streaming / partial-args case before parsing completes; once parsed,
`args` is a [`ToolSearchArgs`][pydantic_ai.messages.ToolSearchArgs]
`TypedDict`.
Útool_searchúLiteral['tool_search']Ú	tool_nameNústr | ToolSearchArgs | NoneÚargsútool-searchúLiteral['tool-search']Ú	tool_kindc                ó  • U R                   c  g[        U R                   [        5      (       a  U R                   $  [        R                  " U R                   5      n[        U[        5      (       d  g[        SU5      $ ! [
         a     gf = f©u  Typed view of the validated tool-search arguments, or `None` if not yet parseable.

In non-streaming code (a typed call part on a finalized
[`ModelResponse`][pydantic_ai.messages.ModelResponse]), this is always
populated â€” once a part is narrowed to this typed subclass, its `args`
have been parsed and validated.

Returns `None` only in streaming-partial state, where `args` is still an
in-progress JSON string the model hasn't finished emitting. For raw
string-tolerant access, use the inherited `args_as_dict()`.
Nr1   ©rC   Ú
isinstanceÚdictÚpydantic_coreÚ	from_jsonÚ
ValueErrorr
   ©ÚselfÚparseds     r/   Ú
typed_argsÚ#NativeToolSearchCallPart.typed_argsš   óy   € ð �9‰9ÑØÜ�d—i‘i¤×&Ñ&Ø—9‘9Ðð	Ü"×,Ò,¨T¯Y©YÓ7ˆFô ˜&¤$×'Ñ'ØÜÐ$ fÓ-Ð-øô	 ó 	Ùð	úó   » A= Á=
B
Â	B
c                óZ   • U R                   nUc  / $ [        UR                  S/ 5      5      $ ©z˜Subfield accessor for `typed_args['queries']`.

Returns an empty list if args haven't been parsed yet (streaming-partial,
i.e. `typed_args` is `None`).
r4   ©rR   ÚlistÚget©rP   Útypeds     r/   r4   Ú NativeToolSearchCallPart.queries³   ó-   € ð —‘ˆØ‰=ØˆIÜ�E—I‘I˜i¨Ó,Ó-Ð-r.   r%   ©ÚreturnzToolSearchArgs | None©r`   r3   ©r'   r(   r)   r*   r+   rA   r,   rC   rF   ÚpropertyrR   r4   r-   r%   r.   r/   r=   r=   y   s]   ‡ ñð" )6€IÐ%Ó5ØZà(,€DÐ
%Ó,ðð )6€IÐ%Ó5ØQàó.ó ð.ð0 ó	.ó ó	.r.   r=   c                  óz   • \ rS rSr% Sr\" SS9rS\S'    SrS\S	'    S
r	S\S'    \
SS j5       r\
SS j5       rSrg)ÚNativeToolSearchReturnPartéÀ   u¸  Typed view of a [`NativeToolReturnPart`][pydantic_ai.messages.NativeToolReturnPart] for tool search.

Used on the native server-side tool-search path (Anthropic BM25/regex, OpenAI
Responses) where the provider executes the search and emits a native result.
The local-fallback path uses
[`ToolSearchReturnPart`][pydantic_ai.messages.ToolSearchReturnPart] instead.

To detect a tool-search part regardless of execution path (native server-side
vs. local fallback), check `part.tool_kind == 'tool-search'` â€” this works
across both call/return and both server/local variants.

Shadows `content` with a narrower
[`ToolSearchReturnContent`][pydantic_ai.messages.ToolSearchReturnContent]
`TypedDict`.
T©Úkw_onlyr6   Úcontentr?   r@   rA   rD   rE   rF   c                ó    • U R                   S   $ ©z4Subfield accessor for `content['discovered_tools']`.r9   ©ri   ©rP   s    r/   r9   Ú+NativeToolSearchReturnPart.discovered_toolsâ   ó   € ð �|‰|Ð.Ñ/Ð/r.   c                ó8   • U R                   R                  S5      $ ©zæSubfield accessor for `content.get('message')`.

The message is `NotRequired` on
[`ToolSearchReturnContent`][pydantic_ai.messages.ToolSearchReturnContent];
returns `None` when no message was set (e.g. on non-empty match returns).
r:   ©ri   rZ   rm   s    r/   r:   Ú"NativeToolSearchReturnPart.messageç   ó   € ð �|‰|×Ñ 	Ó*Ð*r.   r%   N©r`   r8   ©r`   ú
str | None©r'   r(   r)   r*   r+   r   ri   r,   rA   rF   rc   r9   r:   r-   r%   r.   r/   re   re   À   sb   ‡ ññ& (-°TÑ':€GÐ$Ó:ðð )6€IÐ%Ó5ØZà(5€IÐ%Ó5ØSàó0ó ð0ð ó+ó ó+r.   re   c                  ór   • \ rS rSr% SrSrS\S'    SrS\S'    S	rS
\S'    \	SS j5       r
\	SS j5       rSrg)ÚToolSearchCallPartéò   u  Typed view of a [`ToolCallPart`][pydantic_ai.messages.ToolCallPart] for the local `search_tools` function call.

Used on the local-fallback path (and as the synthetic-injection target on
non-native providers receiving cross-provider history). The native server-side
path uses
[`NativeToolSearchCallPart`][pydantic_ai.messages.NativeToolSearchCallPart]
instead.

To detect a tool-search part regardless of execution path (native server-side
vs. local fallback), check `part.tool_kind == 'tool-search'` â€” this works
across both call/return and both server/local variants.

Shadows `args` with the canonical typed shape. The `str` variant covers the
streaming / partial-args case before parsing completes; once parsed,
`args` is a [`ToolSearchArgs`][pydantic_ai.messages.ToolSearchArgs]
`TypedDict`.
Úsearch_toolsúLiteral['search_tools']rA   NrB   rC   rD   rE   rF   c                ó  • U R                   c  g[        U R                   [        5      (       a  U R                   $  [        R                  " U R                   5      n[        U[        5      (       d  g[        SU5      $ ! [
         a     gf = frH   rI   rO   s     r/   rR   ÚToolSearchCallPart.typed_args  rT   rU   c                óZ   • U R                   nUc  / $ [        UR                  S/ 5      5      $ rW   rX   r[   s     r/   r4   ÚToolSearchCallPart.queries-  r^   r.   r%   r_   ra   rb   r%   r.   r/   rz   rz   ò   s]   ‡ ñð$ *8€IÐ&Ó7ØZà(,€DÐ
%Ó,ðð )6€IÐ%Ó5ØWàó.ó ð.ð0 ó	.ó ó	.r.   rz   c                  óz   • \ rS rSr% Sr\" SS9rS\S'    SrS\S	'    S
r	S\S'    \
SS j5       r\
SS j5       rSrg)ÚToolSearchReturnParti:  uÀ  Typed view of a [`ToolReturnPart`][pydantic_ai.messages.ToolReturnPart] for the local `search_tools` function return.

Used on the local-fallback path (and as the synthetic-injection target on
non-native providers receiving cross-provider history). The native server-side
path uses
[`NativeToolSearchReturnPart`][pydantic_ai.messages.NativeToolSearchReturnPart]
instead.

To detect a tool-search part regardless of execution path (native server-side
vs. local fallback), check `part.tool_kind == 'tool-search'` â€” this works
across both call/return and both server/local variants.

Shadows `content` with a narrower
[`ToolSearchReturnContent`][pydantic_ai.messages.ToolSearchReturnContent]
`TypedDict`.
Trg   r6   ri   r|   r}   rA   rD   rE   rF   c                ó    • U R                   S   $ rk   rl   rm   s    r/   r9   Ú%ToolSearchReturnPart.discovered_tools]  ro   r.   c                ó8   • U R                   R                  S5      $ rq   rr   rm   s    r/   r:   ÚToolSearchReturnPart.messageb  rt   r.   r%   Nru   rv   rx   r%   r.   r/   rƒ   rƒ   :  sb   ‡ ññ( (-°TÑ':€GÐ$Ó:ðð *8€IÐ&Ó7ØZà(5€IÐ%Ó5ØYàó0ó ð0ð ó+ó ó+r.   rƒ   z1pydantic.TypeAdapter[str | ToolSearchArgs | None]Ú_TOOL_SEARCH_CALL_ARGS_TAz-pydantic.TypeAdapter[ToolSearchReturnContent]Ú_TOOL_SEARCH_RETURN_CONTENT_TAc                óŽ   • [        U [        5      (       a  U $ [        R                  U R                  5      n[        U [        USS9$ ©NrD   )rC   rF   )rJ   r=   rˆ   Úvalidate_pythonrC   r   ©ÚpartÚvalidated_argss     r/   Ú_narrow_native_tool_search_callr�   u  s<   € Ü�$Ô0×1Ñ1ØˆÜ.×>Ñ>¸t¿y¹yÓI€NÜ  Ô'?ÀnÐ`mÑnÐnr.   c                óŽ   • [        U [        5      (       a  U $ [        R                  U R                  5      n[        U [        USS9$ ©NrD   )ri   rF   )rJ   re   r‰   rŒ   ri   r   ©rŽ   Úvalidated_contents     r/   Ú!_narrow_native_tool_search_returnr•   |  s>   € Ü�$Ô2×3Ñ3ØˆÜ6×FÑFÀtÇ|Á|ÓTÐÜ  Ô'AÐK\ÐhuÑvÐvr.   c                óŽ   • [        U [        5      (       a  U $ [        R                  U R                  5      n[        U [        USS9$ r‹   )rJ   rz   rˆ   rŒ   rC   r   r�   s     r/   Ú_narrow_tool_search_callr—   ƒ  s<   € Ü�$Ô*×+Ñ+ØˆÜ.×>Ñ>¸t¿y¹yÓI€NÜ  Ô'9ÀÐZgÑhÐhr.   c                óŽ   • [        U [        5      (       a  U $ [        R                  U R                  5      n[        U [        USS9$ r’   )rJ   rƒ   r‰   rŒ   ri   r   r“   s     r/   Ú_narrow_tool_search_returnr™   Š  s>   € Ü�$Ô,×-Ñ-ØˆÜ6×FÑFÀtÇ|Á|ÓTÐÜ  Ô';ÐEVÐboÑpÐpr.   rD   zbuiltin-tool-search-call)zbuiltin-tool-callrD   zbuiltin-tool-search-return)zbuiltin-tool-returnrD   ztool-search-call)z	tool-callrD   ztool-search-return)ztool-returnrD   c               óJ   • U(       a	  [        XS9$ [        U US[        5       S9$ )uÇ  Build a split-off `ModelResponse` carrying a subset of `original`'s parts.

`first=True` keeps the original's identity-level metadata (provider response id,
usage, etc.). `first=False` blanks `provider_response_id` and zeroes `usage` so
downstream consumers don't double-count usage or find two responses for one API
call. Other contextual fields (model name, provider name, timestamp) carry over
unchanged â€” they're informational on a synthetic split.
©ÚpartsN)rœ   Úprovider_response_idÚusage)r   r   )Úoriginalrœ   Úfirsts      r/   Ú_split_responser¡   §  s-   € ö Ü�xÑ-Ð-ÜØØØ!Ü‹nñ	ð r.   c                ó>   • [        U R                  U R                  S9$ )zÎTranslate a server-side tool-search call to a local function-tool call.

Preserves `tool_call_id` so the matching return part links up; drops
`provider_*` because the local-shape part is provider-agnostic.
)rC   Útool_call_id)rz   rC   r£   ©rŽ   s    r/   Ú!synthesize_local_from_native_callr¥   º  s!   € ô Ø�Y‰YØ×&Ñ&ñð r.   c                ó€   • [        U R                  U R                  U R                  U R                  U R
                  S9$ )a  Translate a server-side tool-search return to a local function-tool return.

Preserves `tool_call_id`, `content` (the typed
[`ToolSearchReturnContent`][pydantic_ai.messages.ToolSearchReturnContent]),
and `metadata`; drops `provider_*` because the local-shape part is
provider-agnostic.
)ri   r£   ÚmetadataÚ	timestampÚoutcome)rƒ   ri   r£   r§   r¨   r©   r¤   s    r/   Ú#synthesize_local_from_native_returnrª   Æ  s6   € ô  Ø—‘Ø×&Ñ&Ø—‘Ø—.‘.Ø—‘ñð r.   )Útarget_provider_namec          
     ó^  • / nSnU  GH˜  n[        U[        R                  5      (       Ga:  / nSnSnUR                   HÜ  n[        U[        5      (       a1  Ub  UR
                  U:w  a  UR                  [        U5      5        SnMI  [        U[        5      (       am  Ub  UR
                  U:w  aZ  U(       a   UR                  [        XEU(       + S95        SnUR                  [        R                  " [        U5      /S95        / nSnMË  UR                  U5        MÞ     U(       a-  SnU(       a!  UR                  [        XEU(       + S95        GMG  GMJ  UR                  U5        GM^  [        U[        R                  5      (       Ga  [        S UR                   5       5      (       d  UR                  U5        GM³  Sn	/ n
UR                   HŽ  n[        U[        5      (       ae  [        U[        5      (       dP  UR                  S:X  a@  [        R                   " U5      n[        U[        5      (       a  U
R                  U5        Sn	M}  U
R                  U5        M�     U	(       a  SnUR                  [#        XJS95        GMy  UR                  U5        GM�  [%        U5        GM›     U(       a  U$ U $ )uL  Translate any `NativeToolSearch*Part` instances in the message history into local equivalents.

Returns a new list with translated copies of any messages that contain
`NativeToolSearch*Part`s from a provider other than `target_provider_name`;
messages without such parts are returned unchanged (no copy). Passing no
target translates every native part, which is suitable for adapters without
native tool search. A native-capable adapter passes its provider name so its
own parts retain their exact replay shape while foreign parts take the
provider-agnostic path.

A native server-side tool-search exchange is a single `ModelResponse` carrying both
`NativeToolSearchCallPart` (the call) and `NativeToolSearchReturnPart` (the inline
server-side result). Local function-tool execution shapes the same exchange as a pair
of messages â€” `ModelResponse(parts=[ToolSearchCallPart(...)])` followed by
`ModelRequest(parts=[ToolSearchReturnPart(...)])` â€” because the model produces the
call and the framework produces the return in a separate request turn.

Each `NativeToolSearchReturnPart` acts as a flush boundary when splitting: parts
before it (text, the search call itself) become a `ModelResponse`, the return becomes
a `ModelRequest`, and any parts after it (downstream tool calls, more text) become a
fresh `ModelResponse`. This preserves the natural turn order â€” e.g. a native turn
`[Text, SearchCall, SearchReturn, ToolCall(weather)]` translates to four messages
where the weather call sits on its own response after the search return, matching
what the model would have emitted across two turns on a non-native provider.

Identity-level metadata (`provider_response_id`, `usage`) is kept on the first split
response only; subsequent splits get blank/zero values so downstream consumers don't
double-count usage or treat one API call as two distinct responses.
FT)r    r›   c              3  ón   #   • U  H+  n[        U[        5      =(       a    UR                  S :H  v •  M-     g7f)rD   N)rJ   r   rF   )Ú.0rŽ   s     r/   Ú	<genexpr>Ú8synthesize_local_tool_search_messages.<locals>.<genexpr>&  s+   é € ÐrÒhqÐ`d”z $¬Ó7×[¸D¿N¹NÈmÑ<[Ô[Òhqùs   ‚35rD   )rJ   Ú	_messagesr   rœ   r=   Úprovider_nameÚappendr¥   re   r¡   ÚModelRequestrª   Úanyr   rƒ   rF   Únarrow_typer   r   )r   r«   ÚoutÚany_changedÚmsgÚbufferÚsplit_emittedÚchangedrŽ   Úrequest_changedÚnew_request_partsÚpromoteds               r/   Ú%synthesize_local_tool_search_messagesrÀ   ×  s2  € ð@ !€CØ€KäˆÜ�cœ9×2Ñ2×3Ò3Ø.0ˆFØ!ˆMØˆGØŸ	œ	�Ü˜dÔ$<×=Ñ=Ø(Ñ0°D×4FÑ4FÐJ^Ó4^à—M‘MÔ"CÀDÓ"IÔJØ"’GÜ Ô&@×AÑAØ(Ñ0°D×4FÑ4FÐJ^Ó4^ö
 ØŸ
™
¤?°3È-ÔFWÑ#XÔYØ(,˜Ø—J‘JÜ!×.Ò.Ü#FÀtÓ#LÐ"Mñôð
  �FØ"’Gà—M‘M $Ö'ñ/ "ö0 Ø"�ÞØ—J‘Jœ¨sÀmÔBSÑT×Uò ð —
‘
˜3—Ü˜œY×3Ñ3×4Ò4ô ÑrÐhk×hqÒhqÓr×rÑrØ—
‘
˜3”ÚØ#ˆOØ8:ÐØŸ	œ	�ä˜t¤^×4Ñ4Ü& tÔ-A×BÑBØŸ™¨-Ó7ä-×9Ò9¸$Ó?�HÜ! (Ô,@×AÑAØ)×0Ñ0°Ô:Ø*.˜Ù Ø!×(Ñ(¨Ö.ñ "ö Ø"�Ø—
‘
œ7 3Ñ@×Aà—
‘
˜3—ä˜×ñG öJ ˆ3Ð+ 8Ð+r.   )rŽ   r   r`   r=   )rŽ   r   r`   re   )rŽ   r   r`   rz   )rŽ   r   r`   rƒ   )rŸ   r   rœ   zlist[ModelResponsePart]r    Úboolr`   r   )rŽ   r=   r`   rz   )rŽ   re   r`   rƒ   )r   úlist[ModelMessage]r«   rw   r`   rÂ   )<r+   Ú
__future__r   Údataclassesr   r   r   Útypingr   r   r	   r
   ÚpydanticrL   Útyping_extensionsr   r   r   Ú r   r±   Ú_utilsr   r   r   r   r   r   r   r   r   r   r   rž   r   r   r   r   r   Ú_NO_MATCHES_MESSAGEr!   r1   r6   r=   re   rz   rƒ   ÚTypeAdapterr#   rˆ   r,   r‰   r�   r•   r—   r™   r¡   r¥   rª   rÀ   r%   r.   r/   Ú<module>rÌ      s7  ðòõ, #ç 1Ñ 1ß 6Ó 6ã Û ß BÑ Bå #Ý )÷
÷ ÷ õ  æßZÓZð ZÐ ðô	�iô 	ô�Yô ô,˜iô ñ, �ÑôC.Ð1ó C.ó ðC.ñL �Ñô.+Ð!5ó .+ó ð.+ñb �ÑôD.˜ó D.ó ðD.ñN �Ñô/+˜>ó /+ó ð/+ðd PX×OcÒOcØ	ˆ#ˆ~˜tÐ
#Ñ$óPÐ ÐLó ð QY×PdÒPdØóQÐ Ð Mó ô
oôwôiôqð )HÐ �}Ñ %Ø*KÐ ˜Ñ 'Ø&>Ð �]Ñ #Ø(BÐ �}Ñ %ð
 :TÐ Ð5Ñ 6Ø;WÐ Ð7Ñ 8Ø1CÐ Ð-Ñ .Ø3GÐ Ð/Ñ 0à5OÐ Ð1Ñ 2Ø7SÐ Ð3Ñ 4Ø/AÐ Ð+Ñ ,Ø1EÐ Ð-Ñ .ôô&	ôð$ IMñh,Ø ðh,Ø;Eðh,àöh,r.   