+
    DWjN                      a 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt	^ RI
Ht ^ RIHt R R ltR R ltR	 R
 ltR R ltR R lt]! ]P(                  P+                  RR4      4      tRtRt^t^t]! 0 RkRkRkRkRkRkRkRkRkRkRkRkRkRkR kR!kR"kR#kR$kR%kR&kR'kR(kR)kR*kR+kR,kR-kR.kR/kR0kR1kR2kR3kR4kR5kR6kR7kR8kR9kR:kR;kR<kR=kR>kR?kR@kRAkRBkRCkRDkREkRFkRGkRHkRIkRJkRKkRLkRMkRNkROkRPkRQkRRkRSkRTkRUkRVkRWkRXkRYkRZkR[kR\kR]k4      t]P:                  ! 4       tR^/ R_RR`RaRbRc/tRd] Re&   / t!Rd] Rf&   Rg Rh lt"Ri Rj lt#Rk Rl lt$Rm Rn lt%Ro Rp lt&R{ U u. uF  p ]PO                  V ]PP                  4      NK!  	  up R| U u. uF  p ]PO                  V 4      NK  	  up ,           t)]PN                  ! Rq]PP                  4      t*Rr Rs lt+Rt Ru lt,Rv Rw lt-Rx Ry lt.Rz t/R# u up i u up i )}u  Entity Dossier — put a profile card of a person/company/concept on the HUD.

Two ways in:
  1. The brain's ``show_entity(name)`` tool (mcp__entity__show_entity) — Jarvis
     calls it when Ahmed says "show me Saud" / "who is X / tell me about X".
  2. AUTO-SHOW — main.py's listen loop calls ``maybe_autoshow(text)`` on every
     addressed utterance. When Ahmed names exactly ONE known entity (word-
     boundary match against a name set refreshed ~every 10 min) and that
     entity's per-entity cooldown is clear, its card pops on its own.

The card is delivered to the HUD as an ``entity_profile`` event:
    emit("entity_profile", profile={...})
The HUD renders the dossier from that JSON and can send back-channel actions
(control/entity_action.json → voice/control.py: drill-down, note, summary edit).

SERVER CONTRACT (memory service, GET /profile?name=X → dossier JSON with keys
entity, summary, read, quick, relations, timeline, facts_by_kind, tasks,
counts, also_matched):
  - a KNOWN-ABSENT entity comes back HTTP 200 with ``{"entity": null, ...}`` —
    that is "nothing known", NOT an error: we speak "I don't have anything on
    X yet" and do NOT emit the event.
  - an AMBIGUOUS name returns the best entity plus ``also_matched: [names]`` —
    we name the runner-up in the spoken confirmation so Ahmed can drill down.

Everything here degrades gracefully. The network may hang or the route may not
exist yet — every call has a hard timeout, swallows errors to a log line, and
NEVER blocks the voice loop (the name-set refresh and the auto-show fetch both
run on daemon threads; the brain tool wraps the fetch in asyncio.to_thread).
)annotationsN)memory_control)emitc                    V ^8  d   QhRRRR/#    namestrreturnzdict | None )formats   "voice/entity_show.py__annotate__r   /   s     2 2 2 2    c           	        T ;'       g    RP                  4       p V '       d   \        P                  ! 4       '       g   R#  \        P                  P                  RV R\        P                  /4      p\        P                  ! RRV 2^R7      p\        T\        4      '       d   T# R#   \         d.   p\        RT : R	\        T4      R
,           24        Rp?R# Rp?ii ; i)u&  GET /profile?name=X — the dossier JSON. Hard 3s ceiling. Returns None only
on a network/timeout error or when memory isn't configured. A known-absent
entity is NOT an error (the server answers 200 with {"entity": null}); that
dict is returned as-is and the caller checks the ``entity`` field. Nr   groupGETz	/profile?timeoutz$  [entity] profile fetch failed for : Nd   N)stripr   enabledurllibparse	urlencode_GROUP_req	Exceptionprintr	   
isinstancedict)r   qsoutes   &   r   fetch_profiler'   /   s    
 JJBD~--//\\##T7N$9$9:<!!%9RD)91E S$''31T1  4THBs1vd|nMNs   AB( (C 3"CC c                    V ^8  d   QhRRRR/# r   r   )r   s   "r   r   r   A   s     < < < <r   c           	        T ;'       g    RP                  4       p V '       d   \        P                  ! 4       '       g   R#  \        P                  ! RRRV R\        P                  /^R7      p\        T\        4      '       g   R# TP                  R4      p\        T\        4      '       d   T# R#   \
         d.   p\        RT : R	\        T4      R
,           24        Rp?R# Rp?ii ; i)u  POST /dossier {"name","group"} → {"composed": {...}|null, "cached": bool} —
the LLM-COMPOSED dossier (a written narrative over the raw profile). Hard 25s
ceiling: composition is 5-12s uncached, instant when cached. Returns the
composed dict, or None on a 404 (route not deployed yet), timeout, network
error, non-dict body, or a null composition — every one degrades to the HUD's
raw rendering. Never raises.r   NPOSTz/dossierr   r   r   z&  [entity] dossier compose failed for r   r   composed)r   r   r   r   r   r    r!   r	   r"   r#   get)r   r%   r&   r+   s   &   r   fetch_composedr-   A   s     JJBD~--//!!JT7N$9$9: c4  wwz"H!(D118;t;  6thbQOPs   ,B0 0C(;"C##C(c               $    V ^8  d   QhRRRRRR/# )r   shownr	   profiler#   r
   Noner   )r   s   "r   r   r   Y   s&     B BS B4 BD Br   c                    \        V 4      pVf&   \        P                  ! \        4       \        V 4      p \	        RVVRR7       R#   \
         d*   p\        R\        T4      R,           24        Rp?R# Rp?ii ; i)uJ  STAGE 2 (daemon thread): compose the dossier off the hot path and swap it
into the already-showing card with a SECOND ``entity_profile`` event. On
success it carries ``composed=<dict> composing=False``; on failure/timeout/
null it carries ``composed=None composing=False`` so the HUD drops the
"composing…" spinner and falls back to rendering the raw profile. Never
raises, never blocks a turn.

One RETRY after a short wait: a slow first composition can outlive our
timeout while still finishing (and caching) server-side — the second POST
then returns the cached result instantly.Nentity_profileFr0   r+   	composingz!  [entity] composed emit failed: r   )r-   timesleep_COMPOSE_RETRY_Sr   r    r!   r	   )r/   r0   r+   r&   s   &&  r   _compose_and_emitr9   Y   sp     e$H

#$!%(Bw%	1 B1#a&,@AABs   A A;A66A;c                    V ^8  d   QhRRRR/# )r   r   r	   r
   ztuple[str, str, list]r   )r   s   "r   r   r   o   s      "  "  "-  "r   c                6   T ;'       g    RP                  4       p V '       g   RV . 3# \        V 4      pVf   RV . 3# VP                  R4      '       g   RV . 3# VP                  R4      ;'       g    / p\        VP                  R4      ;'       g    T 4      P                  4       ;'       g    T pVP                  R4      ;'       g    .  Uu. uF=  p\        V4      P                  4       '       g   K$  \        V4      P                  4       NK?  	  pp \	        RVRR	R
7       \        T4       \        P                  ! \        Y13R	R7      P                  4        RY53# u upi   \
         d-   p\        R\        T4      R,           24       RY53u Rp?# Rp?ii ; i)u  The TRUTHFUL core every entry point shares. STAGE 1: fetch /profile
(≤3s) and emit the card with ``composed=None composing=True`` — it pops
instantly. STAGE 2: a daemon thread POSTs /dossier and a second emit swaps
the composed narrative in. Returns (status, shown_name, also_matched):
  'shown'   — the card IS on the HUD
  'unknown' — no such entity in memory; NO card was emitted
  'error'   — memory unreachable / emit failed; NO card on screen
Callers must only claim a card is visible when status == 'shown' — the old
fire-and-forget version let the brain say "on your HUD, sir" while nothing
showed (Ahmed asked for "reval clients", not an entity, and got gaslit).r   errorNentityunknownr   also_matchedr3   Tr4   z  [entity] emit failed: r   targetargsdaemonr/   )r   r'   r,   r	   r   r    r!   _mark_shown	threadingThreadr9   start)r   r0   entr/   aalsor&   s   &      r   _showrK   o   sn    JJBDr""D!Gr"";;x  4$$
++h

%
%2C''4(..088DE%,[[%@%F%FB%F %Fq1v||~ CFLLN%FD &wN -U4D ""'%'U!!  &(Q78%%&s*   !E2EE! !F,!FFFc                    V ^8  d   QhRRRR/# )r   r   r	   r
   r   )r   s   "r   r   r      s     . .c .c .r   c                   T ;'       g    RP                  4       p V '       g   R# \        V 4      w  rpVR8X  d   RV R2# VR8X  d   RV R2# V'       d/   \        V4      ^8X  d
   V^ ,          MV^ ,           R	2pR
V RV R2# R
V R2# )u
  Brain-tool / control-file entry: run ``_show`` and return a short SPOKEN
confirmation string (plain prose, TTS-safe) the MOMENT the card is up — it
NEVER waits for composition. Callers on the event loop wrap it in
asyncio.to_thread / a daemon thread. Never raises.r   zI need a name to show, sir.r>   zI don't have anything on z
 yet, sir.r<   zI couldn't reach memory for u   , sir — no card, I'm afraid.z and otherszShowing u   , sir — I also know a .z's profile, sir.)r   rK   len)r   statusr/   rJ   extras   &    r   show_entityrR      s    
 JJBD,+F4*5'<<-eW4RSSt9>Q$q'+/F% 8qAAeW,--r   ENTITY_COMPOSE_RETRY_S8g     @theandforyouyourarewaswerenewnowwhowhyhowwhatwhenwherethisthatthesethoseheretherewithfromintosomeanyallonetwor,   gotseeletyesyeahyepnopeokaypleasethankstodaytomorrowtonightworkhometeamtaskemailphonecalltexthimherthemtheyshehisourr%   notbutcanwilljustlikewantneedhavehashaddiddoesjarvisahmedsirmappatternat        
refreshingFr#   _NAMES	_COOLDOWNc                    V ^8  d   QhRRRR/# )r   r   r	   r
   r1   r   )r   s   "r   r   r      s     3 3c 3d 3r   c                    \         ;_uu_ 4        \        P                  ! 4       \        V P	                  4       &   R R R 4       R #   + '       g   i     R # ; iN)_names_lockr6   	monotonicr   lower)r   s   &r   rD   rD      s*    	"&.."2	$**, 
s   +AA	c                   V ^8  d   QhRR/# r   r
   r1   r   )r   s   "r   r   r      s     ") ") ")r   c            	         \         P                  P                  R\        P                  /4      p \        P
                  ! RRV  2^R7      p/ pVP                  R4      ;'       g    .  F  p\        VP                  R4      ;'       g    R4      P                  R4      '       g   K>  \        VP                  R	4      ;'       g    R4      P                  4       p\        V4      \        8  g   VP                  4       \        9   d   K  WBVP                  4       &   K  	  R
pV'       dM   \        R V 4       \        RR7      p\        P                   ! RRP#                  V4      ,           R,           4      p\$        ;_uu_ 4        V\&        R&   V\&        R&   \(        P(                  ! 4       \&        R&   R
R
R
4       \+        R\        V4       R24       \$        ;_uu_ 4        R\&        R&   R
R
R
4       R
#   + '       g   i     LJ; i  \,         dt   p\+        R\        T4      R,           24       \$        ;_uu_ 4        \(        P(                  ! 4       \&        R&   R
R
R
4        R
p?K    + '       g   i      R
p?L; iR
p?ii ; i  + '       g   i     R
# ; i  \$        ;_uu_ 4        R\&        R&   R
R
R
4       i   + '       g   i     i ; i; i)uL  Rebuild the known-entity matcher from GET /graph — the lightest endpoint
that enumerates entities (/export is a full dump). Entity nodes come back as
``{"id": "ent:<key>", "text": <name>, "kind": "entity:<type>"}``. Runs on a
daemon thread with a bounded timeout; on any failure the last good matcher
stays in place. Never raises.r   r   z/graph?r   nodeskindr   zentity:r   Nc              3  N   "   T F  p\         P                  ! V4      x  K  	  R # 5ir   )reescape).0ts   & r   	<genexpr>!_refresh_names.<locals>.<genexpr>   s     6A299Q<<s   #%T)keyreversez
(?<!\w)(?:|z)(?!\w)r   r   r   z'  [entity] known-entity set refreshed (z names)z$  [entity] name-set refresh failed: r   Fr   )r   r   r   r   r   r   r,   r	   
startswithr   rO   _MIN_LENr   _STOPsortedr   compilejoinr   r   r6   r!   r    )r$   r%   toksnnmr   altsr&   s           r   _refresh_namesr      s   )\\##Wn.C.C$DE!!%72$C'''"((b(AquuV}**+66yAAQUU6]((b)//1B2w!RXXZ5%8! )  66CNDjj$!?*!LMG[ F5M 'F999;F4L  	7D	{'JK [#(F<  [ [
  '4SVD\NCD[99;F4L [[[['
 [[[[#(F<  [[[s   BH 
H &H A#H )AH /G42 H  
J4H	?H J,J >I)J #J )I=4J 8J =J  JJ J	K+
J>	5	K>K	Kc                   V ^8  d   QhRR/# r   r   )r   s   "r   r   r      s     
A 
A 
Ar   c                    \         P                  ! 4       '       g   R# \        ;_uu_ 4        \        P                  ! 4       \        R,          ,
          \
        8  p V '       g   \        R,          '       d    RRR4       R# R\        R&   RRR4       \        P                  ! \        RR7      P                  4        R#   + '       g   i     L<; i)u   Kick a background refresh if the matcher is stale and none is in flight.
Non-blocking — returns at once; the daemon thread does the network.Nr   r   T)rA   rC   )
r   r   r   r6   r   
_REFRESH_SrE   rF   r   rG   )recents    r   _maybe_refreshr      s     !!##	))+t,
:VL)) 
  $|	 

 N48>>@ 
s   A	B>6B>	B>>C	c                    V ^8  d   QhRRRR/# )r   r   r	   r
   z	list[str]r   )r   s   "r   r   r      s      S Y r   c                   \        4        T ;'       g    RP                  4       pV'       g   . # \        ;_uu_ 4        \        R,          p\        R,          pRRR4       Xf   . # . p\	        4       pVP                  V4       F]  pXP                  VP                  ^ 4      VP                  ^ 4      4      pWu9  g   K;  VP                  V4       VP                  V4       K_  	  V#   + '       g   i     L; i)u%  Known entity display-names named in ``text``, by Unicode word-boundary
match against the cached name set (2+ chars, generic words skipped). Does NO
network on the hot path — it only kicks a background refresh — and returns
[] until the set is first populated. Safe to call every utterance.r   r   r   N)
r   r   r   r   setfinditerr,   r   addappend)r   r   r   mappinghitsseenmdisps   &       r   mentioned_entitiesr      s    
 	A		#- 
 	DDa {{1771:qwwqz2HHTNKK	 !
 K 
s   C&&C6	c                   V ^8  d   QhRR/# )r   r
   boolr   )r   s   "r   r   r     s      d r   c                      ^ RI Hp  \        \        V RR4      ;'       d    V P                  P
                  4      #   \         d     R# i ; i)u   True while a background worker is running — auto-show stays out of the
way during an active task dispatch (best-effort, never raises).
agent_poolpoolNF)voicer   r   getattrr   _runningr    r   s    r   _agents_busyr     sK    $GJ5 1 1"002 	2 s   < < A
AzV^(?:the|a|his|her|their|this|that|please|profile of|about)\s+|\s+(?:please|now|again)$c                    V ^8  d   QhRRRR/# r   r   r	   r
   ztuple | Noner   )r   s   "r   r   r   2  s      s | r   c                    \          EFA  pTP                  T ;'       g    R4      pV'       g   K)  VP                  ^4      ;'       g    RP                  4       pRpV'       d.   W48w  d(   T\        P                  RV4      P                  4       r4K5  \        V4      ^8  d   K  \        V4      pV'       d   \        V\        R7      MTp\        P                  ! 4       pV\        P                  RVP                  4       ,           R4      ,
          R8  d   RV3u # V\        RVP                  4       ,           &   \        V4      w  rp
W3u # 	  R#   \         d*   p\!        R\#        T4      R	,           24        Rp?R# Rp?ii ; i)
u  If the utterance is an explicit profile ask, show the card INLINE
(≤3s fetch — truth beats speed here) and return (status, name):
  ('shown', X)   — the card IS on the HUD
  ('unknown', X) — no such entity; nothing was shown
  ('error', X)   — memory unreachable; nothing was shown
Returns None when the utterance isn't a profile ask. Prefers a KNOWN
entity named in the tail; otherwise sends the tail itself — the server
resolves fuzzily.r   Nr   q:r   g      $@r/   z!  [entity] explicit_ask skipped: r   )_EXPLICIT_RESsearchr   r   _TAIL_STRIPsubrO   r   maxr6   r   r   r,   r   rK   r    r!   r	   )r   rxr   tailprevknownr   r^   rP   r/   _alsor&   s   &           r   explicit_askr   2  s6   B-B		$**"%AGGAJ$$"++-DD4<!;??2t#<#B#B#Dd4y1}&t,E*/3u#&TD.."CY]]4$**,#6<<tC&-0IdTZZ\)*#(; F5?"#  (   B1#a&,@AABs:   E E E 	E $B6E 0E E FE??Fc                    V ^8  d   QhRRRR/# r   r   )r   s   "r   r   r   S  s      3 < r   c                F    \        V 4      pV'       d   V# \        V 4       R# )u  main.py's ONE integration line: deterministic explicit-ask intercept
first (always wins), mention auto-show as the fallback. Returns
(status, name) for an EXPLICIT ask — 'shown' means the card is genuinely
on the HUD (brain: acknowledge in one line); 'unknown'/'error' mean NO
card is visible (brain: say so, never claim otherwise). Returns None on a
non-ask (a passive mention auto-show still pops its card silently and
needs no brain note).N)r   maybe_autoshow)r   ress   & r   handle_utterancer   S  s!     t
C

4r   c                    V ^8  d   QhRRRR/# )r   queryr	   r
   r1   r   )r   s   "r   r   r   b  s     D D# D$ Dr   c                     \        V 4      pV'       g   R# \        V\        R7      p\        P                  ! 4       pV\
        P                  RVP                  4       ,           R4      ,
          R8  d   R# V\
        RVP                  4       ,           &   V\
        VP                  4       &   \        P                  ! \        V3RR7      P                  4        R#   \         d*   p\        R\        T4      R	,           24        Rp?R# Rp?ii ; i)
u  DETERMINISTIC card on an explicit ask. Called by the brain's
memory_search tool: when Ahmed asks memory about something that names a
known entity ("pull up everything about AIN"), the dossier card MUST
appear — regardless of which tool the brain chose to answer with. Picks
the LONGEST entity match in the query, fires on a daemon thread, and only
guards against immediate double-fires (30s), not the 10-min auto-show
cooldown — an explicit ask always re-shows. Never raises, never blocks.Nr   r   r   g      >@Tr@   z#  [entity] show_for_query skipped: r   )r   r   rO   r6   r   r   r,   r   rE   rF   rR   rG   r    r!   r	   )r   namesr   r^   r&   s   &    r   show_for_queryr   b  s    D"5)5c"nntdjjl2C884?),	$%&"%	$**,4'$GMMO D3CF4L>BCCDs$   C AC 6A!C D$DDc                    V ^8  d   QhRRRR/# )r   r   r	   r
   r1   r   )r   s   "r   r   r   y  s     ? ? ? ?r   c                
    \         P                  P                  RR4      R8X  d   R# \        4       '       d   R# \	        V 4       Uu. uF  p\        V4      \        8  g   K  VNK  	  pp\        V4      ^8w  d   R# V^ ,          p\        P                  ! 4       p\        ;_uu_ 4        V\        P                  VP                  4       R4      ,
          \        8  d    RRR4       R# V\        VP                  4       &   RRR4       \        P                  ! \        V3RR7      P!                  4        R# u upi   + '       g   i     LC; i  \"         d*   p\%        R\'        T4      R	,           24        Rp?R# Rp?ii ; i)
uM  AUTO-SHOW entry point for main.py's listen loop — ONE line of integration.
If Ahmed named exactly ONE strong, known entity and its 10-min cooldown is
clear, pop its card. Gated by env ENTITY_AUTOSHOW (default on) and suppressed
while a background agent is running. Never blocks (the fetch runs on a daemon
thread) and never raises.ENTITY_AUTOSHOW10Nr   Tr@   z  [entity] auto-show skipped: r   )osenvironr,   r   r   rO   _STRONG_LENr6   r   r   r   r   _COOLDOWN_SrE   rF   rR   rG   r    r!   r	   )r   hstrongr   r^   r&   s   &     r   r   r   y  s   ?::>>+S1S8>>/5O5Q;9N!!5Ov;!aynn[Y]]4::<55C [ '*Idjjl#  	4'$GMMO P
 [
  ?.s1vd|n=>>?sc   %E E E D6#D6)E =,E )6D;E )D; 4E 6E ;E	E FE==Fc                 |   aa ^ RI o^ RIHp Hp R R loV! RRR\        /4      R VV3R	 ll4       pV ! R
RV.R7      # )u   The in-process ``entity`` MCP server — ONE brain tool, show_entity.
Follows the memory/agent-pool pattern; dict-shorthand marks ``name``
required.N)create_sdk_mcp_servertoolc                    V ^8  d   QhRRRR/# )r   msgr	   r
   r#   r   )r   s   "r   r   "build_server.<locals>.__annotate__  s     < <3 <4 <r   c                    R RRRV /./# )contenttyper   r   )r
  s   &r   _textbuild_server.<locals>._text  s    VVVS9:;;r   rR   uG  Show a full profile card (dossier) of a person/company/project/concept on Ahmed's screen: summary, contacts, relations, timeline of every interaction. ALWAYS call this when he says 'show me X', 'pull up X', 'pull up everything about X', 'who is X', or 'tell me about X' — the card is the answer; speak only a brief highlight.r   c                    V ^8  d   QhRRRR/# )r   rB   r#   r
   r   )r   s   "r   r   r    s      T d r   c                6  <"   \        V P                  R R4      4      P                  4       pV'       g	   S! R4      #  SP                  \        V4      G Rj  xL
 pS! T4      #  L  \
         d&   pS! R\        T4      R,           24      u Rp?# Rp?ii ; i5i)r   r   z"show_entity failed: no name given.Nzshow_entity failed: :N   N)r	   r,   r   	to_threadrR   r    )rB   r   r
  r&   r  asyncios   &   r   show_entity_tool&build_server.<locals>.show_entity_tool  s      488FB'(..0=>>	@))+t<<C Sz = 	@/At~>??	@sF   :BA& A$A& B$A& &B1BBBBBr=   z1.0.0)r   versiontools)r  claude_agent_sdkr  r  r	   )r  r  r  r  r  s      @@r   build_serverr    sY     << 
-O
 3-  !w/?.@ r   )z\b(?:pull up|bring up|show me|open up)\s+(?:everything\s+(?:we|you)\s+know\s+about\s+|everything\s+about\s+|the\s+profile\s+(?:of|for|on)\s+|a\s+profile\s+(?:of|for|on)\s+)?(.{2,60}?)[\s.!?]*$z\b(?:who\s+is|who's|tell me (?:everything )?about|what do (?:we|you) know about|everything (?:we|you) know about)\s+(.{2,60}?)[\s.!?]*$)uN   (?:من هو|مين هو|وريني|ورني|اعرض)\s+(.{2,60}?)[\s.!?؟]*$uF   (?:كل (?:شي|شيء) (?:نعرفه? )?عن)\s+(.{2,60}?)[\s.!?؟]*$)0__conditional_annotations____doc__
__future__r   r   r   rE   r6   urllib.parser   r   r   voice.eventsr   r'   r-   r9   rK   rR   floatr  r,   r8   r   r  r   r  	frozensetr   Lockr   r   __annotations__r   rD   r   r   r   r   r   
IGNORECASEr   r   r   r   r   r   r  )pr  s   0@r   <module>r'     sO  < # 	 	      2$<0B, "F.. (@#FG 

 	 
	



 &
(-
/4
6<
>C
EJ
	



!'
)0
28
:@
BI
 
 
 
 %
 '-
 /5
 7=
 ?D
 FK
 
	
 	
 	
 	
 !&	
 (-	
 /4	
 6<	
 >C	
 EK	

 

 

 

 !(

 *4

 6?

 AG
 
 
 
 $
 &-
 /5
 7=
 ?D
 FK
 
 
 
 !
 #(
 */
 16
 8=
 ?D
 FL
 
 
 
 #
 %+
 -2
 49
 ;@
 BH
 
 
 
 
	 nnr9dD#|UK K	4 3
")J
A0 8  8!Ar}}- 8   bjjm  	 jj !#0
BD.?<is   %G&	G+