§
    á+¬j[7  ã                  ó  — d Z ddlm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mZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlm Z m!Z! ddl"m#Z#  G d„ d	ej$        ¦  «        Z%e&d
k    r ej'        ¦   «          dS dS )uP  AutoPOE2 - Test Suite Kiá»ƒm Chá»©ng Dynamic Resolution Scaling Engine (Doc 63 / SSoT 2026).
=======================================================================================
Kiá»ƒm thá»­ toÃ n diá»‡n:
1. TÃ­nh báº¥t biáº¿n toÃ¡n há»�c cá»§a co giÃ£n tuyáº¿n tÃ­nh vÃ  tÃ­nh Ä‘á»‘i xá»©ng thuáº­n nghá»‹ch (Round-trip Idempotency <= 1px).
2. Sai sá»‘ tá»�a Ä‘á»™ <= 1px trÃªn 4 UI Elements trá»�ng yáº¿u:
   - NÃºt TRAVERSE (Text center & Frame center).
   - Khay cáº¯m Waystone (Socket Map Device & Khay Waystone HÃ ng 1 Atlas).
   - LÆ°á»›i HÃ²m Ä‘á»“ Stash (12x12) vÃ  TÃºi Ä‘á»“ Inventory (12x5).
   - Báº£ng Ä‘iá»�u khiá»ƒn SÃ n Ngoáº¡i Há»‘i Faustus Currency Exchange.
3. Ä�á»™ phá»§ cÃ¡c Ä‘á»™ phÃ¢n giáº£i: 1920x1080 (SSoT), 2560x1440 (1440p), 1189x891 (Windowed PID 22632), 1280x720 (720p).
4. TÃ­nh khÃ¡ng lá»—i trÃªn cÃ¡c Ä‘á»™ phÃ¢n giáº£i báº¥t thÆ°á»�ng: Ultrawide (21:9, 32:9), kÃ­ch thÆ°á»›c siÃªu nhá»� (640x480), kÃ­ch thÆ°á»›c dá»‹ biá»‡t.

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 5: Sá»­ dá»¥ng dá»¯ liá»‡u thá»±c nghiá»‡m vÃ  ground-truth.
- Rule 14: Quality Gate, 100% tests PASS.
é    )ÚannotationsN)ÚImage)ÚCoordinateScalerÚ
ResolutionÚScalingModeÚ	RES_1080PÚ	RES_1440PÚRES_720PÚRES_4KÚRES_WINDOWED_DEFAULTÚget_faustus_element_posÚget_inventory_slot_posÚget_stash_slot_posÚget_traverse_button_bboxÚget_traverse_button_posÚget_waystone_socket_posÚget_waystone_tray_slot_posÚresolve_resolution)Úfind_traverse_button_dual_passÚmatch_traverse_template_edge)Úfind_map_device_screen_posc                  óR   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zdd	„Z	dd
„Z
dd„ZdS )ÚTestDynamicResolutionScalingu:   Test suite kiá»ƒm thá»­ Dynamic Resolution Scaling Engine.ÚreturnÚNonec                óø  — t          dd¦  «        }|                      |j        ¦  «         |                      |j        ¦  «         |                      |j        ¦  «         |                      |j        dd¬¦  «         t          dd¦  «        }|                      |j        ¦  «         t          dd	¦  «        }|                      |j        ¦  «         t          d
d¦  «        }|                      |j        ¦  «         |                      |j        ¦  «         |                      |j        ¦  «         |                      |j        dd¬¦  «         t          dd¦  «        }|                      |j        ¦  «         |                      t          ¦  «        5  t          dd¦  «         ddd¦  «         n# 1 swxY w Y   |                      t          ¦  «        5  t          dd¦  «         ddd¦  «         dS # 1 swxY w Y   dS )uZ   Kiá»ƒm chá»©ng tÃ­nh báº¥t biáº¿n cá»§a Resolution vÃ  phÃ¢n loáº¡i tá»· lá»‡ khung hÃ¬nh.i€  é8  gÇqÇqü?é   )Úplacesé 
  é   é   éÐ  é¥  é{  g€Ù±/îYõ?ép  r   Néÿÿÿÿ)
r   Ú
assertTrueÚis_standard_16_9ÚassertFalseÚis_windowed_aspectÚis_ultrawideÚassertAlmostEqualÚaspect_ratioÚassertRaisesÚ
ValueError)ÚselfÚres_1080Úres_1440Úres_720Úres_winÚres_uws         ú5C:\Projects\AutoPOE2\tests\test_resolution_scaling.pyÚ5test_resolution_dataclass_and_aspect_ratio_invariantszRTestDynamicResolutionScaling.test_resolution_dataclass_and_aspect_ratio_invariants7   s[  € õ ˜d DÑ)Ô)ˆØ�Š˜Ô1Ñ2Ô2Ð2Ø×Ò˜Ô4Ñ5Ô5Ð5Ø×Ò˜Ô.Ñ/Ô/Ð/Ø×Ò˜xÔ4°jÈÐÑKÔKÐKõ ˜d DÑ)Ô)ˆØ�Š˜Ô1Ñ2Ô2Ð2õ ˜T 3Ñ'Ô'ˆØ�Š˜Ô0Ñ1Ô1Ð1õ ˜T 3Ñ'Ô'ˆØ×Ò˜Ô1Ñ2Ô2Ð2Ø�Š˜Ô2Ñ3Ô3Ð3Ø×Ò˜Ô-Ñ.Ô.Ð.Ø×Ò˜wÔ3°^ÈAÐÑNÔNÐNõ ˜D $Ñ'Ô'ˆØ�Š˜Ô+Ñ,Ô,Ð,ð ×Ò�zÑ*Ô*ð 	 ð 	 Ý�q˜$ÑÔÐð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 à×Ò�zÑ*Ô*ð 	!ð 	!Ý�t˜RÑ Ô Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!s$   ÆF,Æ,F0Æ3F0ÇG/Ç/G3Ç6G3c                óN  — t           t          t          t          t	          dd¦  «        t	          dd¦  «        g}d„ t          ddd¦  «        D ¦   «         }|D ]Î}t          t          |¬	¦  «        }|D ]³\  }}|                     ||¦  «        \  }}| 	                    ||¦  «        \  }	}
t          |	|z
  ¦  «        }t          |
|z
  ¦  «        }|                      |d
d|› d|› d|› d|› d|	› d|
› d|› �¦  «         |                      |d
d|› d|› d|› d|› d|	› d|
› d|› �¦  «         Œ´ŒÏdS )uÿ   Kiá»ƒm chá»©ng tÃ­nh báº¥t biáº¿n chuyá»ƒn Ä‘á»•i thuáº­n nghá»‹ch (Round-trip Idempotency <= 1px).

        Báº¥t biáº¿n: INV-SCALE-IDEMPOTENT-1PX:
        Tá»�a Ä‘á»™ chuyá»ƒn tá»« A -> B -> A pháº£i sai sá»‘ tá»‘i Ä‘a <= 1 pixel do lÃ m trÃ²n.
        iV  é   r    r   c                ó>   — g | ]}t          d dd¦  «        D ]}||f‘ŒŒS )éd   iè  é–   )Úrange)Ú.0ÚxÚys      r7   ú
<listcomp>z[TestDynamicResolutionScaling.test_linear_scaling_round_trip_idempotency.<locals>.<listcomp>i   sO   € ð 
ð 
ð 
àÝ˜3  cÑ*Ô*ð
ð 
ð ð �ˆFð
ð 
ð 
ð 
ó    r<   i  éÈ   )Ú
source_resÚ
target_resé   u.   Sai sá»‘ trá»¥c X vÆ°á»£t ngÆ°á»¡ng 1px: src=(z, z), tgt=(z), rec=(u   ) trÃªn res=u.   Sai sá»‘ trá»¥c Y vÆ°á»£t ngÆ°á»¡ng 1px: src=(N)r	   r
   r   r   r   r>   r   r   Útransform_pointÚinverse_transform_pointÚabsÚassertLessEqual)r1   Úresolutions_to_testÚtest_pointsrF   ÚscalerÚsrc_xÚsrc_yÚtgt_xÚtgt_yÚrec_xÚrec_yÚdxÚdys                r7   Ú*test_linear_scaling_round_trip_idempotencyzGTestDynamicResolutionScaling.test_linear_scaling_round_trip_idempotencyY   s   € õ ÝÝÝ Ý�t˜SÑ!Ô!Ý�t˜TÑ"Ô"ð
Ðð
ð 
å˜3  cÑ*Ô*ð
ñ 
ô 
ˆð .ð 	ð 	ˆJÝ%µÀzÐRÑRÔRˆFØ +ð ð ‘��uà%×5Ò5°e¸UÑCÔC‘��uà%×=Ò=¸eÀUÑKÔK‘��uå˜ ™Ñ'Ô'�Ý˜ ™Ñ'Ô'�à×$Ò$Ø˜ð ^ÀUð  ^ð  ^Èeð  ^ð  ^Ð]bð  ^ð  ^Ðfkð  ^ð  ^Ðuzð  ^ð  ^ð  Dð  ^ð  ^ð  R\ð  ^ð  ^ñô ð ð ×$Ò$Ø˜ð ^ÀUð  ^ð  ^Èeð  ^ð  ^Ð]bð  ^ð  ^Ðfkð  ^ð  ^Ðuzð  ^ð  ^ð  Dð  ^ð  ^ð  R\ð  ^ð  ^ñô ð ð ðð	ð 	rC   c                ó  — t          t          d¬¦  «        }|                      |d¦  «         t          t          d¬¦  «        }|                      |d¦  «         t          t          d¬¦  «        }|                      |d¦  «         t          t          d¬¦  «        }|                      |d¦  «         t          t          d¬¦  «        }|                      |d         d	¦  «         |                      |d
         d¦  «         t          t          d¬¦  «        }|                      |d¦  «         t          t          ¦  «        }|                      |d¦  «         t          t          ¦  «        }|                      |d¦  «         dS )u  Kiá»ƒm chá»©ng tá»�a Ä‘á»™ nÃºt TRAVERSE trÃªn 1080p, 1440p, 720p, 1189x891.

        Ground-truth:
        - 1440p: (1091, 747) text center, (1071, 752) frame center.
        - 1080p: (818, 560) text center, (803, 564) frame center.
        Sai sá»‘ tá»‘i Ä‘a <= 1px.
        F)Úuse_frame_center)éC  éë  T)i/  ið  )i2  i0  )i#  i4  r   )i!  i"  rG   )iu  iv  )iû  iÎ  )iç  iÚ  iv  i  )ií  i$  iX  iD  N)r   r	   ÚassertEqualr   r
   ÚassertInr   r   )	r1   Úpos_1440Ú
frame_1440Úpos_1080Ú
frame_1080Úpos_720Úpos_winÚ	bbox_1440Ú	bbox_1080s	            r7   Ú3test_traverse_button_coordinates_across_resolutionszPTestDynamicResolutionScaling.test_traverse_button_coordinates_across_resolutionsƒ   sh  € õ +­9ÀuÐMÑMÔMˆØ×Ò˜ ;Ñ/Ô/Ð/å,­YÈÐNÑNÔNˆ
Ø×Ò˜ [Ñ1Ô1Ð1õ +­9ÀuÐMÑMÔMˆØ×Ò˜ :Ñ.Ô.Ð.å,­YÈÐNÑNÔNˆ
Ø×Ò˜ ZÑ0Ô0Ð0õ *­(ÀUÐKÑKÔKˆà�Š�g˜a”j *Ñ-Ô-Ð-Ø�Š�g˜a”j *Ñ-Ô-Ð-õ *Õ*>ÐQVÐWÑWÔWˆð 	×Ò˜ *Ñ-Ô-Ð-õ -­YÑ7Ô7ˆ	Ø×Ò˜Ð$9Ñ:Ô:Ð:å,­YÑ7Ô7ˆ	Ø×Ò˜Ð$8Ñ9Ô9Ð9Ð9Ð9rC   c                óò  — t          t          ¦  «        }|                      |d¦  «         t          t          ¦  «        }|                      |d         d¦  «         |                      |d         d¦  «         t          t
          ¦  «        }|                      |d¦  «         t          t          ¦  «        }|                      |d¦  «         t          dt          ¦  «        }t          dt          ¦  «        }|                      |d	¦  «         |                      |d
¦  «         t          dt          ¦  «        }t          dt          ¦  «        }|                      |d¦  «         |                      |d¦  «         dS )ua   Kiá»ƒm chá»©ng tá»�a Ä‘á»™ khay cáº¯m Waystone (Socket & Tray Row 1) qua cÃ¡c Ä‘á»™ phÃ¢n giáº£i.)i  iß  r   )i  i  rG   i'  )i  ip  )iê  iÇ  é   )éð   é¼  )éà  rj   )i@  é¥  )é€  rl   N)r   r	   r\   r   r]   r
   r   r   )	r1   Ú	sock_1440Ú	sock_1080Úsock_720Úsock_winÚ
slot0_1080Ú
slot4_1080Ú
slot0_1440Ú
slot4_1440s	            r7   Ú)test_waystone_tray_and_socket_coordinateszFTestDynamicResolutionScaling.test_waystone_tray_and_socket_coordinates¬   sK  € õ ,­IÑ6Ô6ˆ	Ø×Ò˜ KÑ0Ô0Ð0å+­IÑ6Ô6ˆ	Ø�Š�i ”l JÑ/Ô/Ð/Ø×Ò˜ 1œ sÑ+Ô+Ð+å*­8Ñ4Ô4ˆØ×Ò˜ :Ñ.Ô.Ð.å*Õ+?Ñ@Ô@ˆà×Ò˜ :Ñ.Ô.Ð.õ 0°µ9Ñ=Ô=ˆ
Ý/°µ9Ñ=Ô=ˆ
Ø×Ò˜ ZÑ0Ô0Ð0Ø×Ò˜ ZÑ0Ô0Ð0õ 0°µ9Ñ=Ô=ˆ
Ý/°µ9Ñ=Ô=ˆ
Ø×Ò˜ ZÑ0Ô0Ð0Ø×Ò˜ ZÑ0Ô0Ð0Ð0Ð0rC   c                óÒ  — t          ddt          ¦  «        }|                      |d¦  «         t          ddt          ¦  «        }|                      |d¦  «         t          ddt          ¦  «        }t          ddt          ¦  «        }|                      |d¦  «         |                      |d¦  «         t          ddt          ¦  «        }|                      |d         d¦  «         |                      |d         d	¦  «         |                      |d
         d¦  «         |                      |d
         d¦  «         t          ddt          ¦  «        }|                      |d¦  «         t          ddt          ¦  «        }|                      |d¦  «         t          ddt          ¦  «        }t          ddt          ¦  «        }	|                      |d¦  «         |                      |	d¦  «         dS )um   Kiá»ƒm chá»©ng Ä‘á»™ chÃ­nh xÃ¡c khÃ´ng tÃ­ch lÅ©y sai sá»‘ cá»§a lÆ°á»›i Stash (12x12) vÃ  Inventory (12x5).r   )i  ih  é   rh   )iT  i:  )iÃ  i6  )iÅ	  iN  éX  r$   rG   i�  r%   )éÎ   éØ   )i
  i  )i  i   )i  i  N)r   r   r\   r	   r   ÚassertGreaterÚ
assertLessr   )
r1   Úinv_0_0_1080Úinv_11_4_1080Úinv_0_0_1440Úinv_11_4_1440Úinv_0_0_winÚstash_0_0_1080Ústash_11_11_1080Ústash_0_0_1440Ústash_11_11_1440s
             r7   Ú%test_stash_and_inventory_grid_scalingzBTestDynamicResolutionScaling.test_stash_and_inventory_grid_scalingÊ   sÈ  € õ .¨a°µIÑ>Ô>ˆØ×Ò˜ {Ñ3Ô3Ð3õ /¨r°1µiÑ@Ô@ˆØ×Ò˜¨Ñ4Ô4Ð4õ .¨a°µIÑ>Ô>ˆÝ.¨r°1µiÑ@Ô@ˆØ×Ò˜ {Ñ3Ô3Ð3Ø×Ò˜¨Ñ5Ô5Ð5õ -¨Q°Õ3GÑHÔHˆØ×Ò˜; qœ>¨3Ñ/Ô/Ð/Ø�Š˜ Aœ¨Ñ-Ô-Ð-Ø×Ò˜; qœ>¨3Ñ/Ô/Ð/Ø�Š˜ Aœ¨Ñ,Ô,Ð,õ ,¨A¨qµ)Ñ<Ô<ˆØ×Ò˜¨Ñ4Ô4Ð4õ .¨b°"µiÑ@Ô@ÐØ×ÒÐ)¨:Ñ6Ô6Ð6õ ,¨A¨qµ)Ñ<Ô<ˆÝ-¨b°"µiÑ@Ô@ÐØ×Ò˜¨Ñ4Ô4Ð4Ø×ÒÐ)¨<Ñ8Ô8Ð8Ð8Ð8rC   c                ót  — g d¢}|D ]�}t          |t          ¦  «        }|                      |t          ¦  «         |                      t          |¦  «        d¦  «         |                      |d         d¦  «         |                      |d         d¦  «         ŒŽt          dt          ¦  «        }|                      |d¦  «         t          dt          ¦  «        }|                      |d¦  «         t          dt          ¦  «        }|  	                    |d         d	¦  «         |                      |d         d
¦  «         dS )uk   Kiá»ƒm chá»©ng tá»�a Ä‘á»™ cÃ¡c thÃ nh pháº§n cá»§a SÃ n Ngoáº¡i Há»‘i Faustus qua cÃ¡c Ä‘á»™ phÃ¢n giáº£i.)Úpanel_centerÚ
tab_i_wantÚ
tab_i_haveÚamount_inputÚsubmit_order_btnÚclose_panel_btné   r   rG   r‰   )r"   r#   r�   )r"   i  )iR  iS  i¾  N)
r   r   ÚassertIsInstanceÚtupler\   Úlenr|   r	   r   r]   )r1   Úfaustus_elementsÚelemr`   Ú
panel_1440Úsubmit_1440Ú	panel_wins          r7   Ú/test_faustus_currency_exchange_elements_scalingzLTestDynamicResolutionScaling.test_faustus_currency_exchange_elements_scalingñ   s4  € ð
ð 
ð 
Ðð %ð 	/ð 	/ˆDÝ.¨tµYÑ?Ô?ˆHØ×!Ò! (­EÑ2Ô2Ð2Ø×Ò�S ™]œ]¨AÑ.Ô.Ð.Ø×Ò˜x¨œ{¨AÑ.Ô.Ð.Ø×Ò˜x¨œ{¨AÑ.Ô.Ð.Ð.õ -¨^½YÑGÔGˆ
Ø×Ò˜ [Ñ1Ô1Ð1å-Ð.@Å)ÑLÔLˆØ×Ò˜ lÑ3Ô3Ð3õ ,¨NÕ<PÑQÔQˆ	à�Š�i ”l JÑ/Ô/Ð/Ø×Ò˜ 1œ sÑ+Ô+Ð+Ð+Ð+rC   c           
     óH  — t          dd¦  «        t          dd¦  «        t          dd¦  «        t          dd¦  «        t          d	d
¦  «        t          dd¦  «        t          dd¦  «        g}|D �]²}t          |¦  «        }|                      d|d         cxk     o
|j        k     nc ¦  «         |                      d|d         cxk     o
|j        k     nc ¦  «         t          |¦  «        }|                      d|d         cxk     o
|j        k     nc ¦  «         |                      d|d         cxk     o
|j        k     nc ¦  «         t          dd|¦  «        }|                      d|d         cxk     o
|j        k     nc ¦  «         |                      d|d         cxk     o
|j        k     nc ¦  «         t          d|¦  «        }|                      d|d         cxk     o
|j        k     nc ¦  «         |                      d|d         cxk     o
|j        k     nc ¦  «         �Œ´dS )uo   Kiá»ƒm chá»©ng tÃ­nh khÃ¡ng lá»—i trÃªn cÃ¡c Ä‘á»™ phÃ¢n giáº£i báº¥t thÆ°á»�ng (Ultrawide, Low-res, non-16:9).rm   rk   i   ry   i   r:   i�  i  r    r   r&   r!   i   r   rG   r‰   N)r   r   r(   ÚwidthÚheightr   r   r   )r1   Úextreme_resolutionsÚresÚtrav_posÚsock_posÚ	stash_posÚfaustus_poss          r7   Ú0test_extreme_and_abnormal_resolutions_resiliencezMTestDynamicResolutionScaling.test_extreme_and_abnormal_resolutions_resilience  se  € õ �s˜CÑ Ô Ý�s˜CÑ Ô Ý�t˜SÑ!Ô!Ý�t˜TÑ"Ô"Ý�t˜TÑ"Ô"Ý�t˜TÑ"Ô"Ý�t˜TÑ"Ô"ð
Ðð 'ð 	=ñ 	=ˆCå.¨sÑ3Ô3ˆHØ�OŠO˜A ¨¤Ð7Ð7Ò7Ð7¨c¬iÒ7Ð7Ð7Ð7Ñ8Ô8Ð8Ø�OŠO˜A ¨¤Ð8Ð8Ò8Ð8¨c¬jÒ8Ð8Ð8Ð8Ñ9Ô9Ð9õ /¨sÑ3Ô3ˆHØ�OŠO˜A ¨¤Ð7Ð7Ò7Ð7¨c¬iÒ7Ð7Ð7Ð7Ñ8Ô8Ð8Ø�OŠO˜A ¨¤Ð8Ð8Ò8Ð8¨c¬jÒ8Ð8Ð8Ð8Ñ9Ô9Ð9õ +¨1¨a°Ñ5Ô5ˆIØ�OŠO˜A 	¨!¤Ð8Ð8Ò8Ð8¨s¬yÒ8Ð8Ð8Ð8Ñ9Ô9Ð9Ø�OŠO˜A 	¨!¤Ð9Ð9Ò9Ð9¨s¬zÒ9Ð9Ð9Ð9Ñ:Ô:Ð:õ 2°.À#ÑFÔFˆKØ�OŠO˜A ¨A¤Ð:Ð:Ò:Ð:°´Ò:Ð:Ð:Ð:Ñ;Ô;Ð;Ø�OŠO˜A ¨A¤Ð;Ð;Ò;Ð;°´Ò;Ð;Ð;Ð;Ñ<Ô<Ð<Ñ<ð'	=ð 	=rC   c                ó(  — t           j                             t           j                             t          ¦  «        ddd¦  «        }t           j                             |¦  «        s|                      d|› �¦  «         t          j        |¦  «        }|j	        \  }}|  
                    ||fd¦  «         t          |¦  «        }|                      |¦  «         |                      |d         dd¬	¦  «         |                      |d
         dd¬	¦  «         dS )um   Kiá»ƒm chá»©ng tÃ­ch há»£p thá»±c táº¿ giá»¯a CoordinateScaler vÃ  Dual-Pass Locator trÃªn capture 2560x1440.z..Úcapturesz.20260913_102100_639_AFTER_CLICK_ATLAS_NODE.pngu!   KhÃ´ng tÃ¬m tháº¥y file capture: )r    r!   r   rZ   r   )ÚdeltarG   r[   N)ÚosÚpathÚjoinÚdirnameÚ__file__ÚexistsÚskipTestr   ÚopenÚsizer\   r   ÚassertIsNotNoner-   )r1   Úcapture_pathÚimgÚwÚhÚcoordss         r7   Ú7test_integration_with_dual_pass_locator_on_real_capturezTTestDynamicResolutionScaling.test_integration_with_dual_pass_locator_on_real_capture2  sþ   € å”w—|’|ÝŒG�OŠO�HÑ%Ô% t¨ZÐ9iñ
ô 
ˆõ Œw�~Š~˜lÑ+Ô+ð 	NØ�MŠMÐL¸lÐLÐLÑMÔMÐMåŒj˜Ñ&Ô&ˆØŒx‰ˆˆ1Ø×Ò˜!˜Q˜ Ñ.Ô.Ð.õ 0°Ñ4Ô4ˆØ×Ò˜VÑ$Ô$Ð$Ø×Ò˜v aœy¨$°aÐÑ8Ô8Ð8Ø×Ò˜v aœy¨#°QÐÑ7Ô7Ð7Ð7Ð7rC   N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r8   rW   rf   rv   r‡   r˜   r¢   rµ   © rC   r7   r   r   4   sÀ   € € € € € ØDÐDð !ð  !ð  !ð  !ðD(ð (ð (ð (ðT':ð ':ð ':ð ':ðR1ð 1ð 1ð 1ð<%9ð %9ð %9ð %9ðN,ð ,ð ,ð ,ð@=ð =ð =ð =ðB8ð 8ð 8ð 8ð 8ð 8rC   r   Ú__main__)(r¹   Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arÚmathr¦   ÚunittestÚPILr   Úsrc.common.coordinate_transformr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Úsrc.common.vision_filtersr   r   Úsrc.common.vision_ocrr   ÚTestCaser   r¶   Úmainrº   rC   r7   ú<module>rË      sÀ  ððð ð" #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð$ð ð ð ð ð ð ð ðð ð ð ð ð ð
N8ð N8ð N8ð N8ð N8 8Ô#4ñ N8ô N8ð N8ðb ˆzÒÐØ€H„M�O„O€O€O€Oð ÐrC   