
    Q[j_                       d Z ddlmZ ddlZddlZddlmZ ddl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 dd	lmZ dd
lmZmZ ddlmZ  ej2                         dz  dz  dz  Zedz  Z ed      ZdZh dZh dZh dZ i e D  ci c]  } | d c} dddddddddddd d!Z! ed"#       G d$ d%             Z" ed"#       G d& d'             Z# ed"#       G d( d)             Z$dCd*Z%dDd+Z&dEdFd,Z'dGd-Z(dHd.Z)dId/Z*dId0Z+dJd1Z,dKd2Z-	 	 	 dL	 	 	 	 	 	 	 dMd3Z.dEdNd4Z/	 	 	 	 	 	 	 	 dOd5Z0dPd6Z1	 	 	 dL	 	 	 	 	 	 	 	 	 dQd7Z2dRd8Z3dRd9Z4	 	 	 	 	 	 dS	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dTd:Z5	 	 	 	 dU	 	 	 	 	 	 	 	 	 	 	 dVd;Z6dddd"ddd<	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dWd=Z7dEdXd>Z8dYd?Z9e:d@k(  r%ddl;Z; e< e;jz                   e9       dAdB             yyc c} w )Za*  Canonical Apple Health Analytics v2 for JARVIS reports.

The raw ``apple_health_records`` table remains an immutable audit trail. This
module provides the only supported aggregation layer for dashboards/reports:

- exact observations duplicated across overlapping exports are deduplicated;
- fine-grained exports supersede coarse weekly/monthly fallback rows;
- one deterministic source class is selected per metric/day to avoid summing
  overlapping Watch/phone/app observations;
- aware timestamps are converted to Europe/Zurich and naive timestamps are
  explicitly treated as local Europe/Zurich time;
- metric-specific sum/average/last semantics and unit normalization apply;
- current-day values are provisional and excluded by default;
- coverage summaries expose counts/quality only, never raw values.
    )annotationsN)ceil)Counterdefaultdict)	dataclass)datedatetime	timedeltatimezone)Path)mean)AnyIterable)ZoneInfoz.hermesassets
Gesundheitzhealth_data.dbzEurope/Zurich   >   fiberprotein	total_fat
step_countactive_energycarbohydratesdietary_sugardietary_watersaturated_fatdietary_energysleep_analysisflights_climbedapple_stand_timeapple_exercise_timebasal_energy_burnedmonounsaturated_fatpolyunsaturated_fatwalking_running_distance>   blood_pressurebody_mass_indexweight_body_mass>   r   r   r"   kcalkmkgmLhrminbpmmscount%breaths/min   kg/m²)r%   r(   r   r   r!   r    resting_heart_rateheart_rate_variabilityr   blood_oxygen_saturationrespiratory_rater'   T)frozenc                  4    e Zd ZU ded<   dZded<   dZded<   y)	
MetricSpecstraggregationN
str | Nonecanonical_unit   intexpected_cadence_days)__name__
__module____qualname____annotations__r?   rB        G/home/agent/.hermes/assets/Gesundheit/scripts/apple_health_analytics.pyr;   r;   N   s    !%NJ%!"3"rH   r;   c                  r    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   y)
DailyPointfloatvaluer<   unitqualitysource_classtimezone_assumptionrA   selected_recordsdeduplicated_recordsdiscarded_overlap_recordsdiscarded_source_recordsdiscarded_unit_recordsNrC   rD   rE   rF   rG   rH   rI   rK   rK   U   s;    L
IL""!!rH   rK   c                  r    e Zd ZU ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   y)_Observationsqlite3.Rowrowr	   	timestampr<   	local_dayrL   rM   rN   rP   rA   source_rankcoarse_factorduplicate_countrQ   NrW   rG   rH   rI   rY   rY   c   s;    	NL
IrH   rY   c                 b    t        j                  t              } t         j                  | _        | S N)sqlite3connectDBRowrow_factory)
connections    rI   connri   q   s"    $J$[[JrH   c                    	 | y t        t        |       j                  dd      j                               S # t        t
        f$ r Y y w xY w)N,.)rL   r<   replacestrip	TypeError
ValueError)rM   s    rI   fnumrq   w   sK    =SZ''S1779::z" s   7 17 A	A	c                    ||}n| t         v rd}n| t        v rd}nd}|dvrt        d|       t        j	                  |       }| t        v rdnd}t        |||      S )	Nsumlastavg>   ru   rs   rt   zUnsupported aggregation mode:    r@   )r=   r?   rB   )SUM_METRICSLAST_METRICSrp   CANONICAL_UNITSgetr;   )metricmoder=   r?   rB   s        rI   metric_specr}      s}    	;		<	009+GHH$((0N!'<!7AQ%3 rH   c                "   t        | xs d      j                         }|sy	 t        j                  |j	                  dd            }|j                  |j	                  t              dfS |j                  t              dfS # t
        $ r Y yw xY w)	N )NmissingZz+00:00)Nunparseabletzinfonaive_assumed_europe_zurich&timezone_aware_converted_europe_zurich)	r<   rn   r	   fromisoformatrm   rp   r   LOCAL_TZ
astimezone)rM   textparseds      rI   _parse_timestampr      s    u{!!#D#''S((CD }}~~X~.0MMMX&(PPP	  #"#s   %B 	BBc                (   t        | xs d      j                  dd      j                         }t        j                  dd|      j                         dv rddfS dv rdd	fS d
v sdv rddfS t        fddD              rddfS rddfS y)Nr        z\s+|	compositer   watchr@   iphonephoner   c              3  &   K   | ]  }|v  
 y wrb   rG   ).0token
normalizeds     rI   	<genexpr>z_source_info.<locals>.<genexpr>   s     
O55J
O   )healthu   santé
gesundheit
health_app   app   )z	<unknown>unknown   )r<   rm   rn   resubcasefoldany)sourcerawr   s     @rI   _source_infor      s    
fl

#
#Hc
2
8
8
:CS)224J
j;))*7A%%:J!67A%%

O,N
OO<**5!##$rH   c                   t        |xs d      j                         }|j                         j                  dd      }| t        v r|dk(  r|dz  dfS |dk(  r|dfS | dk(  r|dv r|dz  d	fS |d
v r|dz  d	fS |dv r|d	fS | dk(  r|dv r|dz  dfS |dv r|dz  dfS |dv r|dfS | dk(  r|dv r|dz  dfS |dv r|dfS | dk(  r|dv r|dz  dfS |dv r|dz  dfS |dv r|dfS | dv r|dv r|dz  dfS |dv r|dz  dfS |dv r|dfS | d k(  r|d!v r|d"fS | d#k(  r|d$v r|d%fS | d&k(  r|d'v r|d(fS | d)k(  r|d*v r|d+fS | d,k(  r|d-v r|d.fS | d/k(  r|d0v r|d1fS | d2k(  r|d3v r|d4fS ||fS )5Nr   r   kjg#~j@r)   r%   >   mmetermetrei  r*   >   mimilemilesg8~߿?>   r*   	kilometer	kilometrer(   >   ggramgramsr+   >   lblbspoundpoundsgQ^J?>   r+   kilogram	kilogramsr   >   lliterlitrer,   >   ml
milliliter
millilitrer   >   ssecsecondsecondsi  r-   >   r.   minuteminutes<   >   hr-   hourhours>   r    r!   r.   r5   >   r/   	count/min
counts/minr/   r6   >   r0   millisecondmillisecondsr0   r   >   r1   countsr1   r7   >   percentr2   r2   r8   >   
breath/minr   r   r3   r3   physical_effort>      kcal/hr·kg
kcal/hr/kg	kcal/h/kgr   r'   >   kg/m2r1   r4   r4   )r<   rn   r   rm   ENERGY_METRICS)r{   rM   rN   raw_unitnormalized_units        rI   _normalize_valuer      s   4:2$$&H'')11#r:Od"5=&((f$&= ++554<%%558#T))>>$;##444<%%>>:%t++==$; 554<%%@@$;!!??4<%%::2:t##::$;<<??2:u$$::2:u$$::%<%%/ > + e|))oAf.fd{/5H"Hg~**BR/Rcz## < ) m##"" ; ( k!!"":V'Vh(?rH   c                    t        | ||      S )zLReturn the canonical value/unit pair used by Analytics v2 and API contracts.)r   )r{   rM   rN   s      rI   normalize_valuer      s    FE400rH   c                   t        | d         \  }}t        | d         \  }}t        | d         }t        t        | d         |xs d| d         \  }}t	        | d         \  }}}| d   ||r-|j                  t        j                        j                         nt        | d   xs d      |r-|j                  t        j                        j                         nt        | d   xs d      |j                         fS )	N
start_dateend_daterM   r{           rN   source_namer   )
r   rq   r   r<   r   r   r   utc	isoformatr   )r[   start_end	raw_valuer?   rP   s          rI   _row_keyr      s    L 12HE1c*o.FCS\"I(S]);Y=M#sSY{[A~%c-&89A|QH6;&002SEVE\Z\A]47x||$..0SZAVTV=W! rH   c                |    t        | d         }t        t        | d         |xs d| d         \  }}t        |d      S )NrM   r{   r   rN      )rq   r   r<   round)r[   r   canonical_valuer   s       rI   _canonical_value_keyr     sE    S\"I)#c(m*<i>N3PSTZP[\OQ"%%rH   c                :   t               }	 d}g }| r|dz  }|j                  |        |r|dz  }|j                  |       |r|dz  }|j                  |       |dz  }t        |j                  ||            |j	                          S # |j	                          w xY w)NzSELECT id,metric,value,unit,start_date,end_date,source_name,file_name,file_hash
                 FROM apple_health_records WHERE value IS NOT NULL AND start_date IS NOT NULLz AND metric=?z AND substr(start_date,1,10)>=?z AND substr(start_date,1,10)<=?z7 ORDER BY metric, start_date, end_date, source_name, id)ri   appendlistexecuteclose)r{   r   r   rh   sqlparamss         rI   
_load_rowsr     s    
 Ja?"CMM&!44CMM*%44CMM(#HHJ&&sF34
s   A+B Bc           	        | At        |       }| t        v rt        ||       ni }t        | ||      D cg c]  \  }}|	 c}}S t	        t
              }t               D ]"  }|t        |d            j                  |       $ g }|j                         D ]>  \  }}|t        v rt        ||      ni }|j                  d t        |||      D               @ |S c c}}w )zReturn one canonical row per exact observation key.

    For sum metrics, direct-resolution rows win over coarse grouped-export rows
    even when the coarse export was imported later.
    r{   c              3  &   K   | ]	  \  }}|  y wrb   rG   )r   r[   r   s      rI   r   z$canonical_records.<locals>.<genexpr>4  s     ZaZ   )
r   rw   _coarse_factors_deduplicated_rowsr   r   r<   r   itemsextend)r{   rowsfactorsr[   r   rows_by_metric	canonicalmetric_names           rI   canonical_recordsr  $  s     &!39[3H/$/b"4VT7"KLQLL3>t3DN| 7s3x=)*11#67#%I+113 [T8C{8R/$4XZZ+=k4QX+YZZ[  Ms   Cc                    t        t              }|D ]  }|t        |         j                  |       ! g }|j	                         D ]  }t        t              }|D ](  }t        |d         \  }}	}	||   j                  |       * g }
|j	                         D ]2  }t        | fd      }|
j                  |t        |      dz
  f       4 t        t              }|
D ]$  \  }}|t        |         j                  ||f       & |j	                         D ]J  }t        | fd      \  }}	t        d |D              t        |      z   dz
  }|j                  ||f       L  |S )Nr   c                x    j                  t        | d   xs	 | d   xs d      fd      t        | d          fS )N	file_hash	file_namer   r@   idrz   r<   rA   )r[   coarse_factorsr{   s    rI   <lambda>z$_deduplicated_rows.<locals>.<lambda>L  sH    "&&C,<,VK@P,VTV(WY_'`bcdT^O! rH   keyr@   c                    j                  t        | d   d   xs | d   d   xs d      fd      t        | d   d          fS )Nr   r  r  r   r@   r	  r
  )itemr  r{   s    rI   r  z$_deduplicated_rows.<locals>.<lambda>[  sZ    "&&T!W[1OT!W[5IORPRXY a''" rH   c              3  &   K   | ]	  \  }}|  y wrb   rG   )r   r   r1   s      rI   r   z%_deduplicated_rows.<locals>.<genexpr>c  s     !CHAu%!Cr   )
r   r   r   r   valuesr   r.   lenr   rs   )r{   r   r  groupsr[   result
group_rowsby_exact_source
source_keyr   source_selectedsource_rowsselectedby_valuer`   
value_rowss   ` `             rI   r   r   8  s   
 8C47HF *x}$$S)*Fmmo #7
 9DD8I 	4C+C,>?J1J'..s3	4 :<*113 	EKH ""Hc+.>.B#CD	E @K4?P)8 	Y%Ho)(34;;X<WX	Y"//+ 	7J	KHa "!C
!CCc*oUXYYOMM8_56	7/#7H MrH   c                (   i }| D ]  }t        |d   xs	 |d   xs d      }||f}t        |d   xs d      j                         t        fddD              rd||<   Zt        fddD              st        j                  d	      sd
||<    |S )ak  Return deterministic factors for explicitly grouped export files.

    Historical ``jahr-/year-YYYY`` exports in this project contain weekly
    aggregates. Explicit weekly/monthly names remain classifiable even when an
    interrupted export contains only one or two rows. Dated daily export names
    such as ``jahr-YYYY-MM-DD`` intentionally do not match.
    r  r  r   c              3  &   K   | ]  }|v  
 y wrb   rG   r   r   r  s     rI   r   z"_coarse_factors.<locals>.<genexpr>u  s     Deu	!Dr   )monthlymonat   c              3  &   K   | ]  }|v  
 y wrb   rG   r   s     rI   r   z"_coarse_factors.<locals>.<genexpr>x  s     Nu"Nr   )weeklywocheannualz (?:jahr|year)[-_ ]?\d{4}(?:\.|$)rv   )r<   r   r   r   search)r   r{   r   r[   file_keyr  r  s         @rI   r   r   h  s     +-G 
s;'A3{+;ArB K(.B/88:	D/CDDGCLN0MNNyy<iHGCL
 NrH   c                   |t        |      nt        | ||      }| t        v rt        ||       ni }t	        | ||      }g }|D ]  \  }}	t        |d         \  }
}t        |d         }|
|*t        | ||d         \  }}t        |d         \  }}}t        |d   xs	 |d   xs d      }|j                  t        ||
|
j                         j                         |||||j                  || fd	      |	|

              |S )N)r   r   r   rM   rN   r   r  r  r   r@   )
r[   r\   r]   rM   rN   rP   r^   r_   r`   rQ   )r   r   rw   r   r   r   rq   r   r   r<   r   rY   r   r   rz   )r{   r   r   r   raw_rowsr  deduplicatedobservationsr[   r`   r\   rQ   r   rM   rN   r   rP   r^   r)  s                      rI   _observationsr.    s5    "-tDz:fQ[fn3oH:@K:O_Xv6UWN%fhGL')L , 
_)9#l:K)L&	&W&		 1&vy#f+Ft'3C4F'G$<s;'A3{+;ArB##..*446)',00(F1CQG /$7	

, rH   c                    t        t              | D ]   }|j                     j                  |       " t	        fd      }|   }|t        |       t        |      z
  fS )Nc                N    t        d |    D              t        |           | fS )Nc              3  4   K   | ]  }|j                     y wrb   )r^   r   r  s     rI   r   z3_select_source.<locals>.<lambda>.<locals>.<genexpr>  s     <T  <   )r.   r  )r  	by_sources    rI   r  z _select_source.<locals>.<lambda>  s.    <Ys^<<3  
 rH   r  )r   r   rP   r   r.   r  )r-  observationselected_keyr  r4  s       @rI   _select_sourcer7    sn    /:4/@I# @+**+22;?@
L &HS&X666rH   c                    t        d | D              t        fd      }| D cg c]  }|j                  |k(  s| }}|t        |       t        |      z
  fS c c}w )Nc              3  4   K   | ]  }|j                     y wrb   )rN   r2  s     rI   r   z_select_unit.<locals>.<genexpr>  s     84TYY8r3  c                    |     | fS rb   rG   )rN   r   s    rI   r  z_select_unit.<locals>.<lambda>  s    6$<-1F rH   r  )r   r.   rN   r  )r-  selected_unitr  r  r   s       @rI   _select_unitr<    s]    8<88F$FGM!-Lm1KLHLS&X666 Ms
   AAc                   t        | |      }|xs t        j                  t              }|j                  |j                  t              }n|j                  t              }|j                         j                         }	t        t              }
t        | |||      D ]V  }|r|j                  |	k\  r|r|j                  |k  r'|r|j                  |kD  r9|
|j                     j                  |       X i }t        |
j                               D ]]  \  }}|D cg c]  }|j                   dk(  s| }}|r|}t#        |      t#        |      z
  }d}n|}d}d}t%        |      \  }}t'        |      \  }}|D cg c]  }|j(                  |j                   z   }}|s|j*                  dk(  rt-        |      }|}nG|j*                  dk(  r+t/        |d	 
      }|j(                  |j                   z  }|g}nt1        |      }|}t3        d |D              rdnd}t5        t7        |d      |d   j8                  ||d   j:                  |t#        |      t-        d |D              |||
      ||<   ` |S c c}w c c}w )Nr   )r   r   r   r@   directr   coarse_fallbackrs   rt   c                    | j                   S rb   )r\   )r  s    rI   r  zdaily_points.<locals>.<lambda>  s
     rH   r  c              3  :   K   | ]  }|j                   d k(    yw)r   N)rQ   r2  s     rI   r   zdaily_points.<locals>.<genexpr>  s     `QU4++/LL`   r   r   r   c              3  4   K   | ]  }|j                     y wrb   )r`   r2  s     rI   r   zdaily_points.<locals>.<genexpr>  s     $WdT%9%9$Wr3  )
rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   )r}   r	   nowr   r   rm   r   r   r   r   r   r.  r]   r   sortedr   r_   r  r7  r<  rM   r=   rs   maxr   r   rK   r   rN   rP   )r{   r|   stable_onlyrD  r   r   _rowsspec	local_nowcurrent_dayby_dayr5  r  dayall_observationsr  r>  resolution_selecteddiscarded_overlaprO   r  discarded_sourceunit_selecteddiscarded_unitadjustedrM   chosenlatestrQ   s                                rI   daily_pointsrW    s    vt$D-x||H-I%%X%6	((2	..",,.K,7,=F$V
X\ab :;00K?+//*<--8{$$%,,[9: %'F!'!7 +
#3O4t7I7IQ7N$OO"( #$4 5F CG"2 !'G,:;N,O))(4_(E%~@MNDJJ!3!33NNu$ME"F',GHFLL6#7#77EXFNE"F `Y_`` *9 	
 !q/// 3 [!$$WFV$W!W&7%5#1
sA+
X MW P Os   I52I5< I:c                    t        | ||||      j                         D ci c]  \  }}||j                   c}}S c c}}w )z?Backward-compatible day -> value view over Analytics v2 points.)r|   rG  rD  rH  )rW  r   rM   )r{   r|   rG  rD  rH  rM  points          rI   daily_seriesrZ    sN     '#
 %'	C 	U[[	 	 	s   =)r   r   r|   rG  rD  rH  c          	        |r0t        j                  |      t        d      z
  j                         nd }|r0t        j                  |      t        d      z   j                         nd }t	        | ||||||      }	|	j                         D 
ci c]  \  }
}t        j                  |
      | }}
}t        |      }|rt        j                  |      }n
|r|d   }nd }|rt        j                  |      }n
|r|d   }nd }||||k  rd}i }nD||z
  j                  dz   }|j                         D 
ci c]  \  }
}||
cxk  r|k  sn n|
| }}
}t        |      }t        ||z
  d      }t        | |      }|rt        ||j                  z        nd}t        ||z
  d      }i dt        d| d|j                  d	|j                  d
|d|d|d|d|d|rt        t!        ||z  d      d      nddt#        d |j%                         D              dt#        d |j%                         D              dt#        d |j%                         D              dt#        d |j%                         D              dt#        d |j%                         D              dt#        d |j%                         D              S c c}}
w c c}}
w )Nr@   )days)r|   rG  rD  r   r   rH  r   analytics_versionr{   r=   rB   expected_daysexpected_observationsobserved_daysmissing_daysmissing_observationscoverage_ratiog      ?r   r   direct_daysc              3  :   K   | ]  }|j                   d k(    yw)r>  NrO   r   rY  s     rI   r   z#coverage_summary.<locals>.<genexpr>Q  s     Y5==H4YrB  coarse_fallback_daysc              3  :   K   | ]  }|j                   d k(    yw)r?  Nrg  rh  s     rI   r   z#coverage_summary.<locals>.<genexpr>R  s     #k5EMM5F$F#krB  days_with_source_conflictc              3  :   K   | ]  }|j                   d kD    ywr   N)rU   rh  s     rI   r   z#coverage_summary.<locals>.<genexpr>S  s     (pPU)G)G!)K(prB  days_with_unit_conflictc              3  :   K   | ]  }|j                   d kD    ywrm  )rV   rh  s     rI   r   z#coverage_summary.<locals>.<genexpr>T  s     &lEu'C'Ca'G&lrB  rS   c              3  4   K   | ]  }|j                     y wrb   )rS   rh  s     rI   r   z#coverage_summary.<locals>.<genexpr>U  s     #c5E$>$>#cr3  rT   c              3  4   K   | ]  }|j                     y wrb   )rT   rh  s     rI   r   z#coverage_summary.<locals>.<genexpr>V  s     (mU)H)H(mr3  )r   r   r
   r   rW  r   rE  r\  r  rF  r}   r   rB   ANALYTICS_VERSIONr=   r   r.   rs   r  )r{   r   r   r|   rG  rD  rH  query_start	query_endpointsrM  rY  dated_pointsobserved_datesr   r   r_  window_pointsra  rb  rI  r`  rc  s                          rI   coverage_summaryry    s&    Wa4%%j1I14EEPPRfjKRZ##H-	q0AALLN`dIF FL\\^TzsED&&s+U2TLTL)N"":.	q!  *	R }sU{02u**Q.6B6H6H6Jb
UeWZNa^aNaebb&M}}4a8Lvt$DP]D1K1K!KLcd4}DaH.& 	t'' 	 !;!;	
 	 	 !6 	 	 	 4 	Wl%M4I$I3 OQRSru 	sY-BVBVBXYY 	#kTaThThTj#k k 	$S(pYfYmYmYo(p%p 	"3&lUbUiUiUk&l#l 	#cML`L`Lb#c c  	$S(mVcVjVjVl(m%m! 3 U& cs    J<3KKc                    t               }|j                  r|j                  }n|,t         fd|D              rt        fd      d   nd}nRt	               }	 |j                  d f      j                         }|j                          |rt        |d   xs d      nd}|j                  dk(  r|d	z   j                         S |S # |j                          w xY w)
Nc              3  d   K   | ]'  }t        |d          k(  rt        |d   xs d       ) yw)r{   rN   r   N)r<   )r   r[   r{   s     rI   r   zunit_for.<locals>.<genexpr>_  s8      
3x=!V+ F!r"
s   -0c                    |     | fS rb   rG   )rM   unit_countss    rI   r  zunit_for.<locals>.<lambda>d  s    {57I6I55Q rH   r  r   r   zfSELECT unit, count(*) n FROM apple_health_records WHERE metric=? GROUP BY unit ORDER BY n DESC LIMIT 1rN   rs   z / Tag*)r}   r?   r   rE  ri   r   fetchoner   r<   r=   rn   )r{   rH  rI  rN   rh   r[   r}  s   `     @rI   unit_forr  Z  s    vD""		 

 

 Zevk'QRSTUjlV
	$$x	 hj 
 ),s3v;$"%"5 y ''))K	 s    !C Cc                    t               } t        t              }| D ]"  }|t        |d            j	                  |       $ t        |      }d}|j                         D ]4  \  }}|t        v rt        ||      ni }|t        t        |||            z  }6 t        t        |       |t        |      |D ci c]  }|t        |||          c}dS c c}w )Nr{   r   )rH  )r^  raw_recordsr  metric_countrO   )r   r   r   r<   r   rE  r   rw   r   r  r   rr  ry  )all_rowsr  r[   metricscanonical_countr{   r   r   s           rI   summaryr  t  s    |H3>t3DN 7s3x=)*11#67^$GO&,,. J39[3H/$/b31&$HIIJ /8},GahiW]F,V>&;QRRi 
 js   3C__main__F)ensure_asciiindent)returnzsqlite3.Connection)rM   r   r  zfloat | Nonerb   )r{   r<   r|   r>   r  r;   )rM   r   r  ztuple[datetime | None, str])r   r   r  ztuple[str, str, int])r{   r<   rM   rL   rN   r   r  ztuple[float, str])r[   rZ   r  ztuple[Any, ...])r[   rZ   r  rL   )NNN)r{   r>   r   r>   r   r>   r  list[sqlite3.Row])r{   r>   r  r  )r{   r<   r   r  r  dict[tuple[str, str], int]r  zlist[tuple[sqlite3.Row, int]])r   zIterable[sqlite3.Row]r{   r<   r  r  )
r{   r<   r   r>   r   r>   r   Iterable[sqlite3.Row] | Noner  list[_Observation])r-  r  r  ztuple[list[_Observation], int])NTNNNN)r{   r<   r|   r>   rG  boolrD  datetime | Noner   r>   r   r>   rH  r  r  zdict[str, DailyPoint])NTNN)r{   r<   r|   r>   rG  r  rD  r  rH  r  r  zdict[str, float])r{   r<   r   r>   r   r>   r|   r>   rG  r  rD  r  rH  r  r  dict[str, Any])r{   r<   rH  r  r  r<   )r  r  )>__doc__
__future__r   r   rc   mathr   collectionsr   r   dataclassesr   r	   r   r
   r   pathlibr   
statisticsr   typingr   r   zoneinfor   homeBASEre   r   rr  rw   rx   r   ry   r;   rK   rY   ri   rq   r}   r   r   r   r   r   r   r   r  r   r   r.  r7  r<  rW  rZ  ry  r  r  rC   jsonprintdumps)r{   s   0rI   <module>r     s[   # 	   , ! 8 8     tyy{Y)L8	O$ (
 L$23&vv~3 $ ""%" $# # # $
  
  
  $
 
 
(
Q% =@1
& !  	2(--
- /- #	-`2 ")-	      '	 
  F7 7 !*.HH
H H 
	H
 H H (H HZ *.
  
	
 ( . "*.?? ? 	?
 ? ? 
? (? ?D4& z	*$**WYU1
=> S 4s   
G