From 29a66f69e2ff94123b92001a3dbde90ab3a36125 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sun, 5 Jun 2022 05:14:59 +0200 Subject: [PATCH] Test basic Caves and Nests levels --- test/CMakeLists.txt | 1 + test/Fixtures.cmake | 10 +- test/drlg_l2_test.cpp | 8 +- test/drlg_l3_test.cpp | 124 +++++++++++++++++++++++ test/drlg_l4_test.cpp | 6 +- test/fixtures/diablo/10-1630062353.dun | Bin 0 -> 54404 bytes test/fixtures/diablo/11-384626536.dun | Bin 0 -> 54404 bytes test/fixtures/diablo/12-2104541047.dun | Bin 0 -> 54404 bytes test/fixtures/diablo/9-262005438.dun | Bin 0 -> 54404 bytes test/fixtures/hellfire/17-19770182.dun | Bin 0 -> 54404 bytes test/fixtures/hellfire/18-1522546307.dun | Bin 0 -> 54404 bytes test/fixtures/hellfire/19-125121312.dun | Bin 0 -> 54404 bytes test/fixtures/hellfire/20-1511478689.dun | Bin 0 -> 54404 bytes 13 files changed, 141 insertions(+), 8 deletions(-) create mode 100644 test/drlg_l3_test.cpp create mode 100644 test/fixtures/diablo/10-1630062353.dun create mode 100644 test/fixtures/diablo/11-384626536.dun create mode 100644 test/fixtures/diablo/12-2104541047.dun create mode 100644 test/fixtures/diablo/9-262005438.dun create mode 100644 test/fixtures/hellfire/17-19770182.dun create mode 100644 test/fixtures/hellfire/18-1522546307.dun create mode 100644 test/fixtures/hellfire/19-125121312.dun create mode 100644 test/fixtures/hellfire/20-1511478689.dun diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0c3676bbf..2c450ae74 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -21,6 +21,7 @@ set(tests drlg_common_test drlg_l1_test drlg_l2_test + drlg_l3_test drlg_l4_test effects_test file_util_test diff --git a/test/Fixtures.cmake b/test/Fixtures.cmake index 560f91b78..5a067bf8f 100644 --- a/test/Fixtures.cmake +++ b/test/Fixtures.cmake @@ -11,14 +11,22 @@ set(devilutionx_fixtures diablo/6-2034738122.dun diablo/7-680552750.dun diablo/8-1999936419.dun + diablo/9-262005438.dun + diablo/10-1630062353.dun + diablo/11-384626536.dun + diablo/12-2104541047.dun diablo/13-428074402.dun diablo/14-717625719.dun - diablo/15-1583642716.dun diablo/15-1583642716-changed.dun + diablo/15-1583642716.dun hellfire/1-401921334.dun hellfire/2-128964898.dun hellfire/3-1799396623.dun hellfire/4-1190318991.dun + hellfire/17-19770182.dun + hellfire/18-1522546307.dun + hellfire/19-125121312.dun + hellfire/20-1511478689.dun hellfire/21-2122696790.dun hellfire/22-1191662129.dun hellfire/23-97055268.dun diff --git a/test/drlg_l2_test.cpp b/test/drlg_l2_test.cpp index de3c24db7..dc6b36121 100644 --- a/test/drlg_l2_test.cpp +++ b/test/drlg_l2_test.cpp @@ -47,7 +47,7 @@ void TestCreateL2Dungeon(int level, uint32_t seed, lvl_entry entry) } } -TEST(Drlg_l1, CreateL2Dungeon_diablo_5_1677631846) +TEST(Drlg_l2, CreateL2Dungeon_diablo_5_1677631846) { TestCreateL2Dungeon(5, 1677631846, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(27, 28)); @@ -55,7 +55,7 @@ TEST(Drlg_l1, CreateL2Dungeon_diablo_5_1677631846) EXPECT_EQ(ViewPosition, Point(26, 62)); } -TEST(Drlg_l1, CreateL2Dungeon_diablo_6_2034738122) +TEST(Drlg_l2, CreateL2Dungeon_diablo_6_2034738122) { TestCreateL2Dungeon(6, 2034738122, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(33, 26)); @@ -63,7 +63,7 @@ TEST(Drlg_l1, CreateL2Dungeon_diablo_6_2034738122) EXPECT_EQ(ViewPosition, Point(34, 52)); } -TEST(Drlg_l1, CreateL2Dungeon_diablo_7_680552750) +TEST(Drlg_l2, CreateL2Dungeon_diablo_7_680552750) { TestCreateL2Dungeon(7, 680552750, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(27, 26)); @@ -71,7 +71,7 @@ TEST(Drlg_l1, CreateL2Dungeon_diablo_7_680552750) EXPECT_EQ(ViewPosition, Point(78, 52)); } -TEST(Drlg_l1, CreateL2Dungeon_diablo_8_1999936419) +TEST(Drlg_l2, CreateL2Dungeon_diablo_8_1999936419) { TestCreateL2Dungeon(8, 1999936419, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(39, 74)); diff --git a/test/drlg_l3_test.cpp b/test/drlg_l3_test.cpp new file mode 100644 index 000000000..16ff59ac3 --- /dev/null +++ b/test/drlg_l3_test.cpp @@ -0,0 +1,124 @@ +#include +#include + +#include "drlg_l3.h" +#include "engine/load_file.hpp" +#include "gendung.h" +#include "quests.h" +#include "utils/paths.h" + +using namespace devilution; + +namespace { + +void TestCreateL3Dungeon(int level, uint32_t seed, lvl_entry entry) +{ + paths::SetPrefPath(paths::BasePath()); + + std::string dunPath; + + if (level >= 9 && level <= 12) { + dunPath = fmt::format("test/fixtures/diablo/{}-{}.dun", level, seed); + pMegaTiles = std::make_unique(206); + leveltype = DTYPE_CAVES; + } else if (level >= 17 && level <= 20) { + dunPath = fmt::format("test/fixtures/hellfire/{}-{}.dun", level, seed); + pMegaTiles = std::make_unique(166); + leveltype = DTYPE_NEST; + } + + currlevel = level; + CreateL3Dungeon(seed, entry); + + auto dunData = LoadFileInMem(dunPath.c_str()); + ASSERT_NE(dunData, nullptr) << "Unable to load test fixture " << dunPath; + ASSERT_EQ(Size(DMAXX, DMAXY), Size(dunData[0], dunData[1])); + + const uint16_t *tileLayer = &dunData[2]; + + for (int y = 0; y < DMAXY; y++) { + for (int x = 0; x < DMAXX; x++) { + auto tileId = static_cast(SDL_SwapLE16(*tileLayer)); + tileLayer++; + ASSERT_EQ(dungeon[x][y], tileId) << "Tiles don't match at " << x << "x" << y; + } + } + + const uint16_t *transparentLayer = &dunData[2 + DMAXX * DMAXY * 13]; + + for (int y = 16; y < 16 + DMAXY * 2; y++) { + for (int x = 16; x < 16 + DMAXX * 2; x++) { + auto sectorId = static_cast(SDL_SwapLE16(*transparentLayer)); + transparentLayer++; + ASSERT_EQ(dTransVal[x][y], sectorId) << "Room/region indexes don't match at " << x << "x" << y; + } + } +} + +TEST(Drlg_l3, CreateL3Dungeon_diablo_9_262005438) +{ + TestCreateL3Dungeon(9, 262005438, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(41, 73)); + TestCreateL3Dungeon(9, 262005438, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(73, 59)); +} + +TEST(Drlg_l3, CreateL3Dungeon_diablo_10_1630062353) +{ + Quests[Q_ANVIL]._qactive = QUEST_NOTAVAIL; + + TestCreateL3Dungeon(10, 1630062353, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(55, 37)); + TestCreateL3Dungeon(10, 1630062353, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(19, 47)); +} + +TEST(Drlg_l3, CreateL3Dungeon_diablo_11_384626536) +{ + TestCreateL3Dungeon(11, 384626536, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(29, 19)); + TestCreateL3Dungeon(11, 384626536, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(65, 65)); +} + +TEST(Drlg_l3, CreateL3Dungeon_diablo_12_2104541047) +{ + TestCreateL3Dungeon(12, 2104541047, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(35, 23)); + TestCreateL3Dungeon(12, 2104541047, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(21, 83)); +} + +TEST(Drlg_l3, CreateL3Dungeon_hive_1_19770182) +{ + TestCreateL3Dungeon(17, 19770182, ENTRY_TWARPUP); + EXPECT_EQ(ViewPosition, Point(75, 81)); + TestCreateL3Dungeon(17, 19770182, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(59, 41)); +} + +TEST(Drlg_l3, CreateL3Dungeon_hive_2_1522546307) +{ + TestCreateL3Dungeon(18, 1522546307, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(47, 19)); + TestCreateL3Dungeon(18, 1522546307, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(33, 35)); +} + +TEST(Drlg_l3, CreateL3Dungeon_hive_3_125121312) +{ + TestCreateL3Dungeon(19, 125121312, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(61, 25)); + TestCreateL3Dungeon(19, 125121312, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(21, 85)); +} + +TEST(Drlg_l3, CreateL3Dungeon_hive_4_1511478689) +{ + TestCreateL3Dungeon(20, 1511478689, ENTRY_MAIN); + EXPECT_EQ(ViewPosition, Point(65, 41)); + TestCreateL3Dungeon(20, 1511478689, ENTRY_PREV); + EXPECT_EQ(ViewPosition, Point(65, 41)); +} + +} // namespace diff --git a/test/drlg_l4_test.cpp b/test/drlg_l4_test.cpp index 6fa2c94d0..5abee77cc 100644 --- a/test/drlg_l4_test.cpp +++ b/test/drlg_l4_test.cpp @@ -52,7 +52,7 @@ void TestCreateL4Dungeon(bool changed, int level, uint32_t seed, lvl_entry entry } } -TEST(Drlg_l1, CreateL4Dungeon_diablo_13_428074402) +TEST(Drlg_l4, CreateL4Dungeon_diablo_13_428074402) { TestCreateL4Dungeon(false, 13, 428074402, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(26, 64)); @@ -60,7 +60,7 @@ TEST(Drlg_l1, CreateL4Dungeon_diablo_13_428074402) EXPECT_EQ(ViewPosition, Point(47, 79)); } -TEST(Drlg_l1, CreateL4Dungeon_diablo_14_717625719) +TEST(Drlg_l4, CreateL4Dungeon_diablo_14_717625719) { TestCreateL4Dungeon(false, 14, 717625719, ENTRY_MAIN); EXPECT_EQ(ViewPosition, Point(90, 64)); @@ -68,7 +68,7 @@ TEST(Drlg_l1, CreateL4Dungeon_diablo_14_717625719) EXPECT_EQ(ViewPosition, Point(49, 31)); } -TEST(Drlg_l1, CreateL4Dungeon_diablo_15_1583642716) +TEST(Drlg_l4, CreateL4Dungeon_diablo_15_1583642716) { Quests[Q_DIABLO]._qactive = QUEST_INIT; TestCreateL4Dungeon(false, 15, 1583642716, ENTRY_MAIN); diff --git a/test/fixtures/diablo/10-1630062353.dun b/test/fixtures/diablo/10-1630062353.dun new file mode 100644 index 0000000000000000000000000000000000000000..f84ccdf729f26312f6e6476f72f12f72f1b26a17 GIT binary patch literal 54404 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 OKmsH{0who+fqwysO!6oI literal 0 HcmV?d00001 diff --git a/test/fixtures/diablo/9-262005438.dun b/test/fixtures/diablo/9-262005438.dun new file mode 100644 index 0000000000000000000000000000000000000000..b38c9841de43dca647934573a19ca57ad954f380 GIT binary patch literal 54404 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 A=l}o! literal 0 HcmV?d00001 diff --git a/test/fixtures/hellfire/18-1522546307.dun b/test/fixtures/hellfire/18-1522546307.dun new file mode 100644 index 0000000000000000000000000000000000000000..98df25ac974a66beb34ad8531b77adfd9d11ef56 GIT binary patch literal 54404 zcmeI3TW?!c5QTS1sgou#*B3jEb7`8SC@qvbuUyKtfW&{u3m_pOgai^Vy}ZDWX1=|= zYdcNrlVj)DNmnc%pUd7eYrdI1`>0Y6(_!kS<+PDHaa_*FZtBHZFV4C9W_lyedvU%T zBl+-DBYRJ-c!mX8VQd+*oc7Z@X(`>!$D{OGdOcl_YewFUU&f(8wo$SX9=KCJQo|kj z+exjop4QUK=~}uO=ly(r7?G@{t1;@`^j12^-&xZzg9X7Gh zN?T!ZJKNn1d);&;wd1;X+K7NpFWAvtx(vG?@LcU?L2ceYAkENk5aAtiD4((+lwcy zfhs)158iNP+@0`uKaWA(_F%+H9;XqdK32o)+u1MCT}!)9tPS(uODkdJyYz89lRB~n z;q{z#Wd!lw3~Jkv9b(vwU%niPceL`*uoq+cS$Q|TnrDy~ zjoZ(8KL{_sV2$XAJX;o=&W~ zwV3;5`XFizRqN?i++o#~GjcDhtOU9NQFI0$Y~z*8<5~2WPpyenKloDX)C#dvCt@RQ zMWL#um$|lMjEHHytHwmGpZSsxGNTHlGoX%Y<2c$8u#XifB%@kybOPm?$nnQ|RWDHX zOO%RQ9JM}sQPaev6^{mZT@MnnLgd7_GpIjS#YT`i2u9dJlU6auPG*QbDvz~}qHp7u zD#41now^I_j(TQg@|3El->a{vU*C=q%)t&TlbZb|eH1fGmbkAGS|RGCiW`gALnT%> zGC#5gF;y%)u}_w$B9wDQM)Z|$GNV|rsMx8^m6$Ir)IJ$fXKu$`;!<{6>7VpVSVSxS zwlYWf4XueL^XcfL_gM#!AUlxX&HDZbD~bfptSX{Jn{t6(dV@N;Ruf~0vS@2(oAi@k z({Eu_*?_6KTIns=Jc|B&n0E&4YwU~YM@{K8oRjVC^hG|y50zN#sa8;?S|0Wf=CA{5 z$G`@Rc5;kV_vh*TutR3lUzK6)TEt9#*)br&UWiX<(UH}o*i)d(k+`LrDkbAu$>c!l zI@t=@Vt*tjj8p#9Vf9V{pzjIe5Zmd$5`&lb*64ax5W}&A%pbt8-qx~7io4G1j1$v92JFC|Y`wxue2V2sP ze)7wnF23Xrc2tG3TlO(_u^U;dGAmzNo7h1aR)>|1N_si5qEg=Rrj?|9fnG&lE&W`! zw71DB8nMfI!-^tS?Uy*TUP@Oem8CZ|#+2SKi&)>tZyj1w_{XYhU%dm$LpCGIu(KczAa7Rs4I52`qjM&8AOG&h#{^v6*#PUtu#0 zr`;1K=cxXOhxMm6IP+qtY!JvqSMwuQZ8gqM-$ZnC9#D;66_MxBeP`9n&~_gBs&J`3 zrg??q>*Bb&)P)$i*m@URT}n^u8^1GtHIIZ(QZVWHJT#B`Ty%Y-TBko>v}hlXgmipL zwU0cW)9I+fIZ2q{_ACl{lbGGx!~|ir9xt}KS|NE-4FZe*Hh7-@Qt&X1zxCAs7*m>i zSFNV@Jc$)T)s&Rc^DH|y-Wo@dR^OrRbC_LjQ)OB3(4vw3T%$7VR|czAl^tS-9~W_&r3Kr?;$ zq>N{0{^Uqsn}7+Jz(pd^#14Lucv!0mn1BhGfC-p@37CKhoKE2W>9>8?1WceI0zWq7 z$8Jo(1gaA#d!yH9b!HxE0w!PrO%k9_mtNhZ-^=Ff;xP1%eD>P=@9a}NqagzIR^Cqy zse7^AnDQ+0|8L^6xPObTFD*2^#m%dgnScqHz>7rSeBW5=y{o=R{2i+an1BgfBm(a0 z7b#oTY62!80{(YxSAq$cfC-p@37CKhn1BhGfC-p@37CKhn1BhGfC-p@37CKhn1BhG tfC-p@37CKhn1BhGfC-p@37CKhn1BhGfC-p@37CKhn1BhGfC)@X;D1|QvcmuX literal 0 HcmV?d00001 diff --git a/test/fixtures/hellfire/19-125121312.dun b/test/fixtures/hellfire/19-125121312.dun new file mode 100644 index 0000000000000000000000000000000000000000..c891b25b3c06044aa21f6834059e1a60d7c9addd GIT binary patch literal 54404 zcmeI3Yi}Dx6oyaR5W8&>u3v1&x%8G&3MkyfXG*z9R6^os6eJ|XCnUZgT8Z+bInTVF zZW`>^O}z28dAqWAy)$#>J z`K0lqxF1*Y?qM9nwR|1qCuTUzbM4Pq#>r+s+YjUYNxNnnFU3~u7Hhrig_S|v&d<8;rzLD} zhNon^P#O5H$J_S~bJ zMcp`lh%d`5DBCJ8u@O~yjQ^v!QRdq#?>nhsob2>k%hpSU0zPx}il3K~3Vsn2X(P5A z#6}}7PiAFyM)A2S80MV2lY7{>9v^4M5F^Gb^QuDGr3dZIyr1^4bfcW_J&(a!YPp?# zwzFktqO|H#_8rwo)-YmFJi+2de3SQdMYK0Fu4KGJY%7u`cn9OqM0t9OdWjj2C3~vL8MSbHx$`tsYv?`E$`m z>weCweqyB<%c|W3PJ4c`(UnRTxMsYiT2Q zL{e**xs;ob(P~2<5vevuarHSFF~{#~#dB7H#%q1R1WO;4ci4{#!^Rr6seuQ{tj3KP zh!NhAm8vpCOmis@s}!Vgb?YVd; zi^@HA1J(%jgy=F8^GmNXx;{Bni?ri~DiW2N_!1HHqe@rwgC@J6JcgmFf_!Ctp!RC9 zfC|Ns)uLLAHM~{!?x#|%Xm;TWyG1d*73U5-C^pulDiPTU}Go#%zFHw5Z#T(@mryGH~T<~ zXDz(LGZgaP3|FfaescX*(V=Ws zo#~bO&Wa)C_AOVaAcC~Vv|~+Rjxg* z`irGnUG@BewSHCx?Hy@&!+%V`1WdpLOuz(8zywUd1WdpL zOuz(8zywUd1WdpLOuz(8zywUd1WdpLOuz(8zywUd1WdpLOuz(8zywUd1WdpLOuz(8 zzywUd1YRiuPdcvltooj|=AV?EP2ba4hQ8SvX1C17@=tKoKg-egBu=BGYH0u5ZFTMY zf3as+Mvh->f~WER*Dn_+q^!@zSaIWXViJ`YBT<}y$FG6ncj`O zMA;K=oq+4rMb7~HZvrM@0w!PruPcEcUsuQMmkF4_0t6l{&}Y#u%e1xVobG1= zCSU?4U;-lGUFc$ELf3z(eHQ2QZ~9M{_sgL7)4~bI_s!GkTzCq1GyxMZ0TVC*6X*;9 z?fQRrMvsNGPvFHTJ^x)p`^3+ChGl$vXiIZf{w?ur|6T=!v(>xB1eQZ!_BvSnmxbjh znP!DwZ@OIPrfFXEUh}_as)zM_+`@}{`SI3vKl2M()zw_JJLk(-ui9Q_%xd~}U+MY$ zR=OJcp49|QzywUd1WdpLOuz(8zywUd1WdpLOuz(8zywUd1WdpLOuz(8zywUd1WdpL mOuz(8zywUd1WdpLOuz(8zywUd1WdpLOuz(8zyw}p0{;OqPqmEz literal 0 HcmV?d00001 diff --git a/test/fixtures/hellfire/20-1511478689.dun b/test/fixtures/hellfire/20-1511478689.dun new file mode 100644 index 0000000000000000000000000000000000000000..51b34099e717c7e17f87527380148f5ee718bf96 GIT binary patch literal 54404 zcmeI3TW?!M6oseMB~BYh;_~9uiE}A5r7h5M6R(sOO2tLuX8;ls4@mHcM5`A5Gy9w6 z;W)0XoVY&rNxWj&IX*M9X76ub=7fslbeyiIe%gu8LHxcRSKWB`Jx^wYJVavZkvc{#p`5c{(BQdqPZ zwtbmCj?Z5DFnhX{_G6DujEj!^;!}k7W4B?v@uHV?@mWmK+z#7@>2au_xs`2Z_T})S z%qw|uEfYc!?jqF-dvC>ycn*R*tcL09^lAPLMfSi#vPG=16bldI{+0AvjHC5)e3Pc4 zicg2J&)(=gjNjPRP4C1!c#0sN%Il+i|J|@*KmC$^jrl|Xg+lx=uC?QC-g`TAn7^9| zDjs+%`)ZGHrxtA^Jhi|Wihx*MGF=7u9EIRUckkES)w(ZA^VZ7Ou6{tvu z?CFL@#Q*K|R*w5Y%v1)c8mTl@3}nAapM@&^!BI6Z$n|wIXUMhC!h>FVBfXh*s|>_T zX~B;i+YBZ4Qug1CRmb@SA?_KZdBxrn1?=Z_!DOoSa+1E zpu!q5tds9kYgN6HUu2$k|u2$NMbp)NR+4+eA$W-@`RnxBWmRL-596V$ti5a&yB2vM~q+>6!C754$`9-g@g3e zu~0*odQ&W@du1#(kk!N-y>4hgQvK;LeU(1RV~nVqVja4J%ov|k$BG`gs~ROMJGp`j zx1ETsDiV57Qzufc?8MI4gg1(+azNHIR;p(=eB6(DS7RpK3N=~8CoedbY*BZCBdp0k zA^^9Cv3f7w#Qbp{hp)2hR?JZcRG&swQBVvX<(VjGe=>H^l-aQpHICm{qh3Xf)W671)tf9; zKPTd-h_>=jmD7teR#l=r5g*92(~Z1NWT3H;9t4r9w?ePf8~KS{=uo+x+}rR`6+?75 zRj3EXMFW3}7v(vDTI=Q$7AmTOQVsYGor8Q*sw;4htBtsamTHIYNCqlvIN!vj)OatR zFF3)}O%F!)40FsyO*THsnpBK3S<%2oxRA?5QPoEUF+v{8Gis2%^_?E94v3y&fhM)Z z`J;%cC-u^M;cGv$^hb75P3!Cxzw5a=Sw;8Yo+3`y-^`IBw>e4hOwTj2 z6J4T@ZL&n196e%rNhW8EEXB&=nCs(A>Qu9$vjNo#~77=JN$&2DhX@o zhdQCUqaH+NsehDiM9nFui+|sx&-2deCQ{Rr!MNq+424L^04!2I<1Kk}FUMDXnVgar z>_n!Qb@WT+7z*@9S*1Q&bwR8U-}0nUBF!qD=%t5<4?9)AktO~>|WdNyT?Y4@f~Yy8%; z^fX>4f1XXX_~e|)Z%z3lTb`e&!lw3`^l8@jmx+zrH=lKrF_^V?-TRX^j@RLf^rEiJ zO6IlOx~7mU!s~e|w<&*S>CRUlv($Xw1kN{sMR)%5O~clkz{Mrtv+v@@mZ$1PJi|3d zXtmaj{{_;Vk5;}&1QwC8FKdkdwLVVk-|;Usu3uKJv1npSr7?asEUH#2^@(k3f2|bw z+p@B8Q5M!Vq{hU`x|5SDA5Px)w^t=Fo)NFA)x`Q)8PUXEXV+{ay|xoeV?F5X#G7By zZhp=C-`oz1J#iMRhS#&6Dw-oA<;8n)n#J{Zgh~C`r|s+UWfSm|)3S-rvtPUa3v#=y zn}_!@*0hz{csHN?H|AwrG~dX6M^&AHP7VS%*pHN^-LVC8gOh{6%HF? z0w!PrCSU?4U;-v!0w!PrCSU?4U;-v!0w!PrCSU?4U;-v!0w!PrCSU?4U;-v!0w!Pr rCSU?4U;-v!0w!PrCSU?4U;-v!0w!PrCSU?4U;-v!0w!Pr=ZL_6=(M{f literal 0 HcmV?d00001