§
    ·ÄjºP  ã                   óú  — U d Z ddlZddlmc mZ ddl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  ee	j        d¦  «        re	j                             dd¬	¦  «          ee	j        d¦  «        re	j                             dd¬	¦  «         d
ZdZdZdZdddddg d¢g d¢dœdddddg d¢g d¢dœdddddg d ¢g d!¢dœd"d#d$d%d&g d'¢g d(¢dœd)d*d+d%d,g d-¢g d.¢dœd/d0d1d%dg d2¢d3gdœd4d5d6d%d7g d8¢d3gdœd9d:d;d%dg d<¢d=d3gdœgZeeeef                  ed><    G d?„ d@¦  «        ZdAeeef         dBefdC„Z dDeeef         dEeeeef                  dBeeef         fdF„Z!dBe"eeeeef                  f         fdG„Z#dHeeeef                  dIedBdfdJ„Z$ ej%        dK¬L¦  «        dM„ ¦   «         Z&dN„ Z'dO„ Z(dP„ Z)dQ„ Z*dR„ Z+dS„ Z,dT„ Z-dU„ Z.e/dVk    r: e0dW¦  «          e#¦   «         \  Z1Z2 e$e2e1¦  «          e	j3        e1rdndX¦  «         dS dS )Yu)  DSCons ERP Mem0 Knowledge Base Verification Test Suite (Remediated Prototype).

End-to-end automated verification harness for the Mem0 long-term memory engine
backing DSCons ERP (CÃ´ng ty TNHH XÃ¢y Dá»±ng Ä�á»‹nh SÆ¡n - MST: 0202111150).

Remediations applied:
1. Support project="DSCons" in Mem0Client.search() to isolate DSCons project context.
2. Remove false-positive forbidden keywords ("FLOAT cho tiá»�n tá»‡", "DOUBLE cho tiá»�n tá»‡", "scaffolding rá»—ng").
3. Make keyword relevance check evaluate across Top-3 returned DSCons hits (Recall@3).
é    N)ÚAny)ÚClientSession)Ú
sse_clientÚreconfigurezutf-8Úreplace)ÚencodingÚerrorszhttp://127.0.0.1:8765/sseÚ	developerÚDSConsgš™™™™™á?ÚQ1z,Mandatory Q1 - DSCons Root Rules & Core LawszDSCons ruleTzArea 1: Root Standards)u   Báº£y Ä�iá»�u luáº­tu
   cá»‘t lÃµizsynthetic dataõ   Ä�á»‹nh SÆ¡nÚ
0202111150u   lá»¥c giÃ¡cÚ	Hexagonal)zapp/core/logging_configÚ	FreeExileÚAtlasÚSavageú	Feral NPC)ÚidÚnameÚqueryÚ	mandatoryÚareaÚexpected_keywordsÚforbidden_keywordsÚQ2z#Mandatory Q2 - Frontend UI/UX Themezfrontend themezArea 3: Frontend UI/UX)z
Dark Slatez#0b0f19z#080d1aÚInterzJetBrains MonoÚ	Bloombergzerp_enterprise.css)r   zDialogue HUDz	Combat UIr   r   ÚQ3z/Mandatory Q3 - Backend Clean Architecture & DDDzbackend architecturezArea 2: Backend & DB)zClean ArchitectureÚDDDúNUMERIC(18, 4)ÚDecimalÚPortsz4-Layeru   4 táº§ng)zServer-Authoritative StreamingzCocos Creatorr   ÚFeralÚQ4z-Domain Q4 - AEC Pricing Norms & BoQ BudgetingzAEC pricing normsFzArea 4: AEC Business)u   ThÃ´ng tÆ° 38u   cá»« LarsenzVL = 0zMR / TzMR/TÚG_XDu   Ä�á»‹nh má»©c)u
   4.753 tá»·zcache 71r   ÚQ5z'Domain Q5 - CAD Takeoff Engine GeometryzCAD takeoff geometryzArea 4: CAD Takeoff)ÚTCVN3zstroke-width: 1pxzBounding Boxu   ChÆ°Æ¡ng SAz.VnTimez	Zero-Void)r   ÚCombatÚNPCÚQ6z2Domain Q6 - Database Precision & Financial Ledgerszdatabase precision)r    r!   u	   Sá»• kÃ©pzDouble-entryz18, 4r   ÚQ7z,Domain Q7 - Testing Workflow & Quality Gatesztesting workflowzArea 5: Testing & Workflow)zDeep MatrixzD1-D6u   D1 Ä�áº¿n D6ÚTDDztask.mdÚVerificationz80%ÚQ8z(Domain Q8 - Mandatory MCP Tools ProtocolzMCP tools protocol)zlsp-mcpzchrome-devtools-mcpÚ
markitdownÚmemoryÚ	StitchMCPu"   grep_search cho Ä‘á»•i tÃªn symbolÚVERIFICATION_CATALOGc                   ó¦   — e Zd ZdZefdefd„Zdeeef         fd„Z	de
fdeded	ed
z  deeeef                  fd„Zdeeeef                  fd„Zd
S )Ú
Mem0ClientzTLightweight async MCP client for querying the local Mem0 FastMCP background service.Ússe_urlc                 ó   — || _         d S )N)r5   )Úselfr5   s     ú2C:\Projects\DSCons\tests\test_mem0_verification.pyÚ__init__zMem0Client.__init__Í   s   € ØˆŒˆˆó    Úreturnc              ƒ   óà  K  — t          | j        ¦  «        4 ƒd{V —†	 \  }}t          ||¦  «        4 ƒd{V —†	 }|                     ¦   «         ƒ d{V —† |                     di ¬¦  «        ƒ d{V —†}t          j        |j        d         j        ¦  «        cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )z&Check Mem0 service operational status.NÚmem0_status©Ú	argumentsr   )	r   r5   r   Ú
initializeÚ	call_toolÚjsonÚloadsÚcontentÚtext)r7   ÚreadÚwriteÚsessionÚress        r8   Úcheck_statuszMem0Client.check_statusÐ   sI  è è € õ �t”|Ñ$Ô$ð	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3Ù(5¨¨uÝ˜$ Ñ&Ô&ð	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3à*1à×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø×)Ò)¨-À2Ð)ÑFÔFÐFÐFÐFÐFÐFÐFˆCÝ”:˜cœk¨!œnÔ1Ñ2Ô2ð	3ð 	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3ð 	3ð 	3s5   žC¹AB9ÂCÂ9
C	ÃCÃC	ÃCÃ
C'Ã*C'é   r   ÚlimitÚprojectNc              ƒ   óX  K  — t          | j        ¦  «        4 ƒd{V —†	 \  }}t          ||¦  «        4 ƒd{V —†	 }|                     ¦   «         ƒ d{V —† |t          |dœ}|r||d<   |                     d|¬¦  «        ƒ d{V —†}t          j        |j        d         j	        ¦  «        }	|	 
                    di ¦  «         
                    dg ¦  «        cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )	z0Search Mem0 long-term memory for matching facts.N)r   Úuser_idrL   rM   Úmem0_searchr>   r   ÚmemoriesÚresults)r   r5   r   r@   ÚUSER_IDrA   rB   rC   rD   rE   Úget)
r7   r   rL   rM   rF   rG   rH   r?   rI   Údatas
             r8   ÚsearchzMem0Client.searchÚ   sŽ  è è € õ
 �t”|Ñ$Ô$ð
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?Ù(5¨¨uÝ˜$ Ñ&Ô&ð
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?à*1à×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø27ÅGÐV[Ð(\Ð(\ˆIØð /Ø'.�	˜)Ñ$Ø×)Ò)¨-À9Ð)ÑMÔMÐMÐMÐMÐMÐMÐMˆCÝ”:˜cœk¨!œnÔ1Ñ2Ô2ˆDØ—8’8˜J¨Ñ+Ô+×/Ò/°	¸2Ñ>Ô>ð
	?ð 
	?ð 
	?ð 
	?ñ 
	?ô 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ñ 
	?ô 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?øøøð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ñ 
	?ô 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?øøøð 
	?ð 
	?ð 
	?ð 
	?ð 
	?ð 
	?s5   žD¹BC5ÃDÃ5
C?	Ã?DÄC?	ÄDÄ
D#Ä&D#c              ƒ   óB  K  — t          | j        ¦  «        4 ƒd{V —†	 \  }}t          ||¦  «        4 ƒd{V —†	 }|                     ¦   «         ƒ d{V —† |                     ddt
          i¬¦  «        ƒ d{V —†}t          j        |j        d         j	        ¦  «        }| 
                    di ¦  «         
                    dg ¦  «        cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )z(Fetch all stored memories for developer.NÚmem0_get_allrO   r>   r   rQ   rR   )r   r5   r   r@   rA   rS   rB   rC   rD   rE   rT   )r7   rF   rG   rH   rI   rU   s         r8   Úget_allzMem0Client.get_allê   s†  è è € õ �t”|Ñ$Ô$ð		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?Ù(5¨¨uÝ˜$ Ñ&Ô&ð		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?à*1à×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø×)Ò)Ø¨9µgÐ*>ð *ñ ô ð ð ð ð ð ð ˆCõ ”:˜cœk¨!œnÔ1Ñ2Ô2ˆDØ—8’8˜J¨Ñ+Ô+×/Ò/°	¸2Ñ>Ô>ð		?ð 		?ð 		?ð 		?ñ 		?ô 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ñ 		?ô 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?øøøð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ñ 		?ô 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?øøøð 		?ð 		?ð 		?ð 		?ð 		?ð 		?s5   žD¹BC*ÃDÃ*
C4	Ã4DÃ7C4	Ã8DÄ
DÄD)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚMEM0_SSE_URLÚstrr9   Údictr   rJ   ÚDEFAULT_PROJECTÚintÚlistrV   rY   © r:   r8   r4   r4   Ê   sÙ   € € € € € Ø^Ð^à&2ð ð  ð ð ð ð ð3 D¨¨c¨¤Nð 3ð 3ð 3ð 3ð ()Àð?ð ?Øð?Ø!$ð?Ø36¸±:ð?à	ˆd�3˜�8ŒnÔ	ð?ð ?ð ?ð ?ð ?˜t D¨¨c¨¤NÔ3ð ?ð ?ð ?ð ?ð ?ð ?r:   r4   Úitemr;   c                 óN  — |                       dd¦  «        }|                       d¦  «        pi }t          |                      dd¦  «        ¦  «                             ¦   «                              ¦   «         }|dk    rdS t	          |                     d¦  «        pd|v pd	|v ¦  «        S )
zEDetermine whether a returned record belongs to the DSCons ERP domain.r0   Ú ÚmetadatarM   ÚdsconsTz[DSConsz
DSCons ERPr   )rT   r_   ÚstripÚlowerÚboolÚ
startswith)re   rE   rh   Úprojs       r8   Úis_dscons_recordro   ø   s�   € à�8Š8�H˜bÑ!Ô!€DØ�xŠx˜
Ñ#Ô#Ð) r€HÝˆx�|Š|˜I rÑ*Ô*Ñ+Ô+×1Ò1Ñ3Ô3×9Ò9Ñ;Ô;€DàˆxÒÐØˆtÝ�—’ 	Ñ*Ô*Ð\¨l¸dÐ.BÐ\ÀnÐX\ÐF\Ñ]Ô]Ð]r:   Úcatalog_entryrR   c                 ó¬  — | d         }| d         }| d         }| d         }|| d         || d         t          |¦  «        dddd	dd
g ddg dœ}|s|d                              d¦  «         |S |d         }|                     dd¦  «        }t          |                     dd¦  «        ¦  «        }	|	|d<   t          |¦  «        dk    r|d
d…         dz   n||d<   |	t          k    |d<   t          |¦  «        }
|d
d…         }t          d„ |D ¦   «         ¦  «        }|r|t          |¦  «        z  nd}|
o|dk    ot          |
¦  «        |d<   |D ][}|                     dd¦  «        }|D ]6}|                     ¦   «         |                     ¦   «         v rd	|d<   ||d<    nŒ7|d         r nŒ\t          |¦  «        D �]|\  }}|                     dd¦  «        }|                     d¦  «        pi }t          |                     dd¦  «        ¦  «                             ¦   «         }|D ]T}|                     ¦   «         |                     ¦   «         v r*d|d<   |d                              d |d!z   › d"|› d#�¦  «         ŒUd$|                     ¦   «         v sd%|                     ¦   «         v r-|d&k    r'd|d<   |d                              d |d!z   › d'�¦  «         |d(                              |d!z   |                     dd¦  «        t          |¦  «        t          |¦  «        d)k    r|d
d)…         dz   n|d*œ¦  «         �Œ~|d         o|d         o|d         o|d         |d+<   |S ),z=Evaluate a single query's results against pass/fail criteria.r   r   r   r   r   r   g        FTNrg   )r   r   r   r   Ú
total_hitsÚ
top1_scoreÚ
score_passÚdomain_dominance_passÚcontamination_cleanÚexpected_keyword_foundÚmatched_keywordÚcontamination_reasonsÚoverall_passÚtop1_snippetÚ
top3_itemsry   zNo results returned from queryr   r0   Úscorers   éZ   z...r{   rt   é   c              3   ó8   K  — | ]}t          |¦  «        ¯d V — ŒdS )é   N)ro   )Ú.0Úrs     r8   ú	<genexpr>z(evaluate_query_result.<locals>.<genexpr>2  s0   è è € ÐCÐC !Õ/?ÀÑ/BÔ/BÐC˜AÐCÐCÐCÐCÐCÐCr:   g…ëQ¸å?ru   rw   rx   rh   rM   rv   zHit #r�   z contains forbidden keyword 'ú'Ú	freeexilez	feral npcri   z4 has corrupted metadata (FreeExile tagged as DSCons)r|   éF   )Úrankr}   Ú	is_dsconsÚsnippetrz   )ÚlenÚappendrT   ÚfloatÚMIN_SIMILARITY_SCOREro   Úsumrl   rk   Ú	enumerater_   )rp   rR   Úentry_idr   Úexpected_kwsÚforbidden_kwsÚ
evaluationÚtop1Ú	top1_textrs   Útop1_is_dsconsÚtop3Útop3_dscons_countÚ
top3_ratiorƒ   Úr_textÚkwÚiÚr_metaÚr_projÚfkws                        r8   Úevaluate_query_resultr¡     s/  € ð ˜TÔ"€HØ˜'Ô"€EØ Ð!4Ô5€LØ!Ð"6Ô7€Mð Ø˜fÔ%ØØ" ;Ô/Ý˜'‘l”lØØØ!&Ø#Ø"'ØØ!#ØØØðð €Jð$ ð ØÐ*Ô+×2Ò2Ð3SÑTÔTÐTØÐà�1Œ:€DØ—’˜ 2Ñ&Ô&€IÝ�t—x’x ¨Ñ-Ô-Ñ.Ô.€JØ)€Jˆ|Ñå$'¨	¡N¤N°RÒ$7Ð$7ˆ�3�B�3Œ˜%Ñ	Ð	¸Yð ˆ~Ñð
  *Õ-AÒA€Jˆ|Ñõ & dÑ+Ô+€Nà�2�A�2Œ;€DÝÐCÐC tÐCÑCÔCÑCÔCÐØ26Ð?Ð"¥S¨¡Y¤YÑ.Ð.¸C€Jð 	ÐH˜J¨$Ò.ÐHµD¸Ñ4HÔ4Hð Ð&Ñ'ð
 ð ð ˆØ—’�x Ñ$Ô$ˆØð 	ð 	ˆBØ�xŠx‰zŒz˜VŸ\š\™^œ^Ð+Ð+Ø7;�
Ð3Ñ4Ø02�
Ð,Ñ-Ø�ð ,ð Ð.Ô/ð 	ØˆEð	õ ˜$‘”ð 
ñ 
‰ˆˆ1Ø—’�x Ñ$Ô$ˆØ—’�zÑ"Ô"Ð( bˆÝ�V—Z’Z 	¨2Ñ.Ô.Ñ/Ô/×5Ò5Ñ7Ô7ˆð !ð 	ð 	ˆCØ�yŠy‰{Œ{˜fŸlšl™nœnÐ,Ð,Ø49�
Ð0Ñ1ØÐ2Ô3×:Ò:ØD˜A˜a™CÐDÐD¸cÐDÐDÐDñô ð øð ˜6Ÿ<š<™>œ>Ð)Ð)¨[¸F¿LºL¹N¼NÐ-JÐ-JØ˜Ò Ð Ø05ˆJÐ,Ñ-ØÐ.Ô/×6Ò6ØQ˜˜!™ÐQÐQÐQñô ð ð 	�<Ô ×'Ò'à˜A™ØŸš˜w¨Ñ,Ô,Ý-¨aÑ0Ô0Ý47¸±K´KÀ"Ò4DÐ4D˜F 3 B 3œK¨%Ñ/Ð/È&ð	ð ñ	
ô 	
ð 	
ñ 	
ð 	�<Ô ð 	1ØÐ.Ô/ð	1àÐ,Ô-ð	1ð Ð/Ô0ð	 ˆ~Ñð Ðr:   c                  ó¢   ‡— t          ¦   «         Šˆfd„} t          j         | ¦   «         ¦  «        \  }}t          d„ |D ¦   «         ¦  «        }||fS )zRExecute all 8 verification queries synchronously via asyncio and return scorecard.c               “   óì   •K  — ‰                      ¦   «         ƒ d {V —†} g }t          D ]J}‰                     |d         d¬¦  «        ƒ d {V —†}t          ||¦  «        }|                     |¦  «         ŒK| |fS )Nr   rK   )rL   )rJ   r2   rV   r¡   rŒ   )ÚstatusÚevaluationsÚentryrR   ÚevÚclients        €r8   Ú
_async_runz)run_all_verifications.<locals>._async_runs  sš   øè è € Ø×*Ò*Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,ˆØˆÝ)ð 	#ð 	#ˆEØ"ŸMšM¨%°¬.À˜MÑBÔBÐBÐBÐBÐBÐBÐBˆGÝ& u¨gÑ6Ô6ˆBØ×Ò˜rÑ"Ô"Ð"Ð"Ø�{Ð"Ð"r:   c              3   ó&   K  — | ]}|d          V — ŒdS )rz   Nrd   ©r‚   r§   s     r8   r„   z(run_all_verifications.<locals>.<genexpr>}  s'   è è € Ð>Ð>¨B�R˜Ô'Ð>Ð>Ð>Ð>Ð>Ð>r:   )r4   ÚasyncioÚrunÚall)r©   Ú_statusr¥   Ú
all_passedr¨   s       @r8   Úrun_all_verificationsr±   o  sh   ø€ å‰\Œ\€Fð#ð #ð #ð #ð #õ #œ; z z¡|¤|Ñ4Ô4Ñ€Gˆ[ÝÐ>Ð>°+Ð>Ñ>Ô>Ñ>Ô>€JØ�{Ð"Ð"r:   r¥   r°   c                 óê  — d}d}t          d|z   ¦  «         t          d¦  «         t          |¦  «         t          ddd›dd	d
›ddd›ddd›ddd›ddd›ddd›�¦  «         t          |¦  «         | D ]£}|d         }|d         rdnd}t          |d         ¦  «        dk    r|d         dd…         dz   n|d         }|d         d›}|d         rd nd!}	|d"         rd#nd$}
|d%         rd&nd!}t          d|d›d|d
›d|d›d|d›d|	d›d|
d›d|d›�¦  «         Œ¤t          |¦  «         t          d'„ | D ¦   «         ¦  «        }t          | ¦  «        }||z  d(z  }t          d)|› d*|› d+|d,›d-�¦  «         |rt          d.¦  «         �n`t          d/¦  «         t          d0¦  «         | D �]>}|d%         �s2t          d1|d         › d2|d         › d3�¦  «         t          d4|d         d›d5t          › d6|d7         › d8�¦  «         t          d9|d         › �¦  «         t          d:|d;         › d<|d=         › d8�¦  «         t          d>|d"         › �¦  «         |d?         r|d?         D ]}t          d@|› �¦  «         Œt          dA|dB         › �¦  «         |dC         rNt          dD¦  «         |dC         D ]6}t          dE|dF         › dG|dH         d›dI|dJ         › dK|dL         › �¦  «         Œ7�Œ@t          |dz   ¦  «         dS )Mz=Print an attractive, aligned ASCII scorecard table to stdout.z^==============================================================================================z^----------------------------------------------------------------------------------------------ú
z?                     DSCONS ERP MEM0 LONG-TERM MEMORY SCORECARDú ÚIDz<3z | ÚTypez<5zQuery Stringz<24zTop-1z<7ÚDomainz<8ÚContamÚStatusz<6r   r   ÚManÚDomr   é   Né   z..rs   ú.4fru   r   ÚFAILrv   ÚCLEANÚDIRTYrz   ÚPASSc              3   ó*   K  — | ]}|d          ¯
dV — ŒdS )rz   r�   Nrd   r«   s     r8   r„   z"print_scorecard.<locals>.<genexpr>Ÿ  s,   è è € ÐEÐE˜R°"°^Ô2DÐE�qÐEÐEÐEÐEÐEÐEr:   g      Y@z
 SUMMARY: ú/z Queries Passed (z.1fz%)zB FINAL VERDICT: [PASS] All 8 queries met 100% acceptance criteria.z@ FINAL VERDICT: [FAIL] System requires cleanup and/or ingestion.z
--- FAILURE DIAGNOSTICS ---z
[!] Failure in z - "z":z    - Score: z (>= z: rt   ú)z    - Domain Dominance: z    - Keyword Found: rw   z (Matched: rx   z    - Contamination Clean: ry   z      * Contamination: z    - Top 1 Snippet: r{   r|   z    - Top Hits:z      #rˆ   z: score=r}   z is_dscons=r‰   z text=rŠ   )Úprintr‹   r�   rŽ   )r¥   r°   ÚborderÚ
sub_borderr§   Úq_idÚq_typeÚ	query_strÚ	score_strÚ
domain_strÚ
contam_strÚ
status_strÚpassed_countÚtotal_countÚpass_pctÚcrÚits                    r8   Úprint_scorecardrÕ   �  s©  € à€FØ€Jå	ˆ$�‰-ÑÔÐÝ	Ð
KÑLÔLÐLÝ	ˆ&�M„M€MÝ	ØyˆDÐyÐyÐy˜ÐyÐyÐy nÐyÐyÐy¸WÐyÐyÐyÈHÐyÐyÐyÐ\dÐyÐyÐyÐltÐyÐyÐyñô ð õ 
ˆ*ÑÔÐàð 
ð 
ˆØ�$ŒxˆØ˜[œ/Ð4��¨uˆå'*¨2¨g¬;Ñ'7Ô'7¸"Ò'<Ð'<ˆBˆwŒK˜˜˜Ô˜tÑ#Ð#À"ÀWÄ+ð 	ð ˜,Ô'Ð-Ð-ˆ	Ø!#Ð$;Ô!<ÐH�X�XÀ&ˆ
Ø "Ð#8Ô 9ÐF�W�W¸wˆ
Ø! .Ô1Ð=�V�V°vˆ
åð A�ð  Að  Að  A˜Fð  Að  Að  A¨)ð  Að  Að  A¸Ið  Að  Að  AÈZð  Að  Að  AÐ_ið  Að  Að  AÐq{ð  Að  Að  Añ	
ô 	
ð 	
ð 	
õ 
ˆ&�M„M€MåÐEÐE ;ÐEÑEÔEÑEÔE€LÝ�kÑ"Ô"€KØ˜{Ñ*¨eÑ3€Hå	ØR�\ÐRÐR KÐRÐRÀ(ÐRÐRÐRÐRñô ð ð ð ÝÐRÑSÔSÐSÑSåÐPÑQÔQÐQÝÐ-Ñ.Ô.Ð.Øð 	ñ 	ˆBØ�nÔ%ñ ÝÐI¨"¨T¬(ÐIÐI¸¸G¼ÐIÐIÐIÑJÔJÐJÝØj B |Ô$4ÐjÐjÐjÕ?SÐjÐjÐWYÐZfÔWgÐjÐjÐjñô ð õ ÐN°Ð4KÔ1LÐNÐNÑOÔOÐOÝØm¨BÐ/GÔ,HÐmÐmÐUWÐXiÔUjÐmÐmÐmñô ð õ ÐO°BÐ7LÔ4MÐOÐOÑPÔPÐPØÐ-Ô.ð >Ø Ð!8Ô9ð >ð >˜ÝÐ<¸Ð<Ð<Ñ=Ô=Ð=Ð=ÝÐB¨b°Ô.@ÐBÐBÑCÔCÐCØ�lÔ#ð ÝÐ+Ñ,Ô,Ð,Ø  Ô.ð ð ˜ÝØ| b¨¤jÐ|Ð|¸"¸W¼+Ð|Ð|Ð|ÐVXÐYdÔVeÐ|Ð|ÐmoÐpyÔmzÐ|Ð|ñô ð ð ùõ 
ˆ&�4‰-ÑÔÐÐÐr:   Úmodule)Úscopec                  ó<   — t          ¦   «         \  } }d„ |D ¦   «         S )z<Module fixture caching the 8 verification query evaluations.c                 ó    — i | ]}|d          |“ŒS )r   rd   r«   s     r8   ú
<dictcomp>z(verification_results.<locals>.<dictcomp>Í  s   € Ð/Ð/Ð/˜RˆBˆtŒH�bÐ/Ð/Ð/r:   )r±   )Ú_all_passedr¥   s     r8   Úverification_resultsrÜ   É  s(   € õ  5Ñ6Ô6Ñ€K�Ø/Ð/ ;Ð/Ñ/Ô/Ð/r:   c                 óÂ  — | d         }|d         }|sat          j        d|d         d›dt          › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d
         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sOt          j        d¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|s:ddt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}d	S )z5Verify Mandatory Q1: DSCons root rules and core laws.r   rt   úTop-1 score rs   r¾   ú < ú
>assert %(py1)sÚpy1Nru   úDomain dominance failed for r   rv   úContamination detected: ry   rw   z4No expected DSCons root rule keywords found in Top-3rz   úassert %(py1)s©Ú
@pytest_arÚ_format_assertmsgrŽ   Ú	_safereprÚAssertionErrorÚ_format_explanation©rÜ   r§   Ú@py_assert0Ú@py_format2s       r8   Útest_q1_dscons_root_rulesrî   Ð  ó   € à	˜dÔ	#€Bà
ˆ<ÔðFØðFõ Fä4EÐE�b˜Ô&ÐEÐEÐEÕ/CÐEÐEñFô Fð Fñ Fð Fõ Fä<Eð 	ñFô Fð Fñ Fð Fõ Fõ Fä2EðFñ Fô Fñ Fô Fð Fð Fð Fð 	Ð"Ô#ð4Ø#ð4õ 4ä"3Ð3 b¨¤kÐ3Ð3ñ4ô 4ð 4ñ 4ð 4õ 4ä*3ð 	$ñ4ô 4ð 4ñ 4ð 4õ 4õ 4ä 3ð4ñ 4ô 4ñ 4ô 4ð 4ð 4ð 4ð 	Ð Ô!ð@Ø!ð@õ @ä.?Ð? "Ð%<Ô"=Ð?Ð?ñ@ô @ð @ñ @ð @õ @ä6?ð 	"ñ@ô @ð @ñ @ð @õ @õ @ä,?ð@ñ @ô @ñ @ô @ð @ð @ð @ð 	Ð#Ô$ð>Ø$ð>õ >ä,=Ð=ñ>ô >ð >ñ >ð >õ >ä4=ð 	%ñ>ô >ð >ñ >ð >õ >õ >ä*=ð>ñ >ô >ñ >ô >ð >ð >ð >ð ˆnÔÐÐÐÐÐÕÔÐÑÔÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐr:   c                 óÂ  — | d         }|d         }|sat          j        d|d         d›dt          › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d
         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sOt          j        d¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|s:ddt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}d	S )z5Verify Mandatory Q2: Frontend UI/UX Dark Slate theme.r   rt   rÞ   rs   r¾   rß   rà   rá   Nru   râ   r   rv   rã   ry   rw   z0No Dark Slate / UI theme keywords found in Top-3rz   rä   rå   rë   s       r8   Útest_q2_frontend_themerñ   â  s   € à	˜dÔ	#€Bà
ˆ<ÔðFØðFõ Fä4EÐE�b˜Ô&ÐEÐEÐEÕ/CÐEÐEñFô Fð Fñ Fð Fõ Fä<Eð 	ñFô Fð Fñ Fð Fõ Fõ Fä2EðFñ Fô Fñ Fô Fð Fð Fð Fð 	Ð"Ô#ð4Ø#ð4õ 4ä"3Ð3 b¨¤kÐ3Ð3ñ4ô 4ð 4ñ 4ð 4õ 4ä*3ð 	$ñ4ô 4ð 4ñ 4ð 4õ 4õ 4ä 3ð4ñ 4ô 4ñ 4ô 4ð 4ð 4ð 4ð 	Ð Ô!ð@Ø!ð@õ @ä.?Ð? "Ð%<Ô"=Ð?Ð?ñ@ô @ð @ñ @ð @õ @ä6?ð 	"ñ@ô @ð @ñ @ð @õ @õ @ä,?ð@ñ @ô @ñ @ô @ð @ð @ð @ð 	Ð#Ô$ð:Ø$ð:õ :ä(9Ð9ñ:ô :ð :ñ :ð :õ :ä09ð 	%ñ:ô :ð :ñ :ð :õ :õ :ä&9ð:ñ :ô :ñ :ô :ð :ð :ð :ð ˆnÔÐÐÐÐÐÕÔÐÑÔÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐr:   c                 óÂ  — | d         }|d         }|sat          j        d|d         d›dt          › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d
         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sOt          j        d¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|s:ddt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}d	S )z6Verify Mandatory Q3: Backend Clean Architecture & DDD.r   rt   rÞ   rs   r¾   rß   rà   rá   Nru   râ   r   rv   rã   ry   rw   z-No Clean Architecture keywords found in Top-3rz   rä   rå   rë   s       r8   Útest_q3_backend_architectureró   ô  ó   € à	˜dÔ	#€Bà
ˆ<ÔðFØðFõ Fä4EÐE�b˜Ô&ÐEÐEÐEÕ/CÐEÐEñFô Fð Fñ Fð Fõ Fä<Eð 	ñFô Fð Fñ Fð Fõ Fõ Fä2EðFñ Fô Fñ Fô Fð Fð Fð Fð 	Ð"Ô#ð4Ø#ð4õ 4ä"3Ð3 b¨¤kÐ3Ð3ñ4ô 4ð 4ñ 4ð 4õ 4ä*3ð 	$ñ4ô 4ð 4ñ 4ð 4õ 4õ 4ä 3ð4ñ 4ô 4ñ 4ô 4ð 4ð 4ð 4ð 	Ð Ô!ð@Ø!ð@õ @ä.?Ð? "Ð%<Ô"=Ð?Ð?ñ@ô @ð @ñ @ð @õ @ä6?ð 	"ñ@ô @ð @ñ @ð @õ @õ @ä,?ð@ñ @ô @ñ @ô @ð @ð @ð @ð 	Ð#Ô$ð7Ø$ð7õ 7ä%6Ð6ñ7ô 7ð 7ñ 7ð 7õ 7ä-6ð 	%ñ7ô 7ð 7ñ 7ð 7õ 7õ 7ä#6ð7ñ 7ô 7ñ 7ô 7ð 7ð 7ð 7ð ˆnÔÐÐÐÐÐÕÔÐÑÔÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐr:   c                 óÂ  — | d         }|d         }|sat          j        d|d         d›dt          › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d
         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sOt          j        d¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|s:ddt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}d	S )z2Verify Domain Q4: AEC pricing norms & Circular 38.r$   rt   rÞ   rs   r¾   rß   rà   rá   Nru   râ   r   rv   rã   ry   rw   z6No Circular 38 / pricing norms keywords found in Top-3rz   rä   rå   rë   s       r8   Útest_q4_aec_pricing_normsrö     s8  € à	˜dÔ	#€Bà
ˆ<ÔðFØðFõ Fä4EÐE�b˜Ô&ÐEÐEÐEÕ/CÐEÐEñFô Fð Fñ Fð Fõ Fä<Eð 	ñFô Fð Fñ Fð Fõ Fõ Fä2EðFñ Fô Fñ Fô Fð Fð Fð Fð 	Ð"Ô#ð4Ø#ð4õ 4ä"3Ð3 b¨¤kÐ3Ð3ñ4ô 4ð 4ñ 4ð 4õ 4ä*3ð 	$ñ4ô 4ð 4ñ 4ð 4õ 4õ 4ä 3ð4ñ 4ô 4ñ 4ô 4ð 4ð 4ð 4ð 	Ð Ô!ð@Ø!ð@õ @ä.?Ð? "Ð%<Ô"=Ð?Ð?ñ@ô @ð @ñ @ð @õ @ä6?ð 	"ñ@ô @ð @ñ @ð @õ @õ @ä,?ð@ñ @ô @ñ @ô @ð @ð @ð @ð 	Ð#Ô$ð@Ø$ð@õ @ä.?Ð?ñ@ô @ð @ñ @ð @õ @ä6?ð 	%ñ@ô @ð @ñ @ð @õ @õ @ä,?ð@ñ @ô @ñ @ô @ð @ð @ð @ð ˆnÔÐÐÐÐÐÕÔÐÑÔÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐr:   c                 óÂ  — | d         }|d         }|sat          j        d|d         d›dt          › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d
         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sOt          j        d¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|s:ddt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}d	S )z6Verify Domain Q5: CAD takeoff engine & TCVN3 decoding.r&   rt   rÞ   rs   r¾   rß   rà   rá   Nru   râ   r   rv   rã   ry   rw   z.No CAD takeoff / TCVN3 keywords found in Top-3rz   rä   rå   rë   s       r8   Útest_q5_cad_takeoff_geometryrø     s   € à	˜dÔ	#€Bà
ˆ<ÔðFØðFõ Fä4EÐE�b˜Ô&ÐEÐEÐEÕ/CÐEÐEñFô Fð Fñ Fð Fõ Fä<Eð 	ñFô Fð Fñ Fð Fõ Fõ Fä2EðFñ Fô Fñ Fô Fð Fð Fð Fð 	Ð"Ô#ð4Ø#ð4õ 4ä"3Ð3 b¨¤kÐ3Ð3ñ4ô 4ð 4ñ 4ð 4õ 4ä*3ð 	$ñ4ô 4ð 4ñ 4ð 4õ 4õ 4ä 3ð4ñ 4ô 4ñ 4ô 4ð 4ð 4ð 4ð 	Ð Ô!ð@Ø!ð@õ @ä.?Ð? "Ð%<Ô"=Ð?Ð?ñ@ô @ð @ñ @ð @õ @ä6?ð 	"ñ@ô @ð @ñ @ð @õ @õ @ä,?ð@ñ @ô @ñ @ô @ð @ð @ð @ð 	Ð#Ô$ð8Ø$ð8õ 8ä&7Ð7ñ8ô 8ð 8ñ 8ð 8õ 8ä.7ð 	%ñ8ô 8ð 8ñ 8ð 8õ 8õ 8ä$7ð8ñ 8ô 8ñ 8ô 8ð 8ð 8ð 8ð ˆnÔÐÐÐÐÐÕÔÐÑÔÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐr:   c                 óÂ  — | d         }|d         }|sat          j        d|d         d›dt          › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d
         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sOt          j        d¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|s:ddt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}d	S )z=Verify Domain Q6: Database precision NUMERIC(18,4) & ledgers.r*   rt   rÞ   rs   r¾   rß   rà   rá   Nru   râ   r   rv   rã   ry   rw   z4No NUMERIC(18,4) / precision keywords found in Top-3rz   rä   rå   rë   s       r8   Útest_q6_database_precisionrú   *  rï   r:   c                 óÂ  — | d         }|d         }|sat          j        d|d         d›dt          › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d
         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sOt          j        d¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|s:ddt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}d	S )z;Verify Domain Q7: Deep Matrix D1-D6 testing workflow & TDD.r+   rt   rÞ   rs   r¾   rß   rà   rá   Nru   râ   r   rv   rã   ry   rw   z5No Deep Matrix / TDD workflow keywords found in Top-3rz   rä   rå   rë   s       r8   Útest_q7_testing_workflowrü   <  s   € à	˜dÔ	#€Bà
ˆ<ÔðFØðFõ Fä4EÐE�b˜Ô&ÐEÐEÐEÕ/CÐEÐEñFô Fð Fñ Fð Fõ Fä<Eð 	ñFô Fð Fñ Fð Fõ Fõ Fä2EðFñ Fô Fñ Fô Fð Fð Fð Fð 	Ð"Ô#ð4Ø#ð4õ 4ä"3Ð3 b¨¤kÐ3Ð3ñ4ô 4ð 4ñ 4ð 4õ 4ä*3ð 	$ñ4ô 4ð 4ñ 4ð 4õ 4õ 4ä 3ð4ñ 4ô 4ñ 4ô 4ð 4ð 4ð 4ð 	Ð Ô!ð@Ø!ð@õ @ä.?Ð? "Ð%<Ô"=Ð?Ð?ñ@ô @ð @ñ @ð @õ @ä6?ð 	"ñ@ô @ð @ñ @ð @õ @õ @ä,?ð@ñ @ô @ñ @ô @ð @ð @ð @ð 	Ð#Ô$ð?Ø$ð?õ ?ä->Ð>ñ?ô ?ð ?ñ ?ð ?õ ?ä5>ð 	%ñ?ô ?ð ?ñ ?ð ?õ ?õ ?ä+>ð?ñ ?ô ?ñ ?ô ?ð ?ð ?ð ?ð ˆnÔÐÐÐÐÐÕÔÐÑÔÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐr:   c                 óÂ  — | d         }|d         }|sat          j        d|d         d›dt          › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d
         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|sOt          j        d¦  «        dz   dt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}|d         }|s:ddt          j        |¦  «        iz  }t	          t          j        |¦  «        ¦  «        ‚d	}d	S )z/Verify Domain Q8: Mandatory MCP tools protocol.r.   rt   rÞ   rs   r¾   rß   rà   rá   Nru   râ   r   rv   rã   ry   rw   z-No MCP tools protocol keywords found in Top-3rz   rä   rå   rë   s       r8   Útest_q8_mcp_tools_protocolrþ   N  rô   r:   Ú__main__zTInitiating DSCons ERP Mem0 Knowledge Base Verification Run (Remediated Prototype)...r�   )4r]   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteræ   r¬   rB   ÚsysÚtypingr   ÚpytestÚmcp.client.sessionr   Úmcp.client.sser   ÚhasattrÚstdoutr   Ústderrr^   rS   ra   rŽ   r2   rc   r`   r_   Ú__annotations__r4   rl   ro   r¡   Útupler±   rÕ   ÚfixturerÜ   rî   rñ   ró   rö   rø   rú   rü   rþ   rZ   rÆ   r°   r¥   Úexitrd   r:   r8   ú<module>r     s  ðð	ð 	ð 	ð € € € € € € € € € € € € €€€€Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ð Ð à €€€Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø %Ð %Ð %Ð %Ð %Ð %ð €7ˆ3Œ:�}Ñ%Ô%ð ?Ø„J×Ò G°IÐÑ>Ô>Ð>Ø
€7ˆ3Œ:�}Ñ%Ô%ð ?Ø„J×Ò G°IÐÑ>Ô>Ð>ð +€Ø
€Ø€ØÐ ð
 Ø>ØØØ(ð
ð 
ð 
ð
ð 
ð 
ðð ð0 Ø5Ø!ØØ(ð
ð 
ð 
ð
ð 
ð 
ðð ð0 ØAØ'ØØ&ð
ð 
ð 
ð
ð 
ð 
ðð ð. Ø?Ø$ØØ&ð
ð 
ð 
ð
ð 
ð 
ðð ð, Ø9Ø'ØØ%ð
ð 
ð 
ð
ð 
ð 
ðð ð* ØDØ%ØØ&ð
ð 
ð 
ð ð
ðð ð$ Ø>Ø#ØØ,ð
ð 
ð 
ð ð
ðð ð( Ø:Ø%ØØ(ð
ð 
ð 
ð 1Øð
ðð ðed.Ð �d˜4  S œ>Ô*ð dð dñ dðN+?ð +?ð +?ð +?ð +?ñ +?ô +?ð +?ð\^˜4  S œ>ð ^¨dð ^ð ^ð ^ð ^ðiØ˜˜S˜”>ðiØ,0°°c¸3°h´Ô,@ðià	ˆ#ˆsˆ(„^ðið ið ið iðX#˜u T¨4°°S¸#°X´Ô+?Ð%?Ô@ð #ð #ð #ð #ð$@  d¨3°¨8¤nÔ!5ð @À4ð @ÈDð @ð @ð @ð @ðP €„�hÐÑÔð0ð 0ñ  Ôð0ðð ð ð$ð ð ð$ð ð ð$ð ð ð$ð ð ð$ð ð ð$ð ð ð$ð ð ð, ˆzÒÐØ	€EÐ
`ÑaÔaÐaØ3Ð3Ñ5Ô5Ñ€J�Ø€O�K Ñ,Ô,Ð,Ø€C„H�*Ð#ˆQˆQ !Ñ$Ô$Ð$Ð$Ð$ð	 Ðr:   