From 12fc9490065e1ddc2fada269a045cd2725a257f5 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 19 Nov 2015 16:07:15 -0800 Subject: [PATCH] [tests] Don't use icons from the style for annotations --- include/mbgl/platform/default/glfw_view.hpp | 2 ++ platform/default/glfw_view.cpp | 9 +++++- test/api/annotations.cpp | 30 ++++++++---------- .../annotations/add_multiple/expected.png | Bin 4589 -> 2771 bytes .../annotations/fill_annotation/expected.png | Bin 1543 -> 1538 bytes .../annotations/line_annotation/expected.png | Bin 2412 -> 2088 bytes .../non_immediate_add/expected.png | Bin 1543 -> 1538 bytes .../annotations/point_annotation/expected.png | Bin 4273 -> 2594 bytes .../annotations/switch_style/expected.png | Bin 4273 -> 2594 bytes test/fixtures/api/empty.json | 3 +- test/fixtures/sprites/default_marker.png | Bin 0 -> 1010 bytes 11 files changed, 24 insertions(+), 20 deletions(-) create mode 100644 test/fixtures/sprites/default_marker.png diff --git a/include/mbgl/platform/default/glfw_view.hpp b/include/mbgl/platform/default/glfw_view.hpp index a434b71bb..2318cb6cc 100644 --- a/include/mbgl/platform/default/glfw_view.hpp +++ b/include/mbgl/platform/default/glfw_view.hpp @@ -20,6 +20,7 @@ public: std::array getFramebufferSize() const override; void initialize(mbgl::Map *map) override; + void notifyMapChange(mbgl::MapChange) override; void activate() override; void deactivate() override; void notify() override; @@ -61,6 +62,7 @@ private: std::vector spriteIDs; private: + bool initializedDefaultMarker = false; bool fullscreen = false; const bool benchmark = false; bool tracking = false; diff --git a/platform/default/glfw_view.cpp b/platform/default/glfw_view.cpp index 4e00722e2..48e9386fc 100644 --- a/platform/default/glfw_view.cpp +++ b/platform/default/glfw_view.cpp @@ -117,6 +117,13 @@ void GLFWView::initialize(mbgl::Map *map_) { View::initialize(map_); } +void GLFWView::notifyMapChange(mbgl::MapChange change) { + if (change == mbgl::MapChange::MapChangeDidFinishLoadingMap && !initializedDefaultMarker) { + initializedDefaultMarker = true; + map->setSprite("default_marker", makeSpriteImage(22, 22, 1)); + } +} + void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action, int mods) { GLFWView *view = reinterpret_cast(glfwGetWindowUserPointer(window)); @@ -234,7 +241,7 @@ void GLFWView::addRandomPointAnnotations(int count) { std::vector points; for (int i = 0; i < count; i++) { - points.emplace_back(makeRandomPoint(), "marker-15"); + points.emplace_back(makeRandomPoint(), "default_marker"); } auto newIDs = map->addPointAnnotations(points); diff --git a/test/api/annotations.cpp b/test/api/annotations.cpp index ae9c80473..4c06b39e4 100644 --- a/test/api/annotations.cpp +++ b/test/api/annotations.cpp @@ -14,6 +14,11 @@ using namespace mbgl; +std::shared_ptr defaultMarker() { + PremultipliedImage image = decodeImage(util::read_file("test/fixtures/sprites/default_marker.png")); + return std::make_shared(image.width, image.height, 1.0, std::string(reinterpret_cast(image.data.get()), image.size())); +} + PremultipliedImage render(Map& map) { std::promise promise; map.renderStill([&](std::exception_ptr, PremultipliedImage&& image) { @@ -35,7 +40,8 @@ TEST(Annotations, PointAnnotation) { Map map(view, fileSource, MapMode::Still); map.setStyleJSON(util::read_file("test/fixtures/api/empty.json"), ""); - map.addPointAnnotation(PointAnnotation({ 0, -20 }, "default_marker")); + map.setSprite("default_marker", defaultMarker()); + map.addPointAnnotation(PointAnnotation({ 0, 0 }, "default_marker")); checkRendering(map, "point_annotation"); } @@ -99,11 +105,12 @@ TEST(Annotations, AddMultiple) { Map map(view, fileSource, MapMode::Still); map.setStyleJSON(util::read_file("test/fixtures/api/empty.json"), ""); - map.addPointAnnotation(PointAnnotation({ 0, -20 }, "default_marker")); + map.setSprite("default_marker", defaultMarker()); + map.addPointAnnotation(PointAnnotation({ 0, -10 }, "default_marker")); render(map); - map.addPointAnnotation(PointAnnotation({ 0, 20 }, "default_marker")); + map.addPointAnnotation(PointAnnotation({ 0, 10 }, "default_marker")); checkRendering(map, "add_multiple"); } @@ -135,6 +142,7 @@ TEST(Annotations, RemovePoint) { Map map(view, fileSource, MapMode::Still); map.setStyleJSON(util::read_file("test/fixtures/api/empty.json"), ""); + map.setSprite("default_marker", defaultMarker()); uint32_t point = map.addPointAnnotation(PointAnnotation({ 0, 0 }, "default_marker")); render(map); @@ -185,7 +193,8 @@ TEST(Annotations, SwitchStyle) { Map map(view, fileSource, MapMode::Still); map.setStyleJSON(util::read_file("test/fixtures/api/empty.json"), ""); - map.addPointAnnotation(PointAnnotation({ 0, -20 }, "default_marker")); + map.setSprite("default_marker", defaultMarker()); + map.addPointAnnotation(PointAnnotation({ 0, 0 }, "default_marker")); render(map); @@ -193,16 +202,3 @@ TEST(Annotations, SwitchStyle) { checkRendering(map, "switch_style"); } - -TEST(Annotations, CustomIcon) { - auto display = std::make_shared(); - HeadlessView view(display, 1); - DefaultFileSource fileSource(nullptr); - - Map map(view, fileSource, MapMode::Still); - map.setStyleJSON(util::read_file("test/fixtures/api/empty.json"), ""); - map.setSprite("cafe", std::make_shared(12, 12, 1, std::string(12 * 12 * 4, '\xFF'))); - map.addPointAnnotation(PointAnnotation({ 0, 0 }, "cafe")); - - checkRendering(map, "custom_icon"); -} diff --git a/test/fixtures/annotations/add_multiple/expected.png b/test/fixtures/annotations/add_multiple/expected.png index deedf84330c5902065b36179477349d670d12a6a..f77ddb0792f972387ab7fcb38b1491c5fff40365 100644 GIT binary patch literal 2771 zcmeH}`BT$(8ppp-R7h5l(|{bdtOUv>qJrT_Dhi90LqLuM6PkFlF_FEzG3+^v zKC^?aPi%bPu7Nyc{VYSb>`_4jj@wsvQ_tI`pYq0XK11PmR*pG~ zQ~A}j5@#pZR)+1Ga%KO^9oe0SM|jzvd;S z*P!7vgKR+sBc$4SJXTf!!`Pn!H!{++B10>8F}j3BuM&kDpKOX0^6ETOw-VpH+*&xc z2%IRcgHN``STH7EIH9ccE4IIBA~qNE58UWLUpv~Itfq(9yhIzj!?lExj|UqkNrnDy z1*r{($C~qmBN@vBuZy4hi|c*i%qP(;c!A;mAVJjG@8&%~_dh{U3nn|zv>$T36=Jer zbZB|{v)NX!3W#aH8F}Hsa@XA4EZ?f=6>Iy$J?8||cW*zx(ed585Is-{poA(jxdB(W_W#?>@|%#wQ|%ubx-VDwh%JpOJ?bgC4P&qJ5mZ!JS5k zz!mp{u4paq&7Ol5ODtD7EmcAB~0Lz8yG0`n1@TW84o^v4oTH;s?IHcwrDmDQEW zG##1EQ^wN^&vlij%>*8gy?~;Pnu#@UL&9?mXiQX~ASyH)uheXXy zx#H!F-?Ug%O485dLlc%c`STp*fKrI_%-IMl&$S~}{Z27Ug(K_7WS=0LB9e4+Vi#{k zl&I@urkEXtJiMoD@Lx)y{z}IvRrI!eP^6wYywqF(3g@5`uHS8qn*3P+);cgDQdaFt@q z$JYnEJ2md+;|i??9qjBzzVGIcSqbeTI>K!uKNZV&xm4dxXEV95Twbfn?cxMle;>x} z(*lh!5_Ng}JZS6l6bHnzo?ME&u$0pNYg9_2I*RWw{ywao1G-;TRb|E)xfW!;!b@Cy zySB#N3CcJvfo@J#l)ttg7-W&Jr))vNO~`MtSgh3#8n&5%!t<1J7^Zk`u_7}~>wtE* zN3RQUePL>JbhIJx@iS#Nz|8I*86qmoo33r3GGEO-PlfEs zw}fJoFAcLFexsX|6d%7XU0Yjg_dD%Nt-n{czL=k;^&`CQg_o(h`F7xF0W+nIkihR) z!bL@av&{!-IecYnOEaZi#{(SQ9=x?E?&(nuhan&+69@!?j)T2ETPcq z1khopBkRh7qN3Gq9+TFAti2Ss8A6sYKHF85xU^sC(-%+zB#_`SoV0hcvf<>ifX>Wx zUF@dCNNHA9ahJRNmZP*ZRyIfaa3!Y{hQVDI%D^SSn)84=_G2Y`E?R>i<0D9Dd)5=w zFa*c+DCY$UcyEN4iE2zWPI)3V=HkVRE2OX%v*(Tn@=T44N=5N0f5>i{T1nZ~Nl!wp zfT#Ts^m1ZX2ZluVVsD-?u$-&}doRSg_&P9KY)4%(FvezP z=(5t%a1mW4J>uh$us`3w_E#YJzofE{+xj21E#7b(?Y8ias+0=&obo$acOvrUzW{Vu B17-jK literal 4589 zcmeHL`8(9z|9)#h3+gFKmeEtnE{QZ#MpD@x`;x68NsKYV7z{JCNka8lo-mYUCW9IK zSQ?XrkS#ldB-@N7%NS-D-|6$y_Ye5|@cH5SseeU}{*L7m8EN+VJKd~PG z05KC|BO3q^5)6d^QDH&n8uQJoK;haBCh$`H8cwDjmv4K?*p!Egh zdNA6q+D??ZOVZQD-|c=h!iPHQH9~7|=TO&tI{m0{DqdR~GQ&I56NDM(Tw0o$=VfXK z5xg@_os0r@i7Nct{4aB04vrqo9hp2aGy#IHJGf!41zMkSnf0qnd-=DmDS))Gk9w6$Q>cKY9<)z2RL*%Q2T3&zMW0o39C`)(9va6e@cU@eU+umgP^M_y2 za@y4X}}WIh8-O~PJk)01k_o>yc^e>J~yyiHXK8|0vAir z7zS%}yCyd);9E4fgx0N|KENd8{^5Tv9Y?5zqCN5`d$PNl_JImb?4pDeav$Ycew09( zj7~vz(7bI7k2gLzJ+>gj_Q2}TtX$hoE-q`HirKErz`?VOt3zu#8q=KJK9K8iHZPTi z8^YRAi`kxp+8aAg(V#txqrK_Xg*NDY0{lO>PPiKPyQh<~O|*$;G>godG}ozXjB87N z9r!hhN}K26#ZOr+aZYo$1EuxXQWVNX6V4y+I|gcBkUOJ&oxj>*Xeo zo-ujT)(aMFo?a(69zEY;)$~Si|1UBm_cclyh|W7g*ZW^c7tP^#mOMyiD5ZJ3pa6+X ziWu{vMt+yND9Pw+vk39l0DtNuuFJ)UXghH%p`whnL9@jQyjE(4{s>I$GpBcTD&Zcw zgW)ihY!dUYh(a?@VpA3F-uQMU1bziM-YKvm++rp@kv((>V| zmFU03#PWYCl0v4MZl~^JOt!K8gNWsd47qX0$X`hR%WuE561P-{D=EJbY%VueAUrH{ zx|)i`3i7bRQGbA9gLz$da0O(9QYu>JM&xYjNZpVdYO#f!_s-wYIvF+<2&p`pY`gtD zC-k{Xxz^_=O66KcbtF=n(A&>3IW&E~n0<8!FKTt1HExR;!+paIXE>l2_pNdY)4#lE z#p~8K=F6LrU=Nbi$cO_$z9qiZ@g7`z+tGu7qW%eftv)fom0b%V*i#ZP%gS+n%WnxP zAX&gJwy~s2#D00t0VlOML?b*uzMtTnbsk9C5N)0;xkR#oEsGJh$cdxhJQGF9X}>PcO!QZEdP^D0rdP_O77wqx1;KH|h(wSKY+=7t#XWWJbn9|6w2uR;lb*z)5R z<9lWCw0cTorCvqv4Y+NQr8Hm~@p!wI|ADl&(@y=Yljw#Q6yiCfvfwO0HFM$BRXEAU z)gs0FWeb7bAM0Beh#5QX{yDnse&&)>&lG#e1;h=A&~<5X_p4L(mgfYEWf)TZ9~w&s zrHCoR_Yowv@@|9J#DI5JwV z8P2{r75V+d-vob37ZH~4!u0J`7xO3W;I>kFFJ)rr%~$wY7A`vP@>{QPt|GgEw_M4a z%SX|MlJbVrO6ALkLeJP+|K^Q6j<1+)ulMt)$eb+;4PPFJw3S;Oo#K##(`(|8Q`>Ym zD{Qh^dzxdCJzF*5hq8Zn)1hMm-yYf|k$i=t4v9AhoLoI?&)aNB+Zv6c3Eg4aGS-!~ zM~A5Tv;DY18oEI*=>LhcG_mf%2Y2< zYmG25bhcx}&H5c|6mRH<_`pw)SU)6bbFP92+T@weUVj H8!PE*$l;oc(M*Cx(b7 z99bSp04@U^v;Dk_g9*mG0_<;kns78Hr%g!;Uin7 zSI%7Ck2qK}@Z&O4$Pi3oCh;%rTzt>X3nJ9y^ZjV_T;5D< zvOO$`3Y-LG!?PlIK@0Ku$F@_w|G+s>`)GZT^%$&3smuWv=BQ%ay$z74^3NKcHjxq9 zWKEGZt}b3RdKd2@<3Pfa0mBr>vvObV?z}xW!}I16QImXy*RA;yHfuyC2#0=JXqBpf&id{}%Jp4BD%dZc}yOn7Jw! zw`+3YVcimC%T(a%rZ!j$!ur0aVr0X!cHq!cCYH(2>BZIJGSEb9zZqvm;d{k+_3=q)|IQjG)Z{-IY%$f`1``_* z=-W3yqfh@FkYpOT6~5L@FJxiEnzFq^#Kp%5l-1kcH5b@D)lTWsd5FClLSF?`G{5oELWOJ8xN zJFp$m<&T!4RY^;09KwhYBnmPU-0fLu=E#@n|O#LR7AdwjEij7;kbq^v#?j2Tfntq zdnyY7aO_h@ zhpDJIjfK7zRHfrLJC+{_6|za`+&V;$7Qn z7>+jw!0m9idz=gN1yM@n-L^MQ4S^glILlyF`%bD4efMQu=mYd&cB%IZ2+bo;>gsR~(FqAHMA zOaTO1w>*97*U}ddY|pS0`OL5)T^~p)a$AR!w6kfwv1{J|zefSTZVmE6Q4zG>YPQWx zW$L1gFVJPTDY9i27KgjiOHq38+)&2M+=13N1cI>_Cw>lVql{63C?iyWI?E60Fw?I~ zd*~g;`sEC*nS=vfU>V>75i;k1}Qb zIuV@QIVL>VOHnaR87I^WeFW1heGH1L(w^eg9Mq|Tcp>FOL+_E&@T6$Dk~R#=-;F<# zSNB(6*j=QfyR$sLwArW<38o>6?%rFL{n)^#10V2nMP+bbq)6+7Y3lYqiz4+3Mw2@R?w={7uyu`;P$Xnv zE4Is2SB~{{$0UKaGn^cSpU~-3cqe4g<7+I4Cmp@i2+(oB)B^1Pq&^}0h3>g|%1cx* zg1YHDx5gWpQ7V6cLu3WBqyZJom!Hrvt**StJdGtY#Up|QX?-4k$N&)9^KbJn2mciv dh+BNeDH~>rZM ztN|bwyoyknI|BDP*G`+yH+dewSO5Rdi%TT40R-*=k)THy{44MVc(;cS-m)G!00000 LNkvXXu0mjfXeUAK delta 168 zcmV;Z09XHl42KMmF)P7IL_t(|0qxY$X+lvHMA2(VCsve>?8u7JiJ+u`e7Xl*58n68 zT?ghIACtiY^DKc};F32`AQiZt^OF{c!++1Y#}&jAXapYT+@9w=Kl%SNX!JKyzcy-U zL4dPS0!;yvAOn7rAOl_&z@-S4xg+p6=eE=4{Y}0<{Qd72mq@eG0~rF5;2aqESKtNW W)rSe^WeNKL00009LBnd2j&+S zbFaU+{#!Puz>aH7l?*i#Cg;bqaBLCs_?mzA(f{XLr1Etd&oOn@{kMM@|MhcGy7+BQ z9{mXq%40?U?yqNkQup@*1DntbtqBLV`yKh85-z?QB>lnM=g9v*P?-x#9S+%t9;r9`ZobXIV3LD- zBTLY^517988?bCasF`-{J(x@{7t5V9!#>VLO-}&|7;eoyH;wlai#-zBg?-l zE`Oq<6eK(sEOt0_-$L;Jxjr>B;S9wIAHtuBaQte*%uwS5z=CbC!sDeCaOUr}N1E;?<*hOozEuepOn^i+-%1_50^xWr)4? z%RBzhzN7yV8jL@(UH{lWuR970|L-Cn&&PdUCddDKmHz1$?O(y#G?B%MOXY)k*N^?@|89aN zx&z-uKgOT@`wE<_G$tG<7X!u6%^Mewq%rBT2>qA_jFh~_1eL}g8z@+ zxo>LI(8#h2=%nzjANA+|u7bsneK~R>#W`rHjiY$A*RDbjeE=Ng+ik z*_OiLu#HaXN!dAv?0AWlXGvyTW7cf8^KASH=eN#J&wXFl=l*^_-_PfB-Oqg`B*=T6 zmWdVs0PB2xyg~s$172zXsMYW%GPxmEwMz;0_5djTrqckh7US#Xe)N*Y?0aHE%rUdo z9QJ(=f3GLcP?m2WTJL%0kix{|R?rOGAEW(@ui5f)u#VRE&)(f^v?pM#?KM~Cpx^!6 zijq5++}$)=)Buf1|D3X;ZgX>H2EO~_#ZRn@$7fEwp$)Z5iZdqGjHj@M;{+{6Ie-QN ziPAU6W`8#ePQ2ki6{d50mp(t|_qtBfWQB4Mq=JQ@2GbQ2bqZr7D!@|M4)ysVnet==?>Y1C9PH47T-KwdQH`)_VDbej`!Z)?A)v*^gMo;>JMoq#cLPBz{ z5I`7K9OJOTC%4G?i+{I?kAcLe9j^lMTBN>G7ZoV8SuhWMw${%@JKV#XeN~>sEw;Ma zr4!PUUth&I8dZ4Ulaj-12ySjx(y1J9ILsX7i$6k|EG?d|7qGYa?5g<7D;5!k;`xlf z+eF7rkRx3+FP9)=*EfU_?D^UgRF)s*<}#$y;y{vT@*SA1TP3d&;qHUjqt)p$JbxET zgNevrKnuo!(HMt3EU`a}P&KI>pwFKtriy0O+!~qn;1Ue$+?UQ7gBngmK^TWlWL5*0O&2aLW`NFd z%j&k&_FAg+E{AefFe6QE2df{bR7)ZUzx`t2MEanqD7l?^R@58*EmLtWd30IcJNsvx zYjvlUo$zSv1VzS5L25wJZ)j;ItQ~t_m)p+?q4}CR2;?v8za3AGfJLTgXJtzHbwNre zl>X*Wjx%VdvLjK{=42J8YkYDC0(ovu0U4<>;Y4O(#2NyY-R}} z%Wr%LmYwa+80lx3WAQ#D@6tJ0k7R~{t}%6d7J@_#ep&*JS^kQ#8}z1x?W~S?s`_9X z+WyipQ2{&$C1H`VJNlzg~&F(=4XO~S@GQ9QGxHqQcU{!p?Yz}XQqI&ZIG{tA%X zHOu!%PYy>+adnvPKNcL$W+v+@&rOd`a>uef;66KPkzEmOJVgR5m>}qa+1}RUNR%ym zmi=-ooVBEx;;n}^WE*H8Jhg0{7ZUv!T6-jO%>yihmPuAgH{6fIaeXgYfPpc^j4kJ= zZb#HLc|)UG6RbWyy>AyI=jFx%fD}`sfHM>282rva>7=ig)lU4Hu^}^65iBZSW~N6@ zdt6R;p?C17z17rRYZA}L;HqXS$IX_jOj%J~F~f|La_-k^C|1osggsx=X`P-JB~8Pm z>6)CfMIieFi$*FB(J1m87>N~FS%V7`II8>V}GG4UtEPVbCgpJi9E}cBhVu? zYwY_9!DV>=xo+3&a;CZ=-cG68kc$Q{@Pdgt4d|9UNkOpxR$PQ)MsIwm*ifbCV2g~^ z6u2m9vdJR$z5oCK diff --git a/test/fixtures/annotations/non_immediate_add/expected.png b/test/fixtures/annotations/non_immediate_add/expected.png index 30f6f1eb59203bf17630a0c0b7bd6ae69a045348..09f48081a8088406f3a482b6fea2238fcdda653b 100644 GIT binary patch delta 157 zcmV;O0Al}#41x@hF($l8L_t(|0qxYmZNoqmL&0@AOh@V{CCaKGM?V4{13HtQkL5Xj zlOY83DRO~V-avs=;6CR!Ef9x458yAZAf7-Y@I3zO`R*_Ou10?&^=G4o76h}J0SW?> ztN|bwyoyknI|BDP*G`+yH+dewSO5Rdi%TT40R-*=k)THy{44MVc(;cS-m)G!00000 LNkvXXu0mjfXeUAK delta 168 zcmV;Z09XHl42KMmF)P7IL_t(|0qxY$X+lvHMA2(VCsve>?8u7JiJ+u`e7Xl*58n68 zT?ghIACtiY^DKc};F32`AQiZt^OF{c!++1Y#}&jAXapYT+@9w=Kl%SNX!JKyzcy-U zL4dPS0!;yvAOn7rAOl_&z@-S4xg+p6=eE=4{Y}0<{Qd72mq@eG0~rF5;2aqESKtNW W)rSe^WeNKL0000UWG7Vppr2_IWgfV#zJNrlMnRDi+d+)iQ`#AT0&bgO%A_}o~ z_14t@0IWTV3`YZig;})#Y*v{?JmE>of2~Y3A{40acai{r?c~w$LzpZJ`BcKqc&sz9 z2!mD_`V{M62LD6y>R9vxjAc8>#l!0+a(nQ~B(J9XMyP}fVQoCN5LOF$Wo7q@4O0K~ zYH`n{$1(x;@nX>Ru3S`qK% ziCv`(Lq;2Am(-_w({12Z5WjM$Z69>0x8(KU8&R(8xvaOTJm0+?o!CFk!*AEA`?ZtM z-d@jDt7`k&;D23q_s`3>Y#8Y4iZvEOL3?t=c>79n99c< zcm);b@|MTFMWIOpB-a5@DcUrv52x_HXLQO@BAFU zV+-6kkLTJs)v%a3%V4%v>F0Y^M3Jye3VpN-&Gq%8dJ`duNq3(zoP-qTflfSpDRcRE z2_*8k=I&c8mNRaTQp@zDuiR|I6S^)#9LY#v%F8OY3|PIV{Ca3oizT=N*R8S_y%3W2 zG_YVg4JVcJVosU($Vci{og)-8hZ0iS4p@TW8FP)P9xS3xJ{xCJ>~yThG&Zo-uXL^D zD?ISaJCa5YM=pcO;fYgcM+@BF@BAOU4lPl4zE(Xq(v3ugip@3f$uw4LH1#EFVg$i%;QnCr zy=$)UL?UyJtVOQ~a|&E8W;cr*n>5@5TEv9-%z_Q;@CGwC{R<`vKX^t&q>hfJR|yq9 zNfjxTGw19tG3kdgq$*!mi%&U5;-vPnwW%wv43cV~gRJ)!zB2=?yK8#+d7#^-K&J!O zUQkectx8(q09jYKP;d5s9OuWe?k|Ah0rO3%n5yR3khW}two|`vKZyIi`;KJhanego z@@g}=9*!}hgC@@HiJeu^_=)Yi7tyX!hTjn=&*_b5xTV*pUvS$-AloQk2F51p?tJfO zWxP#sa7}h2X0AVW%WF{ga=@*4@cu3iheQ7*wobTySr*9W3-y8%HJAlc_4|o}0^tga zwTwbVwLhCo`#YP>MhqW?Lq9j!ZNi$nw!r9^OLMgBPoeSD&va#Ntfln)RgMK#X5m&o|&Kd~UA(2uH|ENUGLlp9915 z*;E2S<$WHZSjiT3GJ-US(XldY@Tr5F_(pDXJEN_n{V#YHn(~=sZ%>uXAusiYg@rM_ zy}dOG!a}#5c_+}aiX*$BP$;*?|LZ<_A&-i`a)mG}DDs57T@cR5n?(Awv@~4pJ9X7R z3Lk@>Y36AyX+Qd4E!)@Jt(CNr9CHZS+FA8OYN9%;F_yeCt$E7+n=KN!`k*cWcR_o4 zFy-L2bR9om&xJbOvy+dmFv0R=b4r>a7vzyQ&|`p_YCj|WEA23Ec9O4f zd#@EmTo;JN=gv?l6ggCcq~8AXQvUHS<^Si!xww7NrLsrTV!hc`ZhrcJqlcry>qC>S F{RTUJw?F^@ literal 4273 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 F{RTUJw?F^@ literal 4273 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 literal 0 HcmV?d00001