ó
    Dj·+  ã                   óÒ   • S r SSKrSSKrSSKJr  SSKrSrSrS rS r	S r
S	 rS
 rS rS rSS jrSS jrSS jr\S:X  a%  SSKJr  \" \R(                  " 5       \" SS9-   5        gg)uº   
Kalshi live price checker â€” all supported European + MLS leagues.
At halftime, call check_halftime() to get the current away-win price
and whether there's edge to buy more contracts.
é    N)Údatez-https://api.elections.kalshi.com/trade-api/v2gÉv¾Ÿ/½?c                 ó.   • [         R                  " U 5      $ )zMGet Kalshi abbreviation for a team. Reads from team_map.json via maps module.)ÚmapsÚ
kalshi_abr)Ú	team_names    Ú,/media/sf_e_drive/soccer/main/kalshi_live.pyÚget_abrr	      s   € ä�?Š?˜9Ó%Ð%ó    c                  ó¸   • [        [        [        S[        R                  " 5        V s/ s H  n [        R
                  " U 5      PM     sn 5      5      5      $ s  sn f )zCReturn list of all unique Kalshi series tickers across all leagues.N)ÚlistÚsetÚfilterr   Úall_divsÚleague_kalshi_series©Úds    r   Ú_all_kalshi_seriesr      s<   € ä””F˜4ÌÏÊÌÓ!XÊÀ1¤$×";Ò";¸AÖ">ÉÑ!XÓYÓZÓ[Ð[ùÒ!Xs   ¨ Ac                  ó¼   • [         R                  " 5        V s0 s H7  n [         R                  " U 5      (       d  M   [         R                  " U 5      U _M9     sn $ s  sn f )z2Return reverse mapping: series ticker -> div code.)r   r   r   r   s    r   Ú_series_to_divr      sA   € ä59·]²]´_Óe²_°Ì×HaÒHaÐbc×HdÓ+ŒD×%Ò% aÓ(¨!Ò+±_ÑeÐeùÒes
   ˜A»Ac                 ó¢   • UR                  S5      R                  5       nUR                  S5      nUR                  S5      nU  SU U U U U 3$ )Nz%bz%dz%yÚ-)ÚstrftimeÚupper)ÚseriesÚ	game_dateÚhome_abrÚaway_abrÚmonthÚdayÚyears          r   Úbuild_event_tickerr!      s\   € Ø×Ñ˜tÓ$×*Ñ*Ó,€EØ×Ñ˜tÓ$€CØ×Ñ˜tÓ$€DØˆX�Q�t�f˜U˜G C 5¨¨
°8°*Ð=Ð=r
   c                 ó>  • U (       a  U(       a  U(       d  g[         R                  " S[         R                  " U 5       S35      nX4X!41nS H¼  n [        R                  " [
         S3U SUS.SS	9nUR                  5       R	                  S
/ 5       Hs  nUR	                  SS5      nUR                  U5      n	U	(       d  M/  U	R                  S5      n
[        S[        U
5      5       H  nU
SU X«S pÜXÍ4U;   d  M  Us  s  s  $    Mu     M¾     g! [         a     MÎ  f = f)a*  
Search the entire series for an active event whose ticker ends with the two
team abbreviations in either order, regardless of date.

Useful when the game has been rescheduled in API-Football but Kalshi still
has the event under its original date ticker.

Returns the event_ticker string, or None.
NÚ^z-\d{2}[A-Z]{3}\d{2}([A-Z0-9]+)$)ÚopenÚunopenedÚclosedz/eventséÈ   ©Úseries_tickerÚlimitÚstatusé
   ©ÚparamsÚtimeoutÚeventsÚevent_tickerÚ é   )ÚreÚcompileÚescapeÚrequestsÚgetÚBASEÚjsonÚmatchÚgroupÚrangeÚlenÚ	Exception)r   r   r   ÚpatÚtargetsr+   ÚrÚevÚetÚmÚrestÚsplitÚaÚbs                 r   Úfind_event_by_abrsrJ   $   s  € ö –x¦HØä
�*Š*˜œ"Ÿ)š) FÓ+Ð,Ð,QÐRÓ
S€CØÐ# hÐ%9Ð:€Gã0ˆð	Ü—’¤˜v WÐ-Ø6<ÀsÐV\Ñ$]Ø%'ñ)ˆAð —f‘f“h—l‘l 8¨RÖ0�Ø—V‘V˜N¨BÓ/�Ø—I‘I˜b“M�ÞÙØ—w‘w˜q“z�ô # 1¤c¨$£iÖ0�EØ  ˜<¨¨f¨�qØ�v Õ(Ø!ž	ó 1ó 1ñ 1ð& øô ó 	Úð	ús   ÁB&DÃ;DÄDÄ
DÄDc                 ó–  • [        U5      n[        U5      nSnU(       a†  U(       a  [        XXE5      n[        R                  " [         SU SU 3SS9nUR
                  S:X  a  UnO?[        XXT5      n	[        R                  " [         SU	 SU 3SS9nUR
                  S:X  a  U	nU(       d  [        XU5      nU(       dð  [        R                  " [         S3U SSS	.SS
9nUR                  5       R                  S/ 5       H«  n
U
R                  SS5      nUR                  5       UR                  5       ;   d  M9  UR                  5       UR                  5       ;   d  M]  U
S   n[        R                  " S[        R                  " U 5       S3U5      nU(       d  Mš  UR                  S5      n  O   U(       d  g0 nUS4US4S4 Hù  u  nnU SU 3n[        R                  " [         SU 3SS9nUR
                  S:X  d  M=  UR                  5       R                  SUR                  5       5      n
[        U
R                  SS5      =(       d    S5      n[        U
R                  SS5      =(       d    S5      nUS:”  a  UU-   S-  OUn[        US5      UU S3'   [        US5      UU S3'   [        US5      UU S3'   Mû     U(       a  U$ S$ )zDFetch home, draw, and away prices from Kalshi. Returns dict or None.Nú	/markets/r   r,   ©r/   r'   ú/marketsr$   r(   r-   ÚmarketsÚtitler2   ÚtickerÚ(z-\d+[A-Z]+\d+[A-Z]+)-[A-Z]+$r3   ÚawayÚhome)ÚTIEÚdrawÚmarketÚyes_ask_dollarsr   Úyes_bid_dollarsé   é   Ú_askÚ_bidÚ_mid)r	   r!   r7   r8   r9   Ústatus_coderJ   r:   Úlowerr4   r;   r6   r<   ÚfloatÚround)r   r   Ú	home_teamÚ	away_teamr   r   ÚeventÚe1rB   Úe2rE   rP   Útr;   ÚresultÚoutcomeÚlabelrQ   ÚaskÚbidÚmids                        r   Úget_all_pricesro   I   sˆ  € ä�yÓ!€HÜ�yÓ!€Hð €EÞ–HÜ °8ÓFˆÜ�LŠLœD˜6 ¨2¨$¨a°¨zÐ:ÀBÑGˆØ�=‰=˜CÓØ‰Eä# F°xÓJˆBÜ—’¤˜v Y¨r¨d°!°H°:Ð>ÈÑKˆAØ�}‰} Ó#Ø�æô # 6°XÓ>ˆæä�LŠLœD˜6 Ð*ÀVÐVYÐekÑ3lÐvxÑyˆØ—‘“—‘˜i¨Ö,ˆAØ—E‘E˜' 2Ó&ˆEØ�‰Ó  E§K¡K£MÕ1°i·o±oÓ6GÈ5Ï;É;Ë=Õ6XØ�h‘K�ÜŸš A¤b§i¢i°Ó&7Ð%8Ð8TÐ!UÐWXÓY�ß�5Ø!ŸK™K¨›N�EÙñ -ö Øà€FØ$ fÐ-°¸&Ð/AÀ?ÓS‰ˆ�Ø�7˜!˜G˜9Ð%ˆÜ�LŠLœD˜6 ¨6¨(Ð3¸RÑ@ˆØ�=‰=˜CÕØ—‘“—‘˜X q§v¡v£xÓ0ˆAÜ˜Ÿ™Ð/°Ó3×8°qÓ9ˆCÜ˜Ÿ™Ð/°Ó3×8°qÓ9ˆCØ%(¨1£W�3˜‘9 ’/°#ˆCÜ%*¨3°£]ˆF�e�W˜D�>Ñ"Ü%*¨3°£]ˆF�e�W˜D�>Ñ"Ü%*¨3°£]ˆF�e�W˜D�>Ó"ñ Tö ˆ6Ð% Ð%r
   c           
      ó8  • [        U5      n[        U5      nU(       a  U(       Gd  [        R                  " [         S3U SSS.SS9nUR	                  5       R                  S/ 5       H§  nUR                  SS	5      nUR                  5       UR                  5       ;   d  M9  UR                  5       UR                  5       ;   d  M]  US
   n	[        R                  " U  S3U	5      n
U
(       d  M…  U
R                  S5      S:w  d  Mœ  [        U	5      s  $    [        SU SU SU SU 35        g [        XXE5      nU SU 3n[        R                  " [         SU 3SS9nUR                  S:X  a1  [        XXT5      nU SU 3n[        R                  " [         SU 3SS9nUR                  S:X  a8  [        XU5      nU(       a%  U SU 3n[        R                  " [         SU 3SS9nUR                  S:w  a  [        SU 35        g [        XÆR	                  5       5      $ )NrN   r'   r$   r(   r,   r-   rO   rP   r2   rQ   z-\d+[A-Z]+\d+([A-Z]+)-([A-Z]+)$rZ   rU   z  Could not find abbreviation: u   â†’z, r   rL   rM   i”  z  Market not found: )r	   r7   r8   r9   r:   r`   r4   r;   r<   Ú_fetch_priceÚprintr!   r_   rJ   )r   r   rc   rd   r   r   rB   rE   rP   rQ   Út_matchre   Úaway_tickerÚevent2Úfounds                  r   Úget_market_pricerw      sî  € Ü�yÓ!€HÜ�yÓ!€HæŸ8ä�LŠLœD˜6 Ð*ÀVÐVYÐekÑ3lÐvxÑyˆØ—‘“—‘˜i¨Ö,ˆAØ—E‘E˜' 2Ó&ˆEØ�‰Ó  E§K¡K£MÕ1°i·o±oÓ6GÈ5Ï;É;Ë=Õ6XØ˜8™�äŸ(š( v hÐ.MÐ#NÐPVÓW�ß�7˜wŸ}™}¨QÓ/°5Õ8Ü'¨Ó/Ò/ñ -ô 	Ð/°	¨{¸#¸h¸ZÀrÈ)ÈÐTWÐX`ÐWaÐbÔcØä˜v°(ÓE€EØ�G˜1˜X˜JÐ'€Kä�Šœ�v˜Y { mÐ4¸bÑA€AØ‡}�}˜Óä# F°xÓJˆØ˜  ( Ð,ˆÜ�LŠLœD˜6 ¨;¨-Ð8À"ÑEˆØ‡}�}˜Óä" 6°XÓ>ˆÞØ"˜G 1 X JÐ/ˆKÜ—’¤˜v Y¨{¨mÐ<ÀbÑIˆAØ‡}�}˜ÓÜÐ$ [ MÐ2Ô3Øä˜§V¡V£XÓ.Ð.r
   c           	      ó„  • Uc.  [         R                  " [         SU  3SS9nUR                  5       nUR                  SU5      n[	        UR                  SS5      =(       d    S5      n[	        UR                  SS5      =(       d    S5      nUS:”  a  XE-   S-  OUnXXVUR                  S	S
5      UR                  SS
5      S.$ )NrL   r,   rM   rW   rX   r   rY   rZ   rP   r2   r+   )rQ   Úyes_askÚyes_bidrn   rP   r+   )r7   r8   r9   r:   ra   )rQ   ÚdatarB   rE   ry   rz   rn   s          r   rq   rq   ¦   s´   € Ø�|Ü�LŠLœD˜6 ¨6¨(Ð3¸RÑ@ˆØ�v‰v‹xˆØ�‰�˜4Ó €AÜ�A—E‘EÐ+¨QÓ/×4°1Ó5€GÜ�A—E‘EÐ+¨QÓ/×4°1Ó5€GØ%,¨q£[ˆ7Ñ Ò
!°g€CØ¸WØ—U‘U˜7 2Ó&°!·%±%¸ÀÓ2DñFð Fr
   c                 óÜ  • XC-
  n[         R                  " UR                  5       5      =(       d    Sn[        SU SU SU SU SU S35        US:”  a  [        S5        S	S
S
S
S
S.$ US:X  a  [        S5        SS
S
S
S
S.$ [	        XpX5      nU(       d  g
US   S:”  a  US   OUS   n	U	S::  a  [        S5        g
[
        U	-
  n
U	[
        :  n[        SUS    35        [        SU	S-  S SUS   S-  S SUS   S-  S S35        [        S[        U5       S[
        S-  S S35        [        SU
S-  S SU(       a  S OS! 35        U(       ae  S"U	-  S"-
  n[        [
        U-  S"[
        -
  -
  U-  S#-  S5      n[        S$US-  S S%U	S-  S S&[
        S-  S S'35        [        S(X©-  S-  S) S*35        U(       a  S+OS,[        U	S-5      [        US   S-5      [        US   S-5      [        U
S-5      S.$ ).zEPrints HT analysis and returns dict with kalshi price data (or None).Ú	KXEPLGAMEz
[z] Ú r   z at HTr   u/     Away team winning â€” HOLD. No action needed.ÚHOLD_WINNINGN)ÚsignalÚkalshi_priceÚ
kalshi_bidÚ
kalshi_askÚedgeu     Level at HT â€” HOLD.Ú
HOLD_LEVELrn   ry   z1  No price available (market may not be live yet)z  Market:   rQ   z  Price:    éd   z.1fz%  (bid rz   z% / ask z%)z!  Historical comeback rate (down z): Ú%z  Edge:     z+.1fz%  ->  z
[BUY MORE]zNo edge - hold original onlyr3   g      à?z	  -> Add z% of bankroll at zc  (fair value zc)z  -> EV on additional bet: z.0fz% return on investmentÚBUYÚHOLDr[   )	r   r   r   rr   rw   ÚCOMEBACK_RATEÚabsÚmaxrb   )r   rc   rd   Úht_score_homeÚht_score_awayÚleague_codeÚdeficitr   ri   Úpricer„   Úhas_edgerI   Úks                 r   Úcheck_halftimer”   ±   sT  € àÑ+€GÜ×&Ò& {×'8Ñ'8Ó':Ó;×J¸{€Fä	ˆC�ˆ}˜B˜y˜k¨¨=¨/¸¸=¸/ÈÈ9È+ÐU[Ð
\Ô]à�ƒ{ÜÐ?ÔAØ(¸$ÈdÐbfÐptÑuÐuØ�!ƒ|ÜÐ'Ô)Ø&¸ÈDÐ`dÐnrÑsÐsä˜f°ÓF€FÞØà# E™]¨QÓ.ˆF�5ŠM°F¸9Ñ4E€EØ�ƒzÜÐAÔCØä˜5Ñ €DØ”}Ñ$€Hä	ˆL˜ Ñ)Ð*Ð
+Ô,Ü	ˆL˜˜s™ 3˜ x°°yÑ0AÀ#Ñ0EÀcÐ/JÈ(ÐSYÐZcÑSdÐehÑShÐilÐRmÐmoÐ
pÔqÜ	Ð-¬c°'«l¨^¸3¼}ÈSÑ?PÐQTÐ>UÐUVÐ
WÔXÜ	ˆL˜˜c™ $˜ w¾x©|ÐMkÐ.lÐ
mÔnæØˆe‰G�a‰KˆÜ” Ñ" a¬-Ñ&7Ñ8¸AÑ=ÀÑCÀQÓGˆÜ�	˜!˜C™% ˜Ð$5°e¸C±iÀ°_ÀOÔTaÐbeÑTeÐfiÐSjÐjlÐmÔnÜÐ+¨D©J°s©N¸3Ð+?Ð?UÐVÔWö "*™¨vÜ˜e Q›Ü˜f YÑ/°Ó3Ü˜f YÑ/°Ó3Ü˜d A›ñð r
   c           	      óÆ  • [         R                  " 5         U c  [        R                  " 5       n U R	                  S5      R                  5       n[        5       n[        5       n[        5       n/ nU GH  n[        R                  " [         S3USS.SS9nUR                  5       R                  S/ 5       H»  nUS	   n	X;  a  M  U	R                  S
S5      S   n
X¤;   a  M+  UR                  U
5        UR                  SS5      n[        R                   " SU5      nU(       d  Mn  UR#                  XlR%                  S5      R'                  5       UR%                  S5      R'                  5       45        M½     GM     [)        SU  S[+        U5       S35        Sn[-        US S9 H>  u  pnnXm:w  a"  UR                  Xf5      n[)        SU S35        Un[)        SU SU 35        M@     U$ )z4List all matches on a given date across all leagues.Nz%y%b%drN   r'   )r)   r*   r,   r-   rO   rQ   r   r3   r   rP   r2   z(.+?) vs (.+?) WinnerrZ   z
Matches on z (z games):c                 ó   • U S   $ )Nr   © )Úxs    r   Ú<lambda>Úlist_matches.<locals>.<lambda>ø   s   € ¸!¸Aº$r
   )Úkeyz
  [Ú]z    z vs )r   Úreloadr   Útodayr   r   r   r   r   r7   r8   r9   r:   ÚrsplitÚaddr4   r;   Úappendr<   Ústriprr   r>   Úsorted)Útarget_dateÚdate_strÚ
all_seriesÚ
series_divÚseen_eventsÚgamesr   rB   rE   rh   re   rP   r;   Ú
cur_seriesrT   rS   Úleagues                    r   Úlist_matchesr¬   ß   s¨  € ä‡K‚K„MØÑÜ—j’j“lˆØ×#Ñ# HÓ-×3Ñ3Ó5€HÜ#Ó%€JÜÓ!€JÜ“%€KØ€EÜˆÜ�LŠLœD˜6 Ð*ÀVÐVYÑ3ZÐdfÑgˆØ—‘“—‘˜i¨Ö,ˆAØ�(‘ˆAØÓ ¡(Ø—H‘H˜S !Ó$ QÑ'ˆEØÓ#¡XØ�O‰O˜EÔ"Ø—E‘E˜' 2Ó&ˆEÜ—H’HÐ5°uÓ=ˆEßˆuØ—‘˜f§k¡k°!£n×&:Ñ&:Ó&<¸e¿k¹kÈ!»n×>RÑ>RÓ>TÐUÖVô -ñ ô 
ˆM˜+˜ b¬¨U«¨°HÐ
=Ô>Ø€JÜ$ U±Ô?Ñˆ�dØÓØ—^‘^ FÓ3ˆFÜ�E˜&˜ Ð#Ô$ØˆJÜ��T�F˜$˜t˜fÐ%Ö&ñ @ð €Lr
   Ú__main__)Ú	timedeltar3   )Údays)N)ÚE0)Ú__doc__r7   r4   Údatetimer   r   r9   rŠ   r	   r   r   r!   rJ   ro   rw   rq   r”   r¬   Ú__name__r®   rž   r—   r
   r   Ú<module>r´      s…   ðñ÷
 Ý Û à6€ð
 €ò&ò\òfò>ò#òJ3&òl%/ôN	Fô+ô\ðF ˆzÓÝ"á�—’“¡	¨qÑ 1Ñ1Õ2ð r
   