+
    „WÝjáŠ  ã                  óÔ  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
Ht ^ RIHt ^ RIHtHtHtHt ^ RIHt ^ RIHt ^ RIHtHt ^ R	IHt ^ R
IHt ^RIHtHtH t H!t!H"t"H#t#H$t$H%t%H&t& ^RI'H(t(H)t) Rt*Rt+^út,Rt-Rt.^t/Rt0Rt1Rt2Rt3Rt4]! ^R7      t5R+t6Rt7Rt8Rt9R,t:R]8RR3t;Rt<Rt=R-t>]P~                  ! ]@4      tAR R  ltBR! R" ltCR# R$ ltDR% R& ltER' R( ltF ! R) R*4      tGR# ).z?Durable aggregation and local export for Hermes shared metrics.)ÚannotationsN)ÚCallableÚIterator)Úcontextmanager)ÚdatetimeÚ	timedeltaÚtimezoneÚUTC)ÚPath)ÚAny)Úadd_column_if_missingÚ	write_txn)Úget_hermes_home)Úatomic_json_write)	ÚCLIENT_ACTIVE_METRICÚCOUNTER_METRICSÚFEATURE_ADOPTION_METRICÚINSTALL_SNAPSHOT_METRICÚMILESTONE_METRICÚMODEL_ROUTE_METRICÚSUM_METRICSÚclient_resource_is_validÚcounter_dimensions_are_valid)Úconform_counter_dimensionsÚ!counter_dimensions_shape_is_knownzhermes.shared_metrics.v4Ú2iˆ  i   Úclient_active_recorded_atÚinstall_snapshot_recorded_atz
milestone:zfeature:zdaily_once:)Úhourszž
            CREATE TABLE IF NOT EXISTS telemetry_state (
                key TEXT PRIMARY KEY,
                value TEXT NOT NULL
            )
            a­  
            CREATE TABLE IF NOT EXISTS counter_aggregates (
                period_start TEXT NOT NULL,
                metric_name TEXT NOT NULL,
                hermes_version TEXT NOT NULL,
                os_family TEXT NOT NULL,
                architecture TEXT NOT NULL,
                install_method TEXT NOT NULL,
                dimensions_json TEXT NOT NULL,
                value INTEGER NOT NULL,
                packaged_value INTEGER NOT NULL DEFAULT 0,
                PRIMARY KEY (
                    period_start, metric_name, hermes_version, os_family, architecture,
                    install_method, dimensions_json
                )
            )
            aM  
            CREATE TABLE IF NOT EXISTS package_outbox (
                package_id TEXT PRIMARY KEY,
                period_start TEXT NOT NULL,
                period_end TEXT NOT NULL,
                payload_json TEXT NOT NULL,
                created_at TEXT NOT NULL,
                exported_at TEXT
            )
            z>ALTER TABLE counter_aggregates RENAME TO counter_aggregates_v1a¯  
            INSERT INTO counter_aggregates(
                period_start, metric_name, hermes_version, os_family, architecture,
                install_method, dimensions_json, value, packaged_value
            )
            SELECT
                period_start, metric_name, hermes_version, 'unknown', 'unknown', 'unknown',
                dimensions_json, value, packaged_value
            FROM counter_aggregates_v1
            z DROP TABLE counter_aggregates_v1ag  
                SELECT COUNT(*) AS period_count FROM (
                    SELECT period_start, hermes_version, os_family, architecture, install_method
                    FROM counter_aggregates WHERE value > packaged_value
                    GROUP BY period_start, hermes_version, os_family, architecture, install_method
                )
                aé  
            INSERT INTO counter_aggregates(
                period_start, metric_name, hermes_version, os_family, architecture,
                install_method, dimensions_json, value, packaged_value
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 0)
            ON CONFLICT(
                period_start, metric_name, hermes_version, os_family, architecture,
                install_method, dimensions_json
            )
            DO UPDATE SET value = value + excluded.value
            c               ó   € V ^8„  d   QhRR/# )é   Úreturnr   © )Úformats   "Ú[C:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\observability\shared_metrics.pyÚ__annotate__r%   Ÿ   s   € ÷ ñ �(ñ ó    c                 ó6   € \         P                  ! \        4      # ©N)r   Únowr	   r"   r&   r$   Ú_utc_nowr*   Ÿ   s   € Ü�<Š<œÓÐr&   c               ó    € V ^8„  d   QhRRRR/# )r    Úvaluer   r!   Ústrr"   )r#   s   "r$   r%   r%   £   s   € ÷ Dñ D�hð D 3ñ Dr&   c                óh   € V P                  \        4      P                  4       P                  R R4      # )z+00:00ÚZ)Ú
astimezoner	   Ú	isoformatÚreplace©r,   s   &r$   Ú
_isoformatr4   £   s)   € Ø×ÑœCÓ ×*Ñ*Ó,×4Ñ4°X¸sÓCÐCr&   c               ó    € V ^8„  d   QhRRRR/# )r    r,   r   r!   r-   r"   )r#   s   "r$   r%   r%   §   s   € ÷ Dñ D˜ð D ñ Dr&   c                ó4   € \         P                  ! V R RR7      # )T)Ú	sort_keysÚ
separators©Ú,Ú:)ÚjsonÚdumpsr3   s   &r$   Ú_compact_jsonr>   §   s   € Ü�:Š:�e t¸
ÔCÐCr&   c               ó    € V ^8„  d   QhRRRR/# )r    Úrowúsqlite3.Rowr!   údict[str, str]r"   )r#   s   "r$   r%   r%   «   s   € ÷ Añ A�{ð A ~ñ Ar&   c                óD   € \          Uu/ uF  qW,          bK  	  up# u upi r(   )Ú_RESOURCE_COLUMNS)r@   Úcolumns   & r$   Ú_row_resourcerF   «   s!   € Ý.?Ó@Ñ.? F�C•KÒÑ.?Ñ@Ð@ùÒ@s   ‰c               ó$   € V ^8„  d   QhRRRRRR/# )r    Úpathr
   ÚmodeÚintr!   ÚNoner"   )r#   s   "r$   r%   r%   ¯   s!   € ÷ ñ ˜$ð  cð ¨dñ r&   c                ó¬   € VR 8X  d   V P                  RRVR7       MV P                  VRR7        V P                  V4       R#   \         d     R# i ; i)éÀ  T)ÚparentsÚexist_okrI   )rI   rO   N)ÚmkdirÚtouchÚchmodÚOSError)rH   rI   s   &&r$   Ú_ensure_privaterT   ¯   sN   € Øˆu„}Ø�
‰
˜4¨$°Tˆ
Õ:à�
‰
˜ tˆ
Ô,ðØ�
‰
�4ÖøÜô Úðús   ±A ÁAÁAc                  óP  € ] tR t^ºtRtRPR R lltR R ltR R ltR	 R
 ltR R lt	R R lt
RQR R lltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R  ltR! R" lt]R# R$ l4       t]RQR% R& ll4       tR' R( ltR) R* lt]3R+ R, lltR- R. ltR/ R0 ltR1 R2 lt]R3] /R4 R5 ll4       t!]R3] /R6 R7 ll4       t"R8 R9 lt#R: R; lt$]R< R= l4       t%R> R? lt&R@ RA lt'RB RC lt(]RD RE l4       t)]*RF RG l4       t+]RH RI l4       t,RJ RK lt-RLR/RM RN llt.ROt/R# )RÚSharedMetricsStorezAPersist allowlisted counters and export immutable delta packages.Nc               ó$   € V ^8„  d   QhRRRRRR/# )r    Údatabase_pathzPath | NoneÚoutbox_directoryr!   rK   r"   )r#   s   "r$   r%   ÚSharedMetricsStore.__annotate__½   s$   € ÷ $ñ $Ø(ð$ØCNð$à	ñ$r&   c                	óž  € \        4       R ,          R,          pT;'       g
    VR,          V n        T;'       g
    VR,          V n        \        V P                  P                  R4       \        V P                  R4       \        V P                  R4       V P                  4        . V n        \        P                  ! 4       V n	        RV n
        R# )Ú	telemetryÚshared_metricszmetrics.sqlite3ÚoutboxrM   é€  FN)r   rX   rY   rT   ÚparentÚ_ensure_schemaÚ	_deferredÚ	threadingÚLockÚ_deferred_lockÚ_drain_at_exit)ÚselfrX   rY   Úroots   &&& r$   Ú__init__ÚSharedMetricsStore.__init__½   s¡   € ô Ó  ;Õ.Ð1AÕAˆØ*×FÐF¨dÐ5FÕ.FˆÔØ 0× CÐ C°D¸8µOˆÔÜ˜×*Ñ*×1Ñ1°5Ô9Ü˜×-Ñ-¨uÔ5Ü˜×*Ñ*¨EÔ2Ø×ÑÔØEGˆŒÜ'ŸnšnÓ.ˆÔØ#ˆÖr&   c               ó$   € V ^8„  d   QhRRRRRR/# )r    Ú
dimensionsrB   Úresourcer!   rK   r"   )r#   s   "r$   r%   rZ   Ë   s'   € ÷ Fñ F¨Nð FÀnð FÐY]ñ Fr&   c                ó2   € V P                  \        W4       R# )zBIncrement the terminal model-call counter for the current UTC day.N)Úrecord_counterr   ©rg   rl   rm   s   &&&r$   Úrecord_model_callÚ$SharedMetricsStore.record_model_callË   s   € à×ÑÔ.°
ÖEr&   c               ó    € V ^8„  d   QhRRRR/# )r    rm   rB   r!   Úboolr"   )r#   s   "r$   r%   rZ   Ï   s   € ÷ 
ñ 
¨^ð 
Àñ 
r&   c                ó:   € V P                  \        \        / V4      # )z?Record this install at most once in any rolling 24-hour window.)Ú_record_once_per_intervalÚ_ACTIVE_INSTALL_STATE_KEYr   )rg   rm   s   &&r$   Úrecord_client_activeÚ'SharedMetricsStore.record_client_activeÏ   s   € à×-Ñ-Ü%Ô';¸RÀó
ð 	
r&   c               ó$   € V ^8„  d   QhRRRRRR/# )r    rl   rB   rm   r!   rt   r"   )r#   s   "r$   r%   rZ   Õ   s"   € ÷ 
ñ 
°.ð 
ÈNð 
Ð_cñ 
r&   c                ó8   € V P                  \        \        W4      # )zMRecord the configuration snapshot at most once in any rolling 24-hour window.)rv   Ú_INSTALL_SNAPSHOT_STATE_KEYr   rp   s   &&&r$   Úrecord_install_snapshotÚ*SharedMetricsStore.record_install_snapshotÕ   s   € à×-Ñ-Ü'Ô)@À*ó
ð 	
r&   c               ó   € V ^8„  d   QhRR/# )r    r!   rt   r"   )r#   s   "r$   r%   rZ   Û   s   € ÷ Tñ T dñ Tr&   c                óR  € V P                  4       ;_uu_ 4       pVP                  R\        34      P                  4       pRRR4       Xe   V P	                  VR,          4      MRp\        4       pVRJ ;'       g    W48„  ;'       g    WC\        ,           8¬  #   + '       g   i     L_; i)zLCheap read so the producer skips collecting a snapshot the latch would drop.ú/SELECT value FROM telemetry_state WHERE key = ?Nr,   )Ú_connectionÚexecuter|   ÚfetchoneÚ_parse_state_timestampr*   Ú_ACTIVE_INSTALL_INTERVAL)rg   Ú
connectionr@   Úlastr)   s   &    r$   Úinstall_snapshot_dueÚ'SharedMetricsStore.install_snapshot_dueÛ   sŽ   € à×Ñ×Ô :Ø×$Ñ$ØAÔD_ÐCaóç‰h‹jð ÷  ð =@ºOˆt×*Ñ*¨3¨w­<Ô8ÐQUˆÜ‹jˆØ�tˆ|×SÐS˜t™z×SÐS¨SÔ;SÕ4SÑ-SÐS÷  ×ús   ™&BÂB&	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# ©	r    Ú	state_keyr-   Úmetric_namerl   rB   rm   r!   rt   r"   )r#   s   "r$   r%   rZ   å   s6   € ÷ ñ ØðØ+.ðØ<Jðà ðð 
ñr&   c           
     ó„  € V P                  W#V4       \        4       pV P                  4       ;_uu_ 4       pVP                  RV34      P	                  4       pVe   V P                  VR,          4      MRpVe/   W…8”  d)   VP                  R\        V4      V34        RRR4       R# Ve   WX\        ,           8  d    RRR4       R# V P                  V4       V P                  WbW4VP                  4       P                  4       4       VP                  RV\        V4      34       RRR4       R#   + '       g   i     R# ; i)zJTransactional compare-and-set latch shared by concurrent Hermes processes.r�   Nr,   z2UPDATE telemetry_state SET value = ? WHERE key = ?FúkINSERT INTO telemetry_state(key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.valueT)Ú_validate_counterr*   Ú_writerƒ   r„   r…   r4   r†   Ú_install_idÚ_record_counter_in_transactionÚdater1   )	rg   r�   rŽ   rl   rm   r)   r‡   r@   Úlast_recordeds	   &&&&&    r$   rv   Ú,SharedMetricsStore._record_once_per_intervalå   s(  € ð
 	×Ñ˜{¸ÔAÜ‹jˆØ�[‰[�]Œ]˜jØ×$Ñ$ØAÀIÀ<óç‰h‹jð ð JMÊ˜D×7Ñ7¸¸G½ÔEÐ^bˆMØÒ(¨]Ô-@ð ×"Ñ"ØHÜ “_ iÐ0ôð ÷ ‰]ð Ò(¨SÔC[Õ3[Ô-[Ø÷ ‰]ð ×Ñ˜ZÔ(Ø×/Ñ/Ø¨¸s¿x¹x»z×?SÑ?SÓ?Uôð ×ÑðIàœJ s›OÐ,ô÷' ñ0 ÷1 Ž]ñ0 ús   µA(D.Â'D.ÃAD.Ä.D?	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r    rŽ   r-   rl   rB   rm   ÚamountrJ   r!   rK   r"   )r#   s   "r$   r%   rZ     s6   € ÷ ñ ØðØ,:ðØFTðàðð 
ñr&   c                ó^  a aaaaa€ S P                  SSS4       \        S\        4      '       g0   \        S\        4      '       d   S^8  g   S^8w  d   S\        9  d   \        RS 24      h\        4       P                  4       P                  4       oS P                  VVVVVV 3R l4       R# )zVAdd ``amount`` (1 for event counters, a token count for sums) for the current UTC day.z&Unsupported amount for shared metric: c                ó0   <€ SP                  V SSSSS4      # r(   )r”   )r‡   r™   rl   rŽ   Úperiod_startrm   rg   s   &€€€€€€r$   Ú<lambda>Ú3SharedMetricsStore.record_counter.<locals>.<lambda>  s   ø€ °×0SÑ0SØ˜ Z°¸<Èô1
r&   N)
r‘   Ú
isinstancert   rJ   r   Ú
ValueErrorr*   r•   r1   Ú_write_or_defer)rg   rŽ   rl   rm   r™   rœ   s   fffff@r$   ro   Ú!SharedMetricsStore.record_counter  s†   ý€ ð
 	×Ñ˜{¨J¸ÔAÜ�fœd×#Ò#¬:°f¼c×+BÒ+BÀfÈqÄjØ�aŒK˜K¬{Ô:äÐEÀkÀ]ÐSÓTÐTÜ“z—‘Ó(×2Ñ2Ó4ˆØ×Ñ÷ 
ñ 
ö 	r&   c               ó$   € V ^8„  d   QhRRRRRR/# )r    r�   r-   Úupdateú[Callable[[dict[str, Any] | None], tuple[dict[str, Any], list[tuple[str, dict, dict, str]]]]r!   rK   r"   )r#   s   "r$   r%   rZ     s+   € ÷ 	jñ 	jØð	jàkð	jð 
ñ	jr&   c                ó:   a aa€ S P                  V VV3R l4       R# )aª  Read-modify-write one JSON rollup state and record the ``(metric, dimensions, resource,
period_start)`` rows ``update`` closes, in one write transaction: every process of the profile
serializes here, so a closed period is emitted exactly once. Rows the contract rejects are
dropped (never retried) so one bad row cannot wedge the rollup. A busy store defers the update
to the next write (it then runs with that write's clock).c                ó*   <€ SP                  V SS4      # r(   )Ú_update_rollup_state)r‡   rg   r�   r¤   s   &€€€r$   r�   Ú8SharedMetricsStore.update_rollup_state.<locals>.<lambda>  s   ø€ °×0IÑ0IÈ*ÐV_ÐagÔ0hr&   N)r¡   )rg   r�   r¤   s   fffr$   Úupdate_rollup_stateÚ&SharedMetricsStore.update_rollup_state  s   ú€ ð 	×ÑÖhÖir&   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r    r‡   úsqlite3.Connectionr�   r-   r¤   r¥   r!   rK   r"   )r#   s   "r$   r%   rZ      s.   € ÷ 
ñ 
Ø,ð
Ø9<ð
àkð
ð 
ñ
r&   c                	óT  € VP                  R V34      P                  4       p Ve   \        P                  ! VR,          4      MRpT! \        V\        4      '       d   TMR4      w  rgV Uu. uFA  p\        V^ ,          V^,          4      '       g   K%  \        V^,          4      '       g   K?  VNKC  	  p	pV	'       d   V P                  V4       V	 F  w  r«rÍV P                  WW¼V4       K  	  VP                  RV\        V4      34       R#   \        \
        3 d    Rp LÛi ; iu upi )r�   Nr,   r�   )rƒ   r„   r<   ÚloadsÚ	TypeErrorr    rŸ   Údictr   r   r“   r”   r>   )rg   r‡   r�   r¤   r@   ÚstateÚ	new_stateÚrowsÚrÚvalidrŽ   rl   rm   rœ   s   &&&&          r$   r¨   Ú'SharedMetricsStore._update_rollup_state   s  € ð × Ñ Ø=À	¸|ó
ç
‰(‹*ð 	ð	Ø03²”D—J’J˜s 7�|Ô,ÀTˆEñ !¬*°U¼D×*AÒ*A¡ÀtÓL‰ˆ	áó
Ù�!Ü+¨A¨a­D°!°Aµ$×7ô Ü<TÐUVÐWXÕUY×<Z÷ ˆA‘tð 	ð 
÷ Ø×Ñ˜ZÔ(Û?DÑ;ˆK XØ×/Ñ/°
ÈÐ_kÖlñ @Eà×ÑðEàœ iÓ0Ð1ö	
øô œ:Ð&ô 	ØŠEð	üò
s#   £#D Á,"D%ÂD%Â-D%ÄD"Ä!D"c               ó   € V ^8„  d   QhRR/# ©r    r!   úfrozenset[str]r"   )r#   s   "r$   r%   rZ   :  s   € ÷ 6ñ 6 ^ñ 6r&   c                	ó,   € V P                  \        4      # r(   )Ú_latchedÚ_MILESTONE_STATE_PREFIX©rg   s   &r$   Úrecorded_milestonesÚ&SharedMetricsStore.recorded_milestones:  s   € Ø�}‰}Ô4Ó5Ð5r&   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r    Ú	milestoner-   Úinstall_age_bucketrm   rB   r!   rt   r"   )r#   s   "r$   r%   rZ   =  s0   € ÷ wñ w¨#ð wÀ3ð wÐR`ð wÐeiñ wr&   c                óL   € RVRV/pV P                  \         V 2\        WC4      # )zRRecord an install milestone at most once, ever (compare-and-set across processes).rÃ   rÂ   )Ú_record_once_everr½   r   )rg   rÂ   rÃ   rm   rl   s   &&&& r$   Úrecord_milestoneÚ#SharedMetricsStore.record_milestone=  s3   € à*Ð,>ÀÈYÐWˆ
Ø×%Ñ%Ô)@Ð(AÀ)ÀÐ&MÔO_ÐakÓvÐvr&   c               ó   € V ^8„  d   QhRR/# r¹   r"   )r#   s   "r$   r%   rZ   C  s   € ÷ 4ñ 4 >ñ 4r&   c                	ó,   € V P                  \        4      # r(   )r¼   Ú_FEATURE_STATE_PREFIXr¾   s   &r$   Úrecorded_featuresÚ$SharedMetricsStore.recorded_featuresC  s   € Ø�}‰}Ô2Ó3Ð3r&   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r    Úfeaturer-   Údays_bucketrm   rB   r!   rt   r"   )r#   s   "r$   r%   rZ   F  s0   € ÷ zñ z¨sð zÀð zÐP^ð zÐcgñ zr&   c                óL   € RVRV/pV P                  \         V 2\        WC4      # )zWRecord a feature's first use at most once per install, ever (same latch as milestones).Údays_since_install_bucketrÎ   )rÅ   rÊ   r   )rg   rÎ   rÏ   rm   rl   s   &&&& r$   Úrecord_feature_adoptionÚ*SharedMetricsStore.record_feature_adoptionF  s2   € à1°;À	È7ÐSˆ
Ø×%Ñ%Ô)>Ð(?À¸yÐ&IÔKbÐdnÓyÐyr&   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r    rŽ   r-   rl   rB   rm   r!   rt   r"   )r#   s   "r$   r%   rZ   K  s*   € ÷ ñ °sð Èð Ðbpð Ðuyñ r&   c           	     ó$  € V P                  WV4       \        4       pVP                  4       P                  4       p\         V R2\        VP                  4        UUu/ uF  w  rgVR8w  g   K  WgbK  	  upp4      ,           pV P                  4       ;_uu_ 4       p	V	P                  RW…34      P                  p
V
'       g    RRR4       R# V P                  V	4       V P                  W‘W#V4       RRR4       R# u uppi   + '       g   i     R# ; i)z²Count at most once per UTC day per dimension set, whatever the surface (``surface`` is
attribution of the first one that day). One state row per dimension set, overwritten daily.r;   Úsurfacez™INSERT INTO telemetry_state(key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value WHERE telemetry_state.value != excluded.valueNFT)r‘   r*   r•   r1   Ú_DAILY_ONCE_STATE_PREFIXr>   Úitemsr’   rƒ   Úrowcountr“   r”   )rg   rŽ   rl   rm   r)   ÚtodayÚkÚvÚkeyr‡   Úchangeds   &&&&       r$   Úrecord_counter_once_per_dayÚ.SharedMetricsStore.record_counter_once_per_dayK  sö   € ð 	×Ñ˜{¸ÔAÜ‹jˆØ—‘“
×$Ñ$Ó&ˆÜ)Ð*¨;¨-°qÐ9¼MØ(×.Ñ.Ô0ÔCÑ0‘d�a°A¸±NŒTˆQŠTÑ0ÒCó=Eõ Eˆà�[‰[�]Œ]˜jØ ×(Ñ(ð\à�ó÷ ‰hð	 ÷
 Ø÷ ‰]ð ×Ñ˜ZÔ(Ø×/Ñ/°
ÈÐ_dÔe÷ ñ ùó DßŽ]ñ ús   ÁC8Á-C8Â'C>Ã
$C>Ã>D	c               ó    € V ^8„  d   QhRRRR/# )r    Úprefixr-   r!   rº   r"   )r#   s   "r$   r%   rZ   `  s   € ÷ Cñ C˜sð C ~ñ Cr&   c                	óÞ   a€ V P                  4       ;_uu_ 4       pVP                  R S R234      P                  4       pRRR4       \        V3R lX 4       4      #   + '       g   i     L%; i)z0SELECT key FROM telemetry_state WHERE key LIKE ?Ú%Nc              3  óL   <"  € T F  qR ,          \        S4      R x € K  	  R# 5i)rÝ   N)Úlen)Ú.0r@   râ   s   & €r$   Ú	<genexpr>Ú.SharedMetricsStore._latched.<locals>.<genexpr>e  s   øé € ÐB¹T°c˜U�¤C¨£K LÕ1»Tùs   ƒ!$)r‚   rƒ   ÚfetchallÚ	frozenset)rg   râ   r‡   r´   s   &f  r$   r¼   ÚSharedMetricsStore._latched`  s\   ø€ Ø×Ñ×Ô :Ø×%Ñ%ØBÈÀxÈqÀ\ÀOóç‰h‹jð ÷  ô ÔB¹TÓBÓBÐB÷	  ×ús   š%AÁA,	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# rŒ   r"   )r#   s   "r$   r%   rZ   g  s4   € ÷ ñ ØðØ+.ðØ<JðØVdðà	ñr&   c           
     	óœ  € V P                  W#V4       \        4       pV P                  4       ;_uu_ 4       pVP                  R V\	        V4      34      P
                  pV'       g    RRR4       R# V P                  V4       V P                  WbW4VP                  4       P                  4       4       RRR4       R#   + '       g   i     R# ; i)zQINSERT INTO telemetry_state(key, value) VALUES (?, ?) ON CONFLICT(key) DO NOTHINGNFT)
r‘   r*   r’   rƒ   r4   rÙ   r“   r”   r•   r1   )rg   r�   rŽ   rl   rm   r)   r‡   Úinserteds   &&&&&   r$   rÅ   Ú$SharedMetricsStore._record_once_everg  s«   € ð 	×Ñ˜{¸ÔAÜ‹jˆØ�[‰[�]Œ]˜jØ!×)Ñ)ØcØœJ s›OÐ,ó÷ ‰hð ÷ Ø÷ ‰]ð ×Ñ˜ZÔ(Ø×/Ñ/Ø¨¸s¿x¹x»z×?SÑ?SÓ?Uô÷ ñ ÷ Ž]ñ ús   µ1B:Á0A B:Â:C	c               ó(   € V ^8„  d   QhRRRRRRRR/# )r    rŽ   r-   rl   rB   rm   r!   rK   r"   )r#   s   "r$   r%   rZ   z  s2   € ÷ Kñ KØðKØ&4ðKØ@NðKà	ñKr&   c                	ó®   € V \         9  d   \        R V  24      h\        W4      '       g   \        RV  24      h\        V4      '       g   \        R4      hR# )zUnsupported shared metric: ú*Unsupported dimensions for shared metric: ú*Unsupported shared-metrics client resourceN)r   r    r   r   )rŽ   rl   rm   s   &&&r$   r‘   Ú$SharedMetricsStore._validate_countery  sY   € ð œoÔ-ÜÐ:¸;¸-ÐHÓIÐIÜ+¨K×DÒDÜÐIÈ+ÈÐWÓXÐXÜ'¨×1Ò1ÜÐIÓJÐJñ 2r&   c               ó4   € V ^8„  d   QhRRRRRRRRRRR	R
RR/# )r    r‡   r­   rŽ   r-   rl   rB   rm   rœ   r™   rJ   r!   rK   r"   )r#   s   "r$   r%   rZ   …  sN   € ÷ 
ñ 
Ø&ð
àð
ð #ð
ð !ð	
ð
 ð
ð ð
ð 
ñ
r&   c                	ór   a€ V P                  \        WA.V3R  l\         4       O\        V4      NVN54       R# )c              3  ó6   <"  € T F  pSV,          x € K  	  R # 5ir(   r"   ©rç   rE   rm   s   & €r$   rè   ÚDSharedMetricsStore._record_counter_in_transaction.<locals>.<genexpr>�  s   øé € Ð,^ÑL]À&¨X°f×-=Ò-=ÓL]ùó   ƒN)rƒ   Ú_INCREMENT_COUNTER_SQLrD   r>   )r‡   rŽ   rl   rm   rœ   r™   s   &&&f&&r$   r”   Ú1SharedMetricsStore._record_counter_in_transaction„  sA   ø€ ð 	×ÑÜ"àðÜ,^ÕL]Ó,^ðä˜jÓ)ðà+1ñö	
r&   c               ó   € V ^8„  d   QhRR/# ©r    r!   z
list[Path]r"   )r#   s   "r$   r%   rZ   •  s   € ÷ (ñ (¨:ñ (r&   c                óf  € V P                  4       ;_uu_ 4       pVP                  \        4      P                  4       pRRR4       \	        Xe   \        VR,          4      M^ 4       F&  pV P                  4       e   K   V P                  4       # 	  V P                  4       #   + '       g   i     Lk; i)zLCommit every pending delta package (one per period), then export the outbox.NÚperiod_count)r‚   rƒ   Ú_PENDING_PERIOD_COUNT_SQLr„   ÚrangerJ   Ú_create_packageÚ_export_and_prune)rg   r‡   r@   Ú_s   &   r$   Úcreate_and_export_packageÚ,SharedMetricsStore.create_and_export_package•  s�   € à×Ñ×Ô :Ø×$Ñ$Ô%>Ó?×HÑHÓJˆC÷  ä°3²?”s˜3˜~Õ.Ô/ÈÖJˆAØ×#Ñ#Ó%Ô-ØØ×%Ñ%Ó'Ð'ñ Kð ×%Ñ%Ó'Ð'÷  ×ús   ™$B Â B0	c               ó    € V ^8„  d   QhRRRR/# )r    Úwritez$Callable[[sqlite3.Connection], None]r!   rK   r"   )r#   s   "r$   r%   rZ   ž  s   € ÷ ñ Ð%Ið Èdñ r&   c                óø  € V P                   ;_uu_ 4        . V P                  OVN. uq n        RRR4        V P                  4       ;_uu_ 4       pX F  pV! V4       K  	  RRR4       R#   + '       g   i     LE; i  + '       g   i     R# ; i  \        P                   dÔ   pR\        T4      9   ;'       g    R\        T4      9   pT P                   ;_uu_ 4        . T'       d   XMXRR OT P                  O\        ) R T n        T P                  '       * Ruqpn        RRR4       M  + '       g   i     M; iX'       d!   \        P                  ! T P                  4       T'       g   h  Rp?R# Rp?ii ; i)záRun ``write`` (after any deferred ones) in one write transaction. A store another writer
holds past the short busy timeout keeps them in memory for the next write or process exit
instead of losing them or stalling the caller.NÚlockedÚbusyTéÿÿÿÿ)re   rb   r’   Úsqlite3ÚOperationalErrorr-   Ú_DEFERRED_WRITES_MAXrf   ÚatexitÚregisterÚdrain_deferred)rg   r
  Úpendingr‡   ÚitemÚexcr  r  s   &&      r$   r¡   Ú"SharedMetricsStore._write_or_deferž  s!  € ð × × Ó Ø&>¨¯©Ð&>¸Ð&>ÀÐ#ˆG”^÷ !ð	Ø—‘—” *Û#�DÙ˜Ö$ñ $÷ ‘÷ !× ú÷ —�ûô ×'Ñ'ô 		Øœs 3›xÑ'×=Ð=¨6´S¸³XÑ+=ˆDØ×$×$Ó$à!X¯t¡G¸ÀÀ"¸Ð!XÈÏÉÐ!XÔZnÐYnÐYoÐ!p�”Ø48×4GÑ4GÔ0GÈÐ-�Ô-÷ %×$×$Ð$ú÷ Ü—’ × 3Ñ 3Ô4ßØõ ûð		úse   •A*¶B ÁA=Á B Á*A:	Á=B	ÂB ÂB ÂE9Â&8E4ÃAD*Ä!	E4Ä*D:Ä5E4Å'E4Å-E4Å4E9c               ó    € V ^8„  d   QhRRRR/# )r    Úbusy_timeout_msrJ   r!   rK   r"   )r#   s   "r$   r%   rZ   ³  s   € ÷ nñ n¨cð nÐPTñ nr&   c                ó˜  € V P                   ;_uu_ 4        V P                  . uq n        RRR4       X'       g   R#  V P                  VR7      ;_uu_ 4       pV F  pV! V4       K  	  RRR4       R#   + '       g   i     LQ; i  + '       g   i     R# ; i  \         d&    \        P                  R\        T4      RR7        R# i ; i)zYWrite the deferred writes (process exit / export waits longer than the user's path does).N©r  z2Unable to write %d deferred shared-metrics updatesT©Úexc_info)re   rb   r’   Ú	ExceptionÚloggerÚwarningræ   )rg   r  r  r‡   r  s   &&   r$   r  Ú!SharedMetricsStore.drain_deferred³  sž   € à× × Ó Ø&*§n¡n°bÐ#ˆG”^÷ !çÙð	nØ—‘¨_�×=Ô=ÀÛ#�DÙ˜Ö$ñ $÷ >Ñ=÷ !× ú÷
 >×=Ð=ûô ô 	nÜ�N‰NÐOÔQTÐU\ÓQ]ÐhlˆN×mð	nús:   •A2¼B ÁBÁ(B Á2B	ÂB	ÂB ÂB Â,C	ÃC	c               ó   € V ^8„  d   QhRR/# rÿ   r"   )r#   s   "r$   r%   rZ   À  s   € ÷ (ñ (°*ñ (r&   c                ól   € V P                  \        4       V P                  4        V P                  4       # )zCCreate pending packages at most once per UTC day, then export them.)r  Ú_BUSY_TIMEOUT_MSÚ_create_pending_packages_if_duer  r¾   s   &r$   Ú create_and_export_package_if_dueÚ3SharedMetricsStore.create_and_export_package_if_dueÀ  s,   € à×ÑÔ,Ô-Ø×,Ñ,Ô.Ø×%Ñ%Ó'Ð'r&   c               ó   € V ^8„  d   QhRR/# rÿ   r"   )r#   s   "r$   r%   rZ   Æ  s   € ÷ ñ  :ñ r&   c                	óš   € V P                  4       p V P                  4        V#   \         d    \        P	                  R RR7        T# i ; i)z.Unable to prune expired shared-metrics historyTr  )Ú_export_pending_packagesÚ_prune_expired_historyr  r   r!  )rg   Úexporteds   & r$   r  Ú$SharedMetricsStore._export_and_pruneÆ  sS   € Ø×0Ñ0Ó2ˆð	\Ø×'Ñ'Ô)ð ˆøô ô 	\Ü�N‰NÐKÐVZˆNÕ[Øˆð	\ús   ’$ ¤"A
Á	A
c               ó   € V ^8„  d   QhRR/# )r    r!   úlist[dict[str, Any]]r"   )r#   s   "r$   r%   rZ   Î  s   € ÷ 
ñ 
Ð"6ñ 
r&   c                ón  € V P                  4       ;_uu_ 4       pVP                  R4      P                  4       pRRR4       X Uu. uFQ  pRVR,          RVR,          R\        V4      R\        P
                  ! VR,          4      RVR,          R	VR	,          /NKS  	  up#   + '       g   i     Ln; iu upi )
zBReturn cumulative counters for focused tests and local inspection.ap  
                SELECT period_start, metric_name, hermes_version, os_family, architecture,
                    install_method, dimensions_json, value, packaged_value
                FROM counter_aggregates
                ORDER BY period_start, hermes_version, os_family, architecture, install_method,
                    metric_name, dimensions_json
                Nrœ   rŽ   rm   rl   Údimensions_jsonr,   Úpackaged_value)r‚   rƒ   rê   rF   r<   r¯   )rg   r‡   r´   r@   s   &   r$   Úcounter_snapshotÚ#SharedMetricsStore.counter_snapshotÎ  s²   € à×Ñ×Ô :Ø×%Ñ%ðó÷ ‰h‹jð ÷  ñ  ó
ñ �ð	   NÕ 3°]ÀCÈÕDVØœM¨#Ó.°¼d¿jºjÈÐM^ÕI_Ó>`Ø˜˜W�Ð'7¸Ð=MÕ9Nóñ
 ñ
ð 	
÷  ×üò
s   ™ BÁAB2ÂB/	r  c               ó    € V ^8„  d   QhRRRR/# ©r    r  rJ   r!   zIterator[sqlite3.Connection]r"   )r#   s   "r$   r%   rZ   ä  s   € ÷ 
ñ 
Ø"%ð
à	%ñ
r&   c             #  	óR  "  € \         P                  ! V P                  VR ,          R7      p \         P                  Vn        VP                  RV 24       V;_uu_ 4        Vx € RRR4       VP                  4        R#   + '       g   i     L"; i  TP                  4        i ; i5i)iè  )ÚtimeoutzPRAGMA busy_timeout=N)r  ÚconnectrX   ÚRowÚrow_factoryrƒ   Úclose©rg   r  r‡   s   &$ r$   r‚   ÚSharedMetricsStore._connectionã  s   é € ô —_’_ T×%7Ñ%7ÀÐSWÕAWÔXˆ
ð	Ü%,§[¡[ˆJÔ"Ø×ÑÐ!5°oÐ5FÐGÔHß’Ø Ò ÷ ð ×ÑÖ÷ —ûð ×ÑÕüs4   ‚*B'­3B Á A?Á%B Á-B'Á?B	Â
B ÂB$Â$B'c               ó    € V ^8„  d   QhRRRR/# r7  r"   )r#   s   "r$   r%   rZ   ñ  s   € ÷ !ñ !¨ð !ÐD`ñ !r&   c          	   #  óâ   "  € V P                  VR7      ;_uu_ 4       p\        V4      ;_uu_ 4        Vx € RRR4       RRR4       R#   + '       g   i     L; i  + '       g   i     R# ; i5i)z*A connection inside one write transaction.r  N)r‚   r   r>  s   &$ r$   r’   ÚSharedMetricsStore._writeð  sM   é € ð ×Ñ¨oÐ×>Ô>À*Ü˜:×&Õ&Ø Ò ÷ '÷ ?Ñ>ß&×&ú÷ ?×>Ð>üs1   ‚A/�A±A	¶A¾
A/ÁAÁAÁA,	Á&	A/c               ó   € V ^8„  d   QhRR/# ©r    r!   rK   r"   )r#   s   "r$   r%   rZ   ÷  s   € ÷ #ñ # ñ #r&   c                	ó  € V P                  \        R 7      ;_uu_ 4       pVP                  \        4       VP                  R4      P	                  4       pVe   \        VR,          4      MRpVR8X  d%   \         F  pVP                  V4       K  	  \        pVe   V\        8w  d   \        RV 24      hVP                  \        4       VP                  \        4       VP                  R4       Uu0 uF  p\        VR,          4      kK  	  pp\         F  w  rxWv9  g   K  \        VRWw R	V 24       K!  	  \         F  pVP                  V4       K  	  VP                  R
\        34       RRR4       R# u upi   + '       g   i     R# ; i)r  z>SELECT value FROM telemetry_state WHERE key = 'schema_version'Nr,   Ú1z1Unsupported shared-metrics store schema version: z!PRAGMA table_info(package_outbox)ÚnameÚpackage_outboxÚ zzINSERT INTO telemetry_state(key, value) VALUES ('schema_version', ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value)r’   Ú_SCHEMA_BUSY_TIMEOUT_MSrƒ   Ú_CREATE_TELEMETRY_STATE_SQLr„   r-   Ú_MIGRATE_V1_SQLÚ_STORE_SCHEMA_VERSIONÚRuntimeErrorÚ_CREATE_COUNTER_AGGREGATES_SQLÚ_CREATE_PACKAGE_OUTBOX_SQLÚ_SEND_COLUMNSr   Ú_CREATE_CONSENT_TABLES_SQL)	rg   r‡   Ú
schema_rowÚschema_versionÚ	statementr@   ÚexistingrE   Údeclarations	   &        r$   ra   Ú!SharedMetricsStore._ensure_schema÷  s~  € à�[‰[Ô)@ˆ[×AÔAÀZØ×ÑÔ:Ô;Ø#×+Ñ+ØPóç‰h‹jð ð :DÒ9OœS ¨GÕ!4Ô5ÐUYˆNØ Ô$ß!0�IØ×&Ñ& yÖ1ñ "1ä!6�ØÒ)¨nÔ@UÔ.UÜ"ØGÈÐGWÐXóð ð ×ÑÔ=Ô>Ø×ÑÔ9Ô:ð &×-Ñ-Ð.QÔRóáR�Cô �C˜•KÖ ÙRð ð ÷ (5Ñ#�ØÖ)Ü)¨*Ð6FÈÐRZÐZ[Ð\gÐ[hÐPiÖjñ (5÷ 8�	Ø×"Ñ" 9Ö-ñ 8à×ÑðIä&Ð(ô÷; BÑAùò(÷) B×AÐAús%   ŸCE;Ã1E6ÄE;Ä!AE;Å6E;Å;F	c               ó    € V ^8„  d   QhRRRR/# )r    r‡   r­   r!   r-   r"   )r#   s   "r$   r%   rZ     s   € ÷ !ñ !Ð&8ð !¸Sñ !r&   c                	ó*  € R pVP                  V4      P                  4       pVfO   VP                  R\        \        P                  ! 4       4      34       VP                  V4      P                  4       pVf   \        R4      h\        VR,          4      # )z:SELECT value FROM telemetry_state WHERE key = 'install_id'zJINSERT OR IGNORE INTO telemetry_state(key, value) VALUES ('install_id', ?)z4Unable to create the shared-metrics install identityr,   )rƒ   r„   r-   ÚuuidÚuuid4rN  )rg   r‡   Úqueryr@   s   &&  r$   r“   ÚSharedMetricsStore._install_id  s‚   € ØLˆØ× Ñ  Ó'×0Ñ0Ó2ˆØŠ;Ø×ÑØ\Ü”T—Z’Z“\Ó"Ð$ôð ×$Ñ$ UÓ+×4Ñ4Ó6ˆCØŠ;ÜÐUÓVÐVÜ�3�w•<Ó Ð r&   c               ó    € V ^8„  d   QhRRRR/# )r    r,   r   r!   údatetime | Noner"   )r#   s   "r$   r%   rZ   *  s   € ÷ Iñ I cð I¨oñ Ir&   c                	ó¼   €  \         P                  ! \        V 4      4      pTP
                  f   R # TP                  \        4      #   \        \        3 d     R # i ; ir(   )r   Úfromisoformatr-   r°   r    Útzinfor0   r	   )r,   Úparseds   & r$   r…   Ú)SharedMetricsStore._parse_state_timestamp)  sU   € ð	Ü×+Ò+¬C°«JÓ7ˆFð —}‘}Ò,ˆtÐH°&×2CÑ2CÄCÓ2HÐHøô œ:Ð&ô 	Úð	ús   ‚A ÁAÁAc               ó   € V ^8„  d   QhRR/# rD  r"   )r#   s   "r$   r%   rZ   1  s   € ÷ ñ °ñ r&   c                	ó0  € \        4       pV P                  4       ;_uu_ 4       pVP                  R VP                  4       P	                  4       34      P                  4       pVf   V P                  W!4      e   K  RRR4       R#   + '       g   i     R# ; i)zISELECT 1 FROM package_outbox WHERE substr(created_at, 1, 10) >= ? LIMIT 1N)r*   r’   rƒ   r•   r1   r„   Ú_create_package_in_transaction)rg   r)   r‡   Úpackage_created_todays   &   r$   r&  Ú2SharedMetricsStore._create_pending_packages_if_due1  st   € Ü‹jˆØ�[‰[�]Œ]˜jð %/×$6Ñ$6Ø[Ø—‘“×%Ñ%Ó'Ð)ó%÷ ‰h‹jð "ð %Ò,Ø×9Ñ9¸*ÓJÒVÙ÷ �]�]Š]ús   £ABÂB	c               ó   € V ^8„  d   QhRR/# )r    r!   údict[str, Any] | Noner"   )r#   s   "r$   r%   rZ   >  s   € ÷ Oñ OÐ!6ñ Or&   c                	ó¤   € V P                  4       ;_uu_ 4       pV P                  V\        4       4      uuR R R 4       #   + '       g   i     R # ; ir(   )r’   rh  r*   )rg   r‡   s   & r$   r  Ú"SharedMetricsStore._create_package>  s-   € Ø�[‰[�]Œ]˜jØ×6Ñ6°zÄ8Ã:ÓN÷ �]�]‹]ús	   ™>¾A	c               ó$   € V ^8„  d   QhRRRRRR/# )r    r‡   r­   r)   r   r!   rl  r"   )r#   s   "r$   r%   rZ   B  s$   € ÷ <ñ <Ø,ð<Ø3;ð<à	ñ<r&   c                	ó  a
€ VP                  R 4      P                  4       pVe   VR,          '       g   R# VR,          p\        V4      o
\        ;QJ d    . V
3R l\         4       F  NK  	  5M! V
3R l\         4       4      pVP                  RV.VO54      P                  4       p\        P                  ! \        V4      4      P                  \        R7      p\        S
4      '       g   \        R4      hV P                  V4      pV'       g$   V P                  WWE4       V P                  W4      # R\         R\        \"        P$                  ! 4       4      R	V P'                  V4      R\)        V4      R
\)        V\+        ^R7      ,           4      R\)        V4      RS
RV/p	VP                  RV	R,          V	R,          V	R
,          \-        V	4      V	R,          34       VP                  RV	R
,          34       V P                  WWE4       V	# )a*  
                SELECT period_start, hermes_version, os_family, architecture, install_method
                FROM counter_aggregates WHERE value > packaged_value
                ORDER BY period_start, hermes_version, os_family, architecture, install_method
                LIMIT 1
                Nrœ   c              3  ó6   <"  € T F  pSV,          x € K  	  R # 5ir(   r"   rù   s   & €r$   rè   ÚDSharedMetricsStore._create_package_in_transaction.<locals>.<genexpr>R  s   øé € ÐQÑ?P°V ¨× 0Ò 0Ó?Pùrû   aS  
                SELECT metric_name, dimensions_json, value, packaged_value FROM counter_aggregates
                WHERE period_start = ? AND hermes_version = ? AND os_family = ?
                  AND architecture = ? AND install_method = ? AND value > packaged_value
                ORDER BY metric_name, dimensions_json
                )rc  rô   rT  Ú
package_idÚ
install_idÚ
period_end©ÚdaysÚgenerated_atrm   ÚmetricszsINSERT INTO package_outbox( package_id, period_start, period_end, payload_json, created_at ) VALUES (?, ?, ?, ?, ?)z|INSERT INTO consent_marks(name, stamp) VALUES ('data', ?) ON CONFLICT(name) DO UPDATE SET stamp = MAX(stamp, excluded.stamp))rƒ   r„   rF   ÚtuplerD   rê   r   rb  r-   r2   r	   r   r    Ú_package_metricsÚ_mark_packagedrh  Ú_PACKAGE_SCHEMA_VERSIONr[  r\  r“   r4   r   r>   )rg   r‡   r)   Ú
period_rowÚperiod_valueÚresource_valuesr´   rœ   ry  Úpayloadrm   s   &&&       @r$   rh  Ú1SharedMetricsStore._create_package_in_transactionB  så  ø€ ð  ×'Ñ'ðó
÷ ‰(‹*ð 	ð Ò Z°×%?Ô%?ÙØ! .Õ1ˆä  Ó,ˆßœ%ÔQÕ?PÓQŸ%™%ÔQÕ?PÓQÓQˆØ×!Ñ!ðð Ð,˜OÑ,ó
÷ ‰(‹*ð 	ô  ×-Ò-¬c°,Ó.?Ó@×HÑHÔPSÐHÓTˆÜ'¨×1Ò1ÜÐIÓJÐJØ×'Ñ'¨Ó-ˆßØ×Ñ 
°,ÔPØ×6Ñ6°zÓGÐGàÔ5Øœ#œdŸjšj›lÓ+Ø˜$×*Ñ*¨:Ó6ØœJ |Ó4Øœ* \´IÀ1Ô4EÕ%EÓFØœJ s›OØ˜Ø�wð	
ˆð 	×Ñð3ð ˜Õ% w¨~Õ'>ÀÈÕ@UÜ˜gÓ&¨°Õ(?ðô	
ð 	×ÑðRà�\Õ"Ð$ô	
ð
 	×Ñ˜J¨lÔLØˆr&   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r    r‡   r­   r´   úlist[sqlite3.Row]r  r-   r€  rz  r!   rK   r"   )r#   s   "r$   r%   rZ   �  s4   € ÷ ñ Ø&ðØ.?ðØORðØejðà	ñr&   c                	ód   € V F)  pV P                  R W$R,          .VOVR,          N54       K+  	  R# )a6  
                    UPDATE counter_aggregates SET packaged_value = value
                    WHERE period_start = ? AND metric_name = ? AND hermes_version = ?
                      AND os_family = ? AND architecture = ? AND install_method = ?
                      AND dimensions_json = ?
                    rŽ   r2  N)rƒ   )r‡   r´   r  r€  r@   s   &&&& r$   r|  Ú!SharedMetricsStore._mark_packaged€  s>   € ó ˆCØ×Ñðð  =Õ1Ð\°OÐ\ÀSÐIZÕE[Ñ\öó r&   c               ó    € V ^8„  d   QhRRRR/# )r    r´   r„  r!   r0  r"   )r#   s   "r$   r%   rZ   �  s   € ÷ %ñ %Ð$5ð %Ð:Nñ %r&   c                ó
  € / pV Fc  pV P                  V4      pVf   K  VR,          \        VR,          4      3pWR9   d%   W%,          R;;,          VR,          ,          uu&   K_  WBV&   Ke  	  \        VP                  4       4      # )zWPackage rows, merging rows a re-bucket folded onto the same dimensions into one metric.rG  rl   r,   )Ú_package_metricr>   ÚlistÚvalues)Úclsr´   Úmergedr@   ÚmetricrÝ   s   &&    r$   r{  Ú#SharedMetricsStore._package_metrics�  sx   € ð 9;ˆÛˆCØ×(Ñ(¨Ó-ˆFØŠ~ÙØ˜&•>¤=°¸Õ1EÓ#FÐGˆCØŒ}Ø•˜G×$¨¨w­Õ7Õ$à$�s“ñ ô �F—M‘M“OÓ$Ð$r&   c               ó    € V ^8„  d   QhRRRR/# )r    r@   rA   r!   rl  r"   )r#   s   "r$   r%   rZ   Ÿ  s   € ÷ 
ñ 
˜[ð 
Ð-Bñ 
r&   c           
     	ó¼  € \        V R ,          4      p\        P                  ! V R,          4      p\        V\        4      '       d   \        W4      '       g   \        RV 24      h\        W4      '       gJ   \        W4      pVf   \        P                  RV4       R# \        P                  RV\        V4      4       TpRVRRR	VR
V R
,          V R,          ,
          /# )rŽ   r2  ró   NzGShared-metric %s row holds a retired value with no bucket; not packagedzlShared-metric %s row drifted out of the contract since it was recorded; packaged with bucketed dimensions %srG  ÚtypeÚcounterrl   r,   r3  )r-   r<   r¯   rŸ   r±   r   r    r   r   r   Úinfor>   )r@   rŽ   rl   Ú	conformeds   &   r$   r‰  Ú"SharedMetricsStore._package_metricž  sÏ   € ä˜#˜mÕ,Ó-ˆÜ—Z’Z Ð$5Õ 6Ó7ˆ
ô
 ˜*¤d×+Ò+Ô3TÐU`×3mÒ3mÜÐIÈ+ÈÐWÓXÐXÜ+¨K×DÒDÜ2°;ÓKˆIØÒ Ü—‘ÐeÐgrÔsÙÜ�K‰Kð7Ø8CÄ]ÐS\ÓE]ôð #ˆJà�K ¨°LÀ*Ø�S˜•\ CÐ(8Õ$9Õ9ð
ð 	
r&   c               ó   € V ^8„  d   QhRR/# rÿ   r"   )r#   s   "r$   r%   rZ   ·  s   € ÷ ñ ¨*ñ r&   c           
     	ó>  € V P                  4       ;_uu_ 4       pVP                  R 4      P                  4       pRRR4       . pX F®  p\        VR,          4      pV P                  V R2,          p\        V\        P                  ! VR,          4      RR	RRR7       V P                  4       ;_uu_ 4       pVP                  R\        \        4       4      V34       RRR4       VP                  V4       K°  	  V#   + '       g   i     LÈ; i  + '       g   i     L:; i)
zmSELECT package_id, payload_json FROM package_outbox WHERE exported_at IS NULL ORDER BY created_at, package_idNrs  ú.jsonÚpayload_jsonTr_   )Úindentr8   r7   rI   zVUPDATE package_outbox SET exported_at = ? WHERE package_id = ? AND exported_at IS NULLr9   )r‚   rƒ   rê   r-   rY   r   r<   r¯   r4   r*   Úappend)rg   r‡   r´   r-  r@   rs  rH   s   &      r$   r+  Ú+SharedMetricsStore._export_pending_packages·  s÷   € Ø×Ñ×Ô :Ø×%Ñ%ðMó÷ ‰h‹jð ÷  ð  "ˆÛˆCÜ˜S Õ.Ó/ˆJØ×(Ñ(¨j¨\¸Ð+?Õ?ˆDÜØ”d—j’j  ^Õ!4Ó5¸dÈzØ Uõð ×!Ñ!×#Ô# zØ×"Ñ"ðDä¤£
Ó+¨ZÐ8ô÷ $ð �O‰O˜DÖ!ñ ð ˆ÷+  ×ú÷ $×#ús   ™ C9Â4&DÃ9D		ÄDr)   c               ó    € V ^8„  d   QhRRRR/# )r    r)   r`  r!   rK   r"   )r#   s   "r$   r%   rZ   Ï  s   € ÷ /ñ /¨_ð /Èñ /r&   c               ó:  € T;'       g    \        4       \        \        R7      ,
          p\        V4      pV P	                  4       ;_uu_ 4       pVP                  RV34      P                  4       pRRR4       . pX FM  p\        VR,          4      p V P                  V R2,          P                  RR7       VP                  V4       KO  	  V P                  4       ;_uu_ 4       pVP                  R
4       V F  pVP                  RWƒ34       K  	  VP                  RVP                  4       P!                  4       34       RRR4       R#   + '       g   i     Lä; i  \         d    \        P                  RTRR	7        EK
  i ; i  + '       g   i     R# ; i)zARemove exported local history after the bounded retention window.rv  zxSELECT package_id FROM package_outbox WHERE exported_at IS NOT NULL AND exported_at < ? ORDER BY exported_at, package_idNrs  r™  T)Ú
missing_okz1Unable to prune expired shared-metrics package %sr  z‡UPDATE package_outbox SET payload_json = '' WHERE exported_at IS NOT NULL AND send_state IN ('sent', 'rejected') AND payload_json != ''z_DELETE FROM package_outbox WHERE package_id = ? AND exported_at IS NOT NULL AND exported_at < ?a�  
                    DELETE FROM counter_aggregates
                    WHERE period_start < ? AND value = packaged_value AND NOT EXISTS (
                        SELECT 1 FROM package_outbox WHERE exported_at IS NULL
                          AND substr(package_outbox.period_start, 1, 10)
                              = counter_aggregates.period_start
                    )
                    )r*   r   Ú_LOCAL_HISTORY_RETENTION_DAYSr4   r‚   rƒ   rê   r-   rY   Úunlinkrœ  rS   r   r!  r’   r•   r1   )	rg   r)   ÚcutoffÚcutoff_timestampr‡   r´   Úremovable_package_idsr@   rs  s	   &$       r$   r,  Ú)SharedMetricsStore._prune_expired_historyÏ  s|  € à×#Ð#œ›¤yÔ6SÔ'TÕTˆÜ% fÓ-ÐØ×Ñ×Ô :Ø×%Ñ%ð4ð "Ð#ó	÷
 ‰h‹jð ÷  ð ,.ÐÛˆCÜ˜S Õ.Ó/ˆJðØ×&Ñ&¨J¨<°uÐ)=Õ=×EÑEÐQUÐEÔVØ%×,Ñ,¨ZÖ8ñ	 ð �[‰[�]Œ]˜jð ×Ñð*ôó
 4�
Ø×"Ñ"ð\àÐ2öñ 4ð ×Ñðð —‘“×(Ñ(Ó*Ð,ô
÷ ‰]÷'  ×ûô ô Ü—‘ØGÈÐ^bð ÷ ð ðú÷
 �]ˆ]ús+   Á"EÂ7EÃ$AF	ÅE	Å#FÆFÆ	F	)rb   re   rf   rX   rY   )NN)é   )0Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ri   rq   rx   r}   r‰   rv   ro   rª   r¨   r¿   rÆ   rË   rÒ   rß   r¼   rÅ   Ústaticmethodr‘   r”   r  r¡   rJ  r  r'  r  r4  r   r%  r‚   r’   ra   r“   r…   r&  r  rh  r|  Úclassmethodr{  r‰  r+  r,  Ú__static_attributes__r"   r&   r$   rV   rV   º   sg  † ÙK÷$õFõ
õ
õTõ÷Bõ	jõ
õ46õwõ4õzõ
õ*Cõð$ ôKó ðKð ö
ó ð
õ (õð* 5L÷ nõ(õõ
ð* ð
Ø(8ö
ó ð
ð ð!Ð/?ö !ó ð!õ#õJ!ð ôIó ðIõõOõ<ð| ôó ðð ô%ó ð%ð ô
ó ð
õ0ð0/¸t÷ /ó /r&   rV   )Úhermes_versionÚ	os_familyÚarchitectureÚinstall_method)zÒ
            CREATE TABLE IF NOT EXISTS send_consent_windows (
                opened_at TEXT NOT NULL,
                last_confirmed_at TEXT NOT NULL,
                closed_at TEXT
            )
            z½
            CREATE TABLE IF NOT EXISTS consent_marks (
                name TEXT PRIMARY KEY CHECK (name IN ('obs', 'data')),
                stamp TEXT NOT NULL
            )
            ))Úsent_atÚTEXT)Ú
send_staterµ  )Úsend_attemptszINTEGER NOT NULL DEFAULT 0)Únext_attempt_atrµ  )Ú
last_errorrµ  )Úsent_install_idrµ  )Úclaim_tokenrµ  )Hr¬  Ú
__future__r   r  r<   Úloggingr  rc   r[  Úcollections.abcr   r   Ú
contextlibr   r   r   r   r	   Úpathlibr
   Útypingr   Úhermes_cli.sqlite_utilr   r   Úhermes_constantsr   Úutilsr   Úshared_metrics_contractr   r   r   r   r   r   r   r   r   Úshared_metrics_driftr   r   r}  rM  r%  rJ  r  r¡  rw   r|   r½   rÊ   r×   r†   rD   rK  rO  rP  rR  rL  r  rü   rQ  Ú	getLoggerr¨  r   r*   r4   r>   rF   rT   rV   r"   r&   r$   Ú<module>rÈ     s-  ðÙ Eå "ã Û Û Û Û Û ß .Ý %ß 7Ó 7Ý Ý ç CÝ ,Ý #÷
÷ 
õ 
÷ `ð 5Ð ØÐ ØÐ ØÐ àÐ Ø "Ð Ø7Ð Ø<Ð Ø&Ð Ø"Ð Ø(Ð Ù$¨2Ô.Ð àUÐ ðÐ ð"Ð ð"	Ð ðÐ ð" EØ"ð	ð 'ð€ðÐ ð
Ð ð€ð$ 
×	Ò	˜8Ó	$€õõDõDõAõ÷D	ó D	r&   