Ë
    ±bjX  ã                   óL  — d Z ddlZddlZddlmZmZ ddlmZmZ ddl	m
Z
 dZe
ddd	d
fZdZdedefd„Zdededz  fd„Zdedededz  fd„Zdedee   fd„Zdedd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e   dee   fd„Zdedee   defd„Zddedee   dz  defd„Zy)u�  
5th API â€” get video list from the exchange wizard.

Classic Basketball UI uses #events-container + ko-choice-label.
Football (and newer Hudl) uses the multi-step smooth-modal:
  .smooth-modal .multi-step-modal section.step-2  â†’ "Choose a Game to Exchange"

Do NOT call close_hudl_popups() here â€” that dismisses the wizard modal
and leaves the frontend with an empty video list.
é    N)ÚLocatorÚPage)Úhuman_delayÚfind_and_click_next)ÚVIDEO_LIST_ITEMS)z#.multi-step-modal section.step-2 liz7.multi-step-modal-inner.step-2-active section.step-2 liz.smooth-modal section.step-2 liz5.multi-step-modal section.step-2 .ko-choice-list > liz0.multi-step-modal section.step-2 [class*='game']z1.multi-step-modal section.step-2 [class*='event']z0.multi-step-modal section.step-2 [role='button']z#events-container ul > liz#events-container lizsection#events-container lizul.ko-choice-list > li)zspan.ko-choice-labelz.ko-choice-labelzlabel.ko-choice-labelz[class*='choice-label']z.ex-video-titlez.video-titlez[class*='title']ÚlabelÚpageÚreturnc              ƒ   ó‚   K  — 	 | j                  d«      j                  «       ƒ d {  –—† dkD  S 7 Œ# t        $ r Y yw xY w­w)Nzy.multi-step-modal, .smooth-modal .multi-step-modal, .multi-step-modal-inner.step-2-active, text=Choose a Game to Exchanger   F)ÚlocatorÚcountÚ	Exception©r	   s    úB/var/www/html/sergio/sergio-backend/app/automation/tasks/videos.pyÚ_multi_step_modal_openr   1   sR   è ø€ ðØ—\‘\ðTó
÷ ‰%‹'÷ð ñð 	ð ùô ò Ùðüs(   ‚?„"0 ¦.§0 ­?®0 °	<¹?»<¼?c              ƒ   ó  K  — t        | «      ƒ d {  –—† rg t        ¢t        ¢­ng t        ¢t        ¢­}|D ]¯  }| j                  |«      }	 |j	                  «       ƒ d {  –—† }|dk  rŒ3d}t        |d«      }t        |«      D ]1  }	 |j                  |«      j                  «       ƒ d {  –—† r|dz  } nŒ3 |dkD  rt        d|› d|› d�«       |c S t        d|› d|› d�«       |c S  y 7 Œ×7 ŒŒ7 ŒD# t        $ r Y Œxw xY w# t        $ r Y ŒÓw xY w­w)Nr   é   é   z get_video_list: using selector 'z' (z items, visible)z
 attached))r   Ú_MULTI_STEP_SELECTORSÚ_CLASSIC_SELECTORSr   r   ÚminÚrangeÚnthÚ
is_visibler   Úprint)r	   Ú	selectorsÚselectorÚlocr   Úvisible_countÚcheck_nÚis           r   Ú_first_matching_listr"   ;   sB  è ø€ ô
 (¨Ó-×-Ð-ð 	6Ô
Ð5Ô"4Ò5à:Ô!Ð:Ô$9Ñ:ð ó
 ˆØ�l‰l˜8Ó$ˆð	ØŸ)™)›+×%ˆEØ˜ŠzØàˆMÜ˜% “nˆGÜ˜7–^�ðØ ŸW™W Q›Z×2Ñ2Ó4×4Ð4Ø%¨Ñ*˜Ùð 5ð $ð ˜qÒ ÜÐ8¸¸
À#ÀeÀWÐL\Ð]Ô^Ø’
ÜÐ4°X°J¸cÀ%ÀÈ
ÐSÔTØŠJð) ð. ð5 .øð &øð 5ùô !ò Ùðûô ò 	Ùð	üs“   ‚D‘C)’8DÁC>ÁC+Á	C>Á(DÁ)C>Â"C/Â(C-Â)	C/Â2C>ÃDÃC>Ã$DÃ+C>Ã-C/Ã/	C;Ã8C>Ã:C;Ã;C>Ã>	D
ÄDÄ	D
Ä
DÚitemÚindexc              ƒ   ó–  K  — | j                  d«      ƒ d {  –—† xs dj                  «       }d|v ry d}t        D ]j  }| j                  |«      j                  }	 |j                  «       ƒ d {  –—† dk(  rŒ;|j                  «       ƒ d {  –—† }|xs dj                  «       }|r nŒl |sH	 | j                  «       ƒ d {  –—† }|xs dj                  «       D ]  }|j                  «       }|sŒ|} n |sy t        j                  d|t        j                  «      ry ||dœS 7 �Œ	7 Œµ7 Œ›# t        $ r Y Œ÷w xY w7 Œw# t        $ r d}Y ŒSw xY w­w)NÚclassÚ ú
bad-statusr   zX(select|next|back|cancel|choose a game to exchange|exchanging with.*|\d{4}-\d{4} season))r$   Útitle)Úget_attributeÚstripÚ_LABEL_SELECTORSr   Úfirstr   Ú
inner_textr   Ú
splitlinesÚreÚ	fullmatchÚI)	r#   r$   Ú
class_attrr)   ÚselÚlabel_elÚrawÚlineÚcleaneds	            r   Ú_parse_video_lir9   ]   sT  è ø€ Ø×*Ñ*¨7Ó3×3Ò9°r×@Ñ@ÓB€JØ�zÑ!Øà€EßˆØ—<‘< Ó$×*Ñ*ˆð	Ø—^‘^Ó%×%¨Ò*ØØ ×+Ñ+Ó-×-ˆCØ’Y˜B×%Ñ%Ó'ˆEÙÙð ð  ñ ð	ØŸ™Ó)×)ˆCØš ×.Ñ.Ö0�ØŸ*™*›,�ÚØ#�EÙð	 1ñ ØÜ	‡|�|ð	àÜ
�‰ô	ð à UÑ+Ð+ðM 4ùð &øà-ùô ò 	Ùð	úð
 *ùô ò 	ØŠEð	üs    ‚E	—D ˜AE	ÁD'Á-D#Á.D'Á5E	Á6D'Â	D%Â
D'Â$E	Â+D8 Â>D6Â?-D8 Ã-D8 Ã2/E	Ä#D'Ä%D'Ä'	D3Ä0E	Ä2D3Ä3E	Ä6D8 Ä8EÅE	ÅEÅE	c              ƒ   óL   K  — | j                  d«      ƒ d{  –—† }|xs g S 7 Œ
­w)zDScrape classic events-container OR Football multi-step modal step-2.a6
  () => {
          const items = [];
          const seen = new Set();

          const pushEl = (el, index) => {
            if (!el || !(el instanceof Element)) return;
            const cls = (el.className || '').toString();
            if (cls.includes('bad-status')) return;
            const style = window.getComputedStyle(el);
            if (style && (style.display === 'none' || style.visibility === 'hidden')) return;

            const label =
              el.querySelector(
                'span.ko-choice-label, .ko-choice-label, [class*="choice-label"], ' +
                '.ex-video-title, .video-title, [class*="title"], label'
              ) || el;
            let title = (label.innerText || '')
              .trim()
              .split('\n')
              .map(s => s.trim())
              .find(Boolean) || '';
            title = title.replace(/\s+/g, ' ').trim();
            if (!title) return;
            if (/^(select|next|back|cancel)$/i.test(title)) return;
            if (/choose a game to exchange/i.test(title)) return;
            if (/^exchanging with/i.test(title)) return;
            if (/^\d{4}-\d{4}\s+season$/i.test(title)) return;
            const key = title.toLowerCase();
            if (seen.has(key)) return;
            seen.add(key);
            items.push({ index: items.length, title });
          };

          const roots = [
            document.querySelector('.multi-step-modal section.step-2'),
            document.querySelector('.multi-step-modal-inner.step-2-active section.step-2'),
            document.querySelector('.smooth-modal section.step-2'),
            document.querySelector('#events-container'),
            document.querySelector('section#events-container'),
          ].filter(Boolean);

          for (const root of roots) {
            const style = window.getComputedStyle(root);
            if (style && style.display === 'none') continue;

            // Prefer list rows, then clickable game rows.
            const candidates = root.querySelectorAll(
              'li, [role="option"], [role="button"], button, a, ' +
              '[class*="game"], [class*="event"], [class*="playlist"], [class*="video"]'
            );
            if (candidates.length) {
              candidates.forEach((el) => pushEl(el, items.length));
              if (items.length) return items;
            }
          }

          // Last resort: any visible ko-choice rows.
          document.querySelectorAll('ul.ko-choice-list > li, .ko-choice-list > li')
            .forEach((el) => pushEl(el, items.length));
          return items;
        }N©Úevaluate)r	   Úrowss     r   Ú_scrape_videos_via_jsr>   ‡   s1   è ø€ à—‘ð<	ó>÷ >€Dð~ Š:�2Ðð>ús   ‚$—"˜$c              ƒ   ó˜   K  — 	 | j                  d«      j                  j                  dd¬«      ƒ d{  –—†  y7 Œ# t        $ r Y yw xY w­w)zCWait until classic events list OR Football step-2 modal is present.z‹#events-container, section#events-container, .multi-step-modal section.step-2, .smooth-modal section.step-2, text=Choose a Game to ExchangeÚattachedià.  )ÚstateÚtimeoutN)r   r-   Úwait_forr   r   s    r   Ú_wait_for_video_steprD   Ë   sM   è ø€ ð	Ø�l‰lð-ó
÷ ‰%—‘˜z°5�Ó9÷	:ò 	:ùô ò Ùðüs1   ‚A
„/; ³9´; ¸A
¹; »	AÁA
ÁAÁA
c              ƒ   ó
  K  — g }d}d}d}t        d«      D �]p  }t        dd«      ƒ d{  –—†  t        | «      ƒ d{  –—†  t        | «      ƒ d{  –—† }|r0|}t	        dt        |«      › d|dz   › d	| j                  › d
�«        �nt        | «      ƒ d{  –—† }|€=t	        d|dz   › d| j                  › d
�«       t        j                  d«      ƒ d{  –—†  ŒÂd}|j                  «       ƒ d{  –—† }|}g }d}t        |«      D ]>  }	t        |j                  |	«      |	«      ƒ d{  –—† }
|
r|j                  |
«       Œ:|dz  }Œ@ |r nBt	        d|dz   › d|› d| j                  › d
�«       t        j                  d«      ƒ d{  –—†  �Œs |rdt        |«      › d�nd}t        | «      ƒ d{  –—† }|dk(  r-	 | j                  d«      j                  «       ƒ d{  –—† dkD  rd}|dk(  rdnd}t	        dt        |«      › d|› d|› d|› d|› d| j                  › �«       d| j                  |t        |«      ||||dk(  rd nd|dk(  r|rdt        |«      › d!�d"œ	S |d"œ	S 7 �Œ07 �Œ 7 �Œ7 �ŒÎ7 �Œ“7 �Œ{7 �ŒG7 Œë7 ŒÄ7 Œ™# t         $ r Y Œ�w xY w­w)#zZ
    GET /exchange/videos
    Reads selectable videos/games from the exchange wizard.
    r   Né   ç333333ã?ç333333ó?z get_video_list: JS scrape found z videos (attempt r   z, url=Ú)zget_video_list attempt z: no list yet (url=ç      ð?Tz: z nodes found, 0 parseable (url=úFound z videos.zNo video items found on page.Úclassicz@text=Choose a Game to Exchange, .multi-step-modal section.step-2Ú
multi_stepzChoose a Game to Exchangez%Select the video(s) you want to send.zget_video_list done: videos=z	 skipped=z raw_li=z
 selector=z	 ui_mode=z url=ÚokzExchanging withz games.)	ÚstatusÚurlÚvideosÚvideos_countÚskipped_bad_statusÚui_modeÚ
step_titleÚstep_subtitleÚmessage)r   r   rD   r>   r   ÚlenrP   r"   ÚasyncioÚsleepr   r9   r   ÚappendÚ_detect_ui_moder   r   )r	   rQ   ÚskippedÚused_selectorÚ
last_totalÚattemptÚjs_rowsÚitems_locatorÚtotalr!   ÚrowrW   rT   rU   s                 r   Úget_video_listre   Ù   s  è ø€ ð €FØ€GØ€MØ€Jä˜—8ˆÜ˜#˜sÓ#×#Ð#Ü" 4Ó(×(Ð(ä-¨dÓ3×3ˆÙØˆFÜØ2´3°v³;°-ð @Ø# a™K˜=¨¨t¯x©x¨j¸ð;ôò ä2°4Ó8×8ˆØÐ ÜØ)¨'°A©+¨Ð6IÈ$Ï(É(ÈÐSTÐUôô —-‘- Ó$×$Ð$ØàˆØ#×)Ñ)Ó+×+ˆØˆ
ØˆØˆÜ�u–ˆAÜ'¨×(9Ñ(9¸!Ó(<¸aÓ@×@ˆCÙØ—‘˜cÕ"à˜1‘‘ð ñ ÙäØ% g°¡k ]°"°U°Gð < Ø $§¡˜z¨ð,ô	
ô �m‰m˜CÓ × Ò ðQ ñX ð ”�V“�˜XÑ&à,ð ô
 $ DÓ)×)€Gð �)Òð	Ø—\‘\ØRóç‰e‹g÷àòð '�ð �lÒ"ñ 	$à4ð ô
 
Ø
&¤s¨6£{ m°9¸W¸Ið FØ�˜Z¨ °iÀ¸yÈÈdÏhÉhÈZð	Yôð Ø�x‰xØÜ˜F›Ø%ØØ Ø.5¸Ò.EÑ*È4ð ˜,Ò&©6ð ”S˜“[�M Ð)ñð ð ñð ðI 	$ùØ(ùà3ùð 9ùð
 %ùð ,ùð
 Aùð 	!øð *øð
ùô ò 	Ùð	üsÖ   ‚'J©IªJ¼I½JÁIÁAJÂI"Â=JÃI%ÃJÃ-I(Ã.6JÄ$I+Ä%AJÆI.Æ(JÆ+I0Æ,	JÆ6"I4 ÇI2Ç	I4 Ç"A8JÉJÉJÉ"JÉ%JÉ(JÉ+JÉ.JÉ0JÉ2I4 É4	J É=JÉ?J Ê Jc              ƒ   ó8   K  — t        | «      ƒ d {  –—† ryy7 Œ­w)NrM   rL   )r   r   s    r   r\   r\   ;  s   è ø€ Ü# DÓ)×)Ð)ØØð *ús   ‚‘’c              ƒ   óT   K  — | j                  d«      ƒ d{  –—† }|xs dg ddœS 7 Œ­w)z<Read Hudl 'Choose Playlist(s)' step (including empty state).aÖ
  () => {
          const modal =
            document.querySelector('.smooth-modal, .multi-step-modal') || document.body;
          const text = (modal.innerText || '');
          const isPlaylistStep =
            /choose playlist/i.test(text) ||
            /no playlists/i.test(text) ||
            !!document.querySelector('.multi-step-modal-inner.step-3-active, section.step-3');

          if (!isPlaylistStep) {
            return { on_playlist_step: false, playlists: [], playlists_count: 0 };
          }

          const empty = /no playlists/i.test(text);
          const emptyTitleMatch = text.match(/No Playlists/i);
          const emptyMessageMatch = text.match(
            /There aren't any playlists here to exchange[^.]*\.?/i
          );

          const playlists = [];
          const seen = new Set();
          const root =
            document.querySelector('.multi-step-modal section.step-3') ||
            document.querySelector('.multi-step-modal-inner.step-3-active') ||
            document.querySelector('.smooth-modal') ||
            modal;

          root.querySelectorAll('li, [role="option"], [role="checkbox"], label, [class*="playlist"]').forEach((el) => {
            const style = window.getComputedStyle(el);
            if (style && (style.display === 'none' || style.visibility === 'hidden')) return;
            let title = (el.innerText || '').trim().split('\n').map(s => s.trim()).find(Boolean) || '';
            title = title.replace(/\s+/g, ' ').trim();
            if (!title || title.length > 120) return;
            if (/^(cancel|next|add more|0 playlists|choose playlist)/i.test(title)) return;
            if (/no playlists|there aren't any playlists/i.test(title)) return;
            const key = title.toLowerCase();
            if (seen.has(key)) return;
            seen.add(key);
            playlists.push({ index: playlists.length, title });
          });

          const countMatch = text.match(/(\d+)\s+Playlists?/i);
          const headerCount = countMatch ? parseInt(countMatch[1], 10) : playlists.length;

          return {
            on_playlist_step: true,
            playlists,
            playlists_count: playlists.length,
            header_count: headerCount,
            empty: empty || playlists.length === 0,
            empty_title: emptyTitleMatch ? 'No Playlists' : (playlists.length ? null : 'No Playlists'),
            empty_message: emptyMessageMatch
              ? emptyMessageMatch[0].trim()
              : (playlists.length
                  ? null
                  : "There aren't any playlists here to exchange. Tap the back arrow to choose a different game."),
            can_proceed: playlists.length > 0,
            step_title: 'Choose Playlist(s)',
          };
        }NFr   )Úon_playlist_stepÚ	playlistsÚplaylists_countr;   )r	   Údatas     r   Ú_read_playlist_steprl   A  s:   è ø€ à—‘ð;	ó=÷ =€Dð| ÒU¨¸BÐSTÑUÐUð}=ús   ‚(—&˜(Úvideo_indicesc              ƒ   ó°  K  — g }t        | «      ƒ d {  –—† }t        | «      ƒ d {  –—† }|�ý|j                  «       ƒ d {  –—† }|D ]Þ  }|dk  s||k\  rŒ|j                  |«      }|j	                  d«      ƒ d {  –—† xs dj                  «       }d|v rŒO|j                  «       ƒ d {  –—†  t        dd«      ƒ d {  –—†  |j                  «       ƒ d {  –—†  |j                  |«       t        dd«      ƒ d {  –—†  t        | «      ƒ d {  –—† }	|	j                  d«      sŒÝ |S  |S |D ]‡  }|dk  s|t        |«      k\  rŒ||   d	   }
| j                  d
|
«      ƒ d {  –—† }|sŒ<|j                  |«       t        dd«      ƒ d {  –—†  t        | «      ƒ d {  –—† }	|	j                  d«      sŒ† |S  |S 7 �Œ¥7 �Œ•7 �Œ~7 �ŒG7 �Œ7 �Œ
7 Œô7 ŒÑ7 ŒÀ7 Œo7 ŒI7 Œ8­w)Nr   r&   r'   r(   gš™™™™™Ù?çš™™™™™é?rH   rh   r)   a.  (title) => {
              const root =
                document.querySelector('.multi-step-modal section.step-2') ||
                document.querySelector('#events-container') ||
                document.body;
              const nodes = Array.from(root.querySelectorAll(
                'li, [role="button"], button, a, [class*="game"], [class*="event"]'
              ));
              const el = nodes.find(n => (n.innerText || '').includes(title));
              if (!el) return false;
              el.click();
              return true;
            })r"   r>   r   r   r*   r+   Úscroll_into_view_if_neededr   Úclickr[   rl   ÚgetrX   r<   )r	   rm   Úselectedrb   ra   rc   Úidxr#   r3   Úplaylistr)   Úclickeds               r   Ú_click_game_rowsrw   „  sÚ  è ø€ Ø€HÜ.¨tÓ4×4€MÜ)¨$Ó/×/€GàÐ Ø#×)Ñ)Ó+×+ˆÛ ˆCØ�QŠw˜# š,ØØ ×$Ñ$ SÓ)ˆDØ $× 2Ñ 2°7Ó ;×;ÒA¸r×HÑHÓJˆJØ˜zÑ)ØØ×1Ñ1Ó3×3Ð3Ü˜c 3Ó'×'Ð'Ø—*‘*“,×ÐØ�O‰O˜CÔ ä˜c 3Ó'×'Ð'Ü0°Ó6×6ˆHØ�|‰|Ð.Õ/ØØˆð! !ð  ˆãˆØ�Š7�cœS ›\Ò)ØØ˜‘˜WÑ%ˆØŸ™ðð ó
÷ 
ˆò  Ø�O‰O˜CÔ Ü˜c 3Ó'×'Ð'Ü0°Ó6×6ˆHØ�|‰|Ð.Õ/ØØ€Oð5 ð4 €Oðc 5ùØ/ùð ,ùð
 <ùð 4ùØ'ùØøð (øØ6øð
øð$ (øØ6úså   ‚G“F8”G¦F;§GÁ F>Á9GÁ:GÁ;.GÂ)GÂ*GÂ=GÂ>GÃG
Ã$GÃ:GÃ;GÄGÄGÄ$<GÅ GÅ!GÅ( GÆGÆ	GÆGÆGÆ2GÆ;GÆ>GÇGÇGÇGÇ
GÇGÇGÇGÇGÇGc              ƒ   ó€  K  — t        dd«      ƒ d{  –—†  t        | «      ƒ d{  –—†  t        | «      ƒ d{  –—† }t        | |«      ƒ d{  –—† }|sddg || j                  ddœS t        dd	«      ƒ d{  –—†  t        | «      ƒ d{  –—† }|j                  d
«      ræt        |j                  d«      xs |j                  d«       «      }dd|dd|j                  d«      xs g t        |j                  d«      xs d«      ||j                  d«      xs d|j                  d«      xs dt        |j                  d«      «      |j                  d«      xs d| j                  |rddœS d|j                  d«      xs d› d�dœS |dk(  st        | «      ƒ d{  –—† �r8t        d«      D �])  }t        j                  d«      ƒ d{  –—†  t        | «      ƒ d{  –—† }|j                  d
«      sŒFt        |j                  d«      xs |j                  d«       «      }dd|dd|j                  d«      xs g t        |j                  d«      xs d«      ||j                  d«      xs d|j                  d«      xs dt        |j                  d«      «      |j                  d«      xs d| j                  |rdnd|j                  d«      xs d› d�dœc S  t        | «      ƒ d{  –—† }t        dd«      ƒ d{  –—†  dd|dd | j                  |d!d"t        |«      › d#�d$œ	S 7 �Œ7 �Œý7 �Œí7 �ŒÜ7 �Œ¶7 �Œ¦7 �Œš7 �Œp7 �Œ`7 ŒV7 ŒD­w)%uì   
    POST /exchange/videos/select

    Classic Basketball: select rows + click Next â†’ stats/notes.
    Football multi-step: click game â†’ lands on Choose Playlist(s)
    (may be empty â€” mirror Hudl message, do NOT force Next).
    rG   rJ   NÚerrorÚvideo_selectz0No video/game list found on page to select from.)rO   ÚactionÚselected_indicesrT   rP   rW   ro   gffffffö?rh   Úemptyri   rN   rM   rj   r   Úempty_titleúNo PlaylistsÚempty_messageú[There aren't any playlists here to exchange. Tap the back arrow to choose a different game.Úcan_proceedrU   zChoose Playlist(s)rK   z playlists.)rO   r{   r|   rT   Úwizard_stepri   rj   r}   r~   r€   r‚   rU   rP   rW   rF   ç      à?rH   g       @rL   Ústats_or_notesTú	Selected z videos and clicked Next.)	rO   r{   r|   rT   rƒ   rP   Únext_button_usedr‚   rW   )r   rD   r\   rw   rP   rl   rr   ÚboolÚintr   r   rY   rZ   r   rX   )r	   rm   rT   rs   ru   r}   Ú_Úfound_next_buttons           r   Úselect_videosrŒ   º  s9  è ø€ ô �c˜3Ó
×ÐÜ
˜tÓ
$×$Ð$Ü# DÓ)×)€Gä% d¨MÓ:×:€HÙàØ$Ø "ØØ—8‘8ØIñ
ð 	
ô �c˜3Ó
×ÐÜ(¨Ó.×.€Hð ‡|�|Ð&Ô'Ü�X—\‘\ 'Ó*ÒK°(·,±,¸{Ó2KÐ.KÓLˆàØ$Ø (Ø#Ø&Ø!Ÿ™ kÓ2Ò8°bÜ" 8§<¡<Ð0AÓ#BÒ#GÀaÓHØØ#Ÿ<™<¨Ó6ÒH¸.Ø%Ÿ\™\¨/Ó:ò mØlÜ §¡¨]Ó ;Ó<Ø"Ÿ,™, |Ó4ÒLÐ8LØ—8‘8ñ ð ñ!
ð 	
ð$ ˜hŸl™lÐ+<Ó=ÒBÀÐCÀ;ÐOñ%
ð 	
ð. �,ÒÔ(>¸tÓ(D×"DÑ"DÜ�q—ˆAÜ—-‘- Ó$×$Ð$Ü0°Ó6×6ˆHØ�|‰|Ð.Õ/Ü˜XŸ\™\¨'Ó2ÒS¸(¿,¹,À{Ó:SÐ6SÓT�à"Ø,Ø(0Ø+Ø#.Ø!)§¡¨kÓ!:Ò!@¸bÜ'*¨8¯<©<Ð8IÓ+JÒ+OÈaÓ'PØ"Ø#+§<¡<°Ó#>Ò#PÀ.Ø%-§\¡\°/Ó%Bò &uØtÜ#'¨¯©°]Ó(CÓ#DØ"*§,¡,¨|Ó"<Ò"TÐ@TØŸ8™8ñ !ñ 'à% h§l¡lÐ3DÓ&EÒ&JÈÐ%KÈ;ÐWñ%ò ð ô8 2°$Ó7×7ÐÜ
�c˜3Ó
×ÐàØ Ø$ØØ'Ø�x‰xØ-ØØœs 8›}˜oÐ-FÐGñ
ð 
ðW  ùØ$ùØ)ùà:ùð  ùØ.ùð8 #Eùà$ùØ6ùð4 8øØúsÇ   ‚L>’L“L>¥L"¦L>¸L%¹L>ÁL(Á(L>Á5L+Á6L>ÂL.Â	DL>ÆL1Æ,L>ÇL4ÇL>ÇL7ÇL>Ç.C5L>Ë#L:Ë$L>Ë7L<Ë8(L>Ì"L>Ì%L>Ì(L>Ì+L>Ì.L>Ì1L>Ì4L>Ì7L>Ì:L>Ì<L>Úplaylist_indicesc              ƒ   óp  K  — t        dd«      ƒ d{  –—†  t        | «      ƒ d{  –—† }|j                  d«      sdd| j                  ddœS |j                  d	«      xs g }|s+d
dd	g ddd|j                  d«      xs dd| j                  ddœS |�|nt	        t        t        |«      «      «      }g }|D ]`  }|dk  s|t        |«      k\  rŒ||   d   }| j                  d|«      ƒ d{  –—† }|sŒ<|j                  |«       t        dd«      ƒ d{  –—†  Œb t        dd«      ƒ d{  –—†  	 t        | «      ƒ d{  –—† }	t        dd«      ƒ d{  –—†  d
d|dd|	| j                  dt        |«      › d�dœS 7 �Œb7 �ŒR7 Œ’7 Œl7 ŒX7 ŒF7 Œ4# t        $ r&}
dd|d| j                  t        |
«      dœcY d}
~
S d}
~
ww xY w­w)zw
    POST /exchange/playlists/select
    Select playlist rows on Choose Playlist(s), then click Next when enabled.
    r„   gÍÌÌÌÌÌì?Nrh   ry   Úplaylist_selectz#Not on the Choose Playlist(s) step.)rO   r{   rP   rW   ri   rN   r   Tr   r€   r�   F)rO   r{   rƒ   ri   rj   r}   r~   r€   r‚   rP   rW   r)   a+  (title) => {
              const root =
                document.querySelector('.multi-step-modal section.step-3') ||
                document.querySelector('.smooth-modal') ||
                document.body;
              const nodes = Array.from(root.querySelectorAll(
                'li, [role="option"], [role="checkbox"], label, [class*="playlist"]'
              ));
              const el = nodes.find(n => (n.innerText || '').includes(title));
              if (!el) return false;
              el.click();
              return true;
            }g333333Ó?rG   rJ   gš™™™™™ù?r…   r†   z playlists and clicked Next.)rO   r{   r|   rƒ   r‚   r‡   rP   rW   )rO   r{   r|   r‚   rP   rW   )r   rl   rr   rP   Úlistr   rX   r<   r[   r   r   Ústr)r	   r�   ru   r=   Úindicesrs   rt   r)   rv   Únext_selÚexcs              r   Úselect_playlistsr•     só  è ø€ ô
 �c˜3Ó
×ÐÜ(¨Ó.×.€HØ�<‰<Ð*Ô+àØ'Ø—8‘8Ø<ñ	
ð 	
ð �<‰<˜Ó$Ò*¨€DÙàØ'Ø&ØØ ØØ)Ø%Ÿ\™\¨/Ó:ò mØlØ Ø—8‘8Ø%ñ
ð 	
ð #3Ð">ÑÄDÌÌsÐSWËyÓIYÓDZ€GØ€HÛˆØ�Š7�cœS ›YÒ&ØØ�S‘	˜'Ñ"ˆØŸ™ðð ó
÷ 
ˆò  Ø�O‰O˜CÔ Ü˜c 3Ó'×'Ñ'ð- ô0 �c˜3Ó
×Ðð
Ü,¨TÓ2×2ˆÜ˜#˜sÓ#×#Ð#àØ'Ø (Ø+ØØ (Ø—8‘8Ø"¤3 x£= /Ð1MÐNñ	
ð 		
ðs  ùØ.ùð@
øð$ (øàøà2øØ#ùô ò 
àØ'Ø (Ø Ø—8‘8Ü˜3“xñ
õ 	
ûð
üs°   ‚F6’E4“F6¥E7¦CF6Ã'E:Ã(F6Ã/ F6ÄE<ÄF6Ä%E>Ä&F6Ä+F Ä9F Ä:F ÅFÅ%F Å3F6Å7F6Å:F6Å<F6Å>F6Æ F ÆF Æ	F3ÆF.Æ(F3Æ)F6Æ.F3Æ3F6)N)Ú__doc__rY   r0   Úplaywright.async_apir   r   Úapp.automation.helpersr   r   Úapp.automation.selectorsr   r   r   r,   rˆ   r   r"   r‰   Údictr9   r�   r>   rD   re   r‘   r\   rl   rw   rŒ   r•   © ó    r   Ú<module>r�      sn  ðñ	ó Û 	ç .ç CÝ 5ðÐ ð ØØØ!ØðÐ ð	Ð ð tð °ó ð Tð ¨g¸©nó ðD', ð ',°ð ',¸¸t¹ó ',ðTA dð A¨t°D©zó AðH Tð ¨dó ð_˜tð _¨ó _ðD ð ¨ó ð@V Dð @V¨Tó @VðF3 ð 3°d¸3±ið 3ÀDÈÁIó 3ðl]˜dð ]°4¸±9ð ]Àó ]ñ@P
 ð P
¸¸c¹ÀTÑ9Ið P
ÐUYô P
rœ   