
    $ik                        S r SSKJr  SSKrSSKrSSKrSSKJr  SSKJ	r	  SSK
JrJrJrJr  SSKJr   SSKJrJrJr  SS	KJr  SS
KJr  \" \5      r " S S5      rg! \ a	    Sr\	=rr N-f = f)zAHRNZ scraper for historical results via the Results Enquiry page.    )annotationsN)date)Any)parse_qs	urlencodeurljoinurlparse)BeautifulSoup)BrowserPageasync_playwright)
get_logger)build_decodo_proxyc                     \ rS rSrSrSrSrSrSrS!S"S jjr	S r
S	 rS
 rS rS#S jr  S$       S%S jjr  S$         S&S jjr S'   S(S jjr          S)S jrS*S jr      S+S jrS,S jrS-S jrS.S jrS.S jr S'     S/S jjrS0S jrS1S jr\S2S j5       r S'       S3S jjr\S4S j5       r\S5S j5       r \S6S j5       r!S r"g)7HRNZHistoricalResultsScraper   z,Scraper for HRNZ historical results enquiry.zhttps://harness.hrnz.co.nzz/gws/ws/r/infohorsews/wsd06xzqhttps://harness.hrnz.co.nz/gws/ws/r/infohorsews/wsd08x?Arg=hrnzg-Ptype&Arg=ResultsSearch&Arg=hrnzg-rSite&Arg=TRUEg       @c                    [         R                  " SS5      R                  5       nU(       a   [        U5      nXl        SU l        SU l	        SU l
        g! [         a    [
        R                  SU5         N>f = f)zqInitialize HRNZ historical scraper.

Args:
    timeout: Request timeout in milliseconds (default: 30000ms = 30s)
HRNZ_PLAYWRIGHT_TIMEOUT_MS z5Invalid HRNZ_PLAYWRIGHT_TIMEOUT_MS=%s; using default.Ng        )osgetenvstripfloat
ValueErrorloggerwarningtimeout_playwright_browser_last_request_time)selfr   env_timeouts      M/root/tipsharks/tipsharks-elo-api/packages/hrnz_scraper/historical_scraper.py__init__%HRNZHistoricalResultsScraper.__init__&   sp     ii <bAGGI,
 (,"%  K[s   A  A87A8c                B   #    U R                  5       I S h  vN   U $  N7fN)_ensure_browserr!   s    r#   
__aenter__'HRNZHistoricalResultsScraper.__aenter__9   s!     ""$$$ 	%s   c                @   #    U R                  5       I S h  vN   g  N7fr'   )close)r!   exc_typeexc_valexc_tbs       r#   	__aexit__&HRNZHistoricalResultsScraper.__aexit__=   s     jjls   c                (  #    [         c  [        S5      eU R                  ck  [        5       R                  5       I S h  vN U l        U R                  R
                  R                  SS9I S h  vN U l        [        R                  S5        g g  NP N"7f)NzOplaywright is required for HRNZ scraping; install it or use the API ingest pathT)headlesszPlaywright browser initialized)	r   ImportErrorr   startr   chromiumlaunchr   infor)   s    r#   r(   ,HRNZHistoricalResultsScraper._ensure_browser@   sz     #a  == %5%7%=%=%??D"&"2"2";";"B"BD"B"QQDMKK89 !?Qs!   ;BB/B-B.!BBc                  #    U R                   b)  U R                   R                  5       I S h  vN   S U l         U R                  b?  U R                  R                  5       I S h  vN   S U l        [        R                  S5        g g  NX N$7f)NzPlaywright browser closed)r   r-   r   stopr   r9   r)   s    r#   r-   "HRNZHistoricalResultsScraper.closeJ   st     ==$--%%''' DM'""'')))#DKK34 ( ( *s!   +B
B5B
#B$#B
B
c                  #    U R                  5       I S h  vN   SS KnUR                  5       U R                  -
  nX0R                  :  a+  [        R
                  " U R                  U-
  5      I S h  vN   [        R                  SU 35         [        5       nU(       a!  U R                  R                  US9I S h  vN O!U R                  R                  5       I S h  vN nUR                  5       I S h  vN n UR                  XR                  SS9I S h  vN   UR                  S5      I S h  vN   UR                  5       I S h  vN nUR                  5       U l        UUR!                  5       I S h  vN   UR!                  5       I S h  vN   $  GN GN( N N N N Nq N[ N/ N! UR!                  5       I S h  vN    UR!                  5       I S h  vN    f = f! ["         a  n[%        SU SU 35      UeS nAff = f7f)	Nr   z
Fetching: )proxydomcontentloaded)r   
wait_untili  zFailed to fetch z: )r(   timer    RATE_LIMIT_DELAYasynciosleepr   debugr   r   new_contextnew_pagegotor   wait_for_timeoutcontentr-   	ExceptionRuntimeError)	r!   urlrB   elapsedr?   contextpagerK   es	            r#   _rate_limited_fetch0HRNZHistoricalResultsScraper._rate_limited_fetchS   s    ""$$$))+ 7 77***-- 5 5 ?@@@z#'(	E&(E  mm//e/<<<==4466 
  '//11D
&ii:L      ++D111 $.*.))+'jjl""mmo%%9 	% A =61 2. #% jjl""mmo%% 	E!1#b<=1D	Es  HFAH1F2H-G# <F=!G# FG# 6F 7G# <F, F"F, 2F$3F, 
F&F, %G# 8F(9G# F*G# HHG# G#  G# "F, $F, &F, (G# *G# ,G  GG GG  G# #
H-G??HHc               T  #    [        5       n[        UR                  UR                  S5      nXb::  a  U R	                  UR                  UR                  UUS9I Sh  vN nU Hg  nUR                  S5      n	U	(       a  Xs=::  a  U::  d  O  M+  UR                  S5      n
U
(       a  X;   a  MJ  U
(       a  UR                  U
5        U7v   Mi     UR                  S:X  a  [        UR                  S-   SS5      nO$[        UR                  UR                  S-   S5      nXb::  a  M  gg N7f)z+Yield meeting metadata within a date range.   )race_day_typeclub_noNmeeting_date
raceday_id   )setr   yearmonthlist_meetings_for_monthgetadd)r!   
start_dateend_daterW   rX   seen_racedayscurrentmeetingsmeetingrY   rZ   s              r#   iter_meetings*HRNZHistoricalResultsScraper.iter_meetingst   s      #&%z
(8(8!<!!99+	 :  H $&{{>:)Ox)O$[[6
*"=!%%j1 $ }}"w||a/A6w||W]]Q->B+ !s   AD(D&CD($D(c                   #    U R                  XX45      nU R                  U5      I Sh  vN nU R                  Xa5      $  N7f)z-Fetch and parse the raceday list for a month.N)_build_raceday_search_urlrS   _parse_raceday_list)r!   r]   r^   rW   rX   rN   htmls          r#   r_   4HRNZHistoricalResultsScraper.list_meetings_for_month   sB      ,,T-Q--c22''33 3s   'A?ANc                L  #    U R                  U5      I Sh  vN n[        US5      nU R                  U5      nU(       a  UR                  SUR	                  S5      5        UR                  SUR	                  S5      5        UR                  SUR	                  S5      5        UR                  SUR	                  S5      5        SU;  a,  UR	                  S	5      (       a  US	   R                  5       US'   XS
'   U R                  U5      nU(       d  U R                  U5      nU(       d  [        R                  SU5        / nU Hn  nU R                  US   5      I Sh  vN n	[        U	S5      n
U R                  X5      nU(       d  ME  UR	                  S5      (       d  M]  UR                  U5        Mp     U(       a  U(       d  [        R                  SU5        XeS'   [        R                  SUR	                  S5      UR	                  S5      [        U5      5        U$  GN N7f)z+Scrape results from a meeting results page.Nhtml.parserrZ   meeting_timevenuemeeting_namenamer   rY   
source_urlz(No race links found for meeting page: %sresults_urlstartersz<Race links found but no starters parsed for meeting page: %sracesz$Scraped meeting: %s on %s (%s races))rS   r
   _parse_meeting_header
setdefaultr`   	isoformat_parse_races_parse_race_linksr   r   _parse_race_pageappendr9   len)r!   rv   meeting_metarm   souprg   rx   
race_links	race_link	race_html	race_soupraces               r#   get_meeting_results0HRNZHistoricalResultsScraper.get_meeting_results   s     --k::T=1,,T2|\-=-=l-KL~|/?/?/OPw(8(8(HIv|'7'7'GHW$)9)9.)I)I".~">"H"H"J +!!$'//5JI;WE'	"&":":9];S"TT	))]C	,,YB4DHHZ00LL& ( %R !2KK KKJ		
 O ;( Us/   H$HEH$H"&H$	H$!A?H$"H$c                    SSSSSSSS[        U5      4S	S[        U5      4S
SSSU4SSU4/nU R                   U R                   S[        U5       3$ )N)Argzhrnzg-Ptype)r   RaceResults)r   zhrnzg-rSite)r   TRUE)r   zhrnzg-ResultsType)r   RacedaySearch)r   zhrnzg-ResultsYearr   )r   zhrnzg-ResultsMonth)r   zhrnzg-ResultsDay)r   1)r   zhrnzg-ResultsRacedayType)r   zhrnzg-ResultsClubNo?)strBASE_URLRESULTS_PATHr   )r!   r]   r^   rW   rX   paramss         r#   rk   6HRNZHistoricalResultsScraper._build_raceday_search_url   s     #""($(CI)CJ'/M"*G!
$ --!2!2 31Yv5F4GHH    c           
        [        US5      nUR                  S5      nU(       d  [        R                  S5        / $ / nUR	                  S5       H  nUR                  S5      (       a  M  UR	                  SSS9 Hy  nUR                  S	5      nU(       a  S
U;  a  M#  UR                  SS9n	U	(       d  M;  [        U R                  U5      n
U R                  U
5      nUR                  UU	S S U
S.5        M{     M     U$ )Nrp   tablezNo raceday list table foundtrthaThrefr   RacesDisplayr   )rZ   rs   rY   rq   rv   )r
   findr   r   find_allr`   get_textr   r   _extract_raceday_idr   )r!   rm   r]   r   r   rf   rowlinkr   rs   rv   rZ   s               r#   rl   0HRNZHistoricalResultsScraper._parse_raceday_list   s    T=1		'"NN89I>>$'Cxx~~St4xx'~T9#}}4}8#%dmmT:!55kB
&0(4(,(,'2 5	 (. r   c                   UR                  SS5      R                  5       n[        R                  " SU5      n[        R                  " SU5      nU(       d  g[	        UR                  S5      5      nUR                  S5      R                  5       nSSSS	S
SSSSSSSS.nUR                  U5      nU(       d  g [        X(U5      n	U(       a  UR                  S5      OS n
X4$ ! [         a     gf = f)N     z(\d{1,2})\s+([A-Za-z]{3})z(\d{1,2}:\d{2}))NNrV                        	   
      r[   )janfebmaraprmayjunjulaugsepoctnovdec)
replacer   researchintgrouplowerr`   r   r   )r!   header_textr]   
date_match
time_matchday	month_str	month_mapr^   rY   rq   s              r#   _parse_raceday_header2HRNZHistoricalResultsScraper._parse_raceday_header  s     "))&#6<<>YY;[I
YY1;?
*""1%&$$Q'--/	
	 i(	S1L /9z''*d))	  		s   9C" "
C/.C/c                    0 nUR                  S5      nU(       aC  UR                  SS9nUR                  SS5      R                  SS5      R                  5       nXBS'   UR                  SS	S
9nU(       a/  UR                  SS9nXbS'   U R	                  U5      nU(       a  XrS'   UR                  SSS
9nU(       aS  UR                  S5      n	U	(       a;  U	R                  SS9n
SU
;   a"  U
R                  S5      S   R                  5       n
XS'   U$ )Nh1Tr   z Incr   z Inc.rr   divzhrnz-content__dateclass_date_rawr   zhrnz-field__meetingh5z at r   rt   )r   r   r   r   _parse_datesplit)r!   r   rg   r   rr   date_div	date_textparsed_datemeeting_divr   rs   s              r#   ry   2HRNZHistoricalResultsScraper._parse_meeting_header,  s   "$YYt_KKdK+EMM&"-55grBHHJE$G99U+?9@ )))5I"+J**95K"-ii.CiD!!$'B!{{{6\)#/#5#5f#=a#@#F#F#HL".r   c                8   SS K nSSK J n  UR                  5       R                  SS5      n/ SQnU H  n UR                  UR                  5       U5      nSU;  a9  SU;  a3  UR                   R	                  5       R
                  nUR                  US9nUR
                  S	:  a.  UR                  UR
                  UR
                  S
::  a  SOS-   S9nUR                  5       R                  5       s  $    [        R                  SU5        g ! [         a     M  f = f)Nr   )datetimer   r   )z%A, %d %B %Yz	%A, %d %Bz%d %B %Yz%d %Bz%d/%m/%Yz%d-%m-%Yz%d/%m/%yz%d-%m-%yz%Yz%y)r]   d   2   i  il  zCould not parse date: %s)r   r   r   strptimenowr]   r   r{   r   r   r   )r!   date_strdtr   formatsfmtparsedcurrent_years           r#   r   (HRNZHistoricalResultsScraper._parse_dateH  s    %>>#++FC8	
 C!**8>>+;SAs?t3#%;;??#4#9#9L#^^^>F;;$#^^#[[FKK24ED4P , F {{}..00  	18<	  s   B:D
DDc                    / nUR                  SSS9nU HF  nU R                  U5      nU(       d  M  UR                  S5      (       d  M5  UR                  U5        MH     U$ )Nr   z	hrnz-racer   rw   )r   _parse_race_sectionr`   r   )r!   r   rx   race_sectionssectionr   s         r#   r|   )HRNZHistoricalResultsScraper._parse_racesj  sY    eK@$G++G4Dt,,T" %
 r   c           	        / n[        5       nUR                  S5      nU GHj  nUR                  S5       Vs/ s H  ofR                  SSS9PM     nnSSR                  U5      ;  a  MI  UR                  S5       GH  nUR                  S5      n	[	        U	5      S	:  a  M&  U	S
   R                  SSS9n
U	S   R                  SSS9nUR                  SSS9nU(       d  Me  UR                  SS5      nSU;  a  M  [        U R                  U5      nX;   a  M  S n[        R                  " SU
[        R                  5      nU(       a  [        UR                  S5      5      nUR                  UUUS.5        UR                  U5        GM     GMm     U(       a  U$ UR                  SSS9 H  nUR                  SS5      nSU;  a  M  [        U R                  U5      nX;   a  M:  UR                  SSS9nS n[        R                  " SU[        R                  5      nU(       a2  [        UR                  S5      =(       d    UR                  S	5      5      nUR                  UU=(       d    S US.5        UR                  U5        M     U$ s  snf )Nr   r   r   Tr   Racer   tdr   r   rV   r   r   r   r   RaceDisplayzR(\d+))race_numberrt   rv   zRace\s*(\d+)|R(\d+))r\   r   r   joinr   r   r`   r   r   r   r   
IGNORECASEr   r   r   ra   )r!   r   r   	seen_urlstablesr   r   headersr   cellsrace_number_text	name_textr   r   rv   r   matchtexts                     r#   r}   .HRNZHistoricalResultsScraper._parse_race_linksu  sQ   
!e	w'E>CnnT>RS>R{{3d{3>RGSSXXg..~~d+T*u:>#(8#4#4S#4#E !!H--c->	xx$x/xx+ ,%dmmT:+"		)-=r}}M"%ekk!n"5K!!'2 )'2 k*5 ,	 @ MM#DM1D88FB'DD(!$--6K'==D=1DKII4dBMMJE!%++a."BEKKNC#. LD#. MM+&' 2( m Ts   Jc           	        S/ 0nU(       a8  UR                  S5      b  US   US'   UR                  S5      (       a  US   US'   S nUR                  S5       H@  n[        R                  " SUR	                  SSS9[        R
                  5      (       d  M>  Un  O   U(       a  UR	                  SSS9n[        R                  " S	U[        R
                  5      nU(       aj  [        UR                  S
5      5      US'   UR                  S5      nSU;   a#  UR                  SS
5      S   R                  5       nUR                  5       US'   [        R                  " SU[        R
                  5      n	U	(       a  [        U	R                  S
5      5      US'   UR	                  SSS9n
U R                  U
S5      nU R                  U
S5      nU(       a  XS'   U(       a  XS'   UR                  SS5      R                  5       nSU;   a  SUS'   OSU;   d  SU;   a  SUS'   SU;   a  SUS'   OSU;   a  SUS'   UR                  S S!S"9nU(       a  U R                  U5      US'   U$ )#Nrw   r   rt   r   zRace\s+\d+\s*-r   Tr   zRace\s+(\d+)\s*-\s*(.*)rV   r   ,r   z
(\d{3,4})m
distance_mWeatherTrackweathertrack_conditionr   MOBILEMobile
start_typeSTANDINGSTANDStandingPACEPacegaitTROTTrotr   hrnz-table--participantsr   )r`   r   r   r   r   r   r   r   r   r   _extract_label_valueupperr   _parse_race_table)r!   r   	race_metar   	title_tagr   
title_textr   	name_partdistance_match	page_textr  r  
name_upperr   s                  r#   r~   -HRNZHistoricalResultsScraper._parse_race_page  s:    !+B/}}]+7&/&>]#}}V$$(0V	--%Byy!2;;s$;#?  	 & "++Ct+<JII8*bmmTE&)%++a.&9]#!KKN	)# )Q 7 : @ @ BI(0VYY}j"--PN%()=)=a)@%A\"MM#TM2	++IyA33IwG%O&5"#XXfb)//1
z!!)D:%J)>!+DZ!DLz!!DL		'*D	E#55e<Dr   c                p   UR                  SSS9nU(       d  g S/ 0nS nUR                  S5      nU(       aE  [        R                  " SUR                  SS95      nU(       a  [	        UR                  S	5      5      nU(       dJ  UR                  S
S5      n[        R                  " SU5      nU(       a  [	        UR                  S	5      5      nU(       a  XCS'   SnUR                  S5      n	U	(       a  U	R                  SS9nXS'   UR                  S5      n
SnU
(       a  U
R                  SSS9nXS'   UR                  SSS9nU R                  US5      nU R                  US5      nU(       a  XS'   U(       a  XS'   [        R                  " SU[        R                  5      nU(       a  [	        UR                  S	5      5      US'   UR                  5       nSU;   a  SUS'   OSU;   d  SU;   a  SUS'   SU;   a  S US!'   OS"U;   a  S#US!'   UR                  S$S%S9nU(       a  U R                  U5      US'   U$ )&Nr   zhrnz-race__headerr   rw   dd(\\d+)Tr   rV   idr   zrace-(\\d+)r   h3rt   h4r   detailsr  r  r  r  z(\\d{3,4})mr   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   headerr   r   	number_ddr   race_idrt   name_tagdetails_tagdetails_text	meta_textr  r  r  r  r   s                     r#   r   0HRNZHistoricalResultsScraper._parse_race_section  s   e,?@ *B/KK%	IIi););$);)GHE!%++a.1kk$+GIIng6E!%++a.1"-;;t$$$4$0DLkk$'&//4/@L*OOOCtO4	++IyA33IwG%O&5"#><O!$^%9%9!%<!=DZZ\
z!!)D:%J)>!+DZ!DLz!!DLW-GH#55e<Dr   c                  ^ / nUR                  S5      nU R                  U5      m1 Skn[        U4S jU 5       5      nSnU Hz  nUR                  S5      (       a  M  UR                  SS/5      n[	        U5      S:  a  M?  US-  nU(       a  S OUn	U R                  UTU	S	9n
U
(       d  Mi  UR                  U
5        M|     U$ )
Nr   >   finposplacefinishplacingpositionc              3  ,   >#    U  H	  oT;   v   M     g 7fr'    ).0key
header_maps     r#   	<genexpr>AHRNZHistoricalResultsScraper._parse_race_table.<locals>.<genexpr>/  s      Nos
!2os   r   r   r   r   rV   )fallback_placing)r   _build_header_mapanyr   r   _parse_starter_rowr   )r!   r   rw   rowsplacing_headershas_placing_column	row_indexr   r   r9  starterr6  s              @r#   r  .HRNZHistoricalResultsScraper._parse_race_table*  s    ~~d#++D1
R  No NN	Cxx~~LL$.E5zA~NI'9ty--z4D . G w(  r   c                    U  Hv  nUR                  S5      nU(       d  M  0 n[        U5       H=  u  pEUR                  SS9nU(       d  M  XCUR                  5       R	                  5       '   M?     U(       d  Mt  Us  $    0 $ )Nr   Tr   )r   	enumerater   r   r   )r=  r   r   r6  idxr#  r   s          r#   r:  .HRNZHistoricalResultsScraper._build_header_mapB  sv    Cll4(GJ(1T247:tzz|1134  2 z!!  	r   c                	  ^^  0 nS0UU4S jjnU" S5      =(       dP    U" S5      =(       dA    U" S5      =(       d2    U" S5      =(       d#    U" S5      =(       d    U" S5      =(       d    TS   nUR                  S	S
9nU(       aj  UR                  5       nUS;   a  g [        R                  " SU5      n	U	(       a  [	        U	R                  S5      5      US'   O8US;   a  S	US'   S US'   O'S US'   O!U(       a  UR                  S5      (       d  X4S'   U" S5      =(       d    U" S5      n
U
(       a9  U
R                  S	S
9nU(       a#  UR                  5       (       a  [	        U5      US'   U" S5      =(       d    TS   nUR                  S5      nU(       aA  UR                  S	S
9US'   UR                  SS5      nU R                  U5      nU(       a  XS'   OUR                  S	S
9nU(       a  UUS'   U" S5      =(       d    U" S5      nU(       as  UR                  S	S
9nU(       a]  [        R                  " SU5      nU(       a  [	        UR                  S5      5      US'   O![        R                  " SU5      (       a  UUS'   U" S 5      =(       d    U" S!5      nU(       a{  UR                  S	S
9nU(       ae  UR                  5       R                  S"5      (       a  SUS#'   O;[        R                  " SU5      nU(       a  [	        UR                  S5      5      US#'   U" S$5      =(       d    U" S%5      nU(       a  UR                  S	S
9nU(       a  UUS&'   U" S'5      nU(       a  UR                  S	S
9nU(       a  UUS('   U" S)5      nU(       a~  UR                  S5      nU(       aK  UR                  S	S
9nU(       a  UUS*'   UR                  SS5      nU R                  U5      nU(       a  UUS+'   OUR                  S	S
9nU(       a  UUS*'   U" S,5      n U (       a~  U R                  S5      n!U!(       aK  U!R                  S	S
9n"U"(       a  U"US-'   U!R                  SS5      n#U R                  U#5      n$U$(       a  U$US.'   OU R                  S	S
9n"U"(       a  U"US-'   UR                  S5      (       a  U$  g ! [         a   n%[        R                  S/U%5         S n%A%g S n%A%ff = f)1Nc                  > U R                  5       nT HC  nUR                  S5      nU(       d  M  UR                  5       R                  5       U:X  d  MA  Us  $    TR                  U5      nUb  U[        T5      :  a  TU   $ g )Nz
data-label)r   r`   r   r   )labeltargetcell
data_labelrE  r   r6  s        r#   _cell_by_labelGHRNZHistoricalResultsScraper._parse_starter_row.<locals>._cell_by_labelZ  sv    !D!%,!7J!zj&6&6&8&>&>&@F&J# " !nnV,?sSZ'7 :%r   PlacingPlacePosPositionFinishFinr   Tr   )SCRSCRATCHSr  rV   r0  )DNSDNFDSQLRNPdid_not_finishBookBkrunner_numberHorser   r   
horse_namer   r   horse_idBarrierDrawbarrierz[A-Za-z]barrier_positionHcapHCPfr
handicap_mTimezTime/ Margin	race_timeMarginmarginDriverdriver_name	driver_idTrainertrainer_name
trainer_idzError parsing starter row: %s)rI  r   returnz
Any | None)r   r  r   r   r   r   r`   isdigitr   _extract_uuidr   r   
startswithrL   r   rF   )&r!   r   r6  r9  rA  rM  placing_cellpos_text	pos_upper	pos_match	book_cell	book_text
horse_cell
horse_link
horse_href
horse_uuidrb  barrier_cellbarrier_textbarrier_match	hcap_cell	hcap_text
hcap_match	time_cell	time_textmargin_cellmargin_textdriver_celldriver_linkrq  driver_hrefdriver_uuidtrainer_celltrainer_linkrt  trainer_hreftrainer_uuidrR   s&    ``                                   r#   r<  /HRNZHistoricalResultsScraper._parse_starter_rowQ  s   	=&(G	 	 y) !'*!%( "*- "(+	
 "%( 8  $,,4,8H$NN,	 77HHY9	),Y__Q-?)@GI&"CC04G,-)-GI&)-GI&!'++6F*G*G%5	"&v.F.2FI%..T.:	!2!2!4!4/29~GO,'0<E!HJ#-J(2(;(;$(;(G%'^^FB7
!//
;
*4J''00t0<
,6GL)))4Nv8NL+4444@$&HHY$EM$-01D1DQ1G-H	*;==6B 23&v.G.2GI%..T.:	 (33D9901-%'XXi%C
%47
8H8H8K4LGL1&v.P.2PI%..T.:	+4GK((2K)222>(3GH%(2K)..s3"-"6"6T"6"BK"1<."-//&""=K"&"4"4["AK"/:,"-"6"6T"6"BK"1<.))4L+005#/#8#8t#8#DL#2>/#/#3#3FB#?L#'#5#5l#CL#0<-#/#8#8t#8#DL#2>/{{<(( )   	=LL8!<<	=s   BR/ PR/ /
S9SSc                    [         R                  " SU [         R                  5      nU(       a  UR                  S5      $ g )Nz([0-9A-F-]{36})rV   )r   r   r   r   )r   
uuid_matchs     r#   rx  *HRNZHistoricalResultsScraper._extract_uuid  s0    YY14G
##A&&r   c                    [        U 5      n[        UR                  5      R                  S/ 5      n[	        U5       H(  u  p4US:X  d  M  US-   [        U5      :  d  M!  X#S-      s  $    g )Nr   zhrnzg-RacedayIDrV   )r	   r   queryr`   rD  r   )rN   r   argsrE  values        r#   r   0HRNZHistoricalResultsScraper._extract_raceday_id  s_    #%))%4#D/JC))cAgD	.A!G}$ * r   c                    [         R                  " U5       S3n[         R                  " X [         R                  5      nU(       d  g UR	                  S5      n[         R
                  " SUSS9S   nUR                  5       R                  S5      $ )Nz:\\s*([^\\n\\r]+)rV   z(Weather:|Track:))maxsplitr   ;)r   escaper   r   r   r   r   )r   rI  patternr   r  s        r#   r  1HRNZHistoricalResultsScraper._extract_label_value  so    ii&''89		'7A-uqA!D{{}""3''r   )r   r    r   r   )i0u  )r   r   )rN   r   rv  r   )OfficialRacesr   )rb   r   rc   r   rW   r   rX   r   )
r]   r   r^   r   rW   r   rX   r   rv  list[dict[str, Any]]r'   )rv   r   r   dict[str, Any] | None)
r]   r   r^   r   rW   r   rX   r   rv  r   )rm   r   r]   r   rv  r  )r   r   r]   r   rv  ztuple[date | None, str | None])r   r
   rv  zdict[str, Any])r   r   rv  
str | None)r   r
   rv  r  )r   r
   r  r  rv  r  )r   r
   rv  r  )r   r
   rv  r  )r=  listrv  dict[str, int])r   r  r6  r  r9  z
int | Nonerv  r  )r   r   rv  r  )rN   r   rv  r  )r   r   rI  r   rv  r  )#__name__
__module____qualname____firstlineno____doc__r   r   
SEARCH_URLrC   r$   r*   r1   r(   r-   rS   rh   r_   r   rk   rl   r   ry   r   r|   r}   r~   r   r  staticmethodr:  r<  rx  r   r  __static_attributes__r3  r   r#   r   r      s   6+H1L	F 
 &&:5EJ - C C  C 	 C
  CL -
4
4 
4 	
4
 
4 

4 GK++.C+ZII #I47IBEI	I. D"*"*&)"*	'"*H8 D	;| GK6!6.C6	6p>@0  $ (,	GG #G %	G
 
GR     ( (r   r   )r  
__future__r   rD   r   r   r   r   typingr   urllib.parser   r   r   r	   bs4r
   playwright.async_apir   r   r   r5   packages.core.common.loggingr   packages.hrnz_scraper.proxyr   r  r   r   r3  r   r#   <module>r     sm    G "  	 	   ? ? DD
 4 :	H	X( X(  Gds   
A A,+A,