§
    i”»jZ,  ã                   óÀ   — d Z ddlZddlmc mZ ddlZddlm	Z	m
Z
mZmZmZmZmZ ddlmZ ddlmZmZ  G d„ dej        ¦  «        Zedk    r ej        ¦   «          dS dS )	zÐ
Unit tests for FreeExile Endgame Crafting, Affix Slot Matrix & Trade-off Downsides.
Validates PoE2 itemization, iLvl tier gating, pinnacle boss materials,
and quest-gated Primal Boneforge trade-off affixes.
é    N)ÚItemSlotÚ
ItemRarityÚ	AffixTypeÚPrimalCurrencyTypeÚDownsidePenaltyTypeÚCraftingItemÚAffixMod)ÚItemCraftingEngine)Úget_available_affixesÚCANONICAL_TRADEOFF_AFFIXESc                   óJ   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ ZdS )ÚTestEndgameCraftingAndAffixesc                 ó0   — t          d¬¦  «        | _        d S )Né*   )Úrng_seed)r
   Úengine)Úselfs    úEC:\Projects\FreeExile\tests\unit\test_endgame_crafting_and_affixes.pyÚsetUpz#TestEndgameCraftingAndAffixes.setUp   s   € Ý(°"Ð5Ñ5Ô5ˆŒˆˆó    c                 óN  — t          t          j        t          j        d¬¦  «        }d„ |D ¦   «         }|                      t          d„ |D ¦   «         ¦  «        ¦  «         t          t          j        t          j        d¬¦  «        }d„ |D ¦   «         }|                      t          d„ |D ¦   «         ¦  «        ¦  «         t          t          j	        t          j
        d¬¦  «        }d„ |D ¦   «         }|                      t          d„ |D ¦   «         ¦  «        ¦  «         |                      t          d	„ |D ¦   «         ¦  «        ¦  «         t          t          j        t          j
        d¬¦  «        }d
„ |D ¦   «         }|                      t          d„ |D ¦   «         ¦  «        ¦  «         dS )z7Validates that affixes only roll on allowed item slots.éZ   ©Ú
item_levelc                 ó   — g | ]	}|j         ‘Œ
S © ©Úmod_id©Ú.0Úms     r   ú
<listcomp>zMTestEndgameCraftingAndAffixes.test_slot_exclusivity_rules.<locals>.<listcomp>    s   € Ð8Ð8Ð8 Q˜œÐ8Ð8Ð8r   c              3   ó   K  — | ]}d |v V — Œ	dS ©Úmove_spdNr   ©r    Úmids     r   ú	<genexpr>zLTestEndgameCraftingAndAffixes.test_slot_exclusivity_rules.<locals>.<genexpr>!   s'   è è € ÐFÐF°#˜J¨#Ð-ÐFÐFÐFÐFÐFÐFr   c                 ó   — g | ]	}|j         ‘Œ
S r   r   r   s     r   r"   zMTestEndgameCraftingAndAffixes.test_slot_exclusivity_rules.<locals>.<listcomp>%   s   € Ð:Ð:Ð: a˜œÐ:Ð:Ð:r   c              3   ó   K  — | ]}d |v V — Œ	dS r$   r   r&   s     r   r(   zLTestEndgameCraftingAndAffixes.test_slot_exclusivity_rules.<locals>.<genexpr>&   s'   è è € ÐHÐH°3˜Z¨3Ð.ÐHÐHÐHÐHÐHÐHr   c                 ó   — g | ]	}|j         ‘Œ
S r   r   r   s     r   r"   zMTestEndgameCraftingAndAffixes.test_slot_exclusivity_rules.<locals>.<listcomp>*   ó   € Ð<Ð<Ð< q˜!œ(Ð<Ð<Ð<r   c              3   ó   K  — | ]}d |v V — Œ	dS )Ú
armor_flatNr   r&   s     r   r(   zLTestEndgameCraftingAndAffixes.test_slot_exclusivity_rules.<locals>.<genexpr>+   s'   è è € ÐKÐK°S˜\¨SÐ0ÐKÐKÐKÐKÐKÐKr   c              3   ó   K  — | ]}d |v V — Œ	dS )Úphys_pctNr   r&   s     r   r(   zLTestEndgameCraftingAndAffixes.test_slot_exclusivity_rules.<locals>.<genexpr>,   s'   è è € ÐHÐH°#˜J¨#Ð-ÐHÐHÐHÐHÐHÐHr   c                 ó   — g | ]	}|j         ‘Œ
S r   r   r   s     r   r"   zMTestEndgameCraftingAndAffixes.test_slot_exclusivity_rules.<locals>.<listcomp>0   r,   r   c              3   ó   K  — | ]}d |v V — Œ	dS )Ú
all_skillsNr   r&   s     r   r(   zLTestEndgameCraftingAndAffixes.test_slot_exclusivity_rules.<locals>.<genexpr>1   s'   è è € ÐJÐJ°C˜L¨CÐ/ÐJÐJÐJÐJÐJÐJr   N)r   r   ÚBOOTSr   ÚSUFFIXÚ
assertTrueÚanyÚBODY_ARMOURÚassertFalseÚ	WEAPON_1HÚPREFIXÚAMULET)	r   Úboot_suffixesÚboot_mod_idsÚchest_suffixesÚchest_mod_idsÚweapon_prefixesÚweapon_mod_idsÚamulet_prefixesÚamulet_mod_idss	            r   Útest_slot_exclusivity_rulesz9TestEndgameCraftingAndAffixes.test_slot_exclusivity_rules   s—  € õ .­h¬n½iÔ>NÐ[]Ð^Ñ^Ô^ˆØ8Ð8¨-Ð8Ñ8Ô8ˆØ�Š�ÐFÐF¸ÐFÑFÔFÑFÔFÑGÔGÐGõ /­xÔ/CÅYÔEUÐbdÐeÑeÔeˆØ:Ð:¨>Ð:Ñ:Ô:ˆØ×Ò�ÐHÐH¸-ÐHÑHÔHÑHÔHÑIÔIÐIõ 0µÔ0BÅIÔDTÐacÐdÑdÔdˆØ<Ð<¨OÐ<Ñ<Ô<ˆØ×Ò�ÐKÐK¸NÐKÑKÔKÑKÔKÑLÔLÐLØ�Š�ÐHÐH¸ÐHÑHÔHÑHÔHÑIÔIÐIõ 0µ´ÅÔAQÐ^`ÐaÑaÔaˆØ<Ð<¨OÐ<Ñ<Ô<ˆØ�Š�ÐJÐJ¸>ÐJÑJÔJÑJÔJÑKÔKÐKÐKÐKr   c           
      ó`  — t          t          j        t          j        d¬¦  «        }|D ]/}|                      |j        dd|j        › d|j        › d�¦  «         Œ0t          t          j        t          j        d¬¦  «        }t          d„ |D ¦   «         ¦  «        }|  	                    |d	¦  «         d
S )z2Low iLvl items cannot roll high-tier (T1) affixes.é   r   é   zAffix z tier z rolled on iLvl 20!éV   c              3   ó,   K  — | ]}|j         d k    V — ŒdS )é   N)Útier)r    Úaffixs     r   r(   zFTestEndgameCraftingAndAffixes.test_ilvl_tier_gating.<locals>.<genexpr><   s(   è è € Ð<Ð<¨�U”Z 1’_Ð<Ð<Ð<Ð<Ð<Ð<r   z.iLvl 86 item should have access to T1 affixes.N)
r   r   r:   r   r;   ÚassertGreaterEqualrL   r   r7   r6   )r   Úlow_poolrM   Ú	high_poolÚhas_t1s        r   Útest_ilvl_tier_gatingz3TestEndgameCraftingAndAffixes.test_ilvl_tier_gating3   s»   € õ )­Ô);½YÔ=MÐZ\Ð]Ñ]Ô]ˆØð 	qð 	qˆEØ×#Ò# E¤J°Ð3o¸E¼LÐ3oÐ3oÐPUÔPZÐ3oÐ3oÐ3oÑpÔpÐpÐpõ *­(Ô*<½iÔ>NÐ[]Ð^Ñ^Ô^ˆ	ÝÐ<Ð<°)Ð<Ñ<Ô<Ñ<Ô<ˆØ�Š˜Ð PÑQÔQÐQÐQÐQr   c                 ó6  — t          dddt          j        t          j        ¬¦  «        }| j                             |t          j        ¦  «        \  }}}|  	                    ||¦  «         |  
                    |j        t          j        ¦  «         |  	                    d|j        cxk    odk    nc ¦  «         |j        dk    rZ| j                             |t          j        ¦  «        \  }}}|  	                    ||¦  «         |  
                    |j        d¦  «         | j                             |t          j        ¦  «        \  }}}|  	                    ||¦  «         |  
                    |j        t          j        ¦  «         |  
                    |j        d¦  «         dS )	zBTests Transmutation -> Augmentation -> Regal crafting progression.Úprimal_blade_01u   U Minh Cá»‘t Ä�aoéU   ©Ú	item_uuidÚ	base_namer   ÚslotÚrarityrK   é   é   N)r   r   r:   r   ÚNORMALr   Úapply_currencyr   ÚHAC_SO_THACHr6   ÚassertEqualrZ   ÚMAGICÚtotal_affixes_countÚUAN_MA_THACHÚ	CO_COT_ANÚRARE)r   ÚitemÚokÚmsgs       r   Ú"test_primal_currencies_progressionz@TestEndgameCraftingAndAffixes.test_primal_currencies_progression?   s|  € åØ'Ø)ØÝÔ#ÝÔ$ð
ñ 
ô 
ˆð œ×2Ò2°4Õ9KÔ9XÑYÔY‰ˆˆC�Ø�Š˜˜CÑ Ô Ð Ø×Ò˜œ¥jÔ&6Ñ7Ô7Ð7Ø�Š˜˜TÔ5Ð:Ð:Ò:Ð:¸Ò:Ð:Ð:Ð:Ñ;Ô;Ð;ð Ô# qÒ(Ð(Ø œK×6Ò6°tÕ=OÔ=\Ñ]Ô]‰MˆB��TØ�OŠO˜B Ñ$Ô$Ð$Ø×Ò˜TÔ5°qÑ9Ô9Ð9ð œ×2Ò2°4Õ9KÔ9UÑVÔV‰ˆˆC�Ø�Š˜˜CÑ Ô Ð Ø×Ò˜œ¥j¤oÑ6Ô6Ð6Ø×Ò˜Ô1°1Ñ5Ô5Ð5Ð5Ð5r   c                 ó<  — t          dddt          j        t          j        ¬¦  «        }| j                             |t          j        ¦  «        \  }}}|  	                    ||¦  «         t          d„ |j        D ¦   «         ¦  «        }|  	                    |d¦  «         dS )z>Flame Demon Core Essence guarantees T1 Fire Damage on Weapons.Úboss_sword_01u   Liá»‡t Há»�a Ma Kiáº¿mrU   rV   c              3   ó`   K  — | ])}|j                              d ¦  «        o
|j        dk    V — Œ*dS )u   Liá»‡t Diá»…m ThiÃªu Há»“nrK   N)Úmod_nameÚ
startswithrL   ©r    Úps     r   r(   z`TestEndgameCraftingAndAffixes.test_pinnacle_flame_demon_essence_guaranteed_t1.<locals>.<genexpr>f   sC   è è € ÐxÐxÐbc˜!œ*×/Ò/Ð0LÑMÔMÐ]ÐRSÔRXÐ\]ÒR]ÐxÐxÐxÐxÐxÐxr   z+Weapon must have T1 Fire damage guaranteed.N)r   r   r:   r   re   r   Úapply_pinnacle_materialr   ÚTINH_HUYET_VIEM_QUYr6   r7   Úprefixes)r   Úswordrg   rh   ÚcraftedÚhas_t1_fires         r   Ú/test_pinnacle_flame_demon_essence_guaranteed_t1zMTestEndgameCraftingAndAffixes.test_pinnacle_flame_demon_essence_guaranteed_t1[   s�   € åØ%Ø.ØÝÔ#Ý”?ð
ñ 
ô 
ˆð  œ;×>Ò>¸uÕFXÔFlÑmÔmÑˆˆC�Ø�Š˜˜CÑ Ô Ð ÝÐxÐxÐgnÔgwÐxÑxÔxÑxÔxˆØ�Š˜Ð%RÑSÔSÐSÐSÐSr   c           	      ó  — t          dddt          j        t          j        ¬¦  «        }|j                             t          ddt          j	        dd¦  «        ¦  «         |j
                             t          d	d
t          j        dd¦  «        ¦  «         | j                             |t          j        ¦  «        \  }}}|                      ||¦  «         d„ |j        |j
        z   D ¦   «         }|                      t%          |¦  «        d¦  «         |d         j        }| j                             |t          j        ¦  «        \  }}}|                      ||¦  «         d„ |j        |j
        z   D ¦   «         }|                      ||¦  «         dS )z;Black Dragon Marrow locks 1 affix permanently as Fractured.Úfracture_targetu   ThiÃªn Ma Cá»‘t GiÃ¡péX   rV   Úpref_life_t1u    Báº¥t Diá»‡t Huyáº¿t Máº¡ch (T1)rK   é‘   Úsuff_fire_res_t1u   KhÃ¡ng Há»�a ChÃ¢n Thá»ƒ % (T1)é0   c                 ó    — g | ]}|j         ¯	|‘ŒS r   ©Úis_fracturedr   s     r   r"   zcTestEndgameCraftingAndAffixes.test_pinnacle_black_dragon_marrow_fractures_affix.<locals>.<listcomp>x   s   € ÐUÐUÐU ÀaÄnÐU˜!ÐUÐUÐUr   r   c                 ó   — g | ]	}|j         ‘Œ
S r   )rm   r   s     r   r"   zcTestEndgameCraftingAndAffixes.test_pinnacle_black_dragon_marrow_fractures_affix.<locals>.<listcomp>   s   € ÐSÐSÐS¨˜œÐSÐSÐSr   N)r   r   r8   r   re   rs   Úappendr	   r   r;   Úsuffixesr5   r   rq   r   ÚCOT_TUY_HAC_LONGr6   r`   Úlenrm   r^   ÚHUYET_HON_THACHÚassertIn)r   rf   rg   rh   Úfractured_modsÚfractured_nameÚrerolledÚall_mod_namess           r   Ú1test_pinnacle_black_dragon_marrow_fractures_affixzOTestEndgameCraftingAndAffixes.test_pinnacle_black_dragon_marrow_fractures_affixi   ss  € åØ'Ø-ØÝÔ%Ý”?ð
ñ 
ô 
ˆð 	Œ×Ò�X nÐ6XÕZcÔZjÐlmÐorÑsÔsÑtÔtÐtØŒ×Ò�XÐ&8Ð:[Õ]fÔ]mÐopÐrtÑuÔuÑvÔvÐvàœ×;Ò;¸DÕBTÔBeÑfÔf‰ˆˆC�Ø�Š˜˜CÑ Ô Ð àUÐU T¤]°T´]Ñ%BÐUÑUÔUˆØ×Ò�˜^Ñ,Ô,¨aÑ0Ô0Ð0ð (¨Ô*Ô3ˆØ œK×6Ò6°tÕ=OÔ=_Ñ`Ô`ÑˆˆC�Ø�Š˜˜CÑ Ô Ð ØSÐS¨XÔ->ÀÔARÑ-RÐSÑSÔSˆØ�Š�n mÑ4Ô4Ð4Ð4Ð4r   c                 óL  — t          dddt          j        t          j        ¬¦  «        }dh}| j                             |d|¦  «        \  }}}|                      |¦  «         |                      d|¦  «         dh}| j                             |d|¦  «        \  }}}|  	                    ||¦  «         t          d	„ |j        D ¦   «         d
¦  «        }|                      |¦  «         |                      |j        t          j        ¦  «         |                      d|j        ¦  «         d
S )z‡
        Primal Boneforge Altar requires quest completion and attaches severe downsides
        to avoid overpowered exploits.
        Úgod_armor_01u   VÃ´ Ä�á»‹ch Cá»‘t Tháº§n GiÃ¡pr   rV   Ú!quest_norm_01_thuc_tinh_tang_kiemÚcurse_titan_carapaceÚ PREREQUISITE_QUEST_NOT_COMPLETEDÚquest_epic_01_phong_ma_co_tranc              3   ó(   K  — | ]}|j         ¯	|V — Œd S ©N)Úis_downsidero   s     r   r(   zdTestEndgameCraftingAndAffixes.test_quest_gated_primal_boneforge_tradeoff_crafting.<locals>.<genexpr>Ÿ   s)   è è € Ð SÐ S qÀQÄ]Ð S Ð SÐ SÐ SÐ SÐ SÐ Sr   Nu   cáº¥m hoÃ n toÃ n ThÃ¢n PhÃ¡p)r   r   r8   r   re   r   Úapply_boneforge_tradeoff_craftr9   rˆ   r6   Únextrs   ÚassertIsNotNoner`   Údownside_typer   ÚCANNOT_EVADE_OR_DASHÚdownside_desc)	r   ÚarmorÚuncompleted_questsrg   rh   Ú_Úcompleted_questsÚforged_armorÚapplied_tradeoffs	            r   Ú3test_quest_gated_primal_boneforge_tradeoff_craftingzQTestEndgameCraftingAndAffixes.test_quest_gated_primal_boneforge_tradeoff_crafting‚   sH  € õ
 Ø$Ø6ØÝÔ%Ý”?ð
ñ 
ô 
ˆð BÐBÐØ”[×?Ò?ØÐ)Ð+=ñ
ô 
‰
ˆˆC�ð 	×Ò˜ÑÔÐØ�ŠÐ8¸#Ñ>Ô>Ð>ð =Ð=ÐØ $¤× JÒ JØÐ)Ð+;ñ!
ô !
ÑˆˆC�ð 	�Š˜˜CÑ Ô Ð õ  Ð SÐ S¨LÔ,AÐ SÑ SÔ SÐUYÑZÔZÐØ×ÒÐ-Ñ.Ô.Ð.Ø×ÒÐ)Ô7Õ9LÔ9aÑbÔbÐbØ�ŠÐ5Ð7GÔ7UÑVÔVÐVÐVÐVr   c           
      ó.  — d}d}d}t          |¦  «        D �]I}t          d|› �ddt          j        t          j        ¬¦  «        }|j                             t          ddt          j
        d	d¦  «        ¦  «         | j                             |t          j        ¦  «        \  }}}|                      |¦  «         |                      |j        ¦  «         |j        rD|d	z  }|                      |d
¦  «         |                      t'          |j        ¦  «        d¦  «         n|d	z  }| j                             |t          j        ¦  «        \  }	}
}|                      |	¦  «         �ŒK|                      |dd|› �¦  «         |                      |dd|› �¦  «         dS )zJValidates Feral Corruption (Vaal / Primal Orb) including 25% annihilation.r   éd   Úcorrupt_test_u   Táº¿ Pháº©m Ä�aorU   rV   Úpref_phys_t1zPhys DmgrK   ÚPERMANENT_ANNIHILATIONé
   z Expected ~25% annihilation, got é(   zExpected ~75% survival, got N)Úranger   r   r:   r   re   rs   rƒ   r	   r   r;   r   r^   r   ÚTA_HUYET_DI_BIEN_THACHr6   Úis_corruptedÚis_destroyedr`   r†   r‡   r9   ÚassertGreater)r   Údestroyed_countÚcorrupted_countÚ
iterationsÚirf   rg   rh   Úres_itemÚfailÚfail_msgrŸ   s               r   Ú1test_feral_corruption_permanent_annihilation_sinkzOTestEndgameCraftingAndAffixes.test_feral_corruption_permanent_annihilation_sink¤   s®  € àˆØˆØˆ
å�zÑ"Ô"ð 	#ñ 	#ˆAÝØ-¨!Ð-Ð-Ø,ØÝÔ'Ý!”ðñ ô ˆDð ŒM× Ò ¥¨.¸*ÅiÔFVÐXYÐ[^Ñ!_Ô!_Ñ`Ô`Ð`à $¤× :Ò :¸4ÕASÔAjÑ kÔ kÑˆB��XØ�OŠO˜BÑÔÐØ�OŠO˜HÔ1Ñ2Ô2Ð2àÔ$ð %Ø 1Ñ$�Ø× Ò  Ð&>Ñ?Ô?Ð?Ø× Ò ¥ XÔ%6Ñ!7Ô!7¸Ñ;Ô;Ð;Ð;à 1Ñ$�ð !%¤× :Ò :¸8ÕEWÔEgÑ hÔ hÑˆD�(˜AØ×Ò˜TÑ"Ô"Ð"Ñ"ð 	×Ò˜?¨BÐ0dÐSbÐ0dÐ0dÑeÔeÐeØ×Ò˜?¨BÐ0`ÈÐ0`Ð0`ÑaÔaÐaÐaÐar   c                 ó®  — t          dddt          j        t          j        ¦  «        }| j                             |t          j        ¦  «        \  }}}|  	                    |¦  «         |  
                    |j        d¦  «         t          dddt          j        t          j        ¦  «        }| j                             |t          j        ¦  «        \  }}}|                      |¦  «         |                      d|¦  «         | j                             |t          j        ¦  «        \  }}}|  	                    |¦  «         |  
                    |j        d¦  «         dS )	z?Tests Whetstone and Armour Scrap quality enhancement up to 20%.Úsword_qu   Thanh Phong Kiáº¿méP   é   Úchest_qu   Háº¯c BÃ¬ GiÃ¡pÚINCOMPATIBLE_SLOTN)r   r   r:   r   r]   r   r^   r   ÚHAC_THACH_MAI_NHANr6   r`   Úqualityr8   r9   rˆ   ÚCOT_GIAP_THAO_THIET)r   rt   rg   rh   Úchestrµ   rŸ   s          r   Útest_quality_currenciesz5TestEndgameCraftingAndAffixes.test_quality_currenciesÇ   s&  € å˜YÐ(<¸bÅ(ÔBTÕV`ÔVgÑhÔhˆàœ×3Ò3°EÕ;MÔ;`ÑaÔa‰ˆˆC�Ø�Š˜ÑÔÐØ×Ò˜œ¨Ñ*Ô*Ð*õ ˜YÐ(9¸2½xÔ?SÕU_ÔUfÑgÔgˆØ”{×1Ò1°%Õ9KÔ9^Ñ_Ô_‰ˆˆc�1Ø×Ò˜ÑÔÐØ�ŠÐ)¨3Ñ/Ô/Ð/ð œ×3Ò3°EÕ;MÔ;aÑbÔb‰ˆˆC�Ø�Š˜ÑÔÐØ×Ò˜œ¨Ñ*Ô*Ð*Ð*Ð*r   c           
      ó  — t          dddt          j        t          j        d¬¦  «        }|j                             t          ddt          j	        dd	¦  «        ¦  «         |j
                             t          d
dt          j        ddd¬¦  «        ¦  «         | j                             |t          j        ¦  «        \  }}}|                      |¦  «         |                      |j        t          j        ¦  «         |                      |j        d¦  «         |                      t+          |j        ¦  «        d¦  «         |                      t+          |j
        ¦  «        d¦  «         |                      |j
        d         j        ¦  «         | j                             |t          j        ¦  «        \  }}}|                      |¦  «         |                      |j        t          j        ¦  «         | j                             |t          j        ¦  «        \  }}}|                      |¦  «         |                      |j        t          j        ¦  «         |                      t5          d„ |j
        D ¦   «         ¦  «        ¦  «         dS )zDTests Scour resetting Rare to Normal and Alteration rerolling Magic.Úrare_reforgeu   BÃ¡ VÆ°Æ¡ng Kiáº¿mrU   rG   )r¿   Úpref_badzBad Modr»   r©   Ú	suff_fraczFractured God ModrK   é2   Tr€   r   c              3   ó$   K  — | ]}|j         V — Œd S r•   r€   )r    Úss     r   r(   zPTestEndgameCraftingAndAffixes.test_alteration_and_scour_cycle.<locals>.<genexpr>ò   s$   è è € ÐJÐJ¨q˜AœNÐJÐJÐJÐJÐJÐJr   N)r   r   r:   r   re   rs   rƒ   r	   r   r;   r„   r5   r   r^   r   ÚTRO_XUONG_TAY_UEr6   r`   rZ   r]   r¿   r†   r�   r_   ra   ÚBAO_MA_THACHr7   )r   Ú	rare_itemrg   rh   ÚscouredÚ
magic_itemÚaltered_items          r   Útest_alteration_and_scour_cyclez=TestEndgameCraftingAndAffixes.test_alteration_and_scour_cycleÚ   s"  € å  Ð1EÀrÍ8ÔK]Õ_iÔ_nÐxzÐ{Ñ{Ô{ˆ	ØÔ×!Ò!¥(¨:°yÅ)ÔBRÐTUÐWYÑ"ZÔ"ZÑ[Ô[Ð[ØÔ×!Ò!¥(¨;Ð8KÍYÔM]Ð_`ÐbdÐswÐ"xÑ"xÔ"xÑyÔyÐyð  œ;×5Ò5°iÕASÔAdÑeÔeÑˆˆC�Ø�Š˜ÑÔÐØ×Ò˜œ­Ô):Ñ;Ô;Ð;Ø×Ò˜œ¨"Ñ-Ô-Ð-Ø×Ò�˜WÔ-Ñ.Ô.°Ñ2Ô2Ð2Ø×Ò�˜WÔ-Ñ.Ô.°Ñ2Ô2Ð2Ø�Š˜Ô(¨Ô+Ô8Ñ9Ô9Ð9ð #œk×8Ò8¸ÕBTÔBaÑbÔbÑˆˆC�Ø�Š˜ÑÔÐØ×Ò˜Ô*­JÔ,<Ñ=Ô=Ð=ð !%¤× :Ò :¸:ÕGYÔGfÑ gÔ gÑˆˆC�Ø�Š˜ÑÔÐØ×Ò˜Ô,­jÔ.>Ñ?Ô?Ð?Ø�Š�ÐJÐJ°LÔ4IÐJÑJÔJÑJÔJÑKÔKÐKÐKÐKr   N)Ú__name__Ú
__module__Ú__qualname__r   rE   rR   ri   rw   r�   r£   r·   rÂ   rÐ   r   r   r   r   r      sÀ   € € € € € ð6ð 6ð 6ðLð Lð Lð.
Rð 
Rð 
Rð6ð 6ð 6ð8Tð Tð Tð5ð 5ð 5ð2 Wð  Wð  WðD!bð !bð !bðF+ð +ð +ð&Lð Lð Lð Lð Lr   r   Ú__main__)Ú__doc__ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arÚunittestÚ server.world.item_crafting_typesr   r   r   r   r   r   r	   Ú!server.world.item_crafting_enginer
   Úserver.world.item_affix_catalogr   r   ÚTestCaser   rÑ   Úmainr   r   r   ú<module>râ      s/  ððð ð € € € € € € € € € € € € €€€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð AÐ @Ð @Ð @Ð @Ð @ðð ð ð ð ð ð ð ðZLð ZLð ZLð ZLð ZL HÔ$5ñ ZLô ZLð ZLðz ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   