§
    A}£j0J  ã                   óø  — 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Z ee¦  «                             ¦   «         j        j        Ze
j                             d eedz  dz  ¦  «        ¦  «         ddlZedz  dz  ZdZg d	¢Zd
Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z edz  dz  Z!e
j                             d ee!¦  «        ¦  «         ddl"Z#edz  dz  dz  dz  Z$dZ%d„ Z&d„ Z'd„ Z(d„ Z)d„ Z*d„ Z+d„ Z,d„ Z-dS )u
  
AutoPOE2 - Kiá»ƒm thá»­ há»“i quy cho RE Pipeline & INV-BUILD-01 (Rule 11, 14)

Cháº¡y 100% á»Ÿ User Mode: KHÃ”NG cáº§n quyá»�n Admin, KHÃ”NG cáº§n game Ä‘ang cháº¡y.

CÃ¡c báº¥t biáº¿n Ä‘Æ°á»£c khÃ³a cháº·n:
  INV-BUILD-01  : tri thá»©c offset pháº£i khÃ³a theo build fingerprint cá»§a client.
                  TÃ¡i hiá»‡n sá»± cá»‘ tháº­t 10/09/2026: .data dá»‹ch -0x1000 giá»¯a hai build
                  (.text VSize 0x2E840BE -> 0x2E83B6E) lÃ m 8 static root RVA hardcode
                  lá»‡ch hoÃ n toÃ n vÃ  cáº£ 4 AOB pattern [MISS].
  CROSS-TIER    : SectionLayoutHash cá»§a táº§ng Python PHáº¢I khá»›p byte-for-byte vá»›i
                  C++ ClientBuildId::SectionLayoutHash() (Rule 10 - zero drift).
                  GiÃ¡ trá»‹ C++ Ä‘o Ä‘Æ°á»£c trong phiÃªn 10/09/2026: 0x5c4322f5cdc0551a
                  (stdout cá»§a AutoPOE2_Tests.exe, Test 60).
  AUTHENTIC DATA: má»�i sá»‘ liá»‡u Ä‘á»‘i chiáº¿u Ä‘á»�u láº¥y tá»« tá»‡p PE tháº­t / build record tháº­t,
                  khÃ´ng dÃ¹ng dá»¯ liá»‡u tá»± cháº¿.
é    N)ÚPathÚtoolsÚre_pipelineÚdataÚbuildsÚ0x5C4322F5CDC0551A))ú.texté   i¾@èé   `)z.rdatai `èi¦Ã· i@  @)ú.datai 0 iÜcÑ l   @    i ÐÉTc           
      óÜ   — t          j        |t           j        t          |¦  «        | |¬¦  «        }|D ]8\  }}}}|j                             t          j        |||||¬¦  «        ¦  «         Œ9|S )u\   Dá»±ng ClientBuildId tá»« sá»‘ liá»‡u section (dÃ¹ng sá»‘ liá»‡u THáº¬T, khÃ´ng tá»± cháº¿).)ÚvalidÚmachineÚnumber_of_sectionsÚtime_date_stampÚsize_of_image)ÚnameÚvirtual_addressÚvirtual_sizeÚraw_sizeÚcharacteristics)ÚfpÚClientBuildIdÚIMAGE_FILE_MACHINE_AMD64ÚlenÚsectionsÚappendÚSectionInfo)	Ústampr   r   r   Úbuildr   ÚvaÚvsizeÚcharss	            ú.C:\Projects\AutoPOE2\tests\test_re_pipeline.pyÚ_make_buildr%   /   s”   € åÔØÝÔ+Ý˜x™=œ=ØØ#ðñ ô €Eð #+ð 	
ð 	
Ñˆˆb�%˜ØŒ×ÒÝŒNØØ "Ø"ØØ %ðñ ô ñ	
ô 	
ð 	
ð 	
ð €Ló    c                  óV	  — t           j        } t           j        }d} | ||¦  «        }t           j        }||k    }|�s}t          j        d|fd||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        |¦  «        t          j        |¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx} x}x}x}x}}t           j        } t           j        }d	} | ||¦  «        }d
}||k    }|�s5t          j        d|fd||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        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx} x}x}x}x}}t           j        } t           j        }d} | ||¦  «        }d}||k    }|�s5t          j        d|fd||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        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx} x}x}x}x}}dS )uE   FNV-1a 64-bit pháº£i Ä‘Ãºng vá»›i giÃ¡ trá»‹ chuáº©n Ä‘Ã£ cÃ´ng bá»‘.r&   ©ú==)z£%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.fnv1a
}(%(py5)s
{%(py5)s = %(py3)s.FNV_OFFSET_BASIS
}, %(py7)s)
} == %(py13)s
{%(py13)s = %(py11)s.FNV_OFFSET_BASIS
}r   )Úpy0Úpy2Úpy3Úpy5Úpy7Úpy9Úpy11Úpy13zassert %(py15)sÚpy15Nó   al   Œl2q{
 )z{%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.fnv1a
}(%(py5)s
{%(py5)s = %(py3)s.FNV_OFFSET_BASIS
}, %(py7)s)
} == %(py12)s)r*   r+   r,   r-   r.   r/   Úpy12zassert %(py14)sÚpy14s   foobarl   ègrnÇ¢, )r   Úfnv1aÚFNV_OFFSET_BASISÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)Ú@py_assert1Ú@py_assert4Ú@py_assert6Ú@py_assert8Ú@py_assert12Ú@py_assert10Ú@py_format14Ú@py_format16Ú@py_assert11Ú@py_format13Ú@py_format15s              r$   Útest_fnv1a_known_answerrK   E   s²  € åŒ8ÐD•BÔ'ÐD¨ÐDˆ8ˆ8Ð'¨Ñ-Ô-ÐDµÔ1DÐDÐ-Ð1DÒDÐDÐDÑDÕDÔDÐDÐDÐDÐDÐ-Ð1DÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔD�2ÑDÔDÐDÕDÔD�2ÑDÔDÐDÐDÕDÔDˆ8ÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔD•BÑDÔDÐDÕDÔD•BÑDÔDÐDÐDÕDÔDÐ'ÑDÔDÕDÔD¨ÑDÔDÕDÔDÐ-ÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔDµÑDÔDÐDÕDÔDµÑDÔDÐDÐDÕDÔDÐ1DÑDÔDÐDÐDÑDÐDÐDÐDÐDÐDÑDÐDÕDÕDÔDÐDÑDÔDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDåŒ8ÐD•BÔ'ÐD¨ÐDˆ8ˆ8Ð'¨Ñ.Ô.ÐDÐ2DÐDÐ.Ð2DÒDÐDÐDÑDÕDÔDÐDÐDÐDÐDÐ.Ð2DÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔD�2ÑDÔDÐDÕDÔD�2ÑDÔDÐDÐDÕDÔDˆ8ÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔD•BÑDÔDÐDÕDÔD•BÑDÔDÐDÐDÕDÔDÐ'ÑDÔDÕDÔD¨ÑDÔDÕDÔDÐ.ÑDÔDÕDÔDÐ2DÑDÔDÐDÐDÑDÐDÐDÐDÐDÐDÑDÐDÕDÕDÔDÐDÑDÔDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDåŒ8ÐI•BÔ'ÐI¨ÐIˆ8ˆ8Ð'¨Ñ3Ô3ÐIÐ7IÐIÐ3Ð7IÒIÐIÐIÑIÕIÔIÐIÐIÐIÐIÐ3Ð7IÐIÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔI�2ÑIÔIÐIÕIÔI�2ÑIÔIÐIÐIÕIÔIˆ8ÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔI•BÑIÔIÐIÕIÔI•BÑIÔIÐIÐIÕIÔIÐ'ÑIÔIÕIÔI¨ÑIÔIÕIÔIÐ3ÑIÔIÕIÔIÐ7IÑIÔIÐIÐIÑIÐIÐIÐIÐIÐIÑIÐIÕIÕIÔIÐIÑIÔIÑIÔIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIr&   c                  óÚ  — t          j        t           j        ddz  ¦  «        } d}|| k    }d}| |k    }|r|s¬t          j        d||fd|| |f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}}dS )uB   BÄƒm khÃ´ng Ä‘Æ°á»£c trÃ n khá»�i 64-bit (chá»‘t cháº·n overflow).ó   xi'  r   l   ÿÿÿÿ )ú<=rN   )ú%(py1)s <= %(py4)sz%(py4)s <= %(py6)sÚresult)Úpy1Úpy4Úpy6úassert %(py8)sÚpy8N)r   r6   r7   r8   r9   r=   r:   r;   r<   r>   r?   )rP   Ú@py_assert0Ú@py_assert2Ú@py_assert5Ú@py_assert3Ú@py_format7Ú@py_format9s          r$   Útest_fnv1a_stays_within_uint64r\   N   s  € åŒX•bÔ)¨4°%©<Ñ8Ô8€FØÐ,ˆ1�Ò,Ð,Ð,Ð,�Ð,Ò,Ð,Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð,ˆ1�Ð,Ð,Ñ,Ô,Õ,Ô,ˆ1Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,�Ñ,Ô,Ð,Õ,Ô,�Ñ,Ô,Ð,Ð,Õ,Ô,Ð,Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,r&   c                  óN  — t          j        t          d¦  «        ¦  «        } | j        }d}||u }|sªt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        | ¦  «        rt	          j	        | ¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}x}}| j        }|sxd
dt          j        ¦   «         v st	          j        | ¦  «        rt	          j	        | ¦  «        ndt	          j	        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚d	}| j        }g }||k    }|sªt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        | ¦  «        rt	          j	        | ¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}x}}d	S )uP   Tá»‡p khÃ´ng tá»“n táº¡i pháº£i tháº¥t báº¡i an toÃ n, khÃ´ng nÃ©m ngoáº¡i lá»‡.zZ:/khong_ton_tai/fake.exeF©Úis©z-%(py2)s
{%(py2)s = %(py0)s.valid
} is %(py5)sr    ©r*   r+   r-   úassert %(py7)sr.   Nz)assert %(py2)s
{%(py2)s = %(py0)s.error
}©r*   r+   r(   )z0%(py2)s
{%(py2)s = %(py0)s.sections
} == %(py5)s)r   Úload_pe_headersr   r   r8   r9   r:   r;   r<   r=   r>   r?   Úerrorr   )r    r@   rA   rY   Ú@py_format6Ú@py_format8Ú@py_format3s          r$   Ú)test_load_pe_headers_missing_file_is_saferi   T   s`  € åÔ�tÐ$?Ñ@Ô@ÑAÔA€EØŒ;Ð˜%Ðˆ;˜%ÐÐÐÐÕÔÐÐÐÐˆ;˜%ÐÑÔÐÕÔÑÔÐÐÕÔˆ5ÑÔÐÕÔˆ5ÑÔÐÐÕÔˆ;ÑÔÕÔ˜%ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØŒ;Ðˆ;ÐÐÐÕÔÑÔÐÐÕÔˆ5ÑÔÐÕÔˆ5ÑÔÐÐÕÔˆ;ÑÔÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐØŒ>Ð˜RÐˆ>˜RÒÐÐÐÕÔÐÐÐÐˆ>˜RÐÑÔÐÕÔÑÔÐÐÕÔˆ5ÑÔÐÕÔˆ5ÑÔÐÐÕÔˆ>ÑÔÕÔ˜RÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÐÐr&   c                 ó^  — | dz  }|                      d¦  «         t          j        |¦  «        }|j        }d}||u }|sªt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd	|iz  }t          t	          j        |¦  «        ¦  «        ‚d
x}x}}d}|j        }||v }	|	sªt	          j        d|	fd||f¦  «        t	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }dd	|iz  }t          t	          j        |¦  «        ¦  «        ‚d
x}x}	}d
S )uD   Tá»‡p rÃ¡c khÃ´ng pháº£i PE pháº£i bá»‹ tá»« chá»‘i (magic != 'MZ').zjunk.bins                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   Fr^   r`   r    ra   rb   r.   NÚMZ©Úin)z-%(py1)s in %(py5)s
{%(py5)s = %(py3)s.error
}©rQ   r,   r-   )Úwrite_bytesr   rd   r   r8   r9   r:   r;   r<   r=   r>   r?   re   )
Útmp_pathÚjunkr    r@   rA   rY   rf   rg   rV   rW   s
             r$   Ú#test_load_pe_headers_rejects_non_perr   \   sð  € à�jÑ €DØ×Ò�^Ñ$Ô$Ð$ÝÔ˜tÑ$Ô$€EØŒ;Ð˜%Ðˆ;˜%ÐÐÐÐÕÔÐÐÐÐˆ;˜%ÐÑÔÐÕÔÑÔÐÐÕÔˆ5ÑÔÐÕÔˆ5ÑÔÐÐÕÔˆ;ÑÔÕÔ˜%ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØÐ�5”;Ðˆ4�;ÐÐÐÐÕÔÐÐÐÐˆ4�;ÐÑÔÕÔˆ4ÑÔÐÕÔÑÔÐÐÕÔ�5ÑÔÐÕÔ�5ÑÔÐÐÕÔ�;ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÐÐr&   c                  ó6  — t           j        } d}d} | ||¦  «        }t          |¦  «        }d}||k    }|�sHt          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        t           ¦  «        rt          j        t           ¦  «        ndt          j        | ¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }t          t          j
        |¦  «        ¦  «        ‚dx} x}x}x}x}x}}t           j        } d}d} | ||¦  «        }t          |¦  «        }d}||k    }|�sHt          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        t           ¦  «        rt          j        t           ¦  «        ndt          j        | ¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }t          t          j
        |¦  «        ¦  «        ‚dx} x}x}x}x}x}}dS )uQ   Ä�áº£m báº£o Ä‘á»‹nh dáº¡ng pack dÃ¹ng cho hash khá»›p kÃ­ch thÆ°á»›c kiá»ƒu C++.z<Hé   é   r(   )zt%(py11)s
{%(py11)s = %(py0)s(%(py9)s
{%(py9)s = %(py3)s
{%(py3)s = %(py1)s.pack
}(%(py5)s, %(py7)s)
})
} == %(py14)sr   Ústruct)r*   rQ   r,   r-   r.   r/   r0   r5   zassert %(py16)sÚpy16Nz<Ié ÀÉé   )rv   Úpackr   r8   r9   r:   r;   r<   r=   r>   r?   )	rW   rA   rB   rC   rE   Ú@py_assert13rD   rJ   Ú@py_format17s	            r$   Ú&test_struct_packing_matches_cpp_layoutr}   e   s0  € åŒ{Ð)˜4Ð) Ð)ˆ{ˆ{˜4 Ñ#Ô#Ð)�3Ð#Ñ$Ô$Ð)¨Ð)Ð$¨Ò)Ð)Ð)Ñ)Õ)Ô)Ð)Ð)Ð)Ð)Ð$¨Ð)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�3Ñ)Ô)Ð)Õ)Ô)�3Ñ)Ô)Ð)Ð)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�vÑ)Ô)Ð)Õ)Ô)�vÑ)Ô)Ð)Ð)Õ)Ô)ˆ{Ñ)Ô)Õ)Ô)˜4Ñ)Ô)Õ)Ô) Ñ)Ô)Õ)Ô)Ð#Ñ)Ô)Õ)Ô)Ð$Ñ)Ô)Õ)Ô)¨Ñ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ÝŒ{Ð1˜4Ð1 Ð1ˆ{ˆ{˜4 Ñ+Ô+Ð1�3Ð+Ñ,Ô,Ð1°Ð1Ð,°Ò1Ð1Ð1Ñ1Õ1Ô1Ð1Ð1Ð1Ð1Ð,°Ð1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�3Ñ1Ô1Ð1Õ1Ô1�3Ñ1Ô1Ð1Ð1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�vÑ1Ô1Ð1Õ1Ô1�vÑ1Ô1Ð1Ð1Õ1Ô1ˆ{Ñ1Ô1Õ1Ô1˜4Ñ1Ô1Õ1Ô1 Ñ1Ô1Õ1Ô1Ð+Ñ1Ô1Õ1Ô1Ð,Ñ1Ô1Õ1Ô1°Ñ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1r&   Úre_outÚSMOKEúextraction.json)	Úplayer_addrÚxyz_addrÚshield_addrÚ	mana_addrÚspirit_addrÚingame_addrÚterrain_addrÚcamera_addrÚfog_density_addrc           
      ó’  ‡&‡'— t                                ¦   «         st          j        d¦  «         | dz  }| dz  }t	          j        t           ||¦  «        }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}}|j        } |¦   «         }|s t          j        d¦  «        dz   dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}|j        } |¦   «         }|s t          j        d¦  «        dz   dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}|                     d¬¦  «        }
d}||
v }|s—t          j        d|fd||
f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |
¦  «        rt          j        |
¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d}||
v }|s—t          j        d|fd||
f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |
¦  «        rt          j        |
¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|
                     ¦   «         D �]Y}|                     d¦  «        d                              ¦   «         }t&          D �] }|j        }d}||z   } ||¦  «        }| }|sõt          j        d|› d�¦  «        d z   d!t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd!t          j        |¦  «        d"t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd"t          j        |¦  «        t          j        |¦  «        d#œz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}}�Œ"�Œ[t+          j        t                                d¬¦  «        ¦  «        }t/          t1          |d$         d%         ¦  «        d&¦  «        Š&t/          t1          |d'         d(         ¦  «        d&¦  «        Š'ˆ&ˆ'fd)„|d$         d*         D ¦   «         }|szt          j        d+¦  «        d,z   d-d.t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd.iz  }t          t          j        |¦  «        ¦  «        ‚|D ]ä}||
v }|sÚt          j        d|fd/||
f¦  «        d0t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd0dt          j	        ¦   «         v st          j
        |
¦  «        rt          j        |
¦  «        ndd1œz  }t          j        d2|› �¦  «        d3z   d4|iz  }	t          t          j        |	¦  «        ¦  «        ‚d}Œåt3          j        t1          |¦  «        ¦  «        }	 |                     d5¦  «                             ¦   «         }|szt          j        d6¦  «        d,z   d-d7t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd7iz  }t          t          j        |¦  «        ¦  «        ‚|d         \  }}t;          |¦  «        }||k    }|�s2t          j        d|fd8||f¦  «        d9t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd9d: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        |¦  «        d;œz  }t          j        d<¦  «        d=z   d>|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|                     d?¦  «                             ¦   «         d         }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        dA¦  «        d
z   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|                     dB|f¦  «                             ¦   «         }g }|}|r'|d         d         } t;          | ¦  «        }dC}!||!k    }|}|�skdDdEdFt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndFiz  }|                     |¦  «         |r»t          j        d|fdG||!f¦  «        d:t          j	        ¦   «         v st          j
        t:          ¦  «        rt          j        t:          ¦  «        nd:t          j        | ¦  «        t          j        |¦  «        t          j        |!¦  «        dHœz  }"dIdJ|"iz  }#|                     |#¦  «         t          j         |d¦  «        i z  }$t          j        dK¦  «        dLz   dM|$iz  }%t          t          j        |%¦  «        ¦  «        ‚dx}x}x} x}x}}!| !                    ¦   «          dS # | !                    ¦   «          w xY w)Nu_  VÃ²ng Ä‘á»�i Ä‘áº§y Ä‘á»§: extraction.json -> SQLite + TOML build-keyed.

    Chá»©ng minh 3 invariant trÃªn ARTEFACT THáº¬T do pipeline sinh ra:
      INV-SIG-UNIQUE  : chá»‰ signature match_count==1 vÃ o registry
      INV-BUILD-01    : TOML pháº£i gáº¯n khÃ³a build fingerprint
      INV-OFFSET-01   : khÃ´ng cÃ³ khÃ³a heap tuyá»‡t Ä‘á»‘i nÃ o
    uD   ChÆ°a cÃ³ smoke extraction (cháº¡y re_extract.py --exe ... trÆ°á»›c)úpoe2_offsets.dbzoffsets_TEST.tomlr   r(   ©z%(py0)s == %(py3)sÚrc©r*   r,   u"   build_registry pháº£i thÃ nh cÃ´ngú
>assert %(py5)sr-   Nu$   Pháº£i sinh Ä‘Æ°á»£c SQLite registryzD
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_file
}()
}Údb©r*   r+   rR   u"   Pháº£i sinh Ä‘Æ°á»£c TOML registryÚtomlúutf-8©Úencodingzbuild_time_date_stamp = 0xrl   ©z%(py1)s in %(py3)sÚcontent©rQ   r,   úassert %(py5)szbuild_section_layout_hash = 0xú#ú u   INV-OFFSET-01 VI PHáº M: 'u#   ' xuáº¥t hiá»‡n trong registry TOMLz^
>assert not %(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}((%(py3)s + %(py5)s))
}ÚstrippedÚ	forbidden©r*   r+   r,   r-   rU   rP   Ú
image_baseé   Ú
provenancer   c                 óv   •— g | ]5}|                      d ¦  «        ¯t          j        |‰‰¦  «        ¯-|d         ‘Œ6S )ÚuniqueÚ	signature©ÚgetÚbrÚis_in_image_data_slot©Ú.0ÚcrŸ   r   s     €€r$   ú
<listcomp>z2test_build_registry_end_to_end.<locals>.<listcomp>Ÿ   sV   ø€ ð ð ð àØ�5Š5�‰?Œ?ðõ  "Ô7¸¸:À}ÑUÔUðØ	ˆ+Œðð ð r&   Ú
candidatesu9   Smoke extraction pháº£i cÃ³ Ã­t nháº¥t 1 signature uniqueú
>assert %(py0)sr*   Úunique_sigs)z%(py0)s in %(py2)sr¤   rc   u(   Signature unique bá»‹ máº¥t trong TOML: z
>assert %(py4)srR   z;SELECT build_id, COUNT(*) FROM signatures GROUP BY build_idu4   SQLite pháº£i cÃ³ Ã­t nháº¥t 1 build vá»›i signatureÚrows)z0%(py0)s == %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}Ú	sig_countr   ©r*   r+   r,   r-   u0   Sá»‘ signature trong DB pháº£i khá»›p extractionz
>assert %(py7)sr.   zHSELECT COUNT(*) FROM signatures WHERE unique_ok != 1 OR match_count != 1Úbadu4   INV-SIG-UNIQUE: má»�i record pháº£i match_count == 1z1SELECT file_sha256 FROM builds WHERE build_id = ?é@   z%(py2)sr+   r   )z1%(py8)s
{%(py8)s = %(py4)s(%(py6)s)
} == %(py11)s)rR   rS   rU   r0   z%(py13)sr1   u,   Build record pháº£i cÃ³ SHA-256 Ä‘áº§y Ä‘á»§z
>assert %(py16)srw   )"ÚSMOKE_EXTRACTIONÚis_fileÚpytestÚskipr§   Úbuild_registryr8   r9   r:   r;   r<   r=   Ú_format_assertmsgr>   r?   Ú	read_textÚ
splitlinesÚsplitÚstripÚFORBIDDEN_KEYSÚ
startswithÚjsonÚloadsÚintÚstrÚsqlite3ÚconnectÚexecuteÚfetchallr   Úfetchoner   Ú_format_boolopÚclose)(rp   r�   r’   r�   rW   r@   Ú@py_format4rf   rY   Ú@py_format5r—   rV   Úlinerœ   r�   rA   rB   Ú@py_assert7Ú@py_assert9Ú@py_format10Úpayloadr¯   Ú@py_format1r¤   rh   Úconnr°   Úbuild_idr±   rg   r³   r   rX   rE   Ú@py_format12rF   rJ   r|   rŸ   r   s(                                         @@r$   Útest_build_registry_end_to_endr×   z   sÓ  øø€ õ ×#Ò#Ñ%Ô%ð \ÝŒÐZÑ[Ô[Ð[à	Ð%Ñ	%€BØÐ)Ñ)€Då	Ô	Õ+¨R°Ñ	6Ô	6€BØÐ8ˆ2�Š7Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8ˆ2�Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆ2Ñ8Ô8Ð8Õ8Ô8ˆ2Ñ8Ô8Ð8Ð8Õ8Ô8�Ñ8Ô8Ð8Ð8Ñ8Ð8Õ8Ô8Ð8Ñ8Ô8Ð8Ñ8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8ØŒ:Ð?ˆ:ˆ:‰<Œ<Ð?ˆ<Ð?Õ?Ô?Ð?Ñ?Ô?Ð?Ñ?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?ˆ2Ñ?Ô?Ð?Õ?Ô?ˆ2Ñ?Ô?Ð?Ð?Õ?Ô?ˆ:Ñ?Ô?Õ?Ô?ˆ<Ñ?Ô?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?ØŒ<Ð?ˆ<ˆ<‰>Œ>Ð?ˆ>Ð?Õ?Ô?Ð?Ñ?Ô?Ð?Ñ?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?ˆ4Ñ?Ô?Ð?Õ?Ô?ˆ4Ñ?Ô?Ð?Ð?Õ?Ô?ˆ<Ñ?Ô?Õ?Ô?ˆ>Ñ?Ô?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?à�nŠn gˆnÑ.Ô.€Gð (Ð2Ð'¨7Ð2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð'¨7Ð2Ñ2Ô2Õ2Ô2Ð'Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2¨7Ñ2Ô2Ð2Õ2Ô2¨7Ñ2Ô2Ð2Ð2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ø+Ð6Ð+¨wÐ6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð+¨wÐ6Ñ6Ô6Õ6Ô6Ð+Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6¨wÑ6Ô6Ð6Õ6Ô6¨wÑ6Ô6Ð6Ð6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6ð ×"Ò"Ñ$Ô$ð ñ ˆØ—:’:˜c‘?”? 1Ô%×+Ò+Ñ-Ô-ˆÝ'ð 	ñ 	ˆIØÔ*ð °sð ¨9°s©?ð Ð*Ð*¨?Ñ;Ô;ð Ð;Ð;ð Ð;ð õ ìð \¨YÐ[Ð[Ð[ñô ð ñ ð õ äñô ð ð õ ìð  ñ ô ð õ äð  ñ ô ð ð õ äð +ñ ô ð õ äñô ð ð õ ìð ,5ñ ô ð õ äð ,5ñ ô ð ð õ äð 8;ñ ô õ äð <ñ ô ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ñ ñ	õ ŒjÕ)×3Ò3¸WÐ3ÑEÔEÑFÔF€GÝ•S˜ Ô*¨<Ô8Ñ9Ô9¸2Ñ>Ô>€JÝ�˜G LÔ1°/ÔBÑCÔCÀRÑHÔH€Mðð ð ð ð à˜Ô" <Ô0ðñ ô €Kð
 Ð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ÔSÐSØ ð \ð \ˆ	Ø˜GÐ#Ð[Ð[Ð[Õ[Ô[Ð[Ð[Ð[Ð[ˆy˜GÐ[Ñ[Ô[Ð[Õ[Ô[Ñ[Ô[Ð[Ð[Õ[Ô[ˆyÑ[Ô[Ð[Õ[Ô[ˆyÑ[Ô[Ð[Ð[Ð[Õ[Ô[Ñ[Ô[Ð[Ð[Õ[Ô[˜GÑ[Ô[Ð[Õ[Ô[˜GÑ[Ô[Ð[Ð[Ð[Ð[Ñ[Ð[Õ[Ô[Ð%[ÐPYÐ%[Ð%[Ñ[Ô[Ð[Ñ[Ð[Ð[Ð[Ñ[Ð[Õ[Õ[Ô[Ð[Ñ[Ô[Ñ[Ô[Ð[Ð[Ð[Ð[õ Œ?�3˜r™7œ7Ñ#Ô#€DðØ�|Š|ØIñ
ô 
ç
Š(‰*Œ*ð 	ð ÐKÕKÔKÐKÑKÔKÐKÑKÐKÐKÕKÔKÑKÔKÐKÐKÕKÔKˆtÑKÔKÐKÕKÔKˆtÑKÔKÐKÐKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKØ" 1œgÑˆ�)Ý Ñ,Ô,Ð`ˆyÐ,Ò,Ð`Ð`Ñ`Õ`Ô`Ð`Ð`Ð`Ð`ˆyÐ,Ð`Ñ`Ô`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô`ˆyÑ`Ô`Ð`Õ`Ô`ˆyÑ`Ô`Ð`Ð`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô`�CÑ`Ô`Ð`Õ`Ô`�CÑ`Ô`Ð`Ð`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô` Ñ`Ô`Ð`Õ`Ô` Ñ`Ô`Ð`Ð`Õ`Ô`Ð,Ñ`Ô`Ð`Ð`Ñ`Ð`Õ`Ô`Ð.`Ñ`Ô`Ð`Ñ`Ð`Ð`Ð`Ñ`Ð`Õ`Õ`Ô`Ð`Ñ`Ô`Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ø�lŠlØVñ
ô 
ç
Š(‰*Œ*�Qôˆð ÐOˆs�aŠxÐOÐOÐOÕOÔOÐOÐOÐOÐOˆs�aÐOÑOÔOÐOÕOÔOÑOÔOÐOÐOÕOÔOˆsÑOÔOÐOÕOÔOˆsÑOÔOÐOÐOÕOÔO�aÑOÔOÐOÐOÑOÐOÕOÔOÐOÑOÔOÐOÑOÐOÐOÐOÑOÐOÕOÕOÔOÐOÑOÔOÑOÔOÐOÐOÐOÐOÐOØ—’ÐQÐT\ÐS^Ñ_Ô_×hÒhÑjÔjˆØaÐaˆvÐaˆvÐa˜f Qœi¨œlÐa�#˜lÑ+Ô+Ða¨rÐaÐ+¨rÒ1ÐaÐaÐaÐaÑaÐaÐaÐaÕaÔaÑaÔaÐaÐaÕaÔaˆvÑaÔaÐaÕaÔaˆvÑaÔaÐaÐaÐaÑaÐaÐa×aÒaÐaÑaÔaÐaˆvÐaÕaÔaÐaÐaÐaÐaÐ+¨rÐaÑaÔaÐaÕaÔaÑaÔaÐaÐaÕaÔa�#ÑaÔaÐaÕaÔa�#ÑaÔaÐaÐaÕaÔa˜lÑaÔaÕaÔaÐ+ÑaÔaÕaÔa¨rÑ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ÕaÔaÐ3aÑ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ÐaÐaà�
Š
‰Œˆˆˆøˆ�
Š
‰Œˆˆøøøs   Ý'R3p0 ð0qc            	      óN  — t          d¦  «        } |                      ¦   «         st          j        d¦  «         t	          j        | ¦  «        }|j        }|s•t          j        d|j	        › �¦  «        dz   dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d}|j        }t          j        }||k    }|sòt          j        d|fd	||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd
t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|j        }| j        } |¦   «         }|j        }||k    }|�st          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}}|                     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  }d!d"|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}|j        }d#}||u }|sªt          j        d$|fd%||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|j        }d&}||u }|sªt          j        d$|fd'||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|j        }d(} ||¦  «        }d}||u }|sÐt          j        d$|fd)||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d*œz  }d+d,|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}}t	          j        | ¦  «        }|j        } ||¦  «        }|sÉd-dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d.t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd.t          j        |¦  «        d/œz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}|j        } |¦   «         }|j        } |¦   «         }||k    }|�st          j        d|fd0||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d.t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd.t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}}dS )1uV   Parse má»™t PE THáº¬T luÃ´n cÃ³ trÃªn Windows (khÃ´ng cáº§n game, khÃ´ng cáº§n Admin).zC:\Windows\System32\notepad.exeu.   notepad.exe khÃ´ng cÃ³ trÃªn há»‡ thá»‘ng nÃ yu    Parse notepad.exe tháº¥t báº¡i: ú+
>assert %(py2)s
{%(py2)s = %(py0)s.valid
}r    rc   Nr(   )z]%(py2)s
{%(py2)s = %(py0)s.machine
} == %(py6)s
{%(py6)s = %(py4)s.IMAGE_FILE_MACHINE_AMD64
}r   )r*   r+   rR   rS   rT   rU   é   )ú>=)z:%(py2)s
{%(py2)s = %(py0)s.number_of_sections
} >= %(py5)sra   rb   r.   r   )ú>)z4%(py2)s
{%(py2)s = %(py0)s.size_of_image
} > %(py5)s)z�%(py2)s
{%(py2)s = %(py0)s.file_size
} == %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.stat
}()
}.st_size
}Únotepad©r*   r+   rR   rS   rU   Úpy10úassert %(py12)sr4   r	   ©úis not)z%(py0)s is not %(py3)sÚtextrŽ   r™   r-   Tr^   )z2%(py2)s
{%(py2)s = %(py0)s.executable
} is %(py5)sF)z0%(py2)s
{%(py2)s = %(py0)s.writable
} is %(py5)sz	.khongton)zR%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.find_section
}(%(py4)s)
} is %(py9)s©r*   r+   rR   rS   r/   úassert %(py11)sr0   úOassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.same_build_as
}(%(py3)s)
}Úagainr²   )z”%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.section_layout_hash
}()
} == %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.section_layout_hash
}()
})r   r¶   r·   r¸   r   rd   r   r8   rº   re   r:   r;   r<   r=   r>   r?   r   r   r9   r   r   Ú	file_sizeÚstatÚst_sizeÚfind_sectionÚ
executableÚwritableÚsame_build_asÚsection_layout_hash)rÝ   r    r@   rh   rX   rY   rZ   r[   rA   rf   rg   rÏ   rÐ   Ú@py_format11rI   rã   rW   rÌ   rC   rÑ   rÖ   rç   s                         r$   Útest_parse_real_windows_binaryrñ   »   s3  € åÐ5Ñ6Ô6€GØ�?Š?ÑÔð FÝŒÐDÑEÔEÐEåÔ˜wÑ'Ô'€EØŒ;ÐHˆ;ÐHÕHÔHÐH¸5¼;ÐHÐHÑHÔHÐHÑHÐHÕHÔHÑHÔHÐHÐHÕHÔHˆ5ÑHÔHÐHÕHÔHˆ5ÑHÔHÐHÐHÕHÔHˆ;ÑHÔHÐHÐHÑHÐHÕHÕHÔHÐHÑHÔHÑHÔHÐHÐHÐHØŒ=Ð7�BÔ7Ð7ˆ=Ð7Ò7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7ˆ=Ð7Ð7Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7ˆ5Ñ7Ô7Ð7Õ7Ô7ˆ5Ñ7Ô7Ð7Ð7Õ7Ô7ˆ=Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7�BÑ7Ô7Ð7Õ7Ô7�BÑ7Ô7Ð7Ð7Õ7Ô7Ð7Ñ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7ØÔ#Ð( qÐ(Ð# qÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð# qÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆ5Ñ(Ô(Ð(Õ(Ô(ˆ5Ñ(Ô(Ð(Ð(Õ(Ô(Ð#Ñ(Ô(Õ(Ô( qÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÔÐ" Ð"Ð Ò"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"Ð Ð"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ5Ñ"Ô"Ð"Õ"Ô"ˆ5Ñ"Ô"Ð"Ð"Õ"Ô"ÐÑ"Ô"Õ"Ô" Ñ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ØŒ?Ð4˜gœlÐ4˜l˜l™nœnÐ4˜nÔ4Ð4ˆ?Ð4Ò4Ð4Ð4Ñ4Õ4Ô4Ð4Ð4Ð4Ð4ˆ?Ð4Ð4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4ˆ5Ñ4Ô4Ð4Õ4Ô4ˆ5Ñ4Ô4Ð4Ð4Õ4Ô4ˆ?Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4˜gÑ4Ô4Ð4Õ4Ô4˜gÑ4Ô4Ð4Ð4Õ4Ô4˜lÑ4Ô4Õ4Ô4˜nÑ4Ô4Õ4Ô4Ð4Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4à×Ò˜gÑ&Ô&€DØÐˆ4�tÐÐÐÐÕÔÐÐÐÐˆ4�tÐÑÔÐÕÔÑÔÐÐÕÔˆ4ÑÔÐÕÔˆ4ÑÔÐÐÕÔ�tÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØŒ?Ð"˜dÐ"ˆ?˜dÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ?˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ4Ñ"Ô"Ð"Õ"Ô"ˆ4Ñ"Ô"Ð"Ð"Õ"Ô"ˆ?Ñ"Ô"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ØŒ=Ð!˜EÐ!ˆ=˜EÐ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ=˜EÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆ4Ñ!Ô!Ð!Õ!Ô!ˆ4Ñ!Ô!Ð!Ð!Õ!Ô!ˆ=Ñ!Ô!Õ!Ô!˜EÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!ØÔÐ2˜kÐ2ÐÐ˜kÑ*Ô*Ð2¨dÐ2Ð*¨dÐ2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð*¨dÐ2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ˆ5Ñ2Ô2Ð2Õ2Ô2ˆ5Ñ2Ô2Ð2Ð2Õ2Ô2ÐÑ2Ô2Õ2Ô2˜kÑ2Ô2Õ2Ô2Ð*Ñ2Ô2Õ2Ô2¨dÑ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2õ Ô˜wÑ'Ô'€EØÔÐ%ÐÐ˜uÑ%Ô%Ð%Ð%Ð%Ð%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆ5Ñ%Ô%Ð%Õ%Ô%ˆ5Ñ%Ô%Ð%Ð%Õ%Ô%ÐÑ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%˜uÑ%Ô%Ð%Õ%Ô%˜uÑ%Ô%Ð%Ð%Õ%Ô%Ð%Ñ%Ô%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%ØÔ$ÐEÐ$Ð$Ñ&Ô&ÐE¨%Ô*CÐEÐ*CÐ*CÑ*EÔ*EÐEÐ&Ð*EÒEÐEÐEÑEÕEÔEÐEÐEÐEÐEÐ&Ð*EÐEÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔEˆ5ÑEÔEÐEÕEÔEˆ5ÑEÔEÐEÐEÕEÔEÐ$ÑEÔEÕEÔEÐ&ÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔE¨%ÑEÔEÐEÕEÔE¨%ÑEÔEÐEÐEÕEÔEÐ*CÑEÔEÕEÔEÐ*EÑEÔEÐEÐEÑEÐEÐEÐEÐEÐEÑEÐEÕEÕEÔEÐEÑEÔEÑEÔEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEr&   c                  ó  — dg} t          dd| ¦  «        }t          dd| d¬¦  «        }|j        } ||¦  «        }d}||u }|sût          j        d|fd||f¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}}|j        } ||¦  «        }d}||u }|sût          j        d|fd||f¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}}|j        } ||¦  «        }d}||u }|sût          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}}dS )uO   Build khÃ´ng há»£p lá»‡ (valid=False) khÃ´ng bao giá»� Ä‘Æ°á»£c coi lÃ  khá»›p.)r	   r
   i    r   ii   F)r   Tr^   ©zS%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.same_build_as
}(%(py3)s)
} is %(py8)sÚgoodrž   úassert %(py10)srß   Nr³   )
r%   rî   r8   r9   r:   r;   r<   r=   r>   r?   )	r   rô   r³   r@   rA   rÏ   rB   r[   rð   s	            r$   Ú"test_same_build_as_rejects_invalidrö   Ô   sú  € à5Ð6€HÝ�z 7¨HÑ5Ô5€DÝ
�j '¨8¸5Ð
AÑ
AÔ
A€CØÔÐ+ÐÐ˜dÑ#Ô#Ð+ tÐ+Ð# tÐ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð# tÐ+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆ4Ñ+Ô+Ð+Õ+Ô+ˆ4Ñ+Ô+Ð+Ð+Õ+Ô+ÐÑ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+˜dÑ+Ô+Ð+Õ+Ô+˜dÑ+Ô+Ð+Ð+Õ+Ô+Ð#Ñ+Ô+Õ+Ô+ tÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØÔÐ+ÐÐ˜cÑ"Ô"Ð+ eÐ+Ð" eÐ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð" eÐ+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆ4Ñ+Ô+Ð+Õ+Ô+ˆ4Ñ+Ô+Ð+Ð+Õ+Ô+ÐÑ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+˜cÑ+Ô+Ð+Õ+Ô+˜cÑ+Ô+Ð+Ð+Õ+Ô+Ð"Ñ+Ô+Õ+Ô+ eÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØÔÐ+ÐÐ˜TÑ"Ô"Ð+ eÐ+Ð" eÐ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð" eÐ+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆ3Ñ+Ô+Ð+Õ+Ô+ˆ3Ñ+Ô+Ð+Ð+Õ+Ô+ÐÑ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+˜TÑ+Ô+Ð+Õ+Ô+˜TÑ+Ô+Ð+Ð+Õ+Ô+Ð"Ñ+Ô+Õ+Ô+ eÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+r&   c            	      óî  — t          dt          t          ¦  «        } t          dz  }|                     ¦   «         st          j        d¦  «         t          j        | 	                    d¬¦  «        ¦  «        }d„ |d         D ¦   «         }t          t          |d         d	¦  «        t          |d
         d	¦  «        |¦  «        }| j        } |¦   «         }|j        } |¦   «         }||k    }	|	�s#t          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }
t          j        d¦  «        dz   d|
iz  }t'          t          j        |¦  «        ¦  «        ‚dx}x}x}	x}}| j        } ||¦  «        }d}||u }|sût          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }
t'          t          j        |
¦  «        ¦  «        ‚dx}x}x}}|                     d¦  «        }|                      d¦  «        }g }d}||u}|}|rd}||u}|}|�sXt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd |iz  }|                     |¦  «         |r‹t          j        d|fd!||f¦  «        d"t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd"t          j        |¦  «        d#œz  }d$d%|iz  }|                     |¦  «         t          j        |d¦  «        i z  }d&d'|iz  }t'          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}}|j        }|j        }||z
  }d(}||k    }|�st          j        d)|fd*||f¦  «        d"t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd"t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d+œz  }t          j        d,¦  «        d-z   d.|iz  }t'          t          j        |¦  «        ¦  «        ‚dx}x}x}x}}|                     d/¦  «        }|                      d/¦  «        }|j        }|j        }||z
  }d0}||k    }|�st          j        d)|fd1||f¦  «        d2t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd2t          j        |¦  «        d3t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd3t          j        |¦  «        t          j        |¦  «        d+œz  }t          j        d4¦  «        d-z   d.|iz  }t'          t          j        |¦  «        ¦  «        ‚dx}x}x}x}}dS )5uí   INV-BUILD-01 REPRODUCTION: .data dá»‹ch -0x1000 PHáº¢I lÃ m Ä‘á»•i layout hash.

    Sá»‘ liá»‡u THáº¬T tá»« bin/Release/memprobe_report.txt (build cÅ©, 5 phiÃªn) vÃ  tá»«
    data/builds/6A9E477A.json (build má»›i, Ä‘o 10/09/2026).
    r   z6A9E477A.jsonu$   ChÆ°a cÃ³ build record 6A9E477A.jsonr“   r”   c           	      óž   — g | ]J}|d          t          |d         d¦  «        t          |d         d¦  «        t          |d         d¦  «        f‘ŒKS )r   r   r    r   r   )rÃ   )rª   Úss     r$   r¬   zEtest_inv_build_01_data_section_shift_changes_hash.<locals>.<listcomp>ë   sk   € ð ð ð ð ð ˆfŒIÝ�Ð#Ô$ bÑ)Ô)Ý��.Ô! 2Ñ&Ô&Ý�Ð#Ô$ bÑ)Ô)ð		
ðð ð r&   r   r   r    r   )ú!=)z”%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.section_layout_hash
}()
} != %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.section_layout_hash
}()
}Ú	old_buildÚ	new_buildrÞ   uD   INV-BUILD-01: layout hash pháº£i khÃ¡c nhau khi .data dá»‹ch -0x1000z
>assert %(py12)sr4   NFr^   ró   rž   rõ   rß   r   rá   )z%(py2)s is not %(py5)sÚdata_new)r+   r-   ú%(py7)sr.   )z%(py9)s is not %(py12)sÚdata_old)r/   r4   ú%(py14)sr5   úassert %(py17)sÚpy17r
   r(   )zh(%(py2)s
{%(py2)s = %(py0)s.virtual_address
} - %(py5)s
{%(py5)s = %(py3)s.virtual_address
}) == %(py9)s)r*   r+   r,   r-   r/   uO   Báº±ng chá»©ng thá»±c Ä‘á»‹a: .data pháº£i dá»‹ch Ä‘Ãºng -0x1000 giá»¯a 2 buildz
>assert %(py11)sr0   r	   iP  )zb(%(py2)s
{%(py2)s = %(py0)s.virtual_size
} - %(py5)s
{%(py5)s = %(py3)s.virtual_size
}) == %(py9)sÚtext_oldÚtext_newu/   .text co láº¡i Ä‘Ãºng 0x550 byte giá»¯a 2 build)r%   ÚOLD_BUILD_SIZE_OF_IMAGEÚOLD_BUILD_SECTIONSÚ
BUILDS_DIRr¶   r·   r¸   rÁ   rÂ   r»   rÃ   rï   r8   r9   r:   r;   r<   r=   rº   r>   r?   rî   rë   r   rÊ   r   r   )rû   Úrecord_pathÚrecordÚnew_sectionsrü   r@   rY   rÏ   rÐ   rX   rð   rI   rA   rB   r[   rý   rÿ   rV   rH   rE   rf   rg   rJ   rG   Ú@py_format18rC   rÑ   rÖ   r  r  s                                 r$   Ú1test_inv_build_01_data_section_shift_changes_hashr  Þ   s¤
  € õ ˜AÕ6Õ8JÑKÔK€Iå˜Ñ.€KØ×ÒÑ Ô ð <ÝŒÐ:Ñ;Ô;Ð;ÝŒZ˜×-Ò-°wÐ-Ñ?Ô?Ñ@Ô@€Fðð ð ˜
Ô#ðñ ô €Lõ ÝˆFÐ$Ô% rÑ*Ô*ÝˆF�?Ô# RÑ(Ô(Øñô €Ið Ô(ð Ð(Ð(Ñ*Ô*ð ¨iÔ.Kð Ð.KÐ.KÑ.MÔ.Mð Ð*Ð.MÒMð ð ñ õ ìðð ð ð Ð*Ð.Mð ñ ô ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð õ ìð )ñ ô õ ìð +ñ ô ð õ ìñô ð ð õ ìð /8ñ ô ð õ ìð /8ñ ô ð ð õ ìð /Lñ ô õ ìð /Nñ ô ð ð ñ ð õ ìð 	Oñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ð Ô"Ð6Ð"Ð" 9Ñ-Ô-Ð6°Ð6Ð-°Ð6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð-°Ð6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6ˆ9Ñ6Ô6Ð6Õ6Ô6ˆ9Ñ6Ô6Ð6Ð6Õ6Ô6Ð"Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6 9Ñ6Ô6Ð6Õ6Ô6 9Ñ6Ô6Ð6Ð6Õ6Ô6Ð-Ñ6Ô6Õ6Ô6°Ñ6Ô6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ð ×%Ò% gÑ.Ô.€HØ×%Ò% gÑ.Ô.€HØ8Ð8˜4Ð8ˆ8˜4ÐÐ8Ð8Ð8Ð8Ð8°DÐ8 H°DÐ$8Ð8Ð8Ð8Ð8Ñ8Õ8Ô8Ð8Ð8Ð8Ð8ˆ8˜4Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆ8Ñ8Ô8Ð8Õ8Ô8ˆ8Ñ8Ô8Ð8Ð8Õ8Ô8˜4Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Ð8×8Ò8Ð8Ñ8Ô8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8 H°DÐ8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8 HÑ8Ô8Ð8Õ8Ô8 HÑ8Ô8Ð8Ð8Õ8Ô8°DÑ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Ð8×8Ò8Ð8Ñ8Ô8Ð8Õ8Ô8Ð8Ð8Ñ8Ô8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ØÔ#ð  hÔ&>ð Ð#Ð&>Ñ>ð À&ð Ð>À&ÒHð ð ñ õ ìðð ð ð Ð>À&ð ñ ô ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð õ ìð $ñ ô ð õ ìñô ð ð õ ìð '/ñ ô ð õ ìð '/ñ ô ð ð õ ìð '?ñ ô õ ìð CIñ ô ð ð ñ ð õ ìð 	Zñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ×%Ò% gÑ.Ô.€HØ×%Ò% gÑ.Ô.€HØÔ ð  8Ô#8ð Ð Ð#8Ñ8ð ¸Eð Ð8¸EÒAð ð ñ õ ìðð ð ð Ð8¸Eð ñ ô ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð õ ìð !ñ ô ð õ ìñô ð ð õ ìð $,ñ ô ð õ ìð $,ñ ô ð ð õ ìð $9ñ ô õ ìð =Bñ ô ð ð ñ ð õ ìð 	:ñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð r&   c                  ó¦  — t          j        ¦   «         } | €t          j        d¦  «         t          j        | ¦  «        }|j        }|s•t          j        d|j        › �¦  «        dz   dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d}t          |j        › d�z  }|                     ¦   «         s%t          j        d|j        › d	|j        › d
�¦  «         t%          j        |                     d¬¦  «        ¦  «        }|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|d         }|j        }||k    }|sªt          j        d|fd||f¦  «        t          j        |¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d|j        d›�}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|d         }d|j        d›�}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|d         }|j        }||k    }|sªt          j        d|fd||f¦  «        t          j        |¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d          }|j        }||k    }|sªt          j        d|fd!||f¦  «        t          j        |¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d"         }d|                     ¦   «         d#›�}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|j        d$k    rè|d"         }|t6          k    }|sÍt          j        d|fd%|t6          f¦  «        t          j        |¦  «        d&t          j
        ¦   «         v st          j        t6          ¦  «        rt          j        t6          ¦  «        nd&d'œz  }t          j        d(t6          › d)|d"         › d*�¦  «        d+z   d,|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS dS )-uY   Ä�á»‘i chiáº¿u 3 nguá»“n: build record JSON <-> client tháº­t trÃªn Ä‘Ä©a <-> táº§ng C++.Nõ2   KhÃ´ng tÃ¬m tháº¥y PathOfExile.exe trÃªn mÃ¡y nÃ yõ"   Parse client tháº­t tháº¥t báº¡i: rÙ   Úliverc   ú.jsonu   Client Ä‘Ã£ Ä‘á»•i build (uY   ); cáº§n cháº¡y láº¡i `python tools/re_pipeline/fingerprint.py --hash --json data/builds/z.json`r“   r”   Úschemazautopoe2.client_build_id/v1r(   ©z%(py1)s == %(py4)s©rQ   rR   úassert %(py6)srS   rÕ   )z0%(py1)s == %(py5)s
{%(py5)s = %(py3)s.short_id
}rn   rb   r.   r   Ú0xÚ08Xr   ÚXrè   )z1%(py1)s == %(py5)s
{%(py5)s = %(py3)s.file_size
}r   )z:%(py1)s == %(py5)s
{%(py5)s = %(py3)s.number_of_sections
}rï   Ú016XÚ6A9E477A)z%(py1)s == %(py3)sÚCPP_LAYOUT_HASH_PODr˜   u=   SectionLayoutHash táº§ng Python Lá»†CH vá»›i táº§ng C++ (C++=z	, Python=ú)r�   r-   )r   Úlocate_poe2_executabler·   r¸   rd   r   r8   rº   re   r:   r;   r<   r=   r>   r?   r  Úshort_idr¶   rÁ   rÂ   r»   r9   r   r   rè   r   rï   r  )Úexer  r@   rh   r  r	  rV   rY   rW   rÍ   rZ   rA   rf   rg   rÌ   s                  r$   Ú2test_build_record_matches_live_client_and_cpp_tierr     s£  € å
Ô
#Ñ
%Ô
%€CØ
€{ÝŒÐHÑIÔIÐIåÔ˜cÑ"Ô"€DØŒ:ÐHˆ:ÐHÕHÔHÐH¸D¼JÐHÐHÑHÔHÐHÑHÐHÕHÔHÑHÔHÐHÐHÕHÔHˆ4ÑHÔHÐHÕHÔHˆ4ÑHÔHÐHÐHÕHÔHˆ:ÑHÔHÐHÐHÑHÐHÕHÕHÔHÐHÑHÔHÑHÔHÐHÐHÐHå $¤-Ð6Ð6Ð6Ñ6€KØ×ÒÑ Ô ð 
ÝŒð8¨¬ð 8ð 8à"&¤-ð8ð 8ð 8ñ	
ô 	
ð 	
õ ŒZ˜×-Ò-°wÐ-Ñ?Ô?Ñ@Ô@€FØ�(ÔÐ<Ð<Ð<ÐÐ<Ò<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<ÐÐ<Ð<Ñ<Ô<Õ<Ô<ÐÑ<Ô<Õ<Ô<Ð<Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ø�*ÔÐ. ¤Ð.Ð Ò.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð Ð.Ñ.Ô.Õ.Ô.ÐÑ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô. Ñ.Ô.Ð.Õ.Ô. Ñ.Ô.Ð.Ð.Õ.Ô. Ñ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ØÐ#Ô$ÐGÐ(G¨TÔ-AÐ(GÐ(GÐ(GÐGÐ$Ð(GÒGÐGÐGÐGÕGÔGÐGÐGÐGÐGÐ$Ð(GÐGÑGÔGÕGÔGÐ$ÑGÔGÕGÔGÐ(GÑGÔGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGÐGÐGØ�/Ô"ÐAÐ&A¨4Ô+=Ð&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Ð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Ø�+ÔÐ0 $¤.Ð0Ð .Ò0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð .Ð0Ñ0Ô0Õ0Ô0ÐÑ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0 $Ñ0Ô0Ð0Õ0Ô0 $Ñ0Ô0Ð0Ð0Õ0Ô0 .Ñ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ØÐ&Ô'ÐB¨4Ô+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ÐBÐBÕBÔB¨4ÑBÔBÐBÕBÔB¨4Ñ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ÔBÐBÐBÐBÐBÐBÐBÐBØÐ'Ô(ÐRÐ,R°×1IÒ1IÑ1KÔ1KÐ,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ÐRÐRÐRÐRÐRÑRÐRÕRÕRÔRÐRÑRÔRÑRÔRÐRÐRÐRÐRÐRÐRÐRð „}˜
Ò"Ð"ØÐ+Ô,ð 	
Ð,Õ0CÒCð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð,Õ0Cð 	
ñ 	
ô 	
õ 	
ô 
ð -ñ 	
ô 	
ð 	
õ 	
ô 
ñ	
ô 	
ð 	
ð 	
õ 	
ìõ 1Dñ 	
ô 	
ð 	
õ 	
ô 
õ 1Dñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìðSÝ'ðSð SØ28Ð9NÔ2OðSð Sð Sñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð #Ð"r&   c                  ó�  — t          j        ¦   «         } | €t          j        d¦  «         t          j        | ¦  «        }|j        }|s•t          j        d|j        › �¦  «        dz   dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d}t          |j        › d�z  }|                     ¦   «         st          j        d|j        › d�¦  «         t%          j        |                     d	¬
¦  «        ¦  «        }|                     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¦  «        dz   d|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}d„ |D ¦   «         }t1          |¦  «        }|sªt          j        d¦  «        dz   dt          j
        ¦   «         v st          j        t0          ¦  «        rt          j        t0          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}}t          j        | ¦  «        }|j        }|sxddt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d}|j        }||k    }|sêt          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d¦  «        dz   d |iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}}|j        } ||¦  «        }	|	sÉd!dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        d"œz  }t          t          j        |¦  «        ¦  «        ‚dx}}	dS )#uF   SHA-256 trong build record pháº£i do bÄƒm tháº­t tá»‡p client sinh ra.Nr  r  rÙ   r  rc   r  u   ChÆ°a cÃ³ build record r“   r”   Úfile_sha256Ú r´   r(   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   Úsha)r*   rQ   r,   rS   u*   SHA-256 pháº£i lÃ  chuá»—i hex 64 kÃ½ tá»±z
>assert %(py8)srU   c              3   ó   K  — | ]}|d v V — Œ	dS )Ú0123456789abcdefN© ©rª   r«   s     r$   ú	<genexpr>z8test_build_record_sha256_is_authentic.<locals>.<genexpr>@  s(   è è € Ð4Ð4¨1ˆqÐ&Ð&Ð4Ð4Ð4Ð4Ð4Ð4r&   u    SHA-256 pháº£i lÃ  hex thÆ°á»�ngz.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úallr‘   z)assert %(py2)s
{%(py2)s = %(py0)s.valid
}Úrebuilt)z3%(py2)s
{%(py2)s = %(py0)s.file_sha256
} == %(py4)suN   SHA-256 trong build record pháº£i khá»›p vá»›i tá»‡p client tháº­t trÃªn Ä‘Ä©az
>assert %(py6)srS   ræ   r²   )r   r  r·   r¸   rd   r   r8   rº   re   r:   r;   r<   r=   r>   r?   r  r  r¶   rÁ   rÂ   r»   r¦   r   r9   r*  Úload_pe_headers_with_hashr"  rî   )r  r  r@   rh   r  r	  r$  rW   rX   rA   rZ   r[   rY   rÍ   r+  rf   s                   r$   Ú%test_build_record_sha256_is_authenticr-  0  st  € å
Ô
#Ñ
%Ô
%€CØ
€{ÝŒÐHÑIÔIÐIåÔ˜cÑ"Ô"€DØŒ:ÐHˆ:ÐHÕHÔHÐH¸D¼JÐHÐHÑHÔHÐHÑHÐHÕHÔHÑHÔHÐHÐHÕHÔHˆ4ÑHÔHÐHÕHÔHˆ4ÑHÔHÐHÐHÕHÔHˆ:ÑHÔHÐHÐHÑHÐHÕHÕHÔHÐHÑHÔHÑHÔHÐHÐHÐHå $¤-Ð6Ð6Ð6Ñ6€KØ×ÒÑ Ô ð DÝŒÐB¨d¬mÐBÐBÐBÑCÔCÐCåŒZ˜×-Ò-°wÐ-Ñ?Ô?Ñ@Ô@€FØ
�*Š*�] BÑ
'Ô
'€CÝˆs‰8Œ8ÐG�rÐGˆ8�rŠ>ÐGÐGÑGÕGÔGÐGÐGÐGÐGˆ8�rÐGÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔG�3ÑGÔGÐGÕGÔG�3ÑGÔGÐGÐGÐGÕGÔGÑGÔGÐGÐGÕGÔGˆsÑGÔGÐGÕGÔGˆsÑGÔGÐGÐGÕGÔGˆ8ÑGÔGÕGÔG�rÑGÔGÐGÐGÑGÐGÕGÔGÐGÑGÔGÐGÑGÐGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGÐGÐGØ4Ð4°Ð4Ñ4Ô4ÐX�3Ð4Ñ4Ô4ÐXÐ4ÐXÕXÔXÐ6XÑXÔXÐXÑXÐXÕXÔXÑXÔXÐXÐXÕXÔX�3ÑXÔXÐXÕXÔX�3ÑXÔXÐXÐXÕXÔXÐ4ÑXÔXÕXÔXÐ4ÑXÔXÐXÐXÑXÐXÕXÕXÔXÐXÑXÔXÑXÔXÐXÐXÐXÐXÐXåÔ*¨3Ñ/Ô/€GØŒ=Ðˆ=ÐÐÐÕÔÑÔÐÐÕÔˆ7ÑÔÐÕÔˆ7ÑÔÐÐÕÔˆ=ÑÔÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐØÔð Ð #Ò%ð ð ð õ ìðð ð ð Ð #ð ñ ô ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð õ ìð ñ ô ð õ ìñô ð ð õ ìð #&ñ ô ð õ ìð #&ñ ô ð ð ð ð ñ ð õ ìð 	Yñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð Ô Ð&Ð Ð  Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ7Ñ&Ô&Ð&Õ&Ô&ˆ7Ñ&Ô&Ð&Ð&Õ&Ô&Ð Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô& Ñ&Ô&Ð&Õ&Ô& Ñ&Ô&Ð&Ð&Õ&Ô&Ð&Ñ&Ô&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&r&   c                  óV  ‡‡— t           dz  dz  dz  dz  } |                      ¦   «         st          j        d¦  «         t	          j        |                      d¬¦  «        ¦  «        }|d         d	         }d}||k    }|slt          j        d
|fd||f¦  «        t          j	        |¦  «        t          j	        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}t          t          |d         d         ¦  «        d¦  «        Št          t          |d         d         ¦  «        d¦  «        Š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  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}d„ |d         d         D ¦   «         }
|
szt          j        d¦  «        dz   ddt          j        ¦   «         v st          j        |
¦  «        rt          j	        |
¦  «        ndiz  }t          t          j        |¦  «        ¦  «        ‚|
D �]®}t$          j        } ||‰‰¦  «        }d}||u }|�s�t          j        d |fd!||f¦  «        d"t          j        ¦   «         v st          j        t$          ¦  «        rt          j	        t$          ¦  «        nd"t          j	        |¦  «        d#t          j        ¦   «         v st          j        |¦  «        rt          j	        |¦  «        nd#dt          j        ¦   «         v st          j        ‰¦  «        rt          j	        ‰¦  «        nddt          j        ¦   «         v st          j        ‰¦  «        rt          j	        ‰¦  «        ndt          j	        |¦  «        t          j	        |¦  «        d$œz  }d%d&|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}�Œ°ˆˆfd'„|d         d         D ¦   «         }|szt          j        d(¦  «        dz   dd)t          j        ¦   «         v st          j        |¦  «        rt          j	        |¦  «        nd)iz  }t          t          j        |¦  «        ¦  «        ‚|D �]á}t%          j        |d*         ‰¦  «        }d+}||k    }|‰k     }|r|s×t          j        d,||fd-||‰f¦  «        t          j	        |¦  «        d.t          j        ¦   «         v st          j        |¦  «        rt          j	        |¦  «        nd.dt          j        ¦   «         v st          j        ‰¦  «        rt          j	        ‰¦  «        ndd/œz  }	d0d1|	iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d2         }t$          j        }||v }|s´t          j        d3|fd4||f¦  «        t          j	        |¦  «        d"t          j        ¦   «         v st          j        t$          ¦  «        rt          j	        t$          ¦  «        nd"t          j	        |¦  «        d5œz  }	d0d1|	iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}�ŒãdS )6u;  Extract tháº­t 6A9E477A cÃ³ slot tdb/TEB unique â€” registry PHáº¢I loáº¡i.

    Artefact: data/re_out/6A9E477A/extraction.json (PyGhidra 10/09/2026,
    PathOfExile.exe SHA-256 e0cde00d...7504). Slot tdb ff00000058 khÃ´ng náº±m
    trong SizeOfImage=0x4C9C000 nÃªn khÃ´ng Ä‘Æ°á»£c thÃ nh static_root/AOB TOML.
    r   r~   r  r€   u'   ChÆ°a cÃ³ extract Ä‘áº§y Ä‘á»§ 6A9E477Ar“   r”   r¡   rÕ   r(   r  r  r  rS   NrP   rŸ   r    r   rx   rŒ   rŽ   r™   r-   c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )ÚblockÚtdb)r¦   r(  s     r$   r¬   zMtest_in_image_filter_rejects_tdb_from_live_client_extract.<locals>.<listcomp>[  s3   € ð ð ð Ø°a·e²e¸G±n´nÈÒ6MÐ6MˆÐ6MÐ6MÐ6Mr&   r­   uE   Extract tháº­t pháº£i cÃ²n ghi nháº­n slot tdb (khÃ´ng xÃ³a artefact)r®   r*   Ú	tdb_slotsFr^   )zn%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.is_in_image_data_slot
}(%(py3)s, %(py4)s, %(py5)s)
} is %(py10)sr§   Úslot)r*   r+   r,   rR   r-   r.   rß   rà   r4   c                 óœ   •— g | ]H}|                      d ¦  «        r1|                      d¦  «        dk    ¯0t          j        |‰‰¦  «        ¯F|‘ŒIS )r£   Úmatch_counté   r¥   r©   s     €€r$   r¬   zMtest_in_image_filter_rejects_tdb_from_live_client_extract.<locals>.<listcomp>b  sg   ø€ ð ð ð àØ�5Š5�‰?Œ?ðð �EŠE�-Ñ Ô  AÒ%Ð%ÝÔ$ Q¨
°MÑBÔBð &ð 	
ð &Ð%Ð%r&   u5   Pháº£i cÃ²n signature UNIQUE náº±m trong .data/.rdataÚacceptedÚaddressr   )rN   ú<)rO   z%(py4)s < %(py5)sÚrva)rQ   rR   r-   rb   r.   r0  rl   )z<%(py1)s in %(py5)s
{%(py5)s = %(py3)s.IN_IMAGE_DATA_BLOCKS
}rn   )Ú	REPO_ROOTr¶   r·   r¸   rÁ   rÂ   r»   r8   r9   r=   r>   r?   rÃ   rÄ   r:   r;   r<   rº   r§   r¨   Úrva_from_addressÚIN_IMAGE_DATA_BLOCKS)Ú
extractionrÒ   rV   rY   rW   rÍ   rZ   r@   rÌ   rf   r2  rÓ   r3  rB   rÐ   rC   rð   rI   r7  r	  r:  rg   rA   rŸ   r   s                          @@r$   Ú9test_in_image_filter_rejects_tdb_from_live_client_extractr?  J  sn  øø€ õ ˜VÑ# hÑ.°Ñ;Ð>OÑO€JØ×ÒÑÔð ?ÝŒÐ=Ñ>Ô>Ð>åŒj˜×-Ò-°wÐ-Ñ?Ô?Ñ@Ô@€GØ�<Ô  Ô,Ð:°
Ð:Ð,°
Ò:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð,°
Ð:Ñ:Ô:Õ:Ô:Ð,Ñ:Ô:Õ:Ô:°
Ñ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ý•S˜ Ô*¨<Ô8Ñ9Ô9¸2Ñ>Ô>€JÝ�˜G LÔ1°/ÔBÑCÔCÀRÑHÔH€MØ%Ð%ˆ=˜IÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ=˜IÐ%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆ=Ñ%Ô%Ð%Õ%Ô%ˆ=Ñ%Ô%Ð%Ð%Õ%Ô%˜IÑ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%ðð Ø˜8Ô$ \Ô2ðñ ô €Ið Ð]Õ]Ô]Ð]Ñ]Ô]Ð]Ñ]Ð]Ð]Õ]Ô]Ñ]Ô]Ð]Ð]Õ]Ô]ˆ9Ñ]Ô]Ð]Õ]Ô]ˆ9Ñ]Ô]Ð]Ð]Ð]Ñ]Ð]Õ]Õ]Ô]Ð]Ñ]Ô]Ñ]Ô]Ð]Øð Rñ RˆÝÔ'ÐQÐ'Ð'¨¨j¸-ÑHÔHÐQÈEÐQÐHÈEÐQÐQÐQÑQÕQÔQÐQÐQÐQÐQÐHÈEÐQÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQ�rÑQÔQÐQÕQÔQ�rÑ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ÔQÑQÔQÐQÐQÕQÔQ¨jÑQÔQÐQÕQÔQ¨jÑQÔQÐQÐQÐQÕQÔQÑQÔQÐQÐQÕQÔQ¸-ÑQÔQÐQÕQÔQ¸-ÑQÔQÐQÐQÕQÔQÐHÑQÔQÕQÔQÈEÑ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ÐQÑQðð ð ð ð à˜Ô" <Ô0ðñ ô €Hð ÐLÕLÔLÐLÑLÔLÐLÑLÐLÐLÕLÔLÑLÔLÐLÐLÕLÔLˆ8ÑLÔLÐLÕLÔLˆ8ÑLÔLÐLÐLÐLÑLÐLÕLÕLÔLÐLÑLÔLÑLÔLÐLØð :ñ :ˆÝÔ! &¨Ô"3°ZÑ@Ô@ˆØÐ'ˆq�CÒ'Ð'�C˜-Ò'Ð'Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð'ˆq�C˜-Ð'Ñ'Ô'Õ'Ô'ˆqÑ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�CÑ'Ô'Ð'Õ'Ô'�CÑ'Ô'Ð'Ð'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'˜-Ñ'Ô'Ð'Õ'Ô'˜-Ñ'Ô'Ð'Ð'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ø�gŒÐ9¥"Ô"9Ð9ˆÐ"9Ð9Ð9Ð9Ð9Õ9Ô9Ð9Ð9Ð9Ð9ˆÐ"9Ð9Ñ9Ô9Õ9Ô9ˆÑ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9¥"Ñ9Ô9Ð9Õ9Ô9¥"Ñ9Ô9Ð9Ð9Õ9Ô9Ð"9Ñ9Ô9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ñ9ð:ð :r&   c                 ó4  — t           j                             dt          t          dz  dz  ¦  «        ¦  «         ddl}d}| dz  }t          j        t          |¦  «        ¦  «        }|                     d¦  «         |                     dd	d
dt          j
        dd|dœ¦  «        dddf¦  «         |                     ¦   «          |                     ¦   «          ddd	dddd|ddœddddddœgdœ}| dz  }|                     t          j
        |¦  «        d ¬!¦  «         | d"z  }|                     d#d ¬!¦  «         |                     |||¦  «        }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  }d(d)|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}
}	t          j        t          |¦  «        ¦  «        }|                     d*¦  «                             ¦   «         }|                     ¦   «          d+}||v }	|	s—t          j        d,|	fd-||f¦  «        t          j        |¦  «        d.t#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd.d/œz  }d(d)|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}}	d0„ |D ¦   «         }
t1          |
¦  «        }|s•d1d2t#          j        ¦   «         v st          j        t0          ¦  «        rt          j        t0          ¦  «        nd2t          j        |
¦  «        t          j        |¦  «        d3œz  }t+          t          j        |¦  «        ¦  «        ‚dx}
}|                     d ¬!¦  «        }d}||v }	|	s—t          j        d,|	fd-||f¦  «        t          j        |¦  «        d4t#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd4d/œz  }d(d)|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}}	g }
d}	|	|v}|}|sd5}||v }|}|�sXt          j        d6|fd7|	|f¦  «        t          j        |	¦  «        d4t#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd4d8œz  }d9d:|iz  }|
                     |¦  «         |s‹t          j        d,|fd;||f¦  «        t          j        |¦  «        d4t#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd4d<œz  }d=d>|iz  }|
                     |¦  «         t          j        |
d¦  «        i z  }d?d@|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}x}
x}	x}x}}dA}||v }	|	s—t          j        d,|	fd-||f¦  «        t          j        |¦  «        d4t#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd4d/œz  }d(d)|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}}	dB}||v }	|	s—t          j        d,|	fd-||f¦  «        t          j        |¦  «        d4t#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd4d/œz  }d(d)|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}}	|j        }
dC} |
|¦  «        }d}||k    }|sÐt          j        d$|fdD||f¦  «        d4t#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd4t          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dEœz  }dFdG|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}
x}x}x}}dS )Hu[  Live labeler UPDATE target InGameState theo RVA live 0x45C9C90.

    RVA láº¥y tá»« MemProbe label-registry PID 36104 (10/09/2026 14:00:17),
    ValidateInGameState + ResolvePlayer maxHP=1330. KhÃ´ng dÃ¹ng fan-in cao
    0x45CF0A0 (LOCK ADD, khÃ´ng pháº£i InGameState). KhÃ³a heap cáº¥m (player_addr)
    pháº£i bá»‹ bá»� qua (INV-OFFSET-01).
    r   r   r   NÚ	0x45C9C90r‹   aÉ  
        CREATE TABLE offsets (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            build_id TEXT NOT NULL,
            kind TEXT NOT NULL,
            target TEXT NOT NULL,
            payload TEXT NOT NULL,
            validator_id TEXT,
            source TEXT NOT NULL,
            discovered_at TEXT NOT NULL,
            last_verified TEXT,
            hit_count INTEGER DEFAULT 0,
            miss_count INTEGER DEFAULT 0
        )
        zŸ
        INSERT INTO offsets (
            build_id, kind, target, payload, validator_id, source, discovered_at
        ) VALUES (?, ?, ?, ?, ?, ?, ?)
        r  Úaob_patternÚ
unreviewedzF0 48 01 1Dry   )ÚpatternÚ
rip_offsetÚ
target_rvaÚValidateInGameStateÚ	static_rez10/09/2026 13:15:06zautopoe2.live_label/v1z10/09/2026 13:45:00Ú0x3E8ÚInGameStateÚstatic_rootr6  z ResolveInGameState+ResolvePlayer)ÚtargetÚkindÚindexr:  Úevidencer�   ÚheapÚ0x8853EF06Czmust-reject)r  Úgenerated_atrÕ   Úentity_map_offsetÚlabelszlive_label_6A9E477A.jsonr“   r”   zoffsets_6A9E477A.tomlz^# test
build_time_date_stamp = 0x6A9E477A
static_root_1 = 0x45CF0A0
static_root_2 = 0x45C9C90
r(   rŒ   r�   rŽ   r™   r-   z%SELECT target, hit_count FROM offsets)rJ  r6  rl   r–   r°   r˜   c              3   ó.   K  — | ]}|d          dk    V — ŒdS )r   r�   Nr'  )rª   Úrows     r$   r)  zJtest_label_targets_assigns_ingame_and_rejects_heap_keys.<locals>.<genexpr>È  s+   è è € Ð7Ð7¨3ˆs�1Œv˜Ò&Ð7Ð7Ð7Ð7Ð7Ð7r&   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}r*  r‘   rã   u   Bá»� qua)únot in)z%(py3)s not in %(py5)s)r,   r-   rþ   r.   )z%(py10)s in %(py12)s)rß   r4   r   r5   r  r  zentity_map_offset = 0x3E8zstatic_root_1 = 0x45C9C90z# LIVE)zK%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.count
}(%(py4)s)
} == %(py9)srä   rå   r0   )ÚsysÚpathÚinsertrÄ   r;  Úlabel_targetsrÅ   rÆ   rÇ   rÁ   ÚdumpsÚcommitrË   Ú
write_textÚapply_labelsr8   r9   r:   r;   r<   r=   r>   r?   rÈ   r*  r»   r   rÊ   Úcount)rp   Últr:  r�   rÔ   ÚreportÚreport_pathÚ	toml_pathr�   rW   r@   rÌ   rf   r°   rV   rY   rÍ   rã   rA   rÐ   rH   rg   rI   rJ   rG   r  rX   rC   rÏ   rÑ   rÖ   s                                  r$   Ú7test_label_targets_assigns_ingame_and_rejects_heap_keysre  p  sW	  € õ „H‡O‚O�A•s�9 wÑ.°Ñ>Ñ?Ô?Ñ@Ô@Ð@ØÐÐÐà
€CØ	Ð%Ñ	%€BÝŒ?�3˜r™7œ7Ñ#Ô#€DØ‡L‚Lð	ñô ð ð" 	‡L‚Lð	ð ØØÝŒJ =ÀÐQTÐUÐUÑVÔVØ!ØØ!ð	
ñô ð ð  	‡K‚K�M„M€MØ‡J‚J�L„L€Lð +Ø-ØØ$ð (Ø%ØØØ>ðð ð (ØØØ$Ø)ðð ð
ðð €Fð, Ð7Ñ7€KØ×Ò�4œ: fÑ-Ô-¸ÐÑ@Ô@Ð@ØÐ2Ñ2€IØ×Òð	Aàð ñ ô ð ð 
�Š˜ b¨)Ñ	4Ô	4€BØ€Nˆ2�Š7€N€N€N…N„N€N€N€N€Nˆ2�€N�N„N€N…N„N�N„N€N€N…N„Nˆ2�N„N€N…N„Nˆ2�N„N€N€N…N„N��N„N€N€N�N€N€N€N€N€N�N€N…N…N„N€N�N„N�N„N€N€N€N€N€NåŒ?�3˜r™7œ7Ñ#Ô#€DØ�<Š<Ð?Ñ@Ô@×IÒIÑKÔK€DØ‡J‚J�L„L€LØÐ%Ð Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð Ð%Ñ%Ô%Õ%Ô%ÐÑ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô% Ñ%Ô%Ð%Õ%Ô% Ñ%Ô%Ð%Ð%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ø7Ð7°$Ð7Ñ7Ô7Ð7�3Ð7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7�3Ñ7Ô7Ð7Õ7Ô7�3Ñ7Ô7Ð7Ð7Õ7Ô7Ð7Ñ7Ô7Õ7Ô7Ð7Ñ7Ô7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ø×Ò¨ÐÑ0Ô0€DØÐ ˆ=˜DÐ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ=˜DÐ Ñ Ô Õ Ô ˆ=Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˜DÑ Ô Ð Õ Ô ˜DÑ Ô Ð Ð Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ø:Ð:ˆ=Ð:ˆ= Ð$Ð:Ð:Ð:Ð:Ð:¨
Ð:¨
°dÐ(:Ð:Ð:Ð:Ð:Ñ:Õ:Ô:Ð:Ð:Ð:Ð:ˆ= Ð:Ñ:Ô:Õ:Ô:ˆ=Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô: Ñ:Ô:Ð:Õ:Ô: Ñ:Ô:Ð:Ð:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Ð:×:Ò:Ð:Ñ:Ô:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:¨
°dÐ:Ñ:Ô:Õ:Ô:¨
Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:°dÑ:Ô:Ð:Õ:Ô:°dÑ:Ô:Ð:Ð:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Ð:×:Ò:Ð:Ñ:Ô:Ð:Õ:Ô:Ð:Ð:Ñ:Ô:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ø&Ð.Ð&¨$Ð.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð&¨$Ð.Ñ.Ô.Õ.Ô.Ð&Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.¨$Ñ.Ô.Ð.Õ.Ô.¨$Ñ.Ô.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ø&Ð.Ð&¨$Ð.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð&¨$Ð.Ñ.Ô.Õ.Ô.Ð&Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.¨$Ñ.Ô.Ð.Õ.Ô.¨$Ñ.Ô.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.ØŒ:Ð$�hÐ$ˆ:ˆ:�hÑÔÐ$ 1Ð$Ð 1Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$Ð 1Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ˆ4Ñ$Ô$Ð$Õ$Ô$ˆ4Ñ$Ô$Ð$Ð$Õ$Ô$ˆ:Ñ$Ô$Õ$Ô$�hÑ$Ô$Õ$Ô$ÐÑ$Ô$Õ$Ô$ 1Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$r&   )T).Ú__doc__Úbuiltinsr:   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter8   rÁ   rÅ   rv   rX  Úpathlibr   r·   Ú__file__ÚresolveÚparentr;  rY  rZ  rÄ   Úfingerprintr   r  r  r  r  r%   rK   r\   ri   rr   r}   ÚRE_PIPELINE_DIRr¹   r§   rµ   r¿   r×   rñ   rö   r  r   r-  r?  re  r'  r&   r$   ú<module>rq     s?  ððð ð$ € € € € € € € € € € € € €€€€Ø €€€Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ð Ð à €€€àˆD�‰NŒN×"Ò"Ñ$Ô$Ô+Ô2€	Ø „‡‚��3�3�y 7Ñ*¨]Ñ:Ñ;Ô;Ñ <Ô <Ð <à Ð Ð Ð à˜Ñ (Ñ*€
ð +Ð ðð ð Ð ð
 $Ð ðð ð ð ð,Jð Jð Jð-ð -ð -ð ð  ð  ðð ð ð2ð 2ð 2ð ˜gÑ%¨Ñ5€Ø „‡‚��3�3�Ñ'Ô'Ñ (Ô (Ð (à Ð Ð Ð à˜vÑ%¨Ñ0°7Ñ:Ð=NÑNÐ ð€ð>ð >ð >ðBFð Fð Fð2,ð ,ð ,ð-ð -ð -ð`
ð 
ð 
ðD'ð 'ð 'ð4#:ð #:ð #:ðL^%ð ^%ð ^%ð ^%ð ^%r&   