§
    ža3jŸ´  ã                   ó  — d dl Z d dlmZ d dlmZ d dlmZmZ d dlZd dlZd dlZd dl	Z	d dl
Z
 ej        d¦  «        Zd„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd"d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd#d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d „ Z$d!„ Z%dS )$é    N)Úcheck_password_hash)Úgenerate_password_hash)ÚdatetimeÚ	timedeltazAsia/Taipeic                  ó4   — t          j        t          ¦  «        S ©N)r   ÚnowÚtw_tz© ó    ú+/home/mmwave/public_html/mmwave/database.pyÚget_nowr      s   € ÝŒ<�ÑÔÐr   c            	      óV   — t          j        dddddt           j        j        d¬¦  «        S )NÚ	localhostÚwebuserÚU1224006Ú	mmwave_v4Úutf8mb4zSET time_zone = "+08:00")ÚhostÚuserÚpasswordÚdatabaseÚcharsetÚcursorclassÚinit_command)ÚpymysqlÚconnectÚcursorsÚ
DictCursorr   r   r   Úget_db_connectionr       s5   € ÝŒ?ØØØØØÝ”OÔ.Ø/ðñ ô ð r   c                 ó   — | dv s|dv rdS 	 t          | ¦  «        }t          |¦  «        }t          j        d¦  «        dz  }d||z
  |z  z   }||z   |z  }|dk     s|dk    s|dk     s|dk    rdS d|cxk    rdk    rn nd|cxk    rdk    rn ndS d	|cxk    rdk    rn nd|cxk    rd	k    rn nd
S d	|cxk    rdk    rn nd	|cxk     rdk    rn ndS dS # t          $ r}t	          d|› �¦  «         Y d}~dS d}~ww xY w)u‘   
    æ ¹æ“š 304 æ•™å®¤çš„åº§æ¨™åˆ¤æ–·æ‰€åœ¨å�€å¡Šã€‚
    å°‡å�³ä¸‹è§’é›·é�”çš„ (x, y) è½‰æ�›ç‚ºä»¥ã€Œå·¦ä¸‹è§’ã€�ç‚ºåŽŸé»žçš„çµ•å°�åº§æ¨™ã€‚
    )Nú---Ú ÚNULLÚnanu   ç„¡äººé   çÍÌÌÌÌÌ@r   g333333ó?g333333ã?õ   æ²™ç™¼gÍÌÌÌÌÌü?õ   æ›¸æˆ¿õ	   è¡£å¸½é–“õ   è‡¥å®¤u   å�€å¡Šåˆ¤æ–·éŒ¯èª¤: N)ÚfloatÚmathÚsqrtÚ	ExceptionÚprint)Úx_strÚy_strÚx_radÚy_radÚcos45Úroom_xÚroom_yÚes           r   Úget_zone_namer9      s¼  € ð
 Ð0Ð0Ð0°EÐ=]Ð4]Ð4]Øˆxð1Ý�e‘”ˆÝ�e‘”ˆõ ”	˜!‘”˜qÑ ˆð ˜ ™¨Ñ.Ñ.ˆØ˜%‘- 5Ñ(ˆð �AŠ:ˆ:˜ #š˜¨°!ª¨°vÀ²|°|Ø�8ð& �ÐÐÒÐ˜#ÒÐÐÐÐ ! vÐ"4Ð"4Ò"4Ð"4°Ò"4Ð"4Ð"4Ð"4Ð"4Ø�8Ø�FÐ!Ð!Ò!Ð!˜cÒ!Ð!Ð!Ð!Ð! a¨6Ð&8Ð&8Ò&8Ð&8°SÒ&8Ð&8Ð&8Ð&8Ð&8Ø�8Ø�FÐ!Ð!Ò!Ð!˜cÒ!Ð!Ð!Ð!Ð! c¨FÐ&9Ð&9Ò&9Ð&9°cÒ&9Ð&9Ð&9Ð&9Ð&9Ø�;à�8øåð ð ð ÝÐ( QÐ(Ð(Ñ)Ô)Ð)Øˆxˆxˆxˆxˆxøøøøðøøøs*   ŒA C Á. C Â C Â2 C Ã
C=Ã C8Ã8C=c                 óÞ  — t          ¦   «         }	 |                     ¦   «         5 }d}|                     || f¦  «         |                     ¦   «         }|�r~|d         }d}|                     d¦  «        r}|                     ddd¦  «        }	 t          j        |                     d¦  «        |                     d¦  «        ¦  «        }n´# t          $ r}	t          d|	› �¦  «         Y d }	~	n“d }	~	ww xY w|                     d	¦  «        rf	 t          j        |                     d¦  «        |                     d¦  «        ¦  «        }n9# t          $ r}	t          d
|	› �¦  «         Y d }	~	nd }	~	ww xY wt          ||¦  «        }|rUd}
|                     |
|d         f¦  «         |                     ¦   «          |cd d d ¦  «         |                     ¦   «          S 	 d d d ¦  «         |                     ¦   «          d S # 1 swxY w Y   n># t          $ r1}	t          d|	› �¦  «         Y d }	~	|                     ¦   «          d S d }	~	ww xY w	 |                     ¦   «          d S # |                     ¦   «          w xY w)Nz9SELECT * FROM users WHERE username = %s AND is_active = 1Úpassword_hashFz$2y$z$2b$é   zutf-8u   Bcrypt ($2y$) é©—è­‰å¤±æ•—: z$2u   Bcrypt é©—è­‰å¤±æ•—: z6UPDATE users SET last_login = NOW() WHERE user_id = %sÚuser_idu   é©—è­‰ç¨‹åº�å‡ºéŒ¯: )r    ÚcursorÚexecuteÚfetchoneÚ
startswithÚreplaceÚbcryptÚcheckpwÚencoder/   r0   r   ÚcommitÚclose)Úusernamer   Údbr>   Úsqlr   Ústored_hashÚis_validÚadjusted_hashr8   Ú
update_sqls              r   Úverify_userrO   V   s  € Ý	Ñ	Ô	€Bð/Ø�YŠY‰[Œ[ð )	˜FØMˆCØ�NŠN˜3  Ñ,Ô,Ð,Ø—?’?Ñ$Ô$ˆDàñ " Ø" ?Ô3�Ø �ð ×)Ò)¨&Ñ1Ô1ð Jà$/×$7Ò$7¸ÀÈÑ$JÔ$J�MðBå#)¤>Ø$ŸOšO¨GÑ4Ô4Ø)×0Ò0°Ñ9Ô9ñ$ô $˜˜øõ %ð Bð Bð BÝÐ@¸QÐ@Ð@ÑAÔAÐAÐAÐAÐAÐAÐAøøøøðBøøøð !×+Ò+¨DÑ1Ô1ð Jð;Ý#)¤>Ø$ŸOšO¨GÑ4Ô4Ø'×.Ò.¨wÑ7Ô7ñ$ô $˜˜øõ %ð ;ð ;ð ;ÝÐ9°aÐ9Ð9Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:øøøøð;øøøõ
  3°;ÀÑIÔI�Hàð  Ø!Y�JØ—N’N :°°Y´Ð/AÑBÔBÐBØ—I’I‘K”K�KØðO)	ð )	ð )	ð )	ñ )	ô )	ð )	ð\ 	�Š‰
Œ
ˆ
ˆ
ð ðS)	ð )	ð )	ñ )	ô )	ð )	ð\ 	�Š‰
Œ
ˆ
ˆ
ˆ
ð])	ð )	ð )	ð )	øøøð )	ð )	ð )	ð )	ð )	øõT ð ð ð ÝÐ( QÐ(Ð(Ñ)Ô)Ð)Øˆtˆtˆtà
�Š‰
Œ
ˆ
ˆ
ˆ
øøøøð	øøøðU)	ð\ 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøs´   �H ¤A'G5Â;CÃG5Ã
C.ÃC)Ã$G5Ã)C.Ã.G5Ä;EÅG5Å
E)ÅE$ÅG5Å$E)Å)A	G5Æ2H ÇG5ÇH Ç5G9Ç9H Ç<G9Ç=H È I È
H<ÈH7ÈI È7H<È<I ÉI,c                 ó¦  — |dvrdS t          ¦   «         }	 |                     ¦   «         5 }|                     d| f¦  «         |                     ¦   «         r"	 d d d ¦  «         |                     ¦   «          dS t          |¦  «        }d}|                     || |||f¦  «         |                     ¦   «          	 d d d ¦  «         |                     ¦   «          dS # 1 swxY w Y   n># t          $ r1}t          d|› �¦  «         Y d }~|                     ¦   «          dS d }~ww xY w	 |                     ¦   «          d S # |                     ¦   «          w xY w)	N)ÚfamilyÚ	caregiver)Fu   é�žæ³•è§’è‰²æ¬Šé™�z-SELECT user_id FROM users WHERE username = %s)Fu   å¸³è™Ÿå·²å­˜åœ¨z†INSERT INTO users (username, password_hash, name, role, is_active, created_at) 
                     VALUES (%s, %s, %s, %s, 1, NOW()))Tu   ä½¿ç”¨è€…å»ºç«‹æˆ�åŠŸu   è³‡æ–™åº«è¨»å†ŠéŒ¯èª¤: )Fu   è³‡æ–™åº«å¯«å…¥å¤±æ•—)	r    r>   r?   r@   rG   r   rF   r/   r0   )	rH   r   ÚnameÚrolerI   r>   Ú	hashed_pwrJ   r8   s	            r   Úcreate_userrV   ‰   s¶  € àÐ*Ð*Ð*Ø*Ð*å	Ñ	Ô	€BðØ�YŠY‰[Œ[ð 	1˜Fà�NŠNÐJÈXÈKÑXÔXÐXØ�ŠÑ Ô ð 0Ø/ð		1ð 	1ð 	1ñ 	1ô 	1ð 	1ð& 	�Š‰
Œ
ˆ
ˆ
ˆ
õ /¨xÑ8Ô8ˆIð:ˆCà�NŠN˜3 ¨9°d¸DÐ AÑBÔBÐBØ�IŠI‰KŒKˆKØ0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð& 	�Š‰
Œ
ˆ
ˆ
ˆ
ð'	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1øõ ð .ð .ð .ÝÐ+¨Ð+Ð+Ñ,Ô,Ð,Ø-Ð-Ð-Ð-à
�Š‰
Œ
ˆ
ˆ
ˆ
øøøøð	.øøøð	1ð& 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøs_   –C% ª-CÁC% Á8A CÂ8C% ÃCÃC% Ã CÃ!C% Ã$D: Ã%
D Ã/DÄD: ÄD Ä D: Ä:Ec                 óØ  — t          ¦   «         }	 |                     ¦   «         5 }|                     d| f¦  «         |                     ¦   «          	 ddd¦  «         |                     ¦   «          dS # 1 swxY w Y   n># t
          $ r1}t          d|› �¦  «         Y d}~|                     ¦   «          dS d}~ww xY w	 |                     ¦   «          dS # |                     ¦   «          w xY w)uH   ä¸€é�µå°‡æ‰€æœ‰æœªè™•ç�†çš„è­¦å‘Šæ¨™è¨˜ç‚ºå·²è™•ç�†ï¼Œä¸¦è¨˜éŒ„è™•ç�†äººú„
                UPDATE event_logs 
                SET handled = 1, handled_by = %s 
                WHERE handled = 0
            NTu   è§£é™¤è­¦å‘Šå¤±æ•—: F)r    r>   r?   rF   rG   r/   r0   )rS   rI   r>   r8   s       r   Úresolve_all_eventsrY   ¥   s5  € å	Ñ	Ô	€BðØ�YŠY‰[Œ[ð 	˜FØ�NŠNð ð �ñ	ô ð ð
 �IŠI‰KŒKˆKØð	ð 	ð 	ñ 	ô 	ð 	ð 	�Š‰
Œ
ˆ
ˆ
ˆ
ð	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	øõ ð ð ð ÝÐ( QÐ(Ð(Ñ)Ô)Ð)Øˆuˆuˆuà
�Š‰
Œ
ˆ
ˆ
ˆ
øøøøð	øøøð	ð 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøsR   �A> ¤-A2ÁA> Á2A6Á6A> Á9A6Á:A> Á=C Á>
B9ÂB4ÂC Â4B9Â9C ÃC)c                 óî  — d }	 t          ¦   «         }|                     ¦   «         5 }| rU|                     d| f¦  «         |                     ¦   «         s*dddddœcd d d ¦  «         |r|                     ¦   «          S S |                     d¦  «         |                     ¦   «         }|                     d¦  «         |                     ¦   «         }|                     d	¦  «         |                     ¦   «         }|r|d
         nd }|r|d         nd }t          ||¦  «        }dddddd|�|nd|�|nd|t          |¦  «        dddœ}	ddddœ}
|r{|
                     |d         |d         ¦  «        }|d                              d¦  «        }|d         dk    rd}n |d         }|d         }t          ||¦  «        }d|› d|› d|› d �|	d!<   |rV|d"         pd#}|d                              d$¦  «        }|
                     |d         |d         ¦  «        }d%|› d&|› d'|› d(�|	d)<   |�r|d*         }|d+         }|r|                     d,¦  «        nd|	d-<   |r|                     d,¦  «        nd|	d.<   d/d0d1d2dœd3d4d5d6dœd7d8d9d:dœd;d<d=d>dœd?d@dAdBdœdCdDdEdFdœddGdHdIdœdJœ}|	 	                    |                     |dK         |dL         ¦  «        ¦  «         |r|dK         ndL|	dM<   |	dM         dNv rU|rS|d         dOv rI|d         }|                     dP|f¦  «         |                     ¦   «         }|sdQ|	dR<   dS|	dT<   dU|	dV<   dW|	dX<   |	cd d d ¦  «         |r|                     ¦   «          S S # 1 swxY w Y   nT# t          $ rG}t          dY|› �¦  «         dZd[d\t          |¦  «        dœcY d }~|r|                     ¦   «          S S d }~ww xY w	 |r|                     ¦   «          d S d S # |r|                     ¦   «          w w xY w)]Nú.SELECT name FROM users WHERE line_user_id = %su	   æœªç¶�å®šz#6c757du   ðŸ“±u   è«‹è¼¸å…¥ bind [ä»£ç¢¼])ÚtitleÚcolorÚiconÚdescaž  
                SELECT e.event_type, e.event_time, 
                       (SELECT x_coord FROM activity_logs a 
                        WHERE a.device_id = 2 
                          AND a.record_time <= e.event_time 
                        ORDER BY a.record_time DESC LIMIT 1) as x_coord,
                       (SELECT y_coord FROM activity_logs a 
                        WHERE a.device_id = 2 
                          AND a.record_time <= e.event_time 
                        ORDER BY a.record_time DESC LIMIT 1) as y_coord
                FROM event_logs e
                WHERE e.handled = 0 
                ORDER BY e.event_time DESC LIMIT 1
            z¬
                SELECT event_type, event_time, handled_by 
                FROM event_logs 
                WHERE handled = 1 ORDER BY event_time DESC LIMIT 1
            z%SELECT * FROM rooms WHERE room_id = 1Úlast_xÚlast_yu	   é€£ç·šä¸­u   ðŸ“¡u   ç­‰å¾…é›·é�”æ•¸æ“š...r"   r#   u…   <div style='font-size: 1.1rem; font-weight: bold; color: #27ae60; margin-bottom: 5px;'>âœ… ç›®å‰�å®‰å…¨</div>å°šç„¡æ­·å�²è­¦å ±ç´€éŒ„)r\   r]   r^   r_   Úlast_activity_timeÚlast_position_timeÚxÚyÚzoneÚ	has_alertÚ
alert_descÚ	safe_descu   è·Œå€’u   ç•°å¸¸é�œæ­¢õ   å¤–å‡º©ÚfallÚno_moveÚno_homeÚ
event_typeÚ
event_timez%m/%d %H:%M:%Srn   Úx_coordÚy_coordu™   <div style='font-size: 1.1rem; font-weight: bold; color: #e74c3c; margin-bottom: 5px;'>âš ï¸� ç™¼ç”Ÿè­¦å‘Šäº‹ä»¶</div>ç³»çµ±æ–¼ <span class='time-badge'>u/   </span> å�µæ¸¬åˆ° <span class='danger-text'>ã€�u/   ã€‘</span> äº‹ä»¶ï¼�<br>ðŸ“� ç™¼ç”Ÿä½�ç½®ï¼š<b>z</b>rh   Ú
handled_byu   æœªçŸ¥å®¶å±¬z%m/%d %H:%Mu�   <div style='font-size: 1.1rem; font-weight: bold; color: #27ae60; margin-bottom: 5px;'>âœ… ç›®å‰�å®‰å…¨</div>ç™¼ç”Ÿæ–¼ <span class='time-badge'>u   </span> çš„ã€�u   ã€‘è­¦å ±ï¼Œå·²ç”± <b>u   </b> ç¢ºèª�å®‰å…¨ã€‚ri   Úlast_seen_activityÚlast_seen_positionz%Y/%m/%d %H:%M:%Srb   rc   u	   è¡Œèµ°ä¸­z#28a745u   ðŸ�ƒu   æ­£åœ¨èµ°å‹•ä¸­u   ç«™ç«‹z#17a2b8u   ðŸ§�u   ç›®å‰�è™•æ–¼ç«™ç«‹ç‹€æ…‹u   å��è‘—z#ffc107u   ðŸª‘u   æ­£åœ¨ä¼‘æ�¯/å��è‘—u   è½‰æ�›å‹•ä½œz#fd7e14u   ðŸ”„u   å‹•ä½œè½‰æ�›ä¸­u   èººè‘—z#6f42c1u   ðŸ›Œu   ç›®å‰�è™•æ–¼èººè‡¥ç‹€æ…‹u   è·Œå€’ç‹€æ…‹z#dc3545u   ðŸš¨u	   è·Œå€’ä¸­z#adb5bdu   ðŸšªu   ç¯„åœ�å…§ç„¡äººæ´»å‹•)ÚwalkÚstandÚsitÚ
transitionÚlayrl   ÚnullÚlast_activityr{   Úraw_activity©rz   r{   )rl   Úfall_unresponsivezç
                        SELECT log_id FROM activity_logs 
                        WHERE record_time > %s 
                          AND activity_type IN ('walk', 'stand', 'sit')
                        LIMIT 1
                    u   è·Œå€’å¾Œå€’åœ°ä¸�èµ·r\   z#8b0000r]   u   ðŸ†˜r^   u6   æ¥µåº¦å�±éšªï¼šå�µæ¸¬åˆ°è·Œå€’å¾Œå¤±åŽ»è¡Œå‹•èƒ½åŠ›ï¼�r_   u   è³‡æ–™åº«è®€å�–éŒ¯èª¤: u   ç³»çµ±éŒ¯èª¤Úredu   â�Œ)r    r>   r?   r@   rG   r9   ÚboolÚgetÚstrftimeÚupdater/   r0   Ústr)Úline_idrI   r>   Úlatest_unhandledÚlast_handledÚ	room_snapÚ	current_xÚ	current_yÚcurrent_zoneÚstateÚevent_name_mapÚe_typeÚe_timeÚ
event_zoneÚevent_xÚevent_yÚhandlerÚh_event_timeÚa_timeÚp_timeÚact_mapÚ	fall_timeÚhas_recoveredr8   s                           r   Úget_current_ui_stater›   ·   s'  € Ø	€BðBÝÑ Ô ˆØ�YŠY‰[Œ[ð {	˜FØð yØ—’ÐOÐRYÐQ[Ñ\Ô\Ð\Ø—’Ñ(Ô(ð yØ%0¸9ÈfÐ^wÐxÐxð	{	ð {	ð {	ð {	ñ {	ô {	ð {	ð@ Ðˆr�xŠx‰zŒzˆzˆzÐðs �NŠNð ñ ô ð ð  &ŸšÑ0Ô0Ðà�NŠNð ñ ô ð ð
 "Ÿ?š?Ñ,Ô,ˆLà�NŠNÐBÑCÔCÐCØŸšÑ)Ô)ˆIà/8ÐB˜	 (Ô+Ð+¸dˆIØ/8ÐB˜	 (Ô+Ð+¸dˆIÝ(¨°IÑ>Ô>ˆLð %¨yÀ&Ø/Ø&+Ø&+Ø"+Ð"7�Y�Y¸UØ"+Ð"7�Y�Y¸UØ$Ý!Ð"2Ñ3Ô3Ø ð eðð ˆEð '/¸>ÐV^Ð_Ð_ˆNàð Ø'×+Ò+Ð,<¸\Ô,JÐL\Ð]iÔLjÑkÔk�Ø)¨,Ô7×@Ò@ÐAQÑRÔR�à# LÔ1°YÒ>Ð>Ø!)�J�Jð /¨yÔ9�GØ.¨yÔ9�GÝ!.¨w¸Ñ!@Ô!@�Jð?à:@ð?ð ?àqwð?ð ?ð /9ð?ð ?ð ?ð �lÑ#ð ð Ø& |Ô4ÐF¸�Ø+¨LÔ9×BÒBÀ=ÑQÔQ�Ø'×+Ò+¨L¸Ô,FÈÐUaÔHbÑcÔc�ðRà:FðRð RàV\ðRð Ràt{ðRð Rð Rð �kÑ"ð ñ 'aØ"Ð#7Ô8�Ø"Ð#7Ô8�ØV\Ð.g¨f¯oªoÐ>QÑ.RÔ.RÐ.RÐbg�Ð*Ñ+ØV\Ð.g¨f¯oªoÐ>QÑ.RÔ.RÐ.RÐbg�Ð*Ñ+à&1¸IÈvÐ_pÐqÐqØ'/¸)ÈVÐ]wÐxÐxØ%-¸	È6Ð[pÐqÐqØ,:ÀYÐX^ÐhyÐ"zÐ"zØ%-¸	È6Ð[uÐvÐvØ&4¸yÐRXÐbmÐnÐnØ&.¸ÈFÐ\sÐtÐtðð �ð —’˜WŸ[š[¨°?Ô)CÀWÈVÄ_ÑUÔUÑVÔVÐVØFOÐ([¨	°/Ô(BÐ(BÐU[��nÑ%ð ˜Ô(¨OÐ;Ð;Ð@PÐ;ÐUeÐfrÔUsð  xUð  VUð  VUà 0°Ô >�Ið —N’Nð $ð
 $˜ñ'ô 'ð 'ð %+§O¢OÑ$5Ô$5�Mð )ð aØ)@˜˜g™Ø)2˜˜g™Ø(.˜˜f™Ø(`˜˜f™ð ðw{	ð {	ð {	ð {	ñ {	ô {	ð {	ð@ Ðˆr�xŠx‰zŒzˆzˆzÐðA{	ð {	ð {	ð {	øøøð {	ð {	ð {	ð {	ð {	øõx ð Xð Xð XÝÐ+¨Ð+Ð+Ñ,Ô,Ð,Ø'°%ÀÕPSÐTUÑPVÔPVÐWÐWÐWÐWÐWÐWÐWàÐˆr�xŠx‰zŒzˆzˆzÐøøøøð	Xøøøðy{	ð@ Ðˆr�xŠx‰zŒzˆzˆzˆzÐÐøˆ2Ðˆr�xŠx‰zŒzˆzˆzÐøøøse   „"M, ¦4M ÁM, Á>J>M Ì<M, Í M$Í$M, Í'M$Í(M, Í+O Í,
N=Í6%N8ÎN=ÎO Î8N=Î=O ÏO4c                 ó¸  — t          ¦   «         }	 |                     ¦   «         5 }|                     d| |f¦  «         |                     ¦   «         }d„ |D ¦   «         }|t	          |                     ¦   «         ¦  «        dœcd d d ¦  «         |                     ¦   «          S # 1 swxY w Y   	 |                     ¦   «          d S # |                     ¦   «          w xY w)Na!  
                SELECT activity_type, COUNT(*) as count 
                FROM activity_logs 
                WHERE DATE(record_time) BETWEEN %s AND %s 
                  AND device_id = 1 
                  AND activity_type IS NOT NULL
                GROUP BY activity_type
            c                 ó,   — i | ]}|d          |d         “ŒS )Úactivity_typeÚcountr   ©Ú.0Úrows     r   ú
<dictcomp>z*get_daily_summary_data.<locals>.<dictcomp>N  s#   € ÐHÐHÐH¸C�S˜Ô)¨3¨w¬<ÐHÐHÐHr   )ÚstatsÚtotal)r    r>   r?   ÚfetchallÚsumÚvaluesrG   )Ú
start_dateÚend_daterI   r>   Úrowsr¤   s         r   Úget_daily_summary_datar¬   >  s"  € Ý	Ñ	Ô	€BðØ�YŠY‰[Œ[ð 	B˜Fà�NŠNð ð ˜hÐ'ñ)ô )ð )ð —?’?Ñ$Ô$ˆDàHÐHÀ4ÐHÑHÔHˆEà"­S°·²±´Ñ-@Ô-@ÐAÐAð	Bð 	Bð 	Bð 	Bñ 	Bô 	Bð 	Bð" 	�Š‰
Œ
ˆ
ˆ
ð#	Bð 	Bð 	Bð 	Bøøøð 	Bð 	Bð 	Bð 	Bð 	Bð" 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøs/   �C ¤AB!Â C Â!B%Â%C Â(B%Â)C ÃCc           	      óÖ  — t          ¦   «         }	 |                     ¦   «         5 }ddddddddœ}| d d	…         › d
�}|d d	…         › d�}d}|                     |||f¦  «         |                     ¦   «         }g }	d }
|D ]E}|d         }||
k    r5|	                     |d         |                     |d¦  «        |dœ¦  «         |}
ŒF|rK|d         d         |
k    r9|	                     |d         d         |                     |
d¦  «        |
dœ¦  «         d}|                     |||f¦  «         |                     ¦   «         }g g g dœ}|D ]E}|d         }||v r7||                              |d                              d¦  «        ddœ¦  «         ŒF|	|fcd d d ¦  «         |                     ¦   «          S # 1 swxY w Y   	 |                     ¦   «          d S # |                     ¦   «          w xY w)Né   é   é   é   r&   r<   r   )rv   rw   rx   rz   rl   ry   r{   é
   ú	 00:00:00ú	 23:59:59aµ  
                SELECT 
                    DATE_FORMAT(record_time, '%%Y-%%m-%%d %%H:%%i:00') as minute_time, 
                    activity_type 
                FROM activity_logs 
                WHERE device_id = 1 
                  AND record_time >= %s AND record_time <= %s 
                  AND activity_type IS NOT NULL
                GROUP BY minute_time, activity_type
                ORDER BY minute_time ASC
            rž   Úminute_time)rd   re   ÚlabeléÿÿÿÿzÇ
                SELECT event_time as x, event_type 
                FROM event_logs 
                WHERE event_time >= %s AND event_time <= %s 
                ORDER BY event_time ASC
            rk   ro   rd   z%Y-%m-%d %H:%M:%Sg      @©rd   re   )r    r>   r?   r¦   Úappendr‚   rƒ   rG   )r©   rª   rI   r>   Ú
weight_mapÚstart_dtÚend_dtÚsql_logsÚlog_rowsÚtimeline_dataÚprev_actr¢   Úact_typeÚ
sql_eventsÚ
event_rowsÚeventsÚerr�   s                     r   Úget_statistics_datarÆ   T  sÂ  € Ý	Ñ	Ô	€BðFØ�YŠY‰[Œ[ð C	)˜FàØØØØØØðð ˆJð % S b Sœ/Ð4Ð4Ð4ˆHØ   " œÐ0Ð0Ð0ˆFð
ˆHð �NŠN˜8 h°Ð%7Ñ8Ô8Ð8Ø—’Ñ(Ô(ˆHàˆMØˆHàð (ð (�Ø˜Ô/�Ø˜xÒ'Ð'Ø!×(Ò(Ø  Ô/Ø'Ÿ^š^¨H°aÑ8Ô8Ø!)ð*ð *ñ ô ð ð
  (�Høàð ˜H RœL¨Ô9¸XÒEÐEØ×$Ò$Ø! "œ mÔ4Ø#Ÿš¨°!Ñ4Ô4Ø%ð&ð &ñ ô ð ðˆJð �NŠN˜:¨°&Ð'9Ñ:Ô:Ð:ØŸšÑ*Ô*ˆJà ¨R¸BÐ?Ð?ˆFØ ð ð �Ø˜LÔ)�Ø˜VÐ#Ð#Ø˜6”N×)Ò)Ø œW×-Ò-Ð.AÑBÔBØ ð+ð +ñ ô ð øð ! &Ð(ðGC	)ð C	)ð C	)ð C	)ñ C	)ô C	)ð C	)ðJ 	�Š‰
Œ
ˆ
ˆ
ðKC	)ð C	)ð C	)ð C	)øøøð C	)ð C	)ð C	)ð C	)ð C	)ðJ 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøs/   �G ¤E+F0ÆG Æ0F4Æ4G Æ7F4Æ8G ÇG(c                 óD  — t          ¦   «         }	 |                     ¦   «         5 }|                     d¦  «         d„ |                     ¦   «         D ¦   «         }d}|                     || |f¦  «         |                     ¦   «         }|s"	 d d d ¦  «         |                     ¦   «          d S t          j        ¦   «         |d         z
                       ¦   «         dz  }d }|dk    r|d         dk    r||d         k    rd	}n|d
v r|d         dk    r||d         k    rd}|dv rÀ|                     d| f¦  «         |                     ¦   «         s•|                     d| f¦  «         |                     ¦   «         }	|	rh|	d         }
t          j        ¦   «         |
z
                       ¦   «         dz  }|dk    r/|                     d|
f¦  «         |                     ¦   «         }|sd}|�rbd}|dv r”|                     d| |f¦  «         |                     ¦   «         }|re|d	k    r|                     d| |d         f¦  «         n|                     d| |d         f¦  «         |                     ¦   «         }|d         dk     rd}n.|                     d| |f¦  «         |                     ¦   «         rd}|s˜	 |                     d| |f¦  «         | 	                    ¦   «          |cd d d ¦  «         |                     ¦   «          S # t          $ r<}t          d|› �¦  «         Y d }~d d d ¦  «         |                     ¦   «          d S d }~ww xY w	 d d d ¦  «         |                     ¦   «          d S # 1 swxY w Y   	 |                     ¦   «          d S # |                     ¦   «          w xY w)Nz¾
                SELECT setting_key, setting_value 
                FROM system_settings 
                WHERE setting_key IN ('threshold_no_home_min', 'threshold_no_move_min')
            c                 óF   — i | ]}|d          t          |d         ¦  «        “ŒS ©Úsetting_keyÚsetting_value)Úintr    s     r   r£   z&check_timed_alerts.<locals>.<dictcomp>©  s,   € ÐcÐcÐcÈ#˜˜MÔ*­C°°OÔ0DÑ,EÔ,EÐcÐcÐcr   z´
                SELECT record_time FROM activity_logs 
                WHERE device_id = %s AND activity_type != %s 
                ORDER BY record_time DESC LIMIT 1
            Úrecord_timeé<   r{   Úthreshold_no_home_minr   rn   )rw   rx   Úthreshold_no_move_minrm   r~   z¤
                    SELECT event_id FROM event_logs 
                    WHERE device_id = %s AND event_type = 'fall_unresponsive' AND handled = 0
                zÞ
                        SELECT event_time FROM event_logs 
                        WHERE device_id = %s AND event_type = 'fall' AND handled = 0
                        ORDER BY event_time DESC LIMIT 1
                    rp   g      @a  
                                SELECT log_id FROM activity_logs 
                                WHERE record_time > %s 
                                  AND activity_type IN ('walk', 'stand', 'sit')
                                LIMIT 1
                            r   F)rn   rm   zË
                        SELECT event_time FROM event_logs 
                        WHERE device_id = %s AND event_type = %s 
                        ORDER BY event_time DESC LIMIT 1
                    a  
                                SELECT COUNT(*) as act_count FROM activity_logs 
                                WHERE device_id = %s AND record_time > %s 
                                  AND activity_type IN ('walk', 'stand', 'sit', 'lay')
                            zö
                                SELECT COUNT(*) as act_count FROM activity_logs 
                                WHERE device_id = %s AND record_time > %s 
                                  AND activity_type = 'walk'
                            Ú	act_countr¯   TzŸ
                        SELECT event_id FROM event_logs 
                        WHERE device_id = %s AND event_type = %s AND handled = 0
                    zJINSERT INTO event_logs (device_id, event_type, handled) VALUES (%s, %s, 0)u   å¯«å…¥è³‡æ–™åº«å¤±æ•—: )r    r>   r?   r¦   r@   rG   r   r	   Útotal_secondsrF   r/   r0   )Ú	device_idÚcurrent_activityrI   r>   ÚsettingsÚsql_last_changeÚlast_changeÚduration_minÚ
alert_typeÚunhandled_fallr™   Úfall_duration_minrš   Úalready_firedÚ
last_alertÚact_dataÚdb_errs                    r   Úcheck_timed_alertsrà   ž  sU  € Ý	Ñ	Ô	€BðEØ�YŠY‰[Œ[ð B	˜Fð �NŠNð ñ ô ð ð
 dÐcÐQW×Q`ÒQ`ÑQbÔQbÐcÑcÔcˆHðˆOð
 �NŠN˜?¨YÐ8HÐ,IÑJÔJÐJØ Ÿ/š/Ñ+Ô+ˆKàÐ& ð)B	ð B	ð B	ñ B	ô B	ð B	ðH 	�Š‰
Œ
ˆ
ˆ
ˆ
õ[ %œL™NœN¨[¸Ô-GÑG×VÒVÑXÔXÐ[]Ñ]ˆLàˆJð   6Ò)Ð)¨hÐ7NÔ.OÐRSÒ.SÐ.SÐXdÐhpð  rIô  iJò  YJð  YJØ&�
�
ð "Ð%5Ð5Ð5¸(ÐCZÔ:[Ð^_Ò:_Ð:_ÐdpÐt|ð  ~Uô  uVò  eVð  eVØ&�
ð   ?Ð2Ð2à—’ð  ð  �\ñ#ô #ð #ð —’Ñ(Ô(ð Aà—N’Nð $ð $˜ñ	'ô 'ð 'ð
 &,§_¢_Ñ%6Ô%6�Nà%ð AØ$2°<Ô$@˜	Ý-5¬\©^¬^¸iÑ-G×,VÒ,VÑ,XÔ,XÐ[]Ñ,]Ð)à,°Ò3Ð3à"ŸNšNð , ð
 #, ñ/ô /ð /ð -3¯OªOÑ,=Ô,=˜Mð $1ð AØ-@ 
ð ñ 6$Ø %�ð Ð!7Ð7Ð7à—N’Nð $ð $ ZÐ0ñ	2ô 2ð 2ð
 "(§¢Ñ!2Ô!2�Jà!ð 1à%¨Ò2Ð2à"ŸNšNð , ð #,¨Z¸Ô-EÐ!Fñ	Hô Hð Hð Hð #ŸNšNð , ð #,¨Z¸Ô-EÐ!Fñ	Hô Hð Hð $*§?¢?Ñ#4Ô#4˜ð $ KÔ0°1Ò4Ð4Ø,0˜Møð —N’Nð $ð $ ZÐ0ñ2ô 2ð 2ð —’Ñ(Ô(ð -Ø(,˜ð %ð $ð$ØŸšÐ'sØ&/°Ð%<ñ>ô >ð >àŸ	š	™œ˜Ø)ð{B	ð B	ð B	ð B	ñ B	ô B	ð B	ðH 	�Š‰
Œ
ˆ
ˆ
øõ %ð $ð $ð $ÝÐ@¸Ð@Ð@ÑAÔAÐAØ#˜t˜t˜tðAB	ð B	ð B	ñ B	ô B	ð B	ðH 	�Š‰
Œ
ˆ
ˆ
ˆ
øøøøð$øøøð ðEB	ð B	ð B	ñ B	ô B	ð B	ðH 	�Š‰
Œ
ˆ
ˆ
ˆ
ðIB	ð B	ð B	ð B	øøøð B	ð B	ð B	ð B	ð B	ðH 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøsl   �N	 ¤A%M'Â	N	 Â*HM'Ê.-K<ËN	 Ë<
MÌL=ÌM'ÌN	 Ì=MÍM'ÍN	 Í'M+Í+N	 Í.M+Í/N	 Î	Nc                  óf  — t          ¦   «         } 	 |                      ¦   «         5 }|                     d¦  «         d„ |                     ¦   «         D ¦   «         cd d d ¦  «         |                      ¦   «          S # 1 swxY w Y   	 |                      ¦   «          d S # |                      ¦   «          w xY w)Nú6SELECT setting_key, setting_value FROM system_settingsc                 ó,   — i | ]}|d          |d         “ŒS rÉ   r   r    s     r   r£   z'get_system_settings.<locals>.<dictcomp>-  s$   € ÐZÐZÐZÀ�C˜Ô&¨¨OÔ(<ÐZÐZÐZr   ©r    r>   r?   r¦   rG   )rI   r>   s     r   Úget_system_settingsrå   '  sì   € Ý	Ñ	Ô	€BðØ�YŠY‰[Œ[ð 	[˜FØ�NŠNÐSÑTÔTÐTàZÐZÈÏÊÑHYÔHYÐZÑZÔZð	[ð 	[ð 	[ð 	[ñ 	[ô 	[ð 	[ð
 	�Š‰
Œ
ˆ
ˆ
ð	[ð 	[ð 	[ð 	[øøøð 	[ð 	[ð 	[ð 	[ð 	[ð
 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøs.   �B ¤3A8ÁB Á8A<Á<B Á?A<Â B ÂB0c                 ó2  — t          ¦   «         }	 |                     ¦   «         5 }d}|                     ||| f¦  «         |                     ¦   «          d d d ¦  «         n# 1 swxY w Y   |                     ¦   «          d S # |                     ¦   «          w xY w)NzDUPDATE system_settings SET setting_value = %s WHERE setting_key = %s©r    r>   r?   rF   rG   )ÚkeyÚvaluerI   r>   rJ   s        r   Úupdate_system_settingsrê   1  sÁ   € Ý	Ñ	Ô	€BðØ�YŠY‰[Œ[ð 	˜FØXˆCØ�NŠN˜3 ¨ Ñ-Ô-Ð-Ø�IŠI‰KŒKˆKð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøs.   �B  ¤/AÁB  ÁA#Á#B  Á&A#Á'B  Â Br<   r²   r#   c                 óø  — d }	 t          ¦   «         }|                     ¦   «         5 }g }g }|r*|                     d¦  «         |                     |¦  «         |r*|                     d¦  «         |                     |¦  «         |r*|                     d¦  «         |                     |¦  «         d}	|rdd                     |¦  «        z   }	d|	› �}
|                     |
|¦  «         |                     ¦   «         d         }| d	z
  |z  }d
|	› d�}|||gz   }|                     ||¦  «         |                     ¦   «         }|D ]Œ}|                     d|d         f¦  «         |                     ¦   «         }|rH|d         |d<   |d         |d<   |d         dk    rd|d<   Œ]t          |d         |d         ¦  «        |d<   Œ}d|d<   d|d<   d|d<   Œ�||fcd d d ¦  «         |r|                     ¦   «          S S # 1 swxY w Y   nD# t          $ r7}t          d|› �¦  «         g dfcY d }~|r|                     ¦   «          S S d }~ww xY w	 |r|                     ¦   «          d S d S # |r|                     ¦   «          w w xY w)Nze.event_type = %szDATE(e.event_time) >= %szDATE(e.event_time) <= %sr#   zWHERE z AND z+SELECT COUNT(*) as total FROM event_logs e r¥   r<   a  
                SELECT e.event_id, e.device_id, e.event_type, e.event_time, e.handled, e.handled_by,
                       d.device_name
                FROM event_logs e
                LEFT JOIN radar_devices d ON e.device_id = d.device_id
                z[
                ORDER BY e.event_time DESC
                LIMIT %s OFFSET %s
            úÞ
                    SELECT x_coord, y_coord FROM activity_logs 
                    WHERE device_id = 2 AND record_time <= %s AND x_coord IS NOT NULL 
                    ORDER BY record_time DESC LIMIT 1
                rp   rq   rr   ro   rn   rj   rf   r"   u   æœªçŸ¥u   å�–å¾—æ­·å�²ç´€éŒ„å¤±æ•—: r   )r    r>   r¹   Újoinr?   r@   r¦   r9   rG   r/   r0   )ÚpageÚper_pagero   r©   rª   rI   r>   Úquery_conditionsÚparamsÚwhere_clauseÚcount_queryÚtotal_countÚoffsetrJ   Úpaginated_paramsrÄ   r8   ÚcoordÚerrs                      r   Ú
get_eventsrù   ;  sS  € Ø	€BðDÝÑ Ô ˆØ�YŠY‰[Œ[ð <	'˜FØ!ÐØˆFàð *Ø ×'Ò'Ð(;Ñ<Ô<Ð<Ø—’˜jÑ)Ô)Ð)Øð *Ø ×'Ò'Ð(BÑCÔCÐCØ—’˜jÑ)Ô)Ð)Øð (Ø ×'Ò'Ð(BÑCÔCÐCØ—’˜hÑ'Ô'Ð'àˆLØð IØ'¨'¯,ª,Ð7GÑ*HÔ*HÑH�àVÈÐVÐVˆKØ�NŠN˜;¨Ñ/Ô/Ð/Ø Ÿ/š/Ñ+Ô+¨GÔ4ˆKà˜Q‘h (Ñ*ˆFðð
 ðð ð ˆCð  &¨°6Ð(:Ñ:ÐØ�NŠN˜3Ð 0Ñ1Ô1Ð1Ø—_’_Ñ&Ô&ˆFð ð )ð )�Ø—’ð  ð ˜”oÐ'ñ	)ô )ð )ð
 ŸšÑ)Ô)�àð 
)Ø#(¨Ô#3�A�i‘LØ#(¨Ô#3�A�i‘LØ˜”¨)Ò3Ð3Ø$,˜˜&™	˜	å$1°!°I´,ÀÀ)ÄÑ$MÔ$M˜˜&™	˜	à#(�A�i‘LØ#(�A�i‘LØ (�A�f‘I�Ià˜;Ð&ðy<	'ð <	'ð <	'ð <	'ñ <	'ô <	'ð <	'ðD Ðˆr�xŠx‰zŒzˆzˆzÐðE<	'ð <	'ð <	'ð <	'øøøð <	'ð <	'ð <	'ð <	'ð <	'øõ| ð ð ð ÝÐ0¨3Ð0Ð0Ñ1Ô1Ð1Ø�1ˆuˆˆˆˆˆàÐˆr�xŠx‰zŒzˆzˆzÐøøøøð	øøøð}<	'ðD Ðˆr�xŠx‰zŒzˆzˆzˆzÐÐøˆ2Ðˆr�xŠx‰zŒzˆzˆzÐøøøsY   „"H ¦F+G5ÇH Ç5G9Ç9H Ç<G9Ç=H È I  È
IÈH=È IÈ!I  È=IÉI  É I9c                 ó¦  — t          ¦   «         }	 |                     ¦   «         5 }|                     d| f¦  «         |                     ¦   «         }|s"g cd d d ¦  «         |                     ¦   «          S |d         }|t          d¬¦  «        z
  }|                     d||f¦  «         |                     ¦   «         }g }t          j        d¦  «        dz  }|D ]_}		 t          |	d         ¦  «        }
t          |	d         ¦  «        }d	|
|z
  |z  z   }|
|z   |z  }| 
                    ||d
œ¦  «         ŒY#  Y Œ]xY w|cd d d ¦  «         |                     ¦   «          S # 1 swxY w Y   n?# t          $ r2}t          d|› �¦  «         g cY d }~|                     ¦   «          S d }~ww xY w	 |                     ¦   «          d S # |                     ¦   «          w xY w)Nz5SELECT event_time FROM event_logs WHERE event_id = %srp   r¯   )Úsecondsa  
                SELECT x_coord, y_coord 
                FROM activity_logs 
                WHERE device_id = 2 
                  AND x_coord IS NOT NULL 
                  AND record_time BETWEEN %s AND %s
                ORDER BY record_time ASC
            r&   rq   rr   r'   r¸   u   æ’ˆå�–è»Œè·¡å¤±æ•—: )r    r>   r?   r@   rG   r   r¦   r-   r.   r,   r¹   r/   r0   )Úevent_idrI   r>   Úeventrp   Ú
start_timer«   Ú
trajectoryr5   r¢   r3   r4   r6   r7   r8   s                  r   Úget_event_trajectoryr   ƒ  si  € Ý	Ñ	Ô	€Bð(Ø�YŠY‰[Œ[ð "	˜Fà�NŠNÐRÐU]ÐT_Ñ`Ô`Ð`Ø—O’OÑ%Ô%ˆEØÐ# ð	"	ð "	ð "	ð "	ñ "	ô "	ð "	ðN 	�Š‰
Œ
ˆ
ˆ
ðC ˜|Ô,ˆJØ#¥i¸Ð&:Ñ&:Ô&:Ñ:ˆJð �NŠNð ð ˜jÐ)ñ+ô +ð +ð —?’?Ñ$Ô$ˆDØˆJÝ”I˜a‘L”L 1Ñ$ˆEàð 	ð 	�ðÝ! # i¤.Ñ1Ô1�EÝ! # i¤.Ñ1Ô1�Eà  E¨E¡M°UÑ#:Ñ:�FØ# e™m¨uÑ4�FØ×%Ò%¨F¸Ð&@Ð&@ÑAÔAÐAÐAøðØ�DøøøàðE"	ð "	ð "	ð "	ñ "	ô "	ð "	ðN 	�Š‰
Œ
ˆ
ˆ
ðO"	ð "	ð "	ð "	øøøð "	ð "	ð "	ð "	ð "	øõF ð ð ð ÝÐ( QÐ(Ð(Ñ)Ô)Ð)Øˆ	ˆ	ˆ	ˆ	ˆ	à
�Š‰
Œ
ˆ
ˆ
øøøøð	øøøðG"	ðN 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøs~   �E$ ¤/EÁE$ Á4A$EÃAD/Ä.EÄ/D3Ä1EÄ7E$ ÅEÅE$ ÅEÅ E$ Å#F: Å$
F Å.FÆF ÆF: ÆF Æ F: Æ:Gc                 óœ	  — t          ¦   «         }	 |                     ¦   «         5 }|                     d¦  «         d„ |                     ¦   «         D ¦   «         }|                     dd¦  «        }|                     dd¦  «        }| dd…         › d	�}|dd…         › d
�}g d¢}	d„ |	D ¦   «         }
d„ |	D ¦   «         }|                     d||f¦  «         |                     ¦   «         D ]8}t          |d         |d         ¦  «        }||
v r|
|xx         |d         z  cc<   Œ9d„ |
                     ¦   «         D ¦   «         }|                     d||f¦  «         |                     ¦   «         D ]e}|                     d|d         f¦  «         |                     ¦   «         }|r0t          |d         |d         ¦  «        }||v r||xx         dz  cc<   Œf|                     d||f¦  «         i }d\  }}}|                     ¦   «         D ]¨}|d         }|                     d¦  «        }||vrd||<   |�l||z
   	                    ¦   «         }|dk    rOt          j        |d         |z
  d z  |d!         |z
  d z  z   ¦  «        }d"|cxk     rd#k     rn n||xx         |z  cc<   |d         |d!         |}}}Œ©t          |                     ¦   «         ¦  «        d$„ |                     ¦   «         D ¦   «         d%œ}|                     d&||f¦  «         t          |                     d'd(¦  «        ¦  «        }t          |                     d'd(¦  «        ¦  «        }t#          ¦   «         }|                     ¦   «         D ]s}|d)         }|j        d*z  |j        z   }d+}||k    r||cxk    r|k    rn nd,}n||k    s||k    rd,}|r,|                     d¦  «        } |                     | |f¦  «         Œti }!|D ]!\  } }"|!                     | d-¦  «        dz   |!| <   Œ"d.„ |!                     ¦   «         D ¦   «         }#||||#d/œcddd¦  «         |                     ¦   «          S # 1 swxY w Y   nG# t,          $ r:}$t/          d0|$› �¦  «         i i g g d%œi d/œcY d}$~$|                     ¦   «          S d}$~$ww xY w	 |                     ¦   «          dS # |                     ¦   «          w xY w)1u*   å�–å¾—ç©ºé–“èˆ‡ä½œæ�¯çš„é€²éšŽåˆ†æž�æ•¸æ“šrâ   c                 ó,   — i | ]}|d          |d         “ŒS rÉ   r   r    s     r   r£   z*get_spatial_statistics.<locals>.<dictcomp>µ  s$   € Ð^Ð^Ð^ÀS˜˜MÔ*¨C°Ô,@Ð^Ð^Ð^r   Únight_start_timez00:00Únight_end_timez06:00Nr²   r³   r´   )r(   r)   r*   r+   c                 ó   — i | ]}|d “ŒS ©r   r   ©r¡   rf   s     r   r£   z*get_spatial_statistics.<locals>.<dictcomp>¿  ó   € Ð@Ð@Ð@¨˜D !Ð@Ð@Ð@r   c                 ó   — i | ]}|d “ŒS r  r   r  s     r   r£   z*get_spatial_statistics.<locals>.<dictcomp>À  r  r   aw  
                SELECT ROUND(x_coord, 1) as rx, ROUND(y_coord, 1) as ry, COUNT(*) as c
                FROM activity_logs
                WHERE device_id = 2 AND x_coord IS NOT NULL 
                  AND record_time >= %s AND record_time <= %s
                  AND MOD(SECOND(record_time), 10) = 0
                GROUP BY ROUND(x_coord, 1), ROUND(y_coord, 1)
            ÚrxÚryÚcc                 ó<   — i | ]\  }}|t          |d z  d¦  «        “ŒS )g      (@r<   ©Úround)r¡   rf   rŸ   s      r   r£   z*get_spatial_statistics.<locals>.<dictcomp>Ð  s,   € Ð_Ð_Ð_¹;¸4À˜$¥ e¨d¡l°AÑ 6Ô 6Ð_Ð_Ð_r   z£
                SELECT event_time, event_type FROM event_logs
                WHERE event_type != 'no_home' AND event_time >= %s AND event_time <= %s
            rì   rp   rq   rr   r<   aš  
                SELECT 
                    record_time as rec_time, 
                    AVG(x_coord) as x, 
                    AVG(y_coord) as y
                FROM activity_logs
                WHERE device_id = 2 AND x_coord IS NOT NULL 
                  AND record_time >= %s AND record_time <= %s
                  AND MOD(SECOND(record_time), 5) = 0
                GROUP BY record_time
            )NNNÚrec_timez%m/%dg        i,  rd   r&   re   gÍÌÌÌÌÌÜ?g      @c                 ó.   — g | ]}t          |d ¦  «        ‘ŒS )r<   r  )r¡   Úds     r   ú
<listcomp>z*get_spatial_statistics.<locals>.<listcomp>
  s    € ÐBÐBÐB¨�˜q !™œÐBÐBÐBr   )ÚlabelsÚdataa   
                SELECT record_time 
                FROM activity_logs
                WHERE device_id = 1 
                  AND activity_type IN ('walk', 'stand', 'sit', 'fall') 
                  AND record_time >= %s AND record_time <= %s
            ú:r#   rÍ   éd   FTr   c                 ó4   — i | ]\  }}|t          |¦  «        “ŒS r   )r,   )r¡   ÚkÚvs      r   r£   z*get_spatial_statistics.<locals>.<dictcomp>,  s$   € ÐGÐGÐG©$¨!¨Q˜!�U 1™XœXÐGÐGÐGr   )Ú
dwell_dataÚhotspot_dataÚdistance_dataÚ
night_datau   ç©ºé–“çµ±è¨ˆè¨ˆç®—å¤±æ•—: )r    r>   r?   r¦   r‚   r9   Úitemsr@   rƒ   rÒ   r-   r.   ÚlistÚkeysr¨   rÌ   rB   ÚsetÚhourÚminuteÚaddrG   r/   r0   )%r©   rª   rI   r>   rÕ   Ún_startÚn_endr»   r¼   ÚAVAILABLE_ZONESÚdwell_countsr  r¢   rf   r  Úevr÷   Ú
daily_distÚprev_xÚprev_yÚ	prev_timeÚ	curr_timeÚdate_strÚ	time_diffÚdistr  Ún_sÚn_eÚactive_night_minutesÚdt_objÚtime_valÚis_nightÚmd_dateÚnight_countsÚ_r  r8   s%                                        r   Úget_spatial_statisticsr<  ¯  sf  € å	Ñ	Ô	€BðFØ�YŠY‰[Œ[ð @	˜FØ�NŠNÐSÑTÔTÐTØ^Ð^ÈFÏOÊOÑL]ÔL]Ð^Ñ^Ô^ˆHØ—l’lÐ#5°wÑ?Ô?ˆGØ—L’LÐ!1°7Ñ;Ô;ˆEà$ S b Sœ/Ð4Ð4Ð4ˆHØ   " œÐ0Ð0Ð0ˆFð JÐIÐIˆOà@Ð@°Ð@Ñ@Ô@ˆLØ@Ð@°Ð@Ñ@Ô@ˆLð �NŠNð ð ˜FÐ#ñ%ô %ð %ð —’Ñ(Ô(ð 3ð 3�Ý$ S¨¤Y°°D´	Ñ:Ô:�Ø˜<Ð'Ð'Ø  Ð&Ð&Ô&¨#¨c¬(Ñ2Ð&Ð&Ñ&øØ_Ð_È,×J\ÒJ\ÑJ^ÔJ^Ð_Ñ_Ô_ˆJð �NŠNð ð ˜FÐ#ñ%ô %ð %ð
 —o’oÑ'Ô'ð 
0ð 
0�Ø—’ð  ð ˜Ô&Ð(ñ	*ô *ð *ð
 ŸšÑ)Ô)�Øð 0Ý(¨¨yÔ)9¸5ÀÔ;KÑLÔL�DØ˜|Ð+Ð+Ø$ TÐ*Ð*Ô*¨aÑ/Ð*Ð*Ñ*øð
 �NŠNð 
ð ˜FÐ#ñ
%ô 
%ð 
%ð ˆJØ(8Ñ%ˆF�F˜IØ—’Ñ(Ô(ð Jð J�Ø 
œO�	Ø$×-Ò-¨gÑ6Ô6�Ø :Ð-Ð-Ø+.�J˜xÑ(àÐ%Ø!*¨YÑ!6× EÒ EÑ GÔ G�Ià  CÒ'Ð'Ý#œy¨#¨c¬(°VÑ*;¸aÑ)?À3ÀsÄ8ÈfÑCTÐWXÑBXÑ)XÑYÔY˜ð   $Ð,Ð,Ò,Ð,¨Ò,Ð,Ð,Ð,Ð,Ø& xÐ0Ð0Ô0°DÑ8Ð0Ð0Ñ0à,/°¬H°c¸#´hÀ	 	˜��õ ˜zŸšÑ0Ô0Ñ1Ô1ØBÐB¨j×.?Ò.?Ñ.AÔ.AÐBÑBÔBðð ˆMð �NŠNð ð ˜FÐ#ñ%ô %ð %õ �g—o’o c¨2Ñ.Ô.Ñ/Ô/ˆCÝ�e—m’m C¨Ñ,Ô,Ñ-Ô-ˆCÝ#&¡5¤5Ð à—’Ñ(Ô(ð Bð B�Ø˜]Ô+�Ø!œ;¨Ñ,¨v¬}Ñ<�à �Ø˜#’:�:Ø˜hÐ-Ð-Ò-Ð-¨#Ò-Ð-Ð-Ð-Ð-¸$¨xøà 3’�¨(°cª/¨/Àd¸8àð BØ$Ÿošo¨gÑ6Ô6�GØ(×,Ò,¨g°xÐ-@ÑAÔAÐAøàˆLØ2ð Ið I‘
�˜Ø(4×(8Ò(8¸À!Ñ(DÔ(DÀqÑ(H�˜WÑ%Ð%àGÐG°,×2DÒ2DÑ2FÔ2FÐGÑGÔGˆJð )Ø ,Ø!.Ø(ð	ð ðw@	ð @	ð @	ð @	ñ @	ô @	ð @	ðJ 	�Š‰
Œ
ˆ
ˆ
ðK@	ð @	ð @	ð @	øøøð @	ð @	ð @	ð @	ð @	øõB ð uð uð uÝÐ.¨1Ð.Ð.Ñ/Ô/Ð/Ø °"ÐRTÐ^`ÐGaÐGaÐqsÐtÐtÐtÐtÐtÐtÐtà
�Š‰
Œ
ˆ
ˆ
øøøøð	uøøøðC@	ðJ 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøsY   �Q ¤PQÐ*Q ÑQÑQ ÑQÑQ ÑR5 Ñ
RÑ!RÑ<RÑ=R5 ÒRÒR5 Ò5Sc                  óV  — t          ¦   «         } 	 |                      ¦   «         5 }d}|                     |¦  «         |                     ¦   «         cd d d ¦  «         |                      ¦   «          S # 1 swxY w Y   	 |                      ¦   «          d S # |                      ¦   «          w xY w)Nz‘
                SELECT d.*, r.room_name 
                FROM radar_devices d
                JOIN rooms r ON d.room_id = r.room_id
            rä   )rI   r>   rJ   s      r   Úget_all_devicesr>  ;  sÕ   € Ý	Ñ	Ô	€Bð
Ø�YŠY‰[Œ[ð 	%˜FðˆCð
 �NŠN˜3ÑÔÐØ—?’?Ñ$Ô$ð	%ð 	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	�Š‰
Œ
ˆ
ˆ
ð	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	%ð 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøó.   �B ¤+A0ÁB Á0A4Á4B Á7A4Á8B ÂB(c           	      ó  — t          ¦   «         }	 |                     ¦   «         5 }d}t          d|› d| › d|› �¦  «         |                     || |f¦  «         |                     ¦   «          	 d d d ¦  «         |                     ¦   «          dS # 1 swxY w Y   n># t          $ r1}t          d|› �¦  «         Y d }~|                     ¦   «          dS d }~ww xY w	 |                     ¦   «          d S # |                     ¦   «          w xY w)NzSINSERT INTO radar_devices (device_name, location, status) VALUES (%s, %s, 'active')u   æ­£åœ¨åŸ·è¡Œ SQL: u	    å�ƒæ•¸: z, Tu   è³‡æ–™åº«æ–°å¢žå¤±æ•—åŽŸå› : F)r    r>   r0   r?   rF   rG   r/   )rS   ÚlocationrI   r>   rJ   r8   s         r   Ú
add_devicerB  J  sV  € Ý	Ñ	Ô	€BðØ�YŠY‰[Œ[ð 	˜FØgˆCÝÐG sÐGÐG°TÐGÐG¸XÐGÐGÑHÔHÐHØ�NŠN˜3  xÐ 0Ñ1Ô1Ð1Ø�IŠI‰KŒKˆKØð	ð 	ð 	ñ 	ô 	ð 	ð 	�Š‰
Œ
ˆ
ˆ
ˆ
ð	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	øõ ð ð ð ÝÐ1¨aÐ1Ð1Ñ2Ô2Ð2Øˆuˆuˆuà
�Š‰
Œ
ˆ
ˆ
ˆ
øøøøð	øøøð	ð 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøsS   �B ¤ABÁ,B ÂBÂB ÂBÂB ÂC. Â
CÂ#CÂ5C. ÃCÃC. Ã.Dc                 ó~  — t          ¦   «         }	 |                     ¦   «         5 }|                     d| f¦  «         |                     ¦   «         }|s"	 d d d ¦  «         |                     ¦   «          d S |d         s©|d         s¡t          j        t          t          j	        ¦   «         ¦  «         
                    ¦   «         ¦  «                             ¦   «                              ¦   «         d d…         }|                     d|| f¦  «         |                     ¦   «          ||d<   g }|d         r1|                     d|d         f¦  «         |                     ¦   «         }||fcd d d ¦  «         |                     ¦   «          S # 1 swxY w Y   	 |                     ¦   «          d S # |                     ¦   «          w xY w)NzDSELECT username, line_user_id, bind_code FROM users WHERE user_id=%sÚline_user_idÚ	bind_coder®   z.UPDATE users SET bind_code=%s WHERE user_id=%sz;SELECT username, bind_code FROM users WHERE line_user_id=%s)r    r>   r?   r@   rG   ÚhashlibÚmd5r…   ÚuuidÚuuid4rE   Ú	hexdigestÚupperrF   r¦   )r=   rI   r>   r   Únew_codeÚ
bound_lists         r   Úget_user_bind_inforN  Y  sö  € Ý	Ñ	Ô	€BðØ�YŠY‰[Œ[ð 	$˜Fà�NŠNÐaÐdkÐcmÑnÔnÐnØ—?’?Ñ$Ô$ˆDàð Øð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð. 	�Š‰
Œ
ˆ
ˆ
ˆ
ð ˜Ô'ð -°°[Ô0Að -Ý"œ;¥s­4¬:©<¬<Ñ'8Ô'8×'?Ò'?Ñ'AÔ'AÑBÔB×LÒLÑNÔN×TÒTÑVÔVÐWYÐXYÐWYÔZ�Ø—’ÐOÐRZÐ\cÐQdÑeÔeÐeØ—	’	‘”�Ø$,��[Ñ!ð ˆJØ�NÔ#ð /Ø—’Ð\Ð_cÐdrÔ_sÐ^uÑvÔvÐvØ#Ÿ_š_Ñ.Ô.�
à˜Ð#ð+	$ð 	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð. 	�Š‰
Œ
ˆ
ˆ
ð/	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð 	$ð. 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøs;   �F& ¤/FÁF& Á4C/FÅ#F& ÆFÆF& ÆFÆF& Æ&F<c                 óV  — t          ¦   «         }	 |                     ¦   «         5 }|                     d| f¦  «         |                     ¦   «         cd d d ¦  «         |                     ¦   «          S # 1 swxY w Y   	 |                     ¦   «          d S # |                     ¦   «          w xY w)Nz3SELECT * FROM users WHERE line_user_id = %s LIMIT 1)r    r>   r?   r@   rG   )r†   rI   r>   s      r   Úget_user_by_line_idrP  u  sÓ   € Ý	Ñ	Ô	€BðØ�YŠY‰[Œ[ð 	%˜FØ�NŠNÐPÐSZÐR\Ñ]Ô]Ð]Ø—?’?Ñ$Ô$ð	%ð 	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	�Š‰
Œ
ˆ
ˆ
ð		%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	%ð 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøør?  c                 ód  — t          ¦   «         }	 |                     ¦   «         5 }|                     d| f¦  «         |                     ¦   «         }|s"	 d d d ¦  «         |                     ¦   «          dS |d         r"	 d d d ¦  «         |                     ¦   «          dS |                     d|| f¦  «         |                     ¦   «          dd|d         › �fcd d d ¦  «         |                     ¦   «          S # 1 swxY w Y   	 |                     ¦   «          d S # |                     ¦   «          w xY w)	NzBSELECT user_id, name, line_user_id FROM users WHERE bind_code = %s)Fu   â�Œ æ‰¾ä¸�åˆ°æ­¤ç¶�å®šç¢¼ã€‚rD  )Fu   âš ï¸� æ­¤ä»£ç¢¼å·²è¢«ç¶�å®šã€‚z7UPDATE users SET line_user_id = %s WHERE bind_code = %sTu    âœ… ç¶�å®šæˆ�åŠŸï¼�
ä½¿ç”¨è€…ï¼šrS   )r    r>   r?   r@   rG   rF   )rE  r†   rI   r>   r   s        r   Úbind_line_userrR    s­  € Ý	Ñ	Ô	€BðØ�YŠY‰[Œ[ð 		L˜Fà�NŠNÐ_ÐbkÐamÑnÔnÐnØ—?’?Ñ$Ô$ˆDØÐEÐ Eð			Lð 		Lð 		Lñ 		Lô 		Lð 		Lð 	�Š‰
Œ
ˆ
ˆ
ˆ
ð �NÔ#ÐTÐ,Tð		Lð 		Lð 		Lñ 		Lô 		Lð 		Lð 	�Š‰
Œ
ˆ
ˆ
ˆ
ð	 �NŠNÐTÐW^Ð`iÐVjÑkÔkÐkØ�IŠI‰KŒKˆKØÐK¸TÀ&¼\ÐKÐKÐKð		Lð 		Lð 		Lð 		Lñ 		Lô 		Lð 		Lð 	�Š‰
Œ
ˆ
ˆ
ð		Lð 		Lð 		Lð 		Løøøð 		Lð 		Lð 		Lð 		Lð 		Lð 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøsF   �D ¤/C7ÁD Á4	C7Á=D Â8C7ÃD Ã7C;Ã;D Ã>C;Ã?D ÄD/c                 óŠ  — t          ¦   «         }	 |                     ¦   «         5 }d}|                     || |f¦  «         |                     ¦   «         s"	 d d d ¦  «         |                     ¦   «          dS d}|                     || |f¦  «         |                     ¦   «          dd|› d�fcd d d ¦  «         |                     ¦   «          S # 1 swxY w Y   n># t          $ r1}t          d|› �¦  «         Y d }~|                     ¦   «          dS d }~ww xY w	 |                     ¦   «          d S # |                     ¦   «          w xY w)	NzDSELECT user_id FROM users WHERE line_user_id = %s AND bind_code = %s)Fu:   â�Œ æ‰¾ä¸�åˆ°è©²ç¶�å®šç´€éŒ„ï¼Œæˆ–è©²å¸³è™Ÿä¸�å±¬æ–¼æ‚¨ã€‚zOUPDATE users SET line_user_id = NULL WHERE line_user_id = %s AND bind_code = %sTu   âœ… å·²æˆ�åŠŸè§£é™¤ç¶�å®šç¢¼ [u   ] çš„é€£å‹•ã€‚u   è§£ç¶�å‡ºéŒ¯: )Fu%   â�Œ ç³»çµ±éŒ¯èª¤ï¼Œè«‹ç¨�å¾Œå†�è©¦ã€‚)r    r>   r?   r@   rG   rF   r/   r0   )r†   rE  rI   r>   Ú	sql_checkÚ
sql_unbindr8   s          r   Úunbind_line_userrV  �  sÆ  € Ý	Ñ	Ô	€BðØ�YŠY‰[Œ[ð 	T˜Fà^ˆIØ�NŠN˜9 w°	Ð&:Ñ;Ô;Ð;Ø—?’?Ñ$Ô$ð [ØZð	Tð 	Tð 	Tñ 	Tô 	Tð 	Tð  	�Š‰
Œ
ˆ
ˆ
ˆ
ð kˆJØ�NŠN˜:¨°Ð';Ñ<Ô<Ð<Ø�IŠI‰KŒKˆKØÐS¸)ÐSÐSÐSÐSð	Tð 	Tð 	Tð 	Tñ 	Tô 	Tð 	Tð  	�Š‰
Œ
ˆ
ˆ
ð!	Tð 	Tð 	Tð 	Tøøøð 	Tð 	Tð 	Tð 	Tð 	Tøõ ð >ð >ð >ÝÐ"˜qÐ"Ð"Ñ#Ô#Ð#Ø=Ð=Ð=Ð=à
�Š‰
Œ
ˆ
ˆ
ˆ
øøøøð	>øøøð	Tð  	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøs^   �C ¤0CÁC Á55CÂ*C ÃCÃC ÃCÃC ÃD, Ã
DÃ!DÃ3D, ÄDÄD, Ä,Ec                 ól  — t          ¦   «         }	 |                     ¦   «         5 }d}|                     || |f¦  «         |j        }|                     d¦  «         |                     ¦   «         }|r|d         nd}|                     d| f¦  «         |                     ¦   «         }|r|d         nd}	|r|d         �|d         nd
}
|r|d         �|d         nd
}|                     d¦  «         |                     ¦   «         }|                     ¦   «          d	d	d	¦  «         n# 1 swxY w Y   	 	 ddlm} n# t          $ r	 ddl
m} Y nw xY w ||||	||
|¦  «         n)# t          $ r}t          d|› �¦  «         Y d	}~nd	}~ww xY w|||	|fdt          ¦   «         v r|r|                     ¦   «          S S S # t          $ rG}t          d|› �¦  «         Y d	}~dt          ¦   «         v r|r|                     ¦   «          dS dS dS d	}~ww xY w# dt          ¦   «         v r|r|                     ¦   «          w w w xY w)u'   è™•ç�†äº‹ä»¶ç´€éŒ„ä¸¦å•Ÿå‹•æŽ¨æ’­é‚�è¼¯zxINSERT INTO event_logs (device_id, event_type, event_time, handled)
                           VALUES (%s, %s, NOW(), 0)z3SELECT name FROM users WHERE role = 'admin' LIMIT 1rS   u   è¢«ç…§è­·è€…zÍ
                SELECT r.device_name, rm.last_x, rm.last_y 
                FROM radar_devices r
                JOIN rooms rm ON r.room_id = rm.room_id
                WHERE r.device_id = %s
            Údevice_nameu   æœªçŸ¥è£�ç½®r`   Nr"   ra   zdSELECT user_id, name, role, line_user_id FROM users WHERE line_user_id IS NOT NULL AND is_active = 1r   )Úbroadcast_new_alertu,   å‘¼å�« LINE è­¦å ±åœ–ç‰‡æŽ¨æ’­ç™¼ç”ŸéŒ¯èª¤: rI   u   è¨˜éŒ„äº‹ä»¶ç™¼ç”ŸéŒ¯èª¤: )NNNN)r    r>   r?   Ú	lastrowidr@   r¦   rF   ÚlinerY  ÚImportErrorÚroutes.liner/   r0   ÚlocalsrG   )rÓ   ro   rI   r>   Ú	sql_eventrü   ÚownerÚ
owner_nameÚdevicerX  r1   r2   Ú
recipientsrY  Úpush_errr8   s                   r   Úrecord_event_and_pushre  Å  s4  € å	Ñ	Ô	€Bð1Ø�YŠY‰[Œ[ð 	˜Fð8ˆIà�NŠN˜9 y°*Ð&=Ñ>Ô>Ð>ØÔ'ˆHð �NŠNÐPÑQÔQÐQØ—O’OÑ%Ô%ˆEØ*/ÐC˜˜vœ˜°^ˆJð �NŠNð ð
 �ñô ð ð —_’_Ñ&Ô&ˆFØ39ÐM˜& Ô/Ð/¸~ˆKØ(.ÐZ°6¸(Ô3CÐ3O�F˜8Ô$Ð$ÐUZˆEØ(.ÐZ°6¸(Ô3CÐ3O�F˜8Ô$Ð$ÐUZˆEð �NŠNð  Bñ  Cô  Cð  CØŸšÑ*Ô*ˆJà�IŠI‰KŒKˆKð9	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð>		Mð<Ø4Ð4Ð4Ð4Ð4Ð4Ð4øÝð <ð <ð <Ø;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ð<øøøð  Ð 
¨J¸ÀXÈuÐV[Ñ\Ô\Ð\Ð\øÝð 	Mð 	Mð 	MÝÐKÀÐKÐKÑLÔLÐLÐLÐLÐLÐLÐLøøøøð	Møøøð ˜ [°*Ð<ð
 •6‘8”8ÐÐ ÐØ�HŠH‰JŒJˆJˆJð Ðøõ	 ð &ð &ð &ÝÐ.¨1Ð.Ð.Ñ/Ô/Ð/Ø%Ð%Ð%Ð%à•6‘8”8ÐÐ ÐØ�HŠH‰JŒJˆJˆJˆJð ÐÐÐøøøøð	&øøøøð •6‘8”8ÐÐ ÐØ�HŠH‰JŒJˆJˆJð Ðøøøs•   �F5 ¤C3D#ÄF5 Ä#D'Ä'F5 Ä*D'Ä+F5 Ä0D7 Ä6E Ä7E
ÅE Å	E
Å
E ÅF5 Å
FÅ(E?Å:F5 Å?FÆF5 Æ5
HÆ?HÇH	 ÈHÈH	 È	*H3c                 óZ  — t          ¦   «         }	 |                     ¦   «         5 }|                     d| f¦  «         |                     ¦   «          	 d d d ¦  «         |                     ¦   «          dS # 1 swxY w Y   	 |                     ¦   «          d S # |                     ¦   «          w xY w)Nz5UPDATE event_logs SET handled = 1 WHERE event_id = %sTrç   )rü   rI   r>   s      r   Úmark_event_handledrg  û  sÓ   € Ý	Ñ	Ô	€BðØ�YŠY‰[Œ[ð 	˜FØ�NŠNÐRÐU]ÐT_Ñ`Ô`Ð`Ø�IŠI‰KŒKˆKØð	ð 	ð 	ñ 	ô 	ð 	ð
 	�Š‰
Œ
ˆ
ˆ
ˆ
ð	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð
 	�Š‰
Œ
ˆ
ˆ
ˆ
øˆ�Š‰
Œ
ˆ
ˆ
øøøs.   �B ¤-A2ÁB Á2A6Á6B Á9A6Á:B ÂB*c                 ót  — 	 t          ¦   «         }|                     ¦   «         5 }|                     d| f¦  «         |                     ¦   «         }|s8	 ddd¦  «         dt	          ¦   «         v r|r|                     ¦   «          dS dS dS |d         }|                     d|f¦  «         |                     ¦   «          |j        dk    r|ndcddd¦  «         dt	          ¦   «         v r|r|                     ¦   «          S S S # 1 swxY w Y   nT# t          $ rG}t          d|› �¦  «         Y d}~dt	          ¦   «         v r|r|                     ¦   «          dS dS dS d}~ww xY w	 dt	          ¦   «         v r|r|                     ¦   «          dS dS dS # dt	          ¦   «         v r|r|                     ¦   «          w w w xY w)	u3   ä¸€é�µè§£é™¤æ‰€æœ‰è­¦å‘Šï¼Œä¸¦ç´€éŒ„æ˜¯èª°è§£é™¤çš„r[   NrI   rS   rX   r   Ú	NO_ALERTSu   è§£é™¤è­¦å‘Šç™¼ç”ŸéŒ¯èª¤: )
r    r>   r?   r@   r^  rG   rF   Úrowcountr/   r0   )Úline_uidrI   r>   r   Ú	user_namer8   s         r   Úresolve_all_alerts_by_linerm    so  € ðÝÑ Ô ˆØ�YŠY‰[Œ[ð 	E˜Fà�NŠNÐKÈhÈ[ÑYÔYÐYØ—?’?Ñ$Ô$ˆDØð Øð	Eð 	Eð 	Eñ 	Eô 	Eð 	Eð, •6‘8”8ÐÐ ÐØ�HŠH‰JŒJˆJˆJˆJð ÐÐÐð! ˜VœˆIð �NŠNð ð �ñ	ô ð ð
 �IŠI‰KŒKˆKð !'¤°!Ò 3Ð 3�9�9¸ð#	Eð 	Eð 	Eð 	Eñ 	Eô 	Eð 	Eð, •6‘8”8ÐÐ ÐØ�HŠH‰JŒJˆJˆJð Ðð-	Eð 	Eð 	Eð 	Eøøøð 	Eð 	Eð 	Eð 	Eð 	Eøõ$ ð ð ð ÝÐ.¨1Ð.Ð.Ñ/Ô/Ð/Øˆtˆtˆtà•6‘8”8ÐÐ ÐØ�HŠH‰JŒJˆJˆJˆJð ÐÐÐøøøøð	øøøð%	Eð, •6‘8”8ÐÐ ÐØ�HŠH‰JŒJˆJˆJˆJð ÐÐÐøˆ4•6‘8”8ÐÐ ÐØ�HŠH‰JŒJˆJˆJð Ðøøøs_   ‚"D ¤/D ÁD Â
AD ÃD Ä DÄD ÄDÄD ÄF Ä
EÄEÄ(F ÅEÅF Æ*F7c                 óâ  — 	 t          ¦   «         }|                     ¦   «         5 }|rdnd}|                     d|| f¦  «         |                     ¦   «          ddd¦  «         n# 1 swxY w Y   n)# t          $ r}t          d|› �¦  «         Y d}~nd}~ww xY wdt          ¦   «         v r|r|                     ¦   «          dS dS dS # dt          ¦   «         v r|r|                     ¦   «          w w w xY w)u!   è¨­å®šå€‹äººçš„ LINE é€šçŸ¥é–‹é—œr<   r   z<UPDATE users SET notify_enabled = %s WHERE line_user_id = %sNu    è¨­å®šé€šçŸ¥é–‹é—œç™¼ç”ŸéŒ¯èª¤: rI   )r    r>   r?   rF   r/   r0   r^  rG   )rk  ÚenabledrI   r>   Úvalr8   s         r   Úset_line_notifyrq  #  sT  € ð
ÝÑ Ô ˆØ�YŠY‰[Œ[ð 	˜FØÐ%�!�! AˆCØ�NŠNÐYÐ\_ÐaiÐ[jÑkÔkÐkØ�IŠI‰KŒKˆKð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	øøõ ð 6ð 6ð 6ÝÐ4°Ð4Ð4Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5øøøøð6øøøð •6‘8”8ÐÐ ÐØ�HŠH‰JŒJˆJˆJˆJð ÐÐÐøˆ4•6‘8”8ÐÐ ÐØ�HŠH‰JŒJˆJˆJð ÐøøøsR   ‚"A/ ¤3A#ÁA/ Á#A'Á'A/ Á*A'Á+A/ Á.C Á/
BÁ9BÂC ÂBÂC Ã*C.r   )r<   r²   r#   r#   r#   )&r   Úwerkzeug.securityr   r   r   r   ÚpytzrC   rH  rF  r-   Útimezoner
   r   r    r9   rO   rV   rY   r›   r¬   rÆ   rà   rå   rê   rù   r   r<  r>  rB  rN  rP  rR  rV  re  rg  rm  rq  r   r   r   ú<module>ru     s0  ðØ €€€Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø €€€Ø €€€Ø €€€Ø €€€Ø €€€ð 	ˆŒ�mÑ$Ô$€ðð ð ð	ð 	ð 	ð8ð 8ð 8ðt1ð 1ð 1ðfð ð ð8ð ð ð$Dð Dð Dð DðNð ð ð,Hð Hð HðTGð Gð GðRð ð ðð ð ðFð Fð Fð FðP*ð *ð *ðXIð Ið IðXð ð ðð ð ðð ð ð8ð ð ðð ð ð ð ð ðl4ð 4ð 4ðlð ð ðð ð ð:ð ð ð ð r   