ó
    „ñ:i</  ã                   óÊ  • S SK r S SKrS SKrS SKrS SKrS SKrS SKJrJ	r	J
r
JrJrJrJr  S SKJrJ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  S SKrS rS	 r " S
 S\5      rS\R@                  4/r!S r"S r#S r$S r% " S S\5      r& " S S\&5      r' " S S\'5      r( " S S\&5      r) " S S\&5      r* " S S\'5      r+ " S S\5      r,\-S:X  a  \R\                  " 5         gg) é    N)ÚTestCaseÚoverride_configÚoverride_env_configÚcaptured_stdoutÚforbid_codegenÚskip_parfors_unsupportedÚ
needs_blas)ÚjitÚnjit)ÚtypesÚcompilerÚutils)ÚNumbaPerformanceWarning)Úprange)Újitclassc                 ó   • U S-   nU$ )Né   © )ÚsomeargÚretvals     ÚY/srv/projetos/modelo_ml_acdoc/venv/lib/python3.13/site-packages/numba/tests/test_debug.pyÚsimple_nopythonr      s   € Ø�q‰[€FØ€Mó    c              #   ó   #   • U v •  Uv •  g 7f©Nr   )ÚxÚys     r   Ú
simple_genr      s   é € Ø
‚GØ
ƒGùs   ‚
c                   ó   • \ rS rSrS rSrg)ÚSimpleClassé   c                 ó   • SU l         g )Né   ©Úh)Úselfs    r   Ú__init__ÚSimpleClass.__init__   s	   € Øˆ�r   r$   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r'   Ú__static_attributes__r   r   r   r    r       s   † õr   r    r%   c                 ó   • U R                   $ r   r$   )Úobjs    r   Úsimple_class_userr0   #   s   € Ø�5‰5€Lr   c                 ó.   • [         R                  " X5      $ r   )ÚnpÚdot)ÚaÚbs     r   Úunsupported_parforr6   &   s   € Ü�6Š6�!‹<Ðr   c                 ó�   • [         R                  " U 5      n[        U 5       H   nX   [         R                  " U5      -   X'   M"     U$ r   ©r2   Úonesr   Úsin©Únr4   Úis      r   Úsupported_parforr>   )   s8   € Ü
�Š�‹
€AÜ�AŽYˆØ‰t”b—f’f˜Q“iÑˆ‹ñ à€Hr   c                 ó¦   • [         R                  " U 5      n[        U 5       H+  nX   [         R                  " U5      -   X'   US-   S:  a  M+   e   U$ )Né   i † r8   r;   s      r   Úunsupported_prangerA   /   sJ   € Ü
�Š�‹
€AÜ�AŽYˆØ‰t”b—f’f˜Q“iÑˆ‰Ø�2‰v˜�Ðˆñ ð €Hr   c                   ód   • \ rS rSr\" / SQ5      rS rS rS rS r	S r
S rS	 rS
 rS rS rSrg)ÚDebugTestBaseé7   )ÚbytecodeÚcfgÚirÚ	typeinferÚllvmÚfunc_opt_llvmÚoptimized_llvmÚassemblyc                 ó8   • U R                   " [        /UQ70 UD6  g r   )ÚassertRaisesÚAssertionError)r&   ÚargsÚkwargss      r   Úassert_failsÚDebugTestBase.assert_fails<   s   € Ø×Òœ.Ð:¨4Ò:°6Ó:r   c                 ó  • [         R                  U R                  S5      nU H  nXC;   d   eSX4'   M     [        UR	                  5       5       H6  u  pE[        U SU-  5      nU(       a
  U" U5        M%  U R                  Xa5        M8     g )NFTz_check_dump_%s)ÚdictÚfromkeysÚ	all_dumpsÚsortedÚitemsÚgetattrrR   )r&   ÚoutÚ
dump_namesÚenabled_dumpsÚnameÚenabledÚ
check_meths          r   Úcheck_debug_outputÚ DebugTestBase.check_debug_output?   sz   € ÜŸ™ d§n¡n°eÓ<ˆÛˆDØÓ(Ð(Ð(Ø"&ˆMÓñ ô $ M×$7Ñ$7Ó$9Ö:‰MˆDÜ  Ð'7¸$Ñ'>Ó?ˆJÞÙ˜3–à×!Ñ! *Ö2ò ;r   c                 óÐ   • [         R                  S;   a  U R                  SU5        g [         R                  S;   a  U R                  SU5        g [        [         R                  5      e)N))é   é   )rd   é   )rd   r@   )rd   é   Ú	BINARY_OP))rd   é
   Ú
BINARY_ADD)r   Ú	PYVERSIONÚassertInÚNotImplementedError©r&   r[   s     r   Ú_check_dump_bytecodeÚ"DebugTestBase._check_dump_bytecodeK   sF   € Ü�?‰?ÐBÓBØ�M‰M˜+ sÕ+Ü�_‰_ 
Ó*Ø�M‰M˜,¨Õ,ä%¤e§o¡oÓ6Ð6r   c                 ó(   • U R                  SU5        g )NzCFG dominators©rl   rn   s     r   Ú_check_dump_cfgÚDebugTestBase._check_dump_cfgS   s   € Ø�‰Ð&¨Õ,r   c                 óB   • U R                  SU R                  -  U5        g )Nz--IR DUMP: %s--©rl   Ú	func_namern   s     r   Ú_check_dump_irÚDebugTestBase._check_dump_irV   s   € Ø�‰Ð'¨$¯.©.Ñ8¸#Õ>r   c                 ó(   • U R                  SU5        g )Nz--propagate--rr   rn   s     r   Ú_check_dump_typeinferÚ#DebugTestBase._check_dump_typeinferY   s   € Ø�‰�o sÕ+r   c                 óº   • U R                  SU5        [        R                  R                  S   R                  R
                  S:X  a  U R                  USU5        g g )Nz--LLVM DUMPÚauto_parallelFz#store i64 %\"\.\d", i64\* %"retptr")rl   r   ÚFlagsÚoptionsÚdefaultr_   ÚassertRegexrn   s     r   Ú_check_dump_llvmÚDebugTestBase._check_dump_llvm\   sL   € Ø�‰�m SÔ)Ü�>‰>×!Ñ! /Ñ2×:Ñ:×BÑBÀeÓKØ×Ñ˜SÐ"HÈ#ÕNð Lr   c                 óf   • U R                  SU R                  -  U5        U R                  SU5        g )Nz--FUNCTION OPTIMIZED DUMP %súadd nsw i64 %arg.somearg, 1rv   rn   s     r   Ú_check_dump_func_opt_llvmÚ'DebugTestBase._check_dump_func_opt_llvma   s)   € Ø�‰Ð4°t·~±~ÑEÀsÔKà�‰Ð3°SÕ9r   c                 óf   • U R                  SU R                  -  U5        U R                  SU5        g )Nz--OPTIMIZED DUMP %sr†   rv   rn   s     r   Ú_check_dump_optimized_llvmÚ(DebugTestBase._check_dump_optimized_llvmf   s)   € Ø�‰Ð+¨d¯n©nÑ<¸cÔBØ�‰Ð3°SÕ9r   c                 óš   • U R                  SU R                  -  U5        [        R                  " 5       S;   a  U R                  SU5        g g )Nz--ASSEMBLY %s)Úx86_64ÚAMD64Úi386Úi686Úxorl)rl   rw   ÚplatformÚmachinern   s     r   Ú_check_dump_assemblyÚ"DebugTestBase._check_dump_assemblyj   s?   € Ø�‰�o¨¯©Ñ6¸Ô<Ü×ÒÓÐ!DÓDØ�M‰M˜& #Õ&ð Er   r   N)r)   r*   r+   r,   ÚsetrW   rR   ra   ro   rs   rx   r{   rƒ   r‡   rŠ   r”   r-   r   r   r   rC   rC   7   sF   † áò Dó E€Iò;ò
3ò7ò-ò?ò,òOò
:ò
:õ'r   rC   c                   ó   • \ rS rSrSrS rSrg)ÚFunctionDebugTestBaseép   r   c                 ó   • [        5        n[        [        R                  45      " [        5      nU R                  U" S5      S5        S S S 5        UR                  5       $ ! , (       d  f       WR                  5       $ = f)Né   rd   )r   r   r   Úint64r   ÚassertPreciseEqualÚgetvalue©r&   r[   Úcfuncs      r   Úcompile_simple_nopythonÚ-FunctionDebugTestBase.compile_simple_nopythont   s]   € ÜÔ #Üœ%Ÿ+™+˜Ô(¬Ó9ˆEà×#Ñ#¡E¨!£H¨aÔ0÷ ð �|‰|‹~Ð÷	 Ôð �|‰|‹~Ðús   ‹=A Á 
A=r   N)r)   r*   r+   r,   rw   r¡   r-   r   r   r   r˜   r˜   p   s   † à!€Iõr   r˜   c                   ó>   • \ rS rSrS rS rS rS rS rS r	S r
S	rg
)ÚTestFunctionDebugOutputé|   c                 ó–   • [        SS5         U R                  5       nS S S 5        U R                  WS/5        g ! , (       d  f       N"= f)NÚDUMP_BYTECODETrE   ©r   r¡   ra   rn   s     r   Útest_dump_bytecodeÚ*TestFunctionDebugOutput.test_dump_bytecode~   ó:   € Ü˜_¨dÕ3Ø×.Ñ.Ó0ˆC÷ 4à×Ñ  j \Õ2÷ 4Õ3úó	   �:º
Ac                 ó–   • [        SS5         U R                  5       nS S S 5        U R                  WS/5        g ! , (       d  f       N"= f)NÚDUMP_IRTrG   r¨   rn   s     r   Útest_dump_irÚ$TestFunctionDebugOutput.test_dump_irƒ   s:   € Ü˜Y¨Õ-Ø×.Ñ.Ó0ˆC÷ .à×Ñ  d VÕ,÷ .Õ-úr¬   c                 ó–   • [        SS5         U R                  5       nS S S 5        U R                  WS/5        g ! , (       d  f       N"= f)NÚDUMP_CFGTrF   r¨   rn   s     r   Útest_dump_cfgÚ%TestFunctionDebugOutput.test_dump_cfgˆ   s:   € Ü˜Z¨Õ.Ø×.Ñ.Ó0ˆC÷ /à×Ñ  e WÕ-÷ /Õ.úr¬   c                 ó–   • [        SS5         U R                  5       nS S S 5        U R                  WS/5        g ! , (       d  f       N"= f)NÚ	DUMP_LLVMTrI   r¨   rn   s     r   Útest_dump_llvmÚ&TestFunctionDebugOutput.test_dump_llvm�   s:   € Ü˜[¨$Õ/Ø×.Ñ.Ó0ˆC÷ 0à×Ñ  f XÕ.÷ 0Õ/úr¬   c                 ó–   • [        SS5         U R                  5       nS S S 5        U R                  WS/5        g ! , (       d  f       N"= f)NÚDUMP_FUNC_OPTTrJ   r¨   rn   s     r   Útest_dump_func_opt_llvmÚ/TestFunctionDebugOutput.test_dump_func_opt_llvm’   s;   € Ü˜_¨dÕ3Ø×.Ñ.Ó0ˆC÷ 4à×Ñ  oÐ%6Õ7÷ 4Õ3úr¬   c                 ó–   • [        SS5         U R                  5       nS S S 5        U R                  WS/5        g ! , (       d  f       N"= f)NÚDUMP_OPTIMIZEDTrK   r¨   rn   s     r   Útest_dump_optimized_llvmÚ0TestFunctionDebugOutput.test_dump_optimized_llvm—   s=   € ÜÐ-¨tÕ4Ø×.Ñ.Ó0ˆC÷ 5à×Ñ Ð&6Ð%7Õ8÷ 5Õ4úr¬   c                 ó–   • [        SS5         U R                  5       nS S S 5        U R                  WS/5        g ! , (       d  f       N"= f)NÚDUMP_ASSEMBLYTrL   r¨   rn   s     r   Útest_dump_assemblyÚ*TestFunctionDebugOutput.test_dump_assemblyœ   r«   r¬   r   N)r)   r*   r+   r,   r©   r¯   r³   r·   r»   r¿   rÃ   r-   r   r   r   r¤   r¤   |   s%   † ò3ò
-ò
.ò
/ò
8ò
9õ
3r   r¤   c                   ó$   • \ rS rSrSrS rS rSrg)ÚTestGeneratorDebugOutputé¢   r   c           	      ó6  • [        5        n[        [        R                  [        R                  45      " [        5      nU R                  [        U" SS5      5      SS/5        S S S 5        UR                  5       $ ! , (       d  f       WR                  5       $ = f)Nr›   r#   )r   r   r   rœ   r   r�   Úlistrž   rŸ   s      r   Úcompile_simple_genÚ+TestGeneratorDebugOutput.compile_simple_gen¦   so   € ÜÔ #Üœ%Ÿ+™+¤u§{¡{Ð3Ô4´ZÓ@ˆEà×#Ñ#¤D©¨q°!«Ó$5¸¸1°vÔ>÷ ð �|‰|‹~Ð÷	 Ôð �|‰|‹~Ðús   ‹AA;Á;
Bc                 ó"  • [        SS5         U R                  5       nS S S 5        U R                  WS/5        U R                  SU R                  -  U5        [
        R                  " S5      nU R                  X!5        g ! , (       d  f       Nh= f)Nr®   TrG   z--GENERATOR INFO: %szÜ
            generator state variables: ['x', 'y']
            yield point #1: live variables = ['y'], weak live variables = ['x']
            yield point #2: live variables = [], weak live variables = ['y']
            )r   rÊ   ra   rl   rw   ÚtextwrapÚdedent)r&   r[   Úexpected_gen_infos      r   Útest_dump_ir_generatorÚ/TestGeneratorDebugOutput.test_dump_ir_generator­   su   € Ü˜Y¨Õ-Ø×)Ñ)Ó+ˆC÷ .à×Ñ  d VÔ,Ø�‰Ð,¨t¯~©~Ñ=¸sÔCÜ$ŸOšOð -ó Ðð
 	�‰Ð'Õ-÷ .Õ-ús   �B Â 
Br   N)r)   r*   r+   r,   rw   rÊ   rÐ   r-   r   r   r   rÆ   rÆ   ¢   s   † à€Iòõ
.r   rÆ   c                   ó$   • \ rS rSrSrS rS rSrg)ÚTestDisableJITéº   z2
Test the NUMBA_DISABLE_JIT environment variable.
c                 óî   • [        SS5         [        5          [        SS9" [        5      nU R	                  U" S5      S5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)NÚDISABLE_JITT©Únopythonr›   rd   )r   r   r
   r   r�   )r&   r    s     r   Útest_jitÚTestDisableJIT.test_jit¿   sR   € Ü˜]¨DÕ1ÜÕ!Ü TÒ*¬?Ó;�Ø×'Ñ'©¨a«°!Ô4÷ "÷ 2Ð1ß!Õ!ú÷ 2Õ1ús"   �A&˜,AÁA&Á
A#	ÁA&Á&
A4c                 óf  • [        SS5         [        5          [        [        5      " [        5      nU" 5       nU R                  UR                  S5        [        SS9" [        5      nU R                  U" U5      S5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)NrÖ   Tr#   r×   )	r   r   r   Úsimple_class_specr    r�   r%   r
   r0   )r&   ÚSimpleJITClassr/   r    s       r   Útest_jitclassÚTestDisableJIT.test_jitclassÅ   s   € Ü˜]¨DÕ1ÜÕ!Ü!)Ô*;Ô!<¼[Ó!I�á$Ó&�Ø×'Ñ'¨¯©¨qÔ1ä TÒ*Ô+<Ó=�Ø×'Ñ'©¨c«
°AÔ6÷ "÷ 2Ð1ß!Õ!ú÷ 2Õ1ús#   �B"˜A(BÂ B"Â
B	ÂB"Â"
B0r   N)r)   r*   r+   r,   Ú__doc__rÙ   rÞ   r-   r   r   r   rÓ   rÓ   º   s   † ñò5õ	7r   rÓ   c                   ó"   • \ rS rSrSrSrS rSrg)ÚTestEnvironmentOverrideéÑ   zF
Test that environment variables are reloaded by Numba when modified.
Fc                 ó  • U R                  5       nU R                  U5        [        SS5         U R                  5       nU R                  U/ SQ5        S S S 5        U R                  5       nU R                  U5        g ! , (       d  f       N0= f)NÚNUMBA_DEBUGÚ1)rG   rH   rI   rJ   rK   rL   )r¡   ÚassertFalser   ra   rn   s     r   Ú
test_debugÚ"TestEnvironmentOverride.test_debugÙ   s{   € Ø×*Ñ*Ó,ˆØ×Ñ˜ÔÜ  °Õ4Ø×.Ñ.Ó0ˆCð ×#Ñ# Cò *Hô I÷	 5ð ×*Ñ*Ó,ˆØ×Ñ˜Õ÷ 5Õ4ús   ®%A=Á=
Br   N)r)   r*   r+   r,   rà   Ú_numba_parallel_test_rè   r-   r   r   r   râ   râ   Ñ   s   † ñð
 "Ðõr   râ   c                   ól   • \ rS rSrSrSrS rS r\\	S 5       5       r
\\	S 5       5       r\	S 5       rS	rg
)ÚTestParforsDebugéæ   z-
Tests debug options associated with parfors
Fc                 ó|   • SnSnU H   nU[        UR                  5      ;   d  M  Sn  O   U R                  US5        g )NzX'parallel=True' was specified but no transformation for parallel execution was possible.FTú Warning message should be found.©ÚstrÚmessageÚ
assertTrue©r&   Ú	warn_listÚmsgÚwarning_foundÚws        r   Úcheck_parfors_warningÚ&TestParforsDebug.check_parfors_warningî   sA   € ð2ˆàˆÛˆAØ”c˜!Ÿ)™)“nÕ$Ø $�Ùñ ð 	�‰˜Ð'IÕJr   c                 ó|   • SnSnU H   nU[        UR                  5      ;   d  M  Sn  O   U R                  US5        g )NzŽprange or pndindex loop will not be executed in parallel due to there being more than one entry to or exit from the loop (e.g., an assertion).FTrï   rð   rô   s        r   Ú(check_parfors_unsupported_prange_warningÚ9TestParforsDebug.check_parfors_unsupported_prange_warningø   sC   € ð,ˆð ˆÛˆAØ”c˜!Ÿ)™)“nÕ$Ø $�Ùñ ð 	�‰˜Ð'IÕJr   c                 ó.  • [         R                  " [         R                  SS5      n[        R                  " SS9 n[        R
                  " S[        5        [        X4SS9" [        5        SSS5        U R                  W5        g! , (       d  f       N = f)zZ
Test that using parallel=True on a function that does not have parallel
semantics warns.
r›   ÚCT©ÚrecordÚalways©ÚparallelN)
r   ÚArrayÚfloat64ÚwarningsÚcatch_warningsÚsimplefilterr   r   r6   rù   )r&   Úarr_tyrø   s      r   Ú
test_warnsÚTestParforsDebug.test_warns  sl   € ô —’œUŸ]™]¨A¨sÓ3ˆÜ×$Ò$¨DÒ1°QÜ×!Ò! (Ô,CÔDÜ�&Ð!¨DÒ1Ô2DÔE÷ 2ð 	×"Ñ" 1Õ%÷ 2Õ1ús   »1BÂ
Bc                 óþ   • [         R                  " SS9 n[         R                  " S[        5        [	        [
        R                  4SS9" [        5        SSS5        U R                  W5        g! , (       d  f       N = f)z7
Test that prange with multiple exits issues a warning
Tr   r  r  N)	r  r  r	  r   r   r   rœ   rA   rü   )r&   rø   s     r   Útest_unsupported_prange_warnsÚ.TestParforsDebug.test_unsupported_prange_warns  sY   € ô ×$Ò$¨DÒ1°QÜ×!Ò! (Ô,CÔDÜ”%—+‘+�¨$Ò/Ô0BÔC÷ 2ð 	×5Ñ5°aÕ8÷ 2Õ1ús   •?A.Á.
A<c                 óF  • [        [        R                  4SS9" [        5        [	        SS5         [        5        n[        [        R                  4SS9" [        5        SSS5        WR                  5       R                  S5      nU Vs/ s H  nSU;   d  M  UPM     snnU Vs/ s H  nSU;   d  M  UPM     snnU Vs/ s H  nS	U;   d  M  UPM     snn[        [        R                  " S
5      R                  US   5      R                  S5      5      n[        UU[        U5      -   5      nSn	Sn
[        X„U	5       H(  u  p¼nU
R!                  X½5      nU R#                  Xì5        M*     US-   US-   4n	Sn
U H#  nU
R                   " U	6 nU R#                  Xì5        M%     [        R$                  S['        U/5      4n	Sn
U H#  nU
R                   " U	6 nU R#                  Xì5        M%     SSS5        g! , (       d  f       GN™= fs  snf s  snf s  snf ! , (       d  f       g= f)z=
Test that NUMBA_DEBUG_ARRAY_OPT_STATS produces valid output
Tr  ÚNUMBA_DEBUG_ARRAY_OPT_STATSræ   NÚ
zis produced from patternzis fused intozAfter fusion, functionz	#([0-9]+)r   r   )z"('ones function', 'NumPy mapping'))r   ÚuserÚ z6Parallel for-loop #{} is produced from pattern '{}' atz1Parallel for-loop #{} is fused into for-loop #{}.z:After fusion, function {} has {} parallel for-loop(s) #{}.)r   r   rœ   r>   r   r   rž   ÚsplitÚintÚreÚcompileÚsearchÚgroupÚrangeÚlenÚzipÚformatrl   r)   r–   )r&   r[   Úoutputr   Úparallel_loop_outputÚfuse_outputÚafter_fusion_outputÚparfor_stateÚboundsÚpatternÚfmtr=   ÚtrialsÚlpatternÚto_matchs                  r   Útest_array_debug_opt_statsÚ+TestParforsDebug.test_array_debug_opt_stats  sö  € ô 	Œe�k‰kˆ^ dÒ+Ô,<Ô=ä Ð!>ÀÕDÜ Ô" cÜ”e—k‘k�^¨dÒ3Ô4DÔE÷ #ð —\‘\“^×)Ñ)¨$Ó/ˆFá"ÓFšF�qÐ&@ÀAÑ&E—™FÑFð !ñ #Ó;šF�q o¸Ñ&:—™FÑ;ð ñ #ÓDšF�qÐ&>À!Ñ&C—™FÑDð  ô
 œrŸzšz¨,Ó7×>Ñ>Ø$ QÑ'ó )ß).©¨q«ó3ˆLä˜<Ø'¬#Ð.BÓ*CÑCóEˆFð
/ˆGàLˆCÜ'*¨6Ø+2ö(4Ñ#�˜8àŸ:™: aÓ2�Ø—‘˜hÖ/ñ(4ð $ aÑ'¨¸Ñ)9Ð:ˆGØEˆCÛ%�ØŸ:š: wÐ/�Ø—‘˜hÖ/ñ &ô
 (×0Ñ0°!´S¸,¸Ó5HÐIˆGØNˆCÛ-�ØŸ:š: wÐ/�Ø—‘˜hÖ/ñ .÷Q EÐDß"Ö"üò Gùâ;ùâD÷ EÕDúsY   °H»$G1Á+HÂ

HÂHÂHÂ%
HÂ3HÂ9HÃ 
HÃHÃDHÇ1
H 	Ç;HÈ
H r   N)r)   r*   r+   r,   rà   rê   rù   rü   r	   r   r  r  r*  r-   r   r   r   rì   rì   æ   sg   † ñð
 "ÐòKò	Kð Øñ	&ó ó ð	&ð Øñ9ó ó ð9ð ñ40ó ó40r   rì   Ú__main__)/Úosr’   r  rÍ   r  Únumpyr2   Únumba.tests.supportr   r   r   r   r   r   r	   Únumbar
   r   Ú
numba.corer   r   r   Únumba.core.errorsr   r   Únumba.experimentalr   Úunittestr   r   Úobjectr    Úint32rÜ   r0   r6   r>   rA   rC   r˜   r¤   rÆ   rÓ   râ   rì   r)   Úmainr   r   r   Ú<module>r8     sî   ðÛ 	Û Û 	Û Û ã ÷"÷ "ñ "÷ ß -Ñ -Ý 5Ý Ý 'Û òòô
�&ô ð ˜5Ÿ;™;Ð'Ð(Ð òòòòô6'�Hô 6'ôr	˜Mô 	ô#3Ð3ô #3ôL.˜}ô .ô07�]ô 7ô.Ð3ô ô*j0�xô j0ðZ ˆzÓØ‡M‚M…Oð r   