
    Qi                     b    d Z ddlZddlZddlmZ dZdZe dZg Zd
dZ	d Z
ed	k(  r e
        yy)u  
Task-1933: QA Test - Naver Blog Dashboard
아르고스 QA Tester
Tests: Blog Generate Form UI (Step 1), Competition Analysis Form UI (Step 2),
       History Detail (Success Item), API Endpoint Checks

Strategy:
- Navigate to dashboard and Naver Blog tab
- Use keyword history to navigate into Step 1 form (click a keyword analysis history item,
  then proceed to "글 생성으로" from the detail panel)
- All 4 screenshots + API tests
    N)sync_playwrightz8/home/jay/workspace/memory/reports/task-1933-screenshotszhttp://localhost:8000z/dashboard/c                     ddddj                  |d      }| d|  }|r|d| z  }t        |       t        j                  | ||d       y )	N[PASS][FAIL][WARN])PASSFAILWARNz[INFO]     — )labelstatusdetail)getprintresultsappend)r   r   r   iconmsgs        K/home/jay/workspace/memory/reports/task-1933-screenshots/test_naver_blog.py
log_resultr      sY    hAEEfhWDF!E7
Cvh	#JNNUfGH    c                  4  )TU t               5 } | j                  j                  d      }|j                  ddd      }|j	                         }t        d       t        d       t        d       t        d	       t        d
       	 |j                  t        dd       t        j                  d       |j                  d      j                  }|j                          t        j                  d       t        dd       	 |j                  d      j                  }|j                          t        j                  d       |j                  d      j                  }|j                  d      j#                         }|r|d   j                          n|j%                  d       t        j                  d       d}	dD ]_  }
	 |j                  d|
 d|
       j                  }|j'                  d       r)|j                          d}	t        j                  d        na |	rt        d!       n]t        d"       |j                  d#      j                  }|j'                  d$       r%|j                          t        j                  d       	 d}g d&}|D ]  }	 |j                  |      j#                         }|D ]Y  }|j)                         xs d'j+                         Ud(Uv s*d)Uvs/d*Uvs4|j'                  d       sG|j                          d} n |r n t        j                  d       |rt        d+d       n7|j-                  d,      Td-Tv sd.Tv sd/Tv rt        d0d       nt        d+d1d2       t        j                  d       	 |j/                  t0         d3d4       t        d5d       |j-                  d,      Tt        d6Td d7 j3                  t5        d8      d9              	 |j                  d:      j                  }d}	 |j'                  d;       }|rt        d<d       nd-Tv rt        d=dd>       nt        d?d1d@       	 |j                  dA      j#                         }d}|D ]\  }	 |j7                  dB      xs d'}|j%                  dC|j9                               }dD|v sdD|v sdE|v rd}t        dFddG|d dH  dI        n^ |sft;        |      }|dkD  rIg }|d d D ]+  }|j7                  dB      xs dJ}|j=                  |d dK        - t        dLd1dM| dN|        nt        dLddO       	 |j                  dP      j#                         }d }g }|D ]+  }	 |j%                  dQ|j9                               }d.|v r|} n- |+t;        |      dk\  r|d   }t        dRt;        |       dS       |rh|j                  dT      j#                         } | D !cg c]   }!|!j)                         j+                         " }}!t        dUt;        |       dVddW|        nt        dXddY       	 |j                  dP      j#                         }d }"g }#|D ]=  }	 |j%                  d[|j9                               }d/|v sd\|j?                         v r|}" n? |"t;        |      dk\  r|d   }"n|"t;        |      dk(  r|d   }"|"rt|"|r|d   nd k7  rh|"j                  dT      j#                         } | D !cg c]   }!|!j)                         j+                         " }#}!t        d]t;        |#       dVddW|#        nt;        |      dk(  rt        d^dd_       nj|d`   j                  dT      j#                         } | D !cg c]   }!|!j)                         j+                         " }#}!t        d]t;        |#       dVddW|#        	 d}$g db}%|%D ]@  }	 |j                  |      j                  }|j'                  dc       rd}$t        ddd        nB |$s|j                  de      j#                         }&|&D 'cg c]$  }'|'j)                         xs d'j+                         & }(}'|(D )cg c]  })df|)v sdg|)v sdh|)v s|) }*})|*rt        di|* dSd       nt        djd1dk|(d dl         	 d}+g dm},|,D ]f  }	 |j                  |      j                  }|j'                  d       r6|j)                         xs d'j+                         }
t        dn|
 dod       d}+ nh |+s|j                  de      j#                         }&g }-|&D ]J  }'|'j)                         xs d'j+                         UtA        UfdpdqD              s:|-j=                  U       L |-rt        dr|-d d  dSd       nt        dsd1dt       	 |j%                  dv       t        j                  d       |j/                  t0         dwd4       t        dxd       t        dy       t        d
       	 |j%                  dz       t        j                  d{       d}.g d|}/|/D ]z  }	 |j                  |      j#                         }|D ]O  }|j)                         xs d'j+                         Ud}Uv s*|j'                  d       s=|j                          d}. n |.r n| t        j                  d       |.rt        d~d       nt        d~d1d       t        j                  d       	 |j/                  t0         dd4       t        dd       |j-                  d,      T	 |j                  d      j                  }d}	 |j'                  d$       }|rt        dd       n5dTv rt        ddd       n#d}Tv rdgTv rt        dd1d       nt        ddd       	 d}0dD ]`  }	 |j                  |      j                  }|j'                  d       r0d}0t        d|j)                         j+                          dod        nb |0s|j                  de      j#                         }&|&D 'cg c]$  }'|'j)                         xs d'j+                         & }(}'|(D )cg c]  })dg|)v sd)|)v sdg|)v s|) }1})|1rt        d|1d d  dSd       nt        dd1d|(d dl         	 d}$dD ]`  }	 |j                  |      j                  }|j'                  d       r0d}$t        d|j)                         j+                          dod        nb |$s|j                  de      j#                         }&|&D 'cg c]$  }'|'j)                         xs d'j+                         & }(}'|(D )cg c]  })d(|)v sd|)v s|) }*})|*rt        d|* dSd       nt        dd1d|(d dl         t        d       t        d
       	 |j%                  dz       t        j                  d       d}2dD ]  }	 |j                  |      j#                         }|D ]T  }|j)                         xs d'j+                         UdUv sUdk(  s/|j'                  d       sB|j                          d}2 n |2r n t        j                  d       	 |j                  d      j                  }3|3j'                  d$       r|3jC                  d;        t        j                  d{       t        d|2rdnd1|2rd'nd       	 d}4dD ]S  }	 |j                  |      j#                         }|D ](  }|j'                  d       s|j                          d}4 n |4r nU t        j                  d       t        d|4rdnd1|4rd'nd       	 d}5d'}6|j%                  d      }7t        d|7d d         g d}8|8D ]  }9	 |j                  d|9       j#                         }|D ]W  }|j%                  d|j9                               }d|vs(d|vs-|j'                  d       s@|j                          d}5|d dH }6 n |5r n |5s|j                  d      j#                         }:|:d d D ]j  };	 |;j)                         xs d'j+                         Ut;        U      dkD  r7dUvr3dUvr/dUvr+|;j'                  d       r|;j                          d}5Ud dH }6 nl t        j                  d       |5rt        d|6 dod       nt        dd1d       	 t        j                  d       |j/                  t0         dd4       t        dd       |j-                  d,      T	 g d}<tA        Tfd|<D              }=|=rt        dd       nt        dd1d       	 g d}>tA        Tfd|>D              }?|?r(|>D @cg c]	  }@|@Tv s@ }A}@t        ddd|Ad d         nt        dd1d       	 d}Bg d}Cd'}D|CD ]V  }	 |j                  |      j                  }|j'                  d       r&|j)                         xs d'j+                         }Dd}B nX Brt        dD dod       n|j                  de      j#                         }&|&D 'cg c]$  }'|'j)                         xs d'j+                         & }E}'|ED ))cg c]  )tA        )fddD              s) }F})|Frt        dFd d  dod1dū       nt        dd1dEd d         t        dɫ       t        d
       ddd̜ddd̜ddd̜ddd̜g}G|GD ]  }H	 |j%                  dtD         Hd    d՝      }I|IjG                  dd      }J|IjG                  dd'      }Kt        d|Hd           t        d|J d|K        |Jd7k(  rt        dHd    ddJ dK        n5Jdk(  rt        dHd    ddK        nt        dHd    d1dJ dK         t        d߫       t        d       t        d       tI        d tJ        D              }LtI        d tJ        D              }MtI        d tJ        D              }Nt;        tJ              }OtJ        D ]=  }P|Pd   dk(  rdnPd   dk(  rdnd}QPd   rdPd    nd'}Rt        dQ d9Pd    |R        ? t                t        dL dO dM dN d	       t                t        dt0         d       dD ]  }St        d|S         |j!                          d d d        y # t        $ r8}t        ddt        |             |j!                          Y d }~d d d        y d }~ww xY w#  Y ZxY w# t        $ r}t        d%|        Y d }~d }~ww xY w#  Y xY w# t        $ r!}t        d+d1t        |             Y d }~d }~ww xY w# t        $ r!}t        d5dt        |             Y d }~d }~ww xY w#  Y xY w# t        $ r!}t        d?dt        |             Y d }~d }~ww xY w#  Y lxY w# t        $ r!}t        dLdt        |             Y d }~d }~ww xY w#  Y xY wc c}!w # t        $ r!}t        dZdt        |             Y d }~d }~ww xY w#  Y xY wc c}!w c c}!w # t        $ r!}t        dadt        |             Y d }~d }~ww xY w#  Y xY wc c}'w c c})w # t        $ r!}t        djdt        |             Y d }~!d }~ww xY w#  Y %xY w# t        $ r!}t        dudt        |             Y d }~Od }~ww xY w# t        $ r!}t        dxdt        |             Y d }~/d }~ww xY w#  Y xY w# t        $ r!}t        d~d1t        |             Y d }~qd }~ww xY w# t        $ r!}t        ddt        |             Y d }~bd }~ww xY w#  Y -xY w# t        $ r!}t        ddt        |             Y d }~d }~ww xY w#  Y xY wc c}'w c c})w # t        $ r!}t        ddt        |             Y d }~Rd }~ww xY w#  Y ZxY wc c}'w c c})w # t        $ r!}t        ddt        |             Y d }~
d }~ww xY w#  Y 
gxY w#  |j%                  d       Y 	xY w# t        $ r!}t        dd1t        |             Y d }~	d }~ww xY w#  Y 	xY w# t        $ r!}t        dd1t        |             Y d }~	Wd }~ww xY w#  Y 	7xY w#  Y xY w# t        $ r!}t        dd1t        |             Y d }~d }~ww xY w# t        $ r!}t        ddt        |             Y d }~d }~ww xY w# t        $ r!}t        ddt        |             Y d }~d }~ww xY wc c}@w # t        $ r!}t        ddt        |             Y d }~d }~ww xY w#  Y xY wc c}'w c c})w # t        $ r!}t        ddt        |             Y d }~d }~ww xY w# t        $ r'}t        dHd    dt        |             Y d }~d }~ww xY w# 1 sw Y   y xY w)NT)headlessi  i  )widthheight)viewportzF======================================================================u9   아르고스 QA — Naver Blog Dashboard Test (Task-1933)z(
[Part A] Blog Generate Form UI (Step 1)z2--------------------------------------------------domcontentloadedi:  )
wait_untiltimeout   u   text=네이버블로그   uC   A-1: Navigate to dashboard + click 네이버블로그 tab (wait 3s)r   u9   A-1: Navigate to dashboard + click 네이버블로그 tabr	      text=키워드분석z+li, [class*='history'] div, [class*='item']u$   text=실손보험, text=인카금융r   a  () => {
                    const items = document.querySelectorAll('li, [class*="history-item"], [class*="item"]');
                    for (const item of items) {
                        if (item.textContent && item.textContent.trim().length > 3) {
                            item.click();
                            break;
                        }
                    }
                }   F)u   글 생성으로u   이 키워드로 글u	   글작성u
   글 작성u   1글 생성zbutton:has-text('z	'), text=i  )r    z;  [INFO] Navigated to Step 1 via keyword history item clickzQ  [WARN] Could not navigate to Step 1 via history, trying step indicator directlyuE   button:has-text('글 생성'), [class*='step']:has-text('글 생성')i  z)  [WARN] Pre-navigation to step 1 issue: )   button:has-text('글 생성')u-   [class*='step'] button:has-text('글 생성')u   text=글 생성 
   글 생성   시작u   ← u0   A-2: Click Step 1 '글 생성' in step indicatorbodyu   확정된 키워드u   어투u   모델u,   A-2: Step 1 '글 생성' form already activer
   zXCould not click step 1; may be step indicator is disabled without prior keyword analysisz/06_generate_form_top.png)path	full_pagez(A-3: Screenshot 06_generate_form_top.pngz  [DEBUG] Page text sample:    
   r   u   text=확정된 키워드 순위i  u2   A-4a: '확정된 키워드 순위' section presentu;   A-4a: '확정된 키워드 순위' section present (in DOM)zBText found in page but element may be in shadow DOM or virtual DOMu*   A-4a: '확정된 키워드 순위' sectionuO   Not visible — Step 1 form requires completing keyword analysis first (Step 0)textareaplaceholderu  (el) => {
                        let p = el.closest('[class]') || el.parentElement;
                        for (let i = 0; i < 5; i++) {
                            if (p) {
                                const t = p.textContent || '';
                                if (t.includes('추가')) return t.trim().substring(0, 150);
                                p = p.parentElement;
                            }
                        }
                        return '';
                    }u   추가u   선택u,   A-4b: '추가 내용(선택)' textarea foundzplaceholder: '<   'z(none)(   u&   A-4b: '추가 내용(선택)' textareazFound u=    textarea(s) but none labeled '추가 내용'. Placeholders: uN   No textarea found — Step 1 form only appears after keyword analysis workflowselectu  (el) => {
                        let p = el.closest('[class]') || el.parentElement;
                        for (let i = 0; i < 5; i++) {
                            if (p) {
                                const t = p.textContent || '';
                                if (t.includes('어투')) return t.trim().substring(0, 200);
                                p = p.parentElement;
                            }
                        }
                        return '';
                    }zF  [DEBUG] Using first select element as tone dropdown (total selects: )optionu#   A-4c: '어투 선택' dropdown — z optionsz	Options: u/   A-4c: '어투 선택' dropdown (select element)u}   No <select> elements found on page — form likely not rendered yet. Step 1 form requires keyword analysis to complete first.u   A-4c: '어투 선택' dropdownu  (el) => {
                        let p = el.closest('[class]') || el.parentElement;
                        for (let i = 0; i < 5; i++) {
                            if (p) {
                                const t = p.textContent || '';
                                if (t.includes('모델') || t.includes('model') || t.includes('Model')) return t.trim().substring(0, 200);
                                p = p.parentElement;
                            }
                        }
                        return '';
                    }modelu#   A-4d: '생성 모델' dropdown — u/   A-4d: '생성 모델' dropdown (select element)uT   No <select> elements found — Step 1 form not rendered (requires Step 0 completion)u   A-4d: '생성 모델' dropdown)u   text=키워드 분석으로u   text=← 키워드u)   button:has-text('키워드 분석으로')u   button:has-text('분석으로')i  u6   A-4e: '← 키워드 분석으로' back button presentbutton	   키워드u   분석u   ←zA-4e: Back button (found: u.   A-4e: '← 키워드 분석으로' back buttonuD   Not visible — may only appear when on Step 1 form. Buttons found:    )u$   button:has-text('글 생성 시작')u    button:has-text('생성 시작')r%   u   button:has-text('생성하기')u    button:has-text('작성 시작')z A-4f: Generate button present ('z')c              3   &   K   | ]  }|v  
 y wN ).0kwtxts     r   	<genexpr>zrun_tests.<locals>.<genexpr>t  s     `29`   )u   생성 시작r'   u   작성 시작zA-4f: Generate button (found: u4   A-4f: '글 생성 시작' or similar generate buttonuJ   Not visible — Step 1 generate button only appears after keyword analysiszA-4f: Generate buttonz.window.scrollTo(0, document.body.scrollHeight)z/06_generate_form_bottom.pngz9A-5: Scroll down + screenshot 06_generate_form_bottom.pngz/
[Part B] Competition Analysis Form UI (Step 2)zwindow.scrollTo(0, 0)g      ?)u    button:has-text('경쟁 분석')u   button:has-text('경쟁분석')u   text=경쟁 분석z[class*='step'] button   경쟁u!   B-6: Click Step 2 '경쟁 분석'u?   Step 2 button not found — may require Step 1 completion firstz/07_competition_form.pngz'B-7: Screenshot 07_competition_form.pngu#   text=경쟁 분석 대상 키워드u6   B-8a: '경쟁 분석 대상 키워드' section presentu   경쟁 분석 대상 키워드u5   B-8a: '경쟁 분석 대상 키워드' section in DOMz*Found in page text (may be in virtual DOM)u.   B-8a: '경쟁 분석 대상 키워드' sectionzFExact text not found, but competition-analysis content present in pageuA   Not found — Step 2 form requires completing Steps 0 and 1 first)u    button:has-text('분석 시작')u   button:has-text('분석시작')u'   button:has-text('경쟁 분석 시작')u'   B-8b: '분석 시작' button present ('z$B-8b: Analysis start button (found: u   B-8b: '분석 시작' buttonzNot found. Available buttons: )#   button:has-text('글 생성으로')u   text=← 글 생성u   button:has-text('← 글')rD   u3   B-8c: '← 글 생성으로' back button present ('u   생성으로z#B-8c: Back button to write (found: u(   B-8c: '← 글 생성으로' back buttonzNot found. Buttons: u)   
[Part C] History Detail — Success Itemg333333?)#   button:has-text('키워드 분석')   text=키워드 분석z[data-step='0']zbutton:has-text('0')u   키워드 분석0g      ?u   text=히스토리zwindow.scrollTo(0, 400)z3C-9: Navigate to Step 0 + scroll to history sectionzStep 0 click not confirmedz+C-9: Navigate to Step 0 + scroll to history)r#   rF   u"   button:has-text('키워드분석')rE   u,   C-10: Click '키워드분석' tab in historyz,Tab not found; may already be on keyword tabuT  () => {
                const rows = [];
                // Look for list items in history section
                const histSection = document.querySelector('[class*="history"]') ||
                                   document.querySelector('section') ||
                                   document.body;
                const items = histSection.querySelectorAll('li, [class*="item"], [class*="row"]');
                for (const item of items) {
                    const text = item.textContent ? item.textContent.trim().substring(0, 100) : '';
                    const isFailure = text.includes('❌') || text.includes('실패') || text.includes('✕');
                    if (!isFailure && text.length > 3) {
                        rows.push(text);
                    }
                }
                return rows.slice(0, 10);
            }z+  [DEBUG] Potential success history items:    )u   실손보험u   인카금융u   티오피사업단u   수원ztext=z(el) => {
                            const p = el.closest('li') || el.closest('[class*="item"]') || el.parentElement;
                            return p ? p.textContent.trim().substring(0, 100) : '';
                        }u   실패u   ❌li   u   ✕i  z/C-11: Found and clicked SUCCESS history item ('z,C-11: Found and clicked SUCCESS history itemz'Could not identify/click a success itemz/08_history_success_detail.pngz.C-12: Screenshot 08_history_success_detail.png)r9   keywordu   분석 키워드u   선택 키워드   순위u   확정c              3   ^   K   | ]$  }|j                         j                         v  & y wr<   )lower)r>   r?   	page_texts     r   rA   zrun_tests.<locals>.<genexpr>  s#     Sr288:)::Ss   *-z+C-13a: Detail panel shows selected keywordsz0Keyword info not clearly visible in detail panelzC-13a: Detail panel keywords)rL   u	   검색량u   조회u   월간rC   u	   월평균PCu	   모바일c              3   &   K   | ]  }|v  
 y wr<   r=   )r>   wrO   s     r   rA   zrun_tests.<locals>.<genexpr>  s      MAi MrB   z'C-13b: Detail panel shows analysis datazFound:    z!C-13b: Detail panel analysis dataz-Analysis data fields not visible in page text)u#   text=이 키워드로 글 재생성u   button:has-text('재생성')u#   button:has-text('이 키워드로')u    button:has-text('글 재생성')u   button:has-text('글 작성')u   button:has-text('글작성')r%   u9   C-13c: '이 키워드로 글 재생성' button present ('c              3   &   K   | ]  }|v  
 y wr<   r=   )r>   r?   ts     r   rA   zrun_tests.<locals>.<genexpr>  s     =|"bAg=|rB   )u   생성u   작성r(   u	   재생성z(C-13c: Write/generate buttons visible ('uJ   Exact '이 키워드로 글 재생성' not found but similar buttons existu.   C-13c: '이 키워드로 글 재생성' buttonzKButton not found. May need to open a specific history detail. All buttons:    z
[Part D] API Endpoint Checksz /api/naver-blog/history/keywordsz$GET /api/naver-blog/history/keywords)urlr   z /api/naver-blog/history/contentsz$GET /api/naver-blog/history/contentsz$/api/naver-blog/history/competitionsz(GET /api/naver-blog/history/competitionsz/api/naver-blog/write/statusz GET /api/naver-blog/write/statuszZasync () => {
                    try {
                        const resp = await fetch('rW   uP  ');
                        const status = resp.status;
                        let summary = '';
                        try {
                            const body = await resp.json();
                            if (Array.isArray(body)) {
                                summary = `array[${body.length} items]`;
                            } else if (body && typeof body === 'object') {
                                const keys = Object.keys(body).slice(0, 6).join(', ');
                                summary = `{${keys}}`;
                                if (body.items && Array.isArray(body.items)) {
                                    summary += ` — ${body.items.length} items`;
                                }
                                if (body.status !== undefined) {
                                    summary += ` — status=${body.status}`;
                                }
                            } else {
                                summary = String(body).substring(0, 100);
                            }
                        } catch(e) {
                            summary = 'non-JSON response';
                        }
                        return { status, summary };
                    } catch(e) {
                        return { status: 0, summary: e.toString() };
                    }
                }r   summaryz  r   u       → HTTP z | zD: zHTTP zNetwork error: zG
======================================================================zFINAL TEST SUMMARYc              3   2   K   | ]  }|d    dk(  sd  yw)r   r   r!   Nr=   r>   rs     r   rA   zrun_tests.<locals>.<genexpr>       F(v0E!F   c              3   2   K   | ]  }|d    dk(  sd  yw)r   r
   r!   Nr=   rZ   s     r   rA   zrun_tests.<locals>.<genexpr>  r\   r]   c              3   2   K   | ]  }|d    dk(  sd  yw)r   r	   r!   Nr=   rZ   s     r   rA   zrun_tests.<locals>.<genexpr>  r\   r]   r   r   r   r   r   z	Results: /z PASS | z WARN | z FAILzScreenshots saved to: )z06_generate_form_top.pngz06_generate_form_bottom.pngz07_competition_form.pngz08_history_success_detail.pngz  - )&r   chromiumlaunchnew_contextnew_pager   gotoDASHBOARD_URLtimesleeplocatorfirstclickr   	Exceptionstrcloseallevaluate
is_visibletext_contentstrip
inner_text
screenshotSCREENSHOT_DIRreplacechrget_attributeelement_handlelenr   rN   anyscroll_into_view_if_neededBASE_URLr   sumr   )Vpbrowsercontextpage	naver_tabekw_tab
first_itemkw_itemsnav_to_step1btn_textbtn	step1_btnstep1_clickedstep_selectorsselelselvisibleall_textareasfound_additionaltar/   parent_textcountplaceholdersphall_selectstone_selecttone_optionssel_el
parent_txtoptionsoptmodel_selectmodel_options
back_foundback_selectorsbuttonsb	btn_textsrU   back_candidates	gen_foundgen_selectorsgen_candidatesstep2_clickedselectors_step2start_foundstart_candidatesstep0_clickedhist_elkw_tab_clickedsuccess_clickedclicked_item_texthistory_rowskeyword_textskw_textall_lirI   kw_indicatorskw_foundanalysis_indicatorsanalysis_foundrR   found_itemsregen_foundregen_selectorsfound_btn_textall_btn_texts
write_btnsapi_endpointsepresultr   rX   
pass_count
warn_count
fail_counttotalr[   r   r   frO   r@   sV                                            `                                          @@r   	run_testsr   "   s   		 Ia**##T#2%%/M%N!hIJh
 	9:h
	IIm0BEIRJJqM%>?EEIOOJJqM\^de0	C\\"89??FLLNJJqM&STZZJ||$JKOOQH!!#    JJqM !Lr 	,,):8*IhZ'XY__C~~d~3		'+

1	 4	 STij LL)pqww	'''5OO%JJqM$	[!MN
 & ,,s+//1C! &!06B==?'3.833F6Y\K\!}}T}: "
04 %& % % JJqMMvV !OOF3	(I5Y9NRZ^gRgMvVQSYy{ 	

1	SOON#33L!MY^O_A6J
 OOF+	,Yt_-D-DSWc-R,STU	U?@FFBG---5 OQWX&)3XZ`_a Gln%	Q LL488:M$# "$"2"2="A"GRK"&-- 
1 ++-
#/K  ;.(k2IXYdMd+/("%QTZ%3K4D3EQ#GI	 Ne* $M*19#%L+BQ/ 5--m<H$++BsG45 !G&!'w.klxkyz| Goq&	I,,x0446KKL% !% 
0 !//1
"3J  :-&, .& "s;'71'<)!n^_bcn_o^ppqrs%--h7;;=FMNs 0 0 2 8 8 :NN@\AR@SS[\^d&|n57 LfVX,	I,,x0446KLM% !% 
0 !//1
"3J  :-J<L<L<N1N'- 2O& #K(8A(=*1~%#k*:a*?*1~;QTX Y&..x8<<>GN O!1!1!3!9!9!; O O@]AS@TT\]_e&}o68[!Q&Lfqs &b/11(;??AGN O!1!1!3!9!9!; O O@]AS@TT\]_e&}o68	YJN & c*00B}}T}2%)
"#[]cd 3 ,,x0446GNO!ann.4";;=O	O.7"n;!;KQY]^Q^bgklbl1"n"n"!;O;LANPVWOQW!efoprqrfsetuw!	@IM % 	c*00B}}T}2$&OO$5$;#B#B#D"%EhZr#RTZ[$(		 3	 ,,x0446!#  3A>>+1r88:C`/_``&--c23 "!?rPQ@R?SSTUW]^UW]km	dMMJKJJqMOON#33O!P\aObRTZ[ 	@Ah 	LMM12JJsO!MO ' ,,s+//1C! &!06B==?#s?!}}T}: "
04 %& % % JJqM>G>\^ 	

1	ROON#33K!LX]O^@&I OOF+		YCDJJBG---5 SU[\1Y>RTZGIY&8y+@KVce KV^`	GK J c*00B}}T}2&*"%LR__M^MdMdMfLggi#jlrs 3 ,,x0446GNO!ann.4";;=O	O/8#o!HMx[\}`hlm`mA#o #o#!EFVWYXYFZE[[\]_ef=v!?	"1OQ	SJ [ c*00B}}T}2%)
"%XY[YhYhYjYpYpYrXssu#vx~ 3 ,,x0446GNO!ann.4";;=O	O.7"d<1;LP^bcPc1"d"d"!D_DUUVWY_`I6!5im_EG 	:;h"	VMM12JJsO!M0 ,,s+//1C! &!06B==?-4s
!}}T}: "
04 %& % % JJsO9,,':;AA%%d%366t6D JJsOLXefkq*r0LN	W"Ne 
,,s+//1C! "===6HHJ-1N!	"
 & & JJsOEQ_vek+r1_aG	W#O "  == * L  ?Ra@P?QRS ]M( ,,wi'89==?C! 
&%)]] 4 !//1&3
 $:5%z:Q!}}T}: "
264>sO 1 %
& ' '& #d+//1 "+ 
B	!06B==?s8a<E,<QTATY^fiYi!}}S}9 "
2647H 1 %
 JJqMLM^L__abdjkI6DF	YJJqMOON#33Q!R^cOdGP
 OOF+			GpMS]SSHH&QH&MO	L"w  M9L MMN*=PQiqPPDf$[!_$568 >JL$	YKO  N& c*00B}}T}2*,//*;*Ar)H)H)J&* 3 VWeVffhikqr ,,x0446KR Sa!.."2"8b!?!?!A S S)6}A#=|P{=|:|a}
}!I*UWVW.IYY[\^dkm OQW!lmz{}|}m~l   AB 	./h 7Djk6Djk:Dno2Dfg	
   ,	@B+@ ,33;*RYK H( <  Ha0 **Y32g;-()fXS	:;S=R[M2FeF83wi<XYq[R[M2FogY<WXR[M2FeF83wi<XYU,	@b 	o"#hFWFF
FWFF
FWFF
'l 	4A {f48akU[F[(aiD./kuQx[M*rFBtfAaj\&23	4
 		*QugXj\*UZ[\&~&6a89N 	AD*	 	SI I.  	RTZ\_`a\bcMMO5I I.	T  	C=aSABB	C2  	[I6SVWXSYZZ	[  	SA63q6RR	S  	UCVSQRVTT	U4  	Q?QPP	Q2  O  	I7QHH	I2 !P !P  	I7QHH	I& P"n  	YGQTUVQWXX	Y*  	@.A??	@  	dRTZ\_`a\bcc	d@  	L:FCFKK	L  	R@&#a&QQ	R  	YGQTUVQWXX	Y P#o  	G5vs1vFF	G P"d  	SA63q6RR	S8978
  	VDfcRSfUU	V"  	WEvsSTvVV	Wf  	WEvsSTvVV	W  	YGQTUVQWXX	Y  	G5vs1vFF	G Q  	L:FCFKK	L. !T}  	YGQTUVQWXX	Yv  @SG.A??@[I Is;  A9Ag7A9ASB=AT AATA/AT
AUA
AT>!AT>&AT>+AT>>AT>AAU4Ag7
&AU30;Ag7,AV(
AV .AV(&AW2AAW	A,AW6(AX&AX
AAX%AX -AX.(AY8AYA AY/%AYA"AY6%AYAY;AZ;AZ)AZ+)AZAZ	AZ$AZ-AZ1(AZA[
&A!A[A"A[
*6A[
!AA[7-Ag71A\,6A
A\$A\$A\$+5A\, Ag76&A]Ag7.A^A^AA^#A_+AA^;)A_/)A_A_	A_(A_1A_5+A_!A`)AA_:)A`-)A`A`A`*A`.(A`Ag7--AaAA`9+A`9>A`9Aa/?Aa.*AaAb!6AbAb/.Ab/AcAAb<Ab<Ab<2Ab<@-Ac@<A%AcB!9AcC;Ac9DAg7D(4Ad&EAeE;	AeFAeF	#AeF-AfF;AAfH:AfI)AfI/AfI6AfJAfJ,AfK -Ag7K.B8AgN&DAg7S	ATS&AT	S<Ag7T	ATTAg7TATTATT	AT;T"AT6T0Ag7T6AT;T;Ag7T>AUU AUU	AU0UAU+U%Ag7U+AU0U0Ag7U3	AVU<AVVAg7VAVVAg7V AV%V"AV(V(	AWV1AWWAg7WAWWAg7WAWWAWW	AXW&AXW<Ag7XAXXAg7X
AXXAXX	AYX AX<X6Ag7X<AYYAg7YAY	YAYY	AZ YAY;Y5Ag7Y;AZ Z Ag7ZAZZAZZ	AZ?ZAZ:Z4Ag7Z:AZ?Z?Ag7[A[[A[
[
	A[4[A[/[)Ag7[/A[4[4Ag7[7	A\!\ A\\Ag7\A\!\!Ag7\$A\)\&A\,\,	A]\5A]]Ag7]A]]Ag7]	A^]"A]>]8Ag7]>A^^Ag7^A^^A^^	A^8^A^3^-Ag7^3A^8^8Ag7^;A_ ^=A__	A_7_A_2_,Ag7_2A_7_7Ag7_:A_?_<A``	A`6`A`1`+Ag7`1A`6`6Ag7`9A`>`;AaaAaaAaa	Aba#Aa?a9Ag7a?AbbAg7bAbb	Abb	Ab9bAb4b.Ag7b4Ab9b9Ag7b<Acb>AccAc	cAcc	Ac6cAc1c+Ag7c1Ac6c6Ag7c9	Ad#dAddAg7dAd#d#Ag7d&	Aed/AeeAg7eAeeAg7eAee	Afe!Ae=e7Ag7e=AffAg7fAf
fAff	Agf Af<f6Ag7f<AggAg7g	Ag4gAg/g)Ag7g/Ag4g4Ag7g7Ah __main__)r&   )__doc__rg   jsonplaywright.sync_apir   rv   r~   rf   r   r   r   __name__r=   r   r   <module>r      sQ      /K"*K(
IJZ zK r   