Ë
    ˆ¾ajz6  ã                   óØ  — d dl mZ d dlmZ d dlmZ d dlmZ  G d„ de«      Z	 ed¬«       G d	„ d
«      «       Z
d,de
dz  de
fd„ZdZdZdedefd„Zdedefd„Zdedefd„Zdedefd„Zdedefd„Zdedededefd„Zdeddfd„Zddœdedededefd „Zded!edefd"„Zdedefd#„Zddd$œded%e
d&ededef
d'„Zd,dede
dz  defd(„Zded%e
defd)„Z	 	 d-ded&ede
dz  defd*„Zdedefd+„Zy).é    )Ú	dataclass)ÚPage)Úhuman_delay)Úsession_storec                   ó   — e Zd ZdZy)ÚLoginVerificationErrorz*Raised when Hudl login verification fails.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úA/var/www/html/sergio/sergio-backend/app/automation/tasks/login.pyr   r   	   s   „ Ú4r   r   T)Úfrozenc                   ó,   — e Zd ZU eed<   eed<   eed<   y)ÚHudlCredentialsÚemailÚpasswordÚ	login_urlN)r	   r
   r   ÚstrÚ__annotations__r   r   r   r   r      s   … àƒJØƒMØ„Nr   r   NÚcredentialsÚreturnc                 ó$   — | �| S ddl m}  |«       S )Nr   )Úload_active_credentials)Úapp.services.account_servicer   )r   r   s     r   Úresolve_credentialsr      s   € ØÐØÐÝDá"Ó$Ð$r   z,https://identity.hudl.com/u/login/identifierúhttps://www.hudl.com/homer   c                 óŠ   — | xs t         j                  «       }d|j                  «       v r|j                  d«      d   S t         S )uW   Use a stable identity URL â€” stored state/query params expire and cause iss redirects.úidentity.hudl.comÚ?r   )ÚCANONICAL_HUDL_LOGIN_URLÚstripÚlowerÚsplit)r   Úurls     r   Úcanonical_hudl_login_urlr'       s=   € àÒ0Ô0×
7Ñ
7Ó
9€CØ˜cŸi™i›kÑ)Ø�y‰y˜‹~˜aÑ Ð Ü#Ð#r   Úpagec              ƒ   óÞ   K  — ddl m} 	 | j                  |«      j                  }|j	                  «       ƒ d{  –—† dkD  r|j                  «       ƒ d{  –—† S 	 y7 Œ!7 Œ# t        $ r Y yw xY w­w)z/True when logged-in Hudl app chrome is visible.r   )ÚPRIMARY_NAVBARNF)Úapp.automation.selectorsr*   ÚlocatorÚfirstÚcountÚ
is_visibleÚ	Exception)r(   r*   Únavs      r   Ú_has_hudl_app_shellr2   (   sj   è ø€ å7ðØ�l‰l˜>Ó*×0Ñ0ˆØ—‘“×˜qÒ ØŸ™Ó)×)Ð)ð !ð ð	 øØ)ùÜò ØØðüsP   ‚A-Š.A ¸A¹A ÁAÁA ÁA-ÁA-ÁA ÁA Á	A*Á'A-Á)A*Á*A-r&   c              ƒ   óÆ   K  — | j                  «       }d|v xrH d|v xsB |j                  d«      j                  d«      xs  |j                  d«      j                  d«      S ­w)Nzwww.hudl.comziss=Ú/úhudl.com)r$   ÚrstripÚendswith)r&   r$   s     r   Ú_is_hudl_iss_landingr8   5   sb   è ø€ Ø�I‰I‹K€EØ˜UÐ"ò Ø�%ˆò 	6Ø�<‰<˜Ó×%Ñ% jÓ1ò	6à�<‰<˜Ó×%Ñ% nÓ5ðùs   ‚AA!c              ƒ   óN  K  — d| j                   j                  «       v r*| j                  d«      j                  «       ƒ d{  –—† dkD  S | j                  d«      j                  «       ƒ d{  –—† dkD  xr* | j                  d«      j                  «       ƒ d{  –—† dkD  S 7 Œ]7 Œ57 Œ­w)z,True when Hudl is asking for email/password.r    úinput[type="email"]Nr   úinput[type="password"])r&   r$   r,   r.   )r(   s    r   Úis_login_pager<   >   s�   è ø€ à˜dŸh™hŸn™nÓ.Ñ.Ø—\‘\Ð"7Ó8×>Ñ>Ó@×@À1ÑDÐDà�l‰lÐ0Ó1×7Ñ7Ó9×9¸AÑ=ò 	EØ—,‘,Ð7Ó8×>Ñ>Ó@×@À1ÑDðð Aøà9øØ@ús5   ‚?B%ÁBÁ)B%Á+B!Á,+B%ÂB#ÂB%Â!B%Â#B%c              ƒ   óØ   ‡K  — t        | «      ƒ d{  –—† ry| j                  j                  «       Šd‰vryd‰v ryt        | «      ƒ d{  –—† ryt	        ˆfd„dD «       «      ryy7 ŒS7 Œ­w)zi
    True when already inside Hudl app (e.g. redirected to /home).
    Not on identity login screen.
    NFr5   r    Tc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©Nr   )Ú.0Úpathr&   s     €r   Ú	<genexpr>z$is_hudl_logged_in.<locals>.<genexpr>Z   s   øè ø€ Ð
ZÑ#Y˜4ˆ4�3Œ;Ñ#Yùó   ƒ)z/homez/app/z/libraryz
/exchangesz/teams)r<   r&   r$   r2   Úany)r(   r&   s    @r   Úis_hudl_logged_inrE   H   sq   øè ø€ ô
 ˜4Ó × Ð Øà
�(‰(�.‰.Ó
€CØ˜ÑØà˜cÑ!Øä  Ó&×&Ð&Øä
Ó
ZÑ#YÓ
ZÔZØàð! !øð 'ús!   ƒA*’A&“7A*Á
A(ÁA*Á(A*Úallow_session_skipc          	   ƒ   ó¦  K  — g }|t        |«      t        fD ]  }||vsŒ|j                  |«       Œ |D �]H  }d}t        d|dz   «      D ]  }	 | j	                  |d¬«      ƒ d{  –—†   n t        dd	«      ƒ d{  –—†  t        | «      ƒ d{  –—†  t        | «      ƒ d{  –—† r y
t        | «      ƒ d{  –—† r|r yŒ‹t        | j                  «      ƒ d{  –—† sŒ©t        dd«      ƒ d{  –—†  t        | «      ƒ d{  –—† r|r y	 | j	                  t        d¬«      ƒ d{  –—†  t        dd«      ƒ d{  –—†  t        | «      ƒ d{  –—†  t        | «      ƒ d{  –—† r y
t        | «      ƒ d{  –—† s�ŒE|s�ŒI y t        | «      ƒ d{  –—† ry
t        | «      ƒ d{  –—† r|ryt        d| j                  › d�«      ‚7 �Œ`# t
        $ r8}t        d|› d|› �«       ||k(  r|‚t        dd«      ƒ d{  –—†7   Y d}~�Œ¹d}~ww xY w7 �Œ�7 �Œ€7 �Œp7 �Œ^7 �Œ?7 �Œ-7 �Œ7 Œû7 Œé7 ŒØ# t
        $ r}t        d|› �«       Y d}~Œòd}~ww xY w7 Œë7 ŒØ7 Œ¾7 Œ¬­w)z€
    Navigate until we reach the identity login form or an authenticated Hudl page.
    Returns: "login_form" | "logged_in"
    é   é   Údomcontentloaded©Ú
wait_untilNz*Navigation to login URL failed on attempt z: é   é   Ú
login_formÚ	logged_inz2Navigation to Hudl home after iss landing failed: z7Could not reach Hudl login form or home (current page: ú).)r'   r"   ÚappendÚrangeÚgotor0   Úprintr   Úclose_popup_if_visibler<   rE   r8   r&   ÚHUDL_HOME_URLr   )	r(   r   rF   Úurls_to_tryÚ	candidater&   Úmax_nav_attemptsÚattemptÚexcs	            r   Ú_resolve_login_entry_pager]   `   s]  è ø€ ð €KØÔ!9¸)Ó!DÔF^Ó_ˆ	Ø˜KÒ'Ø×Ñ˜yÕ)ð `ô ˆØÐÜ˜QÐ 0°1Ñ 4Ö5ˆGð(Ø—i‘i Ð0B�iÓC×CÐCÙð 6ô ˜!˜QÓ×ÐÜ$ TÓ*×*Ð*ä˜tÓ$×$Ð$Ùä" 4Ó(×(Ð(Ù!Ù"àä% d§h¡hÓ/×/Ñ/ä˜a Ó#×#Ð#Ü& tÓ,×,Ð,Ù%Ù&ðRØ—i‘i¤Ð:L�iÓM×MÐMÜ! ! QÓ'×'Ð'Ü,¨TÓ2×2Ð2ô # 4Ó(×(Ð(Ù#Ü& tÓ,×,Ò,Ó1CÙ"ðQ ôT ˜4Ó × Ð ØÜ˜tÓ$×$Ð$Ñ);Øä
 Ø
AÀ$Ç(Á(ÀÈ2ÐNóð ðW Dúäò (ÜÐBÀ7À)È2ÈcÈUÐSÔTØÐ.Ò.Ø�IÜ! ! QÓ'×'×'ûð	(úð 	 ùØ*ùà$ùð )ùð 0ùà#ùØ,ùð NøØ'øØ2ùÜò RÜÐJÈ3È%ÐP×QÑQûðRúð )øà,øð !øà$ús~  ‚IŸ-IÁGÁ#GÁ$GÁ(IÁ:H
Á;IÂHÂIÂ HÂ!IÂ5HÂ6!IÃHÃIÃIÃ,HÃ-IÃ?HÄ IÄ	H%Ä#HÄ$H%Ä7H!Ä8H%Å
H#ÅH%ÅIÅI	ÅIÅ2IÅ3IÅ9IÅ=IÆIÆIÆ"IÆ# IÇGÇ	HÇ'HÇ6G9
Ç7HÇ<IÈHÈIÈIÈIÈIÈIÈIÈIÈH%È!H%È#H%È%	IÈ.IÈ<IÉIÉIÉIÉIÉIc              ƒ   ó<   K  — ddl m}  || «      ƒ d {  –—†  y 7 Œ­w)Nr   )Úclose_hudl_popups)Úapp.automation.tasks.popupr_   )r(   r_   s     r   rV   rV   £   s   è ø€ Ý<á
˜DÓ
!×!Ò!ús   ‚”•F©Úforce_refreshÚresultrb   c             ƒ   ó  K  — |st        j                  «       }|r|| d<   | S 	 ddlm}  ||«      ƒ d {  –—† }t        j                  |«       || d<   | S 7 Œ # t
        $ r!}t        d|› �«       dddœ| d<   Y d }~| S d }~ww xY w­w)NÚstorage_warningr   )Úfetch_hudl_storage_usagez"Non-critical storage check error: F)Ú	availableÚ
show_popup)r   Úget_storage_warningÚapp.automation.tasks.libraryrf   Úset_storage_warningr0   rU   )rc   r(   rb   Úcachedrf   Ústorager\   s          r   Ú_attach_storage_warningrn   ©   sŸ   è ø€ ñ Ü×2Ñ2Ó4ˆÙØ(.ˆFÐ$Ñ%ØˆMðNÝIá0°Ó6×6ˆÜ×)Ñ)¨'Ô2Ø$+ˆÐ Ñ!ð €Mð 7ùô ò NÜÐ2°3°%Ð8Ô9Ø27ÀuÑ$MˆÐ Õ!Ø€MûðNüs>   ‚ B£A ´AµA ÁBÁA Á	BÁ A<Á6BÁ<BÂBÚreasonc              ƒ   ó¾   K  — t        | «      ƒ d {  –—†  t        j                  | j                  «       d| j                  |dœ}t	        || «      ƒ d {  –—† S 7 ŒG7 Œ­w)NÚalready_logged_in©Ústatusr&   Úmessage)rV   r   Úmark_logged_inr&   rn   )r(   ro   rc   s      r   Ú_skip_login_responserv   ½   sW   è ø€ Ü
  Ó
&×&Ð&Ü× Ñ  §¡Ô*à%Ø�x‰xØñ€Fô
 )¨°Ó6×6Ð6ð 'øð 7ús"   ‚A‘A’AAÁAÁAÁAc              ƒ   óÐ  ‡K  — | j                   j                  «       }	 | j                  d«      j                  d¬«      ƒ d {  –—† j                  «       Št        ˆfd„dD «       «      r	 yt        ˆfd„d	D «       «      ry
t        ˆfd„dD «       «      rydD ]{  }	 | j                  |«      j                  }|j                  «       ƒ d {  –—† dkD  rB|j                  «       ƒ d {  –—† xs dj                  «       }|rt        |«      dk  rd|› d�c S Œ} d|v rt        | «      ƒ d {  –—† ryd| j                   › d�S 7 Œú# t        $ r dŠY Œ÷w xY w7 Œ†7 Œm# t        $ r Y ŒÈw xY w7 Œ;­w)NÚbodyiˆ  )ÚtimeoutÚ c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr?   r   ©r@   ÚtokenÚ	body_texts     €r   rB   z(_login_failure_reason.<locals>.<genexpr>Ï   s"   øè ø€ ð 
ñ
ˆEð 	�Ôñ
ùrC   )zmulti-factorzverification codeÚauthenticatorz
two-factorz2-stepzenter the codez`Handshake requires MFA or a verification code. Automated login cannot complete for this account.c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr?   r   r|   s     €r   rB   z(_login_failure_reason.<locals>.<genexpr>ß   s   øè ø€ Ð
XÑ+W %ˆ5�IÔÑ+WùrC   )Úcaptchaznot a robotzsecurity checkzAHandshake presented a CAPTCHA or security check. Try again later.c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr?   r   r|   s     €r   rB   z(_login_failure_reason.<locals>.<genexpr>â   s   øè ø€ Ð
ZÑ+Y %ˆ5�IÔÑ+YùrC   )ÚlockedÚ	suspendedÚblockedÚdisabledz7Handshake account may be locked, suspended, or blocked.)z[role="alert"]z[data-error="true"]z.errorz.uni-notice__contentzdiv[class*="error"]r   i,  zHandshake login error: z-
Please check your credentials and try again.r    u?   Login failed â€” still on login page. Check email and password.u\   Login failed â€” could not reach Handshake home after submitting credentials (current page: rQ   )r&   r$   r,   Ú
inner_textr0   rD   r-   r.   Útext_contentr#   Úlenr<   )r(   r&   ÚselectorÚlocÚtextr~   s        @r   Ú_login_failure_reasonr�   È   st  øè ø€ Ø
�(‰(�.‰.Ó
€CðØŸ<™<¨Ó/×:Ñ:À4Ð:ÓH×H×OÑOÓQˆ	ô ó 
ñ
ó
ô 
ð@ð	
ô
 Ó
XÑ+WÓ
XÔXØRä
Ó
ZÑ+YÓ
ZÔZØHóˆð	Ø—,‘,˜xÓ(×.Ñ.ˆCØ—Y‘Y“[×  1Ò$Ø!×.Ñ.Ó0×0Ò6°B×=Ñ=Ó?�ÙœC ›I¨šOØ4°T°FÐ:hÐiÒiøðð  ˜cÑ!¬M¸$Ó,?×&?Ð&?ØPðØŸ(™(˜ 2ð	'ðð[ IùÜò ØŠ	ðúðD !øØ0ùô ò 	Ùð	úð '@ús�   ƒE&Ÿ$E  ÁD>ÁE  ÁAE&Â.EÃ
EÃEÃ%EÃ&+EÄE&Ä(E$Ä)E&Ä>E  Å EÅE&ÅEÅE&ÅEÅEÅ	E!ÅE&Å E!Å!E&©ÚforcerF   Úcredsr�   c             ƒ   óº  K  — |j                   r|j                  r|j                  st        d«      ‚|rt	        j
                  «        |r)|s't        | «      ƒ d{  –—† rt        | d«      ƒ d{  –—† S |rt        |j                  «      n|j                  }t        | ||¬«      ƒ d{  –—† }|dk(  rt        | d«      ƒ d{  –—† S t        | «      ƒ d{  –—† st        d| j                  › d�«      ‚| j                  d	«      j                  |j                   «      ƒ d{  –—†  t        «       ƒ d{  –—†  | j                  d
«      j!                  «       ƒ d{  –—†  t        dd«      ƒ d{  –—†  | j                  d«      j                  |j                  «      ƒ d{  –—†  t        «       ƒ d{  –—†  | j                  d
«      j!                  «       ƒ d{  –—†  t        dd«      ƒ d{  –—†  t#        | «      ƒ d{  –—†  t        | «      ƒ d{  –—† r0t	        j
                  «        t        t%        | «      ƒ d{  –—† «      ‚t        | «      ƒ d{  –—† sG	 | j'                  t(        d¬«      ƒ d{  –—†  t        dd«      ƒ d{  –—†  t#        | «      ƒ d{  –—†  t        | «      ƒ d{  –—† st        | «      ƒ d{  –—† s0t	        j
                  «        t        t%        | «      ƒ d{  –—† «      ‚t	        j.                  | j                  «       	 t1        | «      ƒ d{  –—†  d| j                  ddœ}t3        || d¬«      ƒ d{  –—† S 7 �Œô7 �Œã7 �Œ­7 �Œ—7 �Œ‡7 �Œ?7 �Œ07 �Œ7 �Œû7 �ŒÌ7 �Œ½7 �Œ™7 �Œˆ7 �Œx7 �Œh7 �Œ?7 �Œ+7 �Œ7 Œü7 Œë# t*        $ r}t-        d|› �«       Y d}~�Œd}~ww xY w7 Œÿ7 Œî7 ŒÄ7 Œ�# t*        $ r}t-        d|› �«       Y d}~Œ©d}~ww xY w7 Œ�­w)z.Perform Hudl login with the given credentials.zMHandshake credentials are incomplete. Provide email, password, and login URL.Nu)   Already on Handshake â€” no login needed.)rF   rP   u>   Redirected to Handshake home â€” session valid, login skipped.z!Unexpected page after login URL: z. Not login or Handshake home.r:   zbutton[type="submit"]rM   rN   r;   é   rJ   rK   rH   z0Post-login navigation to Handshake home failed: zNon-critical name fetch error: z.Login successful. Session saved for next time.rr   Tra   )r   r   r   Ú
ValueErrorr   Úmark_logged_outrE   rv   r'   r]   r<   r   r&   r,   Úfillr   ÚclickrV   r�   rT   rW   r0   rU   ru   Úfetch_hudl_account_namern   )	r(   r�   r�   rF   Úentry_login_urlÚentry_stater\   Úerc   s	            r   Úattempt_hudl_loginr›   þ   sr  è ø€ ð �;Š;˜eŸnšn°E·O²OÜØ[ó
ð 	
ñ Ü×%Ñ%Ô'á¡%Ô2CÀDÓ2I×,IÐ,IÜ)ØÐ=ó
÷ 
ð 	
ñ
 6;Ô  §¡Ô1ÀÇÁð ô 2ØØØ-ô÷ €Kð �kÒ!Ü)ØØLó
÷ 
ð 	
ô
 ˜tÓ$×$Ð$Ü$Ø/°·±¨zÐ9WÐXó
ð 	
ð �,‰,Ð,Ó
-×
2Ñ
2°5·;±;Ó
?×?Ð?Ü
‹-×ÐØ
�,‰,Ð.Ó
/×
5Ñ
5Ó
7×7Ð7Ü
�a˜Ó
×Ðà
�,‰,Ð/Ó
0×
5Ñ
5°e·n±nÓ
E×EÐEÜ
‹-×ÐØ
�,‰,Ð.Ó
/×
5Ñ
5Ó
7×7Ð7Ü
�a˜Ó
×Ðä
  Ó
&×&Ð&ä˜4Ó × Ð Ü×%Ñ%Ô'Ü$Ô+@ÀÓ+F×%FÓGÐGä" 4Ó(×(Ð(ð	LØ—)‘)œMÐ6H�)ÓI×IÐIÜ˜a Ó#×#Ð#Ü(¨Ó.×.Ð.ô ˜4Ó × Ð Ô.?ÀÓ.E×(EÐ(EÜ×%Ñ%Ô'Ü$Ô+@ÀÓ+F×%FÓGÐGä× Ñ  §¡Ô*ð5Ü% dÓ+×+Ð+ð Ø�x‰xØCñ€Fô
 )¨°ÀTÔJ×JÐJð -Jùð
ùðùð
ùð
 %ùð
 @ùØùØ7ùØùàEùØùØ7ùØùà&ùà ùà%Fùà(ùàIùØ#øØ.ùÜò 	LÜÐDÀSÀEÐJ×KÒKûð	Lúð !øÐ(Eøà%Føð 	,ùÜò 5ÜÐ/°¨sÐ3×4Ñ4ûð5úð Kús  ‚AOÁMÁOÁ.MÁ/8OÂ'MÂ(OÃ MÃOÃMÃA
OÄMÄOÄ0M Ä1&OÅM#ÅOÅ+M&Å,1OÆM)ÆOÆ/M,Æ0&OÇM/ÇOÇ*M2Ç+OÇ=M5Ç>OÈM8È+OÈ<M;È=OÉM>ÉOÉN É3NÉ4N ÊNÊN ÊNÊN ÊOÊ-N-Ê.OË N/Ë+OË,N1Ë-'OÌN5 Ì#N3Ì$N5 Ì(!OÍ	OÍ
OÍOÍOÍOÍOÍOÍ OÍ#OÍ&OÍ)OÍ,OÍ/OÍ2OÍ5OÍ8OÍ;OÍ>OÎN ÎN ÎN Î	N*ÎN%ÎOÎ%N*Î*OÎ/OÎ1OÎ3N5 Î5	OÎ>OÏOÏOÏOc              ƒ   ó¨   K  — t        |«      }t        | «      ƒ d{  –—† rt        | d«      ƒ d{  –—† S t        | |dd¬«      ƒ d{  –—† S 7 Œ/7 Œ7 Œ­w)zŒ
    Ensure an active Hudl session without navigating to /home.
    Used on hot paths (exchanges, notifications) to avoid slow detours.
    Nu!   Session active â€” login skipped.FTrŽ   )r   rE   rv   r›   )r(   r   r�   s      r   Úensure_hudl_sessionr�   P  s^   è ø€ ô
   Ó,€Eä˜tÓ$×$Ð$Ü)¨$Ð0SÓT×TÐTä#ØØØØô	÷ ð ð %øØTøðús1   ‚AœA�A°A±AÁAÁAÁAÁAc              ƒ   óÞ   K  — ddl m} |j                  «       ƒ d{  –—†  |j                  «       ƒ d{  –—† } t	        | |dd¬«      ƒ d{  –—† }dd|j                  dd	«      d
dœS 7 ŒJ7 Œ47 Œ­w)zÀ

    Clears any saved browser session so verification always tests the submitted
    email/password (not cached cookies), then runs the same login flow used by
    production automation.
    r   )Úbrowser_managerNTFrŽ   Úplaywright_live_loginrs   rP   z<credentials verified successfully via Playwright live login.)ÚverifiedÚverification_methodrs   rt   )Úapp.automation.browser_managerrŸ   Úclear_sessionÚstartr›   Úget)r(   r�   rŸ   rc   s       r   Úverify_credentialsr§   b  s{   è ø€ õ ?à
×
'Ñ
'Ó
)×)Ð)Ø ×&Ñ&Ó(×(€DÜ%ØØØØ ô	÷ €Fð Ø6Ø—*‘*˜X {Ó3ØQñ	ð ð *øØ(øðús1   ‚A-œA'�A-´A)µA-ÁA+ÁA-Á)A-Á+A-c              ƒ   óR   K  — t        |«      }t        | ||d¬«      ƒ d{  –—† S 7 Œ­w)uÜ   
    POST /hudl/login:
    - Opens login URL; if cookies redirect to hudl/home â†’ skip (do nothing).
    - If login form shows â†’ email/password login.
    - Other APIs can run after this without logging in again.
    TrŽ   N)r   r›   )r(   r�   r   r�   s       r   Úrunr©   {  s5   è ø€ ô   Ó,€EÜ#ØØØØô	÷ ð ð ús   ‚' %¡'c              ƒ   ó†  K  — ddl m}m}m} 	 d| j                  vr/| j                  dd¬«      ƒ d{  –—†  t        dd	«      ƒ d{  –—†  | j                  |«      j                  j                  d
d¬«      ƒ d{  –—†  |D ]  }	 | j                  |«      j                  }|j                  «       ƒ d{  –—† dk(  rŒ;|j                  «       ƒ d{  –—† xs dj                  «       }|rt        j                  |«       |c S Œ� | j                  |«      j                  }|j                  d
d¬«      ƒ d{  –—†  |j                  «       ƒ d{  –—† }|r'|j                  «       }t        j                  |«       |S 	 y7 �ŒJ7 �Œ97 �Œ7 ŒÑ7 Œ·# t        $ r Y �Œw xY w7 Œd7 ŒN# t        $ r}t!        d|› �«       Y d}~yd}~ww xY w­w)z�Fetch the logged-in user's display name from Hudl's top-right user menu.

    Falls back to the selected team name only if the user name can't be found.
    r   )r*   ÚTEAM_SWITCHER_SELECTED_NAMEÚUSER_ACCOUNT_NAME_SELECTORSzhudl.com/homer   rJ   rK   Ng      ø?g      @Úvisiblei˜:  )Ústatery   rz   i'  z7Non-critical: Failed to extract account holder's name: )r+   r*   r«   r¬   r&   rT   r   r,   r-   Úwait_forr.   rˆ   r#   r   Úset_account_holder_namer0   rU   )	r(   r*   r«   r¬   rŠ   r‹   ÚnameÚspanrš   s	            r   r—   r—   �  s«  è ø€ ÷
ñ ðMØ $§(¡(Ñ*Ø—)‘)Ð7ÐDV�)ÓW×WÐWÜ˜c 3Ó'×'Ð'à�l‰l˜>Ó*×0Ñ0×9Ñ9À	ÐSXÐ9ÓY×YÐYã3ˆHð	Ø—l‘l 8Ó,×2Ñ2�ØŸ™›×$¨Ò)ØØ!×.Ñ.Ó0×0Ò6°B×=Ñ=Ó?�ÙÜ!×9Ñ9¸$Ô?Ø’Kð ð 4ð �|‰|Ð7Ó8×>Ñ>ˆØ�m‰m )°UˆmÓ;×;Ð;Ø×&Ñ&Ó(×(ˆÙØ—:‘:“<ˆDÜ×1Ñ1°$Ô7ØˆKð ð ð5 XùØ'ùàYùð
 %øà0ùô ò Úðúð 	<øØ(ùô
 ò MÜÐGÈÀsÐK×LÐLØûðMüsæ   ‚GŽ$F ²E<³F ÁE?Á3F Á:FÁ;	F Â.F	Â3FÂ4F	Â;F Â<F	ÃFÃ.F	Ã>F Ä GÄ3F Ä4FÄ5F ÅFÅ,F Å9GÅ;GÅ<F Å?F ÆF ÆF	ÆF	Æ		FÆF ÆFÆF ÆF Æ	F>Æ&F9Æ4GÆ9F>Æ>Gr?   )FN) Údataclassesr   Úplaywright.async_apir   Úapp.automation.helpersr   Úapp.automation.session_storer   r0   r   r   r   r"   rW   r   r'   Úboolr2   r8   r<   rE   r]   rV   Údictrn   rv   r�   r›   r�   r§   r©   r—   r   r   r   Ú<module>r¹      s%  ðÝ !å %å .Ý 6ô5˜Yô 5ñ �$Ô÷ð ó ðñ% _°tÑ%;ð %Àó %ð JÐ Ø+€ð$¨ð $°ó $ð
 Dð 
¨Tó 
ð Cð ¨Dó ð˜dð  tó ð $ð ¨4ó ð0@Ø
ð@àð@ð ð	@ð
 	ó@ðF" tð "°ó "ð 8=òØðØðØ04ðà	óð(7 Tð 7°3ð 7¸4ó 7ð3 dð 3¨só 3ðt Ø#òOKØ
ðOKàðOKð ð	OKð
 ðOKð 
óOKñd Dð °ÈÑ7Mð ÐY]ó ð$ 4ð °ð ÀDó ð6 Ø*.ñØ
ðàðð ! 4Ñ'ðð 
ó	ð('¨ð '°ô 'r   