§
    hÓÁjf  ã                   óÂ  — d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
ddlmZ ddlmZmZmZmZ ddlZddlmZmZmZmZ  ee	j        d¦  «        re	j                             d¬¦  «          ee	j        d¦  «        re	j                             d¬¦  «         ej                             d	d
¦  «        Ze› d�Z ed¦  «        Z e  !                    dd¬¦  «         dZ"dZ#dZ$d$dede%ddfd„Z& ej'        d¬¦  «        d„ ¦   «         Z(d„ Z)ej*         +                    dg d¢¦  «        d„ ¦   «         Z,ej*         +                    dg d¢¦  «        d „ ¦   «         Z-d!„ Z.d"„ Z/d#„ Z0dS )%a_  Adversarial Stress Test Suite for Milestone 2 (Site Diary Dock, Zero Occlusion & Mobile Resize Guard).

Empirical Challenger 2 Test Harness targeting:
1. 50x expansion and collapse toggle stress test:
   - Validates dock height toggles between 195px (expanded) and 32px (collapsed).
   - Validates layout stability without layout flickering (CLS, width thrashing, scrollbar shift).
   - Validates rapid click burst resilience (race condition resistance).
2. Zero Occlusion verification:
   - Bounding client rects of #siteDiaryDock, #player4DDock, and .sidebar.
   - Asserts dockRect.right <= sidebarRect.left at all times across diverse viewports.
   - Asserts zero pixel overlap between dock and sidebar.
3. Mobile viewport resize down to 375x667 (and extreme 320x568):
   - Verifies camera.aspect does NOT produce NaN or Infinity (verifying Challenger 1's safeguard patch).
   - Verifies Three.js projectionMatrix elements are all finite and non-NaN.
   - Verifies WebGL render loop stability on mobile screen sizes.
4. Check 5 & Check 6 Playwright test integration and console error audit (0 errors, 0 exceptions).
é    N)ÚPath)ÚAnyÚDictÚListÚTuple)ÚBrowserÚBrowserContextÚPageÚsync_playwrightÚreconfigurezutf-8)ÚencodingÚTEST_BASE_URLzhttp://127.0.0.1:8000z/static/bim/index.htmlzreports/stress_m2T)ÚparentsÚexist_okg     `h@g      @@g      ð?é N  ÚpageÚ
timeout_msÚreturnc                 óÞ   — |                       d¦  «        }|r	d| j        vrL|                      t          d|¬¦  «         |                      dd|¬¦  «         |                      d¦  «         dS dS )	z3Ensures page is loaded and WebGL canvas is mounted.ú#webgl-container canvasz
index.htmlÚload©Ú
wait_untilÚtimeoutÚvisible©Ústater   iè  N)Úquery_selectorÚurlÚgotoÚBIM_URLÚwait_for_selectorÚwait_for_timeout)r   r   Úcanvass      úLC:\Projects\DSCons\tools\verification\test_adversarial_m2_dock_and_resize.pyÚensure_page_readyr&   -   s�   € à× Ò Ð!:Ñ;Ô;€FØð $�\¨¬Ð1Ð1Ø�	Š	•' f°jˆ	ÑAÔAÐAØ×ÒÐ8À	ÐS]ÐÑ^Ô^Ð^Ø×Ò˜dÑ#Ô#Ð#Ð#Ð#ð 2Ð1ó    Úmodule)Úscopec               #   ó®  ‡	‡
K  — t          ¦   «         5 } g d¢}d}dD ]2}	 d|dœ}|r||d<    | j        j        di |¤Ž} n# t          $ r Y Œ/w xY w|s| j                             d|¬¦  «        }|                     ddd	œd
¬¦  «        }|                     ¦   «         }g Š	g Š
ˆ	fd„}ˆ
fd„}|                     d|¦  «         |                     d|¦  «         |                     t          dd¬¦  «         | 	                    ddd¬¦  «         | 
                    d¦  «         |||‰	‰
dœV — |                     ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )z9Launches Playwright headless Chromium with WebGL enabled.)z%--disable-background-timer-throttlingz(--disable-backgrounding-occluded-windowsz --disable-renderer-backgroundingz--ignore-gpu-blocklistz--enable-webglz--enable-gpu-rasterizationN)ÚchromeNT)ÚheadlessÚargsÚchannelé   é„  ©ÚwidthÚheightz†Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 DSCons4DBimChallenger2)ÚviewportÚ
user_agentc                 ór   •— ‰                      | j        | j        t          | j        ¦  «        dœ¦  «         d S )N)ÚtypeÚtextÚlocation)Úappendr7   r8   Ústrr9   )ÚmsgÚconsole_logss    €r%   Úhandle_consolez'browser_context.<locals>.handle_console\   s8   ø€ Ø×Ò¨¬¸3¼8ÕQTÐUXÔUaÑQbÔQbÐ cÐ cÑdÔdÐdÐdÐdr'   c                 óL   •— ‰                      t          | ¦  «        ¦  «         d S )N)r:   r;   )ÚerrÚpage_errorss    €r%   Úhandle_page_errorz*browser_context.<locals>.handle_page_error_   s#   ø€ Ø×Ò�s 3™xœxÑ(Ô(Ð(Ð(Ð(r'   ÚconsoleÚ	pageerrorr   i¨a  r   r   r   i˜:  r   i°  )ÚbrowserÚcontextr   r=   rA   © )r   ÚchromiumÚlaunchÚ	ExceptionÚnew_contextÚnew_pageÚonr    r!   r"   r#   Úclose)Úpr-   rE   r.   Úlaunch_kwargsrF   r   r>   rB   r=   rA   s            @@r%   Úbrowser_contextrQ   6   sS  øøè è € õ 
Ñ	Ô	ð 8˜að
ð 
ð 
ˆð ˆØ'ð 	ð 	ˆGðØ=AÈ4Ð0PÐ0P�Øð 7Ø/6�M )Ñ,Ø+˜!œ*Ô+Ð<Ð<¨mÐ<Ð<�Ø�øÝð ð ð Ø�ðøøøð ð 	BØ”j×'Ò'°¸DÐ'ÑAÔAˆGà×%Ò%Ø#¨sÐ3Ð3ð\ð &ñ 
ô 
ˆð ×ÒÑ!Ô!ˆà-/ˆØ!#ˆð	eð 	eð 	eð 	eð 	eð	)ð 	)ð 	)ð 	)ð 	)ð 	�Š�	˜>Ñ*Ô*Ð*Ø�Š�Ð.Ñ/Ô/Ð/à�	Š	•' f°eˆ	Ñ<Ô<Ð<Ø×ÒÐ8À	ÐSXÐÑYÔYÐYØ×Ò˜dÑ#Ô#Ð#ð ØØØ(Ø&ð
ð 
ð 	
ð 	
ð 	
ð 	�Š‰Œˆðq8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8ð 8ð 8s2   “E
Ÿ?½E
¿
AÁ	E
ÁAÁC1E
Å
EÅEc                 ó4  — | d         }t          |¦  «         t          dd¬¦  «         |                     d¦  «        }t          d|› �d¬¦  «         |d         }|t          z
  }t	          |¦  «        }|t
          k    }|�spt          j        d|fd	|t
          f¦  «        d
t          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        nd
t          j        |¦  «        dt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        nddœz  }t          j        dt          › d|d         › d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}|d         }	|	 }
|
sOt          j        d¦  «        dz   dt          j        |	¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚dx}	}
g }|d         }|d         }t          dd¦  «        D �]Í}|                     d¦  «         |                     d¦  «         |                     d¦  «        }|dz  dk    }|rt"          nt          }t	          |d         |z
  ¦  «        }|t
          k    }|sùt          j        d|fd |t
          f¦  «        d!t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd!dt          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        ndd"œz  }t          j        d#|› d$|› d|d         › d%|› d&�	¦  «        d'z   d(|iz  }t          t          j        |¦  «        ¦  «        ‚d}|d         }	|	|k    }
|
s»t          j        d)|
fd*|	|f¦  «        t          j        |	¦  «        d+t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd+d,œz  }t          j        d#|› d-|› d.|d         › �¦  «        d/z   d0|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	}
|d         }	|	|k    }
|
s»t          j        d)|
fd*|	|f¦  «        t          j        |	¦  «        d1t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd1d,œz  }t          j        d#|› d2|› d3|d         › �¦  «        d/z   d0|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	}
|d         }||z
  }t	          |¦  «        }|t
          k    }|�sct          j        d|fd	|t
          f¦  «        d
t          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        nd
t          j        |¦  «        d4t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd4t          j        |¦  «        dt          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        nddœz  }t          j        d#|› d5|› d3|d         › �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}|d6         }	|d7         }d}||z   }|	|k    }
|
sªt          j        d|
fd8|	|f¦  «        t          j        |	¦  «        t          j        |¦  «        t          j        |¦  «        d9œz  }t          j        d#|› d:|d6         › d;|d7         › d<�¦  «        d=z   d>|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}
x}x}}|                     |¦  «         |d?v r3t          d@|dA›dB|d         dC›dD|d         › dE|d         dC›d�	d¬¦  «         �ŒÏt          dFd¬¦  «         t          dGd¬¦  «         |                     dH¦  «         |                     dI¦  «         |                     dJ¦  «        }t          dK|› �d¬¦  «         |d         }|t          z
  }t	          |¦  «        }|t
          k    }|�spt          j        d|fd	|t
          f¦  «        d
t          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        nd
t          j        |¦  «        dt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        nddœz  }t          j        dLt          › d|d         › d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}|d         }	|	 }
|
sOt          j        dM¦  «        dz   dt          j        |	¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚dx}	}
t&          dNz  }|                     t+          |¦  «        ¬O¦  «         t          dP|› �d¬¦  «         t          dQd¬¦  «         dS )RaS  Stress Test 1: Toggles dock expansion and collapse 50 times.
    
    Verifies:
      - Expanded height settles at 195px (+/- 1.0px).
      - Collapsed height settles at 32px (+/- 1.0px).
      - No layout flickering: dock.width, dock.left, and sidebar.left remain rock-solid.
      - Zero unexpected scrollbars or CLS during toggles.
    r   zJ
[CHALLENGE 1] Executing 50x Dock Expansion/Collapse Toggle Stress Test...T©Úflushaü  
    () => {
        const dock = document.getElementById('siteDiaryDock');
        const sidebar = document.querySelector('.sidebar');
        const rDock = dock.getBoundingClientRect();
        const rSide = sidebar.getBoundingClientRect();
        return {
            height: rDock.height,
            width: rDock.width,
            left: rDock.left,
            right: rDock.right,
            sidebarLeft: rSide.left,
            isCollapsed: dock.classList.contains('collapsed')
        };
    }
    z  -> Initial dock metrics: r3   ©ú<=)z<%(py6)s
{%(py6)s = %(py0)s((%(py2)s - %(py3)s))
} <= %(py8)sÚabsÚHEIGHT_EXPANDED_TARGETÚPX_TOLERANCE)Úpy0Úpy2Úpy3Úpy6Úpy8zInitial dock height should be ~úpx, got Úpxz
>assert %(py10)sÚpy10NÚisCollapsedz$Dock should start in expanded state.ú
>assert not %(py1)sÚpy1r2   Úlefté   é3   a  
        () => {
            const btn = document.getElementById('btnToggleDock') || document.getElementById('btnCollapseDock');
            if (btn) btn.click();
            else if (typeof window.toggleDockCollapse === 'function') window.toggleDockCollapse();
        }
        i  a¾  
        () => {
            const dock = document.getElementById('siteDiaryDock');
            const sidebar = document.querySelector('.sidebar');
            const rDock = dock.getBoundingClientRect();
            const rSide = sidebar.getBoundingClientRect();
            return {
                height: rDock.height,
                width: rDock.width,
                left: rDock.left,
                right: rDock.right,
                sidebarLeft: rSide.left,
                isCollapsed: dock.classList.contains('collapsed'),
                scrollWidth: document.documentElement.scrollWidth,
                clientWidth: document.documentElement.clientWidth
            };
        }
        é   )z%(py0)s <= %(py2)sÚheight_diff)rZ   r[   zToggle #z: Expected height z	px (diff úpx)z
>assert %(py4)sÚpy4©ú==)z%(py1)s == %(py3)sÚexpected_collapsed)rd   r\   z: Expected collapsed=z, got ú
>assert %(py5)sÚpy5Úinitial_leftz: Dock left flickered from z to Úinitial_widthz: Dock width flickered from ÚscrollWidthÚclientWidth©z%(py1)s <= (%(py4)s + %(py6)s)©rd   rk   r]   z%: Layout caused horizontal overflow (z > ú)ú
>assert %(py9)sÚpy9)rf   é
   é   é1   é2   z  -> Toggle #Ú02dz	: Height=z.1fzpx (collapsed=z	), Width=zQ  -> Successfully verified all 50 sequential toggles (25 collapsed, 25 expanded).zZ  -> Testing rapid click burst (50 clicks within 500ms, stress testing race conditions)...a9  
    () => {
        const btn = document.getElementById('btnToggleDock') || document.getElementById('btnCollapseDock');
        for (let j = 0; j < 50; j++) {
            if (btn) btn.click();
            else if (typeof window.toggleDockCollapse === 'function') window.toggleDockCollapse();
        }
    }
    i^  zé
    () => {
        const dock = document.getElementById('siteDiaryDock');
        return {
            height: dock.getBoundingClientRect().height,
            isCollapsed: dock.classList.contains('collapsed')
        };
    }
    z!  -> Post-burst settled metrics: z4After 50 rapid clicks, dock height should settle at z.Dock should be expanded after 50 rapid clicks.z*adversarial_1_dock_50x_toggle_expanded.png©Úpathz  -> Saved screenshot: z4  -> PASSED: Challenge 1 verified 100% successfully.)r&   ÚprintÚevaluaterX   rW   rY   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚ_format_assertmsgÚAssertionErrorÚ_format_explanationÚranger#   ÚHEIGHT_COLLAPSED_TARGETr:   Ú
REPORT_DIRÚ
screenshotr;   )rQ   r   Úinitial_infoÚ@py_assert1Ú@py_assert4Ú@py_assert5Ú@py_assert7Ú@py_format9Ú@py_format11Ú@py_assert0Ú@py_assert2Ú@py_format3Útoggle_recordsrr   rq   ÚiÚstep_metricsrn   Úexpected_heightri   Ú@py_format5Ú@py_format4Ú@py_format6Ú@py_assert3Ú@py_format8Ú@py_format10Úfinal_burst_metricsÚscreenshot_paths                               r%   Ú3test_adversarial_dock_50x_toggle_expansion_collapser¦   y   s;  € ð ! Ô(€DÝ�dÑÔÐå	Ð
WÐ_cÐdÑdÔdÐdð —=’=ð "ñ 	ô 	€Lõ  
Ð
6¨Ð
6Ð
6¸dÐCÑCÔCÐCØ˜HÔ%ð Ð%Õ(>Ñ>ð �3Ð>Ñ?Ô?ð Ð?Å<ÒOð ð ñ õ ìðð ð ð Ð?Å<ð ñ ô ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð õ ìð &ñ ô ð õ ìñô ð ð õ ìõ )?ñ ô ð õ ìõ )?ñ ô ð ð õ ìð @ñ ô ð õ ìñô ð ð õ ìõ DPñ ô ð õ ìõ DPñ ô ð ð ð ð ñ ð õ ìð 	eÕ*@ÐdÐdÈ,ÐW_ÔJ`ÐdÐdÐdñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ˜MÔ*Ð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ÐRÐRÐRÐRÐRð €NØ  Ô)€MØ Ô'€Lå�1�b‰\Œ\ð >mñ >mˆà�Šð ñ 	ô 	ð 	ð 	×Ò˜cÑ"Ô"Ð"à—}’}ð &ñ ô ˆð&   !™e qšjÐØ5GÐcÕ1Ð1ÕMcˆõ ˜, xÔ0°?ÑBÑCÔCˆØ�lÒ*ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
ˆ{�lð 	
ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð ñ 	
ô 	
ð 	
õ 	
ä 	ð ñ 	
ô 	
ð 	
ð 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìõ +ñ 	
ô 	
ð 	
õ 	
ä 	õ +ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð w�qÐvÐv¨OÐvÐvÀ\ÐRZÔE[ÐvÐvÐfqÐvÐvÐvñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð
 ˜MÔ*ð 	
Ð*Ð.@Ò@ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð*Ð.@ð 	
ñ 	
ô 	
õ 	
ä 	ð +ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð /Añ 	
ô 	
ð 	
õ 	
ä 	ð /Añ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð g�qÐfÐfÐ/AÐfÐfÈÐVcÔIdÐfÐfñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ˜FÔ#ð 	
Ð# |Ò3ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð# |ð 	
ñ 	
ô 	
õ 	
ä 	ð $ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð (4ñ 	
ô 	
ð 	
õ 	
ä 	ð (4ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð ^�qÐ]Ð]°\Ð]Ð]À|ÐTZÔG[Ð]Ð]ñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð   Ô(ð 	
Ð(¨=Ñ8ð 	
�sÐ8Ñ9Ô9ð 	
Ð9½\ÒIð 	
ð 	
ñ 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð9½\ð 	
ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìõ ñ 	
ô 	
ð 	
õ 	
ä 	õ ñ 	
ô 	
ð 	
ð 	
õ 	
ä 	ð )ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð ,9ñ 	
ô 	
ð 	
õ 	
ä 	ð ,9ñ 	
ô 	
ð 	
ð 	
õ 	
ä 	ð :ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìõ >Jñ 	
ô 	
ð 	
õ 	
ä 	õ >Jñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð a�qÐ`Ð`°mÐ`Ð`ÈÐV]ÔI^Ð`Ð`ñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ˜MÔ*ð 	
¨l¸=Ô.Ið 	
ÈAð 	
Ð.IÈAÑ.Mð 	
Ð*Ð.MÒMð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð*Ð.Mð 	
ñ 	
ô 	
õ 	
ä 	ð +ñ 	
ô 	
õ 	
ä 	ð /Jñ 	
ô 	
õ 	
ä 	ð MNñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð ~�qÐ}Ð}¸|ÈMÔ?ZÐ}Ð}Ð_kÐlyÔ_zÐ}Ð}Ð}ñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	×Ò˜lÑ+Ô+Ð+ØÐ#Ð#Ð#Ýð  ` !ð  `ð  `ð  `°,¸xÔ2Hð  `ð  `ð  `Ð\hÐivÔ\wð  `ð  `ð  COð  PWô  CXð  `ð  `ð  `ð  `ð  hlð  mñ  mô  mð  mùå	Ð
^ÐfjÐkÑkÔkÐkõ 
Ð
fÐnrÐsÑsÔsÐsØ‡M‚Mð ñ 	ô 	ð 	ð 	×Ò˜#ÑÔÐàŸ-š-ð )ñ 	ô 	Ðõ 
Ð
CÐ.AÐ
CÐ
CÈ4ÐPÑPÔPÐPØ" 8Ô,ð Ð,Õ/EÑEð �3ÐEÑFÔFð ÐFÍ,ÒVð ð ñ õ ìðð ð ð ÐFÍ,ð ñ ô ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð õ ìð -ñ ô ð õ ìñô ð ð õ ìõ 0Fñ ô ð õ ìõ 0Fñ ô ð ð õ ìð Gñ ô ð õ ìñô ð ð õ ìõ KWñ ô ð õ ìõ KWñ ô ð ð ð ð ñ ð õ ìð 	AÕ?Uð  	Að  	AÐ_rÐs{Ô_|ð  	Að  	Að  	Añô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð # =Ô1ÐcÐ1Ð1ÐcÐ1ÐcÕcÔcÐ3cÑcÔcÐcÑcÐcÕcÔcÐ1ÑcÔcÐcÑcÐcÕcÕcÔcÐcÑcÔcÑcÔcÐcÐcÐcÐcÐcå Ð#OÑO€OØ‡O‚O�˜_Ñ-Ô-€OÑ.Ô.Ð.Ý	Ð
5 OÐ
5Ð
5¸TÐBÑBÔBÐBÝ	Ð
@ÈÐMÑMÔMÐMÐMÐMr'   zvp_width,vp_height,name))i€  i8  ÚFull_HD_Desktop)r/   r0   ÚMacBook_Standard)i   é   ÚCompact_Laptop)é   é   ÚTablet_Landscape)r©   iX  ÚLegacy_Small_Desktopc           	      ó>  — | d         }|                      ||dœ¦  «         |                     d¦  «         t          d|› d|› d|› d�d¬	¦  «         |                     d
¦  «        }t          d|d         › d|d         › d|d         › d�d¬	¦  «         |d         }|d         }d}||z   }	||	k    }
|
sªt	          j        d|
fd||	f¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }t	          j        d|› d|d         › d|d         › d�¦  «        dz   d|iz  }t          t	          j	        |¦  «        ¦  «        ‚dx}x}
x}x}}	|d         }d}||k    }
|
sŽt	          j        d|
fd||f¦  «        t	          j        |¦  «        t	          j        |¦  «        d œz  }t	          j        d|› d!|d         › d�¦  «        d"z   d#|iz  }t          t	          j	        |¦  «        ¦  «        ‚dx}x}
}|d$         ��s|d$         }|d         }d}||z   }	||	k    }
|
s§t	          j        d|
fd||	f¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }t	          j        d%|d$         › d|d         › d�¦  «        dz   d|iz  }t          t	          j	        |¦  «        ¦  «        ‚dx}x}
x}x}}	|d&         }d}||k    }
|
s‹t	          j        d|
fd||f¦  «        t	          j        |¦  «        t	          j        |¦  «        d œz  }t	          j        d'|d&         › d�¦  «        d"z   d#|iz  }t          t	          j	        |¦  «        ¦  «        ‚dx}x}
}t          d(|› d)�d¬	¦  «         dS )*aM  Stress Test 2: Measures bounding client rects of #siteDiaryDock, #player4DDock, and .sidebar.
    
    Verifies Zero Occlusion:
      - dockRect.right <= sidebarRect.left at all times.
      - playerDockRect.right <= sidebarRect.left at all times.
      - Horizontal intersection area between dock and sidebar is strictly 0.0px.
    r   r1   éÈ   z)
[CHALLENGE 2] Testing Zero Occlusion on ú (Úxú)...TrS   a‹  
    () => {
        const dock = document.getElementById('siteDiaryDock');
        const playerDock = document.getElementById('player4DDock');
        const sidebar = document.querySelector('.sidebar');

        const rDock = dock.getBoundingClientRect();
        const rPlayer = playerDock ? playerDock.getBoundingClientRect() : null;
        const rSide = sidebar.getBoundingClientRect();

        // Calculate horizontal overlap
        const dockOverlap = Math.max(0, Math.min(rDock.right, rSide.right) - Math.max(rDock.left, rSide.left));
        const playerOverlap = rPlayer ? Math.max(0, Math.min(rPlayer.right, rSide.right) - Math.max(rPlayer.left, rSide.left)) : 0;

        return {
            windowWidth: window.innerWidth,
            windowHeight: window.innerHeight,
            dockRight: rDock.right,
            dockLeft: rDock.left,
            dockWidth: rDock.width,
            sidebarLeft: rSide.left,
            sidebarRight: rSide.right,
            sidebarWidth: rSide.width,
            dockOverlap: dockOverlap,
            playerRight: rPlayer ? rPlayer.right : null,
            playerOverlap: playerOverlap
        };
    }
    z  -> Metrics: Dock.right=Ú	dockRightzpx, Sidebar.left=ÚsidebarLeftzpx, Overlap=ÚdockOverlapr`   g      à?rU   ru   rv   zZERO OCCLUSION VIOLATED on z: Dock right (zpx) overlaps Sidebar left (rj   rx   ry   Nr   rl   )z%(py1)s == %(py4)s©rd   rk   z: Dock and Sidebar overlap by ú
>assert %(py6)sr]   ÚplayerRightz/ZERO OCCLUSION VIOLATED: 4D Player dock right (ÚplayerOverlapz?ZERO OCCLUSION VIOLATED: 4D Player dock and Sidebar overlap by z0  -> PASSED: Zero Occlusion strictly upheld for ú.)
Úset_viewport_sizer#   r�   r‚   rƒ   r„   rˆ   r‰   rŠ   r‹   )rQ   Úvp_widthÚ	vp_heightÚnamer   Úmetricsr—   r¡   r“   r”   r˜   r¢   r£   rž   Ú@py_format7s                  r%   Ú0test_adversarial_zero_occlusion_across_viewportsrÂ     sÛ  € ð$ ! Ô(€DØ×Ò X¸ÐCÐCÑDÔDÐDØ×Ò˜#ÑÔÐå	Ð
Y°tÐ
YÐ
Y¸xÐ
YÐ
YÈ)Ð
YÐ
YÐ
YÐaeÐfÑfÔfÐfà�mŠmð ñ 	ô 	€Gõ< 
ð  L g¨kÔ&:ð  Lð  LÈWÐUbÔMcð  Lð  LÐqxð  zGô  rHð  Lð  Lð  Lð  TXð  Yñ  Yô  Yð  Yð
 �;Ôð  7¨=Ô#9ð ¸Cð Ð#9¸CÑ#?ð ÐÐ#?Ò?ð ð ð õ ìðð ð ð ÐÐ#?ð ñ ô õ ìð  ñ ô õ ìð $:ñ ô õ ìð =@ñ ô ð ð ñ ð õ ìð 	G dð  	Gð  	G¸'À+Ô:Nð  	Gð  	GÐkrð  tAô  lBð  	Gð  	Gð  	Gñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ð �=Ô!ð  Qð Ð! QÒ&ð ð ð õ ìðð ð ð Ð! Qð ñ ô õ ìð "ñ ô õ ìð &'ñ ô ð ð ñ ð õ ìð 	e dÐdÐdÈ'ÐR_ÔJ`ÐdÐdÐdñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ˆ}ÔÑ)Ø�}Ô%ð 	
¨°Ô)?ð 	
À#ð 	
Ð)?À#Ñ)Eð 	
Ð%Ð)EÒEð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð%Ð)Eð 	
ñ 	
ô 	
õ 	
ä 	ð &ñ 	
ô 	
õ 	
ä 	ð *@ñ 	
ô 	
õ 	
ä 	ð CFñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð M¸gÀmÔ>Tð  Mð  MÐqxð  zGô  rHð  Mð  Mð  Mñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð �Ô'ð 	
¨1ð 	
Ð'¨1Ò,ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð'¨1ð 	
ñ 	
ô 	
õ 	
ä 	ð (ñ 	
ô 	
õ 	
ä 	ð ,-ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð kÈgÐVeÔNfÐjÐjÐjñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ 
Ð
D¸TÐ
DÐ
DÐ
DÈDÐQÑQÔQÐQÐQÐQr'   zm_width,m_height,device_name))r¬   r«   ÚiPad_Mini_Portrait)iž  i€  ÚiPhone_11_XR)i†  iL  ÚiPhone_12_13_14)iw  i›  ÚiPhone_SE_Mobile_Target)i@  i8  ÚiPhone_5_Extreme_Edgec           	      óJ
  — | d         }t          d|› d|› d|› d�d¬¦  «         |                     ||dœ¦  «         |                     d	¦  «         |                     d
¦  «         |                     d¦  «        }t          d|› d|› �d¬¦  «         |d         }|sOt	          j        d¦  «        dz   dt	          j        |¦  «        iz  }t          t	          j        |¦  «        ¦  «        ‚d}|d         }d}	||	u}
|
s¬t	          j	        d|
fd||	f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        ndt	          j        |	¦  «        dœz  }t	          j        d¦  «        dz   d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}
}	|d         }| }	|	sSt	          j        d|› d�¦  «        dz   dt	          j        |¦  «        iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}	|d         }| }	|	sSt	          j        d |› d�¦  «        dz   dt	          j        |¦  «        iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}	d!}	||	k    }
|
s¯t	          j	        d"|
fd#||	f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        ndt	          j        |	¦  «        dœz  }t	          j        d$|› �¦  «        dz   d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}
}	|d%         }| }	|	sSt	          j        d&|› d�¦  «        dz   dt	          j        |¦  «        iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}	|d'         }| }	|	sSt	          j        d(|› d�¦  «        dz   dt	          j        |¦  «        iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}	|                     d)¦  «        }|d*         }|sht	          j        d+|› d|                     d,¦  «        › �¦  «        dz   dt	          j        |¦  «        iz  }t          t	          j        |¦  «        ¦  «        ‚d}t          d-|› d.�z  }|                     t!          |¦  «        ¬/¦  «         t          d0|› �d¬¦  «         t          d1|› d2|d3›d4�d¬¦  «         |                     d5d6dœ¦  «         |                     d	¦  «         |                     d7¦  «         dS )8aë  Stress Test 3: Resizes viewport down to mobile dimensions (375x667 and extreme 320x568).
    
    Verifies:
      - camera.aspect does NOT produce NaN or Infinity (verifying Challenger 1's safeguard patch).
      - camera.aspect is strictly positive and finite (> 0).
      - camera.projectionMatrix elements are 100% finite and non-NaN.
      - container.clientWidth and clientHeight handled safely without exceptions.
      - Three.js animation loop continues rendering without crash.
    r   z2
[CHALLENGE 3] Testing Mobile Resize Safeguard on r±   r²   r³   TrS   r1   z/() => window.dispatchEvent(new Event('resize'))é,  a¯  
    () => {
        const cam = typeof camera !== 'undefined' ? camera : (window.camera || null);
        const cont = document.getElementById('webgl-container');
        const rend = typeof renderer !== 'undefined' ? renderer : (window.renderer || null);

        let aspect = cam ? cam.aspect : null;
        let projElements = cam ? Array.from(cam.projectionMatrix.elements) : [];
        let hasNan = projElements.some(e => isNaN(e));
        let hasInf = projElements.some(e => !isFinite(e));

        return {
            hasCamera: !!cam,
            aspect: aspect,
            isNanAspect: isNaN(aspect),
            isInfAspect: !isFinite(aspect),
            containerClientWidth: cont ? cont.clientWidth : null,
            containerClientHeight: cont ? cont.clientHeight : null,
            hasNanInMatrix: hasNan,
            hasInfInMatrix: hasInf,
            projElementsSample: projElements.slice(0, 4)
        };
    }
    z  -> State on z: Ú	hasCameraz*Three.js camera object was not accessible.ú
>assert %(py1)srd   NÚaspect)úis not)z%(py0)s is not %(py3)sÚ
aspect_val)rZ   r\   zcamera.aspect is Nonero   rp   ÚisNanAspectz*CRITICAL FAILURE: camera.aspect is NaN on ú!rc   ÚisInfAspectz/CRITICAL FAILURE: camera.aspect is Infinity on g        ©ú>)z%(py0)s > %(py3)sz-camera.aspect must be strictly positive, got ÚhasNanInMatrixz4CRITICAL FAILURE: Projection matrix contains NaN on ÚhasInfInMatrixz9CRITICAL FAILURE: Projection matrix contains Infinity on a©  
    () => {
        try {
            if (typeof renderer !== 'undefined' && typeof scene !== 'undefined' && typeof camera !== 'undefined') {
                renderer.render(scene, camera);
                return { success: true };
            }
            return { success: true, note: 'Globals not directly exposed' };
        } catch (e) {
            return { success: false, error: e.toString() };
        }
    }
    ÚsuccesszRendering failed on ÚerrorÚadversarial_3_z.pngr   z  -> Saved mobile screenshot: z!  -> PASSED: Mobile safeguard on z	 (aspect=z.4fz).r/   r0   r°   )r�   r¼   r‚   r#   rƒ   r‰   rˆ   rŠ   r‹   r„   r…   r†   r‡   ÚgetrŽ   r�   r;   )rQ   Úm_widthÚm_heightÚdevice_namer   Úeval_resultr—   Ú@py_format2rÎ   r˜   r‘   rŸ   r    r™   Úrender_testr¥   s                   r%   Ú6test_adversarial_mobile_resize_camera_aspect_safeguardrà   `  s9  € ð( ! Ô(€Då	Ð
gÀÐ
gÐ
gÈwÐ
gÐ
gÐYaÐ
gÐ
gÐ
gÐosÐtÑtÔtÐtð 	×Ò W¸ÐAÐAÑBÔBÐBà‡M‚MÐCÑDÔDÐDØ×Ò˜#ÑÔÐð —-’-ð !ñ 	ô 	€Kõ2 
Ð
7˜;Ð
7Ð
7¨+Ð
7Ð
7¸tÐDÑDÔDÐDà�{Ô#ÐQÐ#ÐQÕQÔQÐ%QÑQÔQÐQÑQÐQÕQÔQÐ#ÑQÔQÐQÑQÐQÕQÕQÔQÐQÑQÔQÑQÔQÐQÐQÐQØ˜XÔ&€JØ!Ð:ˆ:˜TÐ!Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:ˆ:˜TÐ:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:ˆ:Ñ:Ô:Ð:Õ:Ô:ˆ:Ñ:Ô:Ð:Ð:Õ:Ô:˜TÑ:Ô:Ð:Ð:Ñ:Ð:Õ:Ô:Ð#:Ñ:Ô:Ð:Ñ:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:ð ˜=Ô)ÐfÐ)Ð)ÐfÐ)ÐfÕfÔfÐ+fÐXcÐ+fÐ+fÐ+fÑfÔfÐfÑfÐfÕfÔfÐ)ÑfÔfÐfÑfÐfÕfÕfÔfÐfÑfÔfÑfÔfÐfÐfÐfÐfÐfØ˜=Ô)ÐkÐ)Ð)ÐkÐ)ÐkÕkÔkÐ+kÐ]hÐ+kÐ+kÐ+kÑkÔkÐkÑkÐkÕkÔkÐ)ÑkÔkÐkÑkÐkÕkÕkÔkÐkÑkÔkÑkÔkÐkÐkÐkÐkÐkØÐYˆ:˜ÒÐYÐYÐYÕYÔYÐYÐYÐYÐYˆ:˜ÐYÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔYˆ:ÑYÔYÐYÕYÔYˆ:ÑYÔYÐYÐYÕYÔY˜ÑYÔYÐYÐYÑYÐYÕYÔYÐYÈZÐYÐYÑYÔYÐYÑYÐYÐYÐYÑYÐYÕYÕYÔYÐYÑYÔYÑYÔYÐYÐYÐYÐYÐYð Ð+Ô,ÐsÐ,Ð,ÐsÐ,ÐsÕsÔsÐ.sÐepÐ.sÐ.sÐ.sÑsÔsÐsÑsÐsÕsÔsÐ,ÑsÔsÐsÑsÐsÕsÕsÔsÐsÑsÔsÑsÔsÐsÐsÐsÐsÐsØÐ+Ô,ÐxÐ,Ð,ÐxÐ,ÐxÕxÔxÐ.xÐjuÐ.xÐ.xÐ.xÑxÔxÐxÑxÐxÕxÔxÐ,ÑxÔxÐxÑxÐxÕxÕxÔxÐxÑxÔxÑxÔxÐxÐxÐxÐxÐxð —-’-ð !ñ 	ô 	€Kð �yÔ!ÐcÐ!ÐcÕcÔcÐ#c¸+Ð#cÐ#cÈÏÊÐY`ÑIaÔIaÐ#cÐ#cÑcÔcÐcÑcÐcÕcÔcÐ!ÑcÔcÐcÑcÐcÕcÕcÔcÐcÑcÔcÑcÔcÐcÐcÐcå Ð#E°KÐ#EÐ#EÐ#EÑE€OØ‡O‚O�˜_Ñ-Ô-€OÑ.Ô.Ð.Ý	Ð
<¨?Ð
<Ð
<ÀDÐIÑIÔIÐIÝ	Ð
V¨kÐ
VÐ
VÀJÐ
VÐ
VÐ
VÐ
VÐ^bÐcÑcÔcÐcð 	×Ò T°SÐ9Ð9Ñ:Ô:Ð:Ø‡M‚MÐCÑDÔDÐDØ×Ò˜#ÑÔÐÐÐr'   c                 ó  — | d         }t          dd¬¦  «         |                     d¦  «        }|D �]¾}t          d|d         › d|d	         › d
|d         › d|d         › d|d         › d|d         › �d¬¦  «         |d         }| }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|d         }| }|sXt          j        d|d         › �¦  «        dz   dt          j        |¦  «        iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|d         }d}||k    }|sŠt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|d         › �¦  «        dz   d|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}�ŒÀt          dd¬¦  «         dS )a#  Stress Test 4: Adversarially tests the resize handler logic when container clientWidth/Height is 0.
    
    Verifies that Math.max(container.clientWidth, 1) / Math.max(container.clientHeight, 1)
    prevents 0 / 0 (NaN) and x / 0 (Infinity) under all theoretical mount race conditions.
    r   zG
[CHALLENGE 4] Testing Mathematical Zero-Dimension Safeguard Formula...TrS   a×  
    () => {
        function calcAspect(w, h) {
            return Math.max(w, 1) / Math.max(h, 1);
        }

        const cases = [
            { w: 0, h: 0, desc: 'Both 0' },
            { w: 0, h: 900, desc: 'Width 0' },
            { w: 1440, h: 0, desc: 'Height 0' },
            { w: -10, h: -20, desc: 'Negative sizes' },
            { w: 375, h: 667, desc: 'Mobile 375x667' }
        ];

        return cases.map(c => {
            const aspect = calcAspect(c.w, c.h);
            return {
                desc: c.desc,
                w: c.w,
                h: c.h,
                aspect: aspect,
                isNan: isNaN(aspect),
                isInf: !isFinite(aspect)
            };
        });
    }
    z  -> Case 'Údescz' (w=Úwz, h=Úhz
): aspect=rÌ   z, isNaN=ÚisNanz, isInf=ÚisInfzFormula produced NaN for case rc   rd   Nz#Formula produced Infinity for case r   rÒ   )z%(py1)s > %(py4)sr·   z.Formula produced non-positive aspect for case r¸   r]   zN  -> PASSED: Mathematical safeguard formula proves immune to division by zero.)r�   r‚   rƒ   r‰   rˆ   rŠ   r‹   r„   )
rQ   r   Úformula_resultsÚrr—   r˜   r™   r¡   rž   rÁ   s
             r%   Ú2test_adversarial_zero_dimension_math_max_safeguardré   Ç  s”  € ð ! Ô(€Då	Ð
TÐ\`ÐaÑaÔaÐaà—m’mð %ñ 	ô 	€Oð8 ð ]ñ ]ˆÝÐ˜A˜fœIÐÐ¨A¨c¬FÐÐ¸¸#¼ÐÐÈ!ÈHÌ+ÐÐÐ_`ÐahÔ_iÐÐÐstÐu|Ôs}ÐÐð  HLð  	Mñ  	Mô  	Mð  	MØ�W”:ÐK�:ˆ~ÐKˆ~ÐKÕKÔKÐKÀÀ&Ä	ÐKÐKÑKÔKÐKÑKÐKÕKÔK�:ÑKÔKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKÐKÐKÐKÐKØ�W”:ÐP�:ˆ~ÐPˆ~ÐPÕPÔPÐPÀQÀvÄYÐPÐPÑPÔPÐPÑPÐPÕPÔP�:ÑPÔPÐPÑPÐPÕPÕPÔPÐPÑPÔPÑPÔPÐPÐPÐPÐPÐPØ�Œ{Ð\˜QÐ\ˆ{˜QŠÐ\Ð\Ð\Õ\Ô\Ð\Ð\Ð\Ð\ˆ{˜QÐ\Ñ\Ô\Õ\Ô\ˆ{Ñ\Ô\Õ\Ô\˜QÑ\Ô\Ð\Ð\Ñ\Ð\Õ\Ô\Ð \ÐQRÐSYÔQZÐ \Ð \Ñ\Ô\Ð\Ñ\Ð\Ð\Ð\Ñ\Ð\Õ\Õ\Ô\Ð\Ñ\Ô\Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ñ\å	Ð
ZÐbfÐgÑgÔgÐgÐgÐgr'   c                 ó’  — | d         }t          |¦  «         t          dd¬¦  «         |                     d¦  «         |                     d¦  «         |                     d¦  «         |                     d¦  «         |                     d	¦  «        }t          d
|› �d¬¦  «         |d         }|sOt	          j        d¦  «        dz   dt	          j        |¦  «        iz  }t          t	          j        |¦  «        ¦  «        ‚d}d}|d         }||v }|s�t	          j	        d|fd||f¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }t	          j        d¦  «        dz   d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}|d         }	|	j
        }d}
d} ||
|¦  «        }|j
        }d}d} |||¦  «        }t          |¦  «        }d}||k    }|�stt	          j	        d|fd||f¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j        t          ¦  «        ndt	          j        |	¦  «        t	          j        |¦  «        t	          j        |
¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        d œz  }t	          j        d!¦  «        d"z   d#|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}	x}x}
x}x}x}x}x}x}x}x}}|                     d$¦  «         |                     d¦  «         |                     d%¦  «        }|t          z
  }t!          |¦  «        }|t"          k    }|�s•t	          j	        d&|fd'|t"          f¦  «        d(t          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        nd(d)t          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nd)d*t          j        ¦   «         v st	          j        t          ¦  «        rt	          j        t          ¦  «        nd*t	          j        |¦  «        d+t          j        ¦   «         v st	          j        t"          ¦  «        rt	          j        t"          ¦  «        nd+d,œz  }t	          j        d-t          › d.|› d/�¦  «        d0z   d1|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}t$          d2z  }|                     t)          |¦  «        ¬3¦  «         t          d4|› �d¬¦  «         t          d5d¬¦  «         dS )6zªStress Test 5: Verifies that Site Diary Dock accurately updates its DOM
    and data bindings even when in collapsed state, and displays correct data upon expansion.
    r   zC
[CHALLENGE 5] Testing Site Diary Synchronization When Collapsed...TrS   aŠ  
    () => {
        const dock = document.getElementById('siteDiaryDock');
        if (!dock.classList.contains('collapsed')) {
            const btn = document.getElementById('btnToggleDock') || document.getElementById('btnCollapseDock');
            if (btn) btn.click();
            else if (typeof window.toggleDockCollapse === 'function') window.toggleDockCollapse();
        }
    }
    rÉ   zN() => typeof window.setTimelineDay === 'function' && window.setTimelineDay(60)r°   a¾  
    () => {
        return {
            dateText: document.getElementById('dockDate')?.innerText,
            weatherText: document.getElementById('dockWeather')?.innerText,
            rebarText: document.getElementById('dockRebar')?.innerText,
            concreteText: document.getElementById('dockConcrete')?.innerText,
            isCollapsed: document.getElementById('siteDiaryDock')?.classList.contains('collapsed')
        };
    }
    z"  -> Day 60 data while collapsed: rb   zDock should be collapsed.rË   rd   NÚ2026ÚdateText)Úin)z%(py1)s in %(py4)sr·   z$Date should have updated for Day 60.r¸   r]   ÚconcreteTextr»   Ú ú,r   rÒ   )zÂ%(py20)s
{%(py20)s = %(py0)s(%(py18)s
{%(py18)s = %(py12)s
{%(py12)s = %(py10)s
{%(py10)s = %(py4)s
{%(py4)s = %(py2)s.replace
}(%(py6)s, %(py8)s)
}.replace
}(%(py14)s, %(py16)s)
})
} > %(py23)sÚfloat)rZ   r[   rk   r]   r^   ra   Úpy12Úpy14Úpy16Úpy18Úpy20Úpy23z(Concrete volume should be > 0 on Day 60.z
>assert %(py25)sÚpy25a   
    () => {
        const btn = document.getElementById('btnToggleDock') || document.getElementById('btnCollapseDock');
        if (btn) btn.click();
        else if (typeof window.toggleDockCollapse === 'function') window.toggleDockCollapse();
    }
    zN() => document.getElementById('siteDiaryDock')?.getBoundingClientRect().heightrU   )z<%(py5)s
{%(py5)s = %(py0)s((%(py1)s - %(py2)s))
} <= %(py7)srW   Úexpanded_heightrX   rY   )rZ   rd   r[   rp   Úpy7z Dock height should re-expand to r_   r`   rx   ry   z%adversarial_5_dock_expanded_day60.pngr   z*  -> Saved Day 60 re-expanded screenshot: zO  -> PASSED: Synchronous data updates verified while collapsed and re-expanded.)r&   r�   r‚   r#   rƒ   r‰   rˆ   rŠ   r‹   r„   Úreplacerñ   r…   r†   r‡   rX   rW   rY   rŽ   r�   r;   )rQ   r   Ú
day60_datar—   rÞ   r¡   r˜   rž   rÁ   r‘   r“   r”   Ú@py_assert9Ú@py_assert11Ú@py_assert13Ú@py_assert15Ú@py_assert17Ú@py_assert19Ú@py_assert22Ú@py_assert21Ú@py_format24Ú@py_format26rù   r’   Ú@py_assert6r¢   r£   r¥   s                               r%   Ú)test_adversarial_dock_sync_when_collapsedr  û  s&  € ð ! Ô(€DÝ�dÑÔÐå	Ð
PÐX\Ð]Ñ]Ô]Ð]ð 	‡M‚Mð 	ñ 		ô 		ð 		ð 	×Ò˜#ÑÔÐð 	‡M‚MÐbÑcÔcÐcØ×Ò˜#ÑÔÐð —’ð 
 ñ 
	ô 
	€Jõ 
Ð
;¨zÐ
;Ð
;À4ÐHÑHÔHÐHØ�mÔ$ÐAÐ$ÐAÕAÔAÐ&AÑAÔAÐAÑAÐAÕAÔAÐ$ÑAÔAÐAÑAÐAÕAÕAÔAÐAÑAÔAÑAÔAÐAÐAÐAØÐS�Z 
Ô+ÐSˆ6Ð+Ð+ÐSÐSÐSÕSÔSÐSÐSÐSÐSˆ6Ð+ÐSÑSÔSÕSÔSˆ6ÑSÔSÕSÔSÐ+ÑSÔSÐSÐSÑSÐSÕSÔSÐ-SÑSÔSÐSÑSÐSÐSÐSÑSÐSÕSÕSÔSÐSÑSÔSÑSÔSÐSÐSÐSÐSÐSÐSÐSØ˜NÔ+ÐÐ+Ô3Ð°CÐ¸ÐÐ3Ð3°C¸Ñ<Ô<ÐÐ<ÔDÐÀSÐÈ#ÐÐDÐDÀSÈ#ÑNÔNÐ�5ÐNÑOÔOÐÐRSÐÐOÐRSÒSÐÐÑÕÔÐÐÐÐÐOÐRSÐÑÔÐÕÔÑÔÐÐÕÔ�5ÑÔÐÕÔ�5ÑÔÐÐÕÔÐ+ÑÔÕÔÐ3ÑÔÕÔ°CÑÔÕÔ¸ÑÔÕÔÐ<ÑÔÕÔÐDÑÔÕÔÀSÑÔÕÔÈ#ÑÔÕÔÐNÑÔÕÔÐOÑÔÕÔÐRSÑÔÐÐÑÐÕÔÐUÑÔÐÑÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐð 	‡M‚Mð ñ 	ô 	ð 	ð 	×Ò˜#ÑÔÐà—m’mÐ$tÑuÔu€OØÕ!7Ñ7ð �3Ð7Ñ8Ô8ð Ð8½LÒHð ð ñ õ ìðð ð ð Ð8½Lð ñ ô ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð ð õ ìñô ð ð õ ìõ "8ñ ô ð õ ìõ "8ñ ô ð ð õ ìð 9ñ ô ð õ ìñô ð ð õ ìõ =Iñ ô ð õ ìõ =Iñ ô ð ð ð ð ñ ð õ ìð 	_Õ+AÐ^Ð^È?Ð^Ð^Ð^ñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð õ !Ð#JÑJ€OØ‡O‚O�˜_Ñ-Ô-€OÑ.Ô.Ð.Ý	Ð
H°Ð
HÐ
HÐPTÐUÑUÔUÐUÝ	Ð
[ÐcgÐhÑhÔhÐhÐhÐhr'   c                 ó  — | d         }| d         }t          dd¬¦  «         d„ |D ¦   «         }d„ |D ¦   «         }t          dt          |¦  «        › �d¬¦  «         t          d	t          |¦  «        › �d¬¦  «         t          d
t          |¦  «        › �d¬¦  «         t          dt          |¦  «        › �d¬¦  «         |r(|D ]%}t          d|d         › d|d         › �d¬¦  «         Œ&|r|D ]}t          d|› �d¬¦  «         Œt          |¦  «        }d}||k    }	|	�st          j        d|	fd||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }
t          j        dt          |¦  «        › d|› �¦  «        dz   d|
iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}	}t          |¦  «        }d}||k    }	|	�st          j        d|	fd||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }
t          j        dt          |¦  «        › d|› �¦  «        dz   d|
iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}	}t          dd¬¦  «         dS )z¨Stress Test 6: Strict audit of all captured console error messages and page errors.
    
    Verifies 0 errors, 0 unhandled exceptions, and 0 WebGL crash warnings.
    r=   rA   zH
[CHALLENGE 6] Auditing Console & Page Errors Throughout Stress Suite...TrS   c                 ób   — g | ],}|d          dk    ¯d|d                               ¦   «         v¯*|‘Œ-S )r7   r×   Úfaviconr8   )Úlower©Ú.0Úlogs     r%   ú
<listcomp>zBtest_adversarial_audit_console_and_page_errors.<locals>.<listcomp>J  sC   € ÐmÐmÐm�c¨S°¬[¸GÒ-CÐ-CÈ	ÐY\Ð]cÔYd×YjÒYjÑYlÔYlÐHlÐHlˆcÐHlÐHlÐHlr'   c                 ó*   — g | ]}|d          dk    ¯|‘ŒS )r7   ÚwarningrG   r  s     r%   r  zBtest_adversarial_audit_console_and_page_errors.<locals>.<listcomp>K  s&   € ÐHÐHÐH˜¨s°6¬{¸iÒ/GÐ/G�Ð/GÐ/GÐ/Gr'   z"  -> Total console logs captured: z  -> Console errors: z  -> Console warnings: z  -> Page errors: z     [CONSOLE ERROR] r8   z @ r9   z     [PAGE ERROR] r   rl   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚerrors)rZ   rd   r\   r]   zFound z' console errors during stress testing: z
>assert %(py8)sr^   Nz unhandled page exceptions: zO  -> PASSED: 0 console errors and 0 unhandled exceptions across entire session.)r�   r  rƒ   r„   r…   r†   r‡   rˆ   r‰   rŠ   r‹   )rQ   r=   rA   r  ÚwarningsÚeÚper˜   r“   r’   rÁ   r•   s               r%   Ú.test_adversarial_audit_console_and_page_errorsr  @  s  € ð
 *9¸Ô)H€LØ,¨]Ô;€Kå	Ð
UÐ]aÐbÑbÔbÐbàmÐm˜\ÐmÑmÔm€FØHÐH˜|ÐHÑHÔH€Hå	Ð
B­s°<Ñ/@Ô/@Ð
BÐ
BÈ$ÐOÑOÔOÐOÝ	Ð
/¥# f¡+¤+Ð
/Ð
/°tÐ<Ñ<Ô<Ð<Ý	Ð
3¥C¨¡M¤MÐ
3Ð
3¸4Ð@Ñ@Ô@Ð@Ý	Ð
1�s ;Ñ/Ô/Ð
1Ð
1¸Ð>Ñ>Ô>Ð>àð UØð 	Uð 	UˆAÝÐG¨!¨F¬)ÐGÐG¸¸*¼ÐGÐGÈtÐTÑTÔTÐTÐTàð 9Øð 	9ð 	9ˆBÝÐ+ rÐ+Ð+°4Ð8Ñ8Ô8Ð8Ð8åˆv‰;Œ;Ðb˜!Ðbˆ;˜!ÒÐbÐbÑbÕbÔbÐbÐbÐbÐbˆ;˜!ÐbÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔb�3ÑbÔbÐbÕbÔb�3ÑbÔbÐbÐbÐbÕbÔbÑbÔbÐbÐbÕbÔbˆvÑbÔbÐbÕbÔbˆvÑbÔbÐbÐbÕbÔbˆ;ÑbÔbÕbÔb˜!ÑbÔbÐbÐbÑbÐbÕbÔbÐb¥c¨&¡k¤kÐbÐbÐZ`ÐbÐbÑbÔbÐbÑbÐbÐbÐbÑbÐbÕbÕbÔbÐbÑbÔbÑbÔbÐbÐbÐbÐbÐbÐbÐbÝˆ{ÑÔÐf˜qÐfÐ˜qÒ ÐfÐfÑfÕfÔfÐfÐfÐfÐfÐ˜qÐfÑfÔfÐfÕfÔfÑfÔfÐfÐfÕfÔf�3ÑfÔfÐfÕfÔf�3ÑfÔfÐfÐfÐfÕfÔfÑfÔfÐfÐfÕfÔfˆ{ÑfÔfÐfÕfÔfˆ{ÑfÔfÐfÐfÕfÔfÐÑfÔfÕfÔf˜qÑfÔfÐfÐfÑfÐfÕfÔfÐ"f­3¨{Ñ+;Ô+;Ð"fÐ"fÐYdÐ"fÐ"fÑfÔfÐfÑfÐfÐfÐfÑfÐfÕfÕfÔfÐfÑfÔfÑfÔfÐfÐfÐfÐfÐfÐfÐfÝ	Ð
[ÐcgÐhÑhÔhÐhÐhÐhr'   )r   )1Ú__doc__Úbuiltinsr…   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterƒ   ÚmathÚosÚsysÚtimeÚpathlibr   Útypingr   r   r   r   ÚpytestÚplaywright.sync_apir   r	   r
   r   ÚhasattrÚstdoutr   ÚstderrÚenvironrÙ   ÚBASE_URLr!   rŽ   ÚmkdirrX   r�   rY   Úintr&   ÚfixturerQ   r¦   ÚmarkÚparametrizerÂ   rà   ré   r  r  rG   r'   r%   ú<module>r0     s³  ððð ð$ € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )à €€€Ø NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ Nà
€7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,Ø
€7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,àŒ:�>Š>˜/Ð+BÑCÔC€ØÐ
-Ð
-Ð
-€ØˆTÐ%Ñ&Ô&€
Ø 
× Ò ˜¨Ð Ñ -Ô -Ð -ð Ð ØÐ Ø€ð$ð $˜Dð $¨cð $¸dð $ð $ð $ð $ð €„�hÐÑÔð:ð :ñ  Ôð:ðDMNð MNð MNðj „×ÒØðð ð ñ	ô 	ð@Rð @Rñ	ô 	ð@RðP „×ÒØ"ðð ð ñ	ô 	ðUð Uñ	ô 	ðUðz,hð ,hð ,hðh=ið =ið =iðJið ið ið ið ir'   