+
    ŽDjM ã            
       óŽ  € ^ RI HtHtHt ^ RIHt ^ RIt^ RIt^ RIt^ RI	H	t	 ^ RI
t
^ RIt^ RIHtHt ^ RIt^ RIt^ RIt]P$                  ! ]P&                  R7       ^ RIt^ RIt^ RIHt ^ RIt^ RIHt ^ R	IHt ^ RIt^ RIt^ RIt^ R
I H t H!t! ^ RIH"t" ]! ]#4      t$]! ]$4       RRRRRRRR/t%^ RIt^ RI&H't' ^ RI(H)t) RRRRRRRRRR/t*R t+R t,R  t-R! t.R" t/R# t0R$t10 Rcmt2R% t3RdR& lt4]$Pk                  R'R(.R)7      R* 4       t6]$Pk                  R+R,.R)7      R- 4       t7]$Pk                  R.R(.R)7      R/ 4       t8]$Pk                  R04      R1 4       t9R2 t:R3 t;]$Pk                  R4R(.R)7      R5 4       t<]$Pk                  R4R,.R)7      R6 4       t=]$Pk                  R7R8.R)7      R9 4       t>]$Pk                  R7R,.R)7      R: 4       t?]$Pk                  R;R,.R)7      R< 4       t@]$Pk                  R;R(.R)7      R= 4       tA]$Pk                  R>R8.R)7      R? 4       tB]$Pk                  R>R@.R)7      RA 4       tC]$Pk                  R7R@.R)7      RB 4       tD]$Pk                  RCR(.R)7      RD 4       tE]$Pk                  RER,.R)7      RF 4       tF]$Pk                  RGR(.R)7      RH 4       tG]$Pk                  RIR,.R)7      RJ 4       tH]$Pk                  RKR,.R)7      RL 4       tI]$Pk                  RMR(.R)7      RN 4       tJ]$Pk                  ROR,.R)7      RP 4       tKRQ tL]$Pk                  RRR(.R)7      RS 4       tM]$Pk                  RTR,.R)7      RU 4       tN]$Pk                  RVR,.R)7      ],RW 4       4       tO]$Pk                  RXR,.R)7      ],RY 4       4       tP]$Pk                  RZR(.R)7      ],R[ 4       4       tQ]$Pk                  R\R(.R)7      ],R] 4       4       tR]#R^8X  d   ]$P§                  R_R`RaRb7       R# R# )eé    )ÚFlaskÚrequestÚjsonify)ÚCORSN)Údatetime)ÚurlparseÚparse_qs)Úlevel)Úsecure_filename©ÚEmailMessage©Úwraps)ÚResponseÚmake_response)Ú	b64decodeÚhostz	127.0.0.1ÚdatabaseÚaliexpress_automationÚuserÚpostgresÚpasswordÚPostgresPass123)ÚMIMEText)ÚMIMEMultipartzsmtp.gmail.comÚportiK  úkampervan.fun@gmail.comÚpasszcxqn pvmj kdmi zhprÚfromz"CamperVAN <no-reply@kampervan.fun>c                 ó~   € \         P                  ! R R4      p\         P                  ! RR4      pW8H  ;'       d    W8H  # )Ú
ADMIN_USERÚadminÚ
ADMIN_PASS)ÚosÚgetenv)Úusernamer   Ú
admin_userÚ
admin_passs   &&  Ú</var/www/html/mycamper/aliexpress-site/backend/api/server.pyÚcheck_admin_authr*   9   s6   € Ü—’˜<¨Ó1€JÜ—’˜<¨Ó1€JØÑ!×<Ð< hÑ&<Ð<ó    c                 ó0   a € \        S 4      V 3R  l4       pV# )c                  ó®   <€ \         P                  pV'       d'   \        VP                  VP                  4      '       g   \        R RRR/4      # S! V / VB # )zAuthentication requiredi‘  zWWW-AuthenticatezBasic realm="Login Required")r   Úauthorizationr*   r&   r   r   )ÚargsÚkwargsÚauthÚfs   *, €r)   Ú	decoratedÚ!requires_admin.<locals>.decorated?   sM   ø€ ä×$Ñ$ˆßÔ+¨D¯M©M¸4¿=¹=×IÒIÜÐ5°sÐ=OÐPnÐ<oÓpÐpÙ�$Ð!˜&Ñ!Ð!r+   r   )r2   r3   s   f r)   Úrequires_adminr5   >   s!   ø€ Ü
ˆ1ƒXô"ó ð"ð
 Ðr+   c                 ó.  € ^ RI Hp ^ RIpV! 4       p\        R,          VR&   WR&   WR&   VP	                  VRR7        VP
                  ! \        R	,          \        R
,          ^R7      pVP                  4        VP                  4        VP                  4        VP                  \        R,          \        R,          4       VP                  V4       VP                  4        R#   \         d&   p\        RT 24       R\        T4      3u Rp?# Rp?ii ; i)r   r   Nr   ÚFromÚToÚSubjectÚhtml)Úsubtyper   r   )Útimeoutr   r   zSMTP ERROR: F)TN)Úemail.messager   ÚsmtplibÚSMTP_CONFIGÚadd_alternativeÚSMTPÚehloÚstarttlsÚloginÚsend_messageÚquitÚ	ExceptionÚprintÚstr)Úto_emailÚsubjectÚ	body_htmlr   r>   ÚmsgÚserverÚes   &&&     r)   Úsend_email_genericrP   H   sÞ   € Ý*Ûá
‹.€CÜ˜fÕ%€Cˆ�KØˆ�IØˆ	�NØ×Ñ˜	¨6ÐÔ2ðØ—’œk¨&Õ1´;¸vÕ3FÐPRÔSˆØ�‰ŒØ�‰ÔØ�‰ŒØ�‰”[ Õ(¬+°fÕ*=Ô>Ø×Ñ˜CÔ Ø�‰ŒØÐøÜô Ü�˜Q˜CÐ Ô!Ø”c˜!“fˆ}Õûðús   ¾B%C$ Ã$DÃ/DÄ	DÄDc                 óº   €  \        R\         24       \        P                  ! R/ \        B p \        R4       V #   \         d   p\        RT 24       h Rp?ii ; i)uB   ÐŸÐ¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ðµ Ñ�Ð¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ� Ñ� Ð±Ð°Ð·Ð¾Ð¹ Ð´Ð°Ð½Ð½Ñ‹Ñ…uN   ðŸ”Œ ÐŸÐ¾Ð¿Ñ‹Ñ‚ÐºÐ° Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ� Ðº Ð‘Ð” Ñ� Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸: uF   âœ… Ð¡Ð¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ðµ Ñ� Ð‘Ð” ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¾ ÑƒÑ�Ð¿ÐµÑˆÐ½Ð¾u1   â�Œ ÐžÑˆÐ¸Ð±ÐºÐ° Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ� Ðº Ð‘Ð”: N© )rH   Ú	DB_CONFIGÚpsycopg2ÚconnectrG   )ÚconnrO   s     r)   Úget_db_connectionrW   `   s]   € ðÜÐ^Ô_hÐ^iÐjÔkÜ×ÒÑ,¤)Ñ,ˆÜÐVÔWØˆøÜô ÜÐAÀ!ÀÐEÔFØûðús   ‚8; »AÁAÁAc                ól   €  \        V 4      p\        VP                  VP                  .4      #     R# ; i)u   Ð’Ð°Ð»Ð¸Ð´Ð°Ñ†Ð¸Ñ� URLF)r   ÚallÚschemeÚnetloc)ÚurlÚresults   & r)   Úvalidate_urlr^   k   s2   € ðÜ˜#“ˆÜ�F—M‘M 6§=¡=Ð1Ó2Ð2øðÚús   ‚+. ®3c                óØ   €  \         P                  ! RV 4      pV'       d   VP                  ^4      # \         P                  ! RV 4      pV'       d   VP                  ^4      # R#     R# ; i)u8   Ð˜Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ðµ ID Ñ‚Ð¾Ð²Ð°Ñ€Ð° Ð¸Ð· URL AliExpressz(\d+)\.htmlz
item/(\d+)N)ÚreÚsearchÚgroup)r\   Úmatchs   & r)   Úextract_product_id_from_urlrd   s   sX   € ðä—	’	˜.¨#Ó.ˆßØ—;‘;˜q“>Ð!ô —	’	˜-¨Ó-ˆßØ—;‘;˜q“>Ð!áøðÚús   ‚A$ ¡A$ ²A$ ÁA$ Á$A)z?/var/www/html/mycamper/aliexpress-site/frontend/images/productsc                 óx   € R V 9   ;'       d/    V P                  R ^4      ^,          P                  4       \        9   # )Ú.)ÚrsplitÚlowerÚALLOWED_EXTENSIONS)Úfilenames   &r)   Úallowed_filerk   ‰   s3   € Ø�(‰?×WÐW˜xŸ™¨s°AÓ6°qÕ9×?Ñ?ÓAÔEWÑWÐWr+   c                ó¤  €  RV 9   dG   V P                  R^4      w  r#RV9   d   RpM,RV9   g   RV9   d   RpMRV9   d   RpMRV9   d   RpMRpMT pRp\        \        P                  ! 4       4      pV'       d   RV R	V R
V 2pMRV R
V 2p\        P
                  P                  \        V4      p\        P                  ! \        RR7       \        P                  ! V4      p\        VR4      ;_uu_ 4       p	V	P                  V4       RRR4       RV 2p
V
R3#   + '       g   i     L; i  \         d   pR\        T4      3u Rp?# Rp?ii ; i)u>   Ð¡Ð¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ðµ base64 Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ� Ð² Ñ„Ð°Ð¹Ð»údata:image/Ú,ÚpngÚjpegÚjpgÚgifÚwebpÚproduct_Ú_rf   Úimage_T)Úexist_okÚwbNz/frontend/images/products/)ÚsplitrI   ÚuuidÚuuid4r$   ÚpathÚjoinÚUPLOAD_FOLDERÚmakedirsÚbase64r   ÚopenÚwriterG   )Úbase64_dataÚ
product_idÚheaderÚdataÚextÚ	unique_idrj   ÚfilepathÚ
image_datar2   Úfile_urlrO   s   &&          r)   Úsave_base64_imagerŒ   Œ   sA  € ð*à˜KÔ'Ø&×,Ñ,¨S°!Ó4‰LˆFà˜ŒØ‘Ø˜6Ô! U¨f¤_Ø‘Ø˜&”Ø‘Ø˜6Ô!Ø‘à‘àˆDØˆCô œŸ
š
›Ó%ˆ	ßØ! * ¨Q¨y¨k¸¸3¸%Ð@‰Hà 	˜{¨!¨C¨5Ð1ˆHô —7‘7—<‘<¤¨xÓ8ˆô 	�Š”M¨DÕ1ô ×%Ò% dÓ+ˆ
Ü�(˜D×!Ô! QØ�G‰G�JÔ÷ "ð 0°¨zÐ:ˆØ˜ˆ~Ð÷ "×!ûô ô Ø”S˜“Vˆ|Õûðús6   ‚C5D- Ã7DÄ	D- ÄD*	Ä%D- Ä-EÄ8E
ÅEÅ
Ez/api/upload-imageÚPOST)Úmethodsc            	     óz  €  \         P                  ! 4       p V '       d   RV 9  d   \        RRRR/4      R3# V R,          pV P                  R4      p\	        W4      w  r4V'       d   \        RRRRV 2/4      R	3# \        RR
RVRR/4      #   \
         d%   p\        RRR\        T4      /4      R	3u Rp?# Rp?ii ; i)u7   Endpoint Ð´Ð»Ñ� Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ÚimageÚsuccessFÚerroru6   Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ Ð½Ðµ Ð¿Ñ€ÐµÐ´Ð¾Ñ�Ñ‚Ð°Ð²Ð»ÐµÐ½Ð¾é�  r„   u:   ÐžÑˆÐ¸Ð±ÐºÐ° Ñ�Ð¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ� Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ�: éô  TÚ	image_urlÚmessageu8   Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ ÑƒÑ�Ð¿ÐµÑˆÐ½Ð¾ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð¾N)r   Úget_jsonr   ÚgetrŒ   rG   rI   )r†   Úbase64_imager„   r‹   r’   rO   s         r)   Úupload_imagerš   º   s   € ðÜ×ÒÓ!ˆç�w dÔ*ÜØ˜5ØÐQðó ð ðð ð
 ˜G•}ˆØ—X‘X˜lÓ+ˆ
ô ,¨LÓE‰ˆçÜØ˜5ØÐUÐV[ÐU\Ð]ðó ð ðð ô
 Ø�tØ˜ØÐQð
ó ð 	øô ô ÜØ�uØ”S˜“Vð
ó ð ðõ 	ûðús.   ‚B ŸB ·AB Á:B ÂB:ÂB5Â/B:Â5B:z!/api/newsletter/subscribers-countÚGETc            	      óJ  €  \        4       p V P                  4       pVP                  R 4       VP                  4       ^ ,          pVP	                  4        V P	                  4        \        RRRV/4      #   \         d%   p\        RRR\        T4      /4      R3u Rp?# Rp?ii ; i)zCSELECT COUNT(*) FROM newsletter_subscribers WHERE confirmed = TRUE;r‘   TÚcountFr’   r”   N)rW   ÚcursorÚexecuteÚfetchoneÚcloser   rG   rI   )rV   Úcurr�   rO   s       r)   Úget_subscribers_countr£   à   s�   € ð
AÜ Ó"ˆØ�k‰k‹mˆà�‰ÐYÔZØ—‘“˜qÕ!ˆØ�	‰	ŒØ�
‰
ŒÜ˜	 4¨°%Ð8Ó9Ð9øÜô AÜ˜	 5¨'´3°q³6Ð:Ó;¸SÐ@Õ@ûðAús   ‚A0A3 Á3B"Á>BÂB"ÂB"z/api/newsletter/sendc            	      óò  € \         P                  p V P                  R 4      pV P                  R4      pV P                  RR4      pV'       d	   V'       g   \        RRRR/4      R3#  \	        4       pVP                  4       pV'       d   \        R,          .pM6VP                  R	4       VP                  4        Uu. uF  qw^ ,          NK  	  ppVP                  4        VP                  4        V'       g   \        RRRR
/4      R3# ^ pV F$  p	\        W‘V4      w  r«V
'       g   K  V^,          pK&  	  \        RRRV/4      # u upi   \         d%   p\        RRR\        T4      /4      R3u Rp?# Rp?ii ; i)rK   ÚbodyÚisTestFr‘   r’   u-   Ð¢ÐµÐ¼Ð° Ð¸ Ñ‚ÐµÐºÑ�Ñ‚ Ð¾Ð±Ñ�Ð·Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹r“   r   z@SELECT email FROM newsletter_subscribers WHERE confirmed = TRUE;u.   Ð�ÐµÑ‚ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ñ… Ð¿Ð¾Ð´Ð¿Ð¸Ñ�Ñ‡Ð¸ÐºÐ¾Ð²é”  TÚ
sent_countr”   N)r   Újsonr˜   r   rW   rž   r?   rŸ   Úfetchallr¡   rP   rG   rI   )r†   rK   r¥   Úis_testrV   r¢   ÚemailsÚrowr¨   Úemailr‘   ÚerrrO   s                r)   Úsend_newsletterr°   ð   sV  € ô �<‰<€DØ�h‰h�yÓ!€GØ�8‰8�FÓ€DØ�h‰h�x Ó'€GçŸ$Ü˜	 5¨'Ð3bÐcÓdÐfiÐiÐiðAÜ Ó"ˆØ�k‰k‹mˆçä! &Õ)Ð*‰Fð �K‰KÐZÔ[Ø(+¯©¬Ó7© ˜!—f�f©ˆFÐ7à�	‰	ŒØ�
‰
ŒçÜ˜I u¨gÐ7gÐhÓiÐknÐnÐnàˆ
ÛˆEä-¨e¸dÓC‰LˆGß‰wØ˜a•’
ñ	 ô ˜	 4¨°zÐBÓCÐCùò 8øô" ô AÜ˜	 5¨'´3°q³6Ð:Ó;¸SÐ@Õ@ûðAúsC   Á'AE Â;EÃ)E Ã6E ÄE Ä&E ÅE ÅE6ÅE1Å+E6Å1E6z"/static/images/products/<filename>c                ó<   €  ^ RI Hp V! \        V 4      #    Ru # ; i)u:   ÐžÑ‚Ð´Ð°Ñ‡Ð° Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð½Ñ‹Ñ… Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹)Úsend_from_directory)zFile not foundr§   )Úflaskr²   r~   )rj   r²   s   & r)   Úuploaded_filer´     s$   € ð%Ý-Ù"¤=°(Ó;Ð;øð%Ø$Ò$ús   ‚ •c                ó:  a€ V R,           V,           P                  4       oR. ROR. ROR. ROR. ROR. ROR. ROR. RO/pVP                  4        FI  w  r4\        ;QJ d    V3R	 lV 4       F  '       g   K   R
M	  RM! V3R	 lV 4       4      '       g   KG  Vu # 	  R# )uS   Ð�Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑ�ÐºÐ¾Ðµ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ðµ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð¸ Ñ‚Ð¾Ð²Ð°Ñ€Ð°Ú ÚelectronicsÚ	electricsÚcookingÚcomfortÚtoolsÚsafetyÚwaterc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5i©NrR   )Ú.0ÚkeywordÚtexts   & €r)   Ú	<genexpr>Ú%categorize_product.<locals>.<genexpr>5  s   øé € Ð7©h 7˜$Ž«hùs   ƒTFÚother)u   panel sÅ‚onecznyÚbateriaÚfalowniku
   Å‚adowarkaÚlatarkaÚradioÚgpsÚ	nawigatorrÆ   z
power bankz	dioda LEDu   oÅ›wietlenie)ÚprzewodÚzarowkaÚgniazdkoÚ	sterowniku   ZÅ‚Ä…cze)	ÚkuchenkaÚgarnekÚpatelniau   lodÃ³wkaÚtermosÚnaczyniaÚgazÚpalnikÚrondel)
u   Å›piwÃ³rÚpoduszkaÚmateracÚkocu   krzesÅ‚ou   stÃ³Å‚u   leÅ¼ankaÚhamakÚnamiotÚmarkiza)	u
   narzÄ™dzieu   Å›rubokrÄ™tÚkluczÚpompau   sprÄ™Å¼arkau
   podnoÅ›nikÚkabelÚlinau   wyciÄ…garka)Úapteczkau   gaÅ›nicaÚalarmÚzamekÚsejfÚczujnikÚkameraÚzabezpieczenia)	Úfiltrrß   ÚzbiornikÚkranu   wÄ…Å¼ÚprysznicÚtoaletaÚszamboÚczyszczenie)rh   ÚitemsÚany)ÚtitleÚdescriptionÚ
categoriesÚcategoryÚkeywordsrÂ   s   &&   @r)   Úcategorize_productr÷   %  s“   ø€ à�C�K˜+Õ%×,Ñ,Ó.€Dð 	ò  oØÒPØÒrØÒ}ØÒ}ØÒkØÒpð€Jð )×.Ñ.Ö0Ñˆß‹3Ô7©hÓ7�3�3Š3Ô7©hÓ7×7Ô7ØŠOñ 1ñ r+   c                ó$  €  \        4       pVP                  \        P                  P                  R7      pVP                  RV 34       . pVP                  4        Fi  pTP                  RVR,          RVR,          RVR,          RVR,          RVR,          RVR,          '       d   VR,          P                  4       MR	/4       Kk  	  VP                  4        VP                  4        V#   \         d   p\        R
T 24       . u R	p?# R	p?ii ; i)õ?   ÐŸÐ¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ðµ Ð²Ñ�ÐµÑ… Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ Ñ‚Ð¾Ð²Ð°Ñ€Ð°©Úcursor_factoryzÃ
            SELECT id, image_url, is_main, sort_order, alt_text, created_at
            FROM product_images
            WHERE product_id = %s
            ORDER BY sort_order ASC, id ASC
        Úidr•   Úis_mainÚ
sort_orderÚalt_textÚ
created_atNzError getting product images: )rW   rž   rT   ÚextrasÚ
DictCursorrŸ   rª   ÚappendÚ	isoformatr¡   rG   rH   )r„   rV   rž   Úimagesr­   rO   s   &     r)   Úget_product_imagesr  :  s÷   € ðÜ Ó"ˆØ—‘¬H¯O©O×,FÑ,F�ÓGˆà�‰ð ð
 ˆ]ô	ð ˆØ—?‘?Ö$ˆCØ�M‰MØ�c˜$•iØ˜S Õ-Ø˜3˜y�>Ø˜c ,Õ/Ø˜C 
�OØ¸sÀ<×?PÔ?P˜c ,Õ/×9Ñ9Ô;ÐVZðö ñ %ð 	�‰ŒØ�
‰
ŒàˆøÜô ÜÐ.¨q¨cÐ2Ô3Ø�	ûðús   ‚C'C* Ã*DÃ5D
ÄDÄ
Dz/api/productsc                 ó`  € Rp Rp \         P                  ! 4       p\        RV 24       . RlOpV F1  pVP                  V4      '       d   K  \	        RRRR	V R
2/4      R3u # 	  \        VR,          4      '       g   \	        RRRR/4      R3#  \        VR,          4      pV^ 8  d   \	        RRRR/4      R3#  \        TR,          4      pTP                  R4      pT'       g$   \        TR,          TP                  RR4      4      p\        4       p T P                  4       pRT n        \        R4       TP                  RTR,          T34       TP                  4       pT'       d'   \        RT^ ,           24       \	        RRRR/4      R3# TP                  R4      p	T	'       d^   \        T	\         4      '       d   \"        P$                  ! T	4      p	M0\        T	\&        4      '       d    \"        P(                  ! T	4       MRp	RmR lp
RnR lpRoR lp\        RT	 24       \        R4       RpT! TP                  R4      R4      T! TP                  R4      4      T! TP                  R4      4      T
! TP                  R4      ^ 4      TP                  R4      '       d   T
! TP                  R4      4      MRT! TP                  R 4      4      T! T4      T! TP                  R!4      4      T! TP                  R4      R4      T
! TP                  R"4      ^ 4      T! TP                  R#4      ^ 4      T! T4      R$\,        P.                  ! 4       \,        P.                  ! 4       .p\        R%4       \1        T4       F,  w  pp\        R&T^,           R' R(T R)\3        T4       R*24       K.  	  \        R+4       TP                  YÞ4       TP                  4       ^ ,          p\        R,T 24       . p. pRpT	'       dI   \        T	\         4      '       d   \"        P$                  ! T	4      pM\        T	\&        4      '       d   T	pMRpR-T! TP                  R-4      4      RTR.T! TP                  R.4      4      R/T! TP                  R/4      4      R0TP                  R04      '       d   T
! TP                  R04      4      MRR1T! TP                  R14      4      R2T! TP                  R24      4      /p\        R34       TP5                  4        Ft  w  pp\        R&T R4T R)\3        T4       R*24       \        T\         4      '       g   K<  \        R5T R624       \"        P$                  ! T4      pTTT&   \        R7T 24       Kv  	  TP5                  4        F:  w  ppTf   K  TR8w  g   K  TP7                  T R824       TP7                  T4       K<  	  T'       d`   TP7                  T4       R9R:P9                  T4       R;2p\        R<T 24       \        R=T 24       TP                  TT4       \        R>4       TP                  R?. 4      p\        R@\;        T4       RA24       T'       EdS   \        RB\;        T4       RC24        TP                  RD4       \        RE4       \1        T4       EFÔ  w  pp Rp\        RGT^,            24       \        T\&        4      '       d   TP?                  4       pMN\        T\         4      '       d"   TP                  RHR4      P?                  4       pM\        RIT^,            24       K”  TPA                  RJ4      '       dc   \        RKT^,            RL24       \C        TT4      w  ppT'       d   \        RMT^,            R4T 24       Kò  Tp\        RNT^,            ROT 24       MSTPA                  Rp4      '       d$   \        RPT^,            RQTRR,           RS24       TpM\        RTT^,            RU24       EK`  T'       dm   \        RVT^,            RW24       TP                  RXTTT^ 8H  TRYT^,            234       TP                  4       ^ ,          p\        RNT^,            RZT 24       EKÔ  EK×  	  TP                  R\T34       TP                  4       ^ ,          p!\        R]T! 24       M\        R^4       \        R_4       T PI                  4        TP                  R`T34       TP                  4       ^ ,          p"\        RaT" RbT 24       TPK                  4        T PK                  4        \        RcT Rd24       \	        RReRfRgRhT/4      ^É3#   \         d    \	        RRRR/4      R3u # i ; i  \"        P*                   d    Rp	 EL�i ; i  \<         d   p\        RFT 24        Rp?ELRp?ii ; i  \<         d9   p\        R[T^,            R4T 24       ^ RI"p T PG                  4         Rp?EKZ  Rp?ii ; i  \<         d£   p#\        RiT# 24       ^ RI"p T PG                  4        T '       d%    T PM                  4        \        Rj4       M    M; iT'       d   TPK                  4        T '       d   T PK                  4        \	        RRR\'        T#4      /4      Rk3u Rp#?## Rp#?#ii ; i)qu.   Ð”Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñ‚Ð¾Ð²Ð°Ñ€Ð°NuM   ðŸ“¥ ÐŸÐ¾Ð»ÑƒÑ‡ÐµÐ½Ñ‹ Ð´Ð°Ð½Ð½Ñ‹Ðµ Ð´Ð»Ñ� Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ� Ñ‚Ð¾Ð²Ð°Ñ€Ð°: rò   ÚpriceÚaliexpress_linkr‘   Fr’   õ	   ÐŸÐ¾Ð»Ðµ õ3    Ð¾Ð±Ñ�Ð·Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð¾ Ð´Ð»Ñ� Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ�r“   õ!   Ð�ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¹ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ URLõ<   Ð¦ÐµÐ½Ð° Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ‚ Ð±Ñ‹Ñ‚ÑŒ Ð¾Ñ‚Ñ€Ð¸Ñ†Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹õ&   Ð�ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¹ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ Ñ†ÐµÐ½Ñ‹rõ   Úoriginal_descriptionÚ õ*   ðŸ”„ Ð�Ð°Ñ‡Ð¸Ð½Ð°ÐµÐ¼ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÑŽz—
            SELECT id FROM products 
            WHERE aliexpress_link = %s OR (external_product_id = %s AND external_product_id IS NOT NULL)
        õ>   â�Œ Ð¢Ð¾Ð²Ð°Ñ€ Ñ� Ñ‚Ð°ÐºÐ¸Ð¼ URL ÑƒÐ¶Ðµ Ñ�ÑƒÑ‰ÐµÑ�Ñ‚Ð²ÑƒÐµÑ‚: õ8   Ð¢Ð¾Ð²Ð°Ñ€ Ñ� Ñ‚Ð°ÐºÐ¸Ð¼ URL ÑƒÐ¶Ðµ Ñ�ÑƒÑ‰ÐµÑ�Ñ‚Ð²ÑƒÐµÑ‚é™  Úspecificationsc                 ót   € V e   V R8X  g   V R8X  d   V#  \        V 4      #   \        \        3 d    Tu # i ; i©Nr  ÚNone©ÚfloatÚ
ValueErrorÚ	TypeError©ÚvalueÚdefaults   &&r)   Ú
safe_floatÚadd_product.<locals>.safe_float²  ó@   € ØŠ} ¨¤¨u¸¬Ø�ðÜ˜U“|Ð#øÜ¤	Ð*ô Ø’ðúó   –
! ¡7¶7c                 ó†   € V e   V R8X  g   V R8X  d   V#  \        \        V 4      4      #   \        \        3 d    Tu # i ; ir  ©Úintr  r  r  r  s   &&r)   Úsafe_intÚadd_product.<locals>.safe_intº  óE   € ØŠ} ¨¤¨u¸¬Ø�ðÜœ5 ›<Ó(Ð(øÜ¤	Ð*ô Ø’ðúó   –* ªA ¿A c                 ó¤   € V e   V R8X  g   V R8X  d   V# \        V \        \        34      '       d   \        P                  ! V 4      # \        V 4      # r  ©Ú
isinstanceÚdictÚlistr©   ÚdumpsrI   r  s   &&r)   Úsafe_strÚadd_product.<locals>.safe_strÂ  sB   € ØŠ} ¨¤¨u¸¬Ø�Ü˜%¤$¬ ×.Ò.Ü—z’z %Ó(Ð(Ü�u“:Ðr+   u<   ðŸ“Š ÐŸÐ¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ñ‹Ðµ Ñ�Ð¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸: u@   ðŸ”„ Ð˜Ñ�Ð¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼ ÑƒÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð½ÑƒÑŽ Ð²Ñ�Ñ‚Ð°Ð²ÐºÑƒ...a†  
            INSERT INTO products (
                title, ai_description, original_description, price, original_price,
                main_image, category, epn_link, aliexpress_link, rating, orders_count,
                external_product_id, status, created_at, updated_at
            ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            RETURNING id
        Úai_descriptionÚoriginal_priceÚ
main_imageÚepn_linkÚratingÚorders_countÚactiveu@   ðŸ”� ÐŸÑ€Ð¾Ð²ÐµÑ€ÐºÐ° ÑƒÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð½Ñ‹Ñ… Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð²:z  Ú2dz. u
    (Ñ‚Ð¸Ð¿: Ú)uK   ðŸš€ Ð’Ñ‹Ð¿Ð¾Ð»Ð½Ñ�ÐµÐ¼ ÑƒÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð½ÑƒÑŽ Ð²Ñ�Ñ‚Ð°Ð²ÐºÑƒ Ñ‚Ð¾Ð²Ð°Ñ€Ð°...u'   âœ… Ð¢Ð¾Ð²Ð°Ñ€ Ð²Ñ�Ñ‚Ð°Ð²Ð»ÐµÐ½ Ñ� ID: Údetailed_descriptionÚshipping_infoÚ	video_urlÚweightÚ
dimensionsÚwarranty_infou>   ðŸ”� ÐŸÑ€Ð¾Ð²ÐµÑ€ÐºÐ° Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… Ð¿Ð¾Ð»ÐµÐ¹:ú: u       â�Œ Ð¡Ð›ÐžÐ’Ð�Ð Ð¬ Ð² u   ! ÐŸÑ€ÐµÐ¾Ð±Ñ€Ð°Ð·ÑƒÐµÐ¼...u$       âœ… ÐŸÑ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¾: ú = %sz6
                UPDATE products 
                SET ú, z+
                WHERE id = %s
            u?   ðŸ”„ ÐžÐ±Ð½Ð¾Ð²Ð»Ñ�ÐµÐ¼ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ðµ Ð¿Ð¾Ð»Ñ�: u.   ðŸ”¢ ÐŸÐ°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ�: u<   âœ… Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ðµ Ð¿Ð¾Ð»Ñ� Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ñ‹r  uM   ðŸ–¼ï¸� ÐŸÐ¾Ð»ÑƒÑ‡ÐµÐ½Ñ‹ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ� Ð´Ð»Ñ� Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ�: õ    ÑˆÑ‚.u,   ðŸ–¼ï¸� Ð�Ð°Ñ‡Ð¸Ð½Ð°ÐµÐ¼ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÑƒ u    Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹aÔ  
                    CREATE TABLE IF NOT EXISTS product_images (
                        id SERIAL PRIMARY KEY,
                        product_id INTEGER NOT NULL,
                        image_url TEXT NOT NULL,
                        is_main BOOLEAN DEFAULT FALSE,
                        sort_order INTEGER DEFAULT 0,
                        alt_text VARCHAR(255),
                        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                        
                        CONSTRAINT fk_product_images_product_id 
                            FOREIGN KEY (product_id) 
                            REFERENCES products(id) 
                            ON DELETE CASCADE
                    );
                u.   âœ… Ð¢Ð°Ð±Ð»Ð¸Ñ†Ð° product_images Ð³Ð¾Ñ‚Ð¾Ð²Ð°u2   â�Œ ÐžÑˆÐ¸Ð±ÐºÐ° Ñ�Ð¾Ð·Ð´Ð°Ð½Ð¸Ñ� Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹: u/   ðŸ”� ÐžÐ±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ� r•   õ<   âš ï¸� Ð�ÐµÐ¸Ð·Ð²ÐµÑ�Ñ‚Ð½Ñ‹Ð¹ Ñ‚Ð¸Ð¿ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ� rm   õ   ðŸ“¥ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ õ@    Ð² Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ðµ base64, Ñ�Ð¾Ñ…Ñ€Ð°Ð½Ñ�ÐµÐ¼ ÐºÐ°Ðº Ñ„Ð°Ð¹Ð»...õ=   â�Œ ÐžÑˆÐ¸Ð±ÐºÐ° Ñ�Ð¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ� Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ� õ   âœ… Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ õ%    Ñ�Ð¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¾ ÐºÐ°Ðº Ñ„Ð°Ð¹Ð»: õ   ðŸ”— Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ õ    Ð¿Ð¾ URL: ºNéd   Nú...õ   âš ï¸� Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ õE    Ð¸Ð¼ÐµÐµÑ‚ Ð½ÐµÐ¸Ð·Ð²ÐµÑ�Ñ‚Ð½Ñ‹Ð¹ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚, Ð¿Ñ€Ð¾Ð¿ÑƒÑ�ÐºÐ°ÐµÐ¼õ/   ðŸš€ Ð”Ð¾Ð±Ð°Ð²Ð»Ñ�ÐµÐ¼ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ õ    Ð² Ð‘Ð”úè
                            INSERT INTO product_images (product_id, image_url, is_main, sort_order, alt_text)
                            VALUES (%s, %s, %s, %s, %s)
                            RETURNING id
                        úImage õ    Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ Ñ� ID õB   â�Œ ÐžÑˆÐ¸Ð±ÐºÐ° Ð¿Ñ€Ð¸ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐµ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ� z9SELECT COUNT(*) FROM product_images WHERE product_id = %su;   ðŸ“Š Ð˜Ñ‚Ð¾Ð³Ð¾ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹: u=   â„¹ï¸� Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ� Ð½Ðµ Ð¿Ñ€ÐµÐ´Ð¾Ñ�Ñ‚Ð°Ð²Ð»ÐµÐ½Ñ‹õ-   ðŸ’¾ ÐšÐ¾Ð¼Ð¼Ð¸Ñ‚Ð¸Ð¼ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÑŽ...z+SELECT COUNT(*) FROM products WHERE id = %su9   ðŸ”� Ð¤Ð¸Ð½Ð°Ð»ÑŒÐ½Ð°Ñ� Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ°: Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾ u    Ñ‚Ð¾Ð²Ð°Ñ€Ð¾Ð² Ñ� ID õ   âœ… Ð¢Ð¾Ð²Ð°Ñ€ ID uQ    ÑƒÑ�Ð¿ÐµÑˆÐ½Ð¾ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ Ð¸ Ð·Ð°ÐºÐ¾Ð¼Ð¼Ð¸Ñ‡ÐµÐ½ Ð² Ð±Ð°Ð·Ñƒ Ð´Ð°Ð½Ð½Ñ‹Ñ…Tr–   u*   Ð¢Ð¾Ð²Ð°Ñ€ ÑƒÑ�Ð¿ÐµÑˆÐ½Ð¾ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½r„   u;   â�Œ ÐžÑˆÐ¸Ð±ÐºÐ° Ð¿Ñ€Ð¸ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ð¸ Ñ‚Ð¾Ð²Ð°Ñ€Ð°: õ*   ðŸ”„ Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ� Ð¾Ñ‚ÐºÐ°Ñ‡ÐµÐ½Ð°r”   ©rò   r  r	  ©g        ©r   )r  ©zhttp://zhttps://)'r   r—   rH   r˜   r   r^   r  r  rd   r÷   rW   rž   Ú
autocommitrŸ   r    r-  r.  r©   r0  rI   ÚloadsÚJSONDecodeErrorr   ÚnowÚ	enumerateÚtyperð   r  r}   ÚlenrG   ÚstripÚ
startswithrŒ   Ú	tracebackÚ	print_excÚcommitr¡   Úrollback)$rV   rž   r†   Úrequired_fieldsÚfieldr  r„   rõ   Úexistingr  r   r'  r1  Úsimple_insert_queryÚsimple_paramsÚir  Únew_product_idÚupdate_fieldsÚupdate_paramsÚsafe_specificationsÚadditional_fieldsÚupdate_queryr  Úcreate_errorr�   r•   rŠ   r‹   r’   Úimage_idÚ	img_errorri  Úadded_images_countÚfinal_checkrO   s$                                       r)   Úadd_productr~  \  sÀ
  € ð €DØ€FðSÜ×ÒÓ!ˆÜÐ]Ð^bÐ]cÐdÔeò @ˆÛ$ˆEØ—8‘8˜E—?”?ÜØ˜uØ˜y¨¨Ð/bÐcð ó ð ðò ñ %ô ˜DÐ!2Õ3×4Ò4ÜØ˜5ØÐ<ðó ð ðð ð	Ü˜$˜w�-Ó(ˆEØ�qŒyÜØ˜uØÐ[ð ó ð ðð ð ô 1°Ð6GÕ1HÓIˆ
ð —8‘8˜JÓ'ˆßÜ)Ø�W•Ø—‘Ð/°Ó4óˆHô !Ó"ˆØ—‘“ˆð  ˆŒÜÐ:Ô;ð 	�‰ð ð Ð$Õ% zÐ2ô	4ð
 —?‘?Ó$ˆßÜÐRÐS[Ð\]ÕS^ÐR_Ð`ÔaÜØ˜5ØÐSðó ð ðð ð Ÿ™Ð"2Ó3ˆßÜ˜.¬$×/Ò/Ü!%§¢¨NÓ!;‘Ü˜N¬C×0Ò0ð*Ü—J’J˜~Õ.ð "&�ô	ô	ô	ô 	ÐLÈ^ÐL\Ð]Ô^ô 	ÐPÔQðÐñ �T—X‘X˜gÓ&¨Ó+Ù�T—X‘XÐ.Ó/Ó0Ù�T—X‘XÐ4Ó5Ó6Ù�t—x‘x Ó(¨!Ó,Ø6:·h±hÐ?O×6PÒ6P‰J�t—x‘xÐ 0Ó1Ô2ÐVZÙ�T—X‘X˜lÓ+Ó,Ù�XÓÙ�T—X‘X˜jÓ)Ó*Ù�T—X‘XÐ/Ó0°"Ó5Ù�t—x‘x Ó)¨1Ó-Ù�T—X‘X˜nÓ-¨qÓ1Ù�ZÓ ØÜ�LŠL‹NÜ�LŠL‹Nð
ˆô$ 	ÐPÔQÜ! -Ö0‰HˆAˆuÜ�B�q˜•s˜2�h˜b   z´$°u³+°¸aÐ@ÖAñ 1ô 	Ð[Ô\Ø�‰Ð*Ô:ð  Ÿ™Ó*¨1Õ-ˆÜÐ7¸Ð7GÐHÔIð ˆØˆð #ÐßÜ˜.¬$×/Ò/Ü&*§j¢j°Ó&@Ñ#Ü˜N¬C×0Ò0Ø&4Ñ#à&*Ð#ð #¡H¨T¯X©XÐ6LÓ-MÓ$NØÐ1Ø™X d§h¡h¨Ó&?Ó@Ø™ $§(¡(¨;Ó"7Ó8Ø¸¿¹À×8JÒ8J‘j §¡¨(Ó!3Ô4ÐPTØ™( 4§8¡8¨LÓ#9Ó:Ø™X d§h¡h¨Ó&?Ó@ð
Ðô 	ÐNÔOØ-×3Ñ3Ö5‰LˆE�5Ü�B�u�g˜R ˜w j´°e³°¸QÐ?Ô@Ü˜%¤×&Ô&ÜÐ2°5°'Ð9TÐUÔVÜŸ
š
 5Ó)�Ø+0Ð! %Ñ(ÜÐ<¸U¸GÐDÖEñ 6ð .×3Ñ3Ö5‰LˆE�5ØÔ  U¨b¦[Ø×$Ñ$¨ w¨e _Ô5Ø×$Ñ$ UÖ+ñ 6÷
 Ø× Ñ  Ô0ð à—Y‘Y˜}Ó-Ð.ð /ðˆLô
 ÐSÐTaÐSbÐcÔdÜÐBÀ=À/ÐRÔSØ�N‰N˜<¨Ô7ÜÐPÔQð
 —‘˜( BÓ'ˆÜÐ]Ô^aÐbhÓ^iÐ]jÐjpÐqÔrçˆ6ÜÐ@ÄÀVÃÀÐMdÐeÔfð[Ø—‘ð  ô ô  ÐFÔGô
 & f×-‘��5ð8Ø $�IäÐKÈAÈaÍCÈ5ÐQÔRä! %¬×-Ò-Ø%*§[¡[£]™
Ü# E¬4×0Ò0Ø%*§Y¡Y¨{¸BÓ%?×%EÑ%EÓ%G™
äÐ \Ð]^Ð_`Õ]`Ð\aÐbÔcÙ ð "×,Ñ,¨]×;Ò;ÜÐ <¸Q¸q½S¸Eð  BBð  Cô  Dô +<¸JÈÓ*W™˜ %ç Ü!Ð$aÐbcÐdeÕbeÐafÐfhÐinÐhoÐ"pÔqÙ$à$,˜	ÜÐ ;¸A¸a½C¸5Ð@eÐfoÐepÐqÕrà#×.Ñ.Ð/F×GÒGÜÐ <¸Q¸q½S¸EÀÈZÐX\ÕM]ÐL^Ð^aÐbÔcØ$.™	ô Ð >¸qÀ½s¸eð  DIð  Jô  KÚ ç ÜÐ OÐPQÐRSÕPSÈuÐT\Ð]Ô^ØŸ™ð (ð
 +Ø%Ø ™FØØ$ Q q¥S E˜Nðô	
ð $*§?¡?Ó#4°QÕ#7˜ÜÐ ;¸A¸a½C¸5Ð@ZÐ[cÐZdÐe×fò !ñI .ðx �N‰NÐVÐYgÐXiÔjØ!'§¡Ó!2°1Õ!5ÐÜÐOÐPbÐOcÐdÕeäÐQÔRô
 	Ð=Ô>Ø�‰Œð 	�‰ÐDÀ~ÐFWÔXØ—o‘oÓ'¨Õ*ˆÜÐIÈ+ÈÐVlÐm{Ðl|Ð}Ô~à�‰ŒØ�
‰
ŒäÐ" >Ð"2ð  3Dð  Eô  	FäØ�tØÐCØ˜.ð
ó ð ð	ð 	øôw ô 	ÜØ˜5ØÐAðó ð ðò ð	ûô^ ×+Ñ+ô *Ø%)“Nð*ûôl ô [ÜÐJÈ<È.ÐY×ZÒZûð[ûôr !ô ÜÐ^Ð_`ÐabÕ_bÐ^cÐceÐfoÐepÐqÔrÛ$Ø×'Ñ'Ô)Þûð	ûôF ô ÜÐKÈAÈ3ÐOÔPÛØ×ÑÔ÷ ðØ—‘”ÜÐBÕCøðÙú÷ Ø�L‰LŒNßØ�J‰JŒLäØ�uØ”S˜“Vð
ó ð ðõ 	ûð'úsO  †A h  Áh  Á"*h  Â)e Â8Ch  Æh  Æ%Ah  Ç)e5 Ç?Jh  ÒBh  Ô:Ah  Öh  Ö0h  ×B*h  Ù7f Úh  Ú&B
f:Ü0h  Ü2f:Ý	Af:Þh  ÞA+f:ß;h  ß>f:àA)f:á/C#h  åe2å/h  å1e2å2h  å5fæh  æfæh  æf7æf2æ,h  æ2f7æ7h  æ:g=ç,g8ç1h  ç8g=ç=h  è j-è*j(è6iéj(éiéj(é!j(é9)j(ê"j-ê(j-c                 ó„
  €  \        R4       \        \        P                  P	                  R^4      4      p \        \        P                  P	                  R^4      4      p\        P                  P	                  R4      p\        P                  P	                  R4      p\        P                  P	                  RR4      P                  4       p\        P                  P	                  R4      pVf   R
pV^È8”  d   ^ÈpV ^,
          V,          p\        RV  RV RV RV RV 2
4       RpV.pV'       d   VR,          pVP                  V4       V'       dŒ   VR8X  d   VR,          pVP                  ^d4       MiVR8X  d   VR,          pVP                  ^dR.4       MEVR8X  d   VR,          pVP                  RR.4       M!VR8X  d   VR,          pVP                  R4       V'       d#   VR,          pRV R2p	VP                  W™W”.4       V'       d   VR,          pVP                  V4       M	VR,          pVR,          pVP                  W.4       \        P                  P                  R V R!24       \        P                  P                  R"V R!24       \        P                  P                  4        \        4       p
V
P                  \        P                  P                   R#7      pVP#                  Wx4       VP%                  4       p\        R$\'        V4       24       . pV EF�  pVP#                  R%VR&,          34       VP%                  4        Uu. uF6  p\)        VR&,          VR',          VR(,          VR),          VR*,          R+7      NK8  	  ppTP                  / R&VR&,          bR,VR,,          bR-VR-,          bR.VR.,          bR/VR/,          '       d   \+        VR/,          4      M^ bR0VR0,          '       d   \+        VR0,          4      MR	bR1VR1,          bRVR,          bR2VR2,          bR3VR3,          bR4VR4,          bR5VR5,          '       d   \+        VR5,          4      M^ bR6VR6,          ;'       g    ^ bRVR,          bR7VR7,          '       d   VR7,          P-                  4       MR	bR8Vb4       EK’  	  VP/                  4        V
P/                  4        \1        R9R:R;VRV RV/4      # u upi   \2         dG   p\        R<T 24       ^ R	IpTP7                  4        \1        R9R=R>\9        T4      /4      R3u R	p?# R	p?ii ; i)?u|   ÐŸÐ¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ðµ Ñ�Ð¿Ð¸Ñ�ÐºÐ° Ñ‚Ð¾Ð²Ð°Ñ€Ð¾Ð² Ñ� Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸ÐµÐ¹, Ð¿Ð¾Ð¸Ñ�ÐºÐ¾Ð¼ Ð¸ Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð´Ñ�Ñ‚Ð°Ð½Ð¾Ð²ÐºÐ¾Ð¹u5   ðŸ”� Ð�Ð°Ñ‡Ð°Ð»Ð¾ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ� get_products()ÚpageÚlimitrõ   Úprice_rangera   r  ÚstatusNr9  u   ðŸ“‹ ÐŸÐ°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹: page=z, limit=z, category=z
, search='z
', status=a)  
            SELECT id, title, ai_description, original_description, price, 
                   original_price, main_image, category, epn_link, 
                   aliexpress_link, video_url, rating, orders_count, status, created_at
            FROM products
            WHERE status = %s
        z AND category = %sz0-100z AND price <= %sz100-500z AND price > %s AND price <= %sr”   z500-1000iè  z1000+z AND price > %szß
                AND (
                    title ILIKE %s
                    OR ai_description ILIKE %s
                    OR original_description ILIKE %s
                    OR title %% %s
                )
            Ú%z- ORDER BY similarity(title, %s) DESC, id DESCz ORDER BY id DESCz LIMIT %s OFFSET %su   
ðŸ“‹ SQL Ð·Ð°Ð¿Ñ€Ð¾Ñ�: Ú
u   ðŸ”¢ ÐŸÐ°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹: rú   u&   ðŸ“ˆ ÐŸÐ¾Ð»ÑƒÑ‡ÐµÐ½Ð¾ Ñ‚Ð¾Ð²Ð°Ñ€Ð¾Ð²: zË
                SELECT id, image_url, is_main, sort_order, alt_text
                FROM product_images
                WHERE product_id = %s
                ORDER BY sort_order ASC, id ASC
            rü   r•   rý   rþ   rÿ   )rü   r•   rý   rþ   rÿ   rò   r3  r  r  r4  r5  r6  r	  r>  r7  r8  r   r  r‘   TÚproductsu$   â�Œ ÐžÐ¨Ð˜Ð‘ÐšÐ� Ð² get_products(): Fr’   )rH   r&  r   r/   r˜   rg  r  ÚextendÚsysÚstdoutr‚   ÚflushrW   rž   rT   r  r  rŸ   rª   rf  r.  r  r  r¡   r   rG   ri  rj  rI   )r€  r�  rõ   r‚  ra   rƒ  ÚoffsetÚqueryÚparamsÚlikerV   rž   Úrowsr†  r­   rr  r  rO   ri  s                      r)   Úget_productsr�  ·  s,  € ðZAÜÐEÔFä”7—<‘<×#Ñ# F¨AÓ.Ó/ˆÜ”G—L‘L×$Ñ$ W¨bÓ1Ó2ˆÜ—<‘<×#Ñ# JÓ/ˆÜ—l‘l×&Ñ& }Ó5ˆÜ—‘×!Ñ! (¨BÓ/×5Ñ5Ó7ˆÜ—‘×!Ñ! (Ó+ˆàŠ>ØˆFà�3Œ;ØˆEà˜•(˜eÕ#ˆäÐ.¨t¨f°H¸U¸GÀ;ÈxÈjÐXbÐciÐbjÐjtÐu{Ðt|Ð}Ô~ð
ˆð �ˆ÷
 ØÐ)Õ)ˆEØ�M‰M˜(Ô#÷
 Ø˜gÔ%ØÐ+Õ+�Ø—‘˜cÕ"Ø 	Ô)ØÐ:Õ:�Ø—‘˜s C˜jÕ)Ø 
Ô*ØÐ:Õ:�Ø—‘˜s D˜kÕ*Ø Ô'ØÐ*Õ*�Ø—‘˜dÔ#÷
 Øð õ ˆEð �v�h˜a�=ˆDØ�M‰M˜4 tÐ4Ô5÷
 àÐDÕDˆEØ�M‰M˜&Õ!àÐ(Õ(ˆEð
 	Ð&Õ&ˆØ�‰�u�oÔ&ä�
‰
×ÑÐ4°U°G¸2Ð>Ô?Ü�
‰
×ÑÐ4°V°H¸BÐ?Ô@Ü�
‰
×ÑÔô
 !Ó"ˆØ—‘¬H¯O©O×,FÑ,F�ÓGˆà�‰�uÔ%Ø�‰Ó ˆäÐ6´s¸4³y°kÐBÔCð
 ˆäˆCØ�N‰Nð ð
 �d•)�ôð  Ÿ™Ô*óñ +�Aô ˜˜$�¨1¨[­>À1ÀYÅ<Ø ! ,¥¸!¸J½-÷Iá*ð ð ð �O‰Oð Ø�c˜$•iðà˜˜W�ðð ! #Ð&6Õ"7ðð '¨Ð,BÕ(Cð	ð
 °°G·´œ˜s 7�|Ô,À!ðð !À#ÐFV×BWÔBW¤%¨Ð,<Õ(=Ô">Ð]aðð ˜c ,Õ/ðð ˜C 
�Oðð ˜C 
�Oðð " 3Ð'8Õ#9ðð ˜S Õ-ðð °#°h·-´-œ%  H¥Ô.ÀQðð   NÕ 3× 8Ð 8°qðð ˜#˜h�-ðð ¸sÀ<×?PÔ?P˜c ,Õ/×9Ñ9Ô;ÐVZðð  ˜&ð!÷ ñ ðB 	�‰ŒØ�
‰
ŒäØ�tØ˜Ø�DØ�Uð	
ó ð 	ùò9øôF ô AÜÐ4°Q°CÐ8Ô9ÛØ×ÑÔÜ˜	 5¨'´3°q³6Ð:Ó;¸SÐ@Õ@ûð	Aús_   ‚ES. ÅBS. Ç%)S. ÈES. Í<S)ÎA)S. Ï8AS. Ñ$S. Ñ3S. ÒAS. Ó)S. Ó.T?Ó9;T:Ô4T?Ô:T?z/api/products/<int:product_id>ÚPUTc                óF  € RpRp \         P                  ! 4       p\        RV  RV 24       . RROpV F1  pVP                  V4      '       d   K  \	        RRR	R
V R2/4      R3u # 	  \        VR,          4      '       g   \	        RRR	R/4      R3#  \        VR,          4      pV^ 8  d   \	        RRR	R/4      R3#  \        TR,          4      p\        4       pTP                  4       pRTn        \        R4       TP                  RT 34       TP                  4       '       g2   TP                  4        TP                  4        \	        RRR	R/4      R3# TP                  RTR,          Yp34       TP                  4       pT'       d'   \        RT^ ,           24       \	        RRR	R/4      R3# RSR lp	RTR lp
RUR lp. RVOpT! TP                  R4      RR7      T! TP                  R4      RR7      T! TP                  R 4      RR7      T	! TP                  R4      ^ 4      TP                  R!4      '       d   T	! TP                  R!4      4      MRT! TP                  R"4      RR7      T! TP                  R#\        T! TP                  RR4      4      T! TP                  R R4      RR7      ;'       g    R4      4      R$R7      T! TP                  R%4      RR7      T! TP                  R4      RR7      T	! TP                  R&4      ^ 4      T
! TP                  R'4      ^ 4      T! T4      \         P"                  ! 4       T! TP                  R(4      RR7      T! TP                  R)4      RR7      T! TP                  R*4      RR7      TP                  R+4      '       d   T	! TP                  R+4      4      MRT! TP                  R,4      RR7      T! TP                  R-4      RR7      .pR.R/P%                  T4       R02pTP'                  T 4       \        R1T  R224       TP                  Yí4       TP                  R3. 4      pT'       Ed   \        R4T  R\)        T4       R524       \+        T4       EFÕ  w  pp Rp\-        T\.        4      '       d   TP1                  4       pMN\-        T\2        4      '       d"   TP                  R6R4      P1                  4       pM\        R7T^,            24       K  TP5                  R84      '       dc   \        R9T^,            R:24       \7        TT 4      w  ppT'       d   \        R;T^,            RT 24       KÝ  Tp\        R<T^,            R=T 24       MSTP5                  RW4      '       d$   \        R>T^,            R?TR@,           R224       TpM\        RAT^,            RB24       EKK  T'       dƒ   \        RCT^,            RD24       TP                  RET TT^ 8H  TT! TP                  RRFT^,            24      4      34       TP                  4       ^ ,          p\        R<T^,            RGT 24       EKÕ  EKØ  	  \        RI4       TP;                  4        TP                  4        TP                  4        \        RJT  RK24       \	        RRRLRMRNT /4      #   \         d    \	        RRR	R/4      R3u # i ; i  \8         d%   p\        RHT^,            RT 24        Rp?EK�  Rp?ii ; i  \8         d£   p\        ROT 24       ^ RIpTP?                  4        T'       d%    TPA                  4        \        RP4       M    M; iT'       d   TP                  4        T'       d   TP                  4        \	        RRR	\/        T4      /4      RQ3u Rp?# Rp?ii ; i)Xu<   ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ Ñ�ÑƒÑ‰ÐµÑ�Ñ‚Ð²ÑƒÑŽÑ‰ÐµÐ³Ð¾ Ñ‚Ð¾Ð²Ð°Ñ€Ð°NuL   ðŸ“¥ ÐŸÐ¾Ð»ÑƒÑ‡ÐµÐ½Ñ‹ Ð´Ð°Ð½Ð½Ñ‹Ðµ Ð´Ð»Ñ� Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ� Ñ‚Ð¾Ð²Ð°Ñ€Ð° rB  rò   r  r	  r‘   Fr’   r
  r  r“   r  r  r  r  ú%SELECT id FROM products WHERE id = %sõ   Ð¢Ð¾Ð²Ð°Ñ€ Ð½Ðµ Ð½Ð°Ð¹Ð´ÐµÐ½r§   z²
            SELECT id FROM products 
            WHERE (aliexpress_link = %s OR (external_product_id = %s AND external_product_id IS NOT NULL))
            AND id != %s
        r  r  r  c                 ót   € V e   V R8X  g   V R8X  d   V#  \        V 4      #   \        \        3 d    Tu # i ; ir  r  r  s   &&r)   r   Ú"update_product.<locals>.safe_float±  r"  r#  c                 ó†   € V e   V R8X  g   V R8X  d   V#  \        \        V 4      4      #   \        \        3 d    Tu # i ; ir  r%  r  s   &&r)   r'  Ú update_product.<locals>.safe_int¹  r)  r*  r  c                 ó¸   € V e   V R8X  g   V R8X  d   V'       d   R # T# \        V \        \        34      '       d   \        P                  ! V 4      # \        V 4      # r  r,  )r  r  Ú
allow_nulls   &&&r)   r1  Ú update_product.<locals>.safe_strÁ  sJ   € ØŠ} ¨¤¨u¸¬ß(�dÐ5¨gÐ5Ü˜%¤$¬ ×.Ò.Ü—j’j Ó'Ð'Ü�u“:Ðr+   )r  r3  T)rš  r  r4  r5  rõ   rÅ   r6  r7  r8  r<  r=  r>  r?  r@  rA  z.
            UPDATE products 
            SET rD  z#
            WHERE id = %s
        u:   ðŸ”„ Ð’Ñ‹Ð¿Ð¾Ð»Ð½Ñ�ÐµÐ¼ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ Ñ‚Ð¾Ð²Ð°Ñ€Ð° rP  r  uF   ðŸ–¼ï¸� ÐžÐ±Ð½Ð¾Ð²Ð»Ñ�ÐµÐ¼ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ� Ð´Ð»Ñ� Ñ‚Ð¾Ð²Ð°Ñ€Ð° rE  r•   rF  rm   rG  rH  rI  rJ  rK  rL  rM  rN  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  u     ÑƒÑ�Ð¿ÐµÑˆÐ½Ð¾ Ð¾Ð±Ð½Ð¾Ð²Ð»Ñ‘Ð½r–   u*   Ð¢Ð¾Ð²Ð°Ñ€ ÑƒÑ�Ð¿ÐµÑˆÐ½Ð¾ Ð¾Ð±Ð½Ð¾Ð²Ð»Ñ‘Ð½r„   u;   â�Œ ÐžÑˆÐ¸Ð±ÐºÐ° Ð¿Ñ€Ð¸ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¸ Ñ‚Ð¾Ð²Ð°Ñ€Ð°: r[  r”   r\  r]  r^  )r  F)z
title = %szai_description = %szoriginal_description = %sz
price = %szoriginal_price = %szmain_image = %szcategory = %szepn_link = %szaliexpress_link = %szrating = %szorders_count = %szexternal_product_id = %szupdated_at = %szdetailed_description = %szshipping_info = %szvideo_url = %szweight = %szdimensions = %szwarranty_info = %sr_  )!r   r—   rH   r˜   r   r^   r  r  rd   rW   rž   r`  rŸ   r    r¡   r÷   r   rc  r}   r  rf  rd  r-  rI   rg  r.  rh  rŒ   rG   rk  ri  rj  rl  )r„   rV   rž   r†   rm  rn  r  Úexternal_product_idro  r   r'  r1  rt  ru  rx  r  rr  r�   r•   rŠ   r‹   r’   rz  r{  rO   ri  s   &                         r)   Úupdate_productr�  W  sÍ  € ð €DØ€FðyÜ×ÒÓ!ˆÜÐ\Ð]gÐ\hÐhjÐkoÐjpÐqÔrò @ˆÛ$ˆEØ—8‘8˜E—?”?ÜØ˜uØ˜y¨¨Ð/bÐcð ó ð ðò ñ %ô ˜DÐ!2Õ3×4Ò4ÜØ˜5ØÐ<ðó ð ðð ð	Ü˜$˜w�-Ó(ˆEØ�qŒyÜØ˜uØÐ[ð ó ð ðð ð ô :¸$Ð?PÕ:QÓRÐô !Ó"ˆØ—‘“ˆØˆŒÜÐ:Ô;à�‰Ð>ÀÀÔNØ�‰× Ò Ø�L‰LŒNØ�J‰JŒLÜØ˜5ØÐ7ðó ð ðð ð 	�‰ð ð Ð$Õ%Ð':ÐGô		Ið —?‘?Ó$ˆßÜÐRÐS[Ð\]ÕS^ÐR_Ð`ÔaÜØ˜5ØÐSðó ð ðð ô.	ô	ô	ò
ˆñ. �T—X‘X˜gÓ&°Ô3Ù�T—X‘XÐ.Ó/¸DÔAÙ�T—X‘XÐ4Ó5À$ÔGÙ�t—x‘x Ó(¨!Ó,Ø6:·h±hÐ?O×6PÒ6P‰J�t—x‘xÐ 0Ó1Ô2ÐVZÙ�T—X‘X˜lÓ+¸Ô=Ù�T—X‘X˜jÔ*<Ù�T—X‘X˜g rÓ*Ó+©X°d·h±hÐ?UÐWYÓ6ZÐgkÔ-l×-rÐ-rÐpró+ó àô!ñ �T—X‘X˜jÓ)°dÔ;Ù�T—X‘XÐ/Ó0¸TÔBÙ�t—x‘x Ó)¨1Ó-Ù�T—X‘X˜nÓ-¨qÓ1ÙÐ(Ó)Ü�LŠL‹NÙ�T—X‘XÐ4Ó5À$ÔGÙ�T—X‘X˜oÓ.¸4Ô@Ù�T—X‘X˜kÓ*°tÔ<Ø.2¯h©h°x×.@Ò.@‰J�t—x‘x Ó)Ô*ÀdÙ�T—X‘X˜lÓ+¸Ô=Ù�T—X‘X˜oÓ.¸4Ô@ð+
ˆð0à—‘˜=Ó)Ð*ð +	ðˆð
 	×Ñ˜ZÔ(äÐJÈ:È,ÐVYÐZÔ[Ø�‰�|Ô3ð —‘˜( BÓ'ˆßˆ6ÜÐZÐ[eÐZfÐfhÔilÐmsÓitÐhuÐu{Ð|Ô}ô & f×-‘��5ð*Ø $�IÜ! %¬×-Ò-Ø%*§[¡[£]™
Ü# E¬4×0Ò0Ø%*§Y¡Y¨{¸BÓ%?×%EÑ%EÓ%G™
äÐ \Ð]^Ð_`Õ]`Ð\aÐbÔcÙ à!×,Ñ,¨]×;Ò;ÜÐ <¸Q¸q½S¸Eð  BBð  Cô  DÜ*;¸JÈ
Ó*S™˜ %ß Ü!Ð$aÐbcÐdeÕbeÐafÐfhÐinÐhoÐ"pÔqÙ$Ø$,˜	ÜÐ ;¸A¸a½C¸5Ð@eÐfoÐepÐqÕrØ#×.Ñ.Ð/F×GÒGÜÐ <¸Q¸q½S¸EÀÈZÐX\ÕM]ÐL^Ð^aÐbÔcØ$.™	äÐ >¸qÀ½s¸eð  DIð  Jô  KÚ ç ÜÐ OÐPQÐRSÕPSÈuÐT\Ð]Ô^ØŸ™ð (ð
 'Ø%Ø ™FØÙ$ T§X¡X¨g¸ÀÀ!Å¸u°~Ó%FÓGðô	
ð $*§?¡?Ó#4°QÕ#7˜ÜÐ ;¸A¸a½C¸5Ð@ZÐ[cÐZdÐe×fò !ñ5 .ôZ 	Ð=Ô>Ø�‰Œà�‰ŒØ�
‰
ŒäÐ" : ,Ð.NÐOÔPäØ�tØÐCØ˜*ð
ó ð 	øôO ô 	ÜØ˜5ØÐAðó ð ðò ð	ûôv !ô ÜÐ^Ð_`ÐabÕ_bÐ^cÐceÐfoÐepÐqÔrÞûðûô" ô ÜÐKÈAÈ3ÐOÔPÛØ×ÑÔßðØ—‘”ÜÐBÕCøðÙúßØ�L‰LŒNßØ�J‰JŒLÜØ�uØ”S˜“Vð
ó ð ðõ 	ûðúsî   †A[3 Á[3 Á%*[3 Â)Z Â;B[3 ÅA[3 Æ-D[3 Ê1C'[3 ÎC[3 Ñ2A5[Ó'[3 Ó)[Ô A[Õ[3 ÕA+[Ö2[3 Ö5[Ö=A?[Ø<A"[3 ÚZ>Ú;[3 Ú=Z>Ú>[3 Û[0Û[+Û$[3 Û+[0Û0[3 Û3^ Û>*^Ü)]Ý^Ý]	Ý^Ý^Ý,)^Þ^ Þ^ c                ó¦  €  \        4       pVP                  \        P                  P                  R7      pVP                  RV 34       VP                  4       pV'       g2   VP                  4        VP                  4        \        RRRR/4      R3# VP                  RV 34       VP                  4       pV'       d   VR	,          '       d
   VR	,          M^ pVP                  4        VP                  4        / R
VR
,          bRVR,          bRVR,          bRVR,          bRVR,          bRVR,          '       d   \        VR,          4      M^ bRVR,          '       d   \        VR,          4      MRbRVR,          bRVR,          bRVR,          bRVR,          bRVR,          '       d   \        VR,          4      M^ bRVR,          ;'       g    ^ bRVR,          bRVR,          '       d   VR,          P                  4       MRbRVR,          bRVR,          bRVR,          RVR,          '       d   \        VR,          4      MRRVR,          RVR,          R VP                  R!4      '       d   \        P                  ! VR!,          4      M. R	V/Cp\        RR"R#V/4      #   \         d%   p\        RRR\        T4      /4      R$3u Rp?# Rp?ii ; i)%uJ   ÐŸÐ¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ðµ Ð´ÐµÑ‚Ð°Ð»ÑŒÐ½Ð¾Ð¹ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ Ð¾ Ñ‚Ð¾Ð²Ð°Ñ€Ðµrú   aÝ  
            SELECT p.*, 
                   COALESCE(
                       (SELECT json_agg(
                           json_build_object(
                               'id', pi.id,
                               'image_url', pi.image_url,
                               'is_main', pi.is_main,
                               'sort_order', pi.sort_order,
                               'alt_text', pi.alt_text
                           ) ORDER BY pi.sort_order ASC, pi.id ASC
                       )
                       FROM product_images pi 
                       WHERE pi.product_id = p.id),
                       '[]'::json
                   ) as images
            FROM products p
            WHERE p.id = %s
        r‘   Fr’   r”  r§   zu
            SELECT SUM(clicks) as total_clicks
            FROM analytics
            WHERE product_id = %s
        Útotal_clicksrü   rò   r3  r  r<  r  r4  Nr5  rõ   r6  r	  r7  r8  rƒ  r   r  r=  r>  r?  r@  rA  r  Úproduct_images_listTÚproductr”   )rW   rž   rT   r  r  rŸ   r    r¡   r   r  r  r˜   r©   ra  rG   rI   )r„   rV   rž   r¡  ÚstatsrŸ  Úproduct_datarO   s   &       r)   Úget_product_detailr¤  Y  s"  € ðSÜ Ó"ˆØ—‘¬H¯O©O×,FÑ,F�ÓGˆð 	�‰ð ð$ ˆ]ô%	ð( —/‘/Ó#ˆçØ�L‰LŒNØ�J‰JŒLÜØ˜5ØÐ7ðó ð ðð ð 	�‰ð ð ˆ]ô		ð —‘Ó!ˆß05¸%À×:OÔ:O�u˜^Ö,ÐUVˆà�‰ŒØ�
‰
Œð
Ø�'˜$•-ð
à�W˜WÕ%ð
ð ˜gÐ&6Õ7ð
ð # GÐ,BÕ$Cð	
ð
 # GÐ,BÕ$Cð
ð °¸×0@Ô0@”U˜7 7Õ+Ô,Àað
ð À'ÐJZ×B[ÔB[œe GÐ,<Õ$=Ô>Ðaeð
ð ˜' ,Õ/ð
ð ˜ 
Õ+ð
ð ˜ 
Õ+ð
ð ˜wÐ'8Õ9ð
ð °'¸(×2CÔ2C”e˜G HÕ-Ô.Èð
ð ˜G NÕ3×8Ð8°qð
ð �g˜hÕ'ð
ð ¸wÀ|×?TÔ?T˜' ,Õ/×9Ñ9Ô;ÐZ^ð
ð  ˜gÐ&6Õ7ð!
ð" ˜W _Õ5ð#
ð$ ˜ Õ-Ø°'¸(×2CÔ2C”e˜G HÕ-Ô.ÈØ˜' ,Õ/Ø˜W _Õ5ØÀGÇKÁKÐPe×DfÒDf”d—j’j Ð)>Õ!?Ô@ÐlnØ˜Lñ/
ˆô4 Ø�tØ�|ð
ó ð 	øô
 ô ÜØ�uØ”S˜“Vð
ó ð ðõ 	ûðús]   ‚BJ! Â*J! Â=J! ÃA-J! Ä:#J! ÅAJ! Æ*$J! ÇJ! Ç,AJ! È2<J! É/1J! Ê!KÊ,KËKËKz%/api/products/<int:product_id>/imagesc           	     óœ   €  \        V 4      p\        RRRV/4      #   \         d%   p\        RRR\        T4      /4      R3u Rp?# Rp?ii ; i)rù   r‘   Tr  Fr’   r”   N)r  r   rG   rI   )r„   r  rO   s   &  r)   Úget_product_images_apir¦  ±  si   € ðÜ# JÓ/ˆäØ�tØ�fð
ó ð 	øô
 ô ÜØ�uØ”S˜“Vð
ó ð ðõ 	ûðús   ‚ œA§AÁ AÁAc           	     ó’  €  \         P                  ! 4       pVP                  R4      pVP                  RR4      pVP                  R^ 4      pVP                  RR4      pV'       g   \        RRRR	/4      R
3# \	        V4      '       g   \        RRRR/4      R
3# \        4       pVP                  4       pVP                  RV 34       VP                  4       '       g2   VP                  4        VP                  4        \        RRRR/4      R3# V'       d   VP                  RV 34       VP                  RWW4V34       VP                  4       ^ ,          pVP                  4        VP                  4        VP                  4        \        RRRRRV/4      ^É3#   \         d%   p	\        RRR\        T	4      /4      R3u Rp	?	# Rp	?	ii ; i)u;   Ð”Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ� Ðº Ñ‚Ð¾Ð²Ð°Ñ€Ñƒr•   rý   Frþ   rÿ   r  r‘   r’   u   image_url Ð¾Ð±Ñ�Ð·Ð°Ñ‚ÐµÐ»ÐµÐ½r“   u8   Ð�ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¹ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ URL Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ�r“  r”  r§   ú
                UPDATE product_images 
                SET is_main = FALSE 
                WHERE product_id = %s
            z¨
            INSERT INTO product_images (product_id, image_url, is_main, sort_order, alt_text)
            VALUES (%s, %s, %s, %s, %s)
            RETURNING id
        Tr–   u8   Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ ÑƒÑ�Ð¿ÐµÑˆÐ½Ð¾ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾rz  r”   N)r   r—   r˜   r   r^   rW   rž   rŸ   r    r¡   rk  rG   rI   )
r„   r†   r•   rý   rþ   rÿ   rV   rž   rz  rO   s
   &         r)   Úadd_product_imager©  Â  só  € ð@Ü×ÒÓ!ˆà—H‘H˜[Ó)ˆ	Ø—(‘(˜9 eÓ,ˆØ—X‘X˜l¨AÓ.ˆ
Ø—8‘8˜J¨Ó+ˆçÜØ˜5ØÐ9ðó ð ðð ô
 ˜I×&Ò&ÜØ˜5ØÐSðó ð ðð ô
 !Ó"ˆØ—‘“ˆð 	�‰Ð>ÀÀÔNØ�‰× Ò Ø�L‰LŒNØ�J‰JŒLÜØ˜5ØÐ7ðó ð ðð ÷ Ø�N‰Nð ð �ô	 ð 	�‰ð ð  W¸(ÐCô		Eð —?‘?Ó$ QÕ'ˆà�‰ŒØ�‰ŒØ�
‰
ŒäØ�tØÐQØ˜ð
ó ð ð	ð 	øô ô ÜØ�uØ”S˜“Vð
ó ð ðõ 	ûðús>   ‚A#F Á&F Á7!F ÂA3F ÄF ÄBF ÆGÆ"GÆ;GÇGz4/api/products/<int:product_id>/images/<int:image_id>c           	     óJ  €  \         P                  ! 4       p\        4       pVP                  4       pVP	                  RW34       VP                  4       '       g2   VP                  4        VP                  4        \        RRRR/4      R3# VP                  R4      '       d   VP	                  RV 34       . p. pR F6  pWr9   g   K  VP                  V R	24       VP                  W',          4       K8  	  V'       d8   VP                  W.4       VP	                  R
RP                  V4       R2V4       VP                  4        VP                  4        VP                  4        \        RRRR/4      #   \         d%   p\        RRR\        T4      /4      R3u Rp?# Rp?ii ; i)u8   ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ� Ñ‚Ð¾Ð²Ð°Ñ€Ð°úb
            SELECT id FROM product_images 
            WHERE id = %s AND product_id = %s
        r‘   Fr’   õ*   Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ Ð½Ðµ Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾r§   rý   r¨  rC  z<
                UPDATE product_images 
                SET rD  z?
                WHERE id = %s AND product_id = %s
            Tr–   u8   Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ ÑƒÑ�Ð¿ÐµÑˆÐ½Ð¾ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¾r”   N)r•   rý   rþ   rÿ   )r   r—   rW   rž   rŸ   r    r¡   r   r˜   r  r‡  r}   rk  rG   rI   )	r„   rz  r†   rV   rž   rt  r�  rn  rO   s	   &&       r)   Úupdate_product_imager­    s«  € ð:Ü×ÒÓ!ˆä Ó"ˆØ—‘“ˆð 	�‰ð ð Ð#ô	%ð
 �‰× Ò Ø�L‰LŒNØ�J‰JŒLÜØ˜5ØÐEðó ð ðð ð �8‰8�I×ÒØ�N‰Nð ð �ô	 ð ˆØˆãGˆEØŽ}Ø×$Ñ$¨ w¨e _Ô5Ø—‘˜d�kÖ*ñ H÷
 Ø�M‰M˜8Ð0Ô1Ø�N‰Nð  à—Y‘Y˜}Ó-Ð.ð /ðð ô	ð 	�‰ŒØ�‰ŒØ�
‰
ŒäØ�tØÐQð
ó ð 	øô
 ô ÜØ�uØ”S˜“Vð
ó ð ðõ 	ûðús7   ‚BE3 ÂE3 Â"E3 Ã6E3 Ã=A5E3 Å3F"Å>FÆF"ÆF"ÚDELETEc           	     óô  €  \        4       pVP                  4       pVP                  RW34       VP                  4       '       g2   VP	                  4        VP	                  4        \        RRRR/4      R3# VP                  RW34       VP                  4        VP	                  4        VP	                  4        \        RRR	R
/4      #   \         d%   p\        RRR\        T4      /4      R3u Rp?# Rp?ii ; i)u4   Ð£Ð´Ð°Ð»ÐµÐ½Ð¸Ðµ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ� Ñ‚Ð¾Ð²Ð°Ñ€Ð°r«  r‘   Fr’   r¬  r§   z_
            DELETE FROM product_images 
            WHERE id = %s AND product_id = %s
        Tr–   u4   Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ ÑƒÑ�Ð¿ÐµÑˆÐ½Ð¾ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¾r”   N)	rW   rž   rŸ   r    r¡   r   rk  rG   rI   )r„   rz  rV   rž   rO   s   &&   r)   Údelete_product_imager°  F  s  € ð%Ü Ó"ˆØ—‘“ˆð 	�‰ð ð Ð#ô	%ð
 �‰× Ò Ø�L‰LŒNØ�J‰JŒLÜØ˜5ØÐEðó ð ðð ð 	�‰ð ð Ð#ô	%ð
 	�‰ŒØ�‰ŒØ�
‰
ŒäØ�tØÐMð
ó ð 	øô
 ô ÜØ�uØ”S˜“Vð
ó ð ðõ 	ûðús%   ‚A3C Á6AC ÃC7ÃC2Ã,C7Ã2C7c           	     ó  €  \        4       pVP                  4       pVP                  RV 34       VP                  4       '       g2   VP	                  4        VP	                  4        \        RRRR/4      R3# VP                  R\        P                  ! 4       V 34       VP                  4        VP	                  4        VP	                  4        \        RRR	R
/4      #   \         d%   p\        RRR\        T4      /4      R3u Rp?# Rp?ii ; i)u=   Ð£Ð´Ð°Ð»ÐµÐ½Ð¸Ðµ Ñ‚Ð¾Ð²Ð°Ñ€Ð° (Ð¼Ñ�Ð³ÐºÐ¾Ðµ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ðµ)r“  r‘   Fr’   r”  r§   zt
            UPDATE products 
            SET status = 'deleted', updated_at = %s
            WHERE id = %s
        Tr–   u&   Ð¢Ð¾Ð²Ð°Ñ€ ÑƒÑ�Ð¿ÐµÑˆÐ½Ð¾ ÑƒÐ´Ð°Ð»ÐµÐ½r”   N)rW   rž   rŸ   r    r¡   r   r   rc  rk  rG   rI   )r„   rV   rž   rO   s   &   r)   Údelete_productr²  v  s  € ð"Ü Ó"ˆØ—‘“ˆð 	�‰Ð>ÀÀÔNØ�‰× Ò Ø�L‰LŒNØ�J‰JŒLÜØ˜5ØÐ7ðó ð ðð ð 	�‰ð ô �lŠl‹n˜jÐ)ô		+ð 	�‰ŒØ�‰ŒØ�
‰
ŒäØ�tØÐ?ð
ó ð 	øô
 ô ÜØ�uØ”S˜“Vð
ó ð ðõ 	ûðús%   ‚A3C Á6A%C ÃDÃ'DÄ DÄDz/api/products/bulkc                 ó†
  a€  \         P                  ! 4       p V P                  R. 4      pV'       g   \        RRRR/4      R3# \	        4       pVP                  4       p^ p. p\        V4       EFï  w  po \        ;QJ d    V3R lR1 4       F  '       d   K   RM	  RM! V3R lR1 4       4      '       g   VP                  RV^,            R24       Kf  \        SR
,          4      '       g   VP                  RV^,            R24       Kœ  \        SR
,          4      pVP                  RSR
,          V34       VP                  4       '       d   VP                  RV^,            R24       Ký  SP                  R4      pV'       g$   \        SR,          SP                  RR4      4      pSP                  R4      p	V	'       d^   \        V	\        4      '       d   \         P"                  ! V	4      p	M0\        V	\$        4      '       d    \         P&                  ! V	4       MRp	Rp
TP                  T
SR,          SP                  R4      SP                  R4      SP                  R4      \+        SR	,          4      SP                  R4      '       d   \+        SR,          4      MRSP                  R4      TSP                  R4      SR
,          \+        SP                  R^ 4      4      \-        SP                  R^ 4      4      TR\.        P0                  ! 4       \.        P0                  ! 4       T	SP                  R4      SP                  R 4      SP                  R!4      '       d   \+        SP                  R!4      4      MRSP                  R"4      SP                  R#4      34       VP                  4       ^ ,          pSP                  R$. 4      pV'       d†   \        V4       Fv  w  rÞ\        VP                  R%R4      4      '       g   K(  VP                  R&VVR%,          VP                  R'R4      VP                  R(V4      VP                  R)R4      34       Kx  	  V^,          pEKò  	  VP5                  4        VP7                  4        VP7                  4        \        RRR+R,\9        V4       R-V 2R.VR/V/4      #   \         P(                   d    Rp	 EL±i ; i  \2         d4   pTP                  RT^,            R*\%        T4       24        Rp?EK�  Rp?ii ; i  \2         d%   p\        RRR\%        T4      /4      R03u Rp?# Rp?ii ; i)2u4   ÐœÐ°Ñ�Ñ�Ð¾Ð²Ð¾Ðµ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ Ñ‚Ð¾Ð²Ð°Ñ€Ð¾Ð²r†  r‘   Fr’   uA   Ð¡Ð¿Ð¸Ñ�Ð¾Ðº Ñ‚Ð¾Ð²Ð°Ñ€Ð¾Ð² Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ‚ Ð±Ñ‹Ñ‚ÑŒ Ð¿ÑƒÑ�Ñ‚Ñ‹Ð¼r“   c              3   óF   <"  € T F  pSP                  V4      x € K  	  R # 5ir¿   )r˜   )rÀ   rn  r¡  s   & €r)   rÃ   Ú$add_products_bulk.<locals>.<genexpr>³  s   øé € ÐaÑ;`°%˜7Ÿ;™; u×-Ð-Ó;`ùs   ƒ!rò   r  r	  Tu   Ð¢Ð¾Ð²Ð°Ñ€ u:   : Ð¾Ñ‚Ñ�ÑƒÑ‚Ñ�Ñ‚Ð²ÑƒÑŽÑ‚ Ð¾Ð±Ñ�Ð·Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ðµ Ð¿Ð¾Ð»Ñ�u#   : Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¹ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ URLz¯
                    SELECT id FROM products 
                    WHERE aliexpress_link = %s OR (external_product_id = %s AND external_product_id IS NOT NULL)
                u   : Ð´ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ‚ URLrõ   r  r  r  NaV  
                    INSERT INTO products (
                        title, ai_description, original_description, detailed_description,
                        price, original_price, main_image, category, epn_link, aliexpress_link, 
                        rating, orders_count, external_product_id, status, created_at, updated_at,
                        specifications, shipping_info, video_url, weight, dimensions, warranty_info
                    ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
                    RETURNING id
                r3  r<  r4  r5  r6  r7  r8  r9  r=  r>  r?  r@  rA  Úadditional_imagesr•   zË
                                INSERT INTO product_images (product_id, image_url, is_main, sort_order, alt_text)
                                VALUES (%s, %s, %s, %s, %s)
                            rý   rþ   rÿ   rB  r–   u%   ÐžÐ±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð½Ð¾ Ñ‚Ð¾Ð²Ð°Ñ€Ð¾Ð²: u   , Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾: Úadded_countÚerrorsr”   r\  )r   r—   r˜   r   rW   rž   rd  rY   r  r^   rd   rŸ   r    r÷   r-  r.  r©   r0  rI   ra  rb  r  r&  r   rc  rG   rk  r¡   rf  )r†   r†  rV   rž   r·  r¸  rr  r„   rõ   r  Úinsert_queryrs  r¶  ÚidxrŠ   rO   r¡  s                   @r)   Úadd_products_bulkr»  �  s¤  ø€ ðHÜ×ÒÓ!ˆØ—8‘8˜J¨Ó+ˆçÜØ˜5ØÐ\ðó ð ðð ô
 !Ó"ˆØ—‘“ˆàˆØˆä# H×-‰JˆAˆwðf=ç“sÔaÑ;`Óa—s—s’sÔaÑ;`Óa×aÒaØ—M‘M K°°!µ¨uÐ4nÐ"oÔpÙô $ GÐ,=Õ$>×?Ò?Ø—M‘M K°°!µ¨uÐ4WÐ"XÔYÙô 9¸ÐARÕ9SÓT�
ð —‘ð  ð Ð/Õ0°*Ð=ô?ð
 —?‘?×$Ò$Ø—M‘M K°°!µ¨uÐ4JÐ"KÔLÙð #Ÿ;™; zÓ2�ßÜ1Ø Õ(ØŸ™Ð$:¸BÓ?ó �Hð ")§¡Ð-=Ó!>�ß!Ü! .´$×7Ò7Ü)-¯ª°NÓ)C™Ü# N´C×8Ò8ð2Ü ŸJšJ ~Õ6ð *.˜ð �ð —‘˜|Ø˜GÕ$Ø—K‘KÐ 0Ó1Ø—K‘KÐ 6Ó7Ø—K‘KÐ 6Ó7Ü˜' 'Õ*Ó+Ø8?¿¹ÐDT×8UÒ8U”E˜'Ð"2Õ3Ô4Ð[_Ø—K‘K Ó-ØØ—K‘K 
Ó+ØÐ-Õ.Ü˜'Ÿ+™+ h°Ó2Ó3Ü˜Ÿ™ N°AÓ6Ó7ØØÜ—L’L“NÜ—L’L“NØ"Ø—K‘K Ó0Ø—K‘K Ó,Ø4;·K±KÀ×4IÒ4I”E˜'Ÿ+™+ hÓ/Ô0ÈtØ—K‘K Ó-Ø—K‘K Ó0ð-.ô ð2 "(§¡Ó!2°1Õ!5�ð %,§K¡KÐ0CÀRÓ$HÐ!ß$Ü+4Ð5FÖ+G™˜Ü'¨
¯©°{ÀBÓ(G×HÔHØ"ŸN™Nð , ð !/Ø *¨;Õ 7Ø *§¡¨y¸%Ó @Ø *§¡¨|¸SÓ AØ *§¡¨z¸2Ó >ð"ö	ñ ,Hð ˜qÕ “ñI .ðR 	�‰ŒØ�‰ŒØ�
‰
ŒäØ�tØÐ>¼sÀ8»}¸oÐMcÐdoÐcpÐqØ˜;Ø�fð	
ó ð 	øôI  $×3Ñ3ô 2Ø-1›Nð2ûôz ô =Ø—‘ ¨A¨a­C¨5°´3°q³6°(Ð;×<Ó<ûð=ûô ô ÜØ�uØ”S˜“Vð
ó ð ðõ 	ûðúsÃ   ƒ.T ²T Á0T Á4SÂSÂ4SÃT Ã4SÄT ÄASÅ'T Å)SÆ;SÆ>ASÈR2ÈF4SÏ.SÐ ASÑAT Ò2SÓ	SÓSÓSÓTÓ'T	ÔT Ô	TÔT ÔU ÔT;Ô5U Ô;U z/api/categoriesc            	     ó¼  €  \        4       p V P                  \        P                  P                  R7      pVP                  R4       VP                  4        Uu. uF  pRVR,          RVR,          /NK  	  ppVP                  4        V P                  4        \        RRRV/4      # u upi   \         d%   p\        RR	R
\        T4      /4      R3u Rp?# Rp?ii ; i)u2   ÐŸÐ¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ðµ Ñ�Ð¿Ð¸Ñ�ÐºÐ° ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð¹rú   úµ
            SELECT category, COUNT(*) as count
            FROM products 
            WHERE status = 'active'
            GROUP BY category
            ORDER BY count DESC
        Únamerõ   r�   r‘   Trô   Fr’   r”   N)rW   rž   rT   r  r  rŸ   rª   r¡   r   rG   rI   )rV   rž   r­   rô   rO   s        r)   Úget_categoriesr¿  +  så   € ðÜ Ó"ˆØ—‘¬H¯O©O×,FÑ,F�ÓGˆà�‰ð ô 	ð !'§¡Ô 1ó3Ù 1˜ð ˜s :�°¸¸W½ÓFÙ 1ð 	ð 3ð 	�‰ŒØ�
‰
ŒäØ�tØ˜*ð
ó ð 	ùò3øô ô ÜØ�uØ”S˜“Vð
ó ð ðõ 	ûðús0   ‚AB, ÁB'Á60B, Â'B, Â,CÂ7CÃCÃCz/api/analytics/clickc            	     ój  €  \         P                  ! 4       p V P                  R4      pV P                  RR4      pV'       g   \        RRRR/4      R3# \	        4       pVP                  4       pVP                  R	W34       VP                  4       pV'       d   VP                  R
V^ ,          34       MVP                  RW34       VP                  4        VP                  4        VP                  4        \        RR/4      #   \         d%   p\        RRR\        T4      /4      R3u Rp?# Rp?ii ; i)u/   Ð¢Ñ€ÐµÐºÐ¸Ð½Ð³ ÐºÐ»Ð¸ÐºÐ¾Ð² Ð¿Ð¾ Ñ‚Ð¾Ð²Ð°Ñ€Ð°Ð¼r„   ÚsourceÚwebsiter‘   Fr’   zproduct_id is requiredr“   zy
            SELECT id FROM analytics 
            WHERE product_id = %s AND date = CURRENT_DATE AND source = %s
        zv
                UPDATE analytics 
                SET clicks = clicks + 1 
                WHERE id = %s
            zˆ
                INSERT INTO analytics (product_id, clicks, source, date) 
                VALUES (%s, 1, %s, CURRENT_DATE)
            Tr”   N)r   r—   r˜   r   rW   rž   rŸ   r    rk  r¡   rG   rI   )r†   r„   rÁ  rV   rž   ro  rO   s          r)   Útrack_clickrÃ  K  s$  € ð(AÜ×ÒÓ!ˆØ—X‘X˜lÓ+ˆ
Ø—‘˜( IÓ.ˆçÜ˜I u¨gÐ7OÐPÓQÐSVÐVÐVä Ó"ˆØ—‘“ˆð 	�‰ð ð Ð!ô	#ð
 —?‘?Ó$ˆçà�N‰Nð ð ˜1•+�õ	!ð �N‰Nð ð Ð%ô'ð
 	�‰ŒØ�‰ŒØ�
‰
Œä˜	 4Ð(Ó)Ð)øäô AÜ˜	 5¨'´3°q³6Ð:Ó;¸SÐ@Õ@ûðAús*   ‚?D ÁD ÁB/D ÄD2ÄD-Ä'D2Ä-D2z
/api/statsc                 óL  €  \        4       p V P                  \        P                  P                  R7      pVP                  R4       VP                  4       pVP                  R4       VP                  4        Uu. uF  pRVR,          RVR,          /NK  	  ppVP                  R4       VP                  4        Uu. uF%  pRVR,          P                  4       RVR,          /NK'  	  ppVP                  R	4       VP                  4       pVP                  4        V P                  4        \        R
RRRVR,          RVR,          RVR,          RVRVRVR,          RVR,          //4      # u upi u upi   \         d%   p\        R
RR\        T4      /4      R3u Rp?# Rp?ii ; i)u'   ÐŸÐ¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ðµ Ñ�Ñ‚Ð°Ñ‚Ð¸Ñ�Ñ‚Ð¸ÐºÐ¸rú   a  
            SELECT 
                COUNT(*) as total_products,
                COUNT(CASE WHEN status = 'active' THEN 1 END) as active_products,
                COUNT(CASE WHEN created_at::date = CURRENT_DATE THEN 1 END) as today_products
            FROM products
        r½  rõ   r�   zÖ
            SELECT DATE(date) as date, SUM(clicks) as clicks
            FROM analytics
            WHERE date >= CURRENT_DATE - INTERVAL '7 days'
            GROUP BY DATE(date)
            ORDER BY date
        ÚdateÚclickszœ
            SELECT COUNT(*) as total_images,
                   COUNT(DISTINCT product_id) as products_with_images
            FROM product_images
        r‘   Tr¢  Útotal_productsÚactive_productsÚtoday_productsrô   Úclicks_last_7_daysÚtotal_imagesÚproducts_with_imagesFr’   r”   N)rW   rž   rT   r  r  rŸ   r    rª   r  r¡   r   rG   rI   )rV   rž   r¢  r­   rô   Úclicks_dataÚimages_statsrO   s           r)   Ú	get_statsrÏ  x  s¼  € ðAAÜ Ó"ˆØ—‘¬H¯O©O×,FÑ,F�ÓGˆð 	�‰ð ô 	ð —‘Ó!ˆð 	�‰ð ô 	ð !'§¡Ô 1ó3Ù 1˜ð " 3 z¥?°G¸SÀ½\ÓJÙ 1ð 	ð 3ð 	�‰ð ô 	ð "(§¡Ô!2ó4Ù!2˜#ð   F¥× 5Ñ 5Ó 7¸À3ÀxÅ=ÓQÙ!2ð 	ð 4ð 	�‰ð ô 	ð —‘Ó(ˆà�‰ŒØ�
‰
ŒäØ�tØØ  %Ð(8Õ"9Ø! 5Ð):Õ#;Ø  %Ð(8Õ"9Ø˜jØ$ kØ ¨^Õ <Ø&¨Ð5KÕ(Lðð
ó ð 	ùò73ùò4øô8 ô AÜ˜	 5¨'´3°q³6Ð:Ó;¸SÐ@Õ@ûðAús=   ‚A8E4 Á:E*Â%E4 Â<+E/Ã'BE4 Å*
E4 Å4F#Å?FÆF#ÆF#z/api/healthc            	     óf   € \        RRRRR\        P                  ! 4       P                  4       /4      # )u7   ÐŸÑ€Ð¾Ð²ÐµÑ€ÐºÐ° Ñ€Ð°Ð±Ð¾Ñ‚Ð¾Ñ�Ð¿Ð¾Ñ�Ð¾Ð±Ð½Ð¾Ñ�Ñ‚Ð¸ APIr‘   Tr–   u'   API Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÐµÑ‚ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ú	timestamp)r   r   rc  r  rR   r+   r)   Úhealth_checkrÒ  ¾  s5   € ô Ø�4ØÐ<Ø”X—\’\“^×-Ñ-Ó/ðó ð r+   z/api/parser/startc            	     óÚ  aa€  \         P                  ! 4       p V P                  R. 4      oV P                  R^4      oS'       g   \        RRRR/4      R3# \	        S\
        4      '       dG   SP                  R4       Uu. uF*  qP                  4       '       g   K  VP                  4       NK,  	  upo\        R	\        S4       R
24       \        RS 24       ^ RI
pVV3R lpVP                  VR7      pRVn        VP                  4        \        RRRR\        S4       R2/4      # u upi   \         d3   p\        RT 24       \        RRR\        T4      /4      R3u Rp?# Rp?ii ; i)uD   Ð—Ð°Ð¿ÑƒÑ�Ðº Ð¿Ð°Ñ€Ñ�ÐµÑ€Ð° Ñ� Ð¾Ñ„Ð¸Ñ†Ð¸Ð°Ð»ÑŒÐ½Ñ‹Ð¼ API AliExpressÚqueriesÚ	max_pagesr‘   Fr’   u5   Ð�Ðµ ÑƒÐºÐ°Ð·Ð°Ð½Ñ‹ Ð¿Ð¾Ð¸Ñ�ÐºÐ¾Ð²Ñ‹Ðµ Ð·Ð°Ð¿Ñ€Ð¾Ñ�Ñ‹r“   r…  u,   ðŸŽ¯ Ð—Ð°Ð¿ÑƒÑ�Ðº API Ð¿Ð°Ñ€Ñ�ÐµÑ€Ð° Ð´Ð»Ñ� u    Ð·Ð°Ð¿Ñ€Ð¾Ñ�Ð¾Ð²u   ðŸ“� Ð—Ð°Ð¿Ñ€Ð¾Ñ�Ñ‹: Nc                  ó²  <€  ^ RI Hp Hp ^ RIHp \        R4       V! W4      p\        S^,          ^
4      p\        RV 24       VP                  S	VR7      p\        R\        V4       24       R	#   \         d%   p\        RT 24       \        R4        R	p?R	# R	p?i\         d.   p\        R
T 24       ^ R	IpTP                  4         R	p?R	# R	p?ii ; i)r   )ÚALIEXPRESS_APP_KEYÚALIEXPRESS_APP_SECRET)ÚAliExpressAPIParseru5   ðŸ”‘ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ� API Ð¿Ð°Ñ€Ñ�ÐµÑ€Ð°...u8   ðŸ“Š ÐœÐ°ÐºÑ�Ð¸Ð¼ÑƒÐ¼ Ñ‚Ð¾Ð²Ð°Ñ€Ð¾Ð² Ð½Ð° Ð·Ð°Ð¿Ñ€Ð¾Ñ�: )Úmax_products_per_queryuM   ðŸŽ‰ API Ð¿Ð°Ñ€Ñ�Ð¸Ð½Ð³ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½! Ð”Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ Ñ‚Ð¾Ð²Ð°Ñ€Ð¾Ð²: u!   â�Œ ÐžÑˆÐ¸Ð±ÐºÐ° Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð°: ue   ðŸ”§ ÐŸÑ€Ð¾Ð²ÐµÑ€ÑŒÑ‚Ðµ, Ñ‡Ñ‚Ð¾ Ñ„Ð°Ð¹Ð»Ñ‹ config.py Ð¸ aliexpress_api_parser.py Ñ�ÑƒÑ‰ÐµÑ�Ñ‚Ð²ÑƒÑŽÑ‚Nu(   â�Œ ÐžÑˆÐ¸Ð±ÐºÐ° Ð² API Ð¿Ð°Ñ€Ñ�ÐµÑ€Ðµ: )Úconfigr×  rØ  Úaliexpress_api_parserrÙ  rH   ÚminÚparse_and_saverf  ÚImportErrorrG   ri  rj  )
r×  rØ  rÙ  ÚparserÚmax_productsr†  rO   ri  rÕ  Úsearch_queriess
           €€r)   Úrun_api_parserÚ$start_parser.<locals>.run_api_parserÞ  sÊ   ø€ ð&çLÝEäÐMÔOÙ,Ð-?ÓW�ä" 9¨q¥=°"Ó5�ÜÐPÐQ]ÐP^Ð_Ô`à!×0Ñ0°ÐXdÐ0Óe�ÜÐeÔfiÐjrÓfsÐetÐuÖvøäô ÜÐ9¸!¸Ð=Ô>ÜÐ}×~Ò~ûÜô &ÜÐ@ÀÀÐDÔEÛ Ø×#Ñ#×%Ò%ûð&ús*   ƒA,A1 Á1CÁ<BÂCÂ(CÂ)"CÃC)ÚtargetTr–   u)   API Ð¿Ð°Ñ€Ñ�Ð¸Ð½Ð³ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½ Ð´Ð»Ñ� uq    Ð·Ð°Ð¿Ñ€Ð¾Ñ�Ð¾Ð². Ð˜Ñ�Ð¿Ð¾Ð»ÑŒÐ·ÑƒÐµÑ‚Ñ�Ñ� Ð¾Ñ„Ð¸Ñ†Ð¸Ð°Ð»ÑŒÐ½Ñ‹Ð¹ API AliExpress Ñ� Ð²Ð°ÑˆÐ¸Ð¼Ð¸ ÐºÐ»ÑŽÑ‡Ð°Ð¼Ð¸!u4   â�Œ ÐžÑˆÐ¸Ð±ÐºÐ° Ð·Ð°Ð¿ÑƒÑ�ÐºÐ° API Ð¿Ð°Ñ€Ñ�ÐµÑ€Ð°: r”   )r   r—   r˜   r   r-  rI   ry   rg  rH   rf  Ú	threadingÚThreadÚdaemonÚstartrG   )r†   Úqræ  rã  ÚthreadrO   rÕ  râ  s         @@r)   Ústart_parserrì  Ç  s}  ù€ ð:Ü×ÒÓ!ˆØŸ™ )¨RÓ0ˆØ—H‘H˜[¨!Ó,ˆ	çÜØ˜5ØÐPðó ð ðð ô �n¤c×*Ò*Ø1?×1EÑ1EÀdÔ1KÓYÑ1K¨AÏwÉwÏyœi˜aŸg™gžiÑ1KÑYˆNäÐ<¼SÀÓ=PÐ<QÐQbÐcÔdÜÐ% nÐ%5Ð6Ô7ãö	&ð0 ×!Ñ!¨Ð!Ó8ˆØˆŒØ�‰ŒäØ�tØÐBÄ3À~ÓCVÐBWð  XIð  Jð
ó ð 	ùòG ZøôP ô ÜÐDÀQÀCÐHÔIÜØ�uØ”S˜“Vð
ó ð ðõ 	ûðúsC   „A D- ÁD- Á)D- Á?D(ÂD(Â/A8D- Ä(D- Ä-E*Ä8'E%ÅE*Å%E*z/api/parser/queriesc                 ó<   € R. ROR. ROR. R	O/p \        RRRV /4      # )
u^   ÐŸÐ¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ðµ Ð¿Ñ€ÐµÐ´ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ‹Ñ… Ð·Ð°Ð¿Ñ€Ð¾Ñ�Ð¾Ð² Ð´Ð»Ñ� Ð¿Ð°Ñ€Ñ�Ð¸Ð½Ð³Ð°Úcampingr·   r»   r‘   TrÔ  )zcamping solar panelzrv battery 12vzportable camping stovezcamping mattress inflatable)zcar inverter 12v 220vzled strip 12vzcar charger usbzportable power bank)zcar tire pumpzemergency car kitzcar jump starterzautomotive tools set)r   )rÔ  s    r)   Úget_parser_queriesrï    sE   € ð 	ò 
ð 	ò 
ð 	ò 
ð€Gô* Ø�4Ø�7ðó ð r+   c                 ó„   € \         P                  ! R R4      P                  R4      pV RV 2pRpRV R2p\        WV4      # )ÚSITE_URLzhttps://campervan.funÚ/z/confirm-subscription?token=u)   PotwierdÅº subskrypcjÄ™ â€” campervan.funuÐ   
    <html>
    <body>
        <h2>Witaj!</h2>
        <p>DziÄ™kujemy za zapisanie siÄ™ na nowoÅ›ci campervan.fun</p>
        <p>Kliknij przycisk poniÅ¼ej, aby potwierdziÄ‡ subskrypcjÄ™:</p>
        <a href="u)  " style="background-color: #007bff; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px;">Potwierdzam subskrypcjÄ™</a>
        <p>JeÅ›li to nie Ty â€” zignoruj tÄ™ wiadomoÅ›Ä‡.</p>
        <hr>
        <p>Pozdrawiamy, ZespÃ³Å‚ campervan.fun</p>
    </body>
    </html>
    )r$   r%   ÚrstriprP   )r®   ÚtokenÚsite_urlÚconfirm_urlrK   r¥   s   &&    r)   Úsend_confirmation_emailr÷  +  s[   € Ü�yŠy˜Ð%<Ó=×DÑDÀSÓI€HØ�JÐ:¸5¸'ÐB€Kà9€Gðð �ð ð€Dô ˜e¨dÓ3Ð3r+   z/api/subscribec                  ó   €  \         P                  ! 4       ;'       g    / p V P                  R 4      ;'       g    RP                  4       P	                  4       pV'       g   \        RRRR/4      R3# ^ RIpVP                  ! RV4      '       g   \        RRRR	/4      R3# \        4       pVP                  4       pVP                  R
V34       VP                  4       pV'       dA   V^,          '       d2   VP                  4        VP                  4        \        RRRR/4      R3# \        P                  ! ^ 4      pV'       d%   VP                  RWe^ ,          34       V^ ,          pM*VP                  RW34       VP                  4       ^ ,          pVP                  4        VP                  4        VP                  4        \!        W4      w  r‰Rp
RpRV R2p\#        W«V4      w  rÞV'       g   \        RRRRV	 2/4      R3# \        RRRR/4      #   \$         d3   p\'        R\)        T4       24       \        RRRR/4      R3u Rp?# Rp?ii ; i)r®   r  r‘   Fr’   zAdres e-mail jest wymaganyr“   Nz[^@]+@[^@]+\.[^@]+u   NieprawidÅ‚owy adres e-mailúASELECT id, confirmed FROM newsletter_subscribers WHERE email = %su:   WiadomoÅ›Ä‡ e-mail zostaÅ‚a juÅ¼ podpisana i potwierdzona.r  z´
                UPDATE newsletter_subscribers
                SET token = %s, confirmed = FALSE, created_at = NOW(), confirmed_at = NULL
                WHERE id = %s
            z±
                INSERT INTO newsletter_subscribers (email, token, confirmed, created_at)
                VALUES (%s, %s, FALSE, NOW())
                RETURNING id
            r   zNowy subskrybent na stronie!u  
            <div style="font-family: Arial, sans-serif; border: 1px solid #eee; padding: 20px;">
                <h2 style="color: #4f46e5;">ðŸš€ Nowy subskrybent!</h2>
                <p>KtoÅ› wÅ‚aÅ›nie zapisaÅ‚ siÄ™ do newslettera:</p>
                <p><b>Adres e-mail:</b> u  </p> 
                <p><b>Data:</b> 14 Luty 2026</p>
                <hr style="border: 0; border-top: 1px solid #eee;">
                <p style="font-size: 12px; color: #666;">WiadomoÅ›Ä‡ wygenerowana automatycznie przez campervan.fun</p>
            </div>
        u)   BÅ‚Ä…d podczas wysyÅ‚ania potwierdzenia: r”   Tr–   uD   E-mail z potwierdzeniem zostaÅ‚ wysÅ‚any. SprawdÅº swojÄ… skrzynkÄ™.zSERVER ERROR: u&   WystÄ…piÅ‚ bÅ‚Ä…d wewnÄ™trzny serwera.)r   r—   r˜   rg  rh   r   r`   rc   rW   rž   rŸ   r    r¡   ÚsecretsÚtoken_urlsaferk  r÷  rP   rG   rH   rI   )r†   r®   r`   rV   rž   r­   rô  Úsubscriber_idÚsentr¯   Úadmin_emailÚsubject_adminÚ
body_adminÚsuccess_adminÚerror_adminrO   s                   r)   Ú	subscriber  @  sA  € ðHcÜ×ÒÓ!×'Ð' RˆØ—‘˜'Ó"×(Ð( b×/Ñ/Ó1×7Ñ7Ó9ˆßÜ˜I u¨gÐ7SÐTÓUÐWZÐZÐZó 	Ø�xŠxÐ-¨u×5Ò5Ü˜I u¨gÐ7TÐUÓVÐX[Ð[Ð[ä Ó"ˆØ—‘“ˆð 	�‰ÐZÐ]bÐ\dÔeØ�o‰oÓˆß�3�q—6”6Ø�L‰LŒNØ�J‰JŒLÜ˜I u¨gÐ7sÐtÓuÐwzÐzÐzä×%Ò% bÓ)ˆçà�N‰Nð ð ˜Q��ô	"ð
   �F‰Mà�N‰Nð ð �ô	!ð
 #ŸO™OÓ-¨aÕ0ˆMà�‰ŒØ�‰ŒØ�
‰
Œä+¨EÓ9‰	ˆð 0ˆØ6ˆð)ð */¨ð 0	ð		ˆ
ô &8¸ÐT^Ó%_Ñ"ˆçÜ˜I u¨gÐ9bÐcfÐbgÐ7hÐiÓjÐloÐoÐoä˜	 4¨Ð4zÐ{Ó|Ð|øäô cä�œs 1›v˜hÐ'Ô(Ü˜	 5¨'Ð3[Ð\Ó]Ð_bÐbÕbûðcúsY   ‚H žH ¹&H Á H Á1H ÂH ÂAH Ã30H Ä$H ÅB>H ÈH ÈIÈ'IÉIÉIz/confirm-subscriptionc                  ó  €  \         P                  P                  R 4      p V '       g   \        RR4      # \	        4       pVP                  4       pVP                  RV 34       VP                  4       pV'       g-   VP                  4        VP                  4        \        RR4      # V^ ,          V^,          V^,          repV'       d-   VP                  4        VP                  4        \        R^È4      # VP                  RV34       VP                  4        VP                  4        VP                  4        RV R	\        P                  ! R
R4       R2p\        V^È4      #   \         d    p\        \        T4      R4      u Rp?# Rp?ii ; i)rô  zToken not providedr“   zHSELECT id, email, confirmed FROM newsletter_subscribers WHERE token = %szToken invalid or expiredr§   zSubscription already confirmed.z’
            UPDATE newsletter_subscribers
            SET confirmed = TRUE, confirmed_at = NOW(), token = NULL
            WHERE id = %s
        uN   
        <html><body>
        <h2>DziÄ™kujemy!</h2>
        <p>E-mail <strong>uq   </strong> zostaÅ‚ potwierdzony. Otrzymasz od nas wiadomoÅ›ci z promocjami i artykuÅ‚ami.</p>
        <p><a href="rñ  rò  u<   ">PowrÃ³t na stronÄ™</a></p>
        </body></html>
        r”   N)r   r/   r˜   r   rW   rž   rŸ   r    r¡   rk  r$   r%   rG   rI   )	rô  rV   rž   r­   rü  r®   Ú	confirmedr:   rO   s	            r)   Úconfirm_subscriptionr  �  sO  € ð(*Ü—‘× Ñ  Ó)ˆßÜ Ð!5°sÓ;Ð;ä Ó"ˆØ—‘“ˆØ�‰ÐaÐdiÐckÔlØ�o‰oÓˆßØ�L‰LŒNØ�J‰JŒLÜ Ð!;¸SÓAÐAà*-¨a­&°#°aµ&¸#¸a½&˜iˆßØ�L‰LŒNØ�J‰JŒLÜ Ð!BÀCÓHÐHà�‰ð ð Ðô		ð
 	�‰ŒØ�‰ŒØ�
‰
Œðð !˜'ð "Ü—Y’Y˜z¨#Ó.Ð/ð 0	ð	ˆô ˜T 3Ó'Ð'øäô *ÜœS ›V SÓ)Õ)ûð*ús6   ‚&E! ©E! µA0E! Â&AE! Ã4A,E! Å!FÅ,FÆ FÆFz/admin/subscribersc                  ó˜  €  \        4       p V P                  \        P                  P                  R 7      pVP                  R4       VP                  4       pVP                  4        V P                  4        RpV FŽ  pVR,          '       d   RMRpVR,          '       d   VR,          P                  4       MRpVRVR,           R	VR
,           R	V R	VR,          P                  4        R	V RVR
,           RVR
,           R2,          pK�  	  RV R2p\        V^È4      #   \         d    p\        \        T4      R4      u Rp?# Rp?ii ; i)rú   z¯
            SELECT id, email, confirmed, created_at, confirmed_at
            FROM newsletter_subscribers
            ORDER BY created_at DESC
            LIMIT 1000
        r  r  u   Ð”Ð°u   Ð�ÐµÑ‚Úconfirmed_atz$
            <tr>
              <td>rü   z</td>
              <td>r®   r   z´</td>
              <td>
                <form method="post" action="/admin/resend-confirmation" style="display:inline">
                  <input type="hidden" name="email" value="a  ">
                  <button type="submit">Resend</button>
                </form>
                <form method="post" action="/admin/delete-subscriber" style="display:inline" onsubmit="return confirm('Delete?')">
                  <input type="hidden" name="email" value="z…">
                  <button type="submit">Delete</button>
                </form>
              </td>
            </tr>
            aÓ  
        <html>
        <head><meta charset="utf-8"><title>Admin - Subscribers</title></head>
        <body>
          <h1>Subscribers</h1>
          <p><a href="/admin/export-subscribers">Export CSV</a></p>
          <table border="1" cellpadding="6" cellspacing="0">
            <thead>
              <tr><th>ID</th><th>Email</th><th>Confirmed</th><th>Created at</th><th>Confirmed at</th><th>Actions</th></tr>
            </thead>
            <tbody>
              zQ
            </tbody>
          </table>
        </body>
        </html>
        r”   N)rW   rž   rT   r  r  rŸ   rª   r¡   r  r   rG   rI   )	rV   rž   r�  Ú	rows_htmlÚrÚconfirmed_textr  r:   rO   s	            r)   Úadmin_subscribersr  º  sa  € ð9*Ü Ó"ˆØ—‘¬H¯O©O×,FÑ,F�ÓGˆØ�‰ð ô 	ð �‰Ó ˆØ�‰ŒØ�
‰
Œð ˆ	ÛˆAØ'(¨§~¤~™V¸8ˆNØ<=¸n×<MÔ<M˜1˜^Õ,×6Ñ6Ô8ÐSUˆLØð à�T•7�)ð Ø�W•:�,ð Ø!Ð"ð #Ø�\•?×,Ñ,Ó.Ð/ð 0Ø�.ð !<ð =>¸g½J¸<ð H<ð =>¸g½J¸<ð Hðõ ŠIñ ð.ð ˆkð 	ðˆô" ˜T 3Ó'Ð'øÜô *ÜœS ›V SÓ)Õ)ûð*ús%   ‚BD Â A>D ÄE	Ä*EÄ>E	ÅE	z/admin/export-subscribersc            	      óF  €  \        4       p V P                  4       pVP                  R 4       VP                  4       pVP	                  4        V P	                  4        \
        P                  ! 4       p\        P                  ! V4      pVP                  . R	O4       V Fz  pTP                  V^ ,          V^,          V^,          V^,          '       d   V^,          P                  4       MRV^,          '       d   V^,          P                  4       MR.4       K|  	  VP                  ^ 4       VP                  4       P                  R4      p\        V4      pRVP                  R&   RVP                  R&   V#   \          d    p\        \#        T4      R4      u Rp?# Rp?ii ; i)
zjSELECT id, email, confirmed, created_at, confirmed_at FROM newsletter_subscribers ORDER BY created_at DESCr  zutf-8ztext/csv; charset=utf-8zContent-Typez$attachment; filename=subscribers.csvzContent-Dispositionr”   N)rü   r®   r  r   r  )rW   rž   rŸ   rª   r¡   ÚioÚStringIOÚcsvÚwriterÚwriterowr  ÚseekÚgetvalueÚencoder   ÚheadersrG   rI   )	rV   rž   r�  Úoutputr  r
  Ú	csv_bytesÚresponserO   s	            r)   Úexport_subscribersr  ù  sF  € ð*Ü Ó"ˆØ—‘“ˆØ�‰ð  Dô  	EØ�‰Ó ˆØ�‰ŒØ�
‰
Œä—’“ˆÜ—’˜FÓ#ˆØ�‰ÒRÔSÛˆAØ�O‰OØ�!•Ø�!•Ø�!•Ø$% a§D¤D��!•—‘Ô ¨bØ$% a§D¤D��!•—‘Ô ¨bðö ñ ð 	�‰�AŒØ—O‘OÓ%×,Ñ,¨WÓ5ˆ	Ü  Ó+ˆØ+Dˆ×Ñ˜Ñ(Ø2Xˆ×ÑÐ.Ñ/ØˆøÜô *ÜœS ›V SÓ)Õ)ûð*ús%   ‚C6E6 Ã9A<E6 Å6F ÆFÆF ÆF z/admin/resend-confirmationc                  óˆ  €  \         P                  P                  R 4      ;'       g    RP                  4       P	                  4       p V '       g   \        RR4      # \        4       pVP                  4       pVP                  RV 34       VP                  4       pV'       g-   VP                  4        VP                  4        \        RR4      # V^,          '       d-   VP                  4        VP                  4        \        RR4      # \        P                  ! ^ 4      pVP                  RWC^ ,          34       VP                  4        VP                  4        VP                  4        \        W4      w  rVV'       g   \        R	V 2R
4      # \        R^È4      #   \         d    p\        \!        T4      R
4      u Rp?# Rp?ii ; i)r®   r  úemail requiredr“   rù  zSubscriber not foundr§   zSubscriber already confirmedzNUPDATE newsletter_subscribers SET token = %s, created_at = NOW() WHERE id = %szError sending email: r”   zConfirmation resentN)r   Úformr˜   rg  rh   r   rW   rž   rŸ   r    r¡   rú  rû  rk  r÷  rG   rI   )r®   rV   rž   r­   rô  rý  r¯   rO   s           r)   Úadmin_resend_confirmationr    s[  € ð*Ü—‘×!Ñ! 'Ó*×0Ð0¨b×7Ñ7Ó9×?Ñ?ÓAˆßÜ Ð!1°3Ó7Ð7ä Ó"ˆØ—‘“ˆØ�‰ÐZÐ]bÐ\dÔeØ�o‰oÓˆßØ�L‰LŒNØ�J‰JŒLÜ Ð!7¸Ó=Ð=àˆq�6Œ6Ø�L‰LŒNØ�J‰JŒLÜ Ð!?ÀÓEÐEä×%Ò% bÓ)ˆØ�‰ÐgÐjoÐuvÕqwÐixÔyØ�‰ŒØ�‰ŒØ�
‰
Œä+¨EÓ9‰	ˆßÜ Ð#8¸¸Ð!>ÀÓDÐDäÐ2°CÓ8Ð8øÜô *ÜœS ›V SÓ)Õ)ûð*úsH   ‚%F ¨&F ÁF ÁA0F ÃF Ã+F ÄBF ÆF ÆGÆ"F<Æ6GÆ<Gz/admin/delete-subscriberc                  óâ  €  \         P                  P                  R 4      ;'       g    RP                  4       P	                  4       p V '       g   \        RR4      # \        4       pVP                  4       pVP                  RV 34       VP                  4        VP                  4        VP                  4        \        R^È4      #   \         d    p\        \        T4      R4      u Rp?# Rp?ii ; i)r®   r  r  r“   z3DELETE FROM newsletter_subscribers WHERE email = %sÚDeletedr”   N)r   r  r˜   rg  rh   r   rW   rž   rŸ   rk  r¡   rG   rI   )r®   rV   rž   rO   s       r)   Úadmin_delete_subscriberr!  >  s³   € ð*Ü—‘×!Ñ! 'Ó*×0Ð0¨b×7Ñ7Ó9×?Ñ?ÓAˆßÜ Ð!1°3Ó7Ð7ä Ó"ˆØ—‘“ˆØ�‰ÐLÈuÈhÔWØ�‰ŒØ�‰ŒØ�
‰
Œä˜Y¨Ó,Ð,øÜô *ÜœS ›V SÓ)Õ)ûð*ús/   ‚%C ¨&C ÁC ÁA(C ÃC.ÃC)Ã#C.Ã)C.Ú__main__Tz0.0.0.0ip  )Údebugr   r   >   rr   rq   ro   rp   rs   r¿   )Tr³   r   r   r   Ú
flask_corsr   rT   Úpsycopg2.extrasr$   r   r©   ÚrequestsÚurllib.parser   r	   r`   rˆ  ÚloggingÚbasicConfigÚDEBUGr€   rz   Úwerkzeug.utilsr   r>   r=   r   Ú	functoolsr   r  r  rú  r   r   r   Ú__name__ÚapprS   Úemail.mime.textr   Úemail.mime.multipartr   r?   r*   r5   rP   rW   r^   rd   r~   ri   rk   rŒ   Úrouterš   r£   r°   r´   r÷   r  r~  r�  r�  r¤  r¦  r©  r­  r°  r²  r»  r¿  rÃ  rÏ  rÒ  rì  rï  r÷  r  r  r  r  r  r!  ÚrunrR   r+   r)   Ú<module>r3     s  ðß )Ñ )Ý Û Û Û 	Ý Û Û ß +Û 	Û 
ó Ø × Ò ˜'Ÿ-™-Õ (ã Û Ý *ó Ý &Ý Û 
Û 	Û ß )Ý áˆHƒo€Ù €S„	ð ˆKØÐ'Ø
ˆJØÐ!ð	€	ó Ý $Ý .ð ÐØ
ˆCØ
Ð%Ø
Ð!Ø
Ð0ð€ò=ò
òò0	òòð& R€Ú:Ð òXô,ð\ ‡�Ð¨¨€Ó1ñ!ó 2ð!ðJ ‡�Ð.¸¸€Ó@ñAó AðAð ‡�Ð!¨F¨8€Ó4ñ%Aó 5ð%AðP ‡�Ð/Ó0ñ%ó 1ð%òò*ðD ‡�ˆ? V H€Ó-ñWó .ðWðt
 ‡�ˆ? U G€Ó,ñ\Aó -ð\Að~ ‡�Ð+°e°W€Ó=ñ}ó >ð}ðB ‡�Ð+°e°W€Ó=ñUó >ðUðn ‡�Ð2¸U¸G€ÓDñó Eðð  ‡�Ð2¸V¸H€ÓEñBó FðBðH ‡�ÐAÈEÈ7€ÓSñ<ó Tð<ð| ‡�ÐAÈHÈ:€ÓVñ'ó Wð'ð^ ‡�Ð+°h°Z€Ó@ñ$ó Að$ðL ‡�Ð¨&¨€Ó2ñJó 3ðJðZ ‡�Ð u g€Ó.ñó /ðð> ‡�Ð!¨F¨8€Ó4ñ*Aó 5ð*AðX ‡�ˆ< % €Ó)ñCAó *ðCAðJ ‡�ˆ= 5 '€Ó*ñó +ðð ‡�Ð¨¨€Ó1ñ<ó 2ð<ð~ ‡�Ð ¨5¨'€Ó2ñó 3ðòF4ð* ‡�Ð f X€Ó.ñIcó /ðIcðX ‡�Ð"¨U¨G€Ó4ñ)*ó 5ð)*ðX ‡�Ð¨%¨€Ó1Øñ:*ó ó 2ð:*ðz ‡�Ð&°°€Ó8Øñ*ó ó 9ð*ð< ‡�Ð'°&°€Ó:Øñ *ó ó ;ð *ðF ‡�Ð%°¨x€Ó8Øñ*ó ó 9ð*ð* ˆzÔØ‡G�G�$˜Y¨T€GÖ2ñ r+   