+
    ÞDjh=  ã            
       óÂ  € R t ^ RIt^ RIt^ RIHtHtHtHtHt ^ RI	H
t
HtHtHt ^ RIHtHtHtHt ]! R]4      tR]R]R]R	]R
]P*                  P,                  /tR tR t]P5                  RR.R7      R 4       t]P5                  RRR.R7      R 4       t]P5                  RRR.R7      R 4       t]P5                  RRR.R7      R 4       t]P5                  R4      R 4       t]P5                  R4      R 4       t ]P5                  RRR.R7      R 4       t!]P5                  RR .R7      R! 4       t"]P5                  R"4      R# 4       t#]P5                  R$R .R7      R% 4       t$R# )&zK
Moisture Meter: receives readings from ESP32, stores in MySQL shop_stats.
N)Ú	BlueprintÚrequestÚjsonifyÚrender_templateÚResponse)Úbattery_stateÚensure_alert_state_tableÚevaluate_and_notifyÚmoisture_state)Ú
MYSQL_HOSTÚ
MYSQL_USERÚMYSQL_PASSWORDÚMYSQL_DATABASEÚmoistureÚhostÚuserÚpasswordÚdatabaseÚcursorclassc                  ó6   € \         P                  ! R/ \        B # )N© )ÚpymysqlÚconnectÚ	DB_CONFIGr   ó    Ú;/workplace/Workspace/Software/Server/blueprints/moisture.pyÚget_dbr      s   € Ü�?Š?Ñ'œYÑ'Ð'r   c                 óª  € V P                  4       ;_uu_ 4       pVP                  R 4        VP                  R4        VP                  R4        VP                  R4       VP                  R4        VP                  R4        VP                  R4       RRR4       V P	                  4        \        V 4       R#   \        P                   d     L•i ; i  \        P                   d     Lži ; i  \        P                   d     L§i ; i  \        P                   d     LŸi ; i  \        P                   d     L¨i ; i  + '       g   i     L´; i)a°  
            CREATE TABLE IF NOT EXISTS MoistureLevel (
                id INT AUTO_INCREMENT PRIMARY KEY,
                device_id VARCHAR(16) NOT NULL,
                node_name VARCHAR(50) DEFAULT NULL,
                moisture INT NOT NULL,
                battery_voltage FLOAT NOT NULL,
                command VARCHAR(20) DEFAULT 'sleep',
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        zHALTER TABLE MoistureLevel ADD COLUMN command VARCHAR(20) DEFAULT 'sleep'zGALTER TABLE MoistureLevel ADD COLUMN node_name VARCHAR(50) DEFAULT NULLzNALTER TABLE MoistureLevel ADD COLUMN firmware_version VARCHAR(24) DEFAULT NULLa/  
            CREATE TABLE IF NOT EXISTS device_command (
                device_id VARCHAR(16) PRIMARY KEY,
                command VARCHAR(20) NOT NULL DEFAULT 'sleep',
                new_device_id VARCHAR(16) DEFAULT NULL,
                new_node_name VARCHAR(50) DEFAULT NULL
            )
        zLALTER TABLE device_command ADD COLUMN new_device_id VARCHAR(16) DEFAULT NULLzLALTER TABLE device_command ADD COLUMN new_node_name VARCHAR(50) DEFAULT NULLN)ÚcursorÚexecuter   ÚOperationalErrorÚcommitr   )ÚconnÚcurs   & r   Úensure_tablesr$      s.  € Ø	�‰�Œ˜#Ø�‰ð 
ô 
	ð	Ø�K‰KÐbÔcð	Ø�K‰KÐaÔbð	Ø�K‰KÐhÔið 	�‰ð ô 	ð	Ø�K‰KÐfÔgð	Ø�K‰KÐfÔg÷K 
ðP 	‡K�K„MÜ˜TÖ"øô7 ×'Ñ'ô 	Ùð	ûô ×'Ñ'ô 	Ùð	ûô ×'Ñ'ô 	Ùð	ûô ×'Ñ'ô 	Ùð	ûô ×'Ñ'ô 	Ùð	ú÷M 
�ús¥   ™E¬B;¾CÁC1Á!EÁ3DÂD'Â;CÃEÃCÃEÃC.Ã+EÃ-C.Ã.EÃ1D	ÄEÄD	Ä	EÄD$Ä!EÄ#D$Ä$EÄ'D?Ä<EÄ>D?Ä?EÅE	z/readingÚPOST)Úmethodsc                  óB	  €  \         P                  ! R R R7      p V '       g   \        RRRR/4      R3# V P                  R4      pV P                  R4      pV P                  R	4      pV P                  R
4      pV P                  R4      pV P                  R4      pVe	   Ve   Vf   \        RRRR/4      R3# \	        V\
        4      '       d   VP                  4       '       g   \        RRRR/4      R3# VP                  4       R,          p\	        V\
        4      '       d   TMRP                  4       R,          ;'       g    Rp \        V4      p \        T4      p\	        T\
        4      '       d   TMRP                  4       R,          ;'       g    Rp\        4       p \        T4       TP                  4       ;_uu_ 4       pTP                  RT34       TP                  4       p	T	'       d
   T	R,          MRP                  4       P!                  4       p
T
R-9  d   Rp
T	'       d1   T	P                  R4      ;'       g    RP                  4       R,          MRpT	'       d1   T	P                  R4      ;'       g    RP                  4       R,          MRpTP                  RYY4Y¦34       T'       d   TMTpT'       d   TMT;'       g    RpT'       d   TP                  RT34       T'       d   TP                  RT34       T
R8X  d   TP                  R T34       \#        T4      p\%        TR	TR	TR!T;'       g    T R"T 2R#7       \'        T4      pT'       d#   \%        TR	TR$TR%T;'       g    T R&T R'2R#7       RRR4       TP)                  4        TP+                  4        \,        P.                  ! RR RX
RXRX/R.R(7      p\1        T^ÈR)R*7      #   \        \        3 d    \        RRRR/4      R3u # i ; i  \        \        3 d    \        RRRR/4      R3u # i ; i  + '       g   i     L®; i  TP+                  4        i ; i  \2        P4                   d    \        RRRR+/4      R,3u # \6         d%   p\        RRR\        T4      /4      R,3u Rp?# Rp?ii ; i)/T©ÚforceÚsilentÚokFÚerrorzInvalid or missing JSONé�  Ú	device_idÚ	node_namer   Úbattery_voltageÚbattery_percentÚfirmware_versionNz/Missing device_id, moisture, or battery_voltagez$device_id must be a non-empty stringºNé   NÚ ºNé2   Nzmoisture must be a numberz battery_voltage must be a number:Né   NúUSELECT command, new_device_id, new_node_name FROM device_command WHERE device_id = %sÚcommandÚnosleepÚrebootÚnew_device_idÚnew_node_namez†INSERT INTO MoistureLevel (device_id, node_name, moisture, battery_voltage, command, firmware_version) VALUES (%s, %s, %s, %s, %s, %s)ÚNodezCUPDATE device_command SET new_device_id = NULL WHERE device_id = %szCUPDATE device_command SET new_node_name = NULL WHERE device_id = %szBUPDATE device_command SET command = 'nosleep' WHERE device_id = %sz&SolarMon alert: moisture low (dry) on z. Moisture=)r"   Úsource_typeÚ	source_idÚmetricÚcurrent_stateÚalert_messageÚbatteryzSolarMon alert: battery low on z
. Battery=Ú%)Ú
separatorszapplication/json)ÚstatusÚmimetypeúDatabase erroréô  ©Úsleepr;   r<   )Ú,Ú:)r   Úget_jsonr   ÚgetÚ
isinstanceÚstrÚstripÚintÚ	TypeErrorÚ
ValueErrorÚfloatr   r$   r   r   ÚfetchoneÚlowerr
   r	   r   r!   ÚcloseÚjsonÚdumpsr   r   ÚErrorÚ	Exception)Údatar.   r/   r   r0   r1   r2   r"   r#   ÚrowÚcurrent_commandr=   r>   Úresp_device_idÚresp_node_nameÚmoist_stateÚ
batt_stateÚbodyÚes                      r   Úreadingri   L   st  € ðj<Ü×Ò d°4Ô8ˆßÜ˜D %¨Ð2KÐLÓMÈsÐRÐRà—H‘H˜[Ó)ˆ	Ø—H‘H˜[Ó)ˆ	Ø—8‘8˜JÓ'ˆØŸ(™(Ð#4Ó5ˆØŸ(™(Ð#4Ó5ˆØŸ8™8Ð$6Ó7ÐàÒ Ò 0°OÒ4KÜ˜D %¨Ð2cÐdÓeÐgjÐjÐjä˜)¤S×)Ò)°·±×1BÒ1BÜ˜D %¨Ð2XÐYÓZÐ\_Ð_Ð_Ø—O‘OÓ% cÕ*ˆ	Ü",¨Y¼×"<Ò"<‘YÀ"×KÑKÓMÈcÕR×ZÐZÐVZˆ	ð	UÜ˜8“}ˆHð	\Ü# OÓ4ˆOô 1;Ð;KÌS×0QÒ0QÑ,ÐWY×`Ñ`ÓbÐcfÕg×oÐoÐkoÐä‹xˆð>	Ü˜$ÔØ—‘—” #Ø—‘ØkØ�Lôð —l‘l“n�ß58 3 y¦>¸i×"NÑ"NÓ"P×"VÑ"VÓ"X�Ø"Ð*HÔHØ&/�OßQT §¡¨Ó!9×!?Ð!?¸R× FÑ FÓ HÈÖ MÐZ^�ßQT §¡¨Ó!9×!?Ð!?¸R× FÑ FÓ HÈÖ MÐZ^�Ø—‘ð ]Ø¨8ÀoÐhô÷ 3@¡ÀY�ß2?¡Ài×FYÐFYÐSY�ß Ø—K‘KØ]Ø"˜ô÷ !Ø—K‘KØ]Ø"˜ôð
 # hÔ.Ø—K‘KØ\Ø"˜ôô -¨XÓ6�Ü#ØØ *Ø'Ø%Ø"-à@À×AWÐAWÈiÐ@Xð Y$Ø$, :ð/õ
ô +¨?Ó;�
ßÜ'Ø!Ø$.Ø"+Ø(Ø&0à=¸i×>TÐ>TÈ9Ð=Uð V'Ø'6Ð&7°qð:õ
÷_ ðt �K‰KŒMà�J‰JŒLô �zŠzØ�4˜ O°[À.ÐR]Ð_mÐnØ!ô
ˆô ˜ SÐ3EÔFÐFøôa œ:Ð&ô 	UÜ˜D %¨Ð2MÐNÓOÐQTÐTÒTð	Uûô
 œ:Ð&ô 	\Ü˜D %¨Ð2TÐUÓVÐX[Ð[Ò[ð	\ú÷ —ûðx �J‰J�Lûô �=‰=ô FÜ˜˜e WÐ.>Ð?Ó@À#ÐEÒEÜô <Ü˜˜e W¬c°!«fÐ5Ó6¸Ð;Õ;ûð<ús  ‚Q ¢Q ³BQ Â6+Q Ã"Q Ã3AQ Å Q ÅO ÅO8 Å5Q ÆQ Æ#P3 ÇA#P È&P È>!P É P É8AP Ê;
P Ë
P ËP Ë,AP Ì83P Í,P Í:P3 Î=Q Ï"O5Ï2Q Ï4O5Ï5Q Ï8"PÐQ ÐPÐQ Ð P0	Ð+P3 Ð3QÑQ Ñ&RÑ0RÑ9RÑ:RÒRÒRz/device/<device_id>/commandÚPUTc           	     ó@  €  \         P                  ! RRR7      ;'       g    / pVP                  R4      ;'       g    RP                  4       P	                  4       pVR9  d   \        RRRR/4      R	3# V P                  4       R
,          p V '       g   \        RRRR/4      R	3# \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  RWV34       RRR4       VP                  4        VP                  4        \        RRRV/4      ^È3#   + '       g   i     LA; i  TP                  4        i ; i  \        P                   d    \        RRRR/4      R3u # \         d%   p\        RRR\        T4      /4      R3u Rp?# Rp?ii ; i)zESet command for device: body {"command": "sleep"|"nosleep"|"reboot"}.Tr(   r:   r5   r+   Fr,   z/command must be 'sleep', 'nosleep', or 'reboot'r-   r3   úinvalid device_idzdINSERT INTO device_command (device_id, command) VALUES (%s, %s) ON DUPLICATE KEY UPDATE command = %sNrJ   rK   rL   )r   rP   rQ   rT   rZ   r   r   r$   r   r   r!   r[   r   r^   r_   rS   )r.   r`   Úcmdr"   r#   rh   s   &     r   Úset_commandrn   »   sl  € ð<Ü×Ò d°4Ô8×>Ð>¸BˆØ�x‰x˜	Ó"×(Ð( b×/Ñ/Ó1×7Ñ7Ó9ˆØÐ4Ô4Ü˜D %¨Ð2cÐdÓeÐgjÐjÐjØ—O‘OÓ% cÕ*ˆ	ßÜ˜D %¨Ð2EÐFÓGÈÐLÐLÜ‹xˆð		Ü˜$ÔØ—‘—” #Ø—‘ØzØ SÐ)ô÷ ð
 �K‰KŒMà�J‰JŒLÜ˜˜d I¨sÐ3Ó4°cÐ9Ð9÷ —ûð �J‰J�Lûä�=‰=ô FÜ˜˜e WÐ.>Ð?Ó@À#ÐEÒEÜô <Ü˜˜e W¬c°!«fÐ5Ó6¸Ð;Õ;ûð<úsu   ‚E ¡E ¼6E Á3E ÂE Â#
E Â.#D2 ÃDÃ&D2 Ã> E ÄD/	Ä*D2 Ä2EÅE Å&FÅ/FÅ8FÅ9FÆFÆFz/device/<device_id>/device_idc           	     ó8  €  \         P                  ! RRR7      ;'       g    / pVP                  R4      ;'       g    RP                  4       R,          pV'       g   \	        RRRR	/4      R
3# V P                  4       R,          p V '       g   \	        RRRR/4      R
3# \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  RWV34       RRR4       VP                  4        VP                  4        \	        RRRV RV/4      ^È3#   + '       g   i     LC; i  TP                  4        i ; i  \        P                   d    \	        RRRR/4      R3u # \         d%   p\	        RRR\        T4      /4      R3u Rp?# Rp?ii ; i)zVAssign new device ID: body {"device_id": "M001"}. Device will pick it up on next POST.Tr(   r.   r5   r3   r+   Fr,   zdevice_id requiredr-   úinvalid device_id in URLz„INSERT INTO device_command (device_id, command, new_device_id) VALUES (%s, 'nosleep', %s) ON DUPLICATE KEY UPDATE new_device_id = %sNÚ
current_idÚnew_idrJ   rK   ©r   rP   rQ   rT   r   r   r$   r   r   r!   r[   r   r^   r_   rS   )r.   r`   rr   r"   r#   rh   s   &     r   Úset_device_idrt   Ø   sj  € ð<Ü×Ò d°4Ô8×>Ð>¸BˆØ—(‘(˜;Ó'×-Ð-¨2×4Ñ4Ó6°sÕ;ˆßÜ˜D %¨Ð2FÐGÓHÈ#ÐMÐMØ—O‘OÓ% cÕ*ˆ	ßÜ˜D %¨Ð2LÐMÓNÐPSÐSÐSÜ‹xˆð		Ü˜$ÔØ—‘—” #Ø—‘ð [Ø¨Ð/ô÷ ð
 �K‰KŒMà�J‰JŒLÜ˜˜d L°)¸XÀvÐNÓOÐQTÐTÐT÷ —ûð �J‰J�Lûä�=‰=ô FÜ˜˜e WÐ.>Ð?Ó@À#ÐEÒEÜô <Ü˜˜e W¬c°!«fÐ5Ó6¸Ð;Õ;ûð<úó{   ‚E ¡E ¼E ÁE Á-E ÂE Â
E Â(#D. ÃDÃ D. Ã8"E ÄD+	Ä&D. Ä.E Å E Å&FÅ+FÅ4FÅ5FÆFÆFz/device/<device_id>/node_namec           	     ó8  €  \         P                  ! RRR7      ;'       g    / pVP                  R4      ;'       g    RP                  4       R,          pV'       g   \	        RRRR	/4      R
3# V P                  4       R,          p V '       g   \	        RRRR/4      R
3# \        4       p \        V4       VP                  4       ;_uu_ 4       pVP                  RWV34       RRR4       VP                  4        VP                  4        \	        RRRV RV/4      ^È3#   + '       g   i     LC; i  TP                  4        i ; i  \        P                   d    \	        RRRR/4      R3u # \         d%   p\	        RRR\        T4      /4      R3u Rp?# Rp?ii ; i)zlAssign new node name: body {"node_name": "Living Room"}. Device will pick it up on next POST (max 50 chars).Tr(   r/   r5   r6   r+   Fr,   znode_name requiredr-   r3   rp   z„INSERT INTO device_command (device_id, command, new_node_name) VALUES (%s, 'nosleep', %s) ON DUPLICATE KEY UPDATE new_node_name = %sNrq   r>   rJ   rK   rs   )r.   r`   Únew_namer"   r#   rh   s   &     r   Úset_node_namerx   õ   sj  € ð<Ü×Ò d°4Ô8×>Ð>¸BˆØ—H‘H˜[Ó)×/Ð/¨R×6Ñ6Ó8¸Õ=ˆßÜ˜D %¨Ð2FÐGÓHÈ#ÐMÐMØ—O‘OÓ% cÕ*ˆ	ßÜ˜D %¨Ð2LÐMÓNÐPSÐSÐSÜ‹xˆð		Ü˜$ÔØ—‘—” #Ø—‘ð [Ø¨(Ð3ô÷ ð
 �K‰KŒMà�J‰JŒLÜ˜˜d L°)¸_ÈhÐWÓXÐZ]Ð]Ð]÷ —ûð �J‰J�Lûä�=‰=ô FÜ˜˜e WÐ.>Ð?Ó@À#ÐEÒEÜô <Ü˜˜e W¬c°!«fÐ5Ó6¸Ð;Õ;ûð<úru   z/api/readingsc                 óf  € \        \        \        P                  P	                  R^d4      4      R4      p  \        4       p VP                  4       ;_uu_ 4       pVP                  RV 34       VP                  4       pV F6  pVP	                  R4      '       g   K  VR,          P                  4       VR&   K8  	  RRR4       \        RRRX/4      VP                  4        #   + '       g   i     L/; i  TP                  4        i ; i  \        P                   d    \        RR	R
R/4      R3u # i ; i)z-Return recent moisture readings (latest 100).ÚlimitrK   zŽSELECT id, device_id, node_name, moisture, battery_voltage, command, firmware_version, created_at FROM MoistureLevel ORDER BY id DESC LIMIT %sÚ
created_atNr+   TÚreadingsFr,   rJ   )ÚminrU   r   ÚargsrQ   r   r   r   ÚfetchallÚ	isoformatr   r[   r   r^   )rz   r"   r#   ÚrowsÚrs        r   Úapi_readingsrƒ     sû   € ô ””G—L‘L×$Ñ$ W¨cÓ2Ó3°SÓ9€EðFÜ‹xˆð	Ø—‘—” #Ø—‘ð eØ�Hôð —|‘|“~�Û�AØ—u‘u˜\×*Ô*Ø*+¨L­/×*CÑ*CÓ*E˜˜,›ñ ÷ ô ˜D $¨
°DÐ9Ó:à�J‰J�L÷ —ûð �J‰J�LûÜ�=‰=ô FÜ˜˜e WÐ.>Ð?Ó@À#ÐEÒEðFúsG   µ
D Á C2 Á=CÂCÂ8C2 ÃD ÃC/	Ã*C2 Ã2DÄD Ä&D0Ä/D0z/api/readings/latestc                 óü  €  \        4       p  V P                  4       ;_uu_ 4       pVP                  R4       VP                  4       pV F6  pVP	                  R4      '       g   K  VR,          P                  4       VR&   K8  	  RRR4       \        RRRX/4      V P                  4        #   + '       g   i     L/; i  T P                  4        i ; i  \        P                   d    \        RRRR	/4      R
3u # i ; i)z-Return the latest reading per device_id only.a	  
                    SELECT m.id, m.device_id, m.node_name, m.moisture, m.battery_voltage, m.command, m.firmware_version, m.created_at
                    FROM MoistureLevel m
                    INNER JOIN (
                        SELECT device_id, MAX(id) AS max_id FROM MoistureLevel GROUP BY device_id
                    ) latest ON m.device_id = latest.device_id AND m.id = latest.max_id
                    WHERE m.created_at >= NOW() - INTERVAL 20 MINUTE
                    ORDER BY m.device_id
                r{   Nr+   Tr|   Fr,   rJ   rK   )
r   r   r   r   rQ   r€   r   r[   r   r^   )r"   r#   r�   r‚   s       r   Úapi_readings_latestr…   )  sÑ   € ðFÜ‹xˆð	Ø—‘—” #Ø—‘ð ô ð —|‘|“~�Û�AØ—u‘u˜\×*Ô*Ø*+¨L­/×*CÑ*CÓ*E˜˜,›ñ ÷ ô ˜D $¨
°DÐ9Ó:à�J‰J�L÷! —ûð  �J‰J�LûÜ�=‰=ô FÜ˜˜e WÐ.>Ð?Ó@À#ÐEÒEðFúsE   ‚
C �B= ¥;B*Á%B*ÂB= ÂC Â*B:	Â5B= Â=CÃC Ã&C;Ã:C;z/api/readings/clear-oldÚDELETEc                 ó  €  \         P                  P                  R^\        R7      p \	        ^\        V R4      4      p \        4       p VP                  4       ;_uu_ 4       pVP                  RV 34       VP                  pRRR4       VP                  4        \        RRRX/4      ^È3VP                  4        #   + '       g   i     LA; i  TP                  4        i ; i  \        P                   d    \        RR	R
R/4      R3u # i ; i)zLDelete records older than the given days (default 1). Returns count deleted.Údays)Útypeim  zDDELETE FROM MoistureLevel WHERE created_at < NOW() - INTERVAL %s DAYNr+   TÚdeletedFr,   rJ   rK   )r   r~   rQ   rU   Úmaxr}   r   r   r   Úrowcountr!   r   r[   r   r^   )rˆ   r"   r#   rŠ   s       r   Úapi_readings_clear_oldr�   D  sÞ   € ðFÜ�|‰|×Ñ ¨´ÐÓ4ˆÜ�1”c˜$ “nÓ%ˆÜ‹xˆð
	Ø—‘—” #Ø—‘ØZØ�Gôð Ÿ,™,�÷ ð �K‰KŒMÜ˜D $¨	°7Ð;Ó<¸cÐAà�J‰J�L÷ —ûð �J‰J�LûÜ�=‰=ô FÜ˜˜e WÐ.>Ð?Ó@À#ÐEÒEðFúsB   ‚AC" Á	C Á! B:Â(C Â)C" Â:C
	ÃC ÃCÃC" Ã"&DÄ
Dz/api/device/<device_id>/commandÚGETc                ój  € V P                  4       R,          p V '       g   \        RRRR/4      R3#  \        4       p \        V4       VP	                  4       ;_uu_ 4       pVP                  RV 34       VP                  4       pV'       d
   VR,          MR	P                  4       P                  4       pVR9  d   R	pV'       d*   VP                  R
4      ;'       g    RP                  4       MRpV'       d*   VP                  R4      ;'       g    RP                  4       MRpRRR4       \        RRRXR
X;'       g    RRX;'       g    R/4      VP                  4        #   + '       g   i     LG; i  TP                  4        i ; i  \        P                   d    \        RRRR/4      R3u # i ; i)z?Return current command for device (for dashboard toggle state).r3   r+   Fr,   rl   r-   r9   r:   r;   r=   r5   Nr>   TrJ   rK   rL   )rT   r   r   r$   r   r   rY   rZ   rQ   r[   r   r^   )r.   r"   r#   ra   r:   r=   r>   s   &      r   Úget_device_commandr�   Z  s„  € ð —‘Ó! #Õ&€IßÜ˜˜e WÐ.AÐBÓCÀSÐHÐHðFÜ‹xˆð	Ü˜$ÔØ—‘—” #Ø—‘ØkØ�Lôð —l‘l“n�ß-0˜3˜yž>°i×FÑFÓH×NÑNÓP�ØÐ"@Ô@Ø'�GßLO §¡¨Ó!9×!?Ð!?¸R× FÑ FÔ HÐUY�ßLO §¡¨Ó!9×!?Ð!?¸R× FÑ FÔ HÐUY�÷ ô ˜D $¨	°7¸OÈ]×MbÐMbÐ^bÐdsð  vC÷  vKð  vKð  GKð  Ló  Mà�J‰J�L÷ —ûð �J‰J�LûÜ�=‰=ô FÜ˜˜e WÐ.>Ð?Ó@À#ÐEÒEðFúse   ²
F	 ½#E4 Á A#E!ÃE!ÃE!Ã7E!ÄE!Ä"E4 Ä=E4 Å	E4 ÅF	 Å!E1	Å,E4 Å4FÆF	 Æ	&F2Æ1F2Ú/c                  ó   € \        R 4      # )zmoisture/dashboard.html)r   r   r   r   Ú	dashboardr“   v  s   € äÐ4Ó5Ð5r   z/healthc                  ó    € \        R R/4      ^È3# )r+   T)r   r   r   r   Úhealthr•   {  s   € ä�D˜$�<Ó  #Ð%Ð%r   )%Ú__doc__r\   r   Úflaskr   r   r   r   r   Úblueprints.alertsr   r   r	   r
   Úconfigr   r   r   r   Ú__name__ÚbpÚcursorsÚ
DictCursorr   r   r$   Úrouteri   rn   rt   rx   rƒ   r…   r�   r�   r“   r•   r   r   r   Ú<module>rŸ      s×  ðñó Û ß HÕ H÷ó ÷ JÓ Iáˆz˜8Ó$€ð ˆJØ
ˆJØ�Ø�Ø�7—?‘?×-Ñ-ð€	ò(ò*#ðZ ‡�ˆ*˜v˜h€Ó'ñk<ó (ðk<ð\ ‡�Ð
'°%¸°€ÓAñ<ó Bð<ð8 ‡�Ð
)°E¸6°?€ÓCñ<ó Dð<ð8 ‡�Ð
)°E¸6°?€ÓCñ<ó Dð<ð8 ‡�ˆ/ÓñFó ðFð, ‡�Ð
 Ó!ñFó "ðFð4 ‡�Ð
#¨f°hÐ-?€Ó@ñFó AðFð* ‡�Ð
+°e°W€Ó=ñFó >ðFð6 ‡�ˆ#ƒñ6ó ð6ð ‡�ˆ)˜e˜W€Ó%ñ&ó &ò&r   