
    jJt                   ~   U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlmZmZmZ ddlmZmZ ddlmZmZ ddlmZ ddlmZ dd	lmZmZm Z m!Z! dd
l"m#Z# ddl$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+ ddl,m-Z- ddl.m/Z0 ddl1m2Z2 ddl3m4Z5 ddl6m7Z8m9Z9 ddl:m;Z<m=Z= ddl>m?Z? ddl@mAZAmBZBmCZC  ejD                    dz  dz  dz  ZEe	jF        G                    d          r( ee	jF        d                   H                                ndZIeEdz  ZJeEdz  ZK ee	jF        d                   H                                ZLe	jF        G                    d          r( ee	jF        d                   H                                ndZM ee	jF        G                    d eNeEdz  dz  dz                                H                                ZOe	jF        G                    d d!          ZP eQe	jF        G                    d"d#                    ZRe	jF        G                    d$d%          S                                T                                ZUeUd&vr eVd'           eQe	jF        G                    d( eNeR                              ZWd)eWcxk    rd*k    sn  eVd+          d, e	jF        G                    d-d.          X                    d/          D             ZYd0ZZd1Z[i d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQZ\dRZ]dSZ^dTZ_dUZ`dVZadWZbdXZcdYZddZZed[Zfd\Zgd]Zh ee	jF        G                    d^ eNeEd_z  d`z                                H                                Zi ee	jF        G                    da eNeEdbz  dcz                                H                                Zj ee	jF        G                    dd eNeEd_z  dez                                H                                Zk ee	jF        G                    df eNeEd_z  dgz                                H                                Zl ee	jF        G                    dh eNeEdbz  diz                                H                                Zme	jF        G                    djdk          S                                Zne	jF        G                    dl          r( ee	jF        dl                   o                                ndZpe	jF        G                    dm          r( ee	jF        dm                   o                                ndZq erdn es eQe	jF        G                    dodp                    dq                    Zte	jF        G                    dr          dsk    Zuenr e
jv        dten          s eVdu          eiw                     edv          H                                          s eVdw          ekw                     edv          H                                          s eVdx          ejw                     edv          H                                          s eVdy          elw                     edv          H                                          s eVdz          d{Zxh d|Zyh d}Zzh d~Z{h dZ|h dZ} erdn es eQe	jF        G                    ddp                    dq                    Z~dZdZ e#d          Z erd) es eQe	jF        G                    dd                    d                    ZdZ;dZ e*            Zi Zded<    ej                    Zi Zded<    ej                    Zi Zded<    ej                    Z ej                    Z G d de          Z G d deV          ZddZddZddZddZ	 d	d
dZddZddZddZddZddZddZddZddZddZddZ	 d	ddZd	ddZd	ddÄZd	ddĄZd	ddńZddǜdd˄Zdd̈́ZddфZddӄZddԜdd؄ZddلZddۄZdd݄ZddZd dZd!dZd"dZd#dZd$dZd%dZd&dZd'dZd(dZd)dZd*dZd+dZd,dZ G d d e          Zedk    reL                                s ed          eOdz                                  s ed          	  e?             n# e$ rZ ed          edZ[ww xY w eePeRfe                                           dS dS (-  zHServe the local Health Dashboard with strict routes and privacy headers.    )annotationsN)datedatetime	timedelta)CookieErrorSimpleCookie)BaseHTTPRequestHandlerThreadingHTTPServer)Path)Any)parse_qsquoteunquoteurlparse)ZoneInfo)APIErrorconnect_read_onlydispatch_api_resolve_record_document)configured_original_rootsprobe_original)validate_supplement_payload)validate_action)validate_capture_payload)assert_schema)ACTION_CONTRACT_VERSIONSresolve_action_preview)MAX_ORIGINAL_BYTESquarantine_bytes)media_runtime_self_test)discard_quarantinequarantine_uploadvalidate_metadataz.hermesassets
GesundheitHEALTH_DASHBOARD_DBzhealth_data.dbreportsHEALTH_DASHBOARD_FILEHEALTH_DASHBOARD_V5_FILEHEALTH_DASHBOARD_ASSET_DIRscriptszhealth-assetsHEALTH_DASHBOARD_HOSTz	127.0.0.1HEALTH_DASHBOARD_PORT8014HEALTH_DASHBOARD_SCHEMEhttp>   r0   httpsz-HEALTH_DASHBOARD_SCHEME must be http or httpsHEALTH_DASHBOARD_PUBLIC_PORT   i  z8HEALTH_DASHBOARD_PUBLIC_PORT must be between 1 and 65535c                    h | ]O}|                                 |                                                                                     d           PS ).)striplowerrstrip).0values     H/home/agent/.hermes/assets/Gesundheit/scripts/health_dashboard_server.py	<setcomp>r<   K   sZ        {{}}	KKMM  %%      HEALTH_DASHBOARD_ALLOWED_HOSTSz127.0.0.1,localhost,z/health-dashboardz/health-dashboard-v5z/health-assets/chart.umd.min.js)chart.umd.min.jstext/javascript; charset=utf-8z/health-assets/dashboard-v5.js)zdashboard-v5.jsrA   z(/health-assets/dashboard-v5-nutrition.js)zdashboard-v5-nutrition.jsrA   z$/health-assets/dashboard-v5-range.js)zdashboard-v5-range.jsrA   z,/health-assets/dashboard-v5-global-search.js)zdashboard-v5-global-search.jsrA   z+/health-assets/dashboard-v5-api-explorer.js)zdashboard-v5-api-explorer.jsrA   z+/health-assets/dashboard-v5-associations.js)zdashboard-v5-associations.jsrA   z+/health-assets/dashboard-v5-observations.js)zdashboard-v5-observations.jsrA   z&/health-assets/dashboard-v5-echarts.js)zdashboard-v5-echarts.jsrA   z-/health-assets/dashboard-v5-day-controller.js)zdashboard-v5-day-controller.jsrA   z%/health-assets/dashboard-v5-record.js)zdashboard-v5-record.jsrA   z&/health-assets/dashboard-v5-capture.js)zdashboard-v5-capture.jsrA   z/health-assets/dashboard-v5.css)zdashboard-v5.cssztext/css; charset=utf-8z#/health-assets/echarts-6.1.0.min.js)zecharts-6.1.0.min.jsrA   z)/health-assets/fullcalendar-6.1.21.min.js)zfullcalendar-6.1.21.min.jsrA   z0/health-assets/dashboard-v5-echarts-prototype.js)z!dashboard-v5-echarts-prototype.jsrA   z/health-actions/symptom-checkinz!/health-actions/nutrition-mappingz/health-actions/symptom-eventz /health-actions/medication-eventz/health-actions/general-eventz /health-actions/supplement-eventz/health-actions/observationz/health-actions/document-reviewz/api/v1/capture/uploadz/api/v1/documents/uploadz/health-actions/capturez"/health-actions/medication-previewHEALTH_DASHBOARD_ACTION_INBOXruntimezdashboard-actionsHEALTH_DASHBOARD_CAPTURE_MEDIAzprivate-mediacapture#HEALTH_DASHBOARD_CAPTURE_QUARANTINEzcapture-quarantine$HEALTH_DASHBOARD_DOCUMENT_QUARANTINEzdocument-quarantine!HEALTH_DASHBOARD_DOCUMENT_STORAGE	documents!HEALTH_DASHBOARD_TEST_INSTANCE_ID HEALTH_DASHBOARD_API_TOKEN_FILE$HEALTH_DASHBOARD_BASIC_PASSWORD_FILE<   $HEALTH_DASHBOARD_BROWSER_SESSION_TTL900i  .HEALTH_DASHBOARD_BROWSER_SESSION_COOKIE_SECURE1z[A-Za-z0-9_-]{8,64}z)invalid HEALTH_DASHBOARD_TEST_INSTANCE_IDz/tmpz;synthetic test instance requires an action inbox below /tmpz6synthetic test instance requires quarantine below /tmpz1synthetic test instance requires media below /tmpz?synthetic test instance requires document quarantine below /tmp)aphthengifatigueskineyesjointsvascular>   deferassignignorereopenconflict	composite
irrelevantnot_assignable>   0rR   23unknown>   lowhighmedium>   local_aliasmanual_reviewsighi_referenceingredient_label>   unclearre   documented_tolerateddocumented_not_toleratedHEALTH_DASHBOARD_CSRF_TTLx   i  zEurope/Zurich$HEALTH_DASHBOARD_MAX_PENDING_ACTIONS64   i  @))s   %PDF-application/pdfz.pdf)s   PNG

	image/pngz.png)s   
image/jpegz.jpgzdict[str, float]_csrf_tokens_queue_receipts_browser_sessionsc                      e Zd ZdZdS )QueueFullErrorzERaised when the bounded private action queue cannot accept more work.N__name__
__module____qualname____doc__ r=   r;   r|   r|     s        OOOOr=   r|   c                      e Zd ZdZdS )IdempotencyConflictErrorzIRaised when the same business identity is pending with different content.Nr}   r   r=   r;   r   r     s        SSSSr=   r   pairslist[tuple[str, object]]returndict[str, object]c                J    i }| D ]\  }}||v rt          d          |||<   |S )Nzduplicate JSON key)
ValueError)r   resultkeyr:   s       r;   reject_duplicate_object_pairsr     sB     "F  
U&==1222sMr=   strc                    t           t          d          t          j        t           t          j        t          j        z  t          j        z            } 	 t          j        |           }t          j	        |j
                  rD|j        t          j                    k    s(t          j        |j
                  dk    s|j        dk    rt          d          t          j        | d          }t          j        |            n# t          j        |            w xY w|                    d                                          }t'          j        d|          st          d          |S )	Nz.read-only API authentication is not configured  rt   z'read-only API token file is not privatei  ascii[A-Za-z0-9_-]{32,128}zread-only API token is invalid)API_TOKEN_FILEOSErrorosopenO_RDONLY
O_NOFOLLOW
O_NONBLOCKfstatstatS_ISREGst_modest_uidgetuidS_IMODEst_sizereadclosedecoder6   re	fullmatch)
descriptormetadatarawtokens       r;   load_api_tokenr     s0   FGGG
bm#bm3 J8J''X-..	E")++--|H,--66#%%CDDDgj#&&
JJw%%''E<0%88 86777Ls   BD   Dc                    t           t                      S t          j        t           t          j        t          j        z  t          j        z            } 	 t          j        |           }t          j	        |j
                  rD|j        t          j                    k    s(t          j        |j
                  dk    s|j        dk    rt          d          t          j        | d          }t          j        |            n# t          j        |            w xY w|                    d                                          }t)          j        d|          st          d          |S )Nr      z&dashboard password file is not private   r   z[A-Za-z0-9_-]{5,128}zdashboard password is invalid)BASIC_PASSWORD_FILEr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r6   r   r   )r   r   r   passwords       r;   load_dashboard_basic_passwordr   5  s-   "
bm#bm3 J8J''X-..	D")++--|H,--66#%%BCCCgj#&&
zz'""((**H</:: 75666Os   BC? ?Dheaderr   boolc                    |                      d          r|                     d          dk    rdS |                     d          }t          |          t          |          k    ot	          j        ||          S )NzBearer  r3   F)
startswithcountremoveprefixlensecretscompare_digest)r   r   supplieds      r;   api_request_is_authenticatedr   N  so    Y'' 6<<+<+<+A+Au""9--Hx==CJJ&R7+A(E+R+RRr=   basic_password
str | Nonec                   t          | |          rdS |                     d          r|                     d          dk    rdS 	 t          j        |                     d          d                              d          }n# t          j        t          f$ r Y dS w xY w|
                    d          \  }}}||n|}|dk    o:|d	k    o4t          |          t          |          k    ot          j        ||          S )
NTzBasic r   r3   Fvalidateutf-8:health)r   r   r   base64	b64decoder   r   binasciiErrorUnicodeError	partitionr   r   r   )r   r   r   decodedusername	separatorr   expecteds           r;   $dashboard_principal_is_authenticatedr   U  s(    $FE22 tX&& &,,s*;*;q*@*@u"))D
 
 

&// 	 NL)   uu$+$5$5c$:$:!Hi&.uuNHS 	7 	7MMS]]*	7 "8X66	s   <B BBc                    t          j                    t          5  fdt                                          D             } | D ]
}t          |= t          j        d          }t          z   t          |<   d d d            n# 1 swxY w Y   |S )Nc                &    g | ]\  }}|k    |S r   r   )r9   r   expirynows      r;   
<listcomp>z)issue_browser_session.<locals>.<listcomp>o  s#    UUU;3vQT}}3}}}r=       )time	monotonic_browser_session_lockrz   itemsr   token_urlsafeBROWSER_SESSION_TTL_SECONDS)expiredr   
session_idr   s      @r;   issue_browser_sessionr   l  s    
.

C	 J JUUUU*;*A*A*C*CUUU 	' 	'C!#&&*2..
(+.I(I*%J J J J J J J J J J J J J J J s   ABBBcookie_headerc                   	 t          |           }n# t          t          f$ r Y dS w xY w|                    d          }|dS |j        }t          j        d|          sdS t          j                    }t          5  t                              |          }|||k    r)t                              |d            	 d d d            dS 	 d d d            dS # 1 swxY w Y   d S )NFhealth_api_sessionr   T)r   r   r   getr:   r   r   r   r   r   rz   pop)r   cookiemorselr   r   r   s         r;    browser_session_is_authenticatedr   w  sW   m,,$   uuZZ,--F~uJ<0*== u
.

C	  "&&z22>Vs]]!!*d333	       
                  s$    '';?CCCCvaluesobjectPath | Nonec                    | D ]Q}|st          |          }t          t          j                            |                    t
          |z  t          j                    |z  t          |                    t          t          j                    dz            t          t
                                        g}|D ]}	 |                                }|	                                r^|
                    t
                                                    s,|
                    t                                                    r|c c S # t          $ r Y w xY wSd S )Nr%   )r   r   r   path
expanduserBASEhomereplaceresolveis_fileis_relative_toREPORTSr   )r   r:   r   
candidates	candidateresolveds         r;   resolve_doc_pathr     sE      	%jj##C(())3JIKK#S|!;<<c$iiHHII	

 $ 		 		I$,,..##%% $++DLLNN;;$..w/@/@AA$ $OOOOO   		 4s   =BE
EEdoc_idinttuple[Path, str] | Nonec                X   t          j        t                                                                           dd          }|                    d           t           j        |_        	 |                    d| f                                          }|s	 |	                                 d S t          |d         |d                   }|s	 |	                                 d S |t          |d         p|j                  f|	                                 S # |	                                 w xY w)	Nz?mode=roT)urizPRAGMA query_only=ONz~SELECT datei_name,dateipfad,local_original_path FROM dokumente WHERE id=? AND COALESCE(quelle,'')<>'dashboard_v5_local_intake'local_original_path	dateipfad
datei_name)sqlite3connectDBr   as_uriexecuteRowrow_factoryfetchoner   r   r   name)r   
connectionrowr   s       r;   document_pathr    s8   BJJLL$7$7$9$9!C!C!CNNNJ-...$[J   MI
 
 (** 	  	 	  $9 :C<LMM 	 	 S\*7di888
s   *+D ,D !D D)rootr   r   c           	     `   |                                  } |                                 }	 |                    |           }n"# t          $ r}t          d          |d}~ww xY w|j        rt          d |j        D                       rt          d          t          j        | t          j        t          j	        z  t          j
        z            }	 |j        dd         D ]S}t          j        |t          j        t          j	        z  t          j
        z  |          }t          j        |           |}Tt          j        |j        d         t          j        t          j
        z  t          t          dd          z  |          t          j        |           S # t          j        |           w xY w)	z4Open each path component without following symlinks.outside_rootNc              3     K   | ]}|d v V  	dS )>   ..rK   r5   Nr   )r9   parts     r;   	<genexpr>z(_open_regular_beneath.<locals>.<genexpr>  s'       T TT!8 T T T T T Tr=   invalid_path)dir_fdr   r   )absoluterelative_tor   r   partsanyr   r   r   O_DIRECTORYr   r   getattr)r  r   relativeerror	directoryr  childs          r;   _open_regular_beneathr!    s   ==??D""$$I1((.. 1 1 1n%%501> &S T TX^ T T TTT &n%%%bkBN:R]JKKIN3B3' 	 	DGbn,r}<   E
 HYIIwN2K"-''"lA*F*FF
 
 
 	s$   A   
A
AAB2F F-databaseopaque tuple[int, int, str, str] | Nonec                z   t          |           }	 t          ||d          }n%# t          $ r Y |                                 dS w xY w	 |                                 n# |                                 w xY wt          j                            d          rt          n1t          	                                t          	                                f}t          |d         p|d         |t          t                    }|j        dk    s|j        |                                 dS |j        |j        |j        |j        fS )	zMResolve any known document and pin the safely opened descriptor for HEAD/GET.FreviewedNHEALTH_DASHBOARD_ORIGINAL_ROOTSr   r   )roots	max_bytesopener	available)r   r   r   r   r   environr   ORIGINAL_ROOTSr   r  r   r   r   r!  statusr   sizemimedownload_name)r"  r#  r
  r  r)  probes         r;   open_safe_originalr4    sH    #8,,J&z6EJJJ    	 	
 :>>;<<	3mmoow//112 

 !"6c+&6$$	  E |{""e&6&>tUZU5HHHs%   $ A 
AA AA A5varianttuple[int, int, str] | Nonec                z   |dvrd S t          |           }	 t          ||d          }|                    d|d         f                                          }n7# t          t
          j        t          f$ r Y |                                 d S w xY w	 |                                 n# |                                 w xY w|d S |dk    r|d         n|d         }|sd S t          |d	                   }t          j        d
|          sd S t          j        |           d}t          j        |t          |                    sd S t          t          |          z  }		 t          j        |	t          j        t          j        z            }
n# t$          $ r Y d S w xY wt          j        |
          }|dk    rdnd}t)          j        |j                  rD|j        t          j                    k    s(t)          j        |j                  dk    s|j        |k    rt          j        |
           d S |
|j        |dk    rdndfS )N>   proxypreviewFr&  zSELECT dm.preview_name,dm.proxy_name,dm.media_kind,dp.intake_id FROM document_media dm JOIN document_processing dp ON dp.document_id=dm.document_id WHERE dm.document_id=?idr9  r   r3      doc_[a-f0-9]{24}z_(?:preview\.jpg|proxy\.mp4)-    r   rw   	video/mp4)r   r   r  r  r   r  r   KeyErrorr   r   r   r   escapeDOCUMENT_STORAGEr   r   r   r   r   r   r   r   r   r   r   r   r   )r"  r#  r5  r
  documentr  r	  	intake_idr   r   r   r   maximums                r;   open_document_mediarF    s   ***t"8,,J	+JOOO   yd^
 
 (** 	 gmX.   	 	 	

{t	))3q66s1vD tCFI<+Y77 t9Y''EEEH<#d)),, tc$ii'DWT2;#>??

   ttx
##H"i//iiZG<()) *X_	-K-Kt|\d\lOmOmqvOvOv  {C  {K  NU  {U  {U
TTx'I9M9MS^^^s<   AA B& B5B& BB& &B<,F	 	
FFr	  c                *   t          t          |                     j        }t          |z                                  }	 |                                r.|                    t                                                    r|S n# t          $ r Y d S w xY wd S N)r   r   r	  r   r   r   r   r   )r	  cleanr   s      r;   safe_report_pathrJ    s    $EeO$$&&D<<>> 	d11'//2C2CDD 	K   tt4s   AB 
BBraw_hostc                      rt           fddD                       rd S 	 t          d z             }|j        }|j        }n# t          $ r Y d S w xY w|r'|                                                    d          nd S )Nc              3      K   | ]}|v V  	d S rH  r   )r9   charrK  s     r;   r  z)canonical_request_host.<locals>.<genexpr>   s(      II48+IIIIIIr=   )/@\//r5   )r  r   hostnameportr   r7   r8   )rK  parsedhost_s   `   r;   canonical_request_hostrX    s     sIIII8HIIIII t$/**K   tt'+54::<<s###5s    A 
AAc                :    t          |           }|d uo|t          v S rH  )rX  ALLOWED_HOSTS)rK  rV  s     r;   host_is_allowedr[  +  s$    !(++Dt5 55r=   origintrusted_port
int | Nonec                T   	 t          d|z             }t          |           }|j        pt          dk    rdnd}|j        p|j        dk    rdnd}n# t          $ r Y dS w xY w|j        t          k    s1|j        r*|j        #|j        |j        s|j	        s|j
        s|j        rdS |j        }|t          n|}|d uoot          |          o`|j                                                            d          |                                                    d          k    o||k    o||k    S )NrR  r1   i  P   Fr5   )r   rT  EXTERNAL_SCHEMEschemer   rS  r   r   r   paramsqueryfragmentEXTERNAL_PORTr[  r7   r8   )	r\  rK  r]  request_authorityr   request_portsupplied_portrequest_hostexpected_ports	            r;   origin_matches_requestrl  0  sy   $TH_55F##(-\G9S9S##Y[ TG1K1K##QS   uu 	?**  	+((= )? ) > ) 	 ) u$-L%1%9MM|MD  	*H%%	*##%%,,S11\5G5G5I5I5P5PQT5U5UU	* ]*	* M)s   AA 
AAr   float | Nonec                   | t          j                    n| t          j        d          }t          5  fdt
                                          D             }|D ]}t
                              |d            t
          |<   t          t
                    dk    rSt          t
          t
          j
                  }t
                              |d            t          t
                    dk    Sd d d            n# 1 swxY w Y   |S )N   c                6    g | ]\  }}|z
  t           k    |S r   )CSRF_TTL_SECONDS)r9   existing	timestamp	issued_ats      r;   r   z$issue_csrf_token.<locals>.<listcomp>T  s8     
 
 
#)9$'777 777r=   rt   r   )r   r   r   r   
_csrf_lockrx   r   r   r   minr   )r   r   r   rr  oldestrt  s        @r;   issue_csrf_tokenry  P  sF   $'K   SI!"%%E	 + +
 
 
 
'3'9'9';';
 
 

   	- 	-HXt,,,,'U,#%%<+;<<<FVT*** ,#%%+ + + + + + + + + + + + + + + L   B;C;;C?C?c                    |t          j                    n|}t          5  t                              | d           }d d d            n# 1 swxY w Y   |d uod||z
  cxk    o
t
          k    nc S Nr   )r   r   rv  rx   r   rq  r   r   
checked_atrt  s       r;   consume_csrf_tokenr  b  s    %([!!!cJ	 2 2 $$UD11	2 2 2 2 2 2 2 2 2 2 2 2 2 2 2D TQ*y*@%T%T%T%TDT%T%T%T%TT   AAAc                   | t          j                    n| t          j        d          }t          5  t
          |<   fdt
                                          D             }|D ]}t
                              |d            t          t
                    dk    rSt          t
          t
          j
                  }t
                              |d            t          t
                    dk    Sd d d            n# 1 swxY w Y   |S )N   c                6    g | ]\  }}|z
  t           k    |S r   )QUEUE_RECEIPT_TTL_SECONDS)r9   r   rs  rt  s      r;   r   z'issue_queue_receipt.<locals>.<listcomp>n  s8     
 
 
Y9$'@@@ @@@r=   rt   ru  )r   r   r   r   _queue_receipt_lockry   r   r   r   rw  r   )r   r   r   r   rx  rt  s        @r;   issue_queue_receiptr  i  sF   $'K   SI!"%%E	 . .!*
 
 
 
"1"7"7"9"9
 
 

  	+ 	+CT****/""S((o.ABBBF--- /""S((. . . . . . . . . . . . . . . Lrz  c                    |t          j                    n|}t          5  t                              | d           }d d d            n# 1 swxY w Y   |d uod||z
  cxk    o
t
          k    nc S r|  )r   r   r  ry   r   r  r}  s       r;   consume_queue_receiptr  {  s    %([!!!cJ	 5 5#''t44	5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 	 	Ei'DDDD+DDDDDr  Fcapture_queuedr   r  tuple[bytes, str, str, str]c                  t          j        d          }t                      }t                      }|                     d          }t	                      }|                    d|          }|                    d|          }|                    d|rdnd          }|                    d	|                                          }|                    d
|                    d                    }|                    dt          j	        t                                        d                    }|                    dd| d          }|                    dd| d          }|                    d          |||fS )Nr  r   )encoding__CSRF_TOKEN____BROWSER_SESSION_CSRF____CAPTURE_QUEUED__truefalse__CAPTURE_DATE____CAPTURE_DATE_LABEL__z%d.%m.%Y__CAPTURE_DATETIME__z%Y-%m-%dT%H:%Mz<scriptz<script nonce=''z<stylez<style nonce=')r   r   ry  	read_textlocal_todayr   	isoformatstrftimer   r   CAPTURE_TIMEZONEencode)r   r  nonce
csrf_tokenbrowser_session_csrf_tokentextcapture_days          r;   dashboard_html_with_noncer    sW   
 !"%%E!##J!1!3!3>>7>++D--K<<(*55D<<24NOOD<<,.SffGTTD<<*K,A,A,C,CDDD<<0+2F2Fz2R2RSSD<<.=M0N0N0W0WXh0i0ijjD<<	#=U#=#=#=>>D<<";5";";";<<D;;w
4NNNr=   r   c                 X    t          j        t                                                    S rH  )r   r   r  r   r   r=   r;   r  r    s    <())..000r=   formdict[str, list[str]]tuple[str, dict[str, int], str]c                |   |                      d          pdgd         }	 t          j        |          }n"# t          $ r}t          d          |d }~ww xY w|j        dk     s|t                      k    rt          d          i }t          D ]H}|                      |          pdgd         }|dvrt          d|           t          |          ||<   I|                      d	          pdgd                                         }t          |          d
k    rt          d          |
                                ||fS )Nr   rK   r   zinvalid date  zdate outside allowed range   rb   rR   rc   rd   zinvalid or missing score: notes,  znotes too long)r   r   fromisoformatr   yearr  SYMPTOM_FIELDSr   r6   r   r  )r  day
parsed_dayexcscoresfieldr   r  s           r;   validate_symptom_formr    sV    88F#tQ
'C2',,

 2 2 2((c12kmm!;!;5666F ! !xx&2$****A%AABBBCuXXg&2$*0022E
5zzC)***!!6500s   5 
AAA$tuple[str, dict[str, int], str, str]c                   dddht           }|dhz  }t          |           }|t          |          t          |          hvrt          d          t          d |                                 D                       rt          d          |                     ddg          d	         }|d
vrt          d          t          |           \  }}}||||fS )Nr  r   r  	return_tozinvalid submission shapec              3  <   K   | ]}t          |          d k    V  dS r3   Nr   r9   r   s     r;   r  z.validate_symptom_submission.<locals>.<genexpr>  -      
8
83v;;!
8
8
8
8
8
8r=   z$every field must have a single valuev4r   >   r  v5invalid return target)r  	frozensetr   r  r   r   r  )r  requiredallowedkeysr  r  r  r  s           r;   validate_symptom_submissionr    s     fg??H+&GT??DIh''7););<<<3444

8
8$++--
8
8
888 A?@@@tf--a0I$$0111.t44Cy((r=   r  r:   rE  r  c                   d                     |                                           }|r|r3t          |          |k    s t          j        d|t          j                  rt          d          |S )Nr   )[\x00-\x1f\x7f]|https?://|/|\\\\|\.hermeszinvalid action text)joinsplitr   r   searchIr   )r:   rE  r  cleaneds       r;   _safe_action_textr    sw    hhu{{}}%%G 0 0S\\G%;%;ryIuw~  AC  AE  @F  @F%;.///Nr=   c                   	 t          j        |           }n"# t          $ r}t          d          |d }~ww xY w|j        |j        dk     rt          d          |                    t                    }|t          j        t                    t          d          z   k    rt          d          |	                    d          S )	Nzinvalid action datetimer  )tzinfo   )minuteszfuture action datetimer  )timespec)
r   r  r   r  r  r   r  r   r   r  )r:   rU  r  awares       r;   _local_action_datetimer    s    ='.. = = =233<=} FK$$6$62333NN"2N33Ex|,--	!0D0D0DDDD1222Y///s    
616	list[str]c                    | sg S |                      d          }t          |          dk    st          d |D                       rt          d          |S )Nr?      c              3  L   K   | ]}| p|                                 |k    V   d S rH  )r6   )r9   items     r;   r  z#_csv_identifiers.<locals>.<genexpr>  s6      RR4$h>$**,,$*>RRRRRRr=   zinvalid identifier list)r  r   r  r   )r:   r   s     r;   _csv_identifiersr    s^     	[[F
6{{Q#RR6RRRRR2333Mr=   tuple[dict[str, Any], str]c                4   t          d |                                 D                       s!|                     ddg          d         dk    rt          d          |                     ddg          d         }h d}|d	k    r|h d
z  }t	          |           |k    rt          d          dd| d         d         | d         d         | d	         d         t          | d         d                   t          | d         d                   t          | d         d                   t          | d         d                   | d         d         | d         d         | d         d         | d         d         | d         d         dk    dd}n|dk    r|h dz  }t	          |           |k    rt          d          dd| d         d         | d          d         | d!         d         | d"         d         | d         d         | d         d         | d#         d         t          | d$         d                   t          | d%         d                   t          | d         d                   t          | d         d                   | d&         d         | d'         d         d(}nl|d)k    r|h d*z  }t	          |           |k    rt          d+          dd,| d         d         | d          d         | d-         d         | d&         d         | d.         d         | d/         d         | d0         d         | d1         d         | d2         d         | d3         d         | d4         d         | d         d         d5}n|dk    rGt	          |           |ddhz  k    rt          d6          dd7| d         d         | d         d         d8}nN|d9k    r9t	          |           |dhz  k    rt          d:          dd;| d         d         d<}nt          d=          t          |          dfS )>Nc              3  <   K   | ]}t          |          d k    V  dS r  r  r  s     r;   r  z2validate_observation_submission.<locals>.<genexpr>  r  r=   r  rK   r   r  zinvalid observation submissionmode>   r  r  r  question>   notetitler/  lag_maxlag_minend_dateoutcomesr  
influences
start_dateinclude_doctorobservation_idzinvalid observation shaper3   observation_upsertr  r  r  r  r  r  r  r  r/  r  r  rR   zpersonal-observation-phases-v1)versionactionr  r  r  r  r  r  r  r  r  r/  r  r  method_versionphase>   r	  r  eventsr  r  metricsr  phase_id	adherence
phase_typer  behavior_goalr  zinvalid phase shapeobservation_phase_upsertr  r  r	  r  r  r  r  r  )r  r  r  r  r  r	  r  r  r  r  r  r  r  r  r  checkin>   r  r  stresstravelr  r  	infectionr  sleep_disruptionunusual_activitymedication_change_factsupplement_change_factzinvalid checkin shapeobservation_checkinr  r  r  r  r  r  r  r  )r  r  r  r  r  r  r  r  r  r  r  r  r  r  zinvalid status shapeobservation_status)r  r  r  r/  snapshotzinvalid snapshot shapeobservation_result_snapshot)r  r  r  zinvalid observation mode)r  r   r   r   setr  r   validate_observation_action)r  r  commonr  payloads        r;   validate_observation_submissionr    s   

8
8$++--
8
8
888 ;DHH[SURV<W<WXY<Z^b<b<b9:::88FRD!!!$D000Fz  g  g  g  gt99  8999(<dScNdefNgptu|p}~  qA  MQ  R\  M]  ^_  M`  n~  C  DP  Q  RS  T  nU  nU  aq  rv  wA  rB  CD  rE  aF  aF  QT  UY  Zc  Ud  ef  Ug  Qh  Qh  sv  w{  |E  wF  GH  wI  sJ  sJ  X\  ]i  Xj  kl  Xm  y}  ~H  yI  JK  yL  VZ  [c  Vd  ef  Vg  os  tz  o{  |}  o~  PT  Ue  Pf  gh  Pi  kn  Pn  @`  a  a	  q  q  q  qt99  2333&@RVWgRhijRkw{  }G  xH  IJ  xK  Y]  ^j  Yk  lm  Yn  vz  {A  vB  CD  vE  SW  Xd  Se  fg  Sh  tx  yC  tD  EF  tG  X\  ]l  Xm  no  Xp  {K  LP  QZ  L[  \]  L^  {_  {_  iy  z~  G  zH  IJ  zK  iL  iL  WZ  [_  `i  [j  kl  [m  Wn  Wn  y|  }A  BK  }L  MN  }O  yP  yP  ]a  bm  ]n  op  ]q  z~  F  zG  HI  zJ  K  K			  I  I  I  It99  4555&;TRbMcdeMfrv  xB  sC  DE  sF  MQ  RW  MX  YZ  M[  hl  mx  hy  z{  h|  FJ  KS  FT  UV  FW  ko  pB  kC  DE  kF  SW  Xc  Sd  ef  Sg  {  @R  {S  TU  {V  `d  em  `n  op  `q  KO  Ph  Ki  jk  Kl  FJ  Kc  Fd  ef  Fg  os  tz  o{  |}  o~    			t99"28!<<<<3444&:DQaLbcdLeost|o}~  pA  B  B			t99"2!33335666&CUYZjUklmUnoo3444&w//55r=   action_pathtuple[dict[str, object], str]c           
     
   |t           k    rh d}t          |           |k    s+t          d |                                 D                       rt	          d          | d         d         dk    rt	          d          | d         d         }d	| d
         d         | d         d         | d         d         | d         d         | d         d         | d         d         | d         d         | d         d         d	}|dk    ro| d         d         }i |d| d         d         | d         d         |                                rt          |          nd | d         d         | d         d         d}n9|dk    r$i |d| d         d         | d         d         d d}nt	          d           t          |          dfS h d!}|t          k    r|h d"z  }n5|t          k    r|h d#z  }n"|t          k    r|h d$z  }nt	          d%          t          |           |k    s+t          d& |                                 D                       rt	          d'          | d         d         dk    rt	          d          t          | d         d                   }t          | d         d         d(          }	|t          k    r| d)         d         }
|
d*vs| d+         d         d,vrt	          d-          | d.         d         }|rt          |          nd/}| d0         d         }|r6|                                rt          |          d1k    rt	          d2          t          | d3         d         d4|
d5k    6          }d	d7||
t          | d+         d                   ||rt          |          nd ||	d8	dfS |t          k    r4| d9         d         }|d:vrt	          d;          t          | d<         d         d=d>6          }t          t	          d?          t          t                    }	 |                    d@|f                                          }|                                 n# |                                 w xY w|t	          dA          t          | dB         d         dC          }t          | d         d         dD          }t          | dE         d         dF          }d	dG|||||||	dH	dfS | dI         d         }|dJvrt	          dK          | dL         d         }|r|d,vrt	          dM          t          | d3         d         dNd>6          }d	dO||||rt          |          nd |	dPdfS )QN>   r  unitr  amountr/  productr  weekdaysr  r  r  occurred_atnutrient_keybrand_variantinterval_daysschedule_typecomposition_sourceassignment_reliabilityc              3  <   K   | ]}t          |          d k    V  dS r  r  r  s     r;   r  z*validate_patient_action.<locals>.<genexpr>  s-      'U'UVFq(8'U'U'U'U'U'Ur=   z#invalid supplement submission shaper  r   r  r  r  r3   r  r  r  r  r
  r  r  r  )	r  r  r  r  r  r
  r  r  r  plannedr  supplement_planr  r  r  r  )r  r  r  r  r  r  actualsupplement_intaker/  r  )r  r/  r  plan_idzinvalid supplement mode>   r  r  r  r  >   labelonset_atseveritysymptom_typeduration_minutes>   doser
  route
event_typemedication_name>   r  category	intensityzunsupported patient actionc              3  <   K   | ]}t          |          d k    V  dS r  r  r  s     r;   r  z*validate_patient_action.<locals>.<genexpr>:  -      #Q#QCKK1$4#Q#Q#Q#Q#Q#Qr=   zinvalid patient action shaper  r  >   rT   rW   rV   otherrX   aphthaerU   headacher  r  zinvalid symptom eventr  rK   r  i`'  zinvalid symptom durationr  r`  r(  r  symptom_event)	r  r  r  r  r  r  r  r  r  r"  >   missed	correctedadministeredzinvalid medication eventr#  rq   Tzmedication catalog unavailablezHSELECT 1 FROM medication_administrations WHERE medication_name=? LIMIT 1z"medication is not in exact catalogr   (      r!  rN   medication_event)	r  r  r  r"  r#  r   r
  r!  r  r$  >   heatr(  r  r  r  appointmentphysical_loadr  zinvalid event categoryr%  zinvalid event intensityd   general_event)r  r  r  r$  r  r%  r  )SUPPLEMENT_EVENT_ROUTEr  r  r   r   isdigitr   r   SYMPTOM_EVENT_ROUTEMEDICATION_EVENT_ROUTEGENERAL_EVENT_ROUTEr  r  API_DBr   r  r  r   )r  r  r  r  common_payloadintervalr  r  r  r  r  onsetr  durationr  r"  
medicationr
  knownr   r
  r!  r$  r%  s                           r;   validate_patient_actionrC    s   ,,,
 
 
 t99  C'U'Ut{{}}'U'U'U$U$U BCCCQ4''4555F|AIq)!/215 038nQ'LO"&';"<Q"?&*+C&DQ&G']1%
-
 
-
 9O,Q/H +!%o!6q!9 ,Q/2:2B2B2D2D!NX$"<03 ,Q/  GG X -x.+#M215  GG 6777*733T99@@@F)))aaaa	.	.	.VVVV	+	+	+>>>>5666
4yyH#Q#Q4;;==#Q#Q#Q Q Q7888Kt##0111(m)<Q)?@@Kd7mA.44E)))N+A.jjjnrs}n~  @A  oB  J^  o^  o^4555Z #49A)%000r*+A. 	9X--// 	93x==53H3H7888!$w-"2BQXAXYYYeq  @C  DH  IS  DT  UV  DW  @X  @X  fn  U]  Dg  DG  HP  DQ  DQ  DQ  cg  rw  BG  H  H  JN  N  	N,,,,'*
DDD7888&t,='>q'A3QUVVV
>=>>>&v..
	&&Z  hjj 
 J=ABBB fa"55 fa"55!$w-"2B77(:;fp  FP  Z^  hl  w|  GL  M  M  OS  S  	SJ"H}}}1222[!!$I 4Y&:::2333d7mA.dCCCEOK]epu  W`  Ej  EH  IR  ES  ES  ES  fj  uz  {  {  }A  A  As   )Q Q0c                R	   h d}t          |           |k    s+t          d |                                 D                       rt          d          | d         d         }|dk    rt          d          | d         d         }| d	         d                                         }d
                    | d         d                                                   }d
                    | d         d                                                   }| d         d         }| d         d         }| d         d         }	d
                    | d         d                                                   }
d
                    | d         d                                                   }d
                    | d         d                                                   }| d         d         }| d         d         }d
                    | d         d                                                   }| d         d                                         }| d         d         }| d         d         }t          j        d|          st          d          t          j        d|          st          d          |	                                r|	                                st          d          t          |          }t          |          }d|cxk    rdk    rn nd|cxk    rd k    sn t          d          |d!f|d"f|
d#f|d$f|d%f|d!ffD ]G\  }}t          |          |k    s t          j        d&|t          j                  rt          d'          H|r|
r|st          d(          |t          vs(|t          vs|t           vs|	t"          vs|d)vs	|t$          vrt          d*          |d+k    }|d,k    r|d-k    s|r|rt          d.          |d/k    r|d-k    s|st          d0          |d1k    r|d-k    s|s|rt          d2          |d3v r!|d-k    s|s
|s|d-k    s|rt          d4          i d5d6d7d8d|d	|d|d|d|d-k    rd-nt          |          d|d|	d|
d|d|d|d|d|d|d|d|i|fS )9N>   r  aliasdecision	queue_keyr  
confidencer  sighi_scoresource_labeltarget_countcanonical_foodmapping_methodsource_versiontarget_revisiontarget_day_countpersonal_tolerance_notepersonal_tolerance_statusingredient_review_requiredc              3  <   K   | ]}t          |          d k    V  dS r  r  r  s     r;   r  z.validate_mapping_submission.<locals>.<genexpr>  r'  r=   zinvalid mapping shaper  r   r  r  rF  rG  r   rE  rL  rI  rH  rM  rJ  rN  r  rS  rR  rQ  rO  rK  rP  [0-9a-f]{32}zinvalid queue key[0-9a-f]{64}zinvalid mapping target revisionzinvalid mapping target countsr3   i'  iL     rq   r`  r/  r  r  zinvalid mapping textzmapping documentation required>   r  r  zinvalid mapping valuer  r[   re   zassign requires canonical scorer_   zcomposite remains unclassifiedr\   zignore must not classify>   rZ   r]   r^   r`   ra   z%review-state action must not classifyr     r  nutrition_mapping)r  r  r   r   r6   r  r  r   r   r8  r   r   r  r  MAPPING_DECISIONSMAPPING_SCORESMAPPING_CONFIDENCEMAPPING_METHODSPERSONAL_TOLERANCE_STATUSES)r  r  r  rF  rG  rE  rL  scorerH  methodrJ  rN  r  reviewtolerance_statustolerance_noterO  rK  rP  target_count_inttarget_day_count_intr:   rE  rS  s                           r;   validate_mapping_submissionrf  j  s     H( 4yyH#Q#Q4;;==#Q#Q#Q Q Q0111[!!$ID0111J"H[!!$**,,IHHT']1%++--..EXXd#34Q7==??@@N"El#A&J"#A&F88D0399;;<<LXXd#34Q7==??@@N88DLO))++,,D./2F78;XXd#<=a@FFHHIIN,-a06688O'*L./2<33 .,---<99 <:;;;!! :)9)A)A)C)C :8999<((/00 ))))E)))))6J1R1R1R1Rd1R1R1R1R8999			r		s	 	5 	5w u::29-Y[`bdbf#g#g3444   ; ;N ;9:::)))&&///((***#>>>0111!'6!18)!3!3>!3Mg!3:;;;;EY$6$6>X$69:::8)!3!3~!3Ic!33444RRR 	% 	 y(( ) @AAA1% 	H 	Y	
 	 	. 	EY$6$6yyCJJ 	j 	& 	 	. 	 	%&@ 	$%5 	">  	?!" 	(#$ 	0% & ' r=   r  dict[str, Any]c                    t          j        | ddd          }t          j        |                    d                                                    S )NTr?   r   ensure_ascii	sort_keys
separatorsr   )jsondumpshashlibsha256r  	hexdigest)r  	canonicals     r;   capture_payload_action_hashrt    sE    
7R\]]]I>)**73344>>@@@r=   idempotency_keyaction_hashc                H   t          j        d|           rt          j        d|          st          d          t          j        t                                          d          d|  d|                     d          t          j                  	                                S )NrU  rV  zinvalid capture status bindingr   zhealth-capture-status-v1  )
r   r   r   hmacnewr   r  rp  rq  rr  )ru  rv  s     r;   capture_status_tokenr{    s    <99 ;o_jAkAk ;9:::8((E_EEEELLWUU  ikk	r=   supplied_tokenc                (   t          j        d|           rt          j        d|          st          d          t          dz  |  dz  }	 t	          j        |t          j        t          j        z            }n# t          $ r Y dS w xY w	 t	          j	        |          }t          j        |j                  rD|j        t	          j                    k    s(t          j        |j                  dk    s|j        dk    rt#          d	          t	          j        |d
          }t	          j        |           n# t	          j        |           w xY wt)          j        |                                          }|                    d          }|                    d          }|                    d          dk    s|dvst1          |t2                    st#          d	          t5          | |          }	t7          j        |	|          st#          d          |S )NrU  rV  zinvalid status bindingzcapture-receipts.jsonpendingr   i   zinvalid capture receipti  r/  rv  r  rX  >   rejected	processedz capture receipt binding mismatch)r   r   r   ACTION_INBOXr   r   r   r   FileNotFoundErrorr   r   r   r   r   r   r   r   r   r   r   rn  loadsr   r   
isinstancer   r{  ry  r   )
ru  r|  r   r   r   datarecordr/  rv  expected_tokens
             r;   capture_processing_statusr    s   <99 3o_mAnAn 31222,,//H/H/HHDWT2;#>??

   yy8J''X-..	5")++--|H,--66$&&3444wz4((
Z&&FZZ!!F**]++Kzz)!!V3L%L%LT^_jloTpTp%L/000)/;GGN~~>> :8999Ms   ,A8 8
BB
BD4 4E
attachment_idc                   t          j        d|          r|dvrd S t          |           }	 |                    d|f                                          }n*# t
          j        $ r Y |                                 d S w xY w	 |                                 n# |                                 w xY w|d S |dk    rLt          |d                   dd}}}d|v rt          j	        |           d	nt          j	        |           d
}n|dk    rG|d         dk    s|d         sd S t          |d                   dd}}}t          j	        |           d}nCt          |d                   t          |d                   d}}}t          j	        |           d}t          j        ||          sd S t          |z  }		 t          j        |	t          j        t          j        z            }
n# t          $ r Y d S w xY wt          j        |
          }t#          j        |j                  rD|j        t          j                    k    s(t#          j        |j                  dk    s|j        |k    rt          j        |
           d S |
|j        |fS )Nz(?:img|vid)_[a-f0-9]{24}>   r8  r9  originalzdSELECT media_name,thumbnail_name,proxy_name,mime_type,media_kind FROM capture_attachments WHERE id=?r9  r3   rw   r=  _previewz_preview\.jpgz_thumb\.jpgr8     videorX  r?  r>  z_proxy\.mp4r   r;  z\.(?:jpg|png|heic|heif|mov|mp4)r   )r   r   r   r  r  r  r   r   r   rA  CAPTURE_MEDIAr   r   r   r   r   r   r   r   r   r   r   r   r   )r"  r  r5  r
  r  r	  r1  rE  r   r   r   r   s               r;   open_capture_mediar    s    <3]CC wVvGvGvt"8,,J  r
 
 (** 	 =   	 	 	

{t)!#a&kk<GdBLPTBTBTry//>>>>^`^ghu^v^v  [D  [D  [D	G		q6WCF4!#a&kk;
Gdy//<<<!#a&kk3s1v;;
Gdy//PPP<$'' t4DWT2;#>??

   ttx
##H<()) *X_	-K-Kt|\d\lOmOmqvOvOv  {C  {K  NU  {U  {U
TTx'--s;   )A B A=%B <A==B B,7,G$ $
G21G2tuple[int, int] | Nonec                L    t          | |d          }|r|d         |d         fnd S )Nr9  r   r3   )r  )r"  r  openeds      r;   open_capture_thumbnailr  .  s0    -CCF%+5F1Ivay!!5r=   Nonec                 .   t                               ddd           t                                           } t          j        | j                  r| j        t          j                    k    rt          d          t          j
        t           d           d S )Ni  T)r  parentsexist_okz-action inbox is not a private owned directory)r  mkdirlstatr   S_ISDIRr   r   r   r   r   chmod)r   s    r;   ensure_private_inboxr  2  s}    E4$???!!##H<()) GX_	-K-KEFFFH\5!!!!!r=   tuple[str, str] | Nonec                    t          |                     d          pd          }|dk    r&|t          |                     d          pd          fS |dk    r&|t          |                     d          pd          fS d S )Nr  rK   rY  rG  symptom_checkinr   )r   r   )r  r  s     r;   _pending_action_identityr  :  s    X&&,"--F$$$s7;;{339r::::"""s7;;v..4"55554r=   c                   t          |           }|d S t                              d          D ]}t          j        d|j                  s	 t          j        |t          j        t          j	        z            }	 t          j
        |          }t          j        |j                  rD|j        t          j                    k    s(t          j        |j                  dk    s|j        dk    r	 t          j        |           t'          j        t          j        |d                              d                    }t          j        |           n# t          j        |           w xY wn## t.          t0          t&          j        f$ r Y [w xY wt5          |t6                    r1t          |          |k    r|| k    r	|j        c S t;          d          d S )N*.jsonz[0-9a-f]{32}\.jsonr       i   r   z$pending action has different content)r  r  globr   r   r	  r   r   r   r   r   r   r   r   r   r   r   r   r   rn  r  r   r   r   r   JSONDecodeErrorr  dictstemr   )r  identityr   r   r   rr  s         r;   _matching_pending_actionr  C  s   '00Ht!!(++ S S|149== 		r{R]'BCCJ%8J//X%566")++55|H$455>>'$.. $$$$  :bgj$&?&?&F&Fw&O&OPP$$$$$$$$$t';< 	 	 	H	h%% 	S*B8*L*LPX*X*X7""y   *+QRRR4s7   ,E*:A1E,E*:E;E*E&&E**F
	F
c                   t           5  t                       t          j        | ddd                              d          }t          j        |                                          dd         }t          |           }||cddd           S t          dz  | d	z  }|
                                r"|                                s|cddd           S t          d
 t                              d          D                       t          k    rt          d          t          d| dz  }t          | d	z  }t!          j        |t           j        t           j        z  t           j        z  t           j        z  d          }	 t!          j        |d          5 }|                    |           |                                 t!          j        |                                           ddd           n# 1 swxY w Y   |                    |           t!          j        t          t           j        t           j        z            }		 t!          j        |	           t!          j        |	           n# t!          j        |	           w xY wn%# t>          $ r |                     d            w xY w|cddd           S # 1 swxY w Y   dS )zNAtomically enqueue a validated action; the network server never writes the DB.FTri  rj  r   Nr   receiptsr~  c              3     K   | ]}d V  dS r  r   )r9   rW  s     r;   r  z'write_action_payload.<locals>.<genexpr>r  s"      66Qq666666r=   r  zprivate action queue is fullr5   z.tmpr   wb)
missing_ok)!_action_lockr  rn  ro  r  rp  rq  rr  r  r  r   
is_symlinksumr  MAX_PENDING_ACTIONSr|   r   r   O_WRONLYO_CREATO_EXCLr   fdopenwriteflushfsyncfilenor   r   r  r   	Exceptionunlink)
r  packedr   rr  receipt	temporarydestinationr   handler  s
             r;   write_action_payloadr  a  sV   	 & &!	
 
 

 &// 	 v&&00223B37+G44& & & & & & & & +ooo=?? 	W%7%7%9%9 	& & & & & & & & 66,++H5566666:MMM !?@@@ ?u???2	"___4WK"*$ry02=@
 


	:t,, *V$$$)))* * * * * * * * * * * * * * * k***bkBN.JKKI$############ 	 	 	---	 M& & & & & & & & & & & & & & & & & &su   A:J:9J:B+J:JAG2&J2G6	6J9G6	:A	JI-J-JJJ:"J))J::J>J>"tuple[dict[str, object], str, str]c                	   t          |           h dk    s;t          d |                                 D                       s| d         d         dvrt          d          | d         d         }t	          j        d|          st          d	          t          j        | d
         d         t                    }h d}ddh}t          |t                    rl|                    |          rWt          |                              ||z            r2|                    d          dk    s|                    d          dk    rt          d          t          |                    d          t                    rt	          j        d|d                   st          d          |                    d          dvrt          d          t          |                    d          t                    rt          |d                   dk    rt          d          |d         dv r*t	          j        d|d                   st          d          |d         d v r*t	          j        d!|d                   st          d"          |                    d          }|                    d          }| d         d         d#k    r|d         d v r||t          d$          | d         d         d#k    r4|d         d%k    r(|                    d&          d'k    rt          d(          |4t          |          t           usd|cxk    rd)k    sn t          d*          |9t          |t                    rt	          j        d+|          st          d,          t          |                    d-          t                    rt          |d-                   d.k    st          |                    d/          t                    rZt          |d/                   d0k    sAt          |                    d&          t                    rt          |d&                   d1k    rt          d2          |                    d3          }|d         d4k    rt#          |          |d3<   n$t          |t                    st          d5          || d         d         |fS )6N>   r  r  r  return_documentc              3  <   K   | ]}t          |          d k    V  dS r  r  r  s     r;   r  z6validate_document_review_submission.<locals>.<genexpr>  sS        UC  UCjpUXY_U`U`deUe  UC  UC  UC  UC  UC  UCr=   r  r      r  v5_labsz"invalid document review submissionr  zapi-document-[a-f0-9]{24}zinvalid return documentr  object_pairs_hook>	   r
  r:   r  r  rF  r   	operation	target_iddocument_idexpected_candidate_revisionpreview_revisionr  r3   r  document_reviewzinvalid document review payloadr  r<  zinvalid document review idr  >
   page_reviewcontent_reviewcandidate_remapmetadata_revieworiginal_reviewtext_correctiondiscard_documentretry_extractioncandidate_decisioncandidate_transferzinvalid document operationr  @   zinvalid document target>   r  r  zpage_[1-9][0-9]{0,2}zinvalid document page target>   r  r  r  zcand_[a-f0-9]{24}z!invalid document candidate targetr  z"candidate preview binding requiredr  rF  corrected_confirmedz4laboratory correction requires a regenerated previewizinvalid candidate revisionz[a-f0-9]{64}zinvalid preview revisionr:   i  r
  r/  r0  zinvalid document review valuer   r  zinvalid document metadata)r  r  r   r   r   r   rn  r  r   r  r  issubsetr   r   r   typer   r#   )r  r  r  r  optionalexpected_revisionr  r   s           r;   #validate_document_review_submissionr    sM   
4yyMMMMMQT  UC  UCtxtt  uB  uB  UC  UC  UC  RC  RCM  GK  LW  GX  YZ  G[  ct  Gt  Gt=>>>*+A.O<4_EEqJWpLqLqFqji+?\]]]GnnnH-/ABHgt$$ <H,=,=g,F,F <cRYllNcNcdlowdwNxNx <  }D  }H  }H  IR  }S  }S  WX  }X  }X  \c  \g  \g  hp  \q  \q  uF  \F  \F:;;;gkk-00#66 7blK^`ghu`v>w>w 75666{{;  (`  `  `5666gkk+..44 4GK<P8Q8QTV8V8V2333{@@@Vmnu  wB  oC  JD  JD@7888{\\\egeq  sG  HO  P[  H\  f]  f]\<===$ABB{{#566Ky((W[-A  FC  .C  .C  IZ  Ib  fv  f~=>>>Ky((W[-AEY-Y-Y^e^i^ijt^u^u  zO  _O  _OOPPP$$/@*A*A*L*LTUYjT{T{T{T{n{T{T{T{T{5666#Z8H#-N-N#VXVbcr  uE  WF  WF#3444gkk'**C00 :C8H4I4ID4P4PXbcjcncnoucvcvx{X|X|4P  AD  EL  MS  ET  AU  AU  XZ  AZ  AZ  bl  mt  mx  mx  yC  mD  mD  FI  bJ  bJ  AZ  NQ  RY  Zd  Re  Nf  Nf  ik  Nk  Nk8999{{:&&H{000/99
$'' 64555D%a(/99r=   r  r  dict[str, int]r  c                ,    t          dd| ||d          S )Nr3   r  )r  r  r   r  r  )r  )r  r  r  s      r;   write_symptom_checkinr    s-    '	
 	
  r=   r  r  tuple[int, dict[str, Any]]c           	        t          | dd           }h d}t          | t                    r[||v rWi ddddddd	d
dddddddddddddddddddddd d!d"d#d$}d%d&d'| d(||                    |d)          d*ifS t	          |           }d+}|D ]\  }}}}}	||v r|d&d'|||	d*ifc S t          | t                    rd%d&d'd,dd-d*ifS d.d&d/d0d1d2d*ifS )3Nr  >   r  presetr9  strengthrA  dosage_formcapture_modeinjection_sidequantity_valueroute_originalinjection_detailinjection_regionroute_normalizedcorrection_reasoncorrection_targetdeviation_confirmedduplicate_confirmedr  u#   Bitte eine gültige Menge eingeben.r  u.   Bitte eine gültige Darreichungsform eingeben.r  u.   Bitte eine gültige Wirkstoffstärke eingeben.r  u1   Bitte den dokumentierten Applikationsweg prüfen.r  u#   Bitte die Injektionsregion prüfen.r  u-   Bitte die Seite der Injektionsstelle prüfen.r  u#   Bitte die Injektionsstelle prüfen.r  u"   Bitte den Applikationsweg prüfen.r  u2   Bitte den Erfassungsmodus oder Plantermin prüfen.r  u)   Bitte die Abweichung bewusst bestätigen.r  u9   Bitte einen möglichen Doppeleintrag bewusst bestätigen.r  z7Die Vorauswahl ist nicht mehr aktuell. Bitte neu laden.r9  :   Die Vorschau ist nicht mehr aktuell. Bitte erneut prüfen.r  u   Bitte die Notiz prüfen.rA  u*   Bitte das ausgewählte Medikament prüfen.r  zEDer zu korrigierende Eintrag ist nicht mehr aktuell. Bitte neu laden.r  u/   Bitte eine kurze Korrekturbegründung eingeben.  r  
validation_invalidu#   Bitte die markierte Angabe prüfen.)kindcoder  message))zinvalid medication action shaper  payload_invalidrA  u:   Die Medikationsangaben sind unvollständig oder ungültig.)zinvalid medication textr  medication_text_invalidrA  u;   Name, Stärke oder Notiz enthält eine unzulässige Angabe.)zrequires a real planr  planned_event_requiredr  u=   Für diesen Modus ist kein belastbarer Plantermin verknüpft.)z(lacks a structured administration presetr  planned_event_unstructuredr  u<   Der Plantermin enthält keine revisionssichere Mengenangabe.)zdiffers from verified presetr  preset_deviation_unconfirmedr  uZ   Die Eingabe weicht von der verifizierten Vorauswahl ab und muss bewusst bestätigt werden.)zadministration preset changed  preset_changedr  uI   Die verifizierte Vorauswahl hat sich geändert. Bitte Vorschau neu laden.)z,administration preset is no longer availabler  preset_unavailabler  uG   Die verifizierte Vorauswahl ist nicht mehr verfügbar. Bitte neu laden.)zstale medication previewr  preview_changedr9  r  )zalready consumedr  planned_event_consumedr  z*Der Plantermin wurde bereits dokumentiert.)z2correction target is no longer the latest revisionr  correction_target_changedr  uF   Der zu korrigierende Eintrag wurde bereits geändert. Bitte neu laden.)z3structured correction must preserve occurrence timer  correction_time_changedr  uK   Eine Korrektur muss den ursprünglichen Zeitpunkt unverändert übernehmen.)z2structured correction target lacks complete fieldsr  correction_target_unstructuredr  u\   Dieser ältere Eintrag kann nicht mit dem strukturierten Korrekturvertrag bearbeitet werden.)zstructured correction targetr  r  r  uH   Der zu korrigierende Eintrag ist nicht mehr verfügbar. Bitte neu laden.)zexplicitly active prescriptionr   prescription_not_active_for_planr  uW   Ein Plantermin kann nur gegen eine ausdrücklich aktive Verordnung dokumentiert werden.medication_validation_failedu@   Die Medikationsangaben sind ungültig. Bitte die Felder prüfen.  	technicalmedication_preview_unavailablerK   uI   Die Erfassung ist technisch nicht verfügbar. Es wurde nichts vorgemerkt.)r  r  r   r   r   )
r  r  allowed_fieldsmessagesreasonrulesre  status_coder  r  s
             r;   _medication_preview_errorr    sT   E7D))E  N %$$ i.)@)@
C
K
 H
 Q	

  E
 M
  E
  D
 P
 "#N
 "#^
 O
 S
 .
 F
   !h!
"  !R#
& W|=O=O=OZ_ltlxlxy~  Af  mg  mg  h  h  i  i  	iZZFE  8= t t3+tUGv<X]jq*r*r sssss %$$ DW|=[fr  @B  C  C  D  D  	D;8Xce  s~      @  @  @r=   c                       e Zd Z	 	 d0d1 fd	Zd2d
ZeZeZeZeZeZ	eZ
d2dZd2dZd2dZd3dZd2dZd4dZd4dZd2dZd2dZd5dZd6dZd7dZd8d"Zdddd#d$d9d+Zd:d/Z xZS );HandlerNr  r   r  r   explainr   r  c                   t          t          | dd                    j        }|                    d          rt          | dd          dk    }t	          | j                            dd                    s|                     dd|           d S |d	k    rd
n|}|d	k    rdnd}|                     |||           d S t                      	                    |||           d S )Nr   rK   /api/v1/commandHEADHost  invalid_hosti    read_only_endpointrequest_rejected)
r   r  r   r   r[  headersr   _send_api_errorsuper
send_error)	selfr  r  r  request_path	send_bodyr/  
error_code	__class__s	           r;   r&  zHandler.send_error  s      fb 9 9::?"":.. 	i44>I"4<#3#3FB#?#?@@ $$S.)DDD CKKSSTF15--BTJ  Y???F4'22222r=   c                   t          | j                            dd                    sdt          | j                  j                            d          r!|                     dd| j        dk               n|                     d           d S t          | j                  j                            d          r"|                     dd| j        dk               d S |                     d           d S )	Nr  rK   r  r  host_not_allowedr  r   r!  )	r[  r#  r   r   r   r   r$  r  r&  r'  s    r;   _reject_unsupportedzHandler._reject_unsupported	  s    t|//;;<< 		""'22:>> %$$S*<dlf>TUUUU$$$FDI#..z:: 	  &:DLF<RSSSFr=   c                8   t          | j                            dd                    s[t          | j                  j                            d          r|                     ddd           n|                     d           d S |                     d           d S )Nr  rK   r  r  r-  Fr)  	r[  r#  r   r   r   r   r$  r&  _handler.  s    r;   do_HEADzHandler.do_HEAD  s    t|//;;<< 		""'22:>> %$$S*<eDDDD$$$Fu%%%%%r=   c                8   t          | j                            dd                    s[t          | j                  j                            d          r|                     ddd           n|                     d           d S |                     d           d S )Nr  rK   r  r  r-  Tr1  r2  r.  s    r;   do_GETzHandler.do_GET%  s    t|//;;<< 		""'22:>> %$$S*<dCCCC$$$Ft$$$$$r=   c                    t          | j                            dd                    s[t          | j                  j                            d          r|                     ddd           n|                     d           d S t          | j                  j        }|                    d          ru|dk    r|                     d           nW|t          k    r| 
                                 n7|t          k    r|                                  n|                     dd	d           d S t          | j                  j        }|t          t          t          t           t"          t$          t&          t(          t*          t,          h
vr|                     d
           d S t/          | j                            dd                    sLd| j                            dd          v r|                     ddd           n|                     d           d S | j                            dd          }| j                            dd          }t1          ||t3          t5          | j        dt8                                        s|                     d           d S | j                                        dk    r|                     d           d S 	 t3          | j                            dd                    }n&# t<          $ r |                     d           Y d S w xY w|t(          k    rdnd}|dk     s||k    r|                     d           d S 	 t?          | j         !                    |          "                    d          ddd          }n-# tF          t<          f$ r |                     d           Y d S w xY w|                    d          pdgd          }tI          | j                            dd                    }	|	                    |t*          t,          hv rd!nd"          }
|r|
rtK          j&        ||
j'                  s|                     d           d S |t,          k    r&tQ          |          s|                     d           d S d}d}d}i }	 |t          k    r'tS          |          \  }}}}tU          |||           n|t          k    r8tW          |          \  }}tY          |d#                   }t[          |           n|t,          k    rbt]          |          h d$k    sDt_          d% |0                                D                       s|d&         d          d'k    stb          t=          d(          te          tg          j4        |d)         d                              }|                    d*          }|d+         d,k    s1tk          |tl                    r|                    d-          tn          vrt=          d.          tq          tb                    }	 ts          |           tu          ||          d          }|;                                 n# |;                                 w xY wd'}n(|t*          k    rt]          |          h d$k    s=t_          d/ |0                                D                       s|d&         d          d'k    rt=          d0          te          tg          j4        |d)         d                              }d'}t[          |           n}|t(          k    r#ty          |          \  }}}t[          |           nO|t&          k    r"t{          |          \  }}t[          |           n"t}          ||          \  }}t[          |           n# t~          $ rN d| j                            dd          v r|                     d1d2d           n|                     d1           Y d S t<          t          t          jB        f$ rU}|t,          k    r*t          |          \  }}| D                    ||d           n|                     d           Y d }~d S d }~wt          $ r |                     d3           Y d S t          $ r |                     d4           Y d S w xY w|t,          k    r| D                    d5d6|d7d           d S |t*          k    rnd| j                            dd          v rQt          |          }tY          |d8                   }t          ||          }| D                    d9d:||d;d           d S |t          t          hv r8d| j                            dd          v r| D                    d9d<d:id           d S |t*          k    r?d| j                            dd          v r"| D                    d9d:|d8         d=d           d S |d>v rt          t                      d?          }|t          k    r%t          |d?          }t          d@z   dA| dB| z   }n|t(          k    r|dCk    rt          dD| dEz   }n_|t(          k    r!t          dFt          |d?           dB| dGz   }n3|t&          k    rt          dH| dIz   }nt          dJ| dKz   }n
t          dLz   }| M                    dM           | N                    dN|           | N                    dOdP           | O                                 d S )QNr  rK   r  r  r-  Tz/api/v1/browser-sessionr   r!    Cookieapplication/jsonAccept  authentication_requiredOriginserver_port  z!application/x-www-form-urlencoded  Content-Lengthrb     r  i   r3     r      )keep_blank_valuesstrict_parsingmax_num_fieldsr  r   health_capture_csrfhealth_csrfrG  >   r  r  r  c              3  <   K   | ]}t          |          d k    V  dS r  r  r  s     r;   r  z"Handler.do_POST.<locals>.<genexpr>  -      HH3v;;!+HHHHHHr=   r  r  z%invalid medication preview submissionr  r  capture_typerA  contractz#invalid medication preview contractc              3  <   K   | ]}t          |          d k    V  dS r  r  r  s     r;   r  z"Handler.do_POST.<locals>.<genexpr>  rL  r=   zinvalid capture submissionr  idempotency_conflictr       r9  )r/  r  ru     queued)r/  
status_keystatus_tokenr/  )r/  ru  r  )safez1?view=nutrition&workspace=mapping&map_status=openz&map_sort=frequency&mapping=z&queued=r  z?view=record&tab=labs&queued=z#lab-reviewz$?view=record&tab=documents&document=z#next-document-decisionz.?view=explorer&explorer_area=questions&queued=z#observation-statusz?queued=z#capture-statusz?queued=1#symptomei/  LocationCache-Controlno-store)Pr[  r#  r   r   r   r   r$  r&  _handle_browser_sessionCAPTURE_UPLOAD_ROUTE_handle_capture_uploadDOCUMENT_UPLOAD_ROUTE_handle_document_uploadCHECKIN_ROUTENUTRITION_MAPPING_ROUTEr9  r:  r;  r7  OBSERVATION_ROUTEDOCUMENT_REVIEW_ROUTECAPTURE_ROUTEMEDICATION_PREVIEW_ROUTEr   rl  r   r  serverrf  get_content_typer   r   rfiler   r   r   r   r   r   r:   r  r  r  rf  r   r  r  r  r   r<  r   rn  r  r  r  MEDICATION_ACTION_CONTRACTSr   assert_medication_schemar   r   r  r  rC  r   RuntimeErrorr  r   r  _send_api_jsonr|   r   rt  r{  r   r  V5_ROUTEROUTEsend_responsesend_headerend_headers)r'  api_pathr  r\  rV  lengthmaximum_bodyr  r   r   cookie_tokenmapping_queue_key_valuemedication_preview_revisionr  r  r  r  r  r  preview_datapreview_connectionr  r  bodyrv  rU  rV  r  rG  targets                                 r;   do_POSTzHandler.do_POST.  s$   t|//;;<< 		""'22:>> %$$S*<dCCCC$$$FDI&&+z** 		444,,T2222111++----222,,....$$S*>EEEFty)).#""!$
 
 
 OOC   F/0@0@20N0NOO 	!T\%5%5h%C%CCC$$S*CTJJJJ$$$F!!(B//|++%fdC]\i8j8j4k4kll 	OOC   F<((**.QQQOOC   F	))*:C@@AAFF 	 	 	OOC   FF	  +.CCCttA::,..OOC   F		
''..w77"&#!	  DD j) 	 	 	OOC   FF	 ,''/B43dl..x<<==zz%0]D\4]%]%]!!cp
 
 		 )%1CDD	
 OOC   F222;Me;T;T2OOC   F"$&(#%'F	m++0KD0Q0Q-VUI%c659999 777%@%F%F"*-gk.B*C*C'$W---- 888II!G!G!GGGHH$++--HHHHH HK(+t33~$%LMMM24:d9oa>P3Q3QRR&{{622N+|;;%lD99 <#''
33;VVV$%JKKK%6v%>%>"/,-?@@@2H*G3 33/ ',,....&,,.... 		--II!G!G!GGGHH$++--HHHHH HK(+t33$%ABBB24:d9oa>P3Q3QRR 	$W---- 5556YZ^6_6_3O$W---- 111%DT%J%J"$W----%<T;%O%O"$W---' 	 	 	!T\%5%5h%C%CCC$$S*@$GGGG$$$FFL'-8 	 	 	666$=e$D$D!T##Kt<<<<$$$FFFFF 	 	 	OOC   FF 	 	 	OOC   FF	 222$:UVV  
 F-'',>$,BRBRS[]_B`B`,`,`5g>>KW%6788J/
KHHL#:|\\  
 F=*ABBBGY]a]i]m]mb^
 ^
 H
 H
 8$  
 F-'',>$,BRBRbC
 C
 -
 -
 #@Q8RSS  
 F)))/11;;;G555!"9CCC	IJQYQQQQR 
  555)y:P:P!$XG$X$X$XX 555!  %T5Q`fhKiKiKi  %T  %Tsz  %T  %T  %T  T 111cwcccd 
 "$Gw$G$G$GG11F3V,,,*555sj   (K- -LL>N &N/.N/F^ %Y ?^ Y**D/^ Ab$2b$A
a"b$b$#b$r   c                    t           dS 	 t                      }t                      }n# t          t          f$ r Y dS w xY wt          | j                            dd          ||          S )NTFAuthorizationrK   )r<  r   r   r   r   r   r#  r   )r'  r   r   s      r;   _v5_principal_authenticatedz#Handler._v5_principal_authenticated	  s{    >4	"$$E:<<NN& 	 	 	55	3L_b115.
 
 	
s   ( ==c                4   |                      d           |                     dd           |                     dd           |                     dd           |                     dd	           |                     d
d           |                                  d S )Nr<  WWW-Authenticatez!Basic realm="Health Dashboard V5"rY  rZ  Pragmano-cacheX-Content-Type-OptionsnosniffrB  rb   )ro  rp  rq  r.  s    r;   _send_dashboard_auth_requiredz%Handler._send_dashboard_auth_required  s    3+-PQQQ*555:...19===)3///r=   r)  c                   t          | j                  }|j        }|                    d          r|                     ||j        |           d S |dk    rF|                     d           |                     dt                     |                                  d S |t          t          hv r8|t          k    r*| 
                                s|                                  d S |t          k    rt          nt          }||                     d           d S 	 t          |j        d                              dg           }|o2|t          k    o't#          |          d	k    ot%          |d
                   }t'          ||          \  }}}	}
n-# t(          t*          f$ r |                     d           Y d S w xY w|                     ||j        d|||	|
|t          k               d S |t0          v r2t0          |         \  }}|                     t4          |z  |||           d S |                    d          r| 
                                s|                                  d S 	 t7          |                    dd	          d                   }n&# t:          $ r |                     d           Y d S w xY wt=          |          }|s|                     d           d S |                     |d
         |d	         d |           d S |                    d          rat?          |                    dd	          d                   }|s|                     d           d S |                     ||j        d |           d S |                     d           d S )Nr  rO  i.  rX  r8  T)rF  rT  r3   r   r  ztext/html; charset=utf-8r  r  r  connect_selfz/health-doc/r  z/health-report/) r   r   r   _handle_apird  ro  rp  rn  rq  rm  r  r  DASHBOARD_FILEDASHBOARD_V5_FILEr&  r   r   r   r  r  r   r   _send_bytesr	  ASSET_ROUTES_serve_file	ASSET_DIRr   rsplitr   r  rJ  )r'  r)  requestr   selectedqueued_valuesr  r  r  r  r  filenamecontent_typer   foundreports                   r;   r3  zHandler._handle  s   49%%|??:&& 	T7=)<<<F3;;s###Z///FE8$$$x(H(H(J(J22444)-~~<MH$$$ ($ O O O S Sb! !  @(@M**a/@ .mA.>??	  . '5   DeZ)C)C \*   $$$ *%+E!X-  	 	 	 F<%1$%7"HlH$	   F??>** 	3355 22444T[[a00455   $$$ "&))E $$$U1XuQxyAAAF??,-- 	%dkk#q&9&9"&=>>F $$$VV[$	BBBFs%   A5F
 
&F43F4)J	 	J,+J,c                   t          | j                  }|j        st          +|                     t          dndt          dnd|           d S |                                 s|                     dd|           d S | j                            dd          }| j                            d	d          }|rPt          || j                            d
d          t          t          | j        dt                                        r|r|dvr|                     dd|           d S | j                            dd          dvr|                     dd|           d S 	 t          | j                            dd                    }n/# t          t          f$ r |                     dd|           Y d S w xY w| j                            dd          }|                    d          }|rP|Nt!          |          t!          |j                  k    s)t%          j        ||j                  rt)          |          s|                     dd|           d S t+                      }d| dt,           }t.          r|dz  }|                     d           |                     d|           |                     dd           |                     dd           |                     d d!           |                     d"d#           |                     d$d%           |                     d&d'           |                     dd           |                                  d S )(Nr  rC  api_unavailableunknown_parameterr<  r=  r>  rK   Sec-Fetch-Siter  r?     same-originnoner@  origin_not_allowedrB  rb   >   rK   rb   r"  r9  csrf_rejectedzX-Health-Browser-CSRFhealth_browser_csrfzhealth_api_session=z-; Path=/; HttpOnly; SameSite=Strict; Max-Age=; Secure   
Set-CookierY  rZ  r  r  r  r  X-Frame-OptionsDENYReferrer-Policyno-referrerContent-Security-Policy*default-src 'none'; frame-ancestors 'none')r   r   rd  r<  r$  r  r#  r   rl  r   r  rf  rf  r   r   r   r   r:   r   r   r  r   r   BROWSER_SESSION_COOKIE_SECUREro  rp  rq  )	r'  r)  r  r\  
fetch_siter   csrf_headercsrf_cookier   s	            r;   r[  zHandler._handle_browser_sessionp  s   49%%= 	FN  ~3%+^!!9L  
 F//11 	  &?KKKF!!(B//\%%&6;;
	1  ,,GDKFFGG 	 	 (/FFF  &:IFFFF<,c22)CC  &8)DDDF	!$,"2"28R"@"@AAFFZ( 	 	 	  oyAAAFF	 l&&'>CCjj!677	";3{'8#9#999)+{7HII :%k22 :   oyAAAF*,,
5* 5 525 5 	 ) 	!j F3v...*555:...19===*F333*M:::%'S	
 	
 	
 	)3///s   (F (F.-F.c                   t          | j                            dd                    s|                     ddd           d S t	          | j                            dd          | j                            dd          t          t          | j        dt                                        s|                     d	d
d           d S 	 t          | j                            dd                    }n/# t          t          f$ r |                     d	dd           Y d S w xY w| j                            dd          }|                    d          }|r+|)t          j        ||j                  rt          |          s|                     d	dd           d S | j                                        dk    r|                     ddd           d S 	 t          | j                            dd                    }n(# t          $ r |                     ddd           Y d S w xY w|dk     s|t"          k    r|                     ddd           d S 	 t%          t&          | j                            |                    }nK# t          $ r |                     ddd           Y d S t,          $ r |                     ddd           Y d S w xY w|                     dd|id           d S )Nr9  rK   r<  r=  Tr>  r  r?  r@  r  r  X-Health-Capture-CSRFrI  application/octet-streamrA  media_type_not_allowedrB  rb   rC  r"  r3   rD  media_too_larger  media_rejectedr  quarantine_unavailable   attachment_token)r   r#  r   r$  rl  r   r  rf  rf  r   r   r   r   r   r:   r  rg  MAX_CAPTURE_MEDIA_BYTESr   CAPTURE_QUARANTINErh  r   r   rl  )r'  r   r   r   rs  r   s         r;   r]  zHandler._handle_capture_upload  s"   /0@0@20N0NOO 	  &?FFFF%LXr**LVR((]MBBCC
 
 	
   &:DAAAF	!$,"2"28R"@"@AAFFZ( 	 	 	  ot<<<FF	 <##$;R@@::344	)(HNCC  %h//     ot<<<F<((**.HHH  &>EEEF	))*:C@@AAFF 	 	 	  &8$???FF	 A::"999  &7>>>F	$%79P9PQQEE 	 	 	  &6===FF 	 	 	  &>EEEFF	 	C"4e!<dCCCCCs<   (C. .(DD
(G3 3!HH-I4 4!J< J<;J<c                   t          | j                            dd                    s|                     ddd           dS t	          | j                            dd          | j                            dd          t          t          | j        d	t                                        s|                     d
dd           dS 	 t          | j                            dd                    }n/# t          t          f$ r |                     d
dd           Y dS w xY w| j                            dd          }|                    d          }|r+|)t          j        ||j                  rt          |          s|                     d
dd           dS | j                                        dk    r|                     ddd           dS 	 t          | j                            dd                    }n(# t          $ r |                     ddd           Y dS w xY w|dk     s|dk    r|                     ddd           dS d}	 t#          j        | j                            |                              d          t,                    }t/          |t0                    rt3          |          ddhk    rt          d          |d         }t/          |t4                    st          d          t7          j        |d           }t;          ||d         t<                    }|J d!d"|d#         |d$         |d         d%}	t?          |	           n# t          t@          t"          j!        tD          j#        f$ r |                     d&d'd           Y dS tH          $ rE |r(tK          t5          |d#                   t<                     |                     d(d)d           Y dS tL          $ rE |r(tK          t5          |d#                   t<                     |                     d(d*d           Y dS w xY w| '                    d+d,d-d.d           dS )/zGValidate a document into private quarantine and queue worker ownership.r9  rK   r<  r=  TNr>  r  r?  r@  r  r  r  rI  r:  rA  r  rB  rb   rC  r"     i  rD  document_too_larger   r  r   content_base64zinvalid upload payloadzinvalid upload contentr   r3   document_importr   rq  )r  r  quarantine_tokenrq  r   r  document_rejectedr  
queue_fullr  rS  rT  r  )r/  rD  )(r   r#  r   r$  rl  r   r  rf  rf  r   r   r   r   r   r:   r  rg  rn  r  rh  r   r   r   r  r  r  r   r   r   r"   DOCUMENT_QUARANTINEr  r   r  r   r   r|   r!   r   rl  )
r'  r   r   r   rs  uploadr   encodedcontentr  s
             r;   r_  zHandler._handle_document_upload  s   /0@0@20N0NOO 	  &?FFFF%LXr**LVR((]MBBCC
 
 	
   &:DAAAF	!$,"2"28R"@"@AAFFZ( 	 	 	  ot<<<FF	 <##$;R@@::344	$,)(HNCC -%h// -   ot<<<F<((**.@@@  &>EEEF	))*:C@@AAFF 	 	 	  &8$???FF	 B;;&#333  &:DAAAF+/!	*
''..w77"?  C c4(( ;CHHEU8V,V,V !9:::*+Ggs++ ; !9:::&w>>>G&wJATUUF%%%+$*7O *
O F !((((L$*>O 	 	 	  &94@@@FF 	 	 	 N"3vg#7#79LMMM  lD999FF 	 	 	 N"3vg#7#79LMMM  &>EEEFF		
 	CH9!M!MtTTTTTsE   (C. .(DD
(G3 3!HHD
M >P*A
P*A
P*)P*r   r   rd  c                   t           |                     dd|           d S 	 t                      }n# t          t          f$ r d }Y nw xY w|d uo(t          | j                            dd          |          }t          | j                            dd                    }||                     dd|           d S |s|s|                     dd|           d S | j                            dd          }| j                            d	d          }|rPt          || j                            d
d          t          t          | j        dt                                        r|r|dvr|                     dd|           d S |dv rI|s|s!|                     |rdnd|rdnd|           d S t                      }	t          j        d|	id                                          }
|                     d           |                     dd           |                     dt)          t+          |
                               |dk    rdnd}t,          rdnd}|                     d| d|	 d|            |                     d d!           |                     d"d#           |                                  |r| j                            |
           d S t5          j        d$|          }|r|r|                     dd%|           d S 	 t9          |                    d&          |                    d'                    }n@# t          t<          t          t          j        f$ r |                     dd(|           Y d S w xY w|                      dd)|i|           d S t5          j        d*|          }|rM|r|                     dd%|           d S |                    d'          d+k    rd,n|                    d'          }tC          t           |                    d&          |          }|s|                     d-d.|           d S |\  }}}	 |                     d           |                     d|           |                     dt)          |                     |d/k    r8d0d1d2d3d4d5d6                    |d7          }|                     d8d9| d:           n|                     d8d;           |                     d d!           |                     d<d=           |                     d"d#           |                     d>d?           |                                  |rwtE          j#        |d@dAB          5 }|$                    dC          x}
r1| j                            |
           |$                    dC          x}
1d d d            n# 1 swxY w Y   tE          j%        |           n# tE          j%        |           w xY wd S t5          j        dD|          }|r|r|                     dd%|           d S tM          t           |                    d&          |                    d'                    }|s|                     d-d.|           d S |\  }}}	 |                     d           |                     d|           |                     dt)          |                     |                     d8d;           |                     d d!           |                     d<d=           |                     d"d#           |                     d>d?           |                                  |rwtE          j#        |d@dAB          5 }|$                    dC          x}
r1| j                            |
           |$                    dC          x}
1d d d            n# 1 swxY w Y   tE          j%        |           n# tE          j%        |           w xY wd S t5          j        dE|          }|r>|r|                     dd%|           d S tO          t           |                    d&                    }|s|                     d-dF|           d S |\  }}}}	 |dGk    r-|                     d-dH|           tE          j%        |           d S |                     d           |                     ddG           |                     dt)          |                     |                     d8d;           |                     d d!           |                     d<d=           |                     d"d#           |                     dIdJ           |                     dKdL           |                     d>dM           |                                  |rwtE          j#        |d@dAB          5 }|$                    dC          x}
r1| j                            |
           |$                    dC          x}
1d d d            n# 1 swxY w Y   tE          j%        |           n# tE          j%        |           w xY wd S t5          j        dN|          }|rS|r|                     dd%|           d S tO          t           |                    d&                    }|s|                     d-dF|           d S |\  }}}}	 |                     d           |                     d|           |                     dt)          |                     dOd2d3d0d1d4d5dP                    |d7          }|                     d8dQ| d:           |                     d d!           |                     d<d=           |                     d"d#           |                     dIdR           |                     dKdL           |                     d>d?           |                                  |rwtE          j#        |d@dAB          5 }|$                    dC          x}
r1| j                            |
           |$                    dC          x}
1d d d            n# 1 swxY w Y   n%# t          $ r Y tE          j%        |           d S w xY wtE          j%        |           n# tE          j%        |           w xY wd S 	 tQ          t           ||tR                    }n# tT          $ r,}|                     |j+        |j,        |           Y d }~d S d }~wt          t          f$ r |                     dd|           Y d S tZ          $ r |                     dSdT|           Y d S w xY w|                      d||           d S )UNr  r  r~  rK   r9  r<  r=  r>  r  r  r?  r  r@  r  >   /api/v1/action-csrf/api/v1/capture/csrfrC  r"  r  ri  )rm  rR  Content-Typeapplication/json; charset=utf-8rB  r  rI  rJ  r  r  =#; Path=/; HttpOnly; SameSite=StrictrY  rZ  r  r  z4/api/v1/capture/status/([a-f0-9]{32})/([a-f0-9]{64})r  r3   rX  status_unavailabler/  zS/api/v1/capture/media/((?:img|vid)_[a-f0-9]{24})/(thumbnail|preview|proxy|original)	thumbnailr9  r8  media_not_availabler  heicheifjpgpngmovmp4)
image/heic
image/heifrw   rv   video/quicktimer?  binContent-Dispositionz,attachment; filename="health-media-original."inliner  r  r  r  rbF)closefdi   z=/api/v1/documents/(api-document-[a-f0-9]{24})/(preview|proxy)z>/api/v1/documents/(api-document-[a-f0-9]{24})/preview-originaloriginal_not_availableru   preview_not_availabler  
SAMEORIGINr  r  z3sandbox; default-src 'none'; frame-ancestors 'self'z6/api/v1/documents/(api-document-[a-f0-9]{24})/originalpdf)ru   rw   rv   r  r  r  r?  z/attachment; filename="health-document-original.r  rQ  internal_error).r<  r$  r   r   r   r   r#  r   r   rl  r   r  rf  rf  ry  rn  ro  r  ro  rp  r   r   r  rq  wfiler  r   r   r  groupr   r  rl  r  r   r  r   r   rF  r4  r   r  r   r/  r  r  )r'  r   rd  r)  r   bearer_authenticatedsession_authenticatedr\  r  capture_tokenr  cookie_namesecure_attributecapture_statusr/  media_route	requestedr  r   r0  r1  suffixr  document_mediainline_original	_filenamer  r  r  s                                r;   r  zHandler._handle_api'  su   >  &7CCCF	"$$EE& 	 	 	EEE	$D0  
5QL_b1156
 6
 !ALXr**!
 !
 =  &7CCCF# 	,A 	  &?KKKF!!(B//\%%&6;;
	1  ,,GDKFFGG 	 	 (/FFF  &:IFFFFBBB 1 $$ )CCc*/N&&5N  
 ,..M:}-*  fhh  s###^-NOOO-s3t99~~>>> 111 &%" 
 .KRzzPReeeeScee   _j9995yAAA '
  &&&F&]_cdd 
	 $$S*=yIII2>3G3G3J3JNL`L`abLcLcddZt7KL   $$S*>	JJJ h%7CCCFlbdh
 
  	 $$S*=yIII%0%6%6q%9%9[%H%H		kN_N_`aNbNbI'0A0A!0D0DiPPF $$S*?KKK%+"Jd%""3'''  666  !13t99===
**+1vSXej  ~C  PU  V  V  Z  Z  [_  `e  f  fF$$%:<tkq<t<t<tuuuu$$%:HEEE  *===  :666  !99EEE  !:<hiii  """ 3:tUCCC 3v&,kk)&<&<<d 3 J,,T222 '-kk)&<&<<d 33 3 3 3 3 3 3 3 3 3 3 3 3 3 3 $$$$$$$$FLd
 
  	 R$$S*=yIII66(1E1Ea1H1H.J^J^_`JaJabbF T$$S*?KKKVV%+"Jd%""3''')9)9.$)O)O)OQUQaQabrtwx|t}t}Q~Q~Q~  !6AAA4CSCSTceoCpCpCprv  sC  sC  DL  NX  sY  sY  sY  !99EEEtGWGWXq  t`  Ha  Ha  Ha  cg  cs  cs  cu  cu  cu U:tUCCC Uv&,kk)&<&<<dTdj>N>Nt>T>T>Tfkk)&<&<<dTU U U U U U U U U U U U U U U $$$$$$$$F,Mt
 
  	 R$$S*=yIII66%f_-B-B1-E-EFFF T$$S)A)LLLVV+1*JtD	)***((-DYOOO HZ((((( ""3'''(8(8HY(Z(Z(Z[_[k[kl|  ~A  BF  ~G  ~G  \H  \H  \H  IM  IY  IY  Zo  px  Iy  Iy  Iy  <<<T=M=MhWa=b=b=bcgcscs  uM  NW  dX  dX  dX  Y]  Yi  Yi  j{  |H  YI  YI  YI  JN  JZ  JZ  [l  mz  J{  J{  J{  !:;pqqqrv  sC  sC  sE  sE  sE P:d5AAA PV$*KK$8$88dO9I9I$9O9O9OFKK$8$88dOP P P P P P P P P P P P P P PHZ((((BHZ((((F<Et
 
  !	 $$S*=yIII'q0A0ABBF $$S*BINNN06-JdI%""3'''  666  !13t99===,1uQVdjx~  RW  di  j  j  n  n  os  ty  z  z  !68sjp8s8s8sttt  *===  :666  !99EEE  !2F;;;  !2MBBB  -@     """ 3:tUCCC 3v&,kk)&<&<<d 3 J,,T222 '-kk)&<&<<d 33 3 3 3 3 3 3 3 3 3 3 3 3 3 3    $$$$$ $$$$$$$$F
	"648IJJGG 	 	 	  uz9EEEFFFFF& 	 	 	  &7CCCFF 	 	 	  &6	BBBFF	 	C)44444s1  1 AA?6L6 69M32M3?D'W &A	V;/W ;V??W V?W W1C)_% 0A	_9_% _		_% _	_% %_;>h; 1Dh; A	hh; hh; "h#h; ;iD7q, A	q q,  q$$q, 'q$(q, +r& ,
r6r& rr& &r<s 
u")!t+u"> u"!u"r/  c                <    |                      |dd|ii|           d S )Nr  r  )rl  )r'  r/  r  r)  s       r;   r$  zHandler._send_api_error  s)    FWvtn$=yIIIIIr=   r  r   c                   	 t          j        |dddd                              d          }n!# t          t          t
          f$ r d}d}Y nw xY wt          |          t          k    rd}d	}|                     |           | 	                    d
d           | 	                    dt          t          |                               | 	                    dd           | 	                    dd           | 	                    dd           | 	                    dd           | 	                    dd           | 	                    dd           | 	                    dd           |dk    r| 	                    dd           t          r| 	                    dt                     |                                  |r5	 | j                            |           d S # t          t           f$ r Y d S w xY wd S )NFTri  )rk  	allow_nanrl  rm  r   rQ  s#   {"error":{"code":"internal_error"}}r  s'   {"error":{"code":"response_too_large"}}r  r  rB  rY  rZ  r  r  r  r  r  r  r  r  Permissions-Policy(camera=(), microphone=(), geolocation=()r  r  r<  r  z#Bearer realm="health-dashboard-api"X-Health-Synthetic-Instance)rn  ro  r  	TypeErrorr   OverflowErrorr   MAX_API_RESPONSE_BYTESro  rp  r   TEST_INSTANCE_IDrq  r  r  BrokenPipeErrorConnectionResetError)r'  r/  r  r)  r  s        r;   rl  zHandler._send_api_json  s<   
	::"%   fWoo D :}5 	: 	: 	:F9DDD	: t99---F=D6""")JKKK)3s4yy>>:::*555:...19===*F333*M::: "L	
 	
 	
 	%'S	
 	
 	
 S==/1VWWW 	N:<LMMM 	
  &&&&&#%9:   	 	s!   ,/ AA6G G'&G'r   r  r  c                   	 |                                 }n&# t          $ r |                     d           Y d S w xY w|p(t          j        t          |                    d         pd}|                     ||||           d S )Nr8  r   r  )
read_bytesr   r&  	mimetypes
guess_typer   r  )r'  r   r  r  r)  r  r1  s          r;   r  zHandler._serve_file  s    	??$$DD 	 	 	OOC   FF	  *#CII..q1*) 	
 	xy99999s    ::Fr  r  bytesr  r  r  r  c               P   |                      d           |                     d|           |                     dt          t          |                               |                     dd           |                     dd           |                     dd	           |                     d
d           |                     dd           t          r|                     dt                     |r(|rdnd}	d| d| d|	 d}
|                     d|
           |r|                     dd| d           |r|                     dd| d           |                     ddt          |                      |                                  |r| j                            |           d S d S )NrR  r  rB  rY  rZ  r  r  r  r  r  zstrict-originr  r  r  z'self'z'none'z-default-src 'none'; script-src 'self' 'nonce-z'; style-src 'self' 'nonce-z6'; img-src 'self' data:; font-src 'self'; connect-src zP; object-src 'none'; base-uri 'none'; frame-ancestors 'none'; form-action 'self'r  r  zhealth_csrf=r  zhealth_browser_csrf=z); Path=/api/v1; HttpOnly; SameSite=Strictr  zinline; filename*=UTF-8'')	ro  rp  r   r   r  r   rq  r  r  )r'  r  r  r  r)  r  r  r  r  connect_sourcepolicys              r;   r  zHandler._send_bytes.  s2    	3666)3s4yy>>:::*55519===*F333*O<<< "L	
 	
 	
  	N:<LMMM 
	@)5CXX8Na,1a a+0a a  .	a a a  6??? 	NzNNN   & 	l'Alll   	!#PuX#P#P	
 	
 	
 	 	#JT"""""	# 	#r=   formatargsr   c                    d S rH  r   )r'  r  r  s      r;   log_messagezHandler.log_messageb  s    r=   )NN)r  r   r  r   r  r   r   r  r   r  )r   r   )r)  r   r   r  )r   r   rd  r   r)  r   r   r  )r/  r   r  r   r)  r   r   r  )r/  r   r  r   r)  r   r   r  )
r   r   r  r   r  r   r)  r   r   r  )r  r  r  r   r  r   r)  r   r  r   r  r   r  r   r  r   r   r  )r  r   r  r   r   r  )r~   r   r   r&  r/  
do_OPTIONSdo_PUT	do_DELETEdo_PATCHdo_TRACE
do_CONNECTr4  r6  r|  r  r  r3  r[  r]  r_  r  r$  rl  r  r  r
  __classcell__)r+  s   @r;   r  r    s        #"	3 3 3 3 3 3 3$
 
 
 
 %J F#I"H"H$J& & & &% % % %Y Y Y Yv

 

 

 

   P P P Pd< < < <|-D -D -D -D^HU HU HU HUTE5 E5 E5 E5NJ J J J( ( ( (T: : : :4 !!%15"2# 2# 2# 2# 2# 2#h       r=   r  __main__zhealth dashboard file missingr@   zlocal Chart.js asset missingz$local media decoder self-test failed)r   r   r   r   )r   r   )r   r   r   r   r   r   rH  )r   r   r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r  r   r   r   r   r   )r"  r   r#  r   r   r$  )r"  r   r#  r   r5  r   r   r6  )r	  r   r   r   )rK  r   r   r   )rK  r   r   r   )r\  r   rK  r   r]  r^  r   r   )r   rm  r   r   )r   r   r   rm  r   r   )r   r   r  r   r   r  )r   r   )r  r  r   r  )r  r  r   r  )r:   r   rE  r   r  r   r   r   )r:   r   r   r   )r:   r   r   r  )r  r  r   r  )r  r  r  r   r   r  )r  r  r   r  )r  rg  r   r   )ru  r   rv  r   r   r   )ru  r   r|  r   r   r   )r"  r   r  r   r5  r   r   r6  )r"  r   r  r   r   r  r  )r  r   r   r  )r  r   r   r   )r  r   r   r   )r  r  r   r  )r  r   r  r  r  r   r   r   )r  r  r   r  )r   
__future__r   r   r   rp  ry  rn  r  r   r   r   r  r   	threadingr   r   r   r   http.cookiesr   r   http.serverr	   r
   pathlibr   typingr   urllib.parser   r   r   r   zoneinfor   dashboard_v5.read_apir   r   r   r   dashboard_v5.document_originalsr   r    dashboard_v5.supplement_contractr   !dashboard_v5.observation_contractr   r  dashboard_v5.capture_contractr   dashboard_v5.medication_schemar   rj   dashboard_v5.medication_contractr   ri  r   dashboard_v5.capture_mediar   r  r   dashboard_v5.media_validationr    dashboard_v5.document_reviewr!   r"   r#   r   r   r-  r   r   r<  r  r   r  r  r   r  	BIND_HOSTr   	BIND_PORTr6   r7   ra  rk  rf  r  rZ  rn  rm  r  r`  ra  r9  r:  r;  r7  rb  rc  r\  r^  rd  re  r  r  r  r  rB  r  r   r   r   maxrw  r   r  r   r   r  rZ  r[  r\  r]  r^  rq  r  r  r  r  ORIGINAL_MIME_MAGICr.  rx   __annotations__Lockrv  ry   r  rz   r   r  r   r|   r   r   r   r   r   r   r   r   r   r  r!  r4  rF  rJ  rX  r[  rl  ry  r  r  r  r  r  r  r  r  r  r  r  rC  rf  rt  r{  r  r  r  r  r  r  r  r  r  r  r  r~   r   
SystemExitr  r  serve_foreverr   r=   r;   <module>r.     sm   N N N " " " " " "          				 				         . . . . . . . . . . 2 2 2 2 2 2 2 2 C C C C C C C C             ; ; ; ; ; ; ; ; ; ; ; ;                  V U U U U U U U H H H H H H \ \ \ \ \ \ B B B B B B T T T T T T        g f f f f f f f A A A A A A a a a a a a a a a a ty{{Y)L8 
z~~+,,DD)	*++33555	 
 


bj!89::BBDD 
z~~011DD.	/0088:::	 
 DJNN$D9x'/9::  
 
')) 
 JNN2K@@	C
6??@@	*..!:FCCIIKKQQSS+++
,F
G
GGBJNN#A33y>>RRSSM""""U""""
,Q
R
RR (*? eCjj	   	!>% (>
 % '> / 1> + ->" 3 5#>* 2 4+>2 2 43>: 2 4;>B - /C>J 4 6K>R , .S>Z - /[>b &'Vc>d * ,e>l 0 2m>t 7 9u>~ 2= 5 ; 5 ; 1 9 / 2 )? tJNN'D92233  
 
'))  JNN(##d_.Dy.P*Q*Q   
'))	  TJNN-D93344  
 
'))  dJNN.D94455  
 
'))  4JNN+D?"[011  
 
'))  :>>"ErJJPPRR  
z~~788DD5	677BBDDD	  
z~~<==DD:	;<<GGIII	 
 "cCC
EuMMNNPTUU   JNNCDDK   ^2<.0@AA HlFGGG&&ttF||';';'='=>> 
lI
 
 	
 ,,TT&\\-A-A-C-CDD UlSTTT''V(<(<(>(>?? PlNOOO--dd6ll.B.B.D.DEE ^l\]]]S	 	 	  100... YYY    3CC
:EBBCCTJJ       8O,, css33rz~~DdKKLLcRR   &  
 +*,,!# # # # #Y^
$& & & & &$in&& &(  ( ( ( (&	(( y~P P P P PW P P PT T T T T| T T T      2   2S S S S ;?    .      (   0   &   :I I I I8"_ "_ "_ "_J   	6 	6 	6 	66 6 6 6 <@    @    $U U U U U    $     !O O O O O O*1 1 1 11 1 1 1,) ) ) )" EJ      
0 
0 
0 
0   6 6 6 6BdA dA dA dANk k k k\A A A A
      <&. &. &. &.R6 6 6 6" " " "      <( ( ( (V%: %: %: %:P	 	 	 	3@ 3@ 3@ 3@lm m m m m$ m m m` z!!## :j8999**3355 9j7888J!!!! J J Jj?@@cIJI.88FFHHHHH s   6
d ddd