§
    Q¿jÉ#  ã                  ó  — 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ZddlZddlZddlZddlZddlZddlmZmZmZmZ ddlmZmZ ddlmZ ddlmZ  ej         d¬	¦  «        dd„¦   «         Z! G d„ d¦  «        Z"dS )a  
Challenger M3 Empirical Stress Test: /api/map Endpoint and Biome Pipeline.
Validates:
1. All 30 biome integer queries (biome=1..30) return HTTP 200 with byte[3] == biome_code.
2. All 30 biome style string queries (biome=STY_01..STY_30) return HTTP 200 with expected byte[3].
3. Legacy biome name queries return HTTP 200.
4. Canonical zone resolution with and without biome override.
5. Boundary, invalid, malformed, and adversarial inputs (fuzzing).
6. Multi-threaded concurrent request performance and thread safety.
é    )ÚannotationsN)Ú	GeneratorÚDictÚAnyÚList)Úlist_stylesÚget_map_style)Ú
MAP_BIOMES)ÚFreeExileHTTPRequestHandlerÚmodule)ÚscopeÚreturnúGenerator[str, None, None]c               #  óL  K  —  G d„ dt           j        t           j        ¦  «        }  | dt          ¦  «        }|j        d         }t          j        |j        d¬¦  «        }|                     ¦   «          d|› �}|V — | 	                    ¦   «          | 
                    ¦   «          d S )Nc                  ó   — e Zd ZdZdZdS )ú#api_server.<locals>.ThreadingServerTN)Ú__name__Ú
__module__Ú__qualname__Údaemon_threadsÚallow_reuse_address© ó    úBC:\Projects\FreeExile\tests\unit\test_challenger_api_map_stress.pyÚThreadingServerr      s   € € € € € ØˆØ"ÐÐÐr   r   )z	127.0.0.1r   é   T)ÚtargetÚdaemonzhttp://127.0.0.1:)ÚsocketserverÚThreadingMixInÚ	TCPServerr   Úserver_addressÚ	threadingÚThreadÚserve_foreverÚstartÚshutdownÚserver_close)r   ÚserverÚportÚtÚbase_urls        r   Ú
api_serverr-      s½   è è € ð#ð #ð #ð #ð #�,Ô5µ|Ô7Mñ #ô #ð #ð ˆ_Ð-Õ/JÑKÔK€FØÔ  Ô#€DÝÔ Ô 4¸TÐBÑBÔB€AØ‡G‚G�I„I€IØ) 4Ð)Ð)€HØ
€N€N€NØ
‡O‚OÑÔÐØ
×ÒÑÔÐÐÐr   c                  óZ   — 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d„ZdS )ÚTestApiMapEndpointEmpiricalzGEmpirical verification of /api/map across all 30 biomes and edge cases.r-   Ústrr   ÚNonec                ól  — t          dd¦  «        D �]¡}|› d|dz  › d|› �}t          j                             |¦  «        }t          j                             |d¬¦  «        5 }|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  }	t          j        d|› d|j        › �¦  «        dz   d|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|j        }|j        }d} ||¦  «        }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        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}}|                     ¦   «         }t%          |¦  «        }d}||k    }|�s
t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        t$          ¦  «        rt          j        t$          ¦  «        nddt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|› �¦  «        dz   d |iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|dd!…         }d"}||k    }|s„t          j        d	|fd#||f¦  «        t          j        |¦  «        t          j        |¦  «        d$œz  }t          j        d%|› �¦  «        d&z   d'|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d!         }d}||k    }|s„t          j        d	|fd#||f¦  «        t          j        |¦  «        t          j        |¦  «        d$œz  }t          j        d(|› �¦  «        d&z   d'|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d)         }||k    }|s¸t          j        d	|fd*||f¦  «        t          j        |¦  «        d+t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd+d,œz  }t          j        d-|› d|d)         › �¦  «        d.z   d/|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}ddd¦  «         n# 1 swxY w Y   �Œ£dS )0zEEvery biome code from 1 to 30 must yield 200 and exact byte[3] match.r   é   ú*/api/map?zone_id=zone_tang_kiem_nhai&seed=é   ú&biome=é   ©ÚtimeoutéÈ   ©ú==©z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)sÚresp©Úpy0Úpy2Úpy5zExpected 200 for biome=ú, got ú
>assert %(py7)sÚpy7NzContent-Typezapplication/octet-stream)zg%(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.headers
}.get
}(%(py6)s)
} == %(py11)s)r@   rA   Úpy4Úpy6Úpy8Úpy11zassert %(py13)sÚpy13é   )ú>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sÚlenÚbody©r@   Úpy1Úpy3rG   zBody too small for biome=z
>assert %(py8)srH   é   ó   FE©z%(py1)s == %(py4)s©rP   rF   z Magic header mismatch for biome=ú
>assert %(py6)srG   zVersion mismatch for biome=é   ©z%(py1)s == %(py3)sÚcode©rP   rQ   zByte 3 mismatch: expected ú
>assert %(py5)srB   )ÚrangeÚurllibÚrequestÚRequestÚurlopenÚstatusÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚ_format_assertmsgÚAssertionErrorÚ_format_explanationÚheadersÚgetÚreadrM   )Úselfr-   rY   ÚurlÚreqr>   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8Ú@py_assert5Ú@py_assert7Ú@py_assert10Ú@py_assert9Ú@py_format12Ú@py_format14rN   Ú@py_assert2Ú@py_format7Ú@py_format9Ú@py_assert0Ú@py_format5Ú@py_format4s                           r   Útest_all_30_integer_biomesz6TestApiMapEndpointEmpirical.test_all_30_integer_biomes0   sÍ  € å˜!˜R‘L”Lð 
	[ñ 
	[ˆDØÐcÐcÈ4ÐRTÉ9ÐcÐcÐ]aÐcÐcˆCÝ”.×(Ò(¨Ñ-Ô-ˆCÝ”×'Ò'¨°QÐ'Ñ7Ô7ð [¸4Ø”{Ð^ cÐ^�{ cÒ)Ð^Ð^Ð^Õ^Ô^Ð^Ð^Ð^Ð^�{ cÐ^Ñ^Ô^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^�tÑ^Ô^Ð^Õ^Ô^�tÑ^Ô^Ð^Ð^Õ^Ô^�{Ñ^Ô^Õ^Ô^ cÑ^Ô^Ð^Ð^Ñ^Ð^Õ^Ô^Ð+^ÀTÐ+^Ð+^ÐQUÔQ\Ð+^Ð+^Ñ^Ô^Ð^Ñ^Ð^Ð^Ð^Ñ^Ð^Õ^Õ^Ô^Ð^Ñ^Ô^Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ø”|ÐU�|Ô'ÐU¨ÐUÐ'Ð'¨Ñ7Ô7ÐUÐ;UÐUÐ7Ð;UÒUÐUÐUÐUÕUÔUÐUÐUÐUÐUÐ7Ð;UÐUÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔU�tÑUÔUÐUÕUÔU�tÑUÔUÐUÐUÕUÔU�|ÑUÔUÕUÔUÐ'ÑUÔUÕUÔU¨ÑUÔUÕUÔUÐ7ÑUÔUÕUÔUÐ;UÑUÔUÐUÐUÑUÐUÐUÐUÐUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUØ—y’y‘{”{�Ý˜4‘y”yÐI 2ÐI�y 2’~ÐIÐIÑIÕIÔIÐIÐIÐIÐI�y 2ÐIÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔI•sÑIÔIÐIÕIÔI•sÑIÔIÐIÐIÐIÕIÔIÑIÔIÐIÐIÕIÔI˜4ÑIÔIÐIÕIÔI˜4ÑIÔIÐIÐIÕIÔI�yÑIÔIÕIÔI 2ÑIÔIÐIÐIÑIÐIÕIÔIÐ'IÀ4Ð'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Ø˜B˜Q˜B”xÐS 5ÐS�x 5Ò(ÐSÐSÐSÕSÔSÐSÐSÐSÐS�x 5ÐSÑSÔSÕSÔS�xÑSÔSÕSÔS 5ÑSÔSÐSÐSÑSÐSÕSÔSÐ*SÈTÐ*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Ø˜A”wÐI !ÐI�w !’|ÐIÐIÐIÕIÔIÐIÐIÐIÐI�w !ÐIÑIÔIÕIÔI�wÑIÔIÕIÔI !ÑIÔIÐIÐIÑIÐIÕIÔIÐ%IÀ4Ð%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Ø˜A”wÐZ�w $’ÐZÐZÐZÕZÔZÐZÐZÐZÐZ�w $ÐZÑZÔZÕZÔZ�wÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZ $ÑZÔZÐZÕZÔZ $ÑZÔZÐZÐZÐZÐZÑZÐZÕZÔZÐ(ZÀTÐ(ZÐ(ZÐQUÐVWÔQXÐ(ZÐ(ZÑZÔZÐZÑZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZð[ð [ð [ñ [ô [ð [ð [ð [ð [ð [ð [øøøð [ð [ð [ð [ùð
	[ð 
	[s   Á!T:V'Ö'V+	Ö.V+	c                óô  — t          ¦   «         }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  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d	x}x}}|D �]Ô}|› d
|j
        › �}	t          j                             |	¦  «        }
t          j                             |
d¬¦  «        5 }|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  }t          j        d|j
        › �¦  «        dz   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}}|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  }t          j        d|j
        › d|j        › d |d         › �¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚d	x}x}}d	d	d	¦  «         n# 1 swxY w Y   �ŒÖd	S )!zEQuerying by STY_ style ID string must return 200 and correct byte[3].é   r;   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srM   ÚstylesrO   úassert %(py8)srH   Nz4/api/map?zone_id=zone_tang_kiem_nhai&seed=999&biome=r7   r8   r:   r=   r>   r?   zFailed for style rD   rE   rR   rS   rT   rU   úassert %(py6)srG   rW   )z2%(py1)s == %(py5)s
{%(py5)s = %(py3)s.biome_code
}Ústyle)rP   rQ   rB   zStyle z expected byte 3 to be rC   )r   rM   rb   rc   rd   re   rf   rg   ri   rj   Ústyle_idr]   r^   r_   r`   ra   rh   rm   Ú
biome_code)rn   r-   r†   r|   rv   rr   r}   r~   r‰   ro   rp   r>   rq   rs   rt   ru   rN   r   r€   s                      r   Útest_all_30_style_id_stringsz8TestApiMapEndpointEmpirical.test_all_30_style_id_strings>   s+  € å‘”ˆÝ�6‰{Œ{Ð ˜bÐ ˆ{˜bÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ{˜bÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �sÑ Ô Ð Õ Ô �sÑ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô �6Ñ Ô Ð Õ Ô �6Ñ Ô Ð Ð Õ Ô ˆ{Ñ Ô Õ Ô ˜bÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð Øð 		ñ 		ˆEØÐeÐeÐUZÔUcÐeÐeˆCÝ”.×(Ò(¨Ñ-Ô-ˆCÝ”×'Ò'¨°QÐ'Ñ7Ô7ð ¸4Ø”{ÐO cÐO�{ cÒ)ÐOÐOÐOÕOÔOÐOÐOÐOÐO�{ cÐOÑOÔOÐOÕOÔOÑOÔOÐOÐOÕOÔO�tÑOÔOÐOÕOÔO�tÑOÔOÐOÐOÕOÔO�{ÑOÔOÕOÔO cÑOÔOÐOÐOÑOÐOÕOÔOÐ+O¸u¼~Ð+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Ø—y’y‘{”{�Ø˜B˜Q˜B”xÐ( 5Ð(�x 5Ò(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(�x 5Ð(Ñ(Ô(Õ(Ô(�xÑ(Ô(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø˜A”wð  %Ô"2ð �wÐ"2Ò2ð ð ð õ ä ðð ð ð �wÐ"2ð ñ ô õ äð ñ ô ð õ äñô ð ð õ ìð #(ñ ô ð õ äð #(ñ ô ð ð õ äð #3ñ ô ð ð ñ ð õ ä ð f˜Uœ^ÐeÐeÀEÔDTÐeÐeÐ\`ÐabÔ\cÐeÐeñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð	ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ùð		ð 		s   Å1I.O+Ï+O/	Ï2O/	c                óT  — ddddddœ}|                      ¦   «         D �]	\  }}|› d|› �}t          j                             |¦  «        }t          j                             |d¬¦  «        5 }|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}
}	|                     ¦   «         }|d         }||k    }|s»t          j        d
|fd||f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nddœz  }t          j        d|› d|› d|d         › �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}ddd¦  «         n# 1 swxY w Y   �ŒdS )zCLegacy biome names (codes 1-5) must return 200 and match codes 1-5.r   rR   rW   é   r7   )ÚBLEACHED_BONE_CANYONÚSAVAGE_MANGROVE_SWAMPÚCRIMSON_BLOOD_FORESTÚOUTCAST_MINE_SHAFTSÚCORRUPTED_FIEND_RUINSz4/api/map?zone_id=zone_tang_kiem_nhai&seed=123&biome=r8   r:   r;   r=   r>   r?   úassert %(py7)srE   NrX   Úb_coderZ   zLegacy biome z
 expected rC   r[   rB   )Úitemsr]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   ri   rj   rm   rh   )rn   r-   ÚlegacyÚb_namer•   ro   rp   r>   rq   rr   rs   rt   ru   rN   r   r|   r�   s                    r   Útest_legacy_biome_namesz3TestApiMapEndpointEmpirical.test_legacy_biome_namesM   sÒ  € ð %&Ø%&Ø$%Ø#$Ø%&ð
ð 
ˆð %Ÿlšl™nœnð 	dñ 	d‰NˆF�FØÐ]Ð]ÐU[Ð]Ð]ˆCÝ”.×(Ò(¨Ñ-Ô-ˆCÝ”×'Ò'¨°QÐ'Ñ7Ô7ð d¸4Ø”{Ð) cÐ)�{ cÒ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)�{ cÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�tÑ)Ô)Ð)Õ)Ô)�tÑ)Ô)Ð)Ð)Õ)Ô)�{Ñ)Ô)Õ)Ô) cÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø—y’y‘{”{�Ø˜A”wÐc�w &Ò(ÐcÐcÐcÕcÔcÐcÐcÐcÐc�w &ÐcÑcÔcÕcÔc�wÑcÔcÐcÕcÔcÑcÔcÐcÐcÕcÔc &ÑcÔcÐcÕcÔc &ÑcÔcÐcÐcÐcÐcÑcÐcÕcÔcÐ*c¸&Ð*cÐ*cÈFÐ*cÐ*cÐZ^Ð_`ÔZaÐ*cÐ*cÑcÔcÐcÑcÐcÐcÐcÑcÐcÕcÕcÔcÐcÑcÔcÑcÔcÐcÐcÐcÐcÐcðdð dð dñ dô dð dð dð dð dð dð døøøð dð dð dð dùð	dð 	ds   Á*F%HÈH	È"H	c                ó6  — g d¢}|D �]�\  }}|› d|› d�}t           j                             |¦  «        }t           j                             |d¬¦  «        5 }|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}
}	|                     ¦   «         }|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         }||k    }|s»t          j        d|fd||f¦  «        t          j
        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddœz  }t          j        d|› d|› d|d         › �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}ddd¦  «         n# 1 swxY w Y   �Œ’dS )zHEvery canonical zone without ?biome= parameter returns valid binary map.)	)Úzone_tang_kiem_nhair   )Úzone_ancient_sword_barrowé   )Úzone_boundless_sandstormé   )Úzone_blood_scale_ruinsrW   )Úzone_five_elements_altaré   )Úzone_abyssal_ice_pondr5   )Úzone_infinite_blood_rifté   )Úzone_purgatory_lava_caverné   )Úzone_boundless_celestial_palacer„   z/api/map?zone_id=z&seed=42r7   r8   r:   r;   r=   r>   r?   r”   rE   NrR   rS   rT   rU   rˆ   rG   rW   rX   Úexpected_coderZ   zZone z expected canonical biome rC   r[   rB   )r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   ri   rj   rm   rh   )rn   r-   Úcanonical_zonesÚzidr©   ro   rp   r>   rq   rr   rs   rt   ru   rN   r   r|   r€   r}   r�   s                      r   Ú'test_all_canonical_zones_default_biomeszCTestApiMapEndpointEmpirical.test_all_canonical_zones_default_biomes^   sk  € ð

ð 

ð 

ˆð #2ð 	wñ 	wÑˆC�ØÐ?Ð?°#Ð?Ð?Ð?ˆCÝ”.×(Ò(¨Ñ-Ô-ˆCÝ”×'Ò'¨°QÐ'Ñ7Ô7ð w¸4Ø”{Ð) cÐ)�{ cÒ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)�{ cÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�tÑ)Ô)Ð)Õ)Ô)�tÑ)Ô)Ð)Ð)Õ)Ô)�{Ñ)Ô)Õ)Ô) cÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø—y’y‘{”{�Ø˜B˜Q˜B”xÐ( 5Ð(�x 5Ò(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(�x 5Ð(Ñ(Ô(Õ(Ô(�xÑ(Ô(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø˜A”wÐv�w -Ò/ÐvÐvÐvÕvÔvÐvÐvÐvÐv�w -ÐvÑvÔvÕvÔv�wÑvÔvÐvÕvÔvÑvÔvÐvÐvÕvÔv -ÑvÔvÐvÕvÔv -ÑvÔvÐvÐvÐvÐvÑvÐvÕvÔvÐ1v¸Ð1vÐ1vÐXeÐ1vÐ1vÐmqÐrsÔmtÐ1vÐ1vÑvÔvÐvÑvÐvÐvÐvÑvÐvÕvÕvÔvÐvÑvÔvÑvÔvÐvÐvÐvÐvÐvð	wð wð wñ wô wð wð wð wð wð wð wøøøð wð wð wð wùð	wð 	ws   ÁH+JÊJ	ÊJ	c           	     ó–  — dD �]D}|› d|› �}t           j                             |¦  «        }	 t           j                             |d¬¦  «        5 }|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}}|                     ¦   «         }|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         }d}||k    }|s�t          j        d|fd||f¦  «        t          j
        |¦  «        t          j
        |¦  «        dœz  }t          j        d|› d|d         › �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}ddd¦  «         n# 1 swxY w Y   �Œe# t           j        j        $ rÊ}|j        }d}||v }|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}}Y d}~�Œ>d}~ww xY wdS )z7Inspect server behavior on out-of-range integer biomes.)r   r3   iç  éûÿÿÿú3/api/map?zone_id=zone_tang_kiem_nhai&seed=42&biome=r7   r8   r:   r;   r=   r>   r?   r”   rE   NrR   rS   rT   rU   rˆ   rG   rW   r   z)Expected fallback to code 1 for bad code rC   rV   ©i�  éô  ©Úin©z,%(py2)s
{%(py2)s = %(py0)s.code
} in %(py5)sÚe)r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   ri   rj   rm   rh   ÚerrorÚ	HTTPErrorrY   )rn   r-   Úbad_codero   rp   r>   rq   rr   rs   rt   ru   rN   r   r|   r€   r}   rµ   s                    r   Ú)test_out_of_range_integer_biomes_behaviorzETestApiMapEndpointEmpirical.test_out_of_range_integer_biomes_behaviort   s<  € ð )ð 	,ñ 	,ˆHØÐ^Ð^ÐT\Ð^Ð^ˆCÝ”.×(Ò(¨Ñ-Ô-ˆCð	,Ý”^×+Ò+¨C¸Ð+Ñ;Ô;ð o¸tØœ;Ð-¨#Ð-˜;¨#Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-˜;¨#Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-˜4Ñ-Ô-Ð-Õ-Ô-˜4Ñ-Ô-Ð-Ð-Õ-Ô-˜;Ñ-Ô-Õ-Ô-¨#Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØŸ9š9™;œ;�DØ   œ8Ð, uÐ,˜8 uÒ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,˜8 uÐ,Ñ,Ô,Õ,Ô,˜8Ñ,Ô,Õ,Ô, uÑ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,à œ7Ðn aÐn˜7 aš<ÐnÐnÐnÕnÔnÐnÐnÐnÐn˜7 aÐnÑnÔnÕnÔn˜7ÑnÔnÕnÔn aÑnÔnÐnÐnÑnÐnÕnÔnÐ)nÐU]Ð)nÐ)nÐeiÐjkÔelÐ)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ðoð oð oñ oô oð oð oð oð oð oð oøøøð oð oð oð oùøõ ”<Ô)ð ,ð ,ð ,à”vÐ+ Ð+�v Ð+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+�v Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+�qÑ+Ô+Ð+Õ+Ô+�qÑ+Ô+Ð+Ð+Õ+Ô+�vÑ+Ô+Õ+Ô+ Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ñ+øøøøð,øøøð	,ð 	,s=   ­!I(ÁHIÉI(ÉI	ÉI(É"I	É#I(É(MÉ<B?MÍMc                óR  — |› d�}t           j                             |¦  «        }t          j        t           j        j        ¦  «        5 }t           j                             |d¬¦  «         ddd¦  «         n# 1 swxY w Y   |j        }|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}}t%          j        |                     ¦   «                              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}|d         }||v }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}}dS )zLUnknown string biome produces 500 JSON response rather than crashing server.zL/api/map?zone_id=zone_tang_kiem_nhai&seed=42&biome=INVALID_NONEXISTENT_BIOMEr7   r8   Nr±   r;   ©z,%(py2)s
{%(py2)s = %(py0)s.code
} == %(py5)sÚerrr?   r”   rE   úutf-8r¶   r²   ©z%(py1)s in %(py3)sÚdatarZ   úassert %(py5)srB   zUnknown biome_id)z%(py1)s in %(py4)srU   rˆ   rG   ©r]   r^   r_   ÚpytestÚraisesr¶   r·   r`   ÚvaluerY   rb   rc   rd   re   rf   rg   ri   rj   ÚjsonÚloadsrm   Údecode)rn   r-   ro   rp   Úexc_infor¼   rq   rr   rs   rt   ru   r¿   r   r|   r�   r€   r}   s                    r   Ú0test_unknown_string_biome_returns_500_error_jsonzLTestApiMapEndpointEmpirical.test_unknown_string_biome_returns_500_error_json…   s  € àÐiÐiÐiˆÝŒn×$Ò$ SÑ)Ô)ˆÝŒ]�6œ<Ô1Ñ2Ô2ð 	3°hÝŒN×"Ò" 3°Ð"Ñ2Ô2Ð2ð	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3àŒnˆØŒxÐ˜3Ðˆx˜3ŠÐÐÐÕÔÐÐÐÐˆx˜3ÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔˆxÑÔÕÔ˜3ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÝŒz˜#Ÿ(š(™*œ*×+Ò+¨GÑ4Ô4Ñ5Ô5ˆØÐˆw˜$ˆÐÐÐÕÔÐÐÐÐˆw˜$ÐÑÔÕÔˆwÑÔÐÕÔÑÔÐÐÕÔ˜$ÑÔÐÕÔ˜$ÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ!Ð2 T¨'¤]Ð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Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ó   Á"A6Á6A:Á=A:c                óN  — |› d�}t           j                             |¦  «        }t          j        t           j        j        ¦  «        5 }t           j                             |d¬¦  «         ddd¦  «         n# 1 swxY w Y   |j        }|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}}t%          j        |                     ¦   «                              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S )zBNon-integer seed returns 500 JSON response with error explanation.z6/api/map?zone_id=zone_tang_kiem_nhai&seed=not_a_numberr7   r8   Nr±   r;   r»   r¼   r?   r”   rE   r½   r¶   r²   r¾   r¿   rZ   rÀ   rB   rÁ   )rn   r-   ro   rp   rÈ   r¼   rq   rr   rs   rt   ru   r¿   r   r|   r�   s                  r   Útest_malformed_seed_parameterz9TestApiMapEndpointEmpirical.test_malformed_seed_parameter‘   sv  € àÐSÐSÐSˆÝŒn×$Ò$ SÑ)Ô)ˆÝŒ]�6œ<Ô1Ñ2Ô2ð 	3°hÝŒN×"Ò" 3°Ð"Ñ2Ô2Ð2ð	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3àŒnˆØŒxÐ˜3Ðˆx˜3ŠÐÐÐÕÔÐÐÐÐˆx˜3ÐÑÔÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔˆxÑÔÕÔ˜3ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÝŒz˜#Ÿ(š(™*œ*×+Ò+¨GÑ4Ô4Ñ5Ô5ˆØÐˆw˜$ˆÐÐÐÕÔÐÐÐÐˆw˜$ÐÑÔÕÔˆwÑÔÐÕÔÑÔÐÐÕÔ˜$ÑÔÐÕÔ˜$ÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐrÊ   c           	     ó  — g d¢}|D �]}t           j                             |¦  «        }|› d|› �}t           j                             |¦  «        }	 t           j                             |d¬¦  «        5 }|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}
}	ddd¦  «         n# 1 swxY w Y   �ŒE# t           j        j        $ �r¦}|j        }d}	||	v }
|
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}
}	t%          j        |                     ¦   «                              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}}Y d}~�Œûd}~ww xY wdS )zJVerify adversarial payloads do not cause code injection or server crashes.)z<script>alert(1)</script>z../../../../etc/passwdzSELECT * FROM map_stylesz	%00%ff%fer¯   r7   r8   r:   r;   r=   r>   r?   r”   rE   Nr°   r²   r´   rµ   r½   r¶   r¾   r¿   rZ   rÀ   rB   )r]   ÚparseÚquoter^   r_   r`   ra   rb   rc   rd   re   rf   rg   ri   rj   r¶   r·   rY   rÅ   rÆ   rm   rÇ   )rn   r-   Úadversarial_payloadsÚpayloadÚencodedro   rp   r>   rq   rr   rs   rt   ru   rµ   r¿   r   r|   r�   s                     r   Ú$test_xss_and_path_traversal_payloadsz@TestApiMapEndpointEmpirical.test_xss_and_path_traversal_payloadsœ   s±  € ð 
ð  
ð  
Ðð ,ð 
	'ñ 
	'ˆGÝ”l×(Ò(¨Ñ1Ô1ˆGØÐ]Ð]ÐT[Ð]Ð]ˆCÝ”.×(Ò(¨Ñ-Ô-ˆCð'Ý”^×+Ò+¨C¸Ð+Ñ;Ô;ð .¸tØœ;Ð-¨#Ð-˜;¨#Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-˜;¨#Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-˜4Ñ-Ô-Ð-Õ-Ô-˜4Ñ-Ô-Ð-Ð-Õ-Ô-˜;Ñ-Ô-Õ-Ô-¨#Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ùøå”<Ô)ð 'ñ 'ð 'Ø”vÐ+ Ð+�v Ð+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+�v Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+�qÑ+Ô+Ð+Õ+Ô+�qÑ+Ô+Ð+Ð+Õ+Ô+�vÑ+Ô+Õ+Ô+ Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ý”z !§&¢&¡(¤(§/¢/°'Ñ":Ô":Ñ;Ô;�ØÐ&�w $�Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&�w $Ð&Ñ&Ô&Õ&Ô&�wÑ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô& $Ñ&Ô&Ð&Õ&Ô& $Ñ&Ô&Ð&Ð&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ñ&øøøøð'øøøð
	'ð 
	's>   Á!EÁ1CD?Ä3EÄ?E	ÅEÅE	ÅEÅLÅ!FLÌLc                ó¢  ‡‡‡— dˆfd„Št           j                             d¬¦  «        5 Šˆˆfd„t          dd	¦  «        D ¦   «         }d
„ t           j                             |¦  «        D ¦   «         }ddd¦  «         n# 1 swxY w Y   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  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}d„ |D ¦   «         }	t          |	¦  «        }
|
s•ddt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndt          j        |	¦  «        t          j        |
¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}	}
dS )zF50 concurrent requests across all 30 biomes execute with 100% success.rY   Úintr   c                óž  •— ‰
› d| dz  › d| dz
  dz  dz   › �}t           j                             |¦  «        }t           j                             |d¬¦  «        5 }|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}}|                     ¦   «         }	|	d         cd d d ¦  «         S # 1 swxY w Y   d S )Nr4   é   r6   r   r„   é
   r8   r:   r;   r=   r>   r?   r”   rE   rW   )r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   ri   rj   rm   )rY   ro   rp   r>   rq   rr   rs   rt   ru   Úbr-   s             €r   Úfetch_biomezTTestApiMapEndpointEmpirical.test_concurrent_requests_throughput.<locals>.fetch_biome²   s¸  ø€ ØÐsÐsÈ4ÐRSÉ8ÐsÐsÐ^bÐefÑ^fÐjlÑ]lÐpqÑ\qÐsÐsˆCÝ”.×(Ò(¨Ñ-Ô-ˆCÝ”×'Ò'¨°RÐ'Ñ8Ô8ð ¸DØ”{Ð) cÐ)�{ cÒ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)�{ cÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�tÑ)Ô)Ð)Õ)Ô)�tÑ)Ô)Ð)Ð)Õ)Ô)�{Ñ)Ô)Õ)Ô) cÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø—I’I‘K”K�Ø˜”tðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s   ÁCEÅEÅ	Eé   )Úmax_workersc                ó<   •— g | ]}‰                      ‰|¦  «        ‘ŒS r   )Úsubmit)Ú.0ÚiÚexecutorrÚ   s     €€r   ú
<listcomp>zSTestApiMapEndpointEmpirical.test_concurrent_requests_throughput.<locals>.<listcomp>»   s'   ø€ ÐMÐMÐM¸1�x—’ {°AÑ6Ô6ÐMÐMÐMr   r   é3   c                ó6   — g | ]}|                      ¦   «         ‘ŒS r   )Úresult)rß   Úfs     r   râ   zSTestApiMapEndpointEmpirical.test_concurrent_requests_throughput.<locals>.<listcomp>¼   s    € ÐTÐTÐT a�q—x’x‘z”zÐTÐTÐTr   Né2   r;   r…   rM   ÚresultsrO   r‡   rH   c              3  ó6   K  — | ]}d |cxk    odk    nc V — ŒdS )r   r„   Nr   )rß   Úrs     r   ú	<genexpr>zRTestApiMapEndpointEmpirical.test_concurrent_requests_throughput.<locals>.<genexpr>¿   s6   è è € Ð1Ð1 A�1˜�<�<’<�<˜R’<�<�<�<Ð1Ð1Ð1Ð1Ð1Ð1r   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úall)r@   rA   rF   )rY   rÕ   r   rÕ   )Ú
concurrentÚfuturesÚThreadPoolExecutorr\   Úas_completedrM   rb   rc   rd   re   rf   rg   ri   rj   rì   )rn   r-   rî   rè   r|   rv   rr   r}   r~   rq   rs   r€   rá   rÚ   s    `          @@r   Ú#test_concurrent_requests_throughputz?TestApiMapEndpointEmpirical.test_concurrent_requests_throughput°   sÂ  øøø€ ð	ð 	ð 	ð 	ð 	ð 	õ Ô×2Ò2¸qÐ2ÑAÔAð 	UÀXØMÐMÐMÐMÐMÅÀaÈÁÄÐMÑMÔMˆGØTÐT­:Ô+=×+JÒ+JÈ7Ñ+SÔ+SÐTÑTÔTˆGð	Uð 	Uð 	Uñ 	Uô 	Uð 	Uð 	Uð 	Uð 	Uð 	Uð 	Uøøøð 	Uð 	Uð 	Uð 	Uõ �7‰|Œ|Ð!˜rÐ!ˆ|˜rÒ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ|˜rÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�sÑ!Ô!Ð!Õ!Ô!�sÑ!Ô!Ð!Ð!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�7Ñ!Ô!Ð!Õ!Ô!�7Ñ!Ô!Ð!Ð!Õ!Ô!ˆ|Ñ!Ô!Õ!Ô!˜rÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ø1Ð1¨Ð1Ñ1Ô1Ð1�sÐ1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�sÑ1Ô1Ð1Õ1Ô1�sÑ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Ð1s   ªAA=Á=BÂBN)r-   r0   r   r1   )r   r   r   Ú__doc__r‚   rŒ   r™   r¬   r¹   rÉ   rÌ   rÓ   rñ   r   r   r   r/   r/   -   sÚ   € € € € € ØQÐQð[ð [ð [ð [ðð ð ð ðdð dð dð dð"wð wð wð wð,,ð ,ð ,ð ,ð"
3ð 
3ð 
3ð 
3ð	ð 	ð 	ð 	ð'ð 'ð 'ð 'ð(2ð 2ð 2ð 2ð 2ð 2r   r/   )r   r   )#rò   Ú
__future__r   Úbuiltinsrd   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterb   Úconcurrent.futuresrí   rÅ   r   Ústructr#   Úurllib.parser]   Úurllib.requestÚurllib.errorrÂ   Útypingr   r   r   r   Úserver.world.map_style_catalogr   r	   Úserver.world.map_biome_catalogr
   Útools.serve_webappr   Úfixturer-   r/   r   r   r   ú<module>r     sm  ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "Ø  € € € € € € € € € € € € Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -à EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø :Ð :Ð :Ð :Ð :Ð :ð €„�hÐÑÔðð ð ñ  ÔððR2ð R2ð R2ð R2ð R2ñ R2ô R2ð R2ð R2ð R2r   