Ë
    IB™j[8  ã                   óL  — d dl mZmZ d dlmZmZmZ d dlmZmZm	Z	m
Z
 d dlZd dlZ eddg¬«      Zej                  j!                  ej                  j#                  e«      «      Zej                  j)                  ed«      Z ej,                  e«       g d	¢Zej0                  ej2                  ej4                  ej6                  ej8                  ej:                  ej<                  ej>                  ej@                  ejB                  d
œ
Z"ej4                  ej6                  ej8                  ej:                  ej<                  ej>                  ej@                  ejB                  dœZ#ddddddddddd
œ
Z$i dd“dd“dd“dd“dd“dd“dd“d d!“d"d!“d#d!“d$d“d%d“d&d“d'd“d(d“d)d“Z%d*e&d+e&d,e&fd-„Z'd.e(d,e)fd/„Z*d0e(d.e(d,efd1„Z+d2ed.e(d,e(fd3„Z,d4e(d,e
e)e)f   fd5„Z-d6e(d,e(fd7„Z.d0e(d8e&d,e
e(e(f   fd9„Z/d2ed.e(d,e)fd:„Z0d2ed,e)fd;„Z1d<e)d=e)d,e)fd>„Z2d<e)d?e)d,e)fd@„Z3dAe)d,e)fdB„Z4dCe(dDe(dEe&dFe&d,e(f
dG„Z5dCe(dDe(dEe&dHe(d,e(f
dI„Z6d0e(d,e(fdJ„Z7dKe(dLe(dMe(d,e8fdN„Z9dCe(dDe(dOe(d,e(fdP„Z:d+e&d*e&d.e(d,eee)e	f      fdQ„Z;ejy                  dR«       edSdTdU¬V«       edSdWdX¬V«       edY«      fd+e&d*e&dZe(fd[„«       Z=y)\é    )Ú	APIRouterÚQuery)ÚdatetimeÚ	timedeltaÚtimezone)ÚListÚDictÚAnyÚTupleNz	/calendarzplanetary-events)ÚprefixÚtagsÚephe))ÚAriesu   â™ˆ)ÚTaurusu   â™‰)ÚGeminiu   â™Š)ÚCanceru   â™‹)ÚLeou   â™Œ)ÚVirgou   â™�)ÚLibrau   â™Ž)ÚScorpiou   â™�)ÚSagittariusu   â™�)Ú	Capricornu   â™‘)ÚAquariusu   â™’)ÚPiscesu   â™“)
ÚSunÚMoonÚMercuryÚVenusÚMarsÚJupiterÚSaturnÚUranusÚNeptuneÚPluto)r   r   r   r    r!   r"   r#   r$   u   â˜‰u   â˜½u   â˜¿u   â™€u   â™‚u   â™ƒu   â™„u   â™…u   â™†u   â™‡r   zVERY COMMONr   ÚCOMMONr   r   r   r    ÚRAREr!   r"   z	VERY RAREr#   r$   Ú
retrogradeÚdirectúNew MoonúFirst Quarter Moonú	Full MoonúLast Quarter MoonÚyearÚmonthÚreturnc                 ó\   — |dk(  ryt        | |dz   d«      t        d¬«      z
  j                  S )Né   é   é   )Údays)r   r   Úday)r-   r.   s     úA/var/www/html/Astrologybackend/backend/planetary_events_router.pyÚlast_day_of_monthr7   Z   s/   € Ø�‚{ØÜ�T˜5 1™9 aÓ(¬9¸!Ô+<Ñ<×AÑAÐAó    Ú	tz_offsetc                 óŠ   — | dk\  rdnd}t        | «      }t        |«      }t        t        ||z
  dz  «      «      }d|› |› d|d›�S )Nr   ú+ú-é<   ÚGMTú:Ú02d)ÚabsÚintÚround)r9   ÚsignÚabs_tzÚhoursÚminutess        r6   Údecimal_timezone_to_labelrH   `   sR   € Ø˜q’.‰3 c€DÜ�‹^€FÜ�‹K€EÜ”%˜ %™¨2Ñ-Ó.Ó/€GØ���u�g˜Q˜w s˜mÐ,Ð,r8   Újdc                 óz   — | dz
  dz  }t        j                  |t        j                  ¬«      }|t	        |¬«      z   S )Ng   ÀÅžBAi€Q )Útz©rF   )r   Úfromtimestampr   Úutcr   )rI   r9   Úunix_secondsÚutc_dts       r6   Újd_to_local_datetimerQ   h   s6   € Ø˜‘N eÑ+€LÜ×#Ñ# L´X·\±\ÔB€FØ”I IÔ.Ñ.Ð.r8   Úlocal_dtc                 óä   — | t        |¬«      z
  }|j                  |j                  dz  z   |j                  dz  z   }t	        j
                  |j                  |j                  |j                  |«      S )NrL   r=   i  )	r   ÚhourÚminuteÚsecondÚsweÚjuldayr-   r.   r5   )rR   r9   rP   rT   s       r6   Úlocal_datetime_to_jdrY   n   sW   € Øœ	¨	Ô2Ñ2€FØ�;‰;˜Ÿ™¨Ñ+Ñ+¨f¯m©m¸dÑ.BÑB€DÜ�:‰:�f—k‘k 6§<¡<°·±¸TÓBÐBr8   Úlonc                 ó<   — t        | dz  dz  «      dz  }t        |   S )Néh  é   r1   )rB   ÚZODIAC)rZ   Úidxs     r6   Úget_signr`   t   s$   € Ü
ˆs�S‰y˜RÑÓ
  2Ñ
%€CÜ�#‰;Ðr8   Úanglec                 ó   — | dz  S )Nr\   © )ra   s    r6   Únormalize_anglerd   y   s   € Ø�3‰;Ðr8   Úpidc                 ó–   — t        j                  | |t         j                  t         j                  z  «      \  }}|d   dz  }|d   }||fS )z±
    Correct pyswisseph output:
    swe.calc_ut(...) returns:
    (
      (longitude, latitude, distance, speed_longitude, speed_latitude, speed_distance),
      flag
    )
    r   r\   é   )rW   Úcalc_utÚ
FLG_SWIEPHÚ	FLG_SPEED)rI   re   ÚdataÚ_flagÚ	longitudeÚspeeds         r6   Úbody_posro   }   sH   € ô —+‘+˜b #¤s§~¡~¼¿¹Ñ'EÓF�K€Dˆ%Ø�Q‘˜#‘€IØ�‰G€EØ�eÐÐr8   c                 ó@   — | j                  d«      › dt        |«      › �S )Nz%H:%Mú )ÚstrftimerH   )rR   r9   s     r6   Úmake_event_timers   Œ   s&   € Ø×Ñ Ó(Ð)¨Ô+DÀYÓ+OÐ*PÐQÐQr8   c                 ó$   — | j                  d«      S )Nz	%B %d, %Y)rr   )rR   s    r6   Úevent_display_dateru   �   s   € Ø×Ñ˜[Ó)Ð)r8   ÚbodyrD   c                 óT   — ddddddddd	d
dddœ}| › d|› d|j                  |d«      › �S )Nz&new action, courage, and fresh starts.z0stability, money, comfort, and practical growth.z1communication, learning, curiosity, and movement.z!home, family, emotions, and care.z5confidence, creativity, romance, and self-expression.z'routine, work, health, and improvement.z,relationships, balance, beauty, and harmony.z5depth, transformation, intimacy, and emotional truth.z(travel, belief, learning, and expansion.z8career, responsibility, discipline, and long-term goals.z2innovation, friendship, groups, and future vision.z0intuition, dreams, compassion, and spirituality.)r   r   r   r   r   r   r   r   r   r   r   r   z enters z, bringing focus to znew astrological themes.©Úget)rv   rD   Úmeaningss      r6   Úingress_meaningr{   ”   sT   € à9ØDØEØ5ØFØ:Ø?ØJØAØOØHØDñ€Hð ˆV�8˜D˜6Ð!5°h·l±lÀ4ÐIcÓ6dÐ5eÐfÐfr8   Úmotionc                 ó    — |dk(  r| › d�S | › d�S )Nr'   zM turns retrograde, bringing review, reflection, delays, and inner correction.zA turns direct, restoring forward movement, clarity, and progress.rc   )rv   r|   s     r6   Ústation_meaningr~   ¦   s&   € Ø�ÒØ�ÐdÐeÐeØˆVÐTÐUÐUr8   Úphasec                 ó4   — dddddœ}|j                  | d«      S )NzFThe New Moon supports new beginnings, intentions, and emotional reset.z>The First Quarter Moon brings action, decisions, and momentum.zKThe Full Moon brings emotional awareness, completion, release, and clarity.zDThe Last Quarter Moon supports reflection, clearing, and letting go.)r)   r*   r+   r,   zMoon phase energy is active.rx   )r   rz   s     r6   Úmoon_phase_meaningr�   ¬   s)   € à\Ø^ØbØcñ	€Hð �<‰<˜Ð=Ó>Ð>r8   Ústart_jdÚend_jdÚbody_idÚtarget_sign_indexc                 óž   — | }|}t        d«      D ]4  }||z   dz  }t        ||«      \  }}	t        |dz  «      dz  }
|
|k(  r|}Œ3|}Œ6 ||z   dz  S )z0
    Binary search exact sign ingress time.
    é(   é   r]   r1   )Úrangero   rB   )r‚   rƒ   r„   r…   ÚleftÚrightÚ_ÚmidrZ   Ú_speedÚ
sign_indexs              r6   Úfind_ingress_timer�   ·   su   € ð €DØ€Eä�2‹Yò ˆØ�e‰|˜qÑ ˆÜ˜s GÓ,‰ˆˆVÜ˜ ™“^ bÑ(ˆ
àÐ*Ò*Ø‰Eà‰Dðð �5‰L˜AÑÐr8   Ústart_speedc                 ó‚   — | }|}t        d«      D ]&  }||z   dz  }t        ||«      \  }}	||	z  dk  r|}Œ%|}Œ( ||z   dz  S )z=
    Binary search exact retrograde/direct station time.
    é-   rˆ   r   )r‰   ro   )
r‚   rƒ   r„   r‘   rŠ   r‹   rŒ   r�   Ú_lonÚ	mid_speeds
             r6   Úfind_station_timer–   Ð   sg   € ð €DØ€Eä�2‹Yò ˆØ�e‰|˜qÑ ˆÜ" 3¨Ó0‰ˆˆià˜Ñ" aÒ'Ø‰Eà‰Dðð �5‰L˜AÑÐr8   c                 ó’   — t        | t        j                  «      \  }}t        | t        j                  «      \  }}t	        ||z
  «      S )N)ro   rW   ÚSUNÚMOONrd   )rI   Úsun_lonrŒ   Úmoon_lons       r6   Úmoon_phase_anglerœ   è   s:   € Ü˜"œcŸg™gÓ&�J€GˆQÜ˜2œsŸx™xÓ(�K€HˆaÜ˜8 gÑ-Ó.Ð.r8   Ú
prev_angleÚ	cur_angleÚtargetc                 óV   — | }|}||k  r|dz  }|}||k  r|dz  }||cxk  xr |k  S c S )zi
    Checks if Sun-Moon phase angle crossed target between two samples.
    Works across 0/360 wrap.
    r\   rc   )r�   rž   rŸ   ÚprevÚcurÚts         r6   Úangle_crossedr¤   î   sI   € ð
 €DØ
€Cà
ˆT‚zØˆs‰
ˆà€AØˆ4‚xØ	ˆS‰ˆà�1Ö˜ÑÐÑÐr8   Útarget_anglec                 ó¾   — | }|}t        | «      }t        d«      D ]9  }||z   dz  }t        |«      }|}	|}
|
|	k  r|
dz  }
|}||	k  r|dz  }|
|k\  r|}Œ8|}Œ; ||z   dz  S )z.
    Binary search exact Moon phase time.
    r“   rˆ   r\   )rœ   r‰   )r‚   rƒ   r¥   rŠ   r‹   Ústart_anglerŒ   r�   Ú	mid_angleÚa1Úa2rŸ   s               r6   Úfind_moon_phase_timer«      s”   € ð €DØ€EÜ" 8Ó,€Kä�2‹Yò ˆØ�e‰|˜qÑ ˆÜ$ SÓ)ˆ	àˆØˆà�Š7Ø�#‰IˆBàˆØ�BŠ;Ø�c‰MˆFà�Š<Ø‰Eà‰Dð#ð& �5‰L˜AÑÐr8   c                 óŒ	  — g }t        || «      }t        || dddd«      }t        || |ddd«      }t        ||«      }t        ||«      }d}	g }
|dz
  }||dz   k  r|
j                  |«       ||	z  }||dz   k  rŒt        j                  «       D �]W  \  }}|
d   }t        ||«      \  }}t        |dz  «      dz  }|
dd  D �]#  }t        ||«      \  }}t        |dz  «      dz  }||k7  rót        ||||«      }t        ||«      }|j                  |k(  rÊ|j                  | k(  r»t        |   \  }}t        |   \  }}|j                  |j                  «       › d|j                  «       › d	�|j                  «       j                  «       t!        |«      |t"        j%                  |d
«      t'        ||«      dd ||||t(        j%                  |d«      t+        ||«      dœ«       |}|}|}|}�Œ& �ŒZ t,        j                  «       D �]6  \  }}|
d   }t        ||«      \  }}|
dd  D �]  }t        ||«      \  }}|dk7  rø|dk7  ró||z  dk  rët/        ||||«      }t        ||«      }|j                  |k(  rÂ|j                  | k(  r³|dkD  r|dk  rdnd}|j                  |j                  «       › d|j                  «       › d|› �|j                  «       j                  «       t!        |«      |t"        j%                  |d
«      t'        ||«      d|d d d d t(        j%                  |d«      t1        ||«      dœ«       |}|}�Œ �Œ9 g d¢}|
d   }t3        |«      } |
dd  D �]6  }t3        |«      }!|D �]  \  }"}#}$t5        | |!|$«      sŒt7        |||$«      }t        ||«      }|j                  |k(  sŒ?|j                  | k(  sŒOt        |t8        j:                  «      \  }%}&t=        |%«      \  }'}(|j                  |j                  «       › d|"j                  «       j?                  dd«      › �|j                  «       j                  «       t!        |«      |"|#t'        ||«      dd d d |'|(t(        j%                  |"d«      |"› d|'› dtA        |"«      › �dœ«       �Œ! |}|!} �Œ9 i })|D ]
  }*|*|)|*d   <   Œ tC        |)jE                  «       «      }|jG                  d„ ¬«       |S )Nr3   r   é   é;   g      Ð?r]   r1   r<   z-ingressu   â˜…Úingressr%   )ÚidÚdateÚdisplay_daterv   Úbody_symbolÚtimeÚ
event_typer|   Ú	from_signÚfrom_symbolÚto_signÚ	to_symbolÚ	frequencyÚmeaningr'   r(   Ústationr&   ))r)   u   ðŸŒ‘r   )r*   u   ðŸŒ“éZ   )r+   u   ðŸŒ•é´   )r,   u   ðŸŒ—i  rq   Ú
moon_phasez in z. r°   c                 ó   — | d   | d   | d   fS )Nr±   r´   rv   rc   )Úes    r6   ú<lambda>z+generate_planetary_events.<locals>.<lambda>¯  s   € ˜q ™y¨!¨F©)°Q°v±YÐ?€ r8   )Úkey)$r7   r   rY   ÚappendÚBODIESÚitemsro   rB   r�   rQ   r-   r.   r^   Ú	isoformatÚlowerr±   ru   ÚSYMBOLSry   rs   Ú	FREQUENCYr{   ÚSTATION_BODIESr–   r~   rœ   r¤   r«   rW   r™   r`   Úreplacer�   ÚlistÚvaluesÚsort)+r.   r-   r9   Úeventsr4   Ústart_localÚ	end_localr‚   rƒ   ÚstepÚsamplesrI   Ú	body_namer„   Úprev_jdÚprev_lonÚ
prev_speedÚprev_sign_indexÚcur_jdÚcur_lonÚ	cur_speedÚcur_sign_indexÚexact_jdrR   r¶   r·   r¸   r¹   Ú	_prev_lonÚ_cur_lonr|   Úmoon_targetsr�   rž   Ú
phase_nameÚphase_symbolr¥   r›   rŒ   Ú	sign_nameÚsign_symbolÚuniqueÚevents+                                              r6   Úgenerate_planetary_eventsrè     s2  € Ø#%€FÜ˜T 5Ó)€Dô ˜4 ¨¨1¨a°Ó3€KÜ˜˜u d¨B°°BÓ7€Iä# K°Ó;€HÜ! )¨YÓ7€Fð €Dà€GØ	�A‰€BØ
�˜‘
Ò
Ø�‰�rÔØ
ˆd‰
ˆð �˜‘
Ó
ô
 %Ÿl™l›nó %-Ñˆ	�7Ø˜!‘*ˆÜ'¨°Ó9Ñˆ�*Ü˜h¨"™nÓ-°Ñ2ˆà˜a˜b�kó  	-ˆFÜ!)¨&°'Ó!:ÑˆG�YÜ  ¨B¡Ó/°"Ñ4ˆNà Ò0Ü,¨W°f¸gÀ~ÓV�Ü/°¸)ÓD�à—=‘= DÒ(¨X¯^©^¸uÒ-DÜ-3°OÑ-DÑ*�I˜{Ü)/°Ñ)?Ñ&�G˜Yà—M‘MØ!)×!3Ñ!3Ó!5Ð 6°a¸	¿¹Ó8IÐ7JÈ(ÐSØ (§¡£× 9Ñ 9Ó ;Ü(:¸8Ó(DØ )Ü'.§{¡{°9¸eÓ'DÜ /°¸)Ó DØ&/Ø"&Ø%.Ø'2Ø#*Ø%.Ü%.§]¡]°9¸hÓ%GÜ#2°9¸gÓ#Fñ#ô ð" ˆGØˆHØ"ˆJØ,ŠOòA 	-ð%-ôP -×2Ñ2Ó4ó #Ñˆ	�7Ø˜!‘*ˆÜ (¨°'Ó :Ñˆ	�:à˜a˜b�kó 	#ˆFÜ"*¨6°7Ó";ÑˆH�ià˜QŠ 9°¢>°jÀ9Ñ6LÈqÒ6PÜ,¨W°f¸gÀzÓR�Ü/°¸)ÓD�à—=‘= DÒ(¨X¯^©^¸uÒ-DØ-7¸!ª^À	ÈAÂ™\ÐS[�FØ—M‘MØ!)×!3Ñ!3Ó!5Ð 6°a¸	¿¹Ó8IÐ7JÈ!ÈFÈ8ÐTØ (§¡£× 9Ñ 9Ó ;Ü(:¸8Ó(DØ )Ü'.§{¡{°9¸eÓ'DÜ /°¸)Ó DØ&/Ø"(Ø%)Ø'+Ø#'Ø%)Ü%.§]¡]°6¸6Ó%BÜ#2°9¸fÓ#Eñ#ô ð" ˆGØ"ŠJò7	#ð	#òD€Lð �a‰j€GÜ! 'Ó*€Jà˜!˜"�+ó ˆÜ$ VÓ,ˆ	à6Bó 	Ñ2ˆJ˜ lÜ˜Z¨°LÕAÜ/°¸ÀÓN�Ü/°¸)ÓD�à—=‘= DÓ(¨X¯^©^¸uÓ-DÜ"*¨8´S·X±XÓ">‘K�H˜aÜ-5°hÓ-?Ñ*�I˜{à—M‘MØ!)×!3Ñ!3Ó!5Ð 6°a¸
×8HÑ8HÓ8J×8RÑ8RÐSVÐX[Ó8\Ð7]Ð^Ø (§¡£× 9Ñ 9Ó ;Ü(:¸8Ó(DØ *Ø'3Ü /°¸)Ó DØ&2Ø"&Ø%)Ø'+Ø#,Ø%0Ü%.§]¡]°:¸xÓ%HØ&0 \°°i°[ÀÔCUÐV`ÓCaÐBbÐ#cñ#ö ð	ð4 ˆØŠ
ð=ðB €FØò $ˆØ#ˆˆu�T‰{Òð$ô �&—-‘-“/Ó"€Fð ‡K�KÑ?€KÔ@à€Mr8   z/planet-events.r3   r1   )ÚgeÚleil  i4  g      @r   c           	   ƒ   ó†   K  — 	 t        | ||«      }d| |||dœS # t        $ r}d| ||g t        |«      dœcY d }~S d }~ww xY w­w)NT)Úsuccessr.   r-   r   rÐ   F)rì   r.   r-   r   rÐ   Úerror)rè   Ú	ExceptionÚstr)r.   r-   r   rÐ   rÁ   s        r6   Úget_planet_eventsrð   µ  se   è ø€ ð
Ü*¨5°$¸ÓAˆð ØØØ Øñ
ð 	
øô ò 
àØØØ ØÜ˜“Vñ
õ 	
ûð
üs(   ‚A„ ˜A™	>¢9³>´A¹>¾A)>Úfastapir   r   r   r   r   Útypingr   r	   r
   r   ÚswissephrW   ÚosÚrouterÚpathÚdirnameÚabspathÚ__file__ÚBASE_DIRÚjoinÚ	EPHE_PATHÚset_ephe_pathr^   r˜   r™   ÚMERCURYÚVENUSÚMARSÚJUPITERÚSATURNÚURANUSÚNEPTUNEÚPLUTOrÅ   rË   rÉ   rÊ   rB   r7   Úfloatrï   rH   rQ   rY   r`   rd   ro   rs   ru   r{   r~   r�   r�   r–   rœ   Úboolr¤   r«   rè   ry   rð   rc   r8   r6   ú<module>r     sv  ðß $ß 2Ñ 2ß )Ó )Û Û 	á	˜+Ð-?Ð,@Ô	A€ð �7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€Ø�G‰G�L‰L˜ 6Ó*€	ð €× Ñ �)Ô ò
€ð  �7‰7Ø�H‰HØ�{‰{Ø�Y‰YØ�H‰HØ�{‰{Ø�j‰jØ�j‰jØ�{‰{Ø�Y‰Yñ
€ð �{‰{Ø�Y‰YØ�H‰HØ�{‰{Ø�j‰jØ�j‰jØ�{‰{Ø�Y‰Yñ	€ð ØØØØØØØØØñ€ðØ
ˆMðà	ˆ8ðð ˆxðð ˆXð	ð
 ˆHðð ˆvðð ˆfðð ˆkðð ˆ{ðð ˆ[ðð �&ðð ˆfðð �ðð ˜(ðð �ðð  ˜ð!€	ð*B˜Cð B¨ð B°ó Bð-¨ð -°3ó -ð/˜Uð /¨uð /¸ó /ðC 8ð C¸ð CÀ%ó Cð�%ð ˜E # s (™Oó ð
˜5ð  Uó ð�ð ˜Sð  U¨5°%¨<Ñ%8ó ðR˜hð R°5ð R¸Só Rð* ð *¨có *ðg˜#ð g Sð g¨Só gð$V˜#ð V sð V¨só Vð?˜cð ? có ?ðØðàðð ðð ð	ð
 óð2Øðàðð ðð ð	ð
 óð0/˜ð / 5ó /ð˜eð °ð ¸uð Èó ð$ 5ð °%ð Àuð ÐQVó ð<S Sð S°ð SÀð SÈ$ÈtÐTWÐY\ÐT\É~ÑJ^ó Sðn ‡�ÐÓá�s˜q RÔ(Ù�c˜d tÔ,Ù˜C“jñ
Øð
à
ð
ð ò
ó ñ
r8   