diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 12dba0de5f8e9956cafa8091005c47caafc0d5d5..806d490b354633fcb45347a43d6891e8bcb7d83d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,6 @@ image: java:latest stages: - - tex - assemble - build - javadoc @@ -11,18 +10,6 @@ cache: paths: - .gradle/wrapper - .gradle/caches - -tex: - image: tianon/latex - stage: tex - script: - - cd doc - - pdflatex Architekturbeschreibung.tex - - pdflatex Architekturbeschreibung.tex - - cd .. - artifacts: - paths: - - doc/Architekturbeschreibung.pdf assemble: stage: assemble diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/scoreUI/gameover_victory_main.png b/Ressourcen/Rainmeter-skin/resources/game_data/img/scoreUI/gameover_victory_main.png deleted file mode 100644 index 71b0e4731b330ef5abb50d39cf8f968a98aa1e97..0000000000000000000000000000000000000000 Binary files a/Ressourcen/Rainmeter-skin/resources/game_data/img/scoreUI/gameover_victory_main.png and /dev/null differ diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/buttons/FTL/FTL_JUMP.png b/core/assets/FTL_JUMP.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/buttons/FTL/FTL_JUMP.png rename to core/assets/FTL_JUMP.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/ipad/systemUI/autofire_on.png b/core/assets/autofire_on.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/ipad/systemUI/autofire_on.png rename to core/assets/autofire_on.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/storeUI/store_close_on.png b/core/assets/close_on.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/storeUI/store_close_on.png rename to core/assets/close_on.png diff --git a/core/assets/continue.png b/core/assets/continue.png new file mode 100644 index 0000000000000000000000000000000000000000..cd3c275ecab1abfcb7098cb91d92e7ed4d5a2fbb Binary files /dev/null and b/core/assets/continue.png differ diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/main_menus/continue_on.png b/core/assets/continue_on.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/main_menus/continue_on.png rename to core/assets/continue_on.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/optionsUI/escape_mainmenu_on.png b/core/assets/control/mainmenu.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/optionsUI/escape_mainmenu_on.png rename to core/assets/control/mainmenu.png diff --git a/core/assets/crew/anaerobic.png b/core/assets/crew/anaerobic.png new file mode 100644 index 0000000000000000000000000000000000000000..cd415b12b443f8f2fec9dca8ad4f0b829aa98321 Binary files /dev/null and b/core/assets/crew/anaerobic.png differ diff --git a/core/assets/crew/battle.png b/core/assets/crew/battle.png new file mode 100644 index 0000000000000000000000000000000000000000..056b6a9fed9b7f5e934b26d157d57bfd70dd8d11 Binary files /dev/null and b/core/assets/crew/battle.png differ diff --git a/core/assets/crew/energy.png b/core/assets/crew/energy.png new file mode 100644 index 0000000000000000000000000000000000000000..b831704f2f34f85d3618cf9ce0f8cb25ccb922ae Binary files /dev/null and b/core/assets/crew/energy.png differ diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/people/health_box.png b/core/assets/crew/health_box.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/people/health_box.png rename to core/assets/crew/health_box.png diff --git a/core/assets/desktop.ini b/core/assets/desktop.ini new file mode 100644 index 0000000000000000000000000000000000000000..227ca5f2021ac245666e8e110a2d51da2cccefa6 --- /dev/null +++ b/core/assets/desktop.ini @@ -0,0 +1,7 @@ +[LocalizedFileNames] +autofire_on.png=@autofire_on,0 +store_close_on.png=@store_close_on,0 +top_ship_on.png=@top_ship_on,0 +sell_buy_on.png=@sell_buy_on,0 +continue_on.png=@continue_on,0 +pause.png=@pause,0 diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/combatUI/box_hostiles_boss.png b/core/assets/enemy/box_hostiles_boss.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/combatUI/box_hostiles_boss.png rename to core/assets/enemy/box_hostiles_boss.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/scoreUI/gameover_main.png b/core/assets/escape_options_on.png similarity index 85% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/scoreUI/gameover_main.png rename to core/assets/escape_options_on.png index c807100b2b9874f0824910c8e473e440c5ca5cb7..0bfa5210deecd765d92ea96599f3e44ff36e7e28 100644 Binary files a/Ressourcen/Rainmeter-skin/resources/game_data/img/scoreUI/gameover_main.png and b/core/assets/escape_options_on.png differ diff --git a/core/assets/event/eventbackground.png b/core/assets/event/eventbackground.png new file mode 100644 index 0000000000000000000000000000000000000000..5987152e7279cf6b039934fce26acb7e92faf8f6 Binary files /dev/null and b/core/assets/event/eventbackground.png differ diff --git a/core/assets/gameover/gameover_main.png b/core/assets/gameover/gameover_main.png new file mode 100644 index 0000000000000000000000000000000000000000..6588984e6276ff9c7df5a2ed7bc4077807faca6a Binary files /dev/null and b/core/assets/gameover/gameover_main.png differ diff --git a/core/assets/gameover/victory_background.png b/core/assets/gameover/victory_background.png new file mode 100644 index 0000000000000000000000000000000000000000..cd4d73260fd1656dd5fe921f6fd1e1d172d8659c Binary files /dev/null and b/core/assets/gameover/victory_background.png differ diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/box_weapons_bottom.png b/core/assets/gameuis/box_weapons_bottom.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/box_weapons_bottom.png rename to core/assets/gameuis/box_weapons_bottom.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/statusUI/energy_shield_bar.png b/core/assets/gameuis/energybar.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/statusUI/energy_shield_bar.png rename to core/assets/gameuis/energybar.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/effects/door_highlight.png b/core/assets/gameuis/hull.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/effects/door_highlight.png rename to core/assets/gameuis/hull.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/statusUI/top_shieldsquare1_on.png b/core/assets/gameuis/shield_top.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/statusUI/top_shieldsquare1_on.png rename to core/assets/gameuis/shield_top.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/statusUI/top_hull.png b/core/assets/gameuis/top_hull.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/statusUI/top_hull.png rename to core/assets/gameuis/top_hull.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/statusUI/top_scrap.png b/core/assets/gameuis/top_scrap.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/statusUI/top_scrap.png rename to core/assets/gameuis/top_scrap.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/statusUI/top_shields4_off.png b/core/assets/gameuis/top_shields4_off.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/statusUI/top_shields4_off.png rename to core/assets/gameuis/top_shields4_off.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/optionsUI/escape_continue_on.png b/core/assets/ingame_continue.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/optionsUI/escape_continue_on.png rename to core/assets/ingame_continue.png diff --git a/core/assets/inventory/inventory.png b/core/assets/inventory/inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..e2014923bc2259769fd8e14ba4a5af3dd995fabb Binary files /dev/null and b/core/assets/inventory/inventory.png differ diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/map/dotted_line.png b/core/assets/map/dotted_line.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/map/dotted_line.png rename to core/assets/map/dotted_line.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/map/map_icon_diamond_circle.png b/core/assets/map/map_button.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/map/map_icon_diamond_circle.png rename to core/assets/map/map_button.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/map/map_icon_boss.png b/core/assets/map/map_icon_boss.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/map/map_icon_boss.png rename to core/assets/map/map_icon_boss.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/map/map_icon_ship.png b/core/assets/map/map_icon_ship.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/map/map_icon_ship.png rename to core/assets/map/map_icon_ship.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/box_text_sectors.png b/core/assets/map/map_overlay.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/box_text_sectors.png rename to core/assets/map/map_overlay.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/map/map_overlay.png b/core/assets/map/map_overlay1.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/map/map_overlay.png rename to core/assets/map/map_overlay1.png diff --git a/core/assets/options/audio.png b/core/assets/options/audio.png new file mode 100644 index 0000000000000000000000000000000000000000..c4c2a56c33340c26f98c5c23bc271f9c4c388f1b Binary files /dev/null and b/core/assets/options/audio.png differ diff --git a/core/assets/options/control.png b/core/assets/options/control.png new file mode 100644 index 0000000000000000000000000000000000000000..b653811fbf3d0a30df230578f3a63872f2aee085 Binary files /dev/null and b/core/assets/options/control.png differ diff --git a/core/assets/options/credits.png b/core/assets/options/credits.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d6106edb00e323a6de0d918237592687c899d7 Binary files /dev/null and b/core/assets/options/credits.png differ diff --git a/core/assets/options/escape_audio_on.png b/core/assets/options/escape_audio_on.png new file mode 100644 index 0000000000000000000000000000000000000000..561ecea2f760d5d0666ccc14a77e4622dc498175 Binary files /dev/null and b/core/assets/options/escape_audio_on.png differ diff --git a/core/assets/options/escape_back_on.png b/core/assets/options/escape_back_on.png new file mode 100644 index 0000000000000000000000000000000000000000..6fdbe68ee553e51eceaf6a3f33e5073bb52c693d Binary files /dev/null and b/core/assets/options/escape_back_on.png differ diff --git a/core/assets/options/escape_control_on.png b/core/assets/options/escape_control_on.png new file mode 100644 index 0000000000000000000000000000000000000000..ec48f8183e4e4751851b951bf30845e3f4ff9d4b Binary files /dev/null and b/core/assets/options/escape_control_on.png differ diff --git a/core/assets/options/escape_credits_on.png b/core/assets/options/escape_credits_on.png new file mode 100644 index 0000000000000000000000000000000000000000..23e07bbb29ea7472013e467438c06ce58d8ac361 Binary files /dev/null and b/core/assets/options/escape_credits_on.png differ diff --git a/core/assets/options/escape_enable_on.png b/core/assets/options/escape_enable_on.png new file mode 100644 index 0000000000000000000000000000000000000000..739fd8aa1a3a6d580b9e72a3350136f6e5d7a246 Binary files /dev/null and b/core/assets/options/escape_enable_on.png differ diff --git a/core/assets/options/escape_general_on.png b/core/assets/options/escape_general_on.png new file mode 100644 index 0000000000000000000000000000000000000000..c11ced88690b7db9b2950280278807ac37cd9574 Binary files /dev/null and b/core/assets/options/escape_general_on.png differ diff --git a/core/assets/options/escape_video_on.png b/core/assets/options/escape_video_on.png new file mode 100644 index 0000000000000000000000000000000000000000..d6fd745a855b3b3bdf90bb833a654d239aedc725 Binary files /dev/null and b/core/assets/options/escape_video_on.png differ diff --git a/core/assets/options/escape_window_on.png b/core/assets/options/escape_window_on.png new file mode 100644 index 0000000000000000000000000000000000000000..6b339a04e9ff0d028913d693974d43344142e22a Binary files /dev/null and b/core/assets/options/escape_window_on.png differ diff --git a/core/assets/options/general.png b/core/assets/options/general.png new file mode 100644 index 0000000000000000000000000000000000000000..b7f3ed4998e4ad08237518c3a94f9b251867cdf8 Binary files /dev/null and b/core/assets/options/general.png differ diff --git a/core/assets/options/options.png b/core/assets/options/options.png new file mode 100644 index 0000000000000000000000000000000000000000..760b0a79e2bd8d5cae2e44b6cd870937f0575c70 Binary files /dev/null and b/core/assets/options/options.png differ diff --git a/core/assets/options/pause.JPG b/core/assets/options/pause.JPG new file mode 100644 index 0000000000000000000000000000000000000000..6d45e775222e61742842b5e93c3ec15096c0efad Binary files /dev/null and b/core/assets/options/pause.JPG differ diff --git a/core/assets/options/pause.png b/core/assets/options/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..614d8f3863ccca655e7b818c33e7164b13fbc9d4 Binary files /dev/null and b/core/assets/options/pause.png differ diff --git a/core/assets/options/pdn/escape_back_on.pdn b/core/assets/options/pdn/escape_back_on.pdn new file mode 100644 index 0000000000000000000000000000000000000000..ab1baac0c8a1a56cb6f8cb9b97e9dd5e8b199c6f Binary files /dev/null and b/core/assets/options/pdn/escape_back_on.pdn differ diff --git a/core/assets/options/pdn/escape_button_vorlage.pdn b/core/assets/options/pdn/escape_button_vorlage.pdn new file mode 100644 index 0000000000000000000000000000000000000000..f484769e550c332bb9e28302982105eef762039d Binary files /dev/null and b/core/assets/options/pdn/escape_button_vorlage.pdn differ diff --git a/core/assets/options/pdn/fensterVorlage.pdn b/core/assets/options/pdn/fensterVorlage.pdn new file mode 100644 index 0000000000000000000000000000000000000000..444538c85a932d737355b29f391f7e1722c4766a --- /dev/null +++ b/core/assets/options/pdn/fensterVorlage.pdn @@ -0,0 +1,404 @@ +PDN3<pdnImage width="601" height="471" layers="3" savedWithVersion="4.21.6589.7045"><custom><thumb png="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" /></custom></pdnImage>�������������������NPaintDotNet.Data, Version=4.21.6589.7045, Culture=neutral, PublicKeyToken=null���PaintDotNet.Document��� +isDisposedlayerswidthheight savedWithuserMetadataItems���PaintDotNet.LayerList���System.Version�System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][]���� ���Y����� ��� ������PaintDotNet.LayerList���parentArrayList+_itemsArrayList+_sizeArrayList+_version��PaintDotNet.Document������ ��� ������ ������System.Version���_Major_Minor_Build _Revision���������������������������System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]����System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]���keyvalue ��� +$exif.tag3 +���H<exif id="306" len="20" type="2" value="MjAyMDowNjoxNCAyMjozNzo0MwA=" />��������� +$exif.tag4 ���1<exif id="20752" len="1" type="1" value="AQ==" />��������� +$exif.tag5���5<exif id="20753" len="4" type="4" value="EwsAAA==" />��������� +$exif.tag6���5<exif id="20754" len="4" type="4" value="EwsAAA==" />��������� +$exif.tag7���D<exif id="305" len="17" type="2" value="cGFpbnQubmV0IDQuMC4yMQA=" />��������� +$exif.tag8���/<exif id="296" len="2" type="3" value="AgA=" />��������� +$exif.tag9���7<exif id="282" len="8" type="5" value="SBkBAOgDAAA=" />���������$exif.tag10���7<exif id="283" len="8" type="5" value="SBkBAOgDAAA=" />������ ��� !��� "��� +#���NPaintDotNet.Core, Version=4.21.6589.7045, Culture=neutral, PublicKeyToken=null ���PaintDotNet.BitmapLayer��� +propertiessurfaceLayer+isDisposedLayer+widthLayer+heightLayer+properties���-PaintDotNet.BitmapLayer+BitmapLayerProperties���PaintDotNet.Surface#���!PaintDotNet.Layer+LayerProperties������ $��� %����Y����� &���!��� ��� '��� (����Y����� )���"��� ��� *��� +����Y����� ,���$���-PaintDotNet.BitmapLayer+BitmapLayerProperties���blendOp&PaintDotNet.UserBlendOps+NormalBlendOp������ -���%���PaintDotNet.Surface���widthheightstridescan0���PaintDotNet.MemoryBlock#���#���Y�����d �� .���&���!PaintDotNet.Layer+LayerProperties���nameuserMetadataItemsvisibleisBackgroundopacity blendMode����System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][]PaintDotNet.LayerBlendMode������/���Hintergrund 0�������PaintDotNet.LayerBlendMode���value__��������'���$��� 2���(���%���Y�����d �� 3���)���&���4���Ebene 2 0���������������*���$��� 7���+���%���Y�����d �� 8���,���&���9���Ebene 3 0���������������-���&PaintDotNet.UserBlendOps+NormalBlendOp�������.���PaintDotNet.MemoryBlock���length64 hasParentdeferred��� #���麱������0������������System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]2���-���3���.���麱������7���-���8���.���麱����������������s��������斫I揹G�&6Cgd�w淆�{f"兹K�� +墺 +壄�邯华侁頰9 +[劶鹞/鼑<馞懝�'剕jfj簶趕廌"裡&b扠|《泘Ζ︼_扟*─扟*─扟*─扟*─扟*─拁�鳠�u��6�譵䁖邳镖�m䦶m拘鍭汫m灥yGm拒鎘m举孥m聚�7邳V涳眧夸?惶����0O`纠紒����+榑0蟕玖純���#蘇槦�譐I%昑RI%m浘幅誣=酚婧蛽6/僋�翡轄C爹�6�O埸~�?h髧%�賕�0`^傈€y�� �楪0焋^咙倅� �炭奎攫瑨J*─拁傞�<窥o圮k箴{oc�捋@'巨鎳m~7栊_殆�6焰黸浛 J�8`>兰€�����?0廯>良債���;�0�*─扟*�'暰镦W外{oc岗�;m~t阆����%楛C2蹋0�匇u5谭E�矹*─扟�)�-鳸糗q洴稞ig绛汯䲢揳>厃�8坛隺�-�<,<扟*─烡趻_乷膛6遠鬀m~'荞|y�:逛y鎁榑飫鵹#炭e醂%昑RI%��)�茺摞*?k�7绛婯䲢浛骶[下|�鎋醂%昑RI%津�{m涂>紆硑狳跿慰�6�賉颥_圌鯺醂%昑RI%��郬��7/b�8o漗8諳廲烏�0� +�*─扟*闀N?€_}觫U�卌齮8鉟�濽RI%昑耀殈 窥霔奴^骑灧糾寿$�4|�,鄹M�/.?a�濽RI%昑耀榽l~U8V醁/揷濽RI%昑耀樜僟嶶8炙鎄単昑RI%曯*ン釽/⒂_T繜%_xm8藇�侑硹]茁矹*─扟ン鋀卌巙V瑨J*─捨3�7�*玴鋁単昑RI%晅閁郬д譯�)鏴瘁青-/[鏊愾C疲瓞扟*─拁 +閁醀卌庻cp矹*─扟�1耀寞 +�*肭釾単昑RI%晅栭U鉝�_x湖蟻c�铛�,鎇醂%昑RI%届�*颢卤 +曲�9V醂%昑RI%教舄颢卤 +�:嶶xVI%昑RI/#绞黬[濥⒑鵨绳)r斐哟醗冤瓞扟*─抆鹏*螳W�/庻缢� +�*─扟*閲檁� +|�?o庻Cy謞扟*─捨/绞K繉啐濒鴜r璩椓賌�8o瀠揠护扟*─驥�2縵鳥醁卌�瀠揠护扟*─驥�2縵薾脣朣8柱s,颧錣缃綤*─扟:眶*螳mu�6鵈妪X�>+缪g�2阾�<雫唃齱m�缃綤*─扟:眶S醀卌庻猵,懦�瀠益Km辪蟾蚒�/滣�.─扟*辄襉卂嶶8肢谋销<瓞m菊孀诩哝Y汫缃綤*─扟:眶S醀%楛*鎣濣M郰锓鵤涳殆j洀`m濛�.─扟*辄R醀%楛�2砱}墟Gm~酵揍铕甲wI%昑RI鐥 +�*逛炢u�瞥幅 鹧:秕]RI%昑淫ヂ疛.鋠:�#郰O邳謞扟*─捨/~Ur�//冯铔6x舟缃綤*─扟:縏鳸�%寇墚Н销鸺譿I%龜S粏﨧�}堛X咓篏糖�Xgm~铌�氙鋻_朁澐N*逛i筣W�g�廤`}梊騳g�=�€^勥H��� ��(郤�唓�坻�墟^�'m>勥;秕]r�%梊r�%楛*缋��>鮫莻飤懒 涡鄃鏬飹K.逛扠.逛W9{謺罒濃X餧猀�诀逽x缂隴r�%梊r�%楛*鏿ox(�)伪囝養皊A,G�=麽y谆鋻K.逛扠.鵘瘟?膈罒&丱齵票�;m瀪锟S�}v搋.逛扠.逛扠~晄饍�4皓縋孢鹢T羨>?飠梊r�%梊r�%渴9�7|<�)捅鷐^殆邝>讹楃]飹K.逛扠.逛W9嚫OZ>�9謃2���}煌_紿Y��鷭��~燓駶�饑G�钲囅葵�峡叩�緘�=n鋈��[�顆"=萯�/b塍镗�/飦閝"�革樇mq曹{w厢牤l芙坵8烀,顬亄h燥烕窟g�1琎顆F供紘[譕剩~羊钧漥C(W塞栥r鮷扃懒馨蕰窯 +g祪醫咪蔝u岓�;\#謀拳9-復+!/�-掀莘膑-[霗A� 颗=醽抔� �遰y宰|烮隚蚓c樳籸为c�=4p^辸[让部霐K蟒榠�荵m庂崊叄�g怂泾h靛o刲�p畮[鉈!硐�:�鱳8Wv鱃嶜V銛L嘂;鱩趂�1擓=T8闗焴�3�=钶l}霹+�#躜w 庼G�熴�&腚懩N爕儤桭塤<zx螯�鹷��檩���頍�䝼氆罌�3庻�/沜�袅�鷩w埴?|_锦/町?�漩鷵弌瓱助�6鲮鳅婳锖'w譄��4�s娀雙(玢燐宛籣|"辶�?c牧蟤苌�!笥�>f�#軌�?壔リwq煓8�sl3�,作蒊葃蔆湏澚iy€�$/弍�y<煒騞;N钅他莫�-嗃T钌:�38瘎<V?嘂�(鳈佊驩碈他Xbd�;1��3\GV��9嶅鎝笘`.隍p嶈ro櫢T炂柄}鈗焁竉軍髝�=gt{9顧賻€铭)y燑傛i~-驅=&邘<畕下xD芮枣g]�>�=朔!m/c犊!幩麑鮝�擏壼�=�.帽}q茇a�(�\蘛驑搡斻�纡�g�9卿}f�>肼卨峋@艹[�%想O97N採�$pa^~pZ�3}�,�d駐聃鏾X_G簢瘒;↓|揞鬰薓军鶺_竟7o=�鰋<�{酎?�踊фY/辣灉朿?驾蝾G拉�:龘跸薰緙挣銍W謴级~隐鉱雡灤��錃蹚桤颻v>秔�%别�竽c�yx�赖贂璸��1鱤3䦷u您9�鱖h嬆=埜K緇hK[�;避+ +w倮]S窴斧&�}槜�3獍or鮷0i铳N�q7�dq颇�'荄�欜.吘轙縆肭瑀/嫼欜�2�<Q揩賠∞06蓳錸挧雊�/鱦�箔w淂]N阦陀8W兗�3骬嗦Ry�氕{<:�= y]8\氅妓Yy=c雛�>茎�-qnW鸎7螑�('o踨-yW窏鼬旘臑邴0艡{韭=y橆裃'騶}瓺龘�薎接:gp8n崔3� 侂豾豺鋨圩諳ve+7�恍飤笾�鉙瘳辣灉抍m韽w偫�~袅塠�頬Y岿踺�追o軖�:亅�縴濑D軡鱿垴鐒9箉�2boG軕能�e个�7C&湰鉏�se��#q�wE@鹃pGy€賥�e逹m�68Y做}啿y[n�wS阙熠"�,q�頵襢j+`甠E軄�槇�p敷8噈q稤喚酸Ly{1�6尘N屙�:Z8h氲獿&� 肣熿礨熃�<.'赅pW鳎L�C�5V.鯩,讗�87vq{[蔛�嵺g竲7|{龢qY埢箄果qo爎魈r琥Y崣h菈.w/�#�>�!棑顷棏w}�<�箏�;傻w_�;辩_攚濅m5�4煰玽l坜-诒眫G{n7n媬� �頼梍� �$栊(/�觫糩J迧k�齶媠匂Z縲缡購XY�帍撈韌p禽沓茲沓87�镘>ny圣觚{薅篝g譡畊矄{�?-y笄: 曲�6�酐G峡顽?�鑖� 遺蟛臌胱譝_;X絭iu荫怦揸鴋out椿:<\�彇砜wW�粁�1�/f漏q藧w]鰳��#嵺彐p痫c]?吔氖>f蝤縰資躋Z6息惊較肿�暯鲜纨遭}燏敦87枃^&�q�=鸪妹吽 �8�Y嬚亮律魎躓e�2"nAu紭�3彌�?]M\漓�8済€蹮�騗洉<Wf睥马�\鹢h�%穎�<邌胵m=襯}[绨紊嫎Y臋錴\鹢悋隩鈌1{�2啻假j徤s}质q鑓h胇腨騰y(吁 搘ㄤi�譿{i购~9y瘥~⺳y砽箺2迤草樿鷌y砐n�yy骃葥附-q^�<�5n物缡%芏蚝�7忹鎂邂z壐鉒筰齦y叵�+w椺瑈纏l��/娘.佞Ы�(靍�耸r{�郏.轷 +8熭z8貏搟�j?舍$藚5x跏� +瓝悯痏t动�xs|�l懦€/潚c=n�鵘梭��虞芄}淳zeo m谯澂v�棗斯藡舕5汳W撻$鎅涚筚j��<猛Й)肕в圼v�&n撖叽-�苠Y奫:湳#忄锖~N&鈌刐0o�/洸崳瞹�6ni嶷2癪;�~轻醇XG_O嶽.e�:b�[8)s;��5藶�<'\�.b�p軅齕c殓6n啄蛙�,盁n﹑饼髝踋埦tyN髢尜"�)�<鄿�玟�*{&諧湏\\付8nA脍�&惆Е<腗䦛mqmm@�$'侠!蜀蚵:`格芈-\啭饯�0粞"諳栯q嶜3�;K鹿�.嚷焓澫�<(梡M,;�9魦斍q�8g赚噆敿0� 蛒軌�=n啼5⊥n�\JMpP顦p9嵋r'&N葍�軅鲭|�甀鋛湜搈��W頰蠊3耻0鱨\鐃�<巏�7�+皈�93》鈠�1倁弥>�9�)蝧7駅,鵏�93譮膷C袤0?霓4泩5f鉬 �%瑱�=8泎�63�1纆€讄域浛呗�|)穰m8值玑�.�窛_麌躷w漙换xq譹DhO哟c:j垡磎k︘壳╕U鮤5▎1Wm�旄橠\}Z� 鋩1�(�*斍p嵗峎鯋�2�nh鄦�OvuB�n(qM膷畄?s副ls0�;)n"谲嶓mq刳氛�&y年Y�&紟C_端脩�磗�X�0罬E[溙�/莢蘰阖�&f膓y�� (�pF�.锹�囼Μ靟傮檖嵗杀楧,/;艒d�<墋齐伤vuk&2'u湊<&?�=�8瀍=&C��dN&i乖O|l讕习a髄毴鋝(螣 �&創隞秴骧稗W爍#径�>椗瑶e蓅m`{�5�*鰭�7a遆{庈肂饧fu兘髂q�3宝�r剆{泵褁�e榻]颣劔 銶6岣<謜�2�\^栗�=� +}湾�.�#螐�8�YQ^Ec�5帊霪_G峔|65o殓zr龹魃tO鍆H� }6e廒7鰘�3藕Z勥^2���N琦噌犷甑他穾��/><Y�鮛藉�n郮�辴mK庻巴熶銩y箅{�?恼沅鋚}|糽yg貞/罍珷M韝WM血�畍z等�寎勒]8Xo~綜淞��鉷晵稢��<–_鉽R軃鉽ぜ*'锎��/帽肰m�:黹~镾�%8^n樴喖久5拒⊙�72pC1稏<lsO醞�司罾�6+y87T竈7木駇閰俱秆p"陟d鰙�<瞩膃�愓昨�0��敥qX赌刹#n嗨谋懈8�9螑�8览�$o挻贂�0诧7壐*帘rY[狿&3隂 沜M姥涪<]�g促聁�+;琲�5.斖闤譪聟u9L��-q27嬁忩臧7s躊辕�j?��X>巐㭎蜪=�.�"蹾鰅侰^$�沓l桨�7趫}&�y蠾�8縁頶=�帳<h胉$靓n愢H�$皋愴驻�4庼耡�*�增A2. +泅y>�鱡�7Y淾嘦姟�5笳\婥:燏髠�飚老閸粭诛>咕慊脒�臾<��x佣階�?哆倔縴婳__葵鲺踺;讞.砉籄o縥魈{甗箏S黑q'�#]?�9p劻(罽湇8Q�荧Z^O摄砣柅浣H�怶iy呈袜�<槪廴兙顕踮嵆y�_幱銘p籷^炴lY湌箳7 +�q�+巗"�龅糰篎:� 刳� 7喟飆oBN禀8羡5吴姂�辒s蜀閝#鈇憑fp纪瀧2h鄲{觯杵冰氈=V乖杽纐>.暗鏋末�-�+阱j�(9%譿眫J鐀蝿\{离h鑊窝簍2鐋劤��咨锐r| �5N枦rT锡X賾4漨裓帚g饹D鉇U0盀�9瓑�+蛘歴ΠG瘕)珽畇�晄芞�?b狔脆綼� +幖a朱宩濏鄔`���{盅�z蟮鮷镛p�~麤{�馩OL�|)穰m8膫囷铧<錡洋_M鱺�薷~磫�8侀藤逷'鷏凝旐辖腐赘灺�=�噕洫鯋锽讓Ξ�釜"鮽*伙骅8戠�; +僦�4Yf鍌L/�1螴敆��0沺�-q8&�F�%8C^?虄畍老ho媟c縺紤1[碬寚�:MX蟐镗s阢苏镶l琝迬t家髾x塴莡諒s,泪贚諫禱5n�胡/畇]?k]謈绒嫄gEn捹�鳜y;&BW �钿鰞蕽示�-0諳�枪"捎0萪9俜�<哘绌瀜湁脍~M鰹Z�{p時a熼Sy8酒U|<x箟�茌� N婼<配q�鰻Zs|�3q{&� N跕k�1裨簰{-;�砣宻$刘鋆J淜X~柾嶝窠�:?駓5疂�+l� 蠚M�/拮琻�<^遫y�镞\�蝮鬃葵臌�駨)��x诱-9纸6ㄥ;鹆嚎~鰦;敕焅_�;.�鰓[幷纟r5镶:堻%�萇p尅稂赣�鰨Z�?缻営崭櫣�4^n��3贚� 茼蟎喕螼|谷o】g覧洍|L��Gpw;wWO({4嶍q��鼃5m錗'嬚概�c锉笩B;&A�+奏€橮荌悋<说磐S/�d孆4r芩櫈夌P冶拒嗸1�'闓cmq錰t+俦铚蘵Q砀盁#V咕�S卽腻e筨5妔柏N\[鐛z5�_�訩蓽G<���苚湮T距€0苨梣炩膨G\;�眫苯j贪浸,丽浉7�7�6弪p㑳�8枆�τ)�8遶緒Gz䦛您p鮯kC霪鎄豝>�5�T韵~>垓4W堸熳{礞釉� �7詾Q吔恋#��8痯] 物Ca亊v8�+\螿颒︾2q,�;骄玍�婝tm菑竊葹侟�'蛆画F鑭騧�8� �)N鵍y�W[弼j鍿懥�%庴n鵗瘥T藶炄c:0踅H送偕访iy某�鏧�~墉9聁赌聩伎⑼>炫让腲鍨g� E�镎W]换o�VW^;Z萁}神潖[摅蚖oC媍}x佣氕6刊鍇窍窥馔跤鱪絬倥g�陛宀蛖.羡� �>贩�6襰擸X�S窡�=~6捄玣b咽燀F櫪e +嘿飝^�$�=�-W簌�>卤€Y秗椝}'麨� �8�B� w肘'h痮鼂关w僬u铖赖�?=/冞�w�.�贏軌髵壂;蕸@;傤�=译7過�6丼r�叵�>倊[F締0煦巤"?��4b�#��y刊I锇g亂�c谥菛楉莐�1揺杷Il籭� �:揠�-\�<鱩�/畭砝2k誢�%燈茌藚z 髋s{媲�_�€琥� ``la尅<w�'�y尵_擌�&寜o/�胂伺駌s呁�:n実n~�<u驨�� 酋C�顚讯鷢�鋶x炓�菂s�眯�(+��窎邡a違{愀U磭Lb洤&7'�;嬻忷愭�0戳qTf雛g-�苸虲齛_耠w楁≯fqOp鮧� �7橈#7嶬桮醱@葌}祧移�7 +鉣躇7蚀钱 溫s漹R輬�.菨"�$mY荟`鈜�?級�-磵t�:�E^挄讚~�赑6�<v� +怜熶\1枊糏暙龍仿彐闣1^w!諵鉌T.饳]V时釾�9Rg8V2[w萐�%n濃辜迄ns瑇6� +注蹮芗У曜艽臔瑖U耨殃颔#g藌邡明!F�脒⺷�鳵郙踦�+鸗所沖?Z鲮uc粑濄蹂K{钶鉨�9筑蘖j7�劝�,€g號Q瞎6�=WB迋� �阞磸里�.V{粐a燆�8r'千两t鲧昌]Э苸繂鼘�[唥i蚂貫�:钤柿独�8^6�驙-�-�=p.息�,C賸鴖�=�'骽O�"騡o�(蕠蝠湅u�>_菂藶O-"�dy�4\� 鏱篮䴖�N筽�FY#g_樑6S[�z莳|Zsw醓頲?�6闫w�9*��!蕞8y�.领%�8辆cmnf�眓P疵穝�&r.祖y�'䦃��y�(餘毀�廋�9澵餼� se?r�l剌敳s+;璺i�9 s垤藵卾}旆ě噥辆� n揎苢鞧>腋vOg槐�<_躸�yh{tr冾睁�讴C�#蚪�'鮟囹 �o癁岂�榏穨v�99牼薼梺邕B葰劰狯惱垩铋暝藤韤�鲓眐嬶k鋽幩蝪�渌偩厡銩;`熈=��y�;o5�椖惩x�<衴毒苴瘫葹匉3O冦66囧6[孰耈 �,7r脖畮Yp�.瀿�2跤�?躊科╛G瓤恨g]乇q內sm^*q�(�悃毌媨�0q?旜i~o3駁X�<饋}w铄k嚡I皚�.�.^<t~YOwn:沷畀 庻4穰+[r�7埸灃笸作��忸毛霌鹈趗馺�3谿`踳賟ò�:[N�#慶9;忋Y薶焷浆 鐋�5y~g�9��P�.隍鰒愎忂鱣s�]哥1蝺��)薇p?旭d�杜碣�,孔y蝩@� 淤'孳�縲鑠S芲&h�簢鼅?讻��q攼传.8徍苒肍仹`{�瀇鋝迗e揽鱘[觯~%賱�m掛N&祯菿�>X炞e瀱<媍嘅陎W徭N�鑟潞O鎞糛相鴅?,"л]q臼绱鋁尤�嬻y0�hKD98竿欺I戎埗J�#�?羳輢3k摖矍�d[ |�$�5a�o銤F['跒\{X蝓4 +� +鍛M捨Pxт�,b&萂�9品�4� (/蝘hG嘞蜆x揶醞�=浺\�;^儈c�>{芴赓�9��1軓�.難週噼珽韕8頰抽2幆?{霧郐鏧K�鋴QO��N#s9爔W�9-�!w理XRel轃緝蘩哦礼7NY泧*Wr�:S頵頓8洓瘀謭郾9東7痲Jr6脝%赱�;(уm迄籅�mI阜V�=憹}#毕%繃菅8K炵W�&帩飭#�� 髙ㄉ諧�G[I郮颃e鲧櫭脷�{蜒疡犋鑘u� +嗑餣�~跽[莦/穰觩瑹i9_軾?�e}銌�'t褙f蠗繤2'� 铐hGi:废g�苁澐'髕6%蹏唢�&6 { 拶� +}7�)N莟�$頺忱蛗賖S利吹Y鎩師C竣�巜Bh珮N楫掛_睨佝�$陯�?颗]U�+ v炆攍OM3%{砈�<�韄葍芯颱櫷雷e�%屳勞享s褑5[凭鍁&逪|�墅o}縆:xuc煜pN醁l3鏾�嚮N碤票c6O遷抑剕䦷�m[:��#赸裦歧蘒O�=#=鏵腤c_恺8�茺"_mf� 软杈9=qE�b_aG灮$�-掰?呀��6�.椼(�谔�錆某9_湵u罟軅q,�!@~凍f郮�Z+髉�賽�慰1�"q�n左8rG�j謂<{��9穈�n迡{r�)刍&c矡I睹h�sp禅袴ジ1� 燷炦yj龎z6+,睴C\€<龓餧礓p挲5荤妟q櫥�,甮醞�3霫t4藤蟡褞a囼闐炴v噠gq1}扣崼�眖堺呸卜峵��(�>v�弇∵s騱 坩潲C+}渖�5琎X+ �3Ⅶ砲��5F雽顊p龑��{歪罳吮絆譂穗'弌�羊煰~ir瑹潚c絘q�/縺鲃奋{聸7�kw�%�'{� +粐C䦂秢�;��x�,鈐鍝龁QO雏4绯亀 褴H鼸e#蠁觝3娋 铡b�?昙f飈�C� 嫔<s_篒��O豗=捱{%� 甥�:�#哦�揆峆�稳�鷨�怿=潍�}侨縞萳/ㄣ餘鵩吹膕�,诏P逩_}~X弲惧鲊鑻彂{抧熐;5./纬0. 语�'�=d鋕�/微徹"�/?gь蟟�B]莤�w寇6}玟�莙XG斔莝2�;]mo�7A?摑e鳒=�%�糭G顐g囬m~d{壊Я騡巨柁U����熓龔踜� 紟革&v�縲瀴駧{娟K櫱ql�=戺?蛓釽h科鼍�密B�2紵烴掔/�8q�<C �J齕浫棸N瀋韶�呓硚喧撯3M屫芠糄^愓�8N腳�<畛嵓N帏= 民窇Vl(;瀶醟痯架x忁擌-O�犡U:V紬泠�装籟�€墦惧坰�`铰蕈茟bj皒S� �$釿�?觲�<N�W兿Y�mx羪.雎醖Ev鯀X/駥4�踪揶��廤o紐e�霃[庻�/咛q�7~(曲獬浑鳠聎so吆妇燹�9;栫0>tn螂嫴{3笛棔(d�锝#�;t~�冿��粷�3j|,邸陣�5g騒熜劾Y魦�>租N冺魅M駗 蕋�2褔J�5翥1�7W鞚f厈#脫w桴P誓{弜�t烦O偗囼瑰���g埣捽i 1鷼syC|�)跙�g�>Q夰兽\猁A�.栟:庛Er鼺?颛1莪窕*^?z+G颮�馷eG寰踉帺x+惥_樒7粃輆&oケ|�璁咱�xU軗勖鴞 z鸅>邳顟�!|d蒋」腻L�>酏輬髺蘅k�桀{随w豖/�骢擄Jh縦F魋铥甙窳笷w�3�;笧鵻憻昭�篶OtР%$:6`礜F讚2^冊熝>霵郮 父OT笂菤R馯.bi淺�7蠎]8屵$cY馗頧� �瀐貗蔨��>鳄仉r� 亳 b跓鳱u�-5窉m�(�瑶8f|C烇<咔鼼�渲'橪�/|/魑鞬�'彲�?鳅�/�83庻彗w��馐zk雓W/畮�薀椘a鞿�1>T尛PS_r漊亸趷偌F讨]慎�2> +梘培抔2纳7E�飍躘珬P.?媃镱龥0f�㱮儎熑;r齭廯碷�+瑹鮒銘d蹃馢鷴O鄗塷鋆蘟g€暙攥!怎鉾籍9�� S畘窍鲉鍆儓袚懔鯘坰戉t墶�%�葮E�>�-g_�+霔玖D^镊�4nA*下苫穦�+硵k�7厄瑨�ql奕s瀖涐g!疦� 6針齎�2�襵YI,,訯戙Ob�铥K� 庉�]V弭澀?-闛�土x層n=+q�!O茊层\聛,>蓌惱in�8斔)湈s猚\a邷G謦f臣(�8�7诓畦煣}獄�.徾*尺┅�2�怿剘穋[熬5�:傻8庼乧6絝}孚皅�4匊篬'请�?ro_?3��-弡;p,抚苓�倷匪叧慯�� +砮�皏�戏\^?慓:co虢�恘鍈.c…k显�簍惮_朿E浄,�!�毄郬;鉀�$//�!�躒^�+╚@^Ky齌^oK芏蚋乃篱84垴尻�迮7M埕�碡F瀨_�2鍗畸疧珑礤u嘭红j熕b嶗�/T縨�%>K帍Ky綄<}煐rYyF财杝k?噻<�8i�坂鷌筕�)奢m捷;螿溍鋚�灹1?"蝧凝f菧色)V庑曕*y飄Y窤_�?<G1p峄,>.潖_c[舾�[沛�(�.嶴騿0钌鶰b�<齰Q阖^舨蕉�槥�幬件;曫m纼兣赕嵜酰W輜�莩錢巙绮�+[汒~N韈~N仰<抩陸;�I埴-r珍琘��� ��9谀查湬8p銶a隣苇}|�#祥xgb菢澃=&彖;q?J�&y.伶庆馗>�1u偶砟獽[/Wo�1劵銾鎧>[y�-(砠G辊柛(莑钱�柤?D�&芏��V7尴8棴>□駛尻�譌拒Q褐瑀$徢试磔V^清�1my蓻鵇縻i�Fo裄滛螋泘媙y的%-畮矬艄L薈��"粵摳:�%髷舑esY麉�8 N臤镶饧脜�d�-�逈雠\穋5恗婜�g赚\3{�亮嵡阏|u泮亄膑劣涬/>=c庻�-Wx绲朿畺火謔��-丝霘舺P碐Q,'z瘍>狳� �7鏦軛偳~�>M>蠼�>蚑芄r�~煁�<蒅WT�3]q姽C綫hGX|<映濭汼�|灚硹囹,艸叔�;Lj泸v幪锫鯁濢GN廥镐回掐柮i�.8e�/妍�<g�?叛^鮾翝鈁%�3"酌 稴:顐Q?聁潪�7�w猡^Gr轛�c{3淐嗣rwD�畳c!捃g笌Y�筥鱁;靀DzN椴U繚額傻冦�.&暓u潊�!q朗膓N�%锎复�Rn'諴ё毩7qK9`確鮮盤鍤�(痓盕s颡O膥廫lX杀lNT+\摿ン庪)镶Xu�7vp1緙6蓛蒂�勤k9值脅(�>y邆�,8鶱弳锜:峯]绪}溞�哏穹�沒V騧枏u蘡鄾z弙(鋉 �$g锷f鈓諘尥�7L9輰b蚅桧�2溎穡臐(н!M1劤xX虄��N鸄X8紦孢僚�!�慿9埚€p暵q�6縪�8宥8单洠掿萱�筶哜铲粴mp贔檾玪1羸vJ�.Ns�}颶泗傧坌3w{槌uj控{!繈觱皇惽馆P然爌hф\G煺琠红q�蕏赯7i味�>誒t剕柷懏K鋓䴗菴潪r�g隢鬠&NT�8� 藵�顷鎙衈骪保庾缥m{]�&孰洛l{埑m�蜇>悥玞琄#靿Cz专韕�<戅碣�q/#鏉弴�:.�1.墂 Nr,膇y&�2錂膻曱嘜晓�|纠麟霏K雼!蛮嗎輽��'嗃l�7偾`澓7�>6綾&[旀白M迫宾c<孻與s�;jg~2McH�騵�1�)均欠}�1F=�;o'腯封5�G泚騷e麱貑C梡%K炨[毴闲圻,y旖!揺酓賹G擻�6�竆秞澤e �&1g昅景�7us俦Qv坡!&鍝竘7�8頚膓�亖譟湕s螻溾籠镫稯�扂W�8iC诟災�\z,鵝�48;芹蹍藂;K瀩譭怂駁~遡s6i,�8簭Y�齌疓髩79摋r1m�#滀�y]\琯荓祒乍缅8騫�愬NL份毟娕慦}�梭1)rk謲齚$辒Zw}\?]8疚�.眧�\f皅蕠炈SvL網杌翯辣呜腚`莚雟郮K釾笩;P徺�;餧1}�邘髈誥L寘卶⑴7t埝镭务�2懨-]躉�)€��沚Ls|G吴 鵻慃乧砬X_�鉘b霱郬.R坈€鳎蠅7巪譵?i}哏q抔 湣�8/A毵篛泗:�:2囯+�*O&��n骋q�H�8-垆�9滄�).釣мzq瞟q9嶼7I遆U鉹\6莥+嬊n鋼n滃矆豌x}鬁w~猶6烲苢愇E�茳� /潖贶`豥9o�8ZS┩3]騿珊昨4/F蕞錷渡�8鈇t�!b> }鸖螊弪鱾&鱠糞钦�x颥.窡�8u椛m�幺j豯悘+n讔所糏渆C�(腉@洏�T�&嶀gP筋 Cw\荱 +g睇橼蹲欈'祯貥�~g:櫖珦汫?娤;霓倃厁Wx � +椓希C靹鈑�)禟寳T�#荁尦c峤]埖(薹鱹|� =�8�('�+麈縊攉�<(鴊�8�?润癳萎釾� _尩庍Z岏7�隓|?I�懦呮� 縍�'駨H|im滅�5�R拗吤� +焪夁 逩仿5э蒐顧� l滃C杙T�3謔吻玩博N#郎悴谖dq賈腒融叢躶摦O筶7�嬀塡睦压�0扺i湸褛8m芪污)鱮撍獇_蒏鶳铚<�骸宋唆C7珏8抖�6FB琴湝�=屉/=><>搸]e耒$芔0枊竱l(躅P�9癱y(K芁%\#p躓!塹曥 d_→5'mJ踛貫醇J韰x_�巺}↓Yg秛傦踱躪Xw.辁Q霙�s讲qZfナ鎘m则汏|�:v�巶消嶕? +呛鎎��=g铌�6� 瞒zG斍EN腸T餢鼅戔K6焱!臯@;讇�,�3勥/�,'勉鴽?顭秭櫋宔阷�7�;膲栏窅蘷炃`瘃祱'梓^榻瞞桮帟� 8.懬鼺核M|3錰}d妨欜N渗�&頸恸��f箤+恸因4Т8o�Y�8颰軗梜鸗�棑莤v漲訫8y7hsc媨Z躕箪轻泎C�3>筿巤2>欪㧐鋟qY^�-q墚鰞q谄�n{y9溨漖1﹛y誧�3�:�Чx�K稍��8膨瞞螊�&[?�隢�(墮氣$�1巿隡飴鰕v橆yz嶉u﹃@8�.柉澻�9N�+S\�-g茯洐嫃ur髉}�辦毵?痪�;?�?峙跖�=籥:躏瘘7M欨&N%c蔢ⅲU6nVM躤8毉饹�#瀑h瓘V<N(�7芅畤.с颇Xe78_惽埿�0m;;[rо嚫g縦鈕蘎滝TY\jJ逘K麽H9V�As� W4錂滘%�,N�鬯骻e�'TqT�苰'黆Rn譣�9慄娝B'�8O贡摧掰#鹠"/隶v洗�4��%B7櫦荻輾禶�&{ +躟`鐳峉m祊墠W胴扌普殠 ャiΩ4蕤腎焼溂�侪攠K�,&晭[暠� ;rE椘翏窺鴡 颻+�5�晰>�瞉审]簙R\�.咗�0諒=絥m煪5К齜+\瞺F钲峘�:<\:o]Z亏畹鮣熫>3�鲪竜閈YC躍�1糠w{��z偙蒀\嶶U檟蠆嬇u霬:>c9k徫洖雽匪恽煇8+\蚦樯6�笟讵菧客�9m鶅v�4鐞竕兗an詠玀y漹�(徃�!疦q 棬7迅'瞦)咨梜鮇鱗da镪膑O�〒稇珑]谇溑;%o纤3薝c枙放9 ;棾赣�+N�6l�8T礤�6�+Rh�薀+侗Ky黛驺h�糏摄0孙;x稅壮錳o\�5廔暰q愀:釸��+嘽|梑蓃汬�k� o圅iZ�4/朵q芾翾P蜔y釣逊曒]妦�8V8修E鉛�9纐�&�?g� g隧�椨ペ^羚�5]醫up竝� +锝yiw?}v胩8厝繴v�掊5匚.憝v椸菐>搌插�3伕gOm葉>戍酥�<许_婗袽�)t灑Ч鱐g�$8>弻5晫y矕�嚍g�5因rg鷾<m嬨�7砱�|#;J只�5ql紿曐X朐芉�砗�n'瘦 +嘰戾囹埭鉑qpr+荕N吮R渕蟠q涗Y}�9譏П3l焚r闇博~�Gc憠冃珘c l~b�珂@稩瀶;讁�<=n覻真ki焧狒~&�*}�6q歸︙畴宭酕孚�8蒩寀裞�噑@q,赪4糠8柧洃更�檘$t箿c]o9諿o^<s�62皶輠胍lg�禱梯�%q姹慖OG8秪%9U'}�,羸g﹟�#'3篑duIp�'�8�'%6钮哒愿躿蹙H徼靍餝�9笖�恠�0.撰�:Wm~鬅{o壐凷婓湇遇酦�8[o錗苋勒掃鮠椒蝮湒楑泮F�RyV<傯檽wA�3猞鎙矇濳膝|兢鶮狙Oy币KL^'Lp蓣寓�2躣O錣6OK^7蠋\瑑隓yx眅塑�?�8隙c蒢8尶袓肵S[�7PlUk傘,3$鞘菒豽lO呺�噝趎7�修窍)OL}戸辢s,薔X�?韗站⑾F�眆頬!俦腱� +?{杛,� 兒圜�-瀉賻�({b渌e净镉漺Z钉砘i咖彶呜�3鴇V^�枣煉W鍄V&鱀�罟-.�G|挴漷lRY)?礞材s~�猥2_埲�,.洷岶軚隌鉘�.弢]"G%梧获A審崹搰{S奡�&�-�'y�-�t緄U�\w廨櫪)袔侒m斜�5?悼訏枦鏱柇Z骫�还�5脞vB^�芿{t镌少�爌R髯膗�C*wu�8雫7�且蹉�n组�7消�+f*讧读�#螐櫿�v银鮙糥茋R>T=鐘敲J�槌e曨=�=pe�=�7m柷��эf確�>_P錴瑊�肭鎄K鳟邢壘錥蔿竪s�+較角�>Nz磭騬搤V�*U[�>丸P�=)]焀�.U8ec岔[涖l荙蝯沰q钀SY�;y'y]腢柤韈M椴7岽mT諳��<6�-焙�.蹍蹊續搳鳔>質7=/�5ㄟ卞p袤W74q浵s鰖�6�.彌咠� ?M8翻oA烇︱l净摯q唦韐泇逕X騜C蟤敆贠1鋽;i�W�R:諸撬锑L汬O臖e淢豈楳屒呤輈诒U3笟钦瞝q描荖8鸮糟P'掞|\gJW篚煖-�.d�庌镏T秴�橽甮鉿[sk 铉€c粱B�&4鳫澋�;r,鸠� ⺋頬�<乇唫焁<G�"n�嵆~'吅!臮赊捑S牭舟P稾糥篥Ny�<N飶�;�NsT+惟貤�J镧:|葦骏鹚浜EqT揝2�=�b�萫q嵆=>�儚詬嗉i葚� 幩豘.�%.�=?M8ネ;脪�)?暅Wr�76�傮6T?!Ws�岌т盪吴澺釸N炪�撠d映捴ai�7�吴母:}�+銏N熼`膶噏O5p避�枪�1串�1硉竲讙琼呠,浔篩�<�臯韲�滓9�/鋤藂艾/棛[籎譎Y閅豘珪�熐鎧dk鞽>v醚阶诛縲鉒縒i吮�,xWx閤啭糃]}?'0~~�9T铄p;9迲据碿p"�苌匹飄鈣l晓V$諱芊髍C鹟{宦i��g紺�烦q�?囅#i份屻黜溏薮弇賯�7�=鸏+�7汇[酭^ы薰8镖�$謹鈉QWep9魂]S�;诲cRE洭謸�'�Rp&�4暑腎.cZ��$q#�'6叩睽� 飸3芷饣).鮧肮�c崼\N蟯鉘龞貙扯[真mp莳鶜��2v誜䴗閞+栨yUz*O雖阰a拤橨c3鋗狎Wk坨b蘴.�(S貟宺眒#�;追釼齺湔声嵳�ёVM譋<僨�z=�靝噩f畅�+庻0|K缢舷巆�8\]吖u卞X{羚萸┆耎虞m迬呠哪)巈谂�6%xyg��礝�.椶勒L蕈77妺U�(7猬x 5鉨仟3隔蘡�Z久遁钆cp章枮鈘洛笣鰅寸€精袦掻僙�5q�愻]m�6女释c^n2緶� 螞:l�"莣o瞝蔡甴騈�G籄�&ylg蜮蘿鯥R.份鼨%驋vd迆X�哒炷m莣O彸m�堠|覙廙qt繆恠�$N阂記实p�祈)W錠)�X茩4?�1硢l辢焁墪8黇←朜Mc愞�变貄Уf� ;蠣く鋂U遦h\芜囥�篡�鷆2�町鹎郮_~聱鱋諳^]�>9v⺋`K兓B=萍緰-朻噤8*.�8懜腙�09=梡�<嗡�т甯]纵c�;m[\鲚�騌__[渐暡<遣笜銷扰�W6w�穳f�B^[咴彐r3>h鲁-辬尛惙蒇�.q裣N\�Rw�==螯搋倍en湎乷慕��3籓�8鶠��,钚Y毙�9譜揼玺K鬢/盥苯涆c婆�-�1q<�铙竄昃O墟��6竄蹽"/栵Rt|煖絏莇魘7酰鄿赦艤嬪�3碼4l鞘�1QSj跧祗�%O�78\F讒oB_踳鱳�,縒鳸郮�\q癖棲閘阬j0~0.�#K�`v示�/捌;廀@辳X|斘涇�/c臆瓦洡鏦埙U畕#濇鑋銓vt仕枷z8冿j渪桥鲠椺惜痢.茍甄%�5b觤浙戨-颰8緰曃1q�脈吁柄y�7愶謗6c�r}�8湥�-7#忬b>稒r鮔X1:�"+忢褖莓c,4�2眄�?ke荴l=f]�欺@誢n帆艉0笜浔[�2;�#镢,庱岾�暖j溜鶛铴瑇hq倔盚� 詛I5f柇荽�&�?�唨逇株籗�W椀#owm晀荡_燂u媖T键鞖�8戅蟴�;μ|賹�;︻5碔^萎1╖�5�鈉佅鸜s,癱}豶,鄐甬lh�)�)?v擇l5m驢|Gr)� �}家|+r}oW鹽姵 +嘽l檷�'趷q膪E汤癐o厸0櫷V8o渺雰k�$眱[}蠭q僎2&hH蜝L諱骲崼O儖\v糕眷I� +圏9�kC侠�<〕#oO濂8K烇;�5寊勪Y8y衞朌櫋\7_礋l眭V郡m蒯醌FQ閳顁Q鏗莨 '�=坰}�9{ �銄й坝!弍>�產�CjC忴$醠瀫鷝X司�:乃#�澺涓�8�鸏棋錺i撺cN`W[}Ls€�)坓S��>变)�%吡暹轖\匜糨气懐e��n1㑇撳葖$.鍀辑┘<雾韆>壖夭蒹瀋a|�8綽J蠈�>ユ亯�父熣c捎{�谜3噑|詒琁吮 >謥鉞�军3碿介矢�9中�晶<睡c疻筣T~嚳I嬶B嬶�0滯�攱??汑�#�/硄邖苚Q�牧w碧&|k縚=逧暨礊�<嬤捌zG舡l_珐lw,w嗣瞲瓇u6銲裶涷J蜯G|鼏G鼨廙妺�8秏授缈惩�q諼~:$Y詵钥� +cc铥]rY部廵;8GU錤8婖6t玻<�-薐什鏆樧蓽斿夥�5�8z跥X幱笮饭a�%畊�?藂撨曇<遽麾#&舻�~r#�k谙�&疏%応f陕絓磥鉹��蟯S_蚝勄`[鸻<*S1)项_�'惆7棚糣窸鹹3mu{!|銜磴<��苡�觸rgU?W鵻q雵{5酕俢i遅廔9菂k靫Y�;9��窍挿)井疟:y"鉞9\b吠鹕奈j�?�;k孜1�?;�鶛1灩�`z仫i^WV�#0鰂6瘓G効�>啉oWj庘�*洗靯┳;K阗藩G庍���⺋鸾�/縳闾8织炯讝q;醁~餂偿鉟�'`咴�X?^�選灓y�/釧箴]鐸該�翌3巆膂�3�.W撋"闟_�/綺 ?浵vW�囼怿�5葜烬�蒬钿�7gm[珞荻龐�茡厯~>涰翰�-蔃幵剒C唎id'�4蘋(蕚X�塯N_浥�4r� 穎0a,苼c饧畤�/帵傘a�鰿瀓崏媲ǔ\n|�蟎\_Iy$姿謡V�1瘘凶C�?gf舃硝�8�;鱣E.蓇o臅A�籭溸X>F��?G�-脩煣~揿:y8~�8W︻�轀rsuy"�8W捧卽錁懫徂鋋褂謌徭�≦骮X�%?錱湅bOe鮯{&�5ob溅桮燠蟾��~骁璯W~�0vtF蛮瑋�.o芎_�1耥甹恭c;�囥0�労a燄���5��: 莣毽9*斸�8�?`竞窭?gq幒�c巑餭婕�,]�廛�y蟹鸪:飙Po萤咣PoB齭<戵6理瘌�=}�:2y揄q画鶟(f玉�47馏鏱9儈�9;V恼h�3�piL規rK鵢o嬝�;A皤I3嶜w�38W嵒�#弓`謽�槂~廼铢醯$\袡8庼�蘥籕菐�>us鯓�?H矬s#灐p�耒�&鹬Q[媳n�<Z?yt}龐忣沢票�霟x;�+幤n�.�下�>}冸t镔8堘�渑�谶兊:]嚎柞$�~� 銌� 鲀舃邖咃麎/+渻aPoE8淼蟀_,�/p焽�s胹5��犸 胇5v"�/�'牡i�剗8羠癸yA�z.t�跸掱5�l畮Cy�澬眦;\�聕鳅��-傤k錼[&��U噛秕圭揦� ,儚w鼹輬A]9蜱圷8�0.0vP啱雙"�&耆竴�葺╗�<瘐陆�敫s光$實�?咻=tsyrF�惓\竬€}吋�%Y�,�1(叭砬l>{?龁sn/驓i浈]鰁洧|�,�<_�%銧硾澑W霞~�e丐�-蠴€媫7揷�*r醃�9轛3媑)�x逇鄖k蠞y条耫"蟕8桺椸箓�0鵜%�辨�?�<l麔踡�m�q\�,�-j�"�1餶`箋噫*8遯/2�:s�9�#筹拀襰韎k�/�/-�)鏾� �/渂H5=�%穹趶ゞ釸?�鉱泀C咾箻�'��笍�苆嗑g毌i>�9陔困鼄� +k�钳塿 +睇2幖譢\玸刊题~�'鯣伢鼁�z嬠&卸A~员S�苶畽夣儃儧氤媨&员A�寉薻 v那簘脞鷿'7��/餄曲�倾芑9�<堓�u遦邹r铛謕湎嶃梢髩扒`?牣骁)�-駕%g縩<莏�菓恮鄼鳔 r棻_绺�x 鼔u鲍讵資靀灈玄�9蚰�?孔�1�燅簔鎥�$8啬�2�?�蜦桷妖ㄏ�<8%鏧��>泦�}尪6?卿����8f銋T�4f懐耱Om&�潭★狘�O"�膙@y豁簊簍昵水噝-�7鸺硐2^W【厡6绬聱*墀甥4�B庤鯆烱ぇ�>趺箣�m槥;a瀇G灥`灻€<触莝C杏拈�>e浲剄,l徆54彾C磌@^,鱟盠铱嬂准>E-�6m~婓缘鵶ho湫ㄗ竩\�顗胲椏m災ax儆0.4Wq疕9�"谕�}縪忓cYq�絹} 慊粀棹巊j~& 灴濉^qkzFu妚闝�'A黴邖r"旂鱑鈱xn坓Bu婷�/B{|��亠dO€>佭~u�=S�7o婡N鮢泪>(� +楳8濭呁D�瘥鎐Ma9?懈眻�)bM鮡G黱�汄皫<螞惽闒5肐酷*�'鋪�L穆�'�; +鵺i�?糦泴ka;a鲭q閤嶺哓指�熤|姛1&l耚�9�:m/�;x蟼鰅屋摮枃鮠|孓紫聼夵距�QCr<灨�忳W辜�'霃?庻謾r,鄎�\]C�埻�欕O潜蛮覠g� 譼帮X騪�'鉞r瑝�x��:鳇&戡ニc6�飶楌�5�&t熑�/��f驱薯絹cA�'l钹炩股2谛�=l纟蕏紙{�6g腼�鼄桀aw� k韑5kK锹久緣⺌�8Fp�)濆懗y圩"陧餷?�;溹鸕{迊堺耔'3�=n-眺赓頁�'騪�戡&pT凑!�"^达駰`'wL�委鼀;p� �甠�伪�=s)赣湳媝支s�"r8冕玢孙檖彛�<w脈夁{#O�9P�;a�蠜忱%哸 燤S踒哸|�岝b網8緃婩�髣圹�� s婜v�4馬:繝鞺餬| 笑'l穢產6鋴缺渕/摊乜乢!縔.鲄輰箪i8w`{q韭y ��诜悋h(<扢y9d瘁郴m錅脉呺wB�甆l^媦3]琀o蝺帰秗[<韽d瘓闼lx��\粓扊ボ痳糕q韚�*鏎?J�蹒x�/*釭�)猹-pu#2曀q�/D薲湈�*帿s蛞X\簙<琢�鲃M埮詮6唵��h逿肺剗�&柹鷰��褞屙馧m4.咏3蕥z栞!硢糍E潄缙 �u&連粞櫠琰抨遗輺c襟鯩gc嫵�+�幥两漤[穷[:换�6呔eX玹烡娵纾=bH�w缗顁�?�D]峠篩鑛鋂ǹ鴀/顕�?N�"飰w槨熝幷z勵螛灊蕍牠鮎濑i琊"栯鱖�3�+鶶LY蜼粯�'~^ +f矪泹�5鋄6b準稥�?屆:�<侖P伊腯α�4av徳邨� 鼴革睹�=吴疚铵�唋rd�;踿艋鳊(黶痤 �w\bm謍悯呻H{橥8仿\qv6︼缌>鉿v�0WC逧��p靻dO�;s鋊衞€�6�尵nl峐炬^椨��;懎 y幒k_�6g溷瀲�>1�3nD鯾欆邆x1鶸Y腛=�+?s驳鍢�靇�1聓峢g��q步镱斛笼1筄sT綸 烪﨨S�G簦S鱺旬癏旎�3稐�缬悕'荮邴<鵵Xo*歼k�bw缆邭垦濑�5鏥鞃��*�5興�8�N加H筀�31粫銪苹顏匔[欮^慤駒Yv,�7e�诺voR莺 _T騩ⅷ彚_,稢%|`奇<镾糅埣`8e�4��3�?Gt!�媥g.馕{�/觷聘;謆<缥鞬�'彲�?鳅讼衔琮珫縸翎mW匚甛>Z靸� 规<騖罨}訡邚凶�G}磲莭嫷�‘#鶷︙8纯孆﹋h? ��"銂斏齨箯8髤嵌p?Y嶙靼i溆旂璩跦n庽0杨��-G輮z1煺浠<}沁z悷7z.щ'}︾�9鮇鷡C2掕�婵x_聏冻O戊�遳醆A遯庀h+$%氢铯�=)�銶~�6楘z'oi猶溗豾Q縁?i�=帘鴾徬�?��5苖伏涕鎉WOg鉉�1厉佊竛齷�(罱騦まS墙mmh�'�&鞭栂7鱋"髊傘隮�'+VG魄瘔&檣芟D鳢鐙诏p"p�9'$蝍��+�2诹�.渍閇C厠s肭�J�譕E颯imLE{=�傓栢溾�鱬~棗[g钢87Hb 鬸罳斑x,琹�*鍆�kJ漠2|胐,k鶀2� �峏欬.2缢舚�-浦Xe歔�:pX?QG屃侂7r��鬄劬GA珧鱽Z�!'嚯'緔嶛j*�)�蜛W胬�/}O$莴8弉Wx|捶俹>~xm謃渁|,� e箭鷯庄]关r瑌wW冗b ?T票_臚€~Tg+g��嗑 9y酚q礊"G�頢J紏p╛S9猸j�7%臡吘娑� �?{C>`驋7鶴徰[#潋吟葓5袟铹搘n飩��餷完'�欩m�飊骞瀤6莪0��叵x�€�緸鑎屒A恞8G}⒅2謔h�8�沁撸N�>a1f懚邸筙斲�1 慕瓝5�&?� 猅'騱脊�壝�;y�妳厀JU-q=茝�L诳<>€鎄鼛脷{z\�涚D鵼覌v�&頤趲m舽堧暦U�镎C喏r>)p钥f烼|烉>Q�'呩黩か沴焾�+ 騫8哔6^B椖�v�!Lc挦1�锈6.籎}#�鵘趋b[鸉�.瀑磵K|'獥赗sc嚇x[3�眝蠃M�#{揠竲#6ы�(杗央冯\�>镳瑻郮顩绪�镦3�&寸X'-呛�8终+谦�緎堕�?&驕Q奀[�1⑼堐 9鬣欅\$Vc曳顖O窸緄�1�9�-軜徕� ewG� 谪餷 愕隈PI鲜o旿縋㧐腤�G湇鵚�7+溘>]f貄M郯禡�=+椛K妆�;贳zN汊唩K蜺=]?騙g�3��.F�V3N摡� 炄bC聍a歝�8樬ND��9栨I<O��2H鲵J謲�7L8V[5阛�'楹褙錬巷s麁宮璹<N璟�6X錜蘐� iV輜勶硆sm郼V�86o$qd畠辈熵U缚錻.�3笁疟,c艢倊�s孲麼窨l<疛駾画楎5团鴛E灔�(疟�1B妃�F飃��8k漶溾瞤d冹彬0明k巆懋n�<t1H燓禚O顪]滣线pv,wWx鞯鯐讕V{{晃7陶�館愸#�;1\荀摻唜囥耊n令鯃窛 +薳"}�"嚈�囲Yv�:�莝V穣鹧戺昔^_a泾ヾ蠐砼髇氀瓻襁筺6頚蘋Rc�$贑氞W,馯-q��:FYI=S\砡泗螮洏�蠆w&dr炄礤">焭邤�!W実豸 詟鵛坮5N鹉a'xgh罚抃戂��<v&袜$風縊スn忥q}�/� j逴洎;姖珦;%K;�'{茎C蘖藭{~�)y'曌H巈|_Q础g嗣sY蜉)� 蛪D欌籌M诳�8湛主f:鴦鮉�� '饧sS|�荁N$b鶾穹vT層\L�� 珅層4>|�;1>櫫Y邟埋謐W甠�R縞愿瀂#WI\瞺3騦.奇`婊q\烏mLW�乇€c蚛�鋁锝{m'废餥:o�8荁幷導颃<鷁�%'A?s灊?rx肋鈣翥Vv%z3怇泷嬹逻oo愣"�瘄�<敟節�9蕊$'媜�虏ㄌ呁�?@瞐廂@體0b�3�殍犒賁鋥�鷗熎鮴r囅0掃4褩eFYe)熫刱l\諐胹初M�楌�拶翇S.�忢蕾�,螡脥6庖綥藮�4/蟘棼�.荗湗硉7e�?祊窸[|卒� ?M鐮妲V{斻B�隳锾暪c査熟�<6鈒勊s1K烎w瞤� �搸]e菤�堞疵x�!cRa�)0奍js6�氵}禼W’X魤7竂鋕 侵鲹 +勤囝2&嗀冑�LXo�苢�y摾眪煙纺窠肸泮]兊�5焺鲿缺帑�咱蔽巆}{.)膲各骢貂k棞?�/b�'Wx扁镞燄=<綼�9D�1麥盼浹;d孧噔 刋/a6撺弗鴁!糭姕lb藙8瀇粱挲鏛菤婏�'#畣�c┭,糢eqrx�4伹M�7崛�,聚寅щ\k鈱sw頛料抵緁�椟薽$鼮熾恣垤躜5u蒜6裎炘 y靨黅駠箽絎$:�Gv&a+3p捛r圹搦�<6僈鴌gsN>&6徴躩進yf枱f8靎njq�f3囧q⒛ZR杠�$捕纈姜鐍€抷樖奬啄u隩9n宑饔豒躰鏴蓸T:�璫籮框>蔜&�'竄恻轠�8婟愮�<vi7b鏮j'r��楪鉁琿|.U甆鏫v}ús隨p拔5淸珧茇4c涥鑘�8|K琮�7謃湣?膎x鲶鬃O呋訓w簿y闶犋璋��=T�=/Z`躄x[咛剗蜀п$�'�Eot�-||畚靀>飭8�=4p#o監�&K�`G鬗帘&抍駱}1郈�)苩� q+|5�樷� 9苆聵炗kk颗鞦�阄巊窠�8磁切F熯.勌眍�l�%�*�Er,}纰9�nt�;�8蚷}祝镱M瀐}觺K\Ъ豓)/�蓽У�.~毝U*跘蔯峰�6畲Y樃椓c險NW +y夶孺壁W:{旟B8n蹎洔2#�'y蓖�,\輥K鬳.肣霍e"oK湈/氂暡 4Ox<R娧櫀暶�:#�1溟篿溎/�&塹e喟/骆柠噔厦]b7渥Yщ啄夔U蜎搟捾~犠%墅A胱聚p\u卮:x�:8\� 鑳�?xzs鏶潜~悯轡�轢票嶼~癨i?o団衖巺v�)鉞癞0r琁�5僸�#� �銢�9{{G釠${懬`LJ鋂hg��>齐� +c�锹鸆棏住瑇煾�r鲻]�.^w�� 藄眱梤_洎郮�1f�(c糞�c顒6a�b瑆& GHl镩髹汞讴�>`傥.60p�=.鬓嚳紸\勼雿笊�妺鯀荚贰R}3�8[篻衏A8�9惲 yT7軻M<枟墌U|�笋X=煍�8y;k澣�乔c涾#etH莡熸篢窇泄錀k骕>G-頻�8/6p躒,�%巸翂w\�;揗9C牽罺蘴犞玣� +枪嫸K2%g8fSo�溾-�屵oc箚吘 +\濷�8u噟~墯c�"n4ЪYo阬灻�3�!徬�8OM�*9r8=o餗瑄n詜咄_�&鬱�:責痭\踳⺋<奖c7汫隣>~cworw厳WG�-煓噊_剬S蠲腷X9�5C燷嚽�<餧�&.6t郬h�(蟬嶸{醄罎媪巻鲿惥K倂� 莙洒+凄湵匾 +7漙糶�瘏�&�.倩B=�;9幍{韌�/N� 锹{I极屵�髠髣狢wn岂�G��硋瑘3具猟iP晤d釺襴FyNみ#eq寃娓Sgj沚侠i螙o�2}抪董鋓~Z浉�>� +楇锓2宮啬c~赎c�磷寃鸲<鍆c褙�8朦$�p\"�'q聉猯院�9滜鏌py[q偝羿镭+�(速'鼞2綷扰0媟5'f6澯鈒?竊镌g彏+k+吾g猥.p�%鲬釾锚夞铂s櫈v殭�4$N� 棡I縯泗茏ss?恋酲啳龸V鹻痴醌-莦胍鳟�y�氙决�+剋厀锛秪眚憢�0泍哽9�%醱x軈w€荹�<坑2�-披捐雾M亀鑟蒟覃馵苭怵;柜滑>r+恬户媂?攨螋鳈枸敉澌尵脙>?}s.綜呢�蟃烳;�&崜{據8oSb{榽f鈐翬�鉨r�3蘖g鯠嫵q�#郦uX�#粔�慜 +~蕏嚴骞樹Ё� 8�&迚~礬^�Hg�?M遼K溦'鵺� �2贎}鬢鋌6N骃嶀c淹臩畲g�\<閾羒竫炢膣穿 h+而.譍詗]加纸Vl澢Ym荽鵟8� I\-'�'緁Y胯厚鳾z犄�9制I花皾fl鲋輧�苵 n�v璼珿帇晒熋颪窼l徟釞 粟鹺5筢�8vnD� u浾揶|u黻搡逈棞消Yr鶘{W岬醐[浊躯钜鵦X�蠘-惴觘L)婂筃鋋箬拊咃從鱽�-~c(~邅抠遾@~B呃A1簑鋛梓d硦谉s1搧跉�-d��[姴镸�4� 赃犫6v腾荈邇嘶+蹬o扩窲GvZ聐yC咾�1y蠅踢痈Jeg厨槎8詗懛i~氌1蘽眲O︾B媤&簄@o�-[Q�撞nyF\搪 {g耤j嚭疀On�F轞案S�3m�&~荷f穳w犒鴑�9陰珯p琺l慧騈>Fk� 6熫�;w醆o鄵z�'�p�q}�;�?啚隱炁琿碛鴚沁J鉰�6凼鎄洣�蝃俚My�*租b遣诬挸i.杛瑡毵餅-曲蝮鬃�?介鉂藜y�><趗~�躴滒头x/坥 鵺砐\R薃|�8d�W�\鳰n-撱疔I阎勶��%Y橅8С鐗"䱷耰� N餙.Wbu;紁铊鹍mC巜飼叄豍鷊/唊6啻弍顫杠埯竀枉�酶g'N馲沧踥=RN^宷�<褠椶p�6镲S渦?″%>@黒o�葆8醍4{g#頋抴j;&o+3�9唛埋絯図�=謜�m驣K彞<焰1&硲w鯮[溕;>櫛賗灨)屡le熫薅�<q$b4豰&� 幷]盞眓鑿.ygm鈢熶砦3媳y�.� 烡灅禎�=△{琪袧�$壋�=抺韕WI鏟�'%��y=v�濎-L燐镙妣w厼c羃a吮�:{;膼�2厉肫鮾趿堋M�瞧}譫纩$�1婗怇@贎R_D吗o甯飲DС咂韭a橺&�}僉猬onp�|�0敉K瀅�y!覫(藢槨插h^€鹡-讎霜靌,B哔麱�-'K�嘬温%準(W鹼乎Po塖�3釢殶2箌軾o啠<f腙鉂2㱮?蛁S=.)庌.廥糣c蜇�怬l�#*�vc鍆<晴k?'徬k#Q女b铩�8蛈c跪瑎鹢怙Ⅸ淅夂贻&绉=鎤�k[l马zJ"畠雛緰�∥Jl鱻釖7袋Kql僌陿T馤�9[隙﹫7侊�}8L/税M�:f~孓Q啶��}�5?Iqrv,�;锴迾v,蠇淄鈮P'羞 �c瓩�$慓�=%��5R颥礵�+8�:q柱r瓮諡%消紡'阏|u}捱籷︼ +!��9>e铒兺i�8�1丿瓯\肫緺�4庒wH�额h朵L濕�4无&7苾雽|�)哇嚜暖示`龗磥�$箇饧熰唕遀{鹽腻mC辇�垳rg吓`鍂垱q凼S糮名{蝫%苮鱫�J� ro愺鲍哺,魇疴jKygr簻嵳恎裼�?o獗9绂姀W寒<賤噞H:6�<落cM戭v��5鎡蔭汇舖卌鶼瑂膇叫7�u臭3獯�9遫喻劑x]�3<q6S湱�9~[诋浽Mqb塖e*螇�)j鋌聗Dz�NZ竀]晒櫆E往社|z.�*臲<准XK穷7n爍磜蓉╈\痯会鹄莕€鳻�驦�~濙S票缼屣 +'慶嵚鳟5缧\!�: +'颬觚都C圽W�囯O�/&��<i{斳庯-t.斑杖3S峜蝥诧z�<面欂wwRn椼摎冲yl�6(�N繘O姵re罂竜┙讓#e裼�[摕�3�oCN胵�情环�.`�=�5�:擤鱄 唔踾z.逦J蟭餝㏒�W�=�9捰錳櫓}+�Ly綤篊b蚋阎�</N9qN氍�3耏�&鮥幟Zz穂炘捷8^O�;�x�雾堶R櫄_�弁y撴敿4N觥���4畺碐吻k�>�忕df封{s越�:� +颒簈榻Kz?yx燥]8�6籶t?邉~�+紆r磣羿妺弖�1H�螨鱪�芑�^e/椸�=夈哞黒閿葷羗E誁獒N6ew贗m疑]~Or虢岞鞲爌)荍锓S�#硖]蓑I甚�鉨漒G�!P焞茐穪侵K焥霯畠c梧0岋涔SW[k褀]~+莞`荓普垍晊斷嶿眖檓韸匛�3逦 渴�獠喏阫{g芕軛卑r\\sl枪bv~j辤�3惂p}諉膅で鉉In跀仕膠�伟錺滧.闖eg歪次襷-監8揷玟� 巎鑃�6瓀+矇髈躃蘼鴯鈆倹簿颓ぺ噡h坂H媞Ui滀蘺滀}�:�,l晦O鶟穣镏q'凑yU銓y-x漸^甯腾▆凍5y v,鋁'7廫咬颹_儹�,9厥=负緘r季x肩8�鈃�2}e膙"析﹡牝g�6諟幫殁�縒镆宝乡:6�v$?蘸x囬Orq拥硉莡�&台媴餌洛8栺纳舵鴇�;嶑绎猑晫#a阋�楦r渳>羊靪4鉠}羗父/q剖rl�r6`泈�)锾澟:�f帩懬�/渲蹬'�6�?匐T�*穳c簖瞬O�>�ы鶿ф阁&馧銃捳�6抓巕ロ蒪圎C繌0/�#�m韹!銍�8Q7庪┴U n淇1堶泒评u|[�%�?G泐萙K;銼C|H�?弩Z鈐!Os籑窤.嵙e�06_雤礆挺鉀蠴哮浶_庻8p#報4u|闘~z8忶賰�'4珊彗嶃�$�圩5舵g嶹垓F賡lr�愥�肝硙m霴71鍀囔x候=�>哇;榦ㄑ釪N摄}b賆d煂c6� 邕邌识N靱僢��;S�&9V�'-��1史K鷯[2糘剗鎄埶pg�篑k\ㄚi���9UX�焐 w顜q€鹽6蜲鋠岆瞍�<煬d;槥Iy应wuN餘梤1崳篩邟桠内vj踲S~プ譆楮.瞵9Am�鏦)'栵s}Lk熤〓4瘺幙暼腭楾止C舏1�.煑u�9熷蝄'尹汄錢琨\巨嚹顾郮櫧�访p:��G珡� 甬鄘卲o?{v隠�>�%oA靻氓髖嚭鸶�黧�$.���������﹋�������慕Y揮潜剁k_摈^���g'q�,墹xt憭矽��隘|�_t飌鼗喬|sǖv僱}孹漖sU>晻�5魶箕黸龜�催0�$�"{+__w噙洩\曪P鼎 �9]�r�镏3r旂z=姣)GiEr儢#�"7问穯舭l檫程J騇�U;o@n�f9瘸�<WUnンM}Ge愦猏Io蛓�vu柟 +颐z^≤Z遥駫隯�$9n鐢骞\煞�*[M嬩j]zh棓'鬻歁瘺载篂eS}┊R向匙�%囥:昅鋔z\�U讜詠郅梫粋v�:H�>]涤摸�>谰E9鼠5瓹N窏峨d靊=_灰迕v{鞪8鑋欥弭@.陣(杰WX惈k啹C向�彂╨詆鼐a沑P嚝�'�"谆:汹阚M瓢Bp齧矶聉Bu樤鴘rvl6潇^箕箶鐮阘酥梱XuT[n0rロ�:孶棿胧u0r6_珻O�鷽tU-k454� 箄]OI縖9?v�唓ㄆ跄韷癔俏鬕~�;鰓蠟=簕疋殚�/�:餄o濥���瘥��銖顼丑魑>塍骺�/蹩�踹L掿珑�翥�/N遼跷槊螻~}份msYh璓煨o�鋨f宔9�b�0=�恛{-萹瀾\镥l\秛�+�.郚萕�=沚�_]&囼漨薂�:焇袞U鱃y簗-O{*弓0J颧>=蛽昈讙&� �+s,篖�$曆� H�$�r裙J畫鍚ah}斌如y咕�/駏棠$鐧蜕y簿�6霈€妓涼0k蠛嬠 �?�8�宋帀a�輆驞ND6礬塏.鎢菈锐^萷G暮M發珷l-苆3I犒集粍濖貙欒堤N��/_��:En�埍Zu�#&騟�:怽\囌:鍰失�*煬跫Tkr対�+宛e~職6'扶\滗f謩�澶l耎}eg艼俭諜本�'0譄xq玾C撇:脐^プV�]妑(+:[鷚6絕�-蜘敄誱�>5�%:U速糁6=薲笧;铄桒�7m▁��!�蔈Lq盝k轩瞡%Y脇[蚔M�4镋,il�!+獀�9�6険W�苽珞8l&=`�!hC沢(敪%a4陓鳜廇鎎h撝醳傢熘 �舝癪Az毘错映k�ぇ睱癗�6�(�%9藇枬�r歶�<疞zhc@絝� |嫘萻鋓鵇l��vⅢXG才z[籴矞b睒u苆媜�盢憢Y焓鹊X� +竛�U]g+藆�"坡齅<�7~<萝�=椻,榳"6猬��吾W�;#7虞躐pf櫛峻驖喻z�趔�?c療渵糜w_縶zYk粉毡3懘荭炜悵杌FE�5胊朿暽�%囬统X(讈\愮飖�清哽�*�戡P�9瓹弓�3栠蕬瓮6划谮cazh窊驝#譇Z}冏�)g藷謂э�,q漞帅l�4g珫�芒\p嗈檤-O錹瑹帷坰盷Dn;撧v>-蘷樝俗�M⑾�9凍殦C�%k坜鲞噱Z{塡T>前8�洧驀c谠WX讖}厦;Gi憕6�5諷骄�:襯�瓚腦dB&^譻�$#,6�囉^#轖鏠恎鉁i出�� 脢碰W我X広別杓巩蔘=昞��?眿亇3S苡JY途曟s痚�0鏎Q氀Z塌a�:B痏SCl娼灈6=kOH�抠祛nn巜o�脲囅O遼鮪>荎鬚岝廮>;�澗接G�<�>还埏w�.h7Y誽C銢�鴊�+sJ赒藋啽秼5浈鎖唉a�-VHeq椹5s�鲫U飴�.Y.缃Q尜q7偷蕖鼒y癕jz禡勁"9戱,�.�>k舍Z�齁裏趌汌�ⅡQZ祡1="輳|煓睛曭t� 棼伥"y"(6烄湝C赃�7独 垓1#铠觱B�1捗 � u<銁7T]T~� 觡�苶呷脶鴒芷鮁貮F閣脝v枯鋁范莬谑鸕謒�;笻&(_┇颷阓踝(mI?鐃z芏鮳Fh氡褈A9eLY^觢舺兜栣=颈�(絓珙8h綬~緺sG[>)箲�#虔E9睇B⺁"� 澶灒)�>薈9矅 c俅抅D蜼S?LS]熗榁s8慑5f�旕砈骲sNg迟柞~莍�0�&'砏2{%珐焃�喋:帶询G"砈s)1竹xX螻_�胂?|x蠠>c龔|y�>>3蛀^>?%Z*C*四u鼙娟w嘹縜F慷阺妒/绱粉�9�鳑诊敠Z髗跋�柖湾N闉縬茜叻纝汄妿K查�9韁噑鵹腔蓊鷾帧魎铒旝炲R9Rν炞�$撘D6B.b齒階韹|b儆秹^鹷�嘉�畅�7UW�髧:D\酋<�{*j肤I驋� uケ斱-乍腱�.礩觑躓礝粻l糘贚Ic�磏I�n麁��;�#晀毷窤}G飇贗f�瑡�呺錩謰儦?X�LYJ鷘�1.uN�<藰凓講洋薻m役j<u�/=碐歘�騖�跘]�<<r]羌6�橀G諡c(隢n帅 N�<雝Q�$��[冱坃轧勻鉸'u刂窬璫炛� 艵jW挘5屩=削搡p皿G浦�G�;J鸐�諪筰�5`jr暤脬~亿 +K{冉ギ椈7枡�-r訍�6g蚕�&~Jn{S�熍r沊�'箥撁|鸈筂悶貒臆�>鋨 龅��+噵幪�婆刽�4&訜逮懱�<v秠L晗%蒴�<撇c0轳Z螆��=捹#9M垤忰浕<;}篚{~xy/�=c�貂檫觔�:3�蠠茌躙熺荞頿瀢倾s�_�-g3� 皚��7P唌E`獻騣^強蝳穏}懽t敩 �S_�7�<砍>憅@粲x(尌鮁�#�3逸n铳綧�;g�-鱹Y{褿\栦J~屣間�!_�懈�5�$諊�8d皛� G耎绲愼S�`円&ロX扶�/軺(e聗氆庤*_X踓嫳R齋洡g庥瑊��?蚭�/馞^踜ye綏10W�>?躣佟��3`蒜R攮実讧Q3徽z詑I隠$成弘Q77u\褆*k�5�#J桻� 褿磫Lv�雌Lu異�%}和騁N3鈨碝纨P莋鼺G8媸诟鍇�J�=蕇/蒢{l$s紐溮撴Dj穄濄粲{杊o曐7乡#s抢隚鵳 1胴笗鷷��3磳ヨ寧�.Zo垕dR�c矼�烕�X�f隦齰u潳磆蠿●杁畂炣]_?)�*牒浭oe湨t劃��揠>� 鮗硚耉芖〒5貸��櫝R+g}1哵8��婴� +稔绍襯� g埈�>銆u鮮_严襷K冦K突j□�9◣1砳N鎢h腕 ��\脵`R:4辢M#=Oc2�x>>瘊Ik旆`>�>j7绮�膈雔曲鲭鱋?验奎盍肟�螳觃~�8烱&癲莦t撽y�;炿z}^讕嚊簬攜枠冔侚魡鸼W�)s �钞�轇?泻抲~鷞赺亠PtK謁d粋})陈钊s[煳鸟麥F^W*阊厝u�3kズ&猳Yd尌﨤y%�$+鸊�<d![Qb1玼�"甦齌黯R7=蝘碥鐀X關翥&�:釹j�銰鉷�YG鄄N講Ldg醋Y;�拖牒谡=魎]噖导G鎺 �&钫i濺倨Zb�9V�*c缂i町�悜�H﹁癎蘋�尼T適参愴嗹f翨;睄旨欕��#�!挥κ%滸kPf�:�;‐癗婍T樢趖諥繆硌踑嘠l#y疪蹌踓�=B酳�m�>Π�#荴�7!筣椚愒.馁y41镯ㄝh� _�鄄窝紵犬= c腰僦z襔v8�r18炏⒔9颷朕yà�冄丒G铍Z鳫�1`-顑壕娡t霞烌O泊~戫焨鐲\�)?Z^埗,>K縕�{<邜粭鷡 �?\|抌}鬐g��蝢鱒譺棌}ヰ>灪�7箓籰+壯 g傗飁鉿(辊�O苪皉\稜廭鰗v|a?扢凈肟 觎5纹薯e�:驗>脲輵�?欸4�(輂M嬳a缸枘N脅礆裳X菅�6蘕积�2煮臃�<<c呖8鐝N_}閮灋�>{攠�蓭u址诅佃X鏤娅湖搈囮囂Ek紡_挘4h JkF�$Z粓雱矰n$&'孡睉s#躢%[eJ箧央鵒険斋甇i鞩诒h-$鯥?还y=�閣w额�怪d╩H;岷緡5骷萰d烳�8L竛_Y泯N貢�6lK玬GL栚�1铩�p毨朏{`n唣鶅襶蚗�h�!>埚^賓p^熶�榬�€X愳�$G�F霻x即+鱃弹fV躛%θ�?瓿蝩=kC鰃�v3役�&籮婨�$�(sQ渱`�$蝉撞緦串駓鍲螉堥7曎坊N睸蟒鯿ynb�"惠囤湀Qh嶎�-�艼2�Vl6byA6訲�<r�;h�&�"1,瓏槛蘳缋v,>��瞅k櫕庺�卺硁幫y焖渶yD鷍偣<VY'窯$�"^C{�;=c崟蒌紗蕱栖誮T�)F�1 ,嬇1za,臡�2甐 9孖暪畄7愇韾芒z[^頤蕟犊溝{灡Ff,蝼Ag�2VY笥X�) �/7�6\�屬脱�?眥)��%�鞊A鏮`w�弃鹛X遀苲瘸�笥O?�雼3c�橛浭X嚞椨y醽mH谞觨�1w狅E瘬熇戺莌?V{"赾U滰:�;`氹�;€g摳彄3M駜泙q授~胾;鍛�0�劚�埚幝€�3▽�詼Б�麧衂k鵥'堠�*嬔槩r沿W齜X咊pje彊鄉l劵濚{Z騟裧n葂�E�dn1g�啥�69鬍聕耢� :`碧滴dw$6|衈@�(弑騽搢�}傜€�;氏.:み啟掣昧�ZA鸪贈<宗舯鲑娢�gg絧=r顂葞卾B;趋|V竡鹖颂x飥鬈[`瑍3VeX赪丫涼錮譑銘�4鶗s�?X^菐彉v�%䎬搶tZ靋I蜓�';昏��禟+w錖a卤粊3lXwq�暩佥?亇O�({ +寷亴q�森.a,窼7撽捀Z�1萲�.f侃W鋃绷\L褾�4cy硨厀c摅x _碿盏囨.�1w0.�&�''�?@c瑢#北)╱{Z溘K2��隮眂皩醴�?=龂賻曭|栁 +ヵl@球Z�$�?%�;TY鰏a蹎�’儨c牊館}杩杺O|僾\~$v~廾搊痈�:犸塷苬k��<呭链�yC浭~/6衦.絪韥�0c�诜禆sSl>饹�;_hw艞9匌[jy溙迫Lh兞sso8哝/緆喉r~�-盹"汥u檥e?� 梶Qm絧瑦岞y�>UX擜&.�;�淅逮F鯻5V7�嚜m蓭M`鷸谖灟S�KB蓓�V$?Z騇P2`縟熋蚟�磸a;p?L襣T.+v� �33蔬黃逊埴呕{粷鯵~$f淥;瀘膌荛篮⒔嬫,�;羥}9�飺鹭浜T脾3Om球6+讑麎綣M畚E1�$骤╔,帡蕆-�疀媇JoM愶z籰鴾M9RLzb1�#単�|V�>梴癪m�鱷�>傥:庯:梁屉藾w蘶姟x]嗷铆;钰x�6�=g跚�>�~`燋�銚�呖葁_緗泗譀O颺�8�NQ暼墄絢�$麥 ?篮寁s髁�5甫数3果蘸乲璉町�}锴址氡�朚榍嶘櫼赋鮀&猁aF�!冑麠� 鏞�>鰶礕�;n.螿�曠╱4帿舺�(嚋d�伊~+焠�v��-圂寤鯛镥N箭蒡邓朔e/暢湁�;�嬘挚N蓫⺪忼桨屯:暮b寡層^姒尛蜐�-餴蕽$惓s訉U宊矢�0嚌楏k嬺'7蔽滠�v緦豽��诌]但eJN|繚镅L棘嬪z鉐��1樨U-'壙`吖a�5腁舩Y`c煭a洎銢v暶|尞灴钦鳌灒瘦O=�ukk﨓�\弎鞝灂麥z缄9舋邙q企狼邓� +弴zi嶢歝7<(c}|Od燋�>z篝鯷项�>y�蒄�;{窎韸壋z�#�4}廟潖恻 +鰆8噠灤o眥C�出桙)鼭3阽Z緅枍Q拂~譳揬�玌廗朣1]禎揶壳槷江k嚨珄z�>麀衭h鮾]#筯澏r�=?蔈k~�糖餸瀠痋�戦鷜翦琝扮丁�倔閅{�Ll�'vx蘳�8卢�蒕家F�"抏{塧U浍@婆噈溘b;焇瑑"鏇枉W使w�]躙昻#订齻浒�悋p钹\耻拳鋎揸粪仑U潂髸��+`ZVN�錼� 誾1倘M9痩猺綊3鶪�;组M愣芅�0gi泙穘\_ 囓螚`-婃Ss鞠�7#喻耮銠�(>舮O岝�1H蓈X'苲箝輷菑铞�=瘒厍[济:{衜铎;e凸e=�lLL弇],� 蛴@睸j_ _5驒痃渊棳寭3蹻esyv>}S +髏鳒W�蠛%,胦嚞鋢.o汁wゐ觨弁謅絋�蹮竤Ξ秎YnIW4踡5(v+oD囟]t�磲炙Q貼�'�鑣萜++譕J樊瓬屦@尉櫺攃轊&2r妘7\y髆區t孵6徺s�镾[甠#澫o鴛趒湠欼uE3颈KO|�%O�&鲛�曹tYzJ\�(k欓>rQ薷庂�5c\u緼沣V�9曨#憁钦B~5�)�,玅Kt剺伡 ja{轐� +庯嬣祂豌`|_2~⒈Hr﹠R|繶善斘�姳拲,培埙O焴櫛^媳钝r幈Iw鲐o!�k硞濄ǔ茼鵪穞n吮菺€黚Ы淐岤潭廱5垩齰趔b;諸齸Q悄� =�0駳矉x箒鏒蘭仄�+遘洕�,;Ei5遈兕虿眫 割猺�0蘣ek藣a颧陆虦#g鰙^��:饸吧X豆寒�:简長?\孰K伪嗏w蛟Z曦戳狒s踂k持Z箷祀[rx帜}忢糰ku藭I/逃�u 錖�:9譶峸h銬�.鋣┸谒E镆Fum琢廗[+м玪� 遜碶倅楍韒C柋�靃h憸糛#綰d+� +�寎似y'9姉E|樜)�;�^璄�sf鏷蘜轹_踾磖$3;f媸*杝榄|亵感�,矫渱逕殖炉緓�觷�?\靻縸炦淫脀/N葵糨|V�+漑f6⿲吘E_鞅麎罟呀込fu~矸�西aF駜F�)�驈#�QZ図泋譹#qザ泝韩El'�=�9鲧 爆)Fh弘Vd疖C�,R;�?虼Z底��)B[苷拵娭鲿鎺K韂轀�钏s|"锾n�=">.*�c�=眕=@坪�V�"N�O�<M�,�檟=<F傫杕�q"踅茜湉�:霺�鈡蠖颹堊畉鵋nm騎闳�.pe�=€-1倳髙勦蒎誶賌sy峨郻W)9宷5瓴e�; +赶 ��,`陛���-嶿栈箑wXU=馭�=Np孫铎邢?[堕纹镽eC鍸i淤|t\0h/g}8n暅]'ql�>偞�4�)>w轾緮瘢骼v<庳Nm齿m诚{奤蹂oe弃�� 濃c%弃呔糍g暠載脐獫q3蓕+層狀�豚[捱v菍舧�欙丅|�鼾馧_銸K1�1�青伕铊従ゼ 轙巼�q(?頔巅9�腤爘� 的休A;袤⒄J焪厀(痨僧凉椀�<��l镕k飄貴X畒.&s木'閏峙C;夕淵c��磱\瓢Zn�ほ碜讧査V洮=1�:k莏�c[�3|⒐y乧O€�5|昈�2謷彛V瀶�.��tD}�1査3`,.[毯kW禴諄鴒杝龊硓赃鏢尌�恼猒敡崊@v訄�%�豔k馆率:�q�=pX;�苇窸EnReS1&篿啽倂ue蕙�蠈跦�m揍陟XX雸炳pf�{H弃/g弃�>潀雁焨�:憒TKl��廪�;`G聏M姵戚-耪励頼悕臑谧�/J竒祜.�8髷6苶B{茝3o欌驫y懕l�娊Sb�>fτ�=bAi冭}▏F�-韣LqV缢r趙檬賡酽\�,琰T岋钧媑嶮g�ug霚�=c<脄�8綘�l:(N詒遘C闖锭鑭щ︐<�u笀a/`Ne郴殤儂秞麦贠€�L侘祎Zm沊洷紲纬ec蠖�'8�<焅憷蜻焗鲍琝攇萖Q瀀�亻也�/)踷T盞4柁忨F賵e朾\儇U�=z檭`_嬟│0向s筭╨\�0A��赨�6砱孓.徫z蘣�/�'茪+酆蝯w[c7黶靀�U鞽�霌忂>結+潤�/h圭憨k缚飴鷴慰槺惷S誳o)~苩鬻�"縂B褫w7*�&�5&脾佝螫�0&漆x焄尅N睙t|Q�<屳蒾蓐鴪�恹�跜梚莔s��SEr铉嵒碶[F赏葠巑�m9w*鴚惯腼99V\�=!コ 揵Y婺z;6祏!>錩嬶r樸娴fS'G欢䲡挧骵飂朮W�碑矾�/狈�~;澽圳5>滏啘NK钪[穏h黾掊 Lu氄{耣V嚻�潫俸6鮟�#螣�.遍<枚X,暂s6m鍓藤抍&剋⒉�9㑇洷T飒z�/d'嗪Y[EqU拖�%眢锝炀鱎9;旄嶆^8n�!'2聒鰕龉Mw賻uS孅炳 岝望^緌z奢跬uf搖Gw鋆:�(u_幾湬䦷霪鈞=�+稿黥 n#q茎5�穢涒靜鍧�8.檹�'耵妎X�3{O�"蒋|~+釿p:?膚鬺,�(�(乒�<_n�岊%跑狌``卟:t\兦斁o醢恫堼謋纪�i叕a滂>蜪�S禟豻胁聹 筀卮q忿�椚y�>藞硆嵕砌 亵9擰虅�挨錭藳�筓0?⒋診[旙矩.鲜i-朌�2'g鮟�9祝印诌}�谔螵!桎Y6驷nFN粛�+杀�&q吘bQL�8普�rZ鷀煣g肓鋲淗虩}~F墿e縣幪嫂�鎀4綫nn^蠃贇/nN��咕秭昼=�+|H燋邼~%� 漛s�8�)�<耨堻孃�蕒に6w嚀cb筐踰嚭@�D齁齄坹0-�'z �?r<f\�;�W盍E�#雞錏�'輔鋁詐7P颔鳺6珡爪��8W姱$耺�稞靂r菷r�3/扶e崇[晏O蒃~a趏僧洬 蠍9珧� 鐌3檩嘙Q產?b}遙蓤aΤ�2弒濈袛�t/箑M-7埕"啣x�.疤陮喬M椛u椚�5�苷赈rb渇秶6�3z瞖謊鲬3�;#稲r筇茆fХW儞4黒Y赬XE唡�+_�8T�郹溻碫 讑�%褛瓬鞒f执e;VsL个庣曪科囟屩�J�=_�潩+ 筿螠摸X会9v脟蘕)颰員朾_4q5謫@o�/��-広瀠k邞番肋*謌�=7l{纍4佑p鈷準y乳P�#|Z撍硟w�0�鍷i>.纺!;唾Y1-s苼s>J嫎瓔蕍鍣m.拊矻繿A�-^嬝握!瘸魗l洣硢E唌屵�v!vA+=?.踠赇�隵pb=冒孓艤湈I誤S#稾镀謗车[鄗岥醁戊�:H騗皁脎掁化\K�,︴浰y澻獌辗楅顅沊塡讏Oe鱎疗u窟\鎃壬�M松Gg動竐燋0苼�2疲1�-徒�9:7渹;啳�p}塳�-濘>3鵦=�腼?氥�&苲笥骻汕鹸份妒1>傯O萖+�!�8WN�{w`W€�0f�9�鸕霂0尛C榞lSR雊�'5mJ 莭巖Q貰Ω€蝦㎝o曁蔒qZWVn啽�<婨秡蚥�>-f弲<瘈w孚汊睞?pZWpw&d睜珔�)�7箱2庸鬴�7妒�c捭騑暴怄by€�9�)�戵鳀鶣�蜕�>h傻瘟苜跙�<潨i_'缲邨晚��蓞:埂粷�)娍閐揯せ譖Wk恐\�9瑢� 6{(鏨(NOb渮[Y酘寘胚騟敏︗梕�%�v猬h甔?垮豘m縵7v讚饪HE渉譤;v嘺蜀睘<9藿�迵�熆y辿P剖q�袅楂/�>3殖��咻�9)綃募i譌�-�W鋟稉82惎酤�7i蠃諫,孊驢镲g^�8沢萿�癓l�檓=昏曵賆+~萸皔譄+謷�6 薔�.r/撇z{My轪瓹齣蕍e琐k斖蓘騃TO]�c莩l!w剅S\6纽3e{En兢O粙蕟煸矝��*魅�?岟縁潄rtf礪扔雽桀渊檆.瞎箔發cX6�+窋gC齼"輝I賱s[e抽i蝏f`櫃QP佐 綹褆�7椓� +逯��9X?3蕪�:悠榞v撬铲 +陪煮S<嗮>邷滘伱~ +其暽s鯺儷Cc��+舗xx鬓粡O�顛蘕y�0�#偬^紉Z鞽嚮痛U鯥躉(�=sV蹚氯�觗箑譫�:=鲫�蝕 Erl醺?,m嬏?熁蛀g屢嬕R~E嶜a`gk瞚pW随闄迂(�胂俾}�+鴶捅璘葔v莼瞮衛z橫i裋甭鍇r c9�迁昌l�*泹I%��5W6#s祳习/�#陁A2譁\9[斛'd�箉⺧艖�9Y鞘\�'鵇攉lは産娲ek蓎甼鋣墌Wz籡稑�肀飈<R洊�仠宷俜诒泒被Z肆逃0O寳%韐�.3�=鷃FN瘱� 龥铽W-洊�:0c�>h|o夈军S虺蠈u<鋝K.W�8�$腄啯DNdk種鎊殚3豀&捇4紽毞�訤z!W驴咓Θ$覬藮雅�;贂o搸c庸>睂ㄤ�&sFw鹒Y鲙k�7€脒斌鲂�'Q.fS蠏*巰髖 +�濼~Vt�:b訝lsrMN磳h�椾'*n讹崮儿&7l墥gC鯏�:綆.��荥-捷Y苆��Z�:mc回v独Nsy决 +e粍c柺v/鍰谛钳聈嬏Y縑{駳:3>葞u選YScvj昅猊j喌qIK{疼旇糳帇茗骅紲甮紈i胖簲乍苲鵳岝o �J_砡 �%顱;囱軉z愻eK��涔$譫�6灮頃輏 +�屴G1朣麝舊σ瞱�Sm寽嶽凿H� [鋘/巕5茂J纹%h蔍齝�9巙瑡e� �薺Kr瀲赁9+G鱅铅�0�峲€雫沘崽��(&i+炿姝嶟�质�9D鲸A凫}琶儥?唶敏竆辬熟4莡u糪$臁蝫餖磻g�/◤歡T�<颠檸�%,﹀,K鹅�s段鲡<禍�5�,f捇s伍�9绲�<i苛㑳-vZK\-a瑘�uN杕ハ'�<q瘉y嘂%�8麈銿v,腿E�/芑勩覍q簁忪锪8汋]枥胩X�K1��2c}矜槊|V�83V*顂空~谠�'I�9巫柚痏伩T肝ErS g�桵諻�%鏾U囓:㘚�7u_箑McN寵菨m� 彙咀i輪w汉 覛aSLc^缜寖镋荛錁o�.�h飘 +鋃q,^o啦�,汧q蝨端H&唳Y� =�謷砮嶄\}€櫌|#n�=�9-;※书+�2*�逕S鸃8逹髄5Hz&n傌墅奊�;渲押�k聱~癍騙坦嵒 漞婀財bCa_�9薺|�溉趬坲� i酙�3q德X韾羓� 馦玔�:l聘Z]缜P4_糪<瘛嫠*哥`鍠�8辱髰"ь诀$蹡襕:轶陱昩q懴;诒�.巆鯄巊硅~}�ZJK巯B箞e籤�6鱱Е暩曛sb�翪TW藫�=`�碡螒魹_奱潨捎饡M曧t萾�-曛檾;溻v泳w秨�8.仏k摭飼}鮲钴2插\娄*Ou嗀`�9?>坛3+`藴缙1�'焔僽C65r�C籞 鏱z妢v漹檀綪�-掚-淤6iqf燃&_�5窸潘殤�:@絚9疜涢5t秐c/;梀媠C}�:{Q�5`€藪扬9�<��;屸`≤貟诃�綅绨嗱c棘V,�芵�塨e剅ss襧铜W択藺杒蜵=�J|萦8閺呖8�+褊忂p玾NQ靻c娀.⺋徑vK針6煷� +1c �钔b魄v戀V�-駸g'蛼ql厾甌蟺'4泿u蜐k7`蔽4辅菥%销鰎蹲-鏖L瀟o緯я�cky秞偷荓麊鯱後[蚻涃>U~U 鎙眎T禬c觴�2夕f瑱7翻]轮3拫b憚r�'箣x羔G圄€覚駔跖滯誳�7牒玑樥q� 鮙鉤Nd酆梟达G蹸飽褺�9讵Cd嘶(=ホc1$悼巈E�#v蹽竫Y驇枦媜u┸`�0O姟:A渨遶{I<瑘YQn巑y盍濫≤�<5c-淲5輙>Wb�>篕馌傀驖g�+� 雡 cma吖u鍀稇囝棳迭R矻醫7O摓瞴F�r幅蘳]b[]社晷�-s锭咑�:磿栄{狠鈤鄻�+煘i粉�l宿每�6mn^7畀5豤6O�鵶楍x煾xk寿綵h廍筀�#�s磲菓蛃^闻i炭�=tI蜗珄p�*X悖:4识劝N墲0"蔈坦d玗淮嫦黇sh�(e洉k�<怱哆H/�<}兮疽�7夕矀Mk�邴�菢�6n偛� Z悟�9蔈瑤r萾膥d驻8┘}峯;嬷]<ろ恂l嵥稖飮辊搋�+杋�琂[:萖�<x滣棫oM滣腦鉖b恘姖題|翱A.饆镪Y經阙A湮闩绌鱎SC硑f灑鱪�謓o&u镑快綫涠a賄詚脘t賂Z<v苹捂i捺A�骈l*蟍�鰿=烽渣籼┷v屖栂'�=�>咖T猞甐鷆=e牍桙竲﹍漮嬞雳紀c因郦澁с蹻{(蝩鼯犕€羃�7闌� 濑昳弲掘�-髑ek乞漦忰|{\Z6g�鋗\k锇?L筌|v廲腴y'萻f忋騖j穎�檜挺�)鋕�-沕k}s霟楂埫D俓�崇鳋厘11G=6忑怉N谴x_u纜m軜A跽犱萠*�+b0�7餶�3�╟d[扯縷墝糃}柳@爩o枱磳梒<F�儧1豺�e穔H扒!期韛鵐hd�芠:)~O蕒熯药oo鰓稽N3�H煻邱;|5�;�m鋘殓斍`濯韑4o�i葆哖欺捐q%デ�H也� +v�葾锯7胰幗>�箥進剕C�9巩%稴eK藽�)蛃╇旨O9r9鯹y�2s諚鹟�<┫[瞈i[H+馲航蓪8r沬�,�,隣茋鋣霕^赅傥紘>�>O疆m衒�6秓N茊}胍椏懅I祟 T?匁�>纕c綮役U椾i�8�綎1}鋲~@鼐i�X櫦辙ケZW雒7UC顦)踼��6芞撾牻榮x祛�rz厽牲/,,s筍c驻7朝u}@ma� �*&Z垍%<�㈥�(-f匩l铆鹼�X翬胖誂覛槸骟鬺祩u<郎靀4z傣}忷扄钞�8vq掼�21$6=F�?`j蠙m桌y香 芢_慵cm趲曔匎徨樗/�>{捒}*C>繚蝲�;揄�� 1均\酡b忇互逰閛6~梱�F/�;�齘鶫y[驐煶2X韜蘫齿腼霼>訖5訃镹UN迻藁z)帺��"[a纍) l鐅鹺9鮺v昆緈*沄筊�Y/7竛邽~藑V鸴剋*t呲魟9漒漌缴现冎妇�=鮣�&迸搛F鄾搦�(Hy庅錚W!_譿ㄒG藽L=@泧頀闟踡p�)^珗胷_M;'g踁�秩�9滳烕踡蜅轒xX级厱羭戀靂梭捕[�"臯吪� o阀?iNЪyO吿藆豃_求窪娲<紪川�&錁蛋否狑V緍濆k薊V廰洉�&sQ璹饐lj7l[5鎥蕷�举脄广盷逸�5d�謸洙系蓍誧\�謶;}縻诞羱菶l電x睃%徽%癫�9螁哏i舏狓胰Xl嫪c!�<馯矖郶揩鷾�6詻�&慯昙崬淴挒侕 uu殐0鎶�潻9舔贔嶓�9Sy]�-Xc唗痯靠{蚞z;疔薿 €⺋�泔_瀪#蟈觵}:嚸洼謷灣m擕!鲏�顽倍捋lH鷒w坞黰6G�昊�EO椀�翱��5釼榄猍酉訜c濓l唱kサ妦囀撽摧�2柤杳馝,F簻屹铌�|C|J踟熾惥\F`� 聘b� �>蘽4脘8i�+燓}�k_炗篹夙A謈耸c�3妃ザL}旉�;槀2a9m]h宮L?沾n臃Ie喆穣�>�;g偕敓�%`w蹫┫�6穧E,炇皡鰶陎�>棿*赃#橽莝邾�O�0�)踳<鎤礭娞8鞹�R蕵�1L�+儰駰騃鞦m噈乴鋖簝秛襼罅6沲�08s样O�毡a�陮;狾j嘥咩馫�r+隉謒Nk丞�,闛通聇e 9�.擇C{窉�$V酋Μeu-&倉閿$撶sZ逢x*c��/複瀋4胯�%忬豂縲踹)Q弼香鲒翦拶囟�犑�10柲r釡枵c\釞�c賦俎諏�.6エl:v咋蚇9灻F玜嘯疓W媘偘OL�:�a荩5焧貛破√椵>崡G婲,c)�鬃Ox藄娮�:巋岎樭y\鈢@W揖V铹v�4V倉_�?闐\Yuk襺请爿骻O�>陀w呔燍顼縷鯼岝�開+鵦眚Z�(��#陓+吡$摍藀V]縭l&b琈e爎.y漉夡�筄蔷�%v"纹祹鳢yo碤{稍y��}羌=�迟5[{垃椂Rvb珦钠!瑯注|粌}贾5革$]M赇T6,擆轭#宨b�#3澮稃涆 鋺�)EO�*� +鐍陌℅v;循� �%渴a�8�&3钻wx\源I琰鲎2炾鴺橱扬�瞊輹#VK�9ì#7�%;XGRy怾愖60%硪~�<溸#螊踳_莵e菁蒧�\�(m,�'�� 峣mS鰃氩� s餡箾鶩�狵.覨鍭幞R�<禡灆a胴爎�:蒸p蟺孒遃V卦�韲皁诉s衂Wd蹙嵵�9襴^銏/:茂浲�oW肫c鱥�{j撥蠌g�蝹=Nw转縎:{喋墀{褵荐!熣u愔N�9l�;� �>�%q.)蓙= 鵌怕RiE㥮�7蕿FiY�(虛cW演?�"N伺�{楎觪礣糛层�>粌:徛�{肂蘚贾杚橒*}磑q鲅簄峪�4i遆�8䴖�3価宠 =尮4議縿>:c]w蚁� i\�7wO�<箋珥鐆焳��qO燓穹�=c蘕�<綣⺋暠�?謋凰豕畬U霻洀糭D幫{峒/�4贍�鑆l甏掾^f藺<7駰锹m渤浫估巬覠っin}k +cXo!法s�9革d�#粛眖 #昳�b遃ψ-� i/癚e�+�-抖bI9{�% ~痾愣灴f�(9W�?M�(z}媲g�7�+r.1%�表>霵縝�9�<Q�岈t)3be/伙g齘鞨d涏�:陷卜它碐�6'=I@糋eG{�7T獁m瘨遚eC`.�頓[C智�頮���仠gnx岄2夤�=嫋5R�/� +�1]>儌}嵃鈲矺瓿w鈨�漮=6飉?>ご�r衝LeJ2茜祹��牟j滌抿�_闸痙}�59焟�f|#譨賗瘋zo<嫸8b蜟鈙UW�.4Fp�6g瀷xVUmd砋鸕8�q1Z�,pヤ�8Z璩�Z9�;x�8�,�\窟錬\窠�鉰溇w埗c:脒誳[m�,x濥 x��㎡駖 �糤瞷N礸6�es26}Olc 鰓J吡~3蛠G彏�=鲮铨w吆g餄朊蔢�?�隷蟳$忒撾Y~:调!痴鳖g�貗幆6�� e`齨l|�6橄耎顶碀蕉胛嵷�S剬Ul尋sκp�/桙ux\�P雯伿��-2]/尌X筯@{妞|��侙斝鶋鈷Q樸躥纺?�#�?O6f杴膕s�$崇s枅讟囧�3駅N碁電遹-?峚� +_迭溬.=睚8傫冪门稦鯠�餷慷藔縦黈€@賊樍婏 +蚨啬n阇|W韙狺恏弨㭎�鲎w�$vj3a噧鷶]鰛4'賤�%巯#睹祝]焧#�+�/Es咟.&X胔黌�*瞦懎旉7汓抆e{�栔囵�*彶鵑Y汷t唸wU靁漨(63薃x顩跂y夦溞'磸c��%1F鞬綼犬r禨趗鲁`�3>�66)畇-;2,�-鄉睮)v�-評嬮炫蕃煲摐鸉c渱碷�x愶Z橦�9洊�4�'�粙楀薒鐌腂萂6VV蟫&甐#艆LZy導駴缣5痴f*銑靨e渒【こ湤�65^虦讫<�E?呙�$=墈a��6.=~贶€�瘺pV愂|s箬铋幼镛}魍l曲齱/N?�9�>��?�欍>:}魍t>=~|^錾榼�S堬/鷅閥n鍞縁釖[渤坣� ;柧歉Uk�旛}S虞蚪:c{擈��鶹愇E*靏�+鰨 縴薺黾�匭妢峫Pu渄n�<U9缣厺�v%N;砎鷵钹%�:�+$C綤蚧襉效E&佼使.�Lw馬鵋wd +�e靖骐z�)懚皚Nc生Y*_�飢謞圅5餑�:鲂/i孉拔!� 绮閧艄F_猬M漁�0=�1襢怓錗,璚4�(澴捊_坫w�'!顢>痦謥+�韖�=惰n韘�-���4w*抠歡挘�{煐}�:喘帬W鯼篚w葚nlK貤|&1�;�/膟忕鎕桥駅�三糋戛鳝x?�z\6黒�┓}^壝F�冰徹O據饕仿<禡^�/殢s╊禕官預<'w螆�-屳|iI,<�鉫��2帿邈e俑Z擵窠*6�蹪穡�<Q菹樐邫鰻N咭Gk未楍;棼n確g^�9/�j迯e揠棇s;飁-G[鹯n觺鐇麒�7塻>z闆;��?~t凤�>碛;o?粄蜾q>繚隇甸W44b <侅Q�" 做=m��Z}嘕�楸脋C�?饰饵鷐�3�`肚哬�4煴罋偤狉BfV� +笕啕oj�1�� 膈膔k]c!@TZ芲(�n�G:⊥X�{�;?UΜ鱨馸氁+w頧鋦ZhG Y侊墮鴉澞%愾D�6|濰~"r7Z�逸:;6�P顖i�f�6捋ぺc�%0�飻�Ax勇{]*O�'峚脬趲缧c紏N�钟鰅刖v隵w挕q訨宿�躕洀� m蹐G亇c麋z2s婘 +就Z6dJ馅櫍货j焘��z澊鞟鲙�=N^吣焚嶿u龇�<魵駰RwIn)^趾/keXl-1|,Zs�/堄蓋A.帡5)禦q祵織}GG浚\滢31l蹃隼�>讹郻狵�崪涄镆1躾婰�醬gf靿{ww<r��*�菄}�0艆H���苲�8巽魇畫m琪R鴄�+綏抯哂N忳屢雇l倌_頧俪"昢q c�Kr=�鱵濵�UXg'藽耖獿�&bK*� �7壾&`,f1NK砫C,栊P穞(ゥXx9綬s瀢珍殂�.尼槀髄臖�1S欃>9U� 鹔s茵�-譢糛齅b腘�4蜢L�6�敓u衆<Zn�8腺x磹周�饵Q黆譮羭閝1"I髫z�1夊o崱鯀qU�7捔8騔�1dbD*焦!]螻彷阔_/+幗蛘曫卣娹p�8畟�!j� S��W複抹l籘骍{K�$�9'給烹靷镜r漞灯:ョ妗�7璾$wj薮騦0[核w�7?}[�?_�+褊呖8}黪{襓狍'鵱cz;巡i揑榦<啡访锒%追襜[旀痸~耟各稛躽屜z}}唾� g"獆僊湘�]1M遅?*髸楿[z脵�{肕|V豰敐松u叺:c抿tJNェ鷭�-瑶豶)頶┐蘜E�Д�4v,�=t纞肃艿糲�澽僻e謺fZKy掝q\ё燰瑅�陯姞l釟浊,)o釶|x`�#畇飃癨\~詆>巪+-扔�%黟K灘.6-暓c灹出y嗿⿷'戋V鶟~ +衣z螘咿璳lE羮綟倌f2�sQ� +�4渣Y-芺n +�Z洆g,m泎 雍层V�侞犈�+塷Zx颓rx c>EnU蹌�6昼斌c絬�巃拴J顐y矪⺧彆鬿}资盈吶X锟麂襞鏾�虢3c}衾oB�霙耎蠠=物RХ�?〉郁谖K2枍劻{(苧>8鉦;T鑳3�3A�7�银稀锖梏F��$�騔屣[2萂啩F颦矊觷^r2濔揗楀愌轷F娆"9�陜x伧慿}2N驽蠪a咳阣`綉鬺:乢+0�7d螎狢KF�&薸��膝歁��譇賖MC龚畺髠阕 O�逕义棿�婀T唔�,岋&Z>狎[.]kPJ凫M��<椢╂�旰嬦Z�炢E18髜嶃癋�)薬�闶柾讧錅p嗑j1砈�粟眛L婍瑌婟�,檆嶖b�6,l/K癀��mS渁l槯K{;W踨>锦Z3j�糤及坎v�cτY犸魁鄶� +�/X:疞馪�讁瘡妦婗,:7攚jt黖b褟[錽蝫愢�}{蒅X罹�鹅棽朮[s穉S�<惎-澀富江Xヰ�=褫惈鸆U焥禣 鮨恷讃|席鳤);q悞﹔翺%梷赤�怂M�錢峿磦篾P飲?]萡�5,瞧r萀軴哰0Ok/阆荞欍 U�!J亷銁]'�(棗嬝詓庡跋7�0]m�6L斢曂�!rn镫�9放福J9遊滁*u52葢A�"箈Nx焒�'13iEg"N�5惓:u0逝:,�#�(9�踎h7�8^謱n阩�店i�岅�<忢迳癫6.^杶/g劷r�乃麓晗寒踧�桵9�;�=糰77滞<n� H鲜�>褻碿�+鹀��/�:}�噰跚縸~�>9�濺紙w込v麒袽峿C稙璟s�hsGw肷烯濯徾(��E毐燧@簁N?椈齕�?鸀RO龠渃�篧*瘵6蘕,C鱟L|�奿臏ヮQ攔乴壄p�.>膈轤_�咖麃鮊_b沀}/鶌轏^Ol_B竞Z煞2淓<剅%璔俳瞈蚧瞚�%�娞]�-�mh缋u=恔�芲s喇耮坰:А浽籝Kyv轓領tf,骕7�&9澪r1wVl灆椆tm9q茙譩訍綎�,涄憾�z獠�5卦昺3唆X嘨m洿迫瘧躇Z哛悭�+況F熪y鍍21#�9=в蒈i雑侵n葹斿:穹�2k坥5闤 腁+帡�vq祃<J孆陣榢l涐櫙暬宪煕瘲屗盾珡蹁E寱bU}跖郄灵o鶘�?�:_>瓕躅檩窡鐊吇潂脜蕡鐒b�*q,#脾6穠*桐萖r�沅袧m奅%�洚ㄜ襼訆�(f乇z�n�*��$ヘ狀�60榨腡剡�9钤鵎糆{獮"c昘 毐V檵�&Y~�*Yc9JkW6O扴2薅淊磄0h车w峑鸛a剸嬭>ZwZy鈂l昅遒毃炨~綑g粸hm�域9RT嘓锔=v僺W恛錀曩頹�椭辡彤潯\繣豽mf轅k�r-6u<r[;涄LzM敍K滏x乌0p尥阫s星 +y伤E\鍀h+�&3┻忰礂涀�6謺丿K棘m#^枻%1悰9�!3� 暱闲鬠磛!縝\5�55.輷6XX璤n,电�%{卒颠飿本濎+鯋岝��氤�緖q搘N)泣隣炣�5>V鵖縨L�$|鸟`z餂躓^聵�=漼A淜�)^遧攻割5f搳�>諼�藛愫w灡0&�5-鳝κX鏉7�9:�wS 釽s淧�9但1�蘔镸侥P﹏k瞔 b洽x㈤袭2V搘寀E�v臱+肵.蠘�"忷8蛸导親9�1%O9#k鍣鍒�lZ羮!梘鄰!k�9敫�<涻�<A�uX~撝�Eu�3娝��箐䴗擞螂帛v揔~嵠G榞 'l1熤EybZ ?]<銡+�0�<[k潰m戅酊0j�'�-L巳�:_裶�託憢靔�hnz喆�q蘑=:�採>亡蚿SMO�m\�9䱷x穑界[�}鸨廩m,2唘g訾sr栯�1岓稞菲@k~u齲舟�3鉢遾瘙櫛�(寱�+<t滣凈搹�:锦嬗l�:J煅嬽x噖鸫�|柋奬蹩O;鹎栘d蟆鴼腦壄6�;(謋戂者�嚛8@xNY�%緬姽7靔Y臱��1)�,��"�s妎E彗矪娕蝢3��庩�.<+\轶綐�4矘憢Y,鰕痼9`茙ヮ斈w蒱菖<泴k 鑧鍯姊K劂>孶}~R潩陶c箋�腩R�'2�+繎冲砺z夯X鳩[a鄱晟禱�%9荖�"O�q溗鯇铴�8L娍赩���3�No�鍶�g颏驀炬狊[h弦m!i]勾t�*^朼&;希6沜⺻>牻�>��c桋@鈐普"γ龅銍m^繾Q;�c惋#譻鉵%鱉�=榊o�9衍悔v烋�#櫾n垌鎏8庆廍g�?? c%�?��2縒懦佑鷸蝪[邠瘫�顜]�岼軬N�#�(n婏�9.L宿3偦�W販]jJ煲蕮TO薼薀澪炾�|轌8+$瀁封W>�,�6B鉉禆3�5淮偝�9窏k�%攻籜k}/�3i�:�2 Ux哣液潛S鷙ョx�%峿'淇卿<埴睍謐F?,i頔]n;嬺Tw訫=欕躚琄YR赾�M=椾�,|k�_r鐚藶�傼l2枒笲壮u煰Y~恔�苡v%��>溡閃凛�+肵佫�,鏅N讚+l涞芔z{疅浞瀒�4�"x{�归*悡yW�:h�&蠛{漜泲Z�3胋瓆�SkD腦趠Bie期U苲颕嶢寱�!�?鐟镸桎栤℃w搔耑�珱溚Jq晬`櫓��#v� 6攭�艔B質7/�9�<�鋙bba虇*3劅妳�,斋"�Wos?浜�鵩u菰斻t罐蒊T癸俪{�3*wh輈櫪'圳鏼��#蕰磏i�冫q}罼睳掐L�搳�湽Dy诮璭氖b憓\遒豋[~m漡�<踸s睡8潷Y彈�鋌鴘嶞�>o秾濋邴鏃�-冼Ⅱ;竸K醉<瓰[f�Y�#�毐�襾荸罭�;u屚歉簀3栒盈]槎殴l汆禒濹[\贠槯幙€\�伺_鉫嵤n祄纬+⺋}�輪蓖P噩i/偣跒V翗贲k抏頖靌�箇v叡葞鯋g呴蝏夯鏾澽锾XO覜弶笔� 訄1cQ弪� +�医掰?煗i鸙逰g\|�r�蹚鰀;R鐕�?缥葋<墊喷t�Hp�+y潷昺1U3f枆�5羲e+楣|镬贡cZd癙fs�堜l飒鑻釳镇�TyC濹,,臘娗`�罾5力祖R颉庝&钮湡嶅誐!口鯡庭�9玟l\-�#煇榑慎e>枊%`鈟(~m03鷑X�(庭薸鵶炄�?�>Wg;E膾F/-ヵ*,,i3,橹�女捕�;M[輏6d�/葀9肵秏g�2;馴4乚/�0肆3騔a瑱xY|Q穽�,�nL欛顋 +[髳�0h8洽�孮�%m蚖纷1~戜弲g�韽躞�渃p\)�)俦稕遾�8 T楛�駶硓f舧酼r螀r鴰�*堩�1V鼕逄9� +�?!鸘*肍鵋Z缴r�潐s�:�鎙蕶代犦0�跈溰E钡朾f�3溗鐟b鲊鲵10錍�9豖X�-�8篆漁KX缚帽餒乐攆е 肔柨Ⅳ寽c鶂鉢締覾z}籐�#籌ロ页yE錍Y妳U�省屚s!f�8瑰2簔r稘�r妳#9� X瓏�/�櫺�:W硕'�,茏數ppr>瑼�9[傉橬&鯽^Ac�"爝P�BZZnp:_苝`[1|咃陡Z�)披谴闥b嶇郻a"?鯸6*�9�+�姖D跩奇g鵭頺蓵梗}溙漻躖l嵪a莬篧港飏R糤v,bu镹沲u蜱.oJ�#pw�鳋誨!澼簺謮.烏痎�9pI炿 O恣}4�'�笳\渻F�s禸08�巐φ餓wirK駾栐e换态I鞕鋬之钰�0荕祡皉ie功Pk6闡�/��]�:丝6i9笯o�<儤罿匾翈!@&鈭铚W韶乇F.庖擗鸖榝怤k頍迕朶6食!孜场脄=F杧蠋摉.tm骝m鏸�騑c(戌"字齆吆�46�幓9#幺� 恩bY)嵞`腘儝披[/Kd$-�+寳诈觫wK紗痛诉8lY轻轰b埅>欃�c牌Vh蔧0/澴烧K1HS岝g�輢Yf瑖>+Li�<捦烀O骩:弉巜皇XS眢�7s睒.`�9鲳�q憦�4�'崩\�9n遱煦笋Q��砶�牍愮曷<U浲遒寵w鯓_諡榙郈f瀕Z�13w26疁荑浃� S騽�c#C麻�<兇XGEw��;宸鲑髖j6j�5髄�f�&瞎V闰妳}V髧溮�/嚩韤9鳯e�京粏q�uh0驲灝l氏诉�3擺蔛�#}�q嶮隋[骏熪翩�*d害\鮛 +8c[i}{冝�"U贝菖岁€�"�*#e壛啚�6斶�5霬�%三高糟=迌�Q忳@�;�-蜐Hn鱰6-d琩荍>镞�馻慵�ON糜7_絳弩��咻\�?�-K觳MhG�:mk夓m砖e�鯴b�(�辤� 諧�g鍨y.墓� 禕旂"譵湱(陜嫺n懕&a眴侍郯<; 湩f'�跮泍幠l1;]r'f町K+�YEy柋y^銼禉�'|Z稙-杔陶硬樛sua�穆N.�k丝竛,溟蔬捇槄#滚鶝误谉凯璡06Z2溵Z�%宸e诉5X>�'�c宑汥�!2砘8c/�饈@瑃緲慵踴Y湳��?S]Zo>螎鉮禊q�`.;�E�拚�ig腦鼥午o齋�+L岝mb�煙灍�.鵦鬻 +;9&滽祅�#�.惷礆r濚Z贅视�&po捞�&鑵+�>�饵�%慜鏄訓-dN{n7梘缦�<痌[�1s|&*痕�%z瀖J甛c勾熹收皐鮍Z聛v]q俭[0栧張=偦]!c�5忢u-圻昪诂刮^躥嵷:和f鋨�<[�4茂佝掰Z珶倆Q眮i惦�8禬A浀騖��<麈l<夜竄氬��.�3d?{G�)惓\�秦癫绕鷞誺振瞸繈颓�;(i歿占W||梁在#6趆栯桗8Z梖蕱尧穞䴔oB��肱闆9ン赡w�'寍�2g扆�7魇灭�-3睯仙鮒nr<�7d驽倶綃KP菦��8k馥庲D叮粦$εo6T:O]у筎翘簚_ /#縱航<K㩳喤K而刹ょM攌1"3�hWn矸蜍�w嬡扢VC葵<ゾ胎!Kjvj�梛Fw6滤勾媦a6�=u鳢g,]~�臣s0�%,yi�/犸覛+�舖6菆+遞6-a,嬍舏 輮v$誈6O已W"g鹖叫f萖針灞=5Y'?蘉W�¤諪賭眑灙]Y鈋�6O?/焟骽孎�氥*猗K鰣.蟚洸K+�紞寱铠齋�?螌觚嬱麜�'S捋�.�ck峐偽r鎄�筜&橧K樜�0h�i~1i〗7dI��3_.&U揑},� 齃�,恗浦.盱飛�.�'m9=f�,蔒 7俓l/拊VXR佚馂5駽!鋖Z牕P.�/饸�8m椝g�.蘅矖鞍鱯玦-焔蚿)汽w�:�:计�,�<缫高绻氈胨Y8洧@G4�2g匳欠雅u�<屰d縒銻黶壉�+�6曓0伓c]�*`�;5y3皁Z.舛u塡远镼Z幽莚構I鶽 G~頡�8幘垂%鸐Y科箉f�,O拫韡.现�5�'3V=+黦0�&弃 1�az^�'秙�鞭屽6N4c8箆ZK6�kg2鷾+睪u5娪�:j.蝸掚|Z6茣錜kr黬y万K搮碑媟1w捅饈錃v袇�,儹s16勘p擕隬聃袦头礳乩杒砀G�1.藽韌液焏辷嵹C耠�舶搒2�;?梀 gdh=w,� 线謃_3@攇漠�2�.鞙\7蝴�-^炏s饄,給鈉?閟B�水嬬緧<9r乹裋磈热貓螭rI飒 貫t鵖ZQ�,o雮k蚗� �;壛4膡Dh貹"蛬也}蟉遷J挝熽�%e骾!�)�^媳�毐螫;俦v�藶u﹠瘪qr� 傮&�庘\-p]+l3\囲Gii开M缊�X罀繭�<踘~(宠媶�r閿e⒋歳憕泶\�.Ie[G�孿K�Ξ縡{V3"蘔彾W扇t懱+葏2A\X臩T�%篂�儏2龸啨滃5鵾\W髤韀鸼I6JoQ�抓予廝&H铀你壦43騧幑平7睡膈藆-9;6掃Z鬁�/朷乧�5�\k�跓"蓦樴B?v藨毳�.绪慙W媩}?墬U鳬襌癫杈!�鋂鈆mTL-b1蒾怿�j寕㭎\7票鸎sqa^�8Tr6畆c炠x原<欲5|懦O猁~K�縷vf瑮櫛�?V病眵�獽士�#}遳�叧Q-p�,c櫹婀j鋲z邻臉A鎄恬侵擬鐛i鯒Ε�4篝轿幼SsJ�梑鶙襔�:�3,咒蹈蟍ch>O({姗涮锊还o錚锢��J颴軾遊b箞胩��萎趮穜�o1]"5步而祹W愑m恁轍�;TL坥啀z闶蒩?�<犭儾)钬复zH鵇薽t瀩怴K鬢魩�,觍䦟dlz.瓇腚鐺瑑硐螌q�d鸜&瞚4硬焌勿︾5SF'm殺莋bi諳鈁橷 竂 6FD7)V脁Yk維(|曗X鎴�髲�6Q�� 褺�9'讄垲29氆wN?鈹lM�&麸N?验郫�=近瘗)鍧蕫xo +�挒f唛~kt氈钓-��麼2�2:OZ珏c工惠[1[葅�:蘧子Q\(y痀蓿蕞禁汖趱泟挅褧9O�%eD=氬���婨�/v1b弇缊卸&瓙滲F魺b烖韁�3:酗樼�#N厣{怣骁<y䲡今T譽X+a~v=腅蔩�f眬�:-�?終^鬝鷿�y戓1k邘 +=`柹s┘訖�鑍q倩萖翥?鈆|k訓挺5杈獄�%禸獁虥�辮�7輯,顂 ;踔&Ik{涢,阋挓�3k6陳u崊k荗韄S�8�-齨.觙_爵辥~su蟧贄鱎wY呓輻t襷~喾�)=抋笽阒��!虱yN5�蠠0謽e+83�9承r�,藀侄迨6�砉"Fs{3脅�#3a<S岀袑儏� 织撾)>�&砎d远=9螅�髗厈蓧麆Y啭�<>�痈夥儳:NqL[藧N挓�2瀜L鐃啙b粓疗3cシ覻ab琩[J綬薠焔艼y教�咻埭舐臊x�3攀谶+サ;垮� �$6�7�袘钢'刽篝ns�+o +桋�)砪cΙ颥�a"zw:闇"��,fd娋K轭隱嚮锡�*k7p<o濥N渾溤1c墌霩噸�!叡J抟葧騵#s]粛�隼kia~�堯�8磊隫�I栟�.m矾矶玱_镄觥腹�<�'榍耊檫K阽鵙�?o/e=2*]J艹�=:闅$梩潠)re?Te猢⑺ν懹g躬宋韕濳�*砏飾彾焭�^�9嵖漦撏y.韛座O譡角�靔k仳涰eAsS辳WL]蹱犋骦捴Aa苈枉I広?�=礥鷠bS�垂t餆鷻xm4糚~�ě黶摞苰�0H瓹齷斂�酗奠僷7q憣1m+M2�<缇价灴琄�;忼R藩揓[?晀炂趎楊娺漉\鋸YW�-殇糝?�儱2+轪乌r蝩��5��/�悟麦<s栫|� 吓竄样a悥渳鈟炵5秢�r臽�~珢b\.�6b+.遉鈞Q\埩揉齽�C鮭Ⅴk隰厎7蘂4f束甤u,�^X�<we炗遪邍:慷d"囇x/i]藊n�箿濇?巽盎;$琯忣^~榛o尴鱛>{赋履X?|t�粊kf�鸝楛掘y�=贤蘀�=�,寒0蕦繷殳\鬈I孳铺l�砹�巍�&休Y廡�胂埍勸v蘬t�8T凉�}4�%咯觑趔R�#讖�賷�2OT=Sl_[o坶�!@嘦鏍t�9-譨{P� 罁檯�祦錍b0�'昪圄v虋萾赹绖莢躉墔(]j�仆嗂m攙7谍涌^ 期佐鰰涚蛓茎9栫f�5譴K⒐K t��磃�</kA誗撹(襇�\�业ヮ�&箏籯迯P�芿歋浐憅僲餐2櫛*砆�+{/鬝婯譽<�<┨�d孑狏,埸髟&鹲荤v�+递栋腦佐覗椎-芳椎寘i�0�>*}@\R帚使�;�Ы�5泳9崏T�<.觑;�.s歌I<c圁戤埍H'M�耑b椔�<盻蟚抬Y䜩霕璳=谕cG躀z团/ 豇k伩��$鬒_伣am�.饍�8瓥9l餽乢�+宗颗熠鷍sy偗<扑脉Xc賤B�4侨禩齾訶�6聈N雋嬫蠎莍灍g頙布㑇乌札瑳2v c艳粟衖o臂_咻<汗{奢�縰w/N�'A骟颪彘�/式聇V樷硷堕]鐲禼X#1QZ怯��!e�孿捴|荫��+r譟嗶罼�*�1[鶂�*0O0c � ��夞奛:*V录禪Z疲�Г��d�髩|逿齁吉覜(/凸lo╨J蘄麭揩9J�/隨,s'�$��>gUg礰�#{��鐅=鬼╨�$鞃}愪啥'鷞缵貫e掁#輛8<竖唗1馮殝{禪�(鬀mU7�.コ┞ +踹奭C螄�偲sJ矸</j洡駩�)峌訓焙z顜6fj楐3鋊a頼去If偣▂y�妥M0菩V\�/穏駻騰�靁w|綞虛韆p䥇綛�?R:�(�/�'S_1搇屎烐耘�&┶昿/^鬇7倾�<6F;C瘢鞽呥dt櫛6m艬支�麜f,鷪眻I蓭栍I�Y 鬠眞韊�;期蝴ed�-�)6帿諅繆K佴瓺N���/X5�)婛`觬w鷤碸3宸袷栤e駒m擪芆\O薠樦U+-[蟄銅g萖沴o葜y1VJ鐝b2|沮Rq颙鉡l驶蔔莦FIg倮X0V艓u鄖I迥驨赪祧腔霙蔢絬�NI寀鏍嘽N?f苲[�&1U軴蕿届摻�1蠥俣殖�7廕w� 屩v爷��)�%眣X{�螔�<c绥P呎畽壒萵5��6鴚�砠�,@�fsG6,�+�� r誨赥阡�6!俄;^栙hK*鉌��蹼^��!憁P|r妒^FLi�7殪鬿;郱糟d�<G錞g`oM:讧祅!�灜 cmAo觀 +�=轫凌n�?�柃匊馗�(艬瀉(這贕堼py�(警僮=峂摞敖q{[v�9!{檭�;�+冽7loQ?锌救�>�<焚c駓闽Z澝媏浒c�#跱壉2焀b琙b�蜭g辱悄瑇�麝鞜聹礸続�鷚:沝V�=脰蝘D'杯頑苧>8 ;犟惐乐�,秺cD�D�騔�(鱊�呸r宷U晤�v柴矞\綋改k�韴櫩�鹸Eg猟��=�珳僳�*m{毨�4x�坪蝱N痽~粘B歄斶f#鸮鍸髸} c懡曌蝙⒊搂彧?謠~V�?=龂櫛^|瓞� }�嬿攅MP�|誽禺�嗻W嵳'卼�趂伥b嗡饘B�'夻抮辆藗g~纥M靚�?$�"鷁|R撒d估闣虔��!Rz孳埾e笕鶜磭?蟪�(L嬳e�>�5磻1偔M硶髯�3袧.�(z鸿o輓摩<�6貤鷑�鍖qC}岞b訧|&Su孁 �Z䦷秈�?懏踆漍螣齴6D;柌鰽洶絟旙渊M�6&�跧軦鑱N奚呶瀁m砩�b�~鄅И?C.q眷跛lk42堷捻x}П纜\9頉伧r�!→o谪磸谨坯�痥惹}攞捶曲�.瞘/dGdH>�;�)€n�&9+�;辰裑t6)汉3六O]囼偞渕諮莋ug€A炍辝尧�8鬐嬱t鋴emOx禛~熹��9⑾V�r橒k�;�6^兓?猩]愪嬐��40=�炫縍l5�努>锾j郤I>�87�^鶆�訙獁c喠系鬎�>莥O癖炴笭眢炩B|��琮o溵z篚磺�宄B鹤P髓顕慱z護湠�?W倦xNa�,�鷞蠊�-G[�-�%�";竗垀踵� 鼽烨~,嗨礒o魸p圅Qg餼Ⅹ � s!黪Vk焎鷠柫粁豔pGSs癌僊棺洱邝S鸳獈頫5龌Wi厢鶙幼嗷L��+蚐蛳�;僙F�;蛍擟_yL�%jWg�梯峲g鶯s+趆憲Q�9鯪V3+蕞誏8y#7[��G齹}%焠[:媝rQ?�媋熶O鹀�/VN1L0&卸︻橎b[臒蒣1�99鶷{覆崎羞�檭 GZ�菝蛔繞nI&扴2x睍篷 +�0騳/i曶玴�>^�0O壂P�.2k朕/$9岥燽a乗N��煎+^魎尗筓Y涰N淋Q骽�莁0inシ摟I徴翆菪&>�茤}揲^釓g艼必蚪聰G虔�翥稯锛铛'彸�;貔hkm>�n黷(F伓w#�驨o8誊碜�8*椮颇冲;愍麬<,黃bh繜v[l櫗鑎]?(]nw!k疫塖:<颖�1敩?捑鲊�F嗷巖Q~绸珅湸蕙胚鱳P筡迖茀磵襨tw>�铭欎旖NK8碗X�+嚰ヽ&▂俽塞3r鰘6b軋o�=D槯醴k盘2i跬磍\顑q祵}k湉%爐~ou究蠉yv榑dSSr涁钇�9焔夌ス隋晬�嬖踉w秉Cy4幯�檭,媬l�t筭榶檸d0质rZ-鎘暐穦5�+s煄� �帅c5D1礷彖飃.賒.僦财�1|戬97f�8V1M沄$圎\0g韣藮bR]_%>謼餃~砰�孉毼!觵滹�-岝鯷项�$;诸P奜栻)��-�6*播0c葃戻懩黯q?迳�冂鄞鴡� ~)c�%!熴武壘镼ZTO}G=恠觫啅淐F韸zW8�廛3?!;璅?J耸Q�菶iu啹V騘拚BZW铨=雅T.斏rQ[HZ%秼}鉔�-€蘘�%R�臾勇7G~ 燵T鵠[腻w\:+嘰 }~�r�;�3c蛁vaZ勒r柍&誈达v齓�潢 O胗眚�$,W/}.zK費顧V礼禱髙+7挽l佴宕l灷姖昳睦騰烱mMm;X�/珧l�厣�-0=孉裑^﹔槅崈卛Z�(屁掗儀� 揵c%脾q/殅巍�=zk箑胩�� +媲�谊鮔ゴgb滣�#觚�??h|0�'縴z髰譻�騳唢J�鰑�6f觥欥骒B麌富p魄齰紝>OA�"�1飐5�愺嬔>e逵u磄{$髐鍆厓杝i�?崐Ad釳牼B輱秕步`輇薊g"dH耸�.义*o s灁枔\鵎Z凒€湃柗Rr鄾!kEa⒘}襁|<毦晃螩璒�儶�*��-甐緸q[X庁5J缩�8焔嘽,j�ig�}�$-}飞�=麙伧掩钀%辊L烚n謔擵C..�o梀X⺷T﨟?_愔=赽輎=杒璫<祙�硬卑偞瞒{"9胟R禔蘅ζwQ呷▲V}$ふ2)澞W壙愿i�?橂肒鏆m嚢�吮zA<稓Vz挎Pc惁7���??櫛襓a蚯J>锴隿隹/寀}w豔茪凜�6�fe�>簨葁溧~"蒻嵛蕨B`}嘻彁<�(�8鈅髟b;舿撊捪>k9蠎虙S磨:~�:g凅栃.辔鉌g譆^媂,抂卜�,中�-濍qt鶾X榔琲田鏉 湏嶜En�0隨枡eD薠編Q[匆z弃5i曭O!.MK�鱋t'藃餶�暚彮緦鶾蓇n铳r庭钓i殿嘿储�-�6�4曙� +轘6z鲯磋集�>.锗灏�3癫甛Z�7溩鯭擵/k~竊\�?7Ek弾錚�俽俅"_驨6燔? � 滞u�鎳纬羥瘣栵歉\┉蚕{e�/>�0挚=$c}Q慵縲朋佑3c帟_�7w|�铨Q|劼D�螥遻捇勰a汴:��?骰涆}剑巕膘'w麖蘋揷� υN3�-逎�wPLㄘo蝼j�LS頴睐��C1庒娋-p6#r讧韆耎嫖>濗89�1~CAZ膙擽�AN迳笮杘Z�肯贳{娅梨送さb{�*裤�籉Lу� �"v哦滿K1�<+�鴌}#嚈碽漸{;V�#r6�锎+b飂ZX䓖﹀9R碂崑d侬Y�cI{噲眀8蝡p)縈玌�&�m砚郩悥-W痶凫竓3柅�'sQ礛;碘eq濧uZ�2V禼嶕�'琠矌牲鞞柳jq懗Q5巩较 匍^{怷�c验氙�=饺岝�2洲1柦煠b`\岔�桳萰GJ庇�6&償lf9n鉇艡浅C宑@q)�#q賜w#o廘膹C奲p3rY瘷�0f苸b炡J苤汨8��鞶韢訬搸�$L%w辁>f9桖r曁鱁熚3枡憢}V峯內宁#Jn沃O"慁u靂y掑Z架`覑K#vm1�i�?�/;籯;-卯孱V靃髍搩-/GiQ瀞�跚lZ緼l偒 蠔甕i籃S穀巐�橛WJ�1瓙Ig襔鋊誉K|甿)綷万蠒寘靹鐒Q箞濊�/b,N媘]�-(VV袂邬zc昬��'缦�(-襻嬒i/9濆:S舵\僾裏sVX靀叡濽�:餣a夅梒唱�6�艀F�$舡�8虨譗瑇zGd0虄躍笀锡 >)趤�鴤閣\t:{裣傌�踘'�*�9簶L�兀�,3�4O|�{�所·撌Tt预ub�9镝Y[贜H纹W@�.rt费Д9B骭T鄂厃⑤m6鲜X姭宂 +Y塪攺/�屾銹&��"祈�瞔僶#箣�^鲰;烁砮豢\籰遘P8噶硕om撸寱耻 rj寴碫淰`E滵箔<Q&钵*�6#�6伇釂>袧嶶i哜k槔P[厥s帺Y�>iy菊癫⒋fhΕ鱠QZ腄錄^鋦Z%N凐肎\哉8X*瓈O蚁虞的Y}稉髁yq��#%噄閝崫ケ�6/-茘0�O3ce燋8燋�獬聎隮幔鞆蒂V艼q肑l>惘絊鏪脓h嵫}銄�脬T鞶Kz@鍽gr鎙p:鹎盞MQy盈�+q�|讗誓秕帎��0O寃}�?焳/鶎庐麧|藪灢黪惓骖闝�w��)遳脬鲁潤{l�曵饕綷�!�=楚WP�坐檡Z錦Z秸+Jw:苖賫"麗=K絼�#~Qv瞼�=粠!籮壅凿`'譐素韬ゴ:潠錥襺帡 [!;範顲橦w8橷顣覛戵�韧ふj擕藣�躂+阢X9朔2菴�?g衣1du黵灺絁乡兮 +�0��n胻l�沢妰叕頃�=侬秔瘣��隽<9F禃J宪{絃N�k�.危谴gO�閮酉�!�+L岝碜餄^&燋珏M��!縒樸锋8�~�蹖<棕;匂.谀儵x&�<藱橌c[喪棋圀D]&s涎杒斜�0;皮皉xR釰b, 瘆`� +铨睆r|颫�#渼塚�φ-д蔛3[禧sヮ擜Z 遫煐縂堢种潯�=鬠糋鰗硌攌汕I|裤z.耱魒牧&瓈章庇`抓碫(砎l湎MZ}愮*J鬤搩��=�*猪挎nK痥顾覛陀诶Zy桅屣�赜f驕OkY纬P�+[��I.Jf�=;娬衒�/�<姒~F鐐*�qSo銵L-���%篠H1Kタ椻mHy}4?�羺c9ic敶8zy~$期飛w~]� +�>齪f瑖審鯊_~�+�+�会胥浕镁丿儿M�� 蚹%0枍�/嫉]璃鈂 (嘰�31迓7>塊j訏棘綆bQ攸Z宸2和l|翳}墮2�+pQ$螳珣�c]�濈听礄�?押纥$"寇啘M靉妽t[糝G\�5{?鸱`讜f膧]o%N�yvKm袹玵o磡M奩烋� }8`鯨蒺qj鴸卮麦${鹘暓�釞Y怴雔庭叠�8d�9髃滐\殩暬GZ噂S�=郯叺mE鏫�<絘碔q麹矙R:腦w霏Zd5眔嵅>F螅5鯹\+s�k�総-廤?︺边虞v方{蜾x齄{ON_~^� +挶㑇慵';智/呷岝柩M~KG接�� �=0瀞縅钊疰朿塨\h彸�=p壮湙�/�悟腲膅+(�痁騦侩sqZA=mZ敡晀g叕K逄��撢O6�抗s]曹6蝉+Lo搠轚誖wK杔I瓔肀%�31朵藱K夭�1s�z谉S 櫪侍� wu椼黗碩�*� �!慔蕼雔蜡狎1^Y杲n�+Zfk#眊夅� �販_GWP[,氛於U邗m豲?{敪璿枉槦�5琬j�詙瞸簌烇G:7/1謑M镑{lY薮鮞�7v禜櫯V=&]疷�-槢�-略t�捭#l�5[屐袄.� 靏uM孇дa岌(.Lb�:�s䙌�'鰧6荕郛bke饺�芚]誡Y�m7,岝�c}騜>W�>{医聰�4q芊唿忐�/>滙c箝�>瓃�%�y屡Y�喖x誦s�.堝p詴r戦� +Eq&枬F^7迅�驖�疗�T琌眊�(钕貆葛ln-gEm厈Bl迧髈�蚉试懂_C懙0+虤箽美畴鉹4諺皁号甒郦噪檈咳謅m�$G1Vmnㄥ誾[茒�4佞铹梕,[�巪尛fЛ圛穜\m2)褷o傥穂�X. +茏焎n疛畎J?T�蹰倏L膔熧\纯f[愺!卓3肷~�A9�茒诳艵燂`,麥,穯k囌痔X倾鍈a琠-��2蟵:硺8.鞬︼鳏�777�Gec缋43q重械軚�m嗃*:Ρ含筊暙2缸M濤]t俊庡�~i�<f俎g�'W�00�<泠頼,摹!{鬏�暖瘆暇颲樤p栶f阖誯b巗莊[嶆扦h脔漵氨E|T諺腷豧Rw鞘�1鵜蛹Z~��莁圃w噟�1鐔�暗�#Y�$[k嫷與�碼雚|�/wc�-窟&�6A�&OT咠h�!�8�)驅湨�N瓢.瓤0跩遻^缶gvz只境�-��:l�:€K痑筥I駧軰'锶柉w踪�1㈨?馇B弃�腦�>0謼櫛�3薥栫sz幫鸴蔤仗=蜽3jf"稅;窷3[澉眊芳師穜箷w梨褴暶€螃�k嬯"帳缁B]k跀1�沐H汾U骫籷~E雮咤k篳籥_帣tTW s喆�殪⑽羻q�2鄚巕;棗\�-�.*崌UL璛b00瘱p7�卜鲖爽虶幟Ly甃Swk藂ふD秇警�-;�:F蕦lU}茟-6Gn�2钲矶e鎥k嬣e€ 疃鮞>%�K缢Ⅸ茏3俀粳}秴尩�?絳G熠T趲�;脋期岞�+b�6邞↙谙犟X骬�莄繓铰咪铰耎K]篪ω劄)崇芈�肁b�=G毂Eu /��=銱禹Y嵹0敪.(鲩v瘭洠�>e酮-[7卯�c[围c趤1)�*�-蓂朂V[俪OUc軔Ik9v鴀�="^b簴詪s�/�2X]�财轑籝�.蓁�幁�(輼}柇褷�3燧0�)S榘縌M9CG�$趇t謃iT橽s�:5g欦盘i魸 +X5�蟿g5�-槒�-�)呶刷�"驵` +;穡&&�1€鴶ZR/岖∽9�U瘏�:蓛%@%謁�%9/:弱@��3遟+:璩Q猒?R嚉�>��9W摕+L>�?~�鶞氆暠ne疨焻9嗙 +鸨觴鲮[�96R&尤~E礚X米l钩[;m�8蚪糏豲�-痩�2�-^f臎�匊f篆鲹t{鵽e[|岰蠝l��;X鴲荩a嘖�0k,S眔�2�1i漠S瀔|莨oV黇堙�(]腵�?�15闵~0�9寯n鋏�9)b!с"{臯�?泆~\2G>V撤态i�6絬踘媠Φ)��<氖蘸竳h�3y祳 撨�/z霺aN�+�蝼�;(g龞巆�-&漑/軻熍伉瓿夠iP蔺具C~_繗黠灇眫/�溛"c�<�9鎪�*髍菶3椿Xf磬簝-� +[V泺�疰c闡c捉�(楖侄 +;=#裎%杫�&湧煼�+衩伙�6|?��髼�x纥萉櫔^碟;Ft�[鰙{D>�*S浉l竜�锒bWkK麩�3呤'蓄�'序=?;V懾症绪飉伅﹃觼|躒溝垪9暗/3�)Th仿9魖_Y�鲳傳毤�╫/�[ �炭€�Z啊�/榺澒�2濜縍庽t-u/差詂,�# i<娼岤,臧�>�>嬤�芞r�>]<謴蘕魁鎔9鎉+=粧縇�5q|鮺 �27札2�-�({|<鄱歖饵蹻}T懂阃klUr+\蚗棕z期�@c[1続熺夈du屆貂蜢D�觳禎[≥罢哥Hl][痸踁饘|絡�6櫾輈蹯S鮵~�:鯹:绥�7頧檨-�7��"c萭,栧璴 贉蘬毗gS�抖�痗迩s7 +�嬪�谹T蹟>丛i�>*杦�齚-隿& 鶙電I��M[�鯵R[{#麺梵)3東K�)縒橖Xi�0�+L麚i�2}梲.炛�=腯4繥�衔�卞6轛4^鐈,隭橴[<ㄨ|紞0旘嚤�(dM��+鳌H檜�佭7猖糵棴�2i�/#习0�踢`嬒王�-8��唭邟?vr鸦d,鲜$o�;偿霊瑋�="�&鈟<w�=Gs0[蟗[靯爀胯|]詋嚣:#nm拯紪5肺茋缍p~tme幃Z�-渙����舤u唚躚sZ鰧€;p繋裆�!逩T艴庨l,,O忮k�<穳e舀osgZI�翹�a'鲕�=腌s収S娗J邉~��&t趪L楎潂鲩他/�.i�9呦y鳲購暪 艷�=楞|A讁][毡�?R鏲iu�坠{&e鷙 r梻9嫦仭帡)lg鉦(K�媳厊K昱様苹+&舠w3�僽'[蟣3,SaR銫搘€pC鎱賄伎袯�b�锔h弑�粟b�售赲�<嘥s\櫹h坠馟騔钡韘惦ㄓU=尌�l=h鯿磬頠�4s�6G葫�10鑦諎膀V熇鏑�濷攐梦矶^柮Y�3鉁#寘禭� +cu+c!沶鍝�2V卐r咿薠迯E窍茘=肟5[P��:苲 岝烵荴s覈2�苩�1漣L淲�(螰兔�纜:螗櫭献�僂�5�m裺`芕�/md嬬M�3W\7�2嵨��诺鎏=�5褅ㄗ倏t瀘kn�+9坨�"dKi遙9�7�#�輢蔢p@饱}I�始�謮騧崈U沬 e蚙��蜴�m1呖埏a{ ;港螕m�1e>手3f�:V庢� +遺� 欑-W�6稻碪蒕睂e'�2寢��%鹾&�角J侥�1栜闾E�'*煸E�<涳佡Z�-?V�'穝O鸂蹗俨淸龠S�|H謓��豏}7^艼公炓彆�;薠缬e藈'餏�;櫣0娧r巛鼅jZc藣蟾7X郄#�Ds旛齦鍹�樗c绛Xy娏韽r稊/嘂庶/衭炚6�蚀鄱Fn瞬WTτE\5骢滁<<薴胜le�1獩錖乞� +X觀短毉�)迟Q^-VV骁E0甕绺R愎遗虓:迖L�5�#�.銃恢=飍菫�,_g�_j媢蚝Jl阒鑭�#�m臤U傅賑随iò箥潽斋 闡l-矜榃A駎�1窬^%焹幈蜻臻s�鎕疱 9嶗 }p龤鹟薾5V鏻戸�L縀?;庂~頶:�k<�獗~z�__烖[:'寱獗R荦4m溰弒(蠼�+労(~�1闱羭殪�杋�S棵杫㑇�褩蓌于壹蓹T�;▇古畢?X� �嶓欼CV捭_ia.k俟旟]'﨩迷啽T櫮囦鶘硆G蔿Ly轜d!k掿猗+�6廑kvQ檓蚔坤Q櫰V鑋.禸_e;:灑楦&郪稀V�谊陗鍢仯霏杯}烿嶕髥mQ�6�2kcз晾蘂M韴�39畟z8咇硡�>`秎� +_�u詳oC儲5�:8沨c鞃瓟�b侈|F曶ド�/M?醹#桡�烹|�庍箚azsss箧斋鬓<0皱郫zw壉~馲呓瀩f痏考O|wwws9NK栦渊2V斯佗艵靄只砋?;圂珈7於課�2祺l禃秞W�,�[祆裒9几^祍l琇z弙澤鱍\檦]�嶊+[[咺�-幂m卭� Z鐋砏豭#緧薚kK梅拳��2寣哞r�!铆[�Xg�8喰杇e躍&㤘磴鮈褪T� +~e甤l铢晀I}瀺故1菫�=蠻伈)4V積K盪錥姯鋑劰J蠮�$柅Ar`胆�3夒a煽ミ晥[=�7ぢ甍�%};�1婝m}夏緵脁|`洍癁縴7岝�?�瀽炳鰲錦釖琮凒浶巷n/�c蓹蟯_x�偣櫹G廲>O�㤘虄岝6,箪-闡c縧嬹卺謰� +鉵髙C5︼詌!颴c{皤-7i亠 +[钰艖籰韉�秇窟头彿胚菉-Zf磔鎢'����K眹基改l9v咓(鰓k[螚経/;�-骞�#Z尜毞5P[NG鎤�'E8侀j静秦瞸腤往� +��鎝燍�6kl螄vT镜g鋣 ?掯⿴o'螴垓l妃秼1b飰y嵨黜邺媈�&?柱|z篁遢涀熅紎箅�/�c瓕曭�/咭y螐昩薇徹�'[[踰']В潬毎�6l折忏萜掭栨@昱xs翻ks~UrX[�U�l礴廯n~$思K.�儽X�&E[ぜG咩啳MV~T�6l5暭j]烦^m繘驝[3l餸磔豬h鹽秊�5煆編鼂v.-锨,V><KFl�8x紣��X^膤�-�炞槑肠/蟫樥�8.摟翑賱�锹畭�+穳嬚 {V%?鳝练讀毌,� +蚀耳~|s:澽紉q砄_\峻鮃楋~髻莄瓕朁Xk�柧漻旋D鹛歟� ]胻Q,A舧�e鉓湉戣h虅蟮髎噹5I� +c碗l耋 � +鈫r櫻峐W�=朔�<丑窸鳌跋摐纨坙咉趭|U[咎饾狡V幻蝽n褑瓐S盗E;鎦�'}7>栓M阵kc鞾3,簃�;[�澀@sm{针綼嫓�v戌豛N03go孓"�d济lY�!缎cm�3剮誠y>�k浍m顫N匣P騟q熣硛�6煑a,容淃�&c受璒�辭畧�畒s< c}z=m帖纸�/^p燆Fこ嶉屻3濓�0�#�d9aS�牧钛1禦�鑊㈦屛iH�2竣3^鎜猠F:彿薣�&�:穱巤螯y喆g窘嬷笔WVЧ祌~檾諢1id孁,�-w+_�鏥PsnX^)炒+鐦-�'賛西鍄氺f]葜?毀闉0般址饀抵柉或馮辅!\�兀[m崑秎?謀�+骵Y�M+�kZ繖+镔R�祙榤礐鯽�8�剖9K底焫轩蛯鰙G齧�慊緀抑耎謴豸岝翘Xs�)GW怄儚i芋pc�<駢伫佳骻^o�8Lgg慞僺炓錢籋鉺u衮袞鰜�3W轔V~喵潼�)廰���濄%_�=颗顝�蝇禶|疡氋GM窘旦3?譹�褜Dg釿;�w�字3衁 訅F稚�-�4A[3M讜\喂峘M畉=��團焟騡爺i級-顯釸忑壠瞟`縣氹l宥榜4�<馯哥�]沣n�-檕冐湪-哉l5k櫏頩c四鐪5?呥繓吡�2�*oWl駗磌mYMh隋i徐]Fc縚cu褪N6穫﨔向]sf#吹鎋萹肴�<�y癅U糫�m�8]=F讛a瑫媜宑%谬楚!鷄zs:'坪訉鮿{�)鎪�&鬿>欦 +庸卖=燈<泆�)c�跧�/蟽|�586榫锵+�9珴L喵对財�#u~_嵮M蝧l�u^\⿵攇5遢皱俟獊{+錗n.彺為誧湬|T賘癗DsFjk源澌ay养岓禋�2嫤雞{簓焢F�T觶禷l�i[砿#层豩g}4僓笀j嶯cL�5b珜順0蹅铯账芋屪寢fX食氭�:u渍iW;upf?褹?﹌|旷}iG垩弙i烛�:槌r^�?踁題X/㈤嫤﹋澄M�蕮1Y9�4^3_9hV轞驧寮S蒋有k��|$&y庪5 Д<⊿Y3-W鎬v-/}_X4邱攕.錸0宪午8�M�7e鉺Z倜胞@f緿�/嵎誦YF�C鵶V�:�)纨硹梠綹b逕騖徇�W��/熭�蜱��'/杝呫1?檵-;ゞ�Ni邑9缤殖�0堝櫂/P3瀴�嬹呪'a�鷺眤3瀧�詷熆'甯o蕐4d�X妗�+隙驿�)鞹蕸\y葈�付踯7鍄袭�)0V诚� 帋W姆b荝�=[�蛖�;盙c蟨锉cyG|2x颪#�2�o諟v4s昬担{鲛_遏樓庅隯縣&�+蚿tsc娅4�:-筱勺杉砯饀jL潚螘��髤殎� �"酏链e檑�露��2-�'思⺁煍Si,c夊(�H鎳nt讨w匞鰅�茝�,L臣�弻梓岟%,G�1��3��!�3#I~蠀Q'鞸騍崊wz蒥u\k:痩旀耡句灕暉NI3澲o�[髛痸N+g墻k粟c钕SE瓜那怛}�8�勫e31+昘$k+埶n賓l鮯~沇癁楛X�~_灅炳粽霟�'考紉镱r:濼�P�П葵棍xqk痴膝莍2&dn��1}v\旕9+�直#�,�fO�;)^脋诘0V�嚽\迲j0﹡弒� 疂V熧2茰\yJ铀躟�"仅VI谏r&+me笝X咚县pH腨ī┢嵸3+v敦�韟U� q^袣�,Z�端f#珣稻蛽葃笇蜍�;j,K�餹3Vsk傓s泯p=�>'Ⅴ対蠞/辪|}ye糀�効浚o儲Rм>棦I|5崊E臤#绳樓どhJ|c#Z炌E甔t(銝eC胸椒�>[厯琭tv芢灱嫋zc�*洽F訋J跜Y邮rM宫潆T9G�i衝e碥�>区嬳�/{鲅径^逧瑶BCl贡�絾崣锴所f审��1R)V陣'�+^峥淤忰硰�:熚購)�裏菶竀杌蚓`�3;Z杨%e[奖誽[�[隭铌轊u义憊� +�Y[�y韊lef鑓[殅�0~嵄e骁炡*c懻鈢Txc怩俼弃o�-`[?(现葙偠逻﹙矸meV韫Fs荿漚濲櫲<�?樜jr洃憨��2fmX,枤氡_t撝荔F[8畻u憕总酣沨縂��睑�0]Yé慑濘��+�萢#e瀜礒筄k(k�9vX竓�3�顡Y曪絮膻Tft=敺詻k�97�-j$蕤髮u�r皟�b盞谭帤驅�;5蒌�,舽嵾冃>H棩�>郠蟭eo礫鵓尶鱜�&�4�-漡W荗9媖T[捈c 戴3mmr�>*�0瓮乞�;蝏鞘x诉+|�0謔�岝脺会觚縷�/军升�?yqy稆盱鞘雜E薇c4鏊<巙歝,崈�#&叔�5谺^芯�耧x?梈�C*�杆眥拣鸝�oy瞧P轆m瘥圈珍X�<绮茿璨躞岇皔~�潁z崓m琨瓮柦嫙侒€鈯!�y<�>蚗快潨獆钷r瑞ZG噙#�;鑜檦诰�8栒le 2描m�2缀徶VY雟�;贃�[Ay�幪杶>R�涇~){瀋爋俸[嵉嫠繖誏y�7涭求肩匋潢搭K%脁k+�>貹e鈢喚緀 緃�8"怙蟸G剘mG縔癍敫齉�-+�5佅S娴螖}e\#嫙 +锆�7捱%杴t贄U�2蚢谇亊�頼轠J學�吁覘绉t杮5鎖�5筻;Wbk +踇 �5滣:ч�3V1A啽�+艧Ъ�zr芞� +cc瓄洪y`�杇喚�/>鍂紁}騟螝嚐�~>蘩蕹�g蛁�$[e锕屷绳I4�鎄AS�7[灛%R?=�5��>my��:M�;�9j桐訹鍲瓂ㄓ閒祺O滊鎧焠g{w炒7諿�/2>徒I漽�!�_筌蕹頻�*k4矈F器撗 /嫕�<踻��_恧泊fRm-霄$线咱笛 �瑈h敏lS漅|D�7旆仸/癍鏨c灴y禟Y瀃酎E搇湾桶痉绗贯僾傭杇[奚浀 嶧#蠡x眺W赗蔥炤4j[V#蟚�:璼辉iiСb1�|�2~塐A娴ゼ2嫣鍗吗e�&鞴u紨核5AH�=B檡,厈[l瓪馲鈙噢l�$�欠EK溹]挷N�;�:)5b氪�e軹~vZ�坫8炧�忶�Q僸耷Ys,鮖愫1^\~v氏i褲L}ろ蕇8藑;EsS�9� �:讛�(�.秐�7椈囯v謼:瀼g蟧n珉顋�5k澮�Э�9蠚泓锩项呋筂鹹\胧躦子萗猓Sk鹡R溦^踹W$~f鹂Y嵹锼榟y\Q靿髃魅棆n�+<�/)鑇_|8燉>��2��梥<织裱O>�麠鱪oW:鐍�1€聺c锶駵�锥橲`麬煰�"5�)[瀮寜7+C蘀8W’6齱b3衍湢嘉蜚y哲.6�;�:澆&蟝拔~H遢蔦%,贛�1r潳迹牦e㘎薈﹂ ?羭嗴跣k~恦�8W襞俟c谝HY冏�2.琦翘婫肵e�+緮#屳盼1愮癬j;e:P绁,⿵姘^� xV�食e汓虁�9) 蛱Dq慳灣碹柋懻毯€颍Y?h6�)i[�U�囼Fㄓ阎;�r�轖蚸q絽艉雝忏�h�欥H感<揺>緷珥躻f褪��4囖鎣*�徑魮2柼|6焿骁踖凋J�-k扰砋茐⑸譞鎭マ聦錌�,�&1潆5Y:g&;e�9-頋蔴d鞏:!邼遛�7P'�3K轀�3? K%氱捧飋3�-�%u^鵲╇�蛂哊岝饂淄R郄购寎e荻�滪霿�Cm鲜期Y_粷撰秎黐d珖3 纓|煂跩颋鷰蛧壉�弃擞1�臌�W骺`琠沱�?茠>s糟/哆淳镏蟄榶�&kv^C|滆/Y崎Qqr樚媂烒fI8L鵪�>磁妗罩d�!郘�>渃z臱蹽卻z鯿哨厶�8楖彑R瀅焄jg GOe$3嵱桉\�C傻�瀒dm+{�ZS纸r��鞽蛨雃]k献纺��錹X髟�嗅\嚩愮謌忬♀T褜妍恚臆ň=@�A;e\*蓟r酙縆葏蔩r�隨�>踌烡Y顺鼧5�xG�;升j臛峔剆皃X�E.cC糯�&鯖\�.�藆Z哔惑�<鯪C�%汅jg譁蘕2ъ�4Ds{掿嫝Y铐葛呍{�>鑂飖 欈G簉頞骗蹠諛f彧-�:蛚蒶T接舐{S恧薣b浝问,K;3弻珴艊t擙K�As\5�>�+c崈冻�'�尕籈7s�4_氢嫐�轁p鎝虤耴7椾疛隗蕟鲱O用昚y熟曩甐1孑(�+媏纗a5艱蟕c遧紗蘀q尫駰�$r\茌輁~2$纨觚O萖�黠咛岝o)纨��?佩��/w7吤e嵏祉踈"u>e~Bιk鯉��?冢蓂 y崼穧暱{[嵻/嫻bq9禲X紮嬃 +趩臚c紗幱"S竖�瘉鐮p�4�>ニ鉭羭鞁=�N|铜�!)鉈G撱�k饲h�0�Y崐� +迲糶叡丐�G遒g宷U乌娖+{%筥鹾捙q%;摦�(u囏+fk,u穛U}蜄Z镪撼�c篨絖蹈盝霼�5Q;( {椙u�&<οZ頞4竜€鞣授@舚�a�戕櫝玆��%kZ孔S忾盢v疓�=鱳�)1鞑�Iy]嶲Y锵錈�1颫�岸烛tW拆﨡軜>k欦K�=妣k孷f互=GQ鞣貧`攆蒑氼5倒�3误9餟委{隈�1鞲�+�碹*q�€�7鴟q=�1A嫤�7顭绪坞埉舧轭丟_�73�熆�鲭熮�窕作殪逽1����銞s|}鼠�竞Mk悌燧鰀糮Jgc�1| +c€w�3�唃J�5�,�1nけ� ��$v瀼 +7鑨C蘔答0�7:M3旯贋┾l=ㄅg?攝鐇I翺^S�!?鍅�3G�骜='�!7勫n<犗T�3\咸阣珑2恩<W6��cy� �9y蓕d线欨bW瀻/铥R^邋豩W蠐遨臭_;骧翉9龤N�:�.旫买2M�_G瞫>ㄑ�y璥�蛄氢'.��8谉愿ㄊ?+;飥綣眳��2k +袅篒�-柖*g睨n.|辟走狺珊w0攠��)� 姯)颽赬o8橜陝{繤琋3;L�调'鼎翺橑A8L�期r1瞋灰聕>O楀姇誱€s塹 歌碱�钞搳M51A劓覗柋~�臌�譻~�]蠹РS忆k乒w媋=夡�私�*vNG�甮��=▁�<_GS.Y廍蘔闿隹,�1拼�4仧磁z麇轇蚿ゃ颊�>�2鲡�)l馷螯$�)^o髄i耋D�'秥�)覉徥魃纣騦Q褏ytn犃h2c鍽�媠�3胻8�+6汞蚤檈杭�.uzpQ<K?珰痰X灤广�#h廋沜蕼夌蹜��牤�3vq肠�Fk涀Xqf0趙∝译$粀蝎qE��蔩藑遝彑炜t�>艔\�t芘Q]�陑圡蘫螿漼B�<~m狷`�&U'瓉胤N�3碂闭+[塔|褰pck靧Z邨剿�6@扪╀F抺�7�c贝h鳒溏bW�:64>瑅湽,鐨�"2洮�0c烄\剘减靾舱正aQ霵a響砲讧焦辜�掭�%寱�>�K腌_~8鏽HuH~,櫅p�)y袘媓p{�dr肈r馒に#s5堂zlef侵�+鬁卨�&�舤M﹚渿U蝞~>Z畦烧;猬ho族@层n葐u鄒� +nr柚�5譖唠�贤�錱懊驇[��a构q蝄4~緾貝鮅蘷┪[w�#9嵷{�F4R炲UW^迳X裫,觌$寘>OlK界S谲�藡]e崍~h算鑳瘯椷儢棁緕|煵_埘_砱n荾d癠頼rl禂Y鰳稗L冿暷x厷�0\嫼2鱞LY�jx│檾脐�咍瀋聑独帨�__馩畵3x茡|X觘4�9譬.C~[礄醼四+抬ャ遳l頴y蟩Lc獙嗧# k爮�3稖g?�2T.�1偶呄弃f馽=e顔�鹚�搑惍寱r惥|�鵨殠筄/o�?遑亴囐癄齁t�1妪?�.硯��������稙�������冀賿$G幃9譻u2躹w徣崣L頚挰崿RU}�6v�>32<Ws7"sAw檘US(~鼆欸�;H揹f �555誒(τ蚽套顁u椏鼾|囧4幩i更脔S䴔褥奓X鱙褧ev欘"#�.W�uMF&楹黕n=鐱nS柹rS(33鑊e阂�蹌�:玨`=NF錎尸z鷡猺Uκ壧遐�|]O�%�_ul�zV鲬變2p餇'zfdeF褶q�2蓪�=�1銏dv(wiWn渝缬竪cu碧.�娞錌{(圅Xf萪{亴礸跿弪2賌娃襩撾扱{s韘~哓^~.4�<狊IC螮&祔烐鵒+2謘粙藹铯�$<~抗煝眽s�:~瓰]楁�1圩鲄m嶅�>橂sY遊�3韃u ,擕i獄Pκ� m�跤X.貧赁蝎巍茏H韛� c黵5d绎&;驧棿M羰詗簬I_詈┊吇2鐗M活韬�9=s}�,僺/�)~]眐艝幍X茙莙淥倾狒馀撚�8�魑邁鵲��?��囎���靠\?籠颹说籠��R﨣�_$龠碁�o>>�嫠飨熆~绉窞>>項絳_葳絊�)A_群0l�妇秛蛠L{j{](�珐臚�鰖>2(椲宮 +�(f薡�+^�|3崙佀蕏F2CO�>�,瞫U?2邌溁歼仪顬f癳C柞1��早誠G底�=銪�?D純孩w野�1J�"釞澾;钲苯结�.�� 鯴萻b憉チ獸&白7� ^サn,篚<�,髊/� 2C��)迪豕對�"3柦fhoD櫵蟞?*l个g��,啛d6M︔FWZ髬苁!*儨)2�濫阔�W{姚�"程囀Y('杔%9e1� �.迪�!W欞竺r8鍯錩裌妃聟y\�釂�瘲M�喬8.b傰k.镲h祆o`�>愰黿娭鵠�1U苲颂=遾�2诌�騳娓膕櫛薰0殖千摸P煿頴t滱?��&欟9掅祬d踤\族<O積�汌怩阉,v�{�n雮5讅矅kd�葹搼`邿X巘卹�榓铁峾瞒讃u┙V�#^h睅e/呛艶患�c-]醲(腩f籤 o�Q議ep漌]{K梯繢ㄋ蛘廒�2u螎t�拶捶/隺欤耄恩桘�=Y鄶]m匒d=h�=��何<鲘楅P�憝k艉�/3q槵嚱睸fd,�甽憀%^<ZW�:(髏6� �#r曽`蚈宎}t�*3淃篥攜厃�哌l麪鱧敬Id癕7Uf�?踎d�1c芝z撬疾�猃�6磲䲣~戀欭E蟩迢襵戼I亻淹p篒眾岋�<n叔dd!2C�)`�楠~盗谯憣绨晧e減洟XTaO蘕g鏾3V騝删A趭�B.�>瀹祀鸺�[&蔢焥腣vOdyh�]2灂1,3饇馲輀5dたw�q�踓6b训)秤剑駅@粛=圓站d8�$2cl/螱冾y�=趪蕓lc0v/迠g�:�瘇�:Vx飋讁咛�璾>缯��(FQ�\侊$2冐索�/b� �!f惦2趘芸9範韣案~場 +譃遐&2]瑡纰-钣东.3懡p蘈趘蟪�䴓囜�;皈�嚤Mi撽騝K抻y奺,�-喢"哱u嘔粀狵頾?暠€�*�N�7r貑L}U檱�/]Ife洷 +�%�:^d鯪讗錝渒)/>1擨s_矖糗n3g�>A[:�阥縻楪苭鯂嫳�/w~瘞\d騮唨�6黲8迴L枨�/掇;褓锞uz~a琫^t瀱9I蕖�\屧�?o$涌�Y{q}a柷鲊缏�^魼\淈涄f尛x焝46"�,徟�'�2Xe謢娂g梵b匏�?誺_~霺"�{弻=沷€2強=�碝��%�揉c9甅e^V栄~z}犥€{5曎掩嬾赶e-\�>惲�諯滸黶{�藊侕蟍荬}|ee�=崓q眞搩飼幄@F聘ed孻庢缜嶓厤難s �]啠蜑2�/诠寴�0熯�緱箖鰶�(晈強�`攜#]赙歅k蹠�0蕈鳗\k銙鞊F拶c粈费飀|A礭撚�b1^Wn?0嫾3墐2;韥�蠾� 镮2櫛�%�2玀呎鍪X肻Ym蓔貘x雥cd畕嶛>鞝蠎媭�5劓p�1.瀳颲哼笥X忴)鄡+囅й坫閑汕Z霌s婄=d�0q躱熆s�櫛值q米唁莆鸃Λ2?艉/o鍊sNI囅,x^|睙撑k鲬�馷COkl带i�#�"C躦� ~o紾付�.'觤�埍x竭斮戇k7X{F嘃訂yl農淃4萝Wk碶舁臱e]B}趽�<g�{7霝V靉?= +9齿&co芑~�8蠛�%f袴错�.&劶诹3#{8�{:V傹谯Y{n縌僻a绕8g�5鎭�=Wc^舧猠钦鱉笶fn蚟汅�$/蟟�晔Wo譣�q;�9羡牝礅5Sxa�?{彉S.m殹l烔L�(_+襏熨�)eQ蓾b顡<tl啡,囟炼;灏矞豑9褧~v{a玹%�櫦��+�酛籿 +汷辣搷蟽L咣�氩鼘壳�梍飬az矃{�5]�:1諿o=>}蝰[9~楕琨d�鶑遼zo><�w�俭焐蒎yY:�5#_ 婵緣�X暞 �y肥0c4腐臱覷洮Dl訩唤蟔s����/cs蔮=1迖7�-丕榰濯屜輲蜦騲e8鎄烗纡$銔r{%_藣I��-7b猈d�9;隬R瀒豾�>f遃�,鸝税o蚿JK齆;�*榧�<儅�2Y穳�7n忑�>坾嘇,#螓�=胻p€>€9掏侥}癬蔷鋠嬏ql鹎w�&hw飃^�撌s4纂y<l{谰u瓬N�郵镑噐�/�<'2駵i鐱滁埞(Sel鰐_3拳龝~,�=�8揗玨2寅-筞濘C79�2髈i;素哈�2褛駰>j�螘迬峎Y_峰涝/)膣蠡覩=?w线~岝�o?=�盈?8聱眢;o?==y|泍蠝飈� 铔c☆�>>譯迯霹熤3枙墊K陒�2�+:钤锿鵒�1豝繭藉'峙礞篡1河p|矬uP祁Ef3螡淯慕垠2秌"€磸e\��9篂煫�=雇�熧`9虓葅j鍂3骫婨{<忰栒�欖�/�-橱,蕆�墁w0z>纡 +Q涾鞗eQ�/�=n鴤哣勳圬��>轀閨f良�>3濄倻J脝碑C曢)�1掗擶9椥瞪尰甚C蘑喺*aX=娶X乻AqO掤郄�1臊崷嬾|�?鰘咑D�V9:揾齚+7楣�k_�5�2澸S]+=┛� ~�?[鉱B�>m萾亴[O�3枟^牅�>拋w郜蟳<]氚_朊暠R>鶦� +�穹煗�糨х邁觜O_瀇絓+�クⅤ艥旛婜呷� 瑈-6bg/X畣飸嘴茪q騼�薖N&扮~qMKs蛦苔=囲筠胡圜蔓豭�~w%杫#]�)�9~奘Wq� r渔笵視荵K議�蠓瑞{夈y曎�"畛鯾i洿⿻藦谭%�汫睚廇}厗=伪b^懦 +?"7h<d:{V榴�袤飓\訿QlS咓漥?( �0彲琥4慃Sb_�:�;�,3Q瓎啴i�>O^篑G,凕(�靱C鳴e&l獒Z Y渌�j_�#鈟絑b\�F9S�<橌5O|灔L�┱@2襉9&9�=e5}&K鞧��8撶鏞侕&趮磂TN釲褳s�"ω�>m7鍖咃鵕烋Z膣[廜糁O耎�鯀�>8錾嬍X牍B葭吨q菨2f褽k~SΡn�=�,措讐�揶�帇+篫k肥�8���.��鹀慙�謋�7素g碾紀W�=Zi�$�|乙E鯶鞷龈嫁.\汦楃9f�髰�+掻焙@γ禨m[l蠞賙0JK�2澷鉾>矅緀e踂!嫝�憾2哆≈� 瑡v肵腤威鞇�47]uY鏇'�ac溉WR{K说f=7�?[缡ze5a,詤齑4牺I邾M塯*c�=>sY�殮P_a9�cM畁B蜅_疖o憒�2`虤髸霼�ORL�,�鍪X覈�,r仂Ymg譏擃挞馂D蟇�&薫碧u頚窆腦)耄c楋d艼魫岝躏?:%苲}a_<9=�;鎠�&屋伹成[d8�倊上=�咍晆a5麕X缍8穪験�鐬1獶mZ邖(_坮e`-徻$�8帐唾驶眘r;�`�/鮵g竽Y譜炝�z籒H�鷦�%�*c抽g豘楌巾鞖s瘯vO镫 +淬兏污=o拔O俄�递�#蟭P7乨�7?埒/阩鵻�+Z宭�柠�-6旌�?栭庙�gj_羸�盍�<帣 拓K|�5旮橫洂-x躧�櫙躿A髠駠翜%qD詄k淶S疊ta蛧襳>Gh趧\T阩嵈v錤X鉘ka�筈�9膶會畊�,cU铍m� d骸[c儝�%靀kg鏔欔簡~Q帥l�-'鸷m齠]卅 辢饾)rs蝭/岝ab瑆3�黡岝駤s:觴wiC:W(鉐諶?�鼐 r\9�绍4烾t钴鹔Z�2b/鈞腆Q櫫32徣躼�G+阄`c俸 P�霫涾湒捣鰁t.sN癕z顽軽{C澐歡駈萚坘"郰极g�:[�!睬mJz璍�'夳伯諽贾�?樆]M劆6喌gs瓀鰵2f.�3橝麔夓駕屙yco蝙雦畝眈<iY望m�5:?疿no|烟)汨y膤鸼��X椡輲kЧ歡�J烱┡侉� z蕃N兊伸0:�隑嵸a�玫6&夰�賉躽=珡�4�#�4|�k>�;#|%u饇@�醪鯼Sd2_%]皻�韮ペ;渣/蓫�拖w1PX�1/<+>gvg+w(袇2-]-�#p�[mJ�:/�9纡X)VO蚗熅<魁鈏f琿早(鹒〾骢陆3荈椺�妲修菵~﨟&騅剬�>#c篼]迆p 虓樗� 懨躾竷zr鮹�2M顂k+鎇#嬕z?燃嘗`橴d�mj0寀 cn鴔��l3朿�&g趜�)无嬣豷o予賅9St�,受鯝�-琥�6韑�弊nS�炮绯�0鎞虛掴�k蠘髚颇c猋蟆1蝺3t舵儚W)腺3匄;{;l擙无讕螢遷V�艋秶x��u�瀋_r-r槈0f'謦79锄A�枍隺�謄▇甀逜�]捒庍�1g�薟諢4豖尨)绂':旂艪椩粟�=�7y�/d4骨 N襸諮#��M!徽<Z鈗\�8麈�達fR脬绡~蹀O耎揬�+寮矿龀鮘�|X钋� �>想}镔�-沣€q�0l燢y樝蟮蟓�aa蒧懠� t推V孄貜薠=蜬侏�q&�#敞速铰�鉊欚L沘Q�a6�1@\S\�怪�藀t譞37c响Oa鲰逈�;壵#维2魄蕀蝉�斆€�嚤=d,�"郐@嗢=�謦鐁v听伣鳻�w#q煼麗�\g罗虐Z`o�w�&鯵o�7饾┫伉L蛲B踲�'鬙9韦v�/e婍翗捸Y觖轥�=譯赥鮄mo鈖\s�5鏺巴叡ろ�娤l屎片k'c�4�.9砐齖E椖YFb^鹙ObかLZ槐~�0欀wU畋�>�'>骾o虂炔v瀯}J2冓脃$Z鐈嫌�鬒�橋�c%_R狝=�/>h>V�戧�w紊f痿蒥汕Z嗷沅籯pO�!6m薁鋁Oに�)`a玢宒蕻誓鵬�>俸��7鲬i鑂�??議�瘞乛}啡|>熌轜蛻&E{渒苸`#S~琘>Cg檹�8V輮鸗韭躥粺B逅T]冪緃六Z腾>巉蟶Y^嶓环j0Dmc_�悲瘀鸙&�,:`泇输[b褳ly{龌氹舀�珿滕屰dY;畐砾掓拱L噡鎥書{鮝�69l�0魋!G瘆�>萏 #靃� 9寵.筇礃ov捕攥躍s櫪叱鍸 喿圂1觟矒秈8诊氒*k/誟SV罨{吤绊h+�(H孶k濖:>�耘鍋W効U蜗噯y`L3盠鋬j臱pm2嫌矢窸�+胨+�0挚絶0艼唛I6~跛W鏣�41煮O球M鑆|�4�A]鱡�&KT]跮ヶ#78=xyFqr 浫J垌蛱鋞諢/F甶溱鰱g&/圐噤�=�浐<E�e屏彙邛窬忽膉俄j毋5焐Z錹[n妘睖�=邟1m敷N+O隰C`�g鰡W瘽d6l讖豣Qm{�&d屉,趂遞 唨3+?np_藅沑慌锯鉧蝨睚拒W哟w��%fb,瞰(枅墌�惶\剕祀岶5邦詁j5�'﹌忕�噾Og0�?蘸鏹*>%a峕柅鏾>未I�絶z6砺�螄読?%=馑? �憻Ⅰ�>!~注=g4蒁q应]K�$b,媲&c�龞N:粯l}[9V�'й帽鍯螓冿3衍枢\跰岷撕�/ⅴk3�.8�gi軠 隱W�;綧据Xs~ �3毌A甙珉4怽O�钕` �1��1椟z数墝⒕ろ骵璯肔澭蝣頮霠�+d+佾湽e餁.:鱢錉瘹喊鞸� 表徻魏�畀�%v�>屣4S?L1鬏嘐齲/寍_焬.驘n眝耎Y磚纂掲檚O輘4�鐧Z��>wS龓啿毑ō1a鉝6Kを#饻鎳q洣�&氎�?馸B跐笪珧-g`,蓎炗��3禫胔t�2柎玶幛雿�!豼繐R焣?坏噬怨k兠丽μ咏㎜雌V坪爹X�驔袎盧-轂攺蹀櫛�坡z(午n鰄><捝z鋂蓌-|Wi=Q{Sl蟇�.樧j徒€米1_倔>u泝筯祬龸蚞��>�蘛讯��>w椃]娼窷儘 苫�聪c|')讷飌Oi巍u�S仧溜e穌&鑳FnUp炌�H喦9崟u�1ebG罿2�=稸J�&�>��#`7X犧�]愊Z窃d遝SА鯸~赖妣�"F�:掀k�0Q� 塃CF&{靽E{r︺*摲�搬瀁囱W祚灘~绲睁`o閅t僘�峞鏉(/理g�虦嵉鯢�]- +x/腣�+�濦N揨Xr^r�{�歹4狉�|�d惎ご蒎s瞳�磬xh駣憫哔拋髂�屌蠒迁䙌 +瀣'*29�+裣C� �>鷵\凈嬒^澾鳝蘕圐≈摣宔�潧撎2n�8顣Sze澗鋸媽a烎�~^j�-楜B掁5鮝�懡去唛�"W鬠]i.d$>1膑琪薽皱譜苑圎徫r淋=�9皇*萾u6N窸笚阚竑�=覸铣{t�r@0>�2儠,3�/偎璫呄�: W鸴\h\�6�.孶c銱dO髯]pNK楪�5X4蓴菇捱嵵霅軠蕶f豲費�Y慈${4ˉ鲅鸯擑rX4�"镁�6qx{嬀荢?Ks霠}.闩踢5簶15�;瘳筘D馠�捣o萡璑?c員V嫏辱 +鲿鞜C媒狋�)#s混=鏱鄅釭酓玫嶖圏萴闡讂忞� 汴丱�&剾2扦� +跆炌/�rvo渣趺匉d?e�9�9�%敥埂部l<鞣�6氖kbs,悴~:礙x徆C�)�9��!C祌h0�"�/眓夰釁禙覐1戮燀颿冞a]髤;镱nW弃鋏>霔吸ワ6?荀 +v窡��7�魑�鲩弩g鵜&�魴I讞�;瘲晷蝻哬視l佻玴�"?/2��:_ +3M友pX扥痵L謌m%=槭鞪rロ聕I姘克縎e獪摆�/f雪粞跅jO钂��諻缘/�1哱Y颬�.�$砡3p^�2皷�51-�?拔裼憾瞩 頺(s{�%16趻ug)c�侉瀏鍐I爪鸧t�6��Y挖郫{q赱N)?{閊酉弴蛆J席珅h砩�堕r%{⿵巼滑擓�竞<咩耨閜懨絼鋐н�2楒�1,齣dV[荍澧}灨嶬??%=翌6嗽�+}悀'镠鞩鞱�况滚g�?y族}a~鋆(�紱8K_釡Q�1x棑幵�:[楓+崄K{R击薗9S1+饾V駠賅�嵄 啵轎m误稹�zoF辡~�d井s:蜵�>� �囔i引辜儁禮�7骻�;�>椊pj7y䴓4陒ロ嗙軏_t蒷�2蕀菝?麌S�3諕u躪���+髥�;纩?铸€�5�9攇$髎鷿缅遫/泐铗�?箋rz|鹍�]荲�[nO弿w楇q�'岨|楚栫�9!�/爰鸀�乻�<荶訉|d說蜢g�b�>蟉笲版W炥7e�?謜錺z铘蝈秤g痏�{釣?}鼹�8琛�|�嬻傀岢罂擉W盔瘘��.岝�2椳?鴜�2虆S砜晀鋈G唝鋧饺F�"扶夶]�'岌堞┌湋Y蹞鬒籾灩玬U煒>Gi騖濻嫯膓蹀�:!仍yXF魣滛卲�*蟾蕦旹t迺u3]K�9S?[謱踷忴|鎅|y戋�9y€嵂葴%飼�+鬼2噵L�rX櫊� .�橛觜�>M鹙O饚傻虮瑱蕆火澴w予殑}-嬫�!顲檽S沷/s_簴媇鰗侄梘b谌r?輂鬱V)� 賥萖>櫮Yy<曶A芧j{觌坫摃g�蛾8T剿r,}靃.槌恃暠<;み]�=.尩/~,a祏岼m妄t|\禽P�%蟕娇卉{i楌z�-霕*�/mJ飄諹�/戮聶r遙S浮�记誚嚎y}.夫\牦_|N鴑d帾6妁晊C鍹鵼禇肿�橡>幵缏}�:G榻妣�盹*c!阕�7Z巵�.*瑎>蛱忾]�0W�сs�:'h瀂踗珈鉧�8/蕓阶u(单�`S釕�蹚�F[蠞G4�#劤Ef�V���,S�1V|S�<�=b猴�畓r黥趑r!_争w款m頽WKrw櫛钐硱絏_荳镾a�2缟糼�"�F冯罫uj1嚸��`W6譹/{磯䦂�:X_�?矠T]I~8� c}鑫鶡~鸔鏌�蔢�銮舷唿螫�/鱚灋?K�庀鰚銜i酏炐�#淢,c|@洄B厉擓M诛グ榩 r洭=移鐴╈tP頒.R逗屵銚鮆紦� e瓫帵遜�欭^*�1厳銸�+頊旈e虉m�;斶纷9'�;�#�3雜檜飳�� 他"骴e9xv嬏�!�<錟戒滰�7銔鲆苭*飝錭]飣孊阆蘕d~Z鎯i徣群s��8穙��僘�<q泃蟫P緪�髴�/y群Y鷖偓)+S鑎荰暕��殂G*�>K涼嬣祈r,<辗VY�躦y\資|鍕�艬� +揾焄艬v]}畔*,氈�驻翬冉厕D�.}儗%\+鉢鯥钘鰧�7|�恫�皮逕蔡]椒i\ut皫bLU��栏+�:x廝鱬摦!窷r�:a8暶€熽~骮缁緹a}荴菌�g铎櫮涨5澊畁_s?�&i皟Z_7R皑�Jr枀赵痸\蠊焘綞腭磴�壬�;挡豜騙]d襲,媾朕.w礯赊黊5f {m�験�*S鯳蘕褫舩G嶜L鄈萲旉嶨_綼�2�鬻#蒦鲱鲷馀佑k餭=,c�橖X�衽�9�=� M湲qp崼雥S﨧顀匇段屿芹�┦修x刈�)w孶� +X嶞Z�a艼�F坞C�暚⒊r樸�;g[.�#k鍨撘逩]葋珵魂搚w�?^諪輿�Xel>.�蛃�趦眳馢�� 3膛櫢A懪斧�#緅轃蘋&k6鳔�7鲫;t�,阝G齰�1�蟫飄忷if孫c咂X\会澝g鋌G潴胓次嬭<轧 +碖鈩�贠z融硲懚-F鶫鑻弹tlWl 麈範OP}�:.鼮x�$�檉萗�{~m偨Nn影鱹�2热&f趕�2柀��眯 凗/&7Ⅹ=酤滟�V鱮/邭蚐€�3尭骖a�!�愗9軾C8�#Vs羟挀�2坯#9V<镁W?桒震�:S�T~_蒯晬� �3� 诱5;缛輛.茺�霫透)9蓽�(� �0wy+譕鼦衍韽?嚥准�4�/\s[茎擉本鼑o?}蠿a夥塍�鸻蝭O�g芞�?S騄m>�?x�2V�=B辡鈈蜺嵪�/誣扊l钨!伫.螸讏騈罍l|o"G霙[#D啄2籉讨乔禿綁黹s﹔�>聒焮hd蘽�9 uno�%A~�絆,s�� +7^觘節8f�=n42幜鯝�c/b5秅|Ev碉徸驭�)�32VN譢攃_耳9睇0p_咠酂车琨鱬,觨� +肀.遶~诸輥黐分K焤渴Z�澄�锎�"�,!瘄Xs!%7 +� 鏳课^9+轵污y:佁缰€灶@�5Fm圎k鮣譕怺吭<颞&嘱邤蓎瘾M┯ス貥鐗gi�(愆2曊鍹]�/灣4cし�??'K-橺饸\]o€�-[5g�1�琪kmZ肵9琮芋�蒟萆W龌運膈珬OO忥襖(蟊\昊0gs烆S3 �?€�r�:G阇V蠂貄s9龅s湼烲呬"詓Z桦$(鸓豔^�&b虌�3抙鱬淥飏婁谷X杧€�9�纆嚭j巑烷藕�毣哭灮wg荓_榧噠€�-�蓣�iY侙渗�韻i�4e犿(阆祈]M簏n峘{�暇巽狄琁抇良`鐅W蓉省征?崪阩忱却�蠣AN锡-{U�閵X雨緍簴�=�5B�_嵕韋"&怩H�*�7癓摨�泽e譄羉鞋彌k$�l硲Q蟮�亓\vf,骫�:�c�>橁舥�轔=�8磲卉x縮('邚骑④~:詏鶫� SK剂QM緜k箸覟)孟�2皚捩齥伲wT~&岝S�+窡�樽\雖薠=宻�"<梋揩须yPY/�2謆謟9膶RX 鮕賅鎥XjC肃麂[+隢�]�鈸嵨霖�=U�俓毳�葃'�/]9sB蹯�緈d'{O鶫�!譐煼闎�3^�~3箏TV蔑!G擤撶状7Y{7a� +e�<﹁谎觜 +�7鬽@g徔諊g 愫落荣x~沃| {鹜?螒苂憧〔痲狖録穡雲畀U[l�陠 软篧獄�M誆5鍰�<d蜣熥Cn穏楛>琳Wp髯�?6�=�?颣�棰鷆�熷�宽/貣聆诤栯�攭}\�*^-[底a攊仓犦�'q誾)嘔m�,瞲�0T(敐t\楚K鈸Q;Dг�8汎6YGQ菗蕋�儜胩婶�=鳜崒輻ㄌ�5塱\X]+cX┪耎遾蟀醣�!岝洉变浶ゝG8鎨霌貦yI褥&3嫯u檕�2購2jB�=5_W/葈嘃o� �蘯儿2rFk綗��6Ь�*~'蓧J痗誘跀�(暭踮䌷M%>v{\蠉龇︔槸�1\朂|EF}諻T譹d悺途槁鯒邹�;%s毐嚨�:�0�吡�2*[皩r遙謟f:藑鳰岣枡��<�:^�撮搛湽mO雜�2媍�-{`鷃细�帮#z茊EA&�笘踕�5鼐膣Ms4��3y汓鷍lo莑哙v膺蔢戕� f幤蔽礔p�趮j赧恃�:砒n9遶co瓕塄 ,r�=鮙�m}楦O楜5蕵u謣暳:�\嚒U嬙繵�2幷诞彸�ヌ|叢c岽戙嘼撞Z咗LX*縵朲�c盱稤勼�7」瑛櫽:>鄐陆Z`瘍q料\墼`婹弭橲嶇A癈筊_>净=烬験f琠�u�Q阠蠠叡�=顾~,樺蘦�箚LG><b�4Z�a鋬{�9�<�鋼譢#愃9颶隡��#�4g�腣�?�-� 涌�=U鯹椧巷n熸s鄼宾毧/yz壄蔡駢�=齓.蛪?6詓戏�=蒈禼鰠}�麙Je4�谷趮鎥胺儇�6冱R{n�)s�Pa櫸瓏次褮Yko!ю毠孆o�=郱f呃瀃荂顙鼖騧轥喆﨤蠙j廽��(訊纩\浤�蠲魄z泔�踸碼�贀黦磄dn|拮藙苻�跅芨6m�'飼挢^丽c孃鱵2奠狷西嚨$�c蕆艊鉆j0詏B �&t挀陔]}т;誯M襷謕厉灾|衞�,'鵹�.肓��≤沺Tn楌墊靼罪*儙唝�3唏3�蟠�),名斒<#��"╧囅 縻繬loGcl�9 婵�櫛'弃榫 _臃t吟 +擤邉~�4�G�?���1i_Y禌墈=噁挏Z擨�T}\臰t4,勭 觞熶怄郻笙%謥鐭髀;��3俁W∑顉=鐮g�曈②壄nk}[3虦5\o胭襰玐�$� s眳犨9独{ �4Cr騶破2Z�*茬d`韇5哥婗� {� n疍��蹿n嵍e^f9<#脉v鞑�>�胊靜坾僥V�7劸嬓�鳭p.v�6钢麄<Gs|柱F還c朝猪�1xk�33层柁税�2H]k邛P苝娷琘弨�3嗠燌bV鎵}噓巾豔夒X�9aQf5哱粶鋄翹Ff�+箐惊訾N儈;浩墨睫0潂#P瀺pB燀逗�� 訊鶰鵹舄朔)筢存覹頚2翦P}r诜蘀P觪�(z鎒-遳紈蚕滮繯仑踐�0Nq#�7煢殉!贙寱鈚)VGo�u釣�鶅骭惐缦/髁胖�=蠈觞iq0恪~烁鶵)�諦尌歴�繬Q|蔭6謫禈曩遺~犜粦!原嬯p +zPx� � +蟌s�嶽b��9O鍇曉s╣mM#g`隠T[�#辑z绪&5*�,�'澦刘e磣�)薫 曙 ]}�s鷧M届賡盆噉q樠5藕�/掖綉[/}5q踓^峵E哐沮v犄-疂歮叨r�税揠#G|O21称2-{1�/纩Z{搼��8佩Gc�2k恎蹋岇賋瓢裇�0vst雐p磵;鴺c+G镍瑡�cx眸ヵi粑灢�0质~憺规;�=�3�'�=廗洸甉}]瓄摐/究Z恿D奏�$2雡…健p�2e忲D儤浵活?ze弟�潡閧z薨粪勩>揎T{鰕s>/澁艋塊�+寮,寱黊A霙媿�3K逪坪=藱O鬢NuLe�4V-娷$鱩�5pN胧溒2i^49X繵R�3*к栣ZXZ?C鮐]嫰C瑄]瑸#��+�頩WT黂�詺G熩斜尳冎焏螔篬)螛k�/返O晑下Y糅0C{魚m庝iC却tI~僭b^K椯'L柉�=l;湇鄄陫eP踜輈藶盏付骬卿磞'�.徼k}诖gu駲0�5奓��6铣整雦_餣舢壑%z,挥�2阽��筆笀��-]〗€盳s幅](3箏h槁螃.`蜌g%m�5瑤A旳=�6)Dm]q�+譓�&wF呺z簮长N�=踴箰�那纥芍蟻9dXC斍厜k5eV茥�蜯is�貎qZ�鉪�;壉r Ra�+|貄瑃f窕�?喂_)>帅9齒�Xc薠蜯u1[殖@借!�=��,蝓_穟枖驇�蝼Z�$3�[U櫍�尩H忞7M錄%9� +陼树7э\哥x勜%�5�<-��)�kゲL�5O舵q~跉�8z� 鸦鈉PA炾鑲<誮镖�1鐙h��7震眙(Cu` d6漉萧Ap蛁厬Q�0揳継n鄐v ^�65钢瘃洶o��t5鶓榎浯^��#鳨嵁譠疜�WS犑, 兲匂@&�b媳{9驉�P�!G�屦泵邕跢r}�洇�>u躿謱l巪燉鐅o(?�t耧(丩/6-�!媋ZCW暕�r 冘*�5鬝U浝C茥U�%�7Uy]_檡靄薠k籺l诅R�,雭=oh箌嫰D�0趮啉vi<Dy辢o蛇�>艼9�}�0諊楋e?肢嬳os>枮]狰︳鵛渍鞿湳錑xV�9�:N鴞熾s21BD�(灌|中枢稯駕禆瑭蹉�;R�怪椑餅悓E┯�9�"3苯=贈︔R�3� 烓r鶊#聘儨�e�06�<U捶髆�=溗o�`�4騕 'ル斏E椛イ}偟7渏}厛3�=[羢f+莋謎鄚(S�貨2譩�蹞軙星,*c!dma'轺纹K步 Ys耹?E5\~孬g�"�炿�lM寱D��!(7b埏�<祖梜~邎�">6�u簡榑��潇5xy +簉��3穣啱�;媏5`,訋龙︓Em05�€�PNb喬m萕蟾@�f簓e蟛愴�+鋦≡'潒屧檺刊笊z櫧_鐌y哬墰榳�錝G鸰;~b���:VC{銌.擨� u捱Z+棚君瓘暰j7索席?y戨c=-� +扬树唝8G扼p'#'涵/批w次徂@踓髻Q-G�刮W�!�:擽W晛o_壆Z/速嬰s€~3b昚汌rm榆v襏�辙鄐z檡麞: r^F苚(丑g仈y芐旙述l輨8县�?6l�(楥�-嵔F崅rQ]�萖韚苯�凁攀員_�;E�q�V髖茤3�Q崅蔶腾�酺搟.蝆�玂菇U傾苽醰Fc◎(瓷r{|磚V攕髖琸涺,�譙冰3蕨绥貒恬沨局�2ry芥M惂K蠖鍅^坫鴽�.�9v偤i,>�蘗A�鍩XFo*雝�?貶2&�鼤E譚笹� 橬溉謥W{稁徊榩住陨誛聦b�>婟莮|隹灯3�竪聉礲硋廵诪堈修4艇泷pz氕菣本�0V娿}�穱c��貔穇}p臃篦 +S>Vb頶譍杳覝�8炪鎳恵qb�;蒤蔃€無'綠橤h �縀0V漭i8s澌廳歶@缟鹲柶狐|;�� 眔欍蔟q潌^鞾幤<掌�� or 赁��suc雕p�n踫g钱爻��2嬒�+7屪�8$sΥ)郱w�箞x瓋�>渚b]�!伎�6c僵=_廖a�/闛婢G伣!胺靧靼�9:鹱R�:72窙髞ct中��2恴3聆 ?梚_櫆u�慢嫗!臏n巳_g旷,�/�?島鋄労V�=>渦n€�=#玦Ks�靼�L齃至髡�%6囖遊猸T�43桒締UV揎�+4O�>'�讃� h詈餮�3儡跗轣鍾�藺婒鄎�c僝?�箸w劚緔X艼�+L咭鵰;o澽z�8痯絖d�8W鱒87豿G皁讹�.雥osXC~o濱笚e<珁Τ渳忹祉葹賴6�;5飶8迂�=-鲿�#(鱭鏷{� 欬M靁N↓蛷嗵(>飖Y{讕[鰆_W倘跮顬3�鎫舁珜A鋃犀�v\5遵罒鈢34雎8/峜涎K鍐垜颻蟆Q3樇谍*#o賸緐龵7彧欍嫣<尸硕1鬠6u苯沰鲂w8犋D�檸鶣8瘫!嶕躹b:r槗A�Re:+ ̄诱噭酰悕淳鴗{薕驕w咞�If訶_嶢f>T6@O扞礕_-覴蟛腳im淉#詩汽�1�'帇S3Ww秪噛)蟽櫪� ]=癠尩_N蠠轂>玙苲衞閨敝 M岝佾篼苲畘候M?v潸U�7壳�"踺蹸�薹赛ar懵5柬四丹诧�.gO匕郯">獽�9^+'瞰颴㧐{o鍞s< 蜯夲S劬�>\裡荎�琢j�*R櫢眈鳷]�=唢2�#宥w杭?g[氆堻篬龈砑7徵躭W鐶氽孩�� +鱭▼�!鰜^ǐ窚音I密o岂.袇䓖檆燷&O纭畷c�X椵7'躢K粌=≡写掀漆k絻怆裣愴罟� .涸?厇D&矴颜鞞嗀H�.2�r峆醋y]賴E2姻;刏 耟]隤銞�7��9バ/靹棭韡诪檩澂�5No�髜.窡C]0N褟昩�)}齘酑�+�<郇岝犍橘�5�凉穅�9淳绞)+#}殒鉵v碐蟊曘砈牜扮鵆鳇Z?n鬋嬚"\楕J膯�洹奠崠憹洁毜缏俫m�5t&�3t墚:g勭辀{痊UW`/j{}艫蛧趎�经L鲊但x哐�-]戮b�溄懂.∣ 2�铧謭锱b霦�6毦j鋚卷ㄋ踓9�c廾~r鱥�6袳� 2R兞祄kn膣l_<嘪.{<嘗趃 ]灡夤斲宸8�!樧垕x_h�硢脄P韚雷G偩� +� ?y9�-慝屜飽�%谱L鑺鞾迚驈T棞5瘫=yk�4秞X帶泾橗YS擅�譥�h臙8f�3榚L坍踌�檟颽��=颢7fT&′c�3~騇鑷<W橁c-澞X)雐鯿黼鳪驦﹃�2�+阫}G]x謃鋊^l�0W{t靖皶鋛^泝躛�d鱣芐m�{,�'瑝€阋傷m镉m|):�颭�9逐\c畺�,觯P�1��3袤蹂e澞�做�`凳`�/2XS萳报鍏樼剞V 蠌q 诅d犗[5B繌紷螌a�&}�並Ff0�萹�釖�9槪顊嶯姑�z�蘟Q�{}^W�9櫳墀覧u}憻⒊\�&20p鸆�=Y緃�?眨龉X灹(�57r�兰u肍崔i霶蠡� �.邲朲 �!╉l/b昫#噋Z�$y[�箫'竞;苕�,塭bm0f欂杴gCv阦骬�;鹫囻Z護��:�!Y看旾~瑪鬄j愭oB躔寱隂�c�3�雎縱黐敬5恜l[u酆瓞(緊M{�/{l埾7涔k�$NL鉏tI洟|=�59]ojO譏�7P垌3蘄夵磝�*�@�=|_z�/鰸鲁U虇妖E9�7 {煊秠9q頠溿�3罅�嬯巧yQ9Oj芧7m�32F麙煺貗貹x?ホs`�/衭摥w05�麪啪�木啈~措:雩VM暠裰悘戠Z��9b9鏃k2;庀y+挸�f?��飛㈢1��� 忺�>�3冇C2�2藅0渽�朅钛魅��陊� 嬞9u=xp�;牡s鮍璹@鵩O逄輾棔雎Ww腔蘕雦炳滬尸?濐�%�%寉椳^靂鎠A乜m祯v蘕�趮cH无豭{鶹褱k7閨鲩蔢)�!+�7M6Rg熃s莘蚬聰鱣�(杳桁_�<L�伄惐�7�莢 髁Z蟹炝鷦{)遶fqe'婀u�磨w讎鰝\萜~$�拌 蓪增(镒砈t巷!Tf4飩矴箶�?敉+ǒ`久eX sz9w撠㏎渙Yk催h庩Pl譧莱j6细U兖钦D�3_媒韻醅氿/�1样2>橍猃筭u>苴]�疚涯}聋�>簈豉�<\�浚c�#淃Z2纯牡_dⅧ�x縢x县褮��5~>E惯雦剓_魗椄 +�e㧐温�/管w鈥 YF�!r顢棻9偺��! 鲘瘕A惲}δ +s宺�7上�雛%9�C浱W鯔v,臑7X嶗F鴯摩產[莐毢�1诉擨\搄惁oB烤0V是J醣何{蕐�輔><�w暠乒皅溘蠿j=k�;{V(噘蕻��曞#_狉Z_�=1U=眔脼烻?聳禁膲G郘飓哨\舾�韠&j{#Ys'bF6,3Fm忞4X{� �4氽CN�t挢髃y�]m�8宩) �1)C帠A橕H�:泔�3B萖�-告q匚萛鄇o5�5�=�l衈X莐愺l伣�S顙k",�=_�堤魧批N蜌滍豳?怫搦�>领'H�3巺雷k麣憑熨8趿絜�:�椂垠!綺��#7曾髺病笜緂禥v能狜踀偻�2�>䴘|)[j竞綗颰洢螇_� +珯�叡8睿�+枉 �>湩價n-饭C涼堖貵�斥6aN撍g軎蹽壉^B�"� }栾�:�芋?齠蛓镎�+L岛0&纊@搵�=4珈,嘐{�(庩舛#q裯r鰀^ssr靏[1�騵c伎柦嶓鬛6祉{贷禈鄹�:lr焝籩Vr�<琠蘾蜧P踤}�1;m氇飄贰喵.h鸇L住=颛�5h梐葐屷盐辌伥ㄦ鱷0镝x鼷�7@鐠甧N債c�蔇~,鯟:遫]O7j0�步h�冢=a$記�8�Z鰔O�9 ;騪静9鈞^O嘱圵凣mN冞_顎矛Oc�,�5�3倶齿a�#玩鞜a璈W缮W�恊"a?�]∣b,(�9t鎀睘姚%譽(m(髦鱟mgN�q��S赈�駵蠒鸷騩尞犿r╊栁���蠃忛\釛餄S|r~泒戲~E� �/�"浕a� 薠�?1髸矴�+攐乲Ξq临苀p6坎厱窬.<b镶m�3柌撓5糿/侍爏ふ賡{G�畻笼E}錢W_芯殮黊 +�弲~v篨&n诲秝 s鯘h槁秲響=~�;鴜圇樺~\ �*ct俟≯艺麀竀8哉j;祂K梞粡綐㳠�3�韜禬熴��.笹靡|�签顳��;�:陏芩c祁)4_[樔忶錞霋颒瞥贑湻�雓秌刏 =氩攻儃磄�7M灴雁櫥unQ焐wwR霫9 +螯羄樏襓枌|S�坆Qvn�+?兺帝义鞈\篖鼡t蓸蛇+�=鎠�誳B?,c�$弃蛥别[:圐�>酢Jn`泓Ko悚√爕�"凖G�+婄G鯴W莔禳�x嵆k€�#�9娱"畛篺�3k殁55圣p,C鰐N扮蠦{f藙m�6q�褳秨庬MW霱V椈緼cU哠@n�-罼X犿睇{>j�+�9f��縞�7:幫粨邂nooj钂~榠⺋�nu咃jos6�9勥蹟y�轜悑逎{譝�9ⅰ嬬涜=浔谨餮u-U�1槜€批騩� 葡馗Ga賩�34氇挤�.饙�.�f]韒锦H.�幍暅*骨l恁6I}猀y�験C醾幑a€o��#V櫚眄麚o榘滛S馇嫔7f,蹽&�%飜�+Q緗鋕5cC蔂�}8�/塌铰蘕>/~瑥4�?�Ef琠�j�&t史"邉苧LT3�餾睱澫囡]4��萕=�%}齞d溚`酒|N&歘箈N燀<l鷄22*ge鼩は€� +s�PWO齚el2�.髮 3貄W攱�;闏屈�+5�;U�+��;{搤�+�sW�5t!俄!蟏┋@篨.b0Й�/*k3�!纉,�2*荺叕种�2犓迹蔒�.-F螠�,7佝穥歉�c}餾筠⒔�>s|慷嫻巆讪巳悘��澧=忬�1;A虠筧e鹩煤蒰f膅涓�r覸9��*g�膣@磭gf�5逹te栙i綾襑鞟瀨踪�9岬誢岬繼萖 #鏾$蟏K僱料1椨p�~椂�<?姊泙聾椛%{汱锟a亨�诧碥X眥靴|:K腼蝀熸汄)>欔F<�;桀g�鷁邙(�鸾屴#兒镔X郢W凯v匙娳摧�罱.�/鯈>�=g澯{�3�=7茡�d瀮刮拾.�/�1髤喝囈斄ws{隒廱z�}�-{欸⒐閁W3疤ü@l犀1ǐc{QM遪a5韲�ej"腸澷0Z嬞飬喠鬁�魐s礼嚆� �c浨c疟⒐�V&銾b9胔飉皽迨橎�=C詏X嶔寲乾滣2鱩�瓰謣焛=cG鹯\#�:義岅E駳蒫淉E塩擜妎塪南�/�PFxg,齑蟝�暉猒厁&3蚡�&3鱑铋U&s匚戟u[��7犵Qc妅蓟詞�吞�q<殉觱緩浢[>,绣蛴鸉nC`/�A{:桾�?�7�蜓�?/岝?蛜X/^<>�喻簎��氐俨€雓zg1最蹟S4v琐h熣�?籥沧`�(w⑴;獐7秱q辁妡漒嚶躢Y�"&�rブ眿qG�0寳{`豮舢]j/贴3�庿娤霗綌觘呦佹B�-4�+_W税ZO鸕�純s︻梘[/Kl礿�>鹙��萅�-W�罨她a^K=[P�圅��V鹼o韚義铙鶏鰷…S纽倈Cx��髴�;�0#蠊�0甀筫謌u觚騴紐�;r预悉r&q'>7�7枦���32�37螻祁劚詶�{ⅲ21$廄,SK鏧d氓鑉f瓩e�诖.ⅤH�*j�睏j�f碟�4逰5漶璤!堊銍維\a諙賵橛>齛Q摔渨�~\� 漥7<澉 +�琪縗� O?Yc吷彆蝜'痼绻铆�Ц�巾肵�蜌:呯�,飠f恮分�0rr虹峵1訃鰒:検\它場�hX��2渲b�1�?�.螂;�帡3l恢V�志 +昔卶�歡柝蓮筷O t�5�&豧]<czꊒ]稗G2�0u:v齛^WP莁KTkR'晪嘠M劏VTЯp邖痚嘅0剁鴌l渍B呲蔭 sCu偠;{饻泴<邝烕}:柗�=噵酺蟉痊姬r�-萖獬亁忰�旃陲鴓XNZ�sPF}楦鯤傌h/n/�_葐�'x粘~�&艚I嘻Hm檈虻�鄟�i�d旂鍪t繵挓祣�诇釓flH濻�1矶躭錃9俙筹��32,壮.ob{竁H�庡[:﹙C�-剘8?謟犹X熆~钲k韱+瑌蓱�魄Q9F婠��艬]懡婪ab蝖/槸魷(� LLw轂�鄂u]f幠�=蠩�6s熗�1鱃髆�錁礭勇馟O隓`弝�cr兂72犓�6&脈薉靹g砃瑡犓p_�2蟳 +tQ刍1`溧洴 䦛插珩`�>%iW4�糌v_沅邙嬈�8秨k<﨎{澼S魏艚�2�s憃鸕yT]狭縚柍咶_Y螝u,S.r�:l�� �=�9B鏶腌X淔銒澼蔠汊譱袃~瀠&9b"� 銯岖+囧PWe&�磯yZr疿跘t 僊�7蹒�>V�?�/�6[G滩L}绶jeuk沷8訕耨*�FYm鸺d莁+Gg艉埥睴~楴囥^胨黩�2+褊w_斚&艼咭y耢I>Wh釴锦怔榣酂s2c(銄埍"]腦f~淆涭偌^慃�x氎浌xn滰.気堙笳F�-�"窡 8,�O呫壉:蠍�=fd\w髿Z齄增望籦o鰷甼芊�-湀\炰V弁X�7�挪q葮q蹬t�8烖ZIc擸镳qq;揠�s\ǐ篥蛮#恠擂��.幣{�)�輈稠]�<伄p巘齹杭L訽5梿闞刻蕃泋 k趕q迯`}儨醚幣埘k殙焄羿黰敫6k"镓��€_uF状7<閆櫲�#d]R掘鎛4鹾B];�7�:c逷К衮唠\j賹c歧傁庽h甄2kL錪n@期慚�<�x]膑 +嚸镋�&�'壉尴岝愮 +�/蝼 +蟷褓坨遻qz秤磲X�-蘡邺 w撶R'G黡|岶&幩诙豼Ge0紭un} '尤罋)cи硑.�� 鯗�1▼騴y濨v襒�?k剄g鎍�#頛粈澨篳No孬sz鏺oE1娙^齨7撅h/郷cob{vNGv2隡僰#{譌�_義猁31鉧e琱�b瓢i{蘔v/枣^wY&�"凊<�韶箯��8谴柱h�&讙憉`爗孽拶靑巜侠氩蟶2簻孻/庈聒眐蓥\$2�a�%鎄謜彍奉裏媫疉婆蠫{頾莜�1X�萦q輢x>�;G迹6%{�2XW凳爨l#�岇!痑>节觶鵝焳r鰧.葖4測慪f鹻罄s躇 nq弎W媼⒇ �9Z鳇囟c讳浶/鄾�)+q蠧2肿��$寱茎篁儆淕g騖蚠sL�42蝃xy.�26质2秤艴替�c=綸�饬!恞kVt皖wm災廒夒超檙?處鰘曊�2鸛謔w瀷蔐�/ +x圪�H;>尳�>痳牦峏M爨讧琭锿�-蘪`OX`數翝�+鰫�&e_��.�蔇鲊�波y~ {$鮑kL9� +d炙2G4附灼<纚&涞禱l颺rM^筱嬿<�>�>雑駅蘋v硌����@釨�<�窏qf�)璫x�s�|�渙諐�緬=�C�2|KI阱围軤=盀!ty兣^螊鲁 衝�7▽第鑬赘T︑�._婤砉飴餸謆隙i*9醌�.场|C蓪┵�x緑湢U螏晦寔 棁u�3V�3V訛蘿增�0V獰鸷|:裣O臱)V鵾吂>謤龴�;壷押V�,撤雋Y痻MFD蹫=�喻V�镢;矅隠/I髎に香眔k[&痫 �.蓝s "X揁�=樊2曘茍璓u盹%g}�< 愤b钣~峿#nk╣�)cq}霰�:4懏�>驎弊摻申婈彥=蠩2諡�!��祀嬈!骳$脇�9[灍錑荤耧"頖Z2嗙喼劂組{�漩S貛€羛险f:�倦p_儫骦髞;;E齋�莟0_�=慻翰帕皯�>拼謸Jr兆Al蛤莂�;5�3嗛&:C�+g v枬笧壷︹�"擲遅�9OWj"$A鶒窰t�+�>鬏鋟"渝w|\N鮸/熟糅寥Xb癁哞譞Y�>�"瑁�2巠遂霿w騟�#爩訵 � +�?`,柋鎠<��63钟煖睊铰攺�骏3�<2�宜螣e鞳cs\痽>灃弼r/锢咙頟骛<�/?達滏锁╨<6i墀2镺YW���9K遭鎴酤讁)棳擕{曷5p壽kRK瘬gjw戢tゾ襀z+� +嫛LyN轺篌�娋C~.�喌嬉WK�=孢慻蒶J4嚊�zW8f矽#.ge�9惡�/釡a蟠(棪市7.闥殚d�抩妘駓瘔謩豨@55 +茭B鯢僰淮響廈篪銣m菝/猃y{悡-堤d輤鱣}嗈�9鐭C卶咘wv澠聭�9椖澱銄� 櫙癿薩仳鶐r0f白埾赠霾滆翚圾飹�9Ov淭?鼿g� +?Yn^�3泌k隉鎆Xp4鲡:�;二倳�W瓪扜媢8W汍禢胉鲏閣rm*�A鳁��3呲4Xf1~.8穲� +�=^謪嘕m雥祪玺曦璧蚗{趯烨����.q秸侞蚶且L趕�5矖j酾o門弃颛a�?~鵺岿瘘�/�;酤郄蠟諼熓�4翵耇鍨簖翙c盹�5每'褤龹更黿x測l,��Z+裾釔t莓,Px!睙p趾YY �i<炿梭Y9�6�=聡芩,<St!�掛�酑d實MNI�3噠絿Yr9纸擢c讲炓W楠淯鷘(浚k{遐�圐跓bW炑�}�^e謐.}7N+SOf>鍅萅掮潢B魱潿惕諹�+腮2鸞熡倊�撈7� 疉N办oI�$漁捐z堓鏢佌橕LNK儩nL埙F椃g隢Y顙koY]臛0d?g�=W?抡2圹g三9N�!a耮�橈yo�2萣瓤靏E謷迸��銚鴲齧鐺^u豽k�`)嗟淦"7�衞螠Z�弪峳誡�6�↘陙鮛r澃V枒-鲀u��M汮蛣E厣蔇郝Z �.g蟫眐;鴯E椩M|u{櫑訜{汕俿嚌wz轔筲e<袤iN蝡捵僜f黦`囧秂f鸐黽��=(3艼鵛煐s�潖��螯��/葵潼�/><;蠠羼脃牶G�<焈笔(k$Yfa悾�Y遵7$坪�;驂瀥�&H�#\晘哃P9`>怎�魇}!c4庩7藃徘3]禮t%�;柖W枔蜁�=}�,筷�>Hz覠y蛠>X麾出Ub,`謡2洲3V贳叶A�'�:�3*}+躦欘蛤U�5莴K鳜.o憒睼�5\灥琿捱k�p稇|E渰弅%x}F]�7nu睂覷}S摀颃0+镽顩b]#份闎nh�2~濧鉊鯟�;D?漮讀E=熅派�彮䦅�-]媒t�茣弓宑1�碂侮EW鱃蘤鼈�0r喃€5H趰遦�:�耧�:ft 杝唊r曢&縙#7�涓m囥u}鍇�壾)z*際蹛MG� J�械扎 蟹浇看捋:Vf鄚j矶'緬禡晠绐踾;炎懚s趆禽狑蹜徿�f;eH毐蔪溗丈���+豕郧J5H奎寤刮拔��?�<�鵒_溈霑�>x�離8糊瀙噐嗗,壉 ce�[攛▲y目%zf鈫炊銠7aa琫睂�<П蒣�7洈穎d'肵丬_楌崾吪�Vt�6]8}p�+T�%燌孕瘮趨ka'1�9鲿pf鞢嗑�4N#�%`郝毬N倾c誛�)閽~輧�2]�_迀�1\鉉牅塽~�>蝃载灝oI鎽薽\j_ +訅瀳闇綕庭�1飤籲槵o籒eZ��qsD碫�菓l�0烥S坜`:�b�L紓s{偈1~+S�/sH鏲甩.矣遗鷲崵](銥Q挟PW� +j鴔花�0肼䲡q_cl/馃�g蠾闧徬]蚬8�庽嚰f��?堽Ha啃Wl胭r�Й忶 巢觍謙�雍�CjK鷜鷙�篖m吜r財u�2R蟯桧窚週譫�9 渝�筡S>�)�-腆婜坿#遝户冶i鎱~6限}籩$^qk怼.瀲葒lt�9a�瑢暱a琠]腚f��?�<�迓X_�顡+L寀{辑q浈|雐VU繶�耇3淖媛�蹒%v栘+�-U煱嶏万羠_�Zl�櫕� 拯蜪�-2桛綷肟I慌�1h蚷湐硢�2w&�)c|SK駴塵柱фY嫃J焷疖辫J鞅搽眗鑞廜驘暠務J�缇苓B�9刹Lп槒�#巠敼筃胿憝�柋雰嬊;奠q虈嬜錺�伫<P邿鳇启9囌铢b{UK駧�)Z紗r�蓱L|想妀WbY:8\訢p6僗从禌b銎5顋$� 8薇熟4揲貜e苉1f��<棚惣稁亇g1畿鴛qv鉺�5�吴誻�J汙忎1I廂z鯫c誶bO戬�.`攘+苜軀�7%聿2騦鈔G��5G�5倢=k(,誻q[�,)蜧[c\瀴網栭y鼁]膖酵侊�<cm�/Cmbo� 龕�+_��>;�髈><争絯�:锦霫鯿I災�!/=b坕RNXe �0愥堥P�$鮩a蘄耷zM量O{�;撹Z痷齙罅驭禪蚣gg�P� w褵鲞m�8烗珇罥譻=7d�牽虽�n7[埔{珜U鵙s}烔�髄惴怙c縔兔dm彶/�-rNr敾Z齖(3H>舚 O唠N諵撤鰉螓飭.i{��j糛鴫d8瀰<�葃{s}w秚豳炊鍔3X�9?琄鉓栯鴊歔0嚭孨夂H.�枊�?%�1钳蔕耹唴�?bNi.瞺82�?諢j|羱�/2黰#w�kt�-%`璔兰喚g{6+�eT偏彚z蕷祅�#薻�.al擊謣顳�#�5齆u恗k\橕�8C鯽\兞岂嬲O0dKk糙芈P}濜m摵鲪y钦|栳�0俞荑苚�俳郢计颰琊鵷H岝粞弃Eb�次�韌9琮穇}pN9`o縷zz秥肴�2�委侊尸�+篑 +�澄止t┚-a堳爝b伍Y队髞,3�旔�栳X鏃9櫻騉曘距鯌t�8瓆l铀-料愊驸s犳b}W┳b�1浜�=鴞欇}騔k螙魮璔蠯<呤E盒W憎�7a錖宲K�(阖)瞩f鲡�ob徢NTo婝jS2XC��3誜�t5钣是r蘪啀)�Y︙�湠榇飔輼j螜�>��r5鷷豞寋愋�5@Ln鄻低嵈��潺蕥馽Y骜鏬XF�4.幬|X鶤蚰#]鷁T弃�j{\锚�.苟+U� ~溢燮煼嬪�1辨唅謀笤�8蛒邱�>u�睂戳0�?�#憢黃銂`繿扃绫YcE觔+8V樉7龂o>⿲昷�'_殀汌�?る�?\�1_n��岵&旊"3�?\~飮私蛛r嚣咭锍.#w鵾e睨崧F赭疀A譼UW暪麹诙犟鰭n褤e�.遇鮺C橯tゾ�韏隁冀赨魤Lj{_粼骱�瀟溏T鄣o�檘禉�<膪恬�>u颙�+Ⅶ巠E鼮;果桕3旈a/瞻讂蟳M9磭孩9冔$�1�=�#嚇^K椛彏枚s湈�,驱审u綈曆囋On畨槶%硬�%S韃懕虺敕-匐侯!'{祴��1�?縚慕H�隣潏獜结w蝶肱鞼嶤,媸峋��秈jCt吵g|亵頤 妤崬o僮ヶ�恶=k弒文呃绔阖沺杢~�2.J畖g�"舸�嗢吅3�壄v娲朙�4鯜捷撎髍航�9镩\狩萖蓮鯂馇摋鏣�41Ve堿�:漎鄁l��p蹋揭�$n9詄�2嬮�X]撜�嵁洩+1奂莓n[帆� +e聗h东秨1簗烺�;��踑踇媳鮸z婷輾據杵粥玫a烦q孻塞 |b�4Fo]C�+麢;�/坱輅坩鳫d/脍�囤E隑に骣爱Q飋锋忯楠6}瀽�'y謙Y靟圪耮xNd呔诱房繉>⿶仭硌^ �5U洿~豆鴸d屚:7�5鈁/沐榤Q楕翋┬7n�醗惌P硒 壄P婺箒u閦韢畫摡lr予劾l(�5謒r �*�;毸鈣逨耥@蠏�b/馹噬_&�?汵.瀀筫�?莣@齪蒳>圂癃�e期轤l鮔?祌!鎛y9胻 �戶茌�1讁椱 遾篑凓睈本x宄�s蛓\贸疍|y�圣� l裠'鄟U嘴競9抨B恦蒽琇╧嚭謐[椶Щ侨迧曢:o�0謴�5坪坪Z|轵�0麢{lrC�(��庁Z祖�'隯SW�+b��鋮�2]�曧j閭貅Z踇|ht5刚祡媮w*s?瀆b]膗⑺p+2╄ +�uI璫抢�.倒玩貇探b�5钡�7橻塷蔑$o況驡=撹0實1n�5D^� +鵭`縊烙Q寯�s�*G赧�0ws欏 諱@柅1泻﨩葡br,霏宖Xu媜低膗遒Y>氻��$�?⺗T咣}鯜盠旎W嶳]=蒟]鼋B瑼鷇�&舣匏�缦.V/.鱅t鷸�;o?嚣X⿳讱u�N資�睝澧�'RS鶟v ]萂櫿PWg�2杳r��3韨�](冲熓2�r戹kK楀f,dR汶陾�.埙柋X梡X趣f瓟y�?��+�藕�k�?pHl洱GpQ磣G篤>训端鲀c鄲o�=稙ux�?甝oか竣k鐄E齟貄僆镉.鲴揠�讠\7_m椬妁著铮鴶牒樲徖w籯閦潲代t~屹鋻�:]较籣�筡7Y兺V畒SA<�2 订泌`�&<-圭车 |誈倪粤納�漩盛澏�蚀�栙K钃n铵];籵岜+砬9姽緄悦7�?E�骺�龴稇闐$畕珥g�'O�2镝趰q√3槢S鈭(#k]训k�2yC浐4疯^簜�(疜蟮P.鐩U]q帟�5俓牜Sv蓓|轟濮%'yp(民?評偿�r闦簐F五Yu=滃嘄5枢;f鲟;�勚虋t閧韐k�2�;�#‘壕睖嶉H.皨颹駢 Wp黸+唝u~{玫9�踘M&角躙纵k�r褟d縶旰W粯��_/>飽忳情j碂pCf� 叱�26绝r潇\Z�[筪蛶鯴U鍽か�+袇~弞嗮\7zVr�?树�Vt踅鷠vl�2斦厎!�;义�c9r(�7�>g剖c鲬飃薬嶇z#2[{3x_结� c樊#?RW険Ca瑥/寱r�鍩?xP艼簱峵�1珍J� +�>顾筧紟F譧舟X喿鋿芾r髡鑣篫6嵦B洅w~箲�5d�u冱�*7抃慳査r恽塥k_鍦L看mv�hb洳鲦w穬\��*c}礼�-=桬y+骑<厃>C 贁唱湡喻-?�=空谣1摳/�r@肎叽I篫q(櫁攎�>&�>�墨鋂#o^泐G螥 Os�2蟄V&顜X9�'3k舵z镢暤���,叨港0�G鼠nq]躞�嫺H�/瞩圛#�9i;�鏅l踄嗭辫蛱cs(�>帆鷯�&八藃諳%湖�#bD颜[]-甤]禲3N韶鋆賥y_憥q胊[Lu挿s@€��$=]鉡黊o锦$缂�攲跛_�:\)N蒻�&羰9�遇睜溔X98鼵�^张缲瀋櫀.紻&nwM鹊鬲廳悰狚]9帅篺悏賄趲溿鋯堄"檲�6�5�8労腾]��荐睱$贲惓�鞒蓃慚a'�臻@9>W苧儜�<蒁il"�6畛隭W|�蘺櫑洭琇眚糩恨剷筂�脂烘摓;Сq尙|踒�rw}恝�柱倣�鴛〧Wm鶿#�'qG�垅德O紗��3輱爸侒u雱v=蚝饇僘�;!6G珛|T扠�2Q_4Qt醣�;鉂慃-(+迯鄀�#e珄桕;澝湲]か慡)�Kr_��*c=l/��0殖髬廜O哝�_軥�3玢�5抵9笒'ずF�湁�<.洒{耉诋8幷S籰�-鬏P�sd盏胿1z]淀齦干浍Q踂啽1��3嘔慷鈬c@篐f[qM疜�17� +遯籲蟢�椰€2�.Y蟈&訳鰏�m� ]轿[朹�.f淧Nd�,蒚籟�般忓謠s娼t齲箞 3筝僶Q�!dfrg蜼~秭4�>嶌3x黗輅驦;峺鄱-禲 F�2c�鹹7鶘|翝�)m站�瑌�5褙蠇5�BeW蓫vE辒�,�枌�籚�8顨�m驗F蛖迈結Й蚨vx�蚩o认T趶gL�r�:慮曠助�鈢廰庪H.歋e填鴻蔡絬MWu檊�-|徏gI9P峰浶k琾颓z葴鳒弖岣+,~�5V�?1_蓞� 炝27褭竼.SbC譖婊X椣舊罨慨!<珖y銯棲另妑噎L�:d虭� 譜�1稔Mt�.髲邃€I�y�鯷uU浿�鶚醊cg魃2w咝~D|诼(蜣E{da檜魏V!跅8莖槁樢蛵遱 籍�5�/}"�+8鋦:窮5�+’&扒�蟳洭�7耕峏欂5娺�]梥8rE}躕[O娉|挪莏萴rk獸讅x艟r鱝e敵�魒醅��6p絾V蚙胉e蔡閽=N甙塳既H-��.�&旁尻+�魅58耿嫎臻�5輧o@纚會敵呺7�,$麩陖>賽c� d誕搓薝唼U]~蟫挺�;2V蝭O� +傀房|馺寱闎こ媉鏈鳁鐆_=?=鶧+0*;醭�']餩Y恕纕5jNm鑒.邯鈻Q��"鍧H讜篴か哽�亻Mt鵹跆ko援v~ 镅4甆 陚J兹U閆簣熓赲k +軤馅�堐e隙柘F贾添)L歭頛�4�(义郛聿|{]楓藍>D]淲%䲡] '1,de�&FF婭-遃��謟设�遧_�c粂杪�$濟�K鴸钛鹽鶋}�.>oY�*祸尸鷠汧�-�0� 簎悟4尞�.�骞杌v峟惟5h蟕�+L!k.諡玱5�<�誇曤g拫僭薗嵁A�,闭q<梒覃萟熬燓糬A�5恕喜嶬#稠穜孩�柿^�<壑�+唑铰R凈粽;}千�饹/�?褓锝8絰鲷�,昵21-:g�'埖駳[u軩簜骾餍�(藻}O�`邎�.鲚苘怣�'頧W�赬� � +k&€.磜C簔�帆U縰�&i��盻�2腴:+D虪馆m纔�2V+缳硛_鐥6塑`欢t賡Y|徣2''9��<��韬a��.綠�+zFM^嬠�.抬w� +鼘啛�9"4�!a'賰Ds蒲y濦毖党2蘠錧s韔1)s$辌韹魿伧q志9_乩鵲敫风菪&M�<值蛹u幁鵲鷔l兄M皚 +邚頴]/撸侟,銱箕踾Z譾��.斆�,+'~ゑ潆侭谨艏�#DW鷜狝氹愇{涀er讗�$w葭氛9垤嬊�8j鞁y秃@鱅��=羔� 呓<僸���?<~髅G>?}w�*5H熆{綏鶝兴捒毵� ▇濹k蔖Og蜇9橇胍=�?僩m騸瞸Gl潐�.瞳�曬琊�?L"譑� >�胡跑_綪竛昐�蝋j�吖憕�;=巨~�儺涏�9窸7唿╇實仒}z鸾"碛邝nm远�=^�3�&7Zr斮7鄑懱M牜铢玗j赘螔禡F�:o*EW睇|F泒�9n�7~偷�?H澩�.�>�<}F欿鸟K工/忡劓"蒠泅瓕吊?Vg齋c妪尛;益⒅籪居邋xw蜏g咇ワ荰焌輝娼䙌牖滴你�!瑱琊DN�(>覩琊n�⊙5nhW鑺�&襞徴捗c詞鍹e麛t�s鼳譲3郹�?瑱魿�铉C龞N�)鲓�9肸7鞿v_��&_⿵茪褏�雡j�啙躙l擐2梬51轴耎�7.寱黊煖�巯拔�貔w岿瘘诚�=亏误湉�+}'P�a撃檫'b#鋻魨A犐-�/QnYn嬱尢A唖捊ioxfざ錹f笴a含> d遨~鴞筸�"鞑^騵K昡o踢U軛9鱜�;箋[颽2椂K�烒媏�?毕R讳[徱鱹淆ju璻K祲z惓|蛧=� xFk�^苲�=牯絡故�.k7嬗诔g玂 +縊^髇A�/�s麼k€6诊h_.yw憶溏�阌錔扣蹼z决炮yLsi<t齊螐.捓n跼罪�-筇l:熢鯟弋韥m杠C究~掵>騘8葸r��>H昌P�瑭鰣v厜姻视潫嚶るy�%_�>{Dc聀_橭�=譵[�5铥グ_3<挑顤鼵捭-U��熟`�斶鮕究j荄W2g溏矌眂庨賹m酠环槳�!躡琙蟖nP鍧�/B5闦薻;0彏l訿亻9B��阞9�%�.陾�.l矡7郒瑖暉裦粻N淄棼雴t5鶸�1鍢-S駢u撫�c�唽铡�cm謃窺�厈术挹K�>v,胨瑮虊e疚腭愡彰芹�込耵嘜>~y索O遾箝檫�鰦噀^�槁X)V逵�栻睈佹仓.師,洡燂鱳引D愭-嚸]�欶��秬=眳�>�嘍鼏\�飷��px〈?祋龠蛀慿楷�哆哧}'=闉�=%圐�r/�l�铻无尶�C]�餆煟�9T涖9a?祻j_炰Z鵧鍞讼蟮A`mO織�/陹ui>诌I妼財k昜�3�%?丝sx溮�螥fmw綩aI鄯雥p训�撳髳o噲兺�%�]廠粭圮&箯麸k�3嬉缧鰰�*訑ykZe乔Uf萻誮g*�-�1[殝:W槉.i棿#祂(� <W踍熯�2芇媸*棲L狈�0�w裆旮乒靝�}a灩鷒eZ�7粡Z蛆褜s俪鮾皌貹展穸蘺稶鰓悼r\.a龝q�"�c晠蚙祽h}t嗀璒u熀 \猺J銼傰恐j纔籙3�媖X羸 +tЗx笃硺u潒Z档Z醢湲G呺.轰浶c�爀''輇,孧K>攱{s摫红k�=Yp苂7展e傹堨I贶参fN物噱换Eb琌^瀪�?|魪�? c齷e^塍庄蚬旅a艇钬棆譫賑铣�3"�鱲庈F壕7�+瑟陖S杔眚X陽羼�,徠鬁�"�b増/$)�)%�$� �D|课嗸0闇嬎瓅E<譖煱 擡kx�+獓鼿鉜蠌�|�%笴詭4哐3\啄T'3軱脎%穏莬涤净�欿7礛t>坓毄躎�晁�2n獜n┈琏澷q粀碉墔F屣�f镊鸴W� � +[婳sH而^熬Z讆搙g{�`譝^凂頢8茫�/泅�盰^焵箞呷�{[��x僱2_d坪蚹~�3稴s/鬙zN踥櫻k?舆恋X滔�6憴k蒗y騭攙V孳駍"R咤5様濽_e渓?Q硅GけJ久鬵﹠y稓墅P趞qq'��耧<�,�?球>﹐鱠脿龁�&峉痻看伣轥艪�5�狕vu芊�鯹绳T鏄+濩�,褰<智>>鋏蹇韰k壗�;娢檜糐怟溈廨拍P>顗l0.姀2馾dc���>X梪踛� /�:錖&4削燷�埫F艣�;劃偛瓞S閠櫜�珶悴羞�嬒 +锋頙墆襣蓺硘铙$6\柲e�耘E籉铼cш芒餅�50v€辎�1慝�7B驠�锊畄檑蓊帉u;1譂蘕遼鮞錈f帉貘彷w熛~兊r恺\騱�嶖g辗腖碨馧��,%�?轱�7<у9┊)T躭x徫�(蜪熍IL澢�=韼� +Y&燂d�=�3s-庭册$淏>屧C寰邠#|酋�澸V�潇捵嶊/」�]僭�$帧sP龑睳PY4�5做楕皪��3D`H<�*鐚垅��>贈蟶N晴y罽瀞�3鶩が|&�#C_@�./齔����9籍�=�騳覶�"1钆EY;y�鮤Gk,�;8N嶽髽垗�>壁e�砄S|u喾##��鲘��9.�鷳愨埇=硞�<��%f"'繁諽楖�!]�>芭镓 s/閈� �蕿A辂#_秅呈鉀K與�#�>擾哏f_Z鋖X顰敮翔t�坬�<v�/&v挤醆6焀H渻:c�娬 '� +硇_�1�%e蔤w揵f� 5�@怂潇!3�俏椷� 瘪援赡糲.灥x.��3:]楼飘�髂Y哌M首�煤kkRi�Z g嬴1�3 +驈揳純={牴呏1鴽勶怅澺讖莼~麈颃踥^�笄w7蔢╈c�遽觲O鬂蠾W梪屉�2塑U謀�<pN"6堪6�5挚C掘K授U煂斪W頰雒\@窯|X脌棺S巺蓝摽n畖E��%�慵vsl�>篭V'孍1封C粈��蓕寷9,锷�1fj胢咴8悕兟b蕩8c葠讏细籨'貔榓�,墈蓇T&贘LQ��)g跜gE墨Kb(鰤蚳穮3'�Z渴y澂 O澉gO蟺鶠�[鸁主1�2�桼|邩�蟪伣1艵徥N踅�1t厍�8鯳�澲�b冖u,妅cU'�.�E�&�%>庆+�Hm遧蒾L頄}]�%�狑�2.炌使焯�${~K�p\"硺��3觺镪�6堙�吒��)霼}譲]AfB?垳醊姹聓��缲k′窖x��鯸�栱H藒褞�趛 .詞潾�)[蝥瞗�$��Cj�,裪拔榥 �祂襡�怓�<i鉌v擲榼Y覸睉觟0鼧m-sk�F�3A闯審64炰麨`纹3飄{`臨糨醳1州粀疅>yp}錆裏縴欭X7忰颻>;萖啐酧�<;|狺顫垸yy�<I�4�+攛� 清&� 栭昡恄g靾�:滐`]Se峋炴耝春葟Ek艦圬��孾昰堮3喵:蚊柵髛敫m佝箌�p圾t眉Im#炋1%�S�曊挺_1芣蝅;钭�p劯固嵓,o</�= 锃z湷)杁[鉻о�阚7湕坓嚪1�:沚墱 �<�; 飾}F闣瓿礳陦�(啥獿蚦=#m酐S莍憃锌囂兼&nQ献眉卶淦�=��3扦s� 審娤浨z擷 +菜1�=�#h^榡l>齷�溺-矜楥+�;'煫��嬦�-y�舃驞>軑瀢�$斻/汒过蚪ZΖu%smp~�\�}=m.粶歴8鸄vXC9k��>g宼渙坆t困&~+颢x璟['2€fC�6�賷莍�JvN痶�>cFh�煝队Lh�&d奶l淈Cm,a'滸h悭軝_丬書 +齨馳$�6��/u#�<[呜�,D土|綽c陊篡]膂懕頮蝾绳洴烇z�_7ˋ汓X壉硭�弻觞伲{w�3軼�$乡慛� yi%gZ驏5{怨塼�g弅刮儋賨塖B�瀾鏮s�� q诣骟赁9<'>#澢韗熢3nMY蚣洱�添n?端鎇�12|k随�bSO�至紏�#f阾^敺/遳�消疗邃#荴vR�甠G槌何ПT�hx`Y舘8哆5拗Nin溏E} 鷘�z敫_�qp�6k㈥糟嵓e-陫�7a韯]綆鑺5G楙侠齲k;;Ft巒藃飵�;菓��,衝鉼��Q��b腗L=摞r�,痔j洚Q\拪�vqU�:]樝g5砽�Pl狄q\萳C誏X~Qw髮╩F6郛吹�,鶤召揻枎ヒ<3�>觵�卌迗wc誼噽甭|揔伨5зb�鸬+&ps価鎺6G緘�*�緙�0隿�铄�>筜}�oG�;納鹧�G坪尺n鋵勞�<右堯6�#8�=踄e冫溋齠憺��虤橙鱡朐鸕瓚礙賃疽歚v_牦筛镜.kI_�2QX柣oPt紁拮L雑E赱9^b痹[峫~�!叴赲D井迀c�贝'靹� +[iv�0稃術咘Y/|Y冀~礯[栒�f旺隝鰵 絈�k辁Y7�9j�0栧<X蔵j棖q魖滦Nh鐵谀�?Remb]栣郟彿鷜WZ�筃�i∫辧伉q芌8冷�鮹攱O裼Y沎欰�-驷澲s染憉[獻蕷筮S�P�)�3箊∕宕jYt�i +燈�C[[kP溑赯A粯茾卖� yk诊閊�(囆�-銪�/蔧D-�.棿9惕e鵺vt6fN頪夘{喻繪渔牝没Y雼蠠钸�迮�cセt��2邖橆H|n>+L屽5� g啉�-嫛铁哇v�<�@v#�0孔侉鲩�8k砊謉�<� {鄕黪宱4ub]b穃VfI�,箺(bH艌鷏)靽�汾峇澨扶nh�什�姛PK苵踟挡鞪Y啯僺m昧Q�;縦`卒`阜匶脔S�?&鎌f妍@?黲b讍哌螜嘐,衷znq$鹺7*.銶x熥k�;Z�泐Zw1PY+S3zo钆2s綾酏C蠚艏�;悇婲hE6黊�┲H,�敮bY7a��牖-水�+`繛1覞戮X荺戟罡�*�+sN_膋稨?tZ}�)袗y-陛6穤潷匍3掳o忠-m閑骫$m丢鰾鐛J蟖厈q舂讹��巢6啽R^a襶�飶岝蠜d瑹帉鮙a��<痉縲�0鶲$瓵rnf銖�茦�8?f?�$绋蘓喯0NK鍯巕�穵A歂竼鲕~睉g趱 鱥擙 rGlg9挼苎N=�跀燄蠪買鹓]а搖v啳栘慌骢gx惹湟�;v],鷎�2戗y^幐U迯w泳翉k搩UY杘 銡:齸@螛[�腂剀3女wa泶O苛馏"�灺 x_鵌�:�Fv_V巅6�"E>腞兆�5n獠0'�铛娛R孹8宿!勶�>熝尗XL潱y^#鎵頞羙/騑8仅^熪脔c|�柂S霔洞z(5珺苆p咽2V膾纞鏸k-狚�rz沱s鮵轖}f貃墜,_�W�蟒p黡鴁x巓晠駚u_鞍櫿w蓣��2k慆帉跸耎_~疰崪&漺�?萭=�&螇b昉髞阆&訬€x +臱Ⅰg�!☆�1奁歋諐纒汗r"蚚6.煘S钱Of/嬰p0弋�9蟓蓣蕽B藄wT'洼=0务k�1荔wg诪F澼�x�3鐨誑强v択蒡oa愂Ya;�WkPV璚q夊!怒肋押灸廊8制驉�D軍检鴙岇.6繆om<�9|�.珫匾�_)?5魺鯝�f糧~陘冺�瀮MyC水�7顤铝-縬?佯蜑锩簋濩睓倨�E7Ak#愚�閠醹圸� 蠙��遳l4�(N c瓟~躝礅冬綛罀演9複7+鬁胎�1l挝<'2'舧懚2�#�.飫鱣圮Sf�5皛7{浳彿悴曰P&.绶%邁娗"?�+:+毗鐭n.纨棢?=|Ua叡钶綋��=%�1ī@筺�=D緻袅醭�-�7矼�1#�腦:g�礹P煁謝薔*>嫎╄8I�kxM�5I�髌厺�%~.鸘87`�霍��=I|礣飅�'Jv�*kTuBYk(䲡-遮詉�凍莈m�<绰��畭y醠 +�49洑�<詧揍车鼮�魤`煹蓑碧鍖h鈤楾滽~g鄚0x�8儩嵣玼杦bic�喂掋道亮}yh柞伅,b5�M&5><脩ZVvv��哇膙媽蝗璃鞓5霝轻昨2�Zv4nX�&€6U槜�4敞嵅㘚;础禎4�8f芗熷}凔�T荒畤睵_佖堼4=iam$_5_U�:?薢wz畳麯兄2wEK,~犛呾Z爿7ia驼1d冩+颕胒蓭藶賥ùL蔹n渁Gq毋~坠褆贔婢Me珿I凈彰龡_<藈B遠^峥䲠c蘅忝环O�>z缚w�0栻[+茠竨憎�4/(=蠎r愦线蠇燵ZYm俋yZ砅硥r遀5PIt�:V萖︴緤�(hmL�)]$僇cj9Π艩炗3p +�:�)+r榝炓堵D�,透粳裵]嬮<#6踥谡鳏鈤従絝�$餝鋸幨Zx砞虘櫅ZcT9r懇uY帑�9,(k \蹩g�-�浔母$蝙葮�1褄ol颲9uN詫�2>�墐g��8&Iq0腲�wn鷥絔��靋�~鉵2e�:�?伉杕濃7&嶁癗�;�>撬]恄蠈址�>姳b]菆棨=慮�語 dG�3鬃籄煨嘑酢迶e��&月跇叉稘遇�:甔颬麘5颏� 3X�31�跤叫榍~0隚嶢潓睽攳賙6�逧肰降k硶斓:墪Uler妈;"垛X灪7Jg�虎髜d帉踝奎c�I韭ぽ痱鶕瞯兺鞧絧��穼E器縏絅�当�1�9i刁}玴濫鯋幜8歿W嫎鵳"�,諷�"霁�&職�豕�W袠G將咨%埔�0�!i;毌梮g旛�,^39Yg0�9鞐2慮缁 .�2栘濇单~E_鉟�剀Z霿沱隣麟�7蹼|r寕雒勍�:'7��餤4柸b蚾镍pat鯔b譮�奂臡帴mr0�魂�"�1跇}忓劝,li沠譙�鴝厓G�!;堂#恢=9腃i礞蠓底V ?�=珀燷T'燍A洶硌檈0OF∮鐂� +餮t漣S禌Xe躐{�@;鍾髚�N�'i恀l/�恬>a\�8v轂镋~銁膑QX雂4鰓2�溙u岢贿R6�+�討K蹲黠_宄Bf��cXvb�82謌瘊庞龘�j<杊q鰰e詙�:g#E尅抯;:/D6qqCU裟逦A�倊,a,暦萿欂.,l�=疷g~2~�2�>&s鹢5迖∑Z瑇文R椨d鎋蚈嶞姞]q蟗藋镅齒隧痚疟慄]7黊痒皜膠旪P銼�黉R誫鯔�(|瘽d7畴┎嗀铼竓憅橡5桛莥u�'Y讘诏跓鯀}_墆~晉3趱Z鯺鬉冯,>鑃碜黷⺋b� g龁眑�2膱髽�8l}� 飣P[疗地鈼�砘s濶芲壩晬S頎a諏珎s奶坒廤r.豕煭愚�丈� 鼸经翭bC鮉蘕贌暿j�/,�M-O阍烒方c醸g绫譃,G流瞩沲f还緒�2羌�~�簋銍座N�?~蜓徨笄鸊黠矸郜)�,asG�宷戌qm潌y��6哫��#�嵐�*畷汞�.�!籭艄屼?�1馵bb�1f沦�8x6秼4貾霑XX�樍酿郶欥�.:顚�-K禳�8昕�:U栍X馒�?臵@5Е�<*�!_醻蠗$蜫繜v��6C飪�b&m�7J+葍懾鰛棧:椮{h�2?зo芢D鐊<g娼蜩鎁浨謂K缃j癠鋡-�8ゞ宼r诰^輌6��,讫 架�:縡uz�"g�8-�毳�鳬舅唵潦漪�'�.�伶�!� �#Y日SzX佝H儊穿捿*b腁�j0H禚:銶悷3*k菀��-涍铻�;�'軾樀梿Rg嫳冗纺Xt瀢J/薢b︕譩w掐(:髩�]杄�/+c載<窒?�;|x�蝠蚖>}麂瘘�I僼涳d�;謯�请G釟~nN軦Ow>[龂(棪U止u赲vg沆6暤脑C6妔孎€bMk觪}c<窷遫�蚨"涋巸飲�:蕲僩馎�-}鐘璍紆�'0�8_в騤鋩u盺V樳Ec鄑羷_�:=缝谦+垕g6毝燼�9^駝忂Q�5�艪榈Gl�,W鲿僝�忓W癫逋悧uㄥ蚧j同_歉6�<d\珉嶟宋.�/撇煸Z奂徚�&X}匒�.晼╡琱m喌5B�!g�+� 尌笀�穿唨�#�,k湄"衰VL闬��杄腫:g�U猬q鬕WZt艾?赎牞V,€覽k紘鹁炥髟礶1諦�1铸{W嗲嘿橑�耦瘙�嘽]噖I会升蹢9}?�#56髸P�%魶龙?划�胚�艆F:挍与澀碂�&�1蔅B�穅;;闻ff +圻鄹>[豗鎯>臣d}�.� +�!薞�l7润漾k�*�![澮8徑枀g\闯y龞檓逺y7駐唴�&�>o洏o�4縱菰�=摫鞋豠Y唭'h垦驃熡0nh鐇y櫕籽茑竖m屰�?<悛鱾醢�1oFz0诊Z緡坬|侣Y1嘠]+W�g卾v?+�0d�%瓋V䦆挣�:#^钺A眞駝e!;祙O�6uN苆諜l(�=�)R濌NB�寢Z1两:pV轢h�2飾蔠vu喓寐E盭藍(鞺液X獗n_縹鵳�鯒績�o伇�>痉縮uy�<朡\%3ヵ蜔伙婗峏枍ek�5翰l\�&h#旐鷛u&^礕煣G茕�4eE鵔qY绥W萰�殿{w��D洜篌烩5鏋秸嚏噸钢<�=闳|ex?蟛� +�5qZ^_�.X脑[謄 漚喀渠璗峰蠖6A�M�-7鄐祣螹晃AtJ-或��1m�3庅紧�9靭綸酥57戕f亝�鉵溒,杇醴<闫湈{∪�朝驅叟鶄谄�(*�<@濄忷 +�腙yb詄夾7e瓡輦N�' u猉鯤�猬0F]C瑩8d狗cT栧�7b鄂售a�叵|逎橚,馯娚J�,姽B挓h塨_a(顫斑;W��-之辤廂�0^︶煚镎凇M�緔齢�蜅選<V>+e謓m馽莨}y蒜常�cV葘�3訽�7Ggc栭坓l虥�/�9x亡РN渫�[稚X屆 �迲玉嶖鎖闘De�湿罂鏖�]�,yF蚖A\务Q�器c 悔�棺W穇�喙_�'纒銶鋧銻水枟#vUw媪烓贫k梱9嵪剈v蔳炨�=+3钿t祼椬f澂z瓆C汖N鶏[绶QYm榞a櫭=梛剓瞁嬁瓖扼L淡鸥!3/丌_漱`t┌苋nd;]煵i�店%��,衣B��6El$|燳Mik�/楘塺�)�+4v�*k�.�鏔鯶3K蘽公evl匼�?蚔緼+珱\泀\檗}欫栶;�:Xs爟%g:�=�荪篪彷敕G弃�腈黊簋鯆莽餅�=}翱{�*隿Q籦v蜈-v"�(?\籊锋rY載室隥\К�</瀐f瑍Aa!~午<鼍秊盢�+汀]缿柋N倡�=蹿o�/lgr瓪�9IY澫w�2u聅鷷蝩[w韠H雡蒌蛙g亡媉掹5� �9l膺l�+�� }俚)朔t尗荺8憆刎oy娊�7�:梚蝏鈗Ⅲ淲#^汦苖鹺郎翷1緅bI��/膶粣7^Y囐5d軃玂鴦-;峐裲�7闬寢珼kn穆逮慚鋑�7� 螎[>0妚}醿��€殃ZO錪藼賄�胒陛哻雪L崖�F鰮�M{h-��,O�6葕覸�S5辫楟[1k&€��>�k簦劰X偛桍Z嗊Un栿IE9\載b屼岞cvO�4Ho�.wB'}�/>�h�楙轄蝱� %�b瑃_�<�2鏻柉栀�8N埃;bZ过粳v,蝺綨毖韽忡�9ú,� 圂=�=i挥Q皱~}蹦~g鷧帝�3嶓��?�,</靷5鶘馫觚杉_`膙>>�59圻詶曱�,芔旆趟肂澛搋腾|#灄I!鍹�3崾曙b莬"v:鋏隨=�?霍Y憕��0枤玂鴔�=瀋�!孖c琌垠_�'宔l鷦索澉,駱7猊琭栞{_�-�5�>�+�:坱耗F隬)n狕@3+驤>�+g侼怂jfY$鵳㎞裖徬?誽dW舴�&<稭費簻蔥櫓X锝�=g>3�膒Q琖o匡 nL竔tvQYv琲甐颳i[鬂V哳趡A霵7觑�"濛n +熿�梭7x_�籴颎弃霁鐕矾�<簺� +S�;�1倛e�.!}巿e峁E�1{旱>撜u汽C碨q漄Y 互�',+姛Z,玜g薺諌眃杻u_鏭皋�曞���,仅複焒诀w�.�',:胻绻谡� h�/靂:5>�5脬壩愬焔�!u6y邷3�,沅蟬-W@�鲶>U击9俘珀嚌b茗蒺u聅唽珶翓睁凗���7}殖妑8X沷�4?澨誧甼i0鑨ywG砳棯s穻X�<�/� +嚨蕷責D屓v�?曑?麔.翁ik璽ぼ撹y3帆2]猥宾涴胬鐊蘊g�/(衦��訚貜��8縃e +///�閶琪槺弚7|V�嶾wx麴牺鰰g q�,謳u飷峞&薊�*�敡蔤 +r�傥斦惦岒檋?j泷\蹨 �:诩I藟QY恛苰O澤�#熿ry.囮TY6?簇鑮麜u\.褲瞨嘕蜡蔫=�s.1:�|�'渆砦etuVh岗净W7��:dt皝稌鵓錷冫u�必�:#?t辞皩e龉4F歟"契\tW�1Xd醘麃吤测�<匍5聂�)k2V�#S宔窰屌\�,�(t�,嫕,4$柺潾S赥i~�:�嗍�,┏�:6'馱謮�洱=�椪3gQ|貄�?┏痷 帩㈢C芞A桤C潌�M/7灊V疝�6F'>鞸餥涚r桸襫+���=e坪汉豋S巡堑刊>)a�.鏳�&鑳5e7kg鏲釺籐詈敷缁桅� 媣k蛾鋢絘f-)�?襳识iGuo�:O贏珿墓-瑅濈ho]�X� �62q�*'/萉c��斩8穔僧h`綻梦�7交Q邰}A#?睗i�挟UV�9`瞌漈^'8N&~薜嵺z叠氌*灲吐灚�y糪V藈lX疙酋>N胥段BL<貰Y-;]V�,帿Q,鶍魸噆{~�;凳亥|O逄妡溠�}伇|l嶲�#境M�;�:怜刓�5;踰* 钡压2岝S'}Om=瑝齗T'�:�;=a/嬣,|jmk鑐浆�>k柠磡窠e瑅枷\�+詞�7zV橆疑岝ya瑖G�:夺8忯薷锯鏽砬閇�>屾=硂o濝a靕t�(|祏s�:,绥Z-惋d缡瞮v�數媷蘟譓譿j}獾撍6ξ�!�/:� +奠[�8鱟;皸汍!�黈zm╯炓UR\�8殰播|,�-雖~澼x��+X広葡豘�1�C;}�9睵祿竑�9钙�鉇eY 线^38值�5厨鞀u�=\]斤戴详X�$焋�%�:蒧輇f=讏濆t欉暂 鞆���$�甝帣躸桡災'#v﨤嬳珋觤Y竼�裐幘"�嬵蝁《�:\[m-袻p馢�9椢1嚵旰[.m榭{F$脾:窦QAjW�;�2?Eq靅\杄0]枏�7�蛒焗煡膦x}� �謝�#黛�麾芻掊玲羶埯輓淃遗侓^/玼㤘骭挩,梔鰱.F芻Tu{芅�*U�雱并さi�顛銣齠Y纥叔P嵑o�3羡�9輽Y璼�4eEm砮舥j 霯Y.辳b潃灸Zú涮益cA鸔'�谂zS曠5m宫i索鑥巢�+嬛髕虳;^珄��:櫩�?M読�7暝軅e頊濈┈qe蜞=gJ蹛s�t偠)�4糐v嶿�/�昰y役m馆鰊U�?�-;枪-粓櫑�相卦彲�?�B^!�/韜J9qp枼�€衬&姨�>S颢 AY�澨愛'w;#償s6�� Gr�9�L髵pた�欑畷叮xv5黔酏��5�剬淊l啘H:k{;衎7c#繅碇8螒數�1詖錽Z瀐�?発蚷眢�'豯J蘽仪z蹶狺讼燀x�闒醣R帖邁x涻盺�剖~sr宂銇QⅤ=b恢芢1扭谁��,c +x畧xg�5放1�.j亢�霰甝�7O鳈f?og�?l?擡L止臎詆<F断設浅B抻 +�┪h,过�>觕I�)鲄7$薐羡鯁K�/&]g搎M漢脈Q�(砖顙D�v u苨Y礭錘t�癍历*|舓嗣�"�c��礬觐 厈'榪�?j掱伏LS藥鎝嗤儇踅fj猻幑T辨\韾儛UY颠惄<桱澀熱:k筳鉄侗鶹Z侢蓐8涋k\i唎ka 沣稓稓嵃m�閍 ^3媡&胿a鼎澷� �:;鸬慚蒩, E3kW氵稶?藄ョ�)丁��%_T\朱厮緂u溈欂"骇慰�较j蘚+i7紏髕�蚖削?~x����嚳��.� 濐襶n幥s濫�+歼幹Q^痐屩頱W缡I疻j��愲�.鷄焤lx?9鄖l纘^b勺衯篊必n��;黑�:{�#棽�.j嫱亵脱fm侕�2 +顽�蜱襣-�0b丝旆甧釟r5冤據�=咍u幣p遞鴬Q�霐~S\S车汲骑詏r鸤Y鬾騦"W�暸�2NF�<冣5y�:�5s<K陿豚瀞皿2婊|梙鶹史攠c�矧?�.x藞耴;xq總項vu贳札oY仳&隹蜲秂仢賥�:iN鄐芧縯�=� 衄rWd盞鞔n峰�*k琺J裏顗-濻82陔籵]t徖茾�**�4蒶� 鷕#緃� !K葃炚吹��瘰夀g�-鑭]� Jy偓璭�;e5�4� ;2鹅LLDT�:]ぃE瞎﹝ 購磔扚樨窴y葴钞鄿Qt皞s諪Y�&�9w嗴�愮 +贩� ��3�譮�檥覚眝G坪簙搋'o熿徿�踎�氤沜�y�?痃獜曪+�ど�%m�=覺麪���Js肔sHl~W僦�5檏�B}>s褞齽增a腩睖翮�>j;�蹄x�;��R=|W6祶陸|孹鰺�鵠8�7绍Ls*1 窝Kc0冎Hz骝>撕Ae閤�4栄ftKku攴訴~蘘�6�忂哝c1荓鮚qsd櫾>czd'鈇贳�.箺撈集悸u筑熽{A掀蓕V�:P.9蒽礲?Ⅵ� +陾雱5灴9`Xd茳惧ygW鸎燒鲺圮懋庴�繈鍆谘鳈訇hWk邴鯳^沘>d蟽相譬居=�'霏�艮︗C*�綤岚-�93褷桘軘;扉['�d危o�=7�07顅穣�+e�Kc�8,蛷蘕脸�=�vZ3鱎穫�琢U骷昼p.迗c�馞Q\U鍨v紨支婎,\駓灠塲朥藱玗錏鶾S誖w� �3Z(谥). ' +�).瓆煷翍� +s庻噂嚗�旁奂浍F^�品K�?2柱e�8.濗窎鶗�v�gds齰em椀>g瘕绪8詏k辰妇篯胼育熆y��#c齬儈�С陇廢u�?狺;f废,Q�鷄圪�6_�+鮸謼旡r[鐨dG汤>濟摬*笤醺屌%戏3香;瘵�>%螇b覠OP.�4�:Ik%�圳.歸箿iW鏬Y骽荭礐|f墿ク6h�8昬莂'╫瞜n扮N�/蟨!镫X瀰�>�$鍊a��鴇跃疾��<鈸�+�%{广坑樧飏n]謻M龁甦秓� 2�隳藽�#p5�+�%1Vz頢嘬2N[f\yg佊k]傣押尶朹X�wn}鐄9�+誝v?R鷉+\ +遫0H睰��-盙n髂骦鯽�<�suY[䥺髽徯g援:衱>蔓趽O鶒粕�%頼饹C?詈并s贠逊傼虿苌wR腚=j>瘒�姳r籭,w练R緭耎T�XQ�>恛渓t彀瓦妔閥M]訫h�!爢kI-�9P杷Zim璙��ZR>7Nb组集�>�!�!i"€n�9箣�/H?拗┦2彪枀觭�_�#�KqQ9緾nR9�&掩厇Y+焝塭馶i槵K7d?飐創K碛麔�!鯖渪>�=J賸^澌/殖B騝�$c龗c捱鋢瑆o肓懕钝媫�闦Fm蘼�9曷�?\K賅k1��哲,擁稏鮿M�d赶r炈�6谐^\茚9旋j浺?龍胴'W�.藛8玢Yt惛瘻-H�?Kc陖tYt煚�GSVdCk鱒�解'垗骟N肯W逯:鞢iNw芆�:�f}R^砇}�=敷徶5<7a巜镪efsff��`蚭鲸k#�7�祂2s駬Z�紦u€>�|24颴�逪,脊燥Ee�h萜鱹㧟<鏒_锥鰞p桅睧�:只g�熪M奒朔r[窰鼥虉埸輹酵T�$�!v"帶梆V靬ùKk骘鶥k@刊魔王;詫%�+��葪3叡�%�?1眃w偙�霐~l崼^姨Z怨Z:W!媃潾F潩鐲,臻4盛x*已\襺�,R萗恛H箚含炿D?�9z^-漋�?覉WzX咕��K恍弖挐�9 �#雌Ob遚�,UV?檣蠪裚XOu蜍簄瘘ヮ=��蕹跖慅X啽~L寀�1锟$韱�_}�,爰Щtc韛y-k-�鯂隦Y鞘柬�(椉骤�聾瀕�>d$�3�.\珁}�/鸃鈩rv+鐒xVI~+y�賍�崀 +錹價"v烻�\/R]�/p恫侜�,��<+m踢哿叩潭伨-氚b垮�;_!�3�穮O憢$甦[}#欗鱰%~锹s�賋)�4{蜠�$>/�:癫�塔t^*�$C]所趹鸕}蘠趏⑴�奼�*W��+�;�1詂肫J�-|;�3&�檸}g�毱鑈妻灥峁dz?R但<鶐┻兽&q~WT?� 瞂.弣K抡驠��?F�+蹩b�l!f庌Л��5磻��騵�"顥綅0逭㧟�a淒塛苞眗�2�<庴�90�94{V坘o绲礲-v埶j冤�舭cE~琷в~X智粥?sv閍�:{妩b�$A潤眬龍慞傾q�=焆k�旛綬~犉纹l瓑攉6q廍撷羡驯谗恛岧X搸KI寀[�雵沞�用圇v脹#c瑃V杆~瑡k淐)F缕晀|,祀3?�)fXS�%髪.隧裉軖骷c胥l�,�?琵��/ZO�(濽熷)蛵�=g蕸%筚3那襷-鐃Ro粲\銙膐"kΥ}'�蒯�/v蓪P4�<3珧籄1督�术�}8l#颒鮝]歆蔠含-熋#藯{^}笼k篃��鼥T�,K则7憍鏸捒'鏤�?绘{5M蝾饮佭"s6彆<�;#3,寀G祆%oE�#饚朝鶾8Q麶8v錀挪�9�,蜉鎞�<�*巹赮棋�鏈戹K8U�5o虯���良�?绵�?坺迲煆�?K<愪蝌節妝-%;帨E駫冧c詍�=j(潈晭厂:辋c幊7臊0�€6綤�=S愣凄N腜[嬧鐊硦�窚伡 �0vkA��-艛嵙檅襳Omωx鼠�9�<�.g!�9lij共匚�嗂舗G�莔6s乪_剄)�>b迟膂鯎趋3c}�;0窒?}r肳鹕豳訃�黝f艼s瀉鳿|鶁m�荂浀曵XTκG%�竺靁�濷P�0q汕挊h+<JnD醩隃q�瘈眜斡�3]嶀e>偙穛�珝颷o熣mU�6愔<9?褃x**獡忝g拮o�;璹@yb8NtV$g诊鞭]伫�0w逓殘涿@�薘Y睬鸷晹7G唪���劔m荚�9扂bV驟逊畔€宬�ㄎ本泾瑆ш詛玱祷炨酱鶴姭澂焥琥棿R-蟆�)�=咫僩%=WmD靗跪� gF�-碛u�熈�*鰦m,擒框湤€9紏瑮衠を�(蜧�'yh逑�煌绦{-,袥:14臘啙�D]�!�#吴<盼� 耒Q�#鶕(知顴jQ儷3鶚鴨]�颀坍强C1耖�:繢╭咡╚俅飕嶎g驎Q潈�5e) �:?匊` 靆"�6p彆胛潾蘕颮^嶙/瞯肕2挚帉趺鸚噊緕~軬���=笩� +1O�>瓒v1婷呞[愎zY憂ν�]*實@-鯗RV[oj�-镸I�6�#€O(圂质�;K濈鑚MU蝊�鴺7漸莡阸��UY%种隚`熣:站n勩�d傥蚤u\�栔堏竌',韪v -,踮�>祥� 恂8-�f\兄掱[�韋�5�/N臻授6�撫蝀3藶介锻嵅p�7w� 聎N�蜸�:i>鍩跲yPc�0s纂�垯坪N4�#b�*�=0玦 詔夭�蔾h�謆�叮�i\y=莞dG��� `禅Y肋G濠��}�%;�唞U粊笉闘�桔\�/w楙嬳ヒ滰N某Cd叭l�.b+壻2~-�嗭2�砏�s|v鍘5_�61V>+納酰_>�趺�徢�7Y会O�>;紎䎬�X)�=殯頋捐W�6�>h鶃,/��3毪祪�3�>騭�<�e�?r瘜.��������滔�������冀Y�$繁�9譻攀孈,筎uW�$粵綈釴J娨9捀H:鐩2?xn替�3沓o嫽款pDVKSX7�x囝x鳖�7}?� aNWwj=T�焘熾震鎎�d浻飮a摦緹撦臞甴﹃<帐泵:儺擁N?�炇晁齝9tX鐉∥悶aN弦�颻�)蠙��:н彦譏盹訧鲝v莆董麥衒T忠{�6鶀@�67貦瞆uVm黄6郅鰑鸓��榉糅��9�:龂语荈{糓漖y�#豎�P遌i3�7誉藿ゲ燦镛ZuR{琿蘦訧麈�-c盞u倽.K稧狗C褐冕dw8pz擐kNW黋j蝈仵�_兺歭N�?酢茅辴�撿实�.'趰�.栕珧钂鷕9痈I恶g]椝!猭<貲籠飿觳腿鍦�"�$挥=d籦鮑v�}�toG赑y鵼疵`闡v卅A?+礯�讼覷寿疼胿迺k淊mW邡怍掼�3謾�9鰞犿疠圾.V+m�6v��3�寰W诗i~`<|�-吟�6e�0瓮箧蛜縶s稔諞缦�>舍贿??讖����/件��~{簙s恨;]棫k}湖��^~vYl㈨范溈�蝰�?~|u�師螫�颹6涰伕b濐{L骵d殻邑0nOcf䴙稠T�&e撿� 收�<撦�cH*u涡灀敃頞坊�*痋�硎}%鉪y剧戇!�rLs掼峕c~<薠;鵶r]�镘�=Z鱫�>o>��0謲迸N�.擪踚. oQg8龥pξ纸-�蛻P贊�┪伟缡yN�,睡]卯庾讫[~踮禳s镃!硨�渁∥v�2#:mV諜煳?g頺�膻u犊籨'遟{�骍E筯戊�q摰〔鍼v0�"?趴瘻9煒崢!r�7�g崊38e!嘍.橹�+,+d謮v!輿a懩�#餝aN债A�3"查:0sb�sW*+裼愘/矜zPmO�7O勖鎡�!�1%緭w.�"a?x砀澙�"蝗PTV�0澊贯吊P嶜昊Ps峾;8�廖5䎬炛泓f惠脊揪|箪榻莽煖霙g嚐䌷{岝廮?91蛛惴魁帏駠�熅黟p�壉v鈴緹�7苢鱢�23M宇膮霍鐞�(rTf掵硘m咛�.䴖緋O譳嫸泍槽3稩}��y,葸�>"\��%V陴簯l鮯娌鹁�3燤�~桌苋�lR9 娑vz�:jF匎ブ蒦YaZ\'w周�晠雦嗤掰�,e�7薮砮褀f橦鎈kь苛~MJ馣帚€g譮N烁筒渰s}匋�-F `纺猄鬅眐r鶰鵘圯槺Y2T肀膗遮儡W�%=.瞒� �殞錼z�:漼.鷦€澮溬妲4�鎔��/罫dl恲鳾w焘|K藹Lta彀,�:�鈅觢@eE姗昙鐿6鶌蟯N漙逢#�?+�CTm!e 吤VU鸎Y夒R� ��8骅隞� �*>;bF薔鼛粴�,cY粀.,c鳆Y姝|g���/詗1�:F�9,�8佭�0Lo6浫XX��骈壉>紆?诛緕v浙銂O��9蘳鯿�亲腁�=驲�2?�艧m7�'跭�9�� +1Lf澛X暹`y�粉薚輺霘 +冄}�眢抠�/婌腲遻菏孔e铠�胒�2�<]男G駆于ug靭c�u�馻巛洷雑� 鷈潮萋紸Y檑適i芳ξ咻r澞a琦晄紦8W鸄�=愴镊:簎娤wh豠Y酃>o饽+V镛鉻蕉笫b�7}�'~瞝�>漪曄蘬讏�+ s�w郱M氊鷻刳r刿鶛≔i盢`WD�*2枮鐋楇隦>帺耐澰�境叢(栨1rs馃濗)钪w5cE.Z'柹>雒�"艬_N95媇?q{,=к[�7旜p|�耣�;嬽7p紦y羌ba,aB遍撇贾q�7鍆碔盓鴉'^/W氚昢鼷�Ycス3~蘕褟u]雟齒�銦犋鯒蠋痏>:>~t}讣��1緖�7#蛥�"�8 迥?�递^%邸�q�8l櫕釫�;麑惎N邼蕢�5V�:侎劽.侬�9霋賻頺C迩削糶鹠J� +� n裹膢谱�浔昰l�8蕍邻m\;�,尜I�5趘㧐Y碌i疳9弧柴腐.}�#��)嬬jeW畅_趇v[vW-�霧�>獄obж诒砽�8�'叩�#遯幑鏩;嗣 頶蜺v>3K蜝洯%犕�鏫槊5�"毹\剢oX渞Pj�0磯饪鄙瘉骪F臲i嶬1繧嬺湀q趾�7)>F~e乒]�枬(�*�.X?枈6|g�'�1D墘R蜺稦�k2�)胋�岂D�?j服f~=n�c]旂肋s"烺+媩S�>缓p謂z渴彞P�U�v蘿�EcH{碓^� _�烖X+�,� +縸v雘?�&1謔c=zx}豞�'�;衳唽疟及醆)��/m�=�喷垛wb?悓Qy<邧+骔f堤M磃ぼq嶪炇賭蠈�穵懾穠*揧侊kg� +8тx﹏噝]哔���尡v.鎔淬u�!qF蘫393裡I>#煍a57u6�=褱��}[c�xolg蔶資契X抿/愈磊Yv徂Z渒� +�2i]炏聳营嬟mt�縙�碝�岉鲁诤鸈;挺�-滅�嶬邧_盻-rnaS焥g丧h鷨销sM>駱娑50邼髶i^�t� 媳惂�1癩觧!7烌�8�髷抅�7暢*;蓎搀锅擑� G豛+��&Q�:�)Z"妞{3蘈v�+栿�$^s栟_ 琧唔j=T屳鲹*kU晣躈vc�澆 +攉{K*啨譊篪懣-欙旯 qL糖趍哕粀Yr捱=�嘷-2c臱釃�c�妽P�抨r蘞#脞 泠4J/粁i问yUkサ鏥鯕e饪朁&�-鯍飱譃臶鑳cfJ筗ro�F��'�3警霿觵鉄膚K|e隳�<�洺萤:a蟉櫑のA誌1Z;{>V�?籷颩� dF\蝺鈞揨s�:�郸酋z�:};w�W譤�#态鍯�/崽�5妆<逳氰垏x^5e*;噮�2骽�瘟鵟峐喺萕揧r�黐�堤瑋��:vo�3餋z霨鉢弎跍k}�骏騏b�0U��Y� 1VuY� y�9W�./�y限6浅J�:柷寑v鍄lY辞庫�,毸递�9媗�3轧糱凔夂np�斓贂薆aF鋧憵7:d巍fN,忊剶��膤�贸le/v禣茉Ns�9 �#g濇釹[糊擓㈱雱国��<寳LS轜翝7/>xp篦?~�怵胂啡X%琮w_=?~酊神駢�./we�`�攚2奖{饎6lC棳商>Cc噛,4秇�竭p�'�8L騠葞室~'竦愝Plp4�曐'桘_幯,3贉=�7韡蝆界蘰潧?胱9塄N薻No�)苬#杔祰Wg�9猁;藴聮-.�,孥仗檎﹗&€莶钨I薹鎃�因7颢躓P鵕�%皞�,縑Z+蜏8�#3渴{b諽坬晊油鱶;�蝊Z{ei煰廛涾|+�-v霖U綰x斯踞s~Z鯣�豟+�p�<g兛G�PP踉v�8t鐱輨d7�6M;�蠋頰剓�`Ka&�炘�b7D懔菠�. ��.賚伧執Il暜y楟$ +aE`潂掿帟逬稃[57�鶮u煥韏蝇岧�3墮p韲>dd+^吁�."c=|p魍�_}�43�-譕c}S肷銂嚝纛筅]鈥�;肀-励R逑;朁ḿ扅D⒚€z頧婛�0锃韢櫢�谠�6_藖煲sv甿飛 繄�1豱M�0�"N呃Y� V�6�XАQ鏐>巅謞恭f臎�9�,y緈閧坚�-1s�%€m;�:7帩o鮯昙w�;h鳯冩礶~谍[谧珠�麥M;胠蚾束�4琥m垡�>狱趛鹬�赙废战-鷌漿k鵬褶腛膪啎憵[-瑡砰�"汊�濅#�褯氄\m��.€6�;�將v靏B�-鴲唭鑖I|n剓m�;T>:釩烟B豟鈻@鵓杩!逌��麘]キm7O澉汚3K蜾QW侟jn>湁唤纗�)媡磛酴Qq樛}�:缢垭-��0�!栥�C櫛^綄岝~�辥嘻/�算譥>=1帚慊'坪{缒XSbf耥旤)o�纬c賊 �)i繕硸糥��9e�,婕卯恫q瀈薢瘸胾礉虢髗徑�'~i滣倜�符潨古皳7飝鳓鐚:謾k6鸇疝䲡:5秦}�6n*�&齝賍g绥蕌�cyv~坏}勮�<荴覻!鷛z梥km�#b漛W�骭h组硊荻Z埚�b夒s6藁鍄z灍V登 R{�:徂LN忎`�<�64�!兡赝M鳊箽渻-q滴便睝縥嶓>�$�敡�%yP�:g档�%�&: �慤+騙偌*�*�+俺毌^�赼Y(推,銄O鬆vUタ`蜊懐j�,�0薺禣鍉珉9úz�胂!Kk鎱o偗萬惠瞿Xw藜z�0� +葵鳄岑�=韱�蜥窕�??~磺�/&?瞩莴�屽錤娅鞔v諂}U炑`;]V{傀挽[侃畿�嫏}齷�?{i�>p�嘆;`�*千恻柈栣|婓€]}ogt�脡k銱嘷a潖v睚命i5垕x=唱�9]�L溓诘鲭滋中/p俸qo鐬鹰獇(篘彮g蜤�姯褶t澗�瞪湱{;青狰Y麨尾5鷲S遆鎃�9}m彵<同e蚑輫迒蘨謌�$q洉户>(B臘pk3�6t階郇齺挿る�+m音ljk�氰篺漐鏹eu甔�$ +嚱C� A嫷&簛�#z{ 暆eS胋s:淜礞3鐞r�cu茬嫌�.櫇,囻=t氉�1謏]�;)岁埓茍蒠_5謣嶏+甠b蝱糖姳�/>{/�+焈�c鏦秋緔z撉晴巷?紱k濻孹�6I}箓�!�漈帤蝘咈L�[�%錳;[灪7`傲)髤絲e傀l�mZ鱢靭/餆畴];U[W朔t輁W;舉g諟揶圂秢降5fuom吨u怡揶�欤貅肨鞫戎f�&沫�扄㎞�踔�韍aI漐K�2竐k徚辙赨�.駛a�:W鹲�赽蝒螘<<弋舃冔:=�*]鏜~汲羈.c箏ps脐n�908N媤z璼艑狄�m�)�;ciF�u甦O�\�+喴讵摣_殬M遍�2鐓��;X祏磕~uN礏�2�脐9势 +籞WK�'�k趸uフV腐绻萃橴氆 �蚗}葉,b?}7榧�6c腦烣苲v秫(1謊b,魴琿\w曝�5G胸宂錍氝,蜋朹挟k斿資钣麚挈箆澞is游rP朕,骾;熃腘镩鱨\� 黝蒇驗�6楘uv何 鹘箦�2趸�4疾\崁P蟆h"鑧略,蟚魽k萓�%Ljo畹8芅蹂^�1穳g躯u雊蹩柄Y玱謡瘶W掾G鄄d呤抐植柷篂].k蝝癜揼O|E錦孛阷②€蘨薢笨Y錭轾n�茛谖�jt��裂90> �楣XbZr�!菨鈡甆斿簡v乎)椴€塚�%J鵘柋*椧VE^� 殻藌X㈤蠾�?zWA��8!qQ�?邋b�>�F6~Y鯙C膳聗W亳L缭岇7i甾4r峦:'j恇�;~号X酧'~S岝郚b�+磓昪甑嬌^8蟦e謑辺b鶖8�wk輏~侎当緉濜P5竞ku磴ㄢjネF{o峏炡窃�.h8篫柇-縵{眃?ㄑ璡b媪� �懅猉蒯ow>7~A�韢羗��da� 焥�84VX}貸a甙錗�8-.哲��-��障仠kY�+香g�*蝅(喜)碑*Oq.�噑G[栧�'簐c]鐛4�硇?�6~唪m�<忄�虤Ye"� �0U腣缸 缵5硠諱 柷歂PVz踑�:jk#2噾6勆锴|&姵a>莗T鵛蘋�x`0e捦�Zkr材G礰G�鱋献U�.�v邻5盛}梪y竁�'h\y銂羞�<繌Z兞�q_徨妣停嚈眀>主�~�9�?躐籵灂X峤+納�2鞬h鏁澭ü騠g ',芛儣sByu挳鹿<gUg呷令�.A�=�d痑'桇锿嫖f惑篫冔nVW薺\诊夋K�7弥�.罷s:痣X輿梜T4俕沊f讫鷇gs葱wi賨m钸�/p樫鉝�#-�>1奔N3?j\y馛蚆礔€�8hjaY>pn�]蔚�d�4博惦墰{U?k殴C�$趶g�責腹fS`灌sne鱫蜱zv人x嵜F�9!g釁克~爫鑓�=l塾趝撕T檡﹊噝X4徊3�婇姖Л獄�杊/I�<盹#6"妄萿��凍g艤N.;�踰捆鹞p?f虐�%盿-唍濛FF&岟綑诽鶹Aq揷硬稤w玛`�=haQY瑧ZX顉穾�o絎�蠹}su厡觜釃颻~�1�/鴠蓎窳兇*3柺)5屨{1O遷�;|㈡钜歄L漈V殻瓴*崁;璴�>&`Io繓蛬竔澩���^k琏鵾;omFT,︱WZu�<纵x��鏡<�,3冚2缰:RU蹡镎訍癳潘ep脡襫 �02Ⅱ {鶾濶鋓兛�g烄�9顷挹湅}腸S魆壕醼滊郓:G袜7醆/F�&杇x拀C唖�:]秡�:赹{77瘥fN埽�2o纒~ヵ)1C娤�>���etA1fHu3/��詪\emTy舗渚};V| 稫j���,諾p欷N]碂ナぬX~郧趍鲊輋嚣p煜#�3鸐�╮跟涄升政-OKi�5�鋼�6黾�譳`G颻靳帙�+誽廹辄嬨W_紵t逕钧鄍��.0栵儬似 k-伾滳%>69屨姷"�歇>#捕儁襄:/袭U朹х_篦E4靭藆—�<Kj崁鞛 �/╃顩�%纵K5c5�嬟c靴聓育�<K炢嘜e匷梹邥i7d无� 酎梾澨w鄎n雥└甹�%]UxOξ氹噢骸磭蟢�雥握┳�%缓輾j�)啕狅�2уD诳茨Ml��+a�.€�%9U嘤I:Rq~厁S蝝w裘{GK�r泑-橑7鮜g}9藽E_!狭柳h奈�暉 笁�:`�$E�#瓍0Wv]�43外C虏寏暷�4硃�顝r�5梦誷萹sM|ub礤a;颮}6总凝�/Y籾�?堮娟d鏷啊膕�)S戃鞫帔蕓7o涳�+躰7o頬_緔�+舍>K'閏�:玤沁|聩�溇梶�糈Q鍼帍衧�5w0T恧sr\ay�:S杒u^€漿o呜噆Q熒砙摞飍⿳壷鞫Xg朕紋视沯�鴍�?韙漽蕻繎T缏妚q废﹟噓鎚薠蛖硊�5�汱伡<埔L!藤b,郦诡&虣�(菄\3�<�:W鏐{�钤琽u壟愓梄瑄o�9趸m锘�檳TnpH"��0虆�!頗�3鸃$烥蟱�忩鎍蕝"啯r圴ㄓ@:⒕侵 +�6W貛螵P[珣O萄uF� +鲩im-胤蛤t櫴钵蠟 -经捃召�7祐+y喍炿�!鶊V歛�-⑽腦懐F枝╯鈮堡/鵾0旬�0尺 挫柞氹歉:跺�#-_彎g饩聐3抗巨縴鲷:� �'坪�3°y��+\&苧}咽嚪捶仙�d;g>�桿閖aY灍\蔛x孓阽Y鴈澇觵v瞘谁s礴捐}榤��]Х饔詉齄{�o�鴛o暆y鶩�%�}�1螻駊殨�陵�"#蝥阮嘪埤缱G�7r;瀔崫珞狖o鵉必俹闹└�2吵�|еS壅馜琶贽�:玤槴:截M閇5�!3V�&顸z藿�<茯w9<�=C€\s蚗厽`?2� +鴍灏�鐱密甑b1<YxNT'鵦槤��駝;痺g吹€賵c;9e盢;ǒ恡寏語k0糞8玈鱂迵(�$禐C�7斌鮘錱su_KY'寍5 Z噵5畝�+苆价腄齕�/渣o鶿�怙Tcac黻觴ksbc蓰�0织?t點a某t]�.w)VH鱂銚�ur1冑卟脈g� +灊拂Ф篥走t�妄yv转鬅�邼=鸚懑`�鄚宗.俅韾y� �9�<Ug镘浭弙鯩%沵�坎鄄隬谎��薱�#^秕冁Rъ熿7灣砽碓 {g�L{07w5[S絭} 緌较椭�1浫称绀茶lN酭縉抨A晖�/鐐r蜸硫d睫胞 t>+='r�:K謃X�*/韪�攪mRq砨z硯痍屉扖(~А扃[A舅j-赨滂轅kG蘚睅�4褘7�'霻bv�>G牯齒�$^碠o壉���}-) u綾龚0 +鍙�=坪钑/瞬j� +痴\�>蘑螘h0剸~)�9您�/孎駮�;櫂�/漡57鸕'tJ�#T鵝征€k氛�者`�媽祲甭{梠�?嫳聎�c吥X1V弦y蝍�;剑1}玣�2鹏|縐7's蕹殫�9濈0�噸�#Nw^誷k帧洋3舔帬緓嗏<镞逃庣D绩糳w采ve愊�&籬/:c汒C慃乡@鎟G虜飉兪4� 蕁孙y纬罐�熍km�1m藉缑嬿栟氰擴匍{P�铮2揬毐my魂櫭0兌B�7�0鏡;纩碖W]灤G靤浺镌s灍獄k;陊hG蠄�9A{Q�潆�鴀ry宫攫篹W埏埩�<齧p澪鷧焥�52�飱薈n�<n�2"_WL?h灓拆絀Y緉m蛒府韸蘩桚EI7侖河�4�qVO{祊]蘉焩嘢_J秨欦饖L條f眿?硕s裷萫濟e贺s晪��{鷺俸戠`b�r飓�喾 ~唙飻\o�/hh�陵棦~�0栒�;/�葞r哐遀肟廧兯{喚鍰W鐬�器r>鸀Y闓僷濮疉蟽|Ⅳ轔進z玳阠;�>�=�碝巷瀕ḿ櫩狱-鋙�C紆)幑�3{J`蛿�坪橱坓B�-� +?>锹X�2cm反�鏘sTl%i瀞�!剎撎韖~�1栤噕级kz*囐d2�&蒋TN機嗉E,藥櫅威蛌{欐<灄绎簌毡�8F圾g��毭鉄d缰莁8�:枱贳\烚糒鱄m凭Vm洘钓�蘫2縥宯踠s+糤櫥堵';淜Tyv�)>7骇默キ2o禊|qj{蛃鬿滢垪壡桳歖�饪�隮噊y賓�揦鍷m�� 轠�'涇熑Vs�.醴蓊*齀锩�7�>Gm�1,�R}獪璲x鸛遪{曀�24k局:囼攫拱L�6�>�繜浣s跱[觖TG麼�?K黺�9€e檩╃P鞶��0�:柵}俞S送愉鱡謺萫)参�N顈聥�*�皢灵娷S豨,錶c畇寒R橲P蕧忰D沒篡潆�/e鹔尺�9\^�=祺wN�:瘨黹を矟癦糷�%﨣於�尘洤.� �n飲�'�,�?圌�3�/�*藆滴暎璟樛r㈠:珠2鵠謳r靃筭淝瞘"陒洆+� +鏠雿Y縏頞籺�9蛹N齾扈锉oL鬄�鸝兼虺1亠覧齭烐RV鵱騾kM3嬛`a阄=遦絍N?绀��緓蟿~v^�'窏簋毵�u�~酊神褍毁彆6?s�#�!萭訒纭睕焘骵鲐pn鎾�8]l墠鉄竑 f泍]zzg卻匌h僸z€� l�;&艼�螨國鹯�#3杙Xf�9傺Z涄mN逶�秉X�6�椆阤槺h钐�棽/!� 駤�;Zw萲;~�▆?�8琴81*3盿an�馍卑)_!_�\*违v 涺頚诲w%F飹�?B泂鐛敃�顗X�+乡�.f樈候sl檳�;槄77R粛蛭7�#餣{;鐥鱀u曳J鲃��52VjF瘘Q�#杦j� XY稥�%蜉醹垞踳Ncq~鵾嶞濐Y1娥5鵬Gh[.Ъ鶼z7啅褫"KJ�=^杘z酆<7餟姊�9s瀷"m6虺糶o紆氝绬6s衯霻�'䴖钃"汳�+�邋ub┨\TWW讎;щr�9+笾載燂�2匙鰭}]�$:Vca饶s壪鲩yI脢�鷴/-{玮絺6佈曅�ō%9A�爥 e伄Sor祥緕璤%g j\V}3k@5肴J磗4y衊韙L忲DMf梷YPΥ夝1襊鼡t�6盦瞰W呩/嘶剑礓g耲萖�6ゑ5w毷w堸4倔诓�sY蓋(k牗�5HNW�魁犍酧?揪U弃}v?}t腌i_a郧汉堙|,f�2^e孇!歘�始H笪 >猽蒓�8隌钡a藄Y��看繑J荟�+<菲� 卑N1傴簆峅c|_k@苽�9~鈞眅慁噇|茪yL廄�茪栕榨睑耏腅s$烇兇嗡4椾騽圎��*飺|X壵 穯�� +魋鎤€跗g岧>蝅疮魔f彳揖躻R9娑鞁箵�.�?�*飫綼�t鹿購t�,櫙M獩� �鸴4cゾ�0鹴G酳式Vs�2菫鴚阰霿'�)>=霏B[Q��>BbzzG�;e)飨��>s鐔�~0~⒕秴飱~O\/黅嫙俞a鄜Y煀�7�駚Q�鋑瀴�6参★a0銇0,p8�/�=E>盚z��N琕�'鐮耛;�渵&渷尽=蟬萀鑬忍V龹喝巪Iq峞G�+睸�8f~�'NJ>舐M梾栓<b�FL~�;9迗篢�.A舳v瑳 >� 縞 +�$E崼A�(熧匕C�*�Em瓰}D ;]I9s纕hG螥懗6卌-A鮎䏝f肇鱲⒚箌t�!絆馵 +c]诧�8Jbm�7藋囲�?氥9S^#蒢8锁磆紥o縤)忊9賤箧觋蛲銍護>|鸹cE?謒� +��?>???>~c�濑犷潾紟�$�1晆{僤幜1F3杙憥咸釽/>歘x鼊錈艾�U1�9+Led�1蟚哔�3l�f彗獾{y熌�T祲娴=3朗潆壹M~鲼釡g州徾[a瑍6�&�z�,t�厨b悋塤mL飸麶枩^瑛i婖�Wk 嬳�P咳�"LO骙�墔F畵驕1�越諏吘木餕(螸飾嬨~#�b執美�柽X�齊鰨鎔誏�/躉闺鸛墴杞z>X鍩*c澔'L/� *kLv鳱%棓�砡/鱀��$鵞罔~Y鷑b勇X鳖:?r��< 汼5j炬��Y徟颦苖Y�h}則撵紫Dy錅'5K�|憦啿G峡塻狓.鮘J��5锬?馠蕶塡鏑� f咴8I湹籗v聍挘 艊E桏0嵮� +aR~!?$闬�6曋M�3せ档篝皧N衷D�騕UzXi:l8开G峵�墲滞BΛt綄甓F�"軹趪H鳡蜾b�&拶柤)z埾&-�9倌>E<%^絊}V銉拓€~鏘rVx=�/民/e涚"f珿鱊岝鮓�瀛昙G弃�?,甭乔鱊寀}鱊ba昈@蠌9JfP~杸棢O-1G伞B坡<.�樼B顴鈈:铫孰�%鎍焷勤2巖,k衴g�7+y]嵐戠a伞"喲沟柋鋂a~'�'壄V~,饆fd鸪�5咗u沚,莀譽巺�萠G箊�﨧�R,冲'�纆瑱薘鄙襳�育R鏸w��;(q@蒧�k剄���槇�鮫酦靤9焗纞傧|焫"麎:蚗桚k_O,忺g�氉觑9@_d籢鼫嫁h�% +颠c�敾€�}?正戀H芼�L挧沾涺ZH�y�蓂pue!�m�蹟<'騅qNr_r�;�5I<娣嚶Yq>$?��%>(鸡霳u�P\4椆v燌*�=頇�.玸�4竆�+岚*'裳挂g9鱑yU韔m�1,kp 繵x~ 陗a漢g蟂D���鮶毊蔽溿庣�f��4〥K崣r�0On�=�r噿/GlE錏&#瀼鲈专.鷙�H�蕂!锦x驦^坷檈届慒粁^af7痏>:|觮栁m濿鴱_>9銞熆|躜a�藁�>沅_熂織峴7F�膸b�8穻肯眳]�+荤筚炊顄�=bRㄏ翸0抟姬鯟9隿洤g酜帝幾錁wn朐m"1I�順'箍B.;碉h眙綨|N帅v�=镩7g匱{痖�,�崈箌O馇r瘟趸�^媬�?X掱亨骎u鎦鹅s�j[殢�*緦 飛�==断閨寐栏十禹k��鼅]灆�=� 棝3c�0飿+?雴跰鲞第}l�5刎礈噧�?鱗鸠馋遍锰A軓炀D觲孜>B�',�+W� +Z3羓+h 哯3A|溘a;祭鏓�3鬛姓qY耣4租G�1`;� 5z)咵g饻瓳虾猏m止�QV绐b'糚sJ隲辇乊[侐��%闏癗儯sUq]�'q2\g�:璾�)&╰N薡詋裫O琿J�遢 遟~飬憖齳荜蚓Q�'�(筡U3�\嶝眰9D峓秸S竦莸!3V<:漌�F韱踕锦脀縃岝(釿:懕韫妓顓vm犁@{�(囑讴y}�<纬e瘬[/��瑹�2劵邫縁瑆詖xoSe弝3扺媨稅偶6苳C>苴nl鸂9譪,睡�:i邤�0�,豞鮂�&�韭zQ3�:~镖9\碢o�75�3N讷S霭珆頱7�<`k譹n辘�2寿d飶靇v�)�\�b鷑R椾煺l峠讒吨栕-奱�;豊闐杋jf9�$鍟麶�{ZXV[Kq灄鎢mс槙帢_'熧唽咡�%�嬔�8敡缴鬁展鈞徳i橫k�嬞{斯趽豈dg5撔?e献�+劰鈽J�梗7軄歋卌瑬(矊P1癤�睔:Wmm摇腃� Q儷覒0�=`襱�哧"0cu氡滜3j,魤.0�!dl捱X踺♀稻禼�9欕骊籅�>蹍Z�;薠棛盺|� 閏}黜�+c�c呑wN霐酏詛莪�|!6�1W�+`+�.~︒�#宐�欠e氄溺跨�";�7禢预鹭顺箨賴的抏\琏衵^曒`橨r逷廟賮�<鵪A狮�闑}齊/苇cLG棁椦貐aV�4騊�F毋l亻2K潑s$?Y鲈�8聉趎X/唡�#贛殶ì蓴牸qS�5:鰽曠1qo鮩6s�5V沘7�<�%講�(挧铍疪漖/据騳禢鍑雓⺧鵐�?6U�1絆殐袕I玑�閤硴)K蠠撯:T:捸�渒y谟莝rCo~RqQC隅親\蘪塠濸��9 +>�&飿z1W閃乶傝\5\藢咓fK砐K�趱-cqLQ|X7l1=)33;A铧隰�羲%芌週樥�'<は柮s`艹>�絈�烌�"c=�岝炷X揸Y:?|麾g�_緓x|蜩掎螡嗣8E_爭_�5.樾h_畋�8嵤Sc邊輠維1僮{瓡濁篰霻斏沬錨迭*Z薌沁Z錳�;贌篳圑+図锥oZ;�\譯圈�!Hyk�`蜘��qN瞘蓹A撢g-Uv琺[湿靂sM�4v�9+2)邜偾C鼊辞\�=缝坥LYM;眎�'{�6嬪Y)鳇每懂憔{,粝豒km韮綑漌w0cJ�<oM榈Km鏷+琥5傓���%�,&疚%;魶帟漢Smx.鏊>3O[蛌p.瞓{>圪��缀�:�u碠l勻D鐎5�<�,置:�ヴ皜隭麚舭胡<���k�軹_惚顪愤w怌咚莙;帼緱\{mct祅h70cM獰昘Ⅹ疽H踻鈛恮�p轎s\籖�<鐪鱃飏�0灔sX縹戍X/_>J寀簢纛篰玺&�暶*{杛圆柾暿u%;掸�龈壎戜G� 蛏$:BTд~�9雍纪襧Ru2雋禨e翞.帷R迗K睍g��-釳~�}廹0>W蟊f� vk9嗣闢垵>颳甯�:诐�6s蠙儤笌玳朁D疾鏥a<�&�&峸鬗w杭j]Ms滘墰�>p铗苵蜬�_儘謇~j`譽枬/m�骿D浌i�;url硙�(1膾熒鷟葞l戌轨+�8\矼`F碶O�)磢柯gr&國dk�鷡鳺褀単��"�#珀�&v╙ろ敪鯂"_�*0 _图G 甑~S�艈� 绂{~X絍!;['畯$譣譑eue�炛滓P�7v|_�蕁╱鸿滑�蛪�z%祂.k0vx�4癷�<d庠f溟坨*�,躦�b椲礲+`翟5吩�甡緈{醥[偻m;X圀汃屳<oS>V郧妼蹂顼~僛軼�<� 椣�緙r|/� }}�09~ +E瘒鬣髀:�€+r 劚�)褑�2gF薤�+}芌>栎潬�[t4`飾a;�?珯墇TV/+颣覮噓[�'蕹8鑈+灜$|呯��$&2躎硺g�1踠窷毂N娴U}Vg铸歺^壹泣ん\觀�!婄嘁<�炞慂�杫g�=G傣胹pg瀼(綼腱`�.py壻偰}�|�<玻yN�再�:]荱�Y佂氣洇蝥[讐渪.6D,葡*vr�*澖c;麣c囪鸰�v�}簥噁e莮X千蹃>ー�<?齰扖>栕g�1U~&x痠嶣;裘Z痪鯵Y_'�哪|砋4�W彜筡�评�9H閅_-s鹙Q3 +5瑵aD肂╙@鳡8�癱N�2Q7Kx�.3_�稻諪曊�3vc�菽�訋9+^s:)敫扥 �$簙+Xk畽�v苚詹#茹襣�9� 臽f-W凵8�柳罠襶p昩卂~龹9K琏�+�?嫟A颺?轳'噰黠#烀�s簣)惐擭敢笤孍�8殗蛾▍t'�+\$赑{�=蜘�=骕@栆慏]�-雧�'j�欒GP櫎疍歛I++�?鞾鐪鮱€盉�b�0�:1V虳xn&�'媽|_椀}X蝭莆a,�?餼�3匮w縆彎�錖窵T鏹惪撇螀�9分椒犼]篢�%鞴�|^脅�<N呢什�2�*6㘚般�1鲬爔}f渺o鸕錩鍉>�>n}潁eW砞獾N�%��?坞鐬��隑綯酗晑'*k屯�;柝愅匒帯鹃鏭 轵j]駮裙6�K|卾挤瓧~D�+蔩o鵾(窇鈚Uk\鍃$鴺Zv脝蟆:�3唐N无!_嵳��鑑�\l讖曋U�膸�氪靽zX�髷u捭�N9d紈�悱:9竩^瀄咨橙讷.�J過P� 氪�c垑o高<佶3�7r&�寮驴莳�强o幙�稣耋O�_絰�痄褍胒搕-$嘺�3�.YK移芚�福妽Q瘫匕T4<�DLG谏Tou幧`rh䜣漳�%zg顈(暹摽師�蒼6:洋炠*�7�F褔g庄5镨綜駩峪[��毰艏偧}正辢B�值澦1耴檳<�2Q)香詙�1�彅'悱�7癒��髦[v挏�:森hqL�劚埮诧蹄康饪艷雼6躏�>肂褶|�1,贂{3>�:猪��椴��j�.s濙1瘭飛]麀靳莚赴i0�+>Q菥�Yf�;奚璆3囈灰綢ow猺~L襙`穟�7醽�.渌F楆B驊鑬Nv甫+g4km0U�+壉墲蓙R飔� 牄�9餪梇R窗Tn;2Kb�鎔!住�*娆1cEm�搈;%O蹢麺禺镟;]k菀筠-车8L接沷�滐守灞� j�乊欩措囉�>抗巨縴掎驩呓u?�?~鵁7/c絶yb瑖踡襣5鵀0讈clW鍖�+�:�:怡鞂;Et黽:3e炕苗�2#�/jW�"早痤槢�檳r鱙;岈嶁@8_塴杓撀Y�笚愇O"璌寅�2q?"sQg鲌Ь陪l(y鞍GH颿匵a讬}N|!瓂!鲌灼�擥@km絾昼篡負蛓j匍�1驇�€嵥硄6.彀N�0姖� +=栜错 C��6羐M鍻�k3埒瀎���;韌� ��9\b豭祂衩&M縁vZ鹈杴�屨棗汶Y辰枚颣诃蚥肿��//綨�茲鄍涽崀1O訐鍼照欷Xu4'CY繣紘怸俏蹆趉痊c�(瘺驇Z0菈� �宖镉�;O3薺p姐�!$吭诔3za潁�'�;认侠3tb僵/Y�-涤� vj0朸鴮E筅j=鸧棍垮腦濥�-_者紝3櫛6蘕�c齮{�}d7魁帏偾O�/熆{xt�^b,謃楨��5,+韨扥�9陎.潻禥cl€棎c�<}凭*k�"Q湊鯡V�1� 攐眇<$擬荹>�X 8L関I.犖募 菺鄿孍�靇"~ +逾�%UVw轓t燄淰俏錄*;`�p騌�.湻�:��h鏹A�,侃\疵:y眷瓀� �;v锯N襳�鱦Y井��琺�~掤J絻斪A畼*8s纋溚甎厠$@L�驓鑑轷F3Ω纋臛l鼔峔嫁髩�?te轞勺j1l�%蚥b彋比�%﨨彵鏆盫跓媽%9@c鳏塌怖G曘蹴�鬟Y苲бL(�牻幸[璤J⺷遨M繬�鳼鸝麽椯诤ぴ颈緮攉彼�?9鉍1�)�&�)Y儚�X恢屽碛�8W朦z!紲毼烯in懕~4穇=;~{晴�?��)�+gH�5_�:R曙�-缣亸I琋脪迶f�/涉舟瞼�琞位傭;静M襂蓼骦魍s菗]薄3h潭姘娡湄楣zp蔶毙M烊�!禎靟襳各7�?冊脒g臣F涁2+挱c7:v颥[輪锰鐍閦稶[7虢幩v四齞Q鞇Fy枬kn�>`铞を�1扣伯譝雟掋 l*黡鬒H+D錦�>壣y饭67>橋j_操赿軦镙溏琘钻�2�慨氙鯓X窛鎘埃�(7菸�4+⺈<╃P秌鳼獇冎&�>舃巉杄'辕j鶖<�,騝i苽:]v" 轱�熫浢X黱�&c)顚� 齗唹Cb壉渡n嶼X靮b7pz妙馒搜%o^� _!镟z壙S鬒鲘溕n鋧噝�TL�+帽�1頬莬湉u泴捣~冦譥>=~酊神�'譿畳�>+M熆娳�xI撸逕=鸔螀抿:>cP4NQ�膝苞U|�鎲丯毳曃桎鼡拑�8坰跳L瑂T绗/g,e曭蜍��3愳鎩.�.l��8碮�8撧夸霒尞鷋j邜�G(.p�?籐鏸�!惜鏁g笶祠^(�l�7sYZ.�>譶皏>�雗歷歛髒 �磎妥聢銧烥鲿Z珲�<�雓�?酩嶝 癵滍�7皳赡�G;�褱%z甪X�7纚蹰e縸靆A_稢蹠眳}秞鏍氐��礷VW<;蛌葷jS���=O渴恕r5硨?烧9]ISif浬q忼�:h頀温zPx标+��<菑曃垘鵛卌�賣9�zO�养HZ |�禆;崈�,c嚉 +|炮h緻ns劎鮧靌韊5乲��7垌嫱帛鹎[g秋縶~嬿髾袕�钷筁�>噥�! �'螬{F愅鼱緱�7B�濢昸瘕戇熦n劦�:S#�93柹�胳沝讔礭鶠i嶶鱢韨謄瞯菶4N鉠S绠凋t�f�vM树秩5瞶迆(rY脛黑謮蟡昨榌雿颜,��/諂G闶伛� 菧鶿珔Us虫5ou緁枤+讂钆蛐9U�鹅�8常瓡鰏€b?b憱��j趦6� 銗褰�苺ZX靏_懈B粻韱�3虐a须墯u羐k杝[朷槄匑o赎弦>脊煦G;宋礳觤n矶蔔�-d摺玻g€uO]瀆鸴擡�讒€y�革N8藒�%� v蚪誺睪蛟津x>C�釪}�4隮懲妑闩n撯€[缔气集輋豲鲏�(緘鬙�Vk椒鞤?噆g岖~st逇fΧ綰m穀禨鐥h花莅唢�>肢棌_}耵腦/o暠~嚽?�雚:�06鼅催W鎆^K螜]豄4果湯=X婝Kd豾莞鉴騌�'Z�/��S驨瘾w嶟a犻敓林╋ {庤;瓱A��.�猤8窂�2�<儔艫{?3J�xo&諴僬<杉!T溫|值熁�/q卮bX�?浵Cv-啳笾5脄yProZ3薳]姘髿Y�玞扟僰輇輟��,!囐筊鐀Ym-/~X3卑n瓝兢鹙钩f]蛫灊�Y惘珈D茅fC魞Uz'鏸�7万攡�#1�4i�ナk�<淹�0�*<YkR憃夣珢璅*snb7)ND?讔铳�*�詖袣1朂庂&隺烞濕gq?a浍�6�飬uKN鶛T�(Co京士5資輝蚡輦�鸁哑c+�.4窗�薐g閿3絴橖X翻A��颾>謬�熅p�鶱跊犫軉'pザB橽嫕�茄谖添姳v卤;鄖觞I>%��j肝�!悬擙DN潌霘贘7蹇�絭硨%v杣�q�R��3�=i�毾 �鲛迬�|#@踅!��霍+Ъ�+}Is⑶癆� ×釂劈g5;b焥�/繣蚾Z1靷嶡艍�毯�=氭n畀=煤 粫j�3凼僢�k;麼YGjD]*�by忙酳11?�5請浶OL>Vl�!kg銄lg掏纊J笔s悥椁婩耗賝U旌顛ymV\�>掀祂闬iYpl<�,珖缼峵粯冡瞎�穮�6�3_�9轷糼s痩n籶樥fVzi�0蘑寁曚Hr�:h\y9扐�#U�龤顟Y淉1�'坪S我y窳冦g�>9~黜炽O~}k岝鱛>9彊雹臊'�鲪睜莴5/p噄O~~�乧Z雚碖鹝�e鲟帔荗�%_屒v� +鳓咒Tgn警#U=+晚7绑8仰1娮x�"酎增難螾1爨唾:⑼堿骣3�%�'q�9;朊瑱s俅猣,�c酵3滣^琾疺俗╋朐陛皽X踶>QOЯ觹X�8珯竳��~]c譢缶�6'茎O鞿\科3娆.曟,芝毝�膈熛�梄�*3�:�:g,v夒�(逈軬群N嗧H�:;8滧 +煹施Eo4当��3鏹贴岖绢磕:昡P9Z冭僐渭鑇閈)�3Vv續僪z%�%籾�霈�4OJ�2ib澵*绻霞o慄t}o�8链湃筗m;駑yV=烢耶Z鹷s麷��?闩{<縺麸�;1轴醿;囩项?耨鬟<=席n嵄譕�振玿^釅�?納妇s�k泄q k�>cG6jo=徟�/u�癝>K芸$c,嵺膧谖鋆邴�籱>N0蠣�诪A踪鱢_R�泔m机荇喉&6隣e珩5pB+Z争G�'讱%;悠>囎mly才�.霘6qy桒腶6藴藿�+v-諹sO冏k⺧�)恢統氦7沭穏,�<桦�m夀砕&?=�柞8荐�S€玎丨V�;筳�/�騯榧 噪_2謰迹貪y唻曋}槉熜鷘鮖b杇u阣m璔鬕泔辯鳊q.Ti鑌)^3{壻�f哣��杲啇�盢�/寁壝j钐響uGI�86瞋(麂眢T磉C緩髱p�+怂鞅1烁蚗元礦龉庫毐捳愭蚋珧阩��牮�)2猪饲��q�'侨u廚�9/�鵺T靂1撐�$^P1﨓;仉vh孇(��鸜=;�;繶变主x�.�8{詐/驌东骪咧鱺`�,rQ�|;滳谥釜鰾y9*繷帩娇>�櫢摐昜uz钪 �'�;k籝�5笟Y哕Qb^7l*萜{v唹;儩e�:栧踋词3麈1q�'禎_�9瞩鼠滓眚j�闣a牊;AssG饇�邾鳘��瘸�?厹隗�5珒仡cWs巘鼡- .jz��Os杂﨑蚎�7€�;喤P3羉�%}UV��&|�._麜礪蓷舿G化表焜琨8铷揬<d'彵鴽b籉�4~Sa6�0榞竬綩b琄d�'肺X?1�钧帏�'櫛�韗禋&�デ遺罱┹琗哇7rS;�9軛鎠�9;�蒯瀶k厮�/pl呜 v虥兌.侊蝘藺E�揼w~蟃侑遙meg藴uy鉌_冞帾^帅Uy-哗嚎 鞇闭>s尺琐-痎矾弈甉rx�# 顲梔稱vMvV� �+v6媣薀l橾qж轨蘣Y&;烥濈嬿绨�弖�0礋蟫l�ヶ彆焫@弧�?汞鉲n^囬欃L.踆倾0駳g防�7迳:a琡X岇\茪J{5-Q止Z吺吲筳齋OSr;蟈匍媞�;�:踬D旊6騖六Ska巚緩�� 硫巉疵咐m琨╣0�3麱#c]F柒X釗鉾哕r>窒縌寀颺�$楛Td]>I鶘讌u褟源雿隸旼寒�yH侪觖还冻u覛縚�3`.忳誢(鞢ㄦ匑鶔踛摊| �h譟愍峗^�靛9勩耟3 k��7陝9Zq嗎W逳8屩湚�7芅蔾睇拂嚰寁J� +粉�籘瀋銞鏮X蛈趡kplmW氆.趛屳瑆v诩f|mc轴螤�S嵾Y吵钣�?Y貦颞4�.jIay脌� +;�?g庬G�隓芝獼3霒g罍骶7愖角�槪>m7窠站剞p�缯渷v谶i};�+馇绅珸贑H� 瞣}v�?Au螔�禎蛲�栦�)v扼抒g]座x錈磄b+�0埻�$徢�*;茹Y7騷艾弹欒俳]緩}踃譻b虂篔鵛w<�/9�V齒9V鴑a=�K琵麎圬鎩{筭糿盠挂舴虔錃�:庸7颠hX�!�� 锴發忞~+л�'謐`嵘壸芳鎘1�6檬\饺稗ǜS徰╉殈亶扼X7萛釉畟鵕窱榵m鞦�<戏戠cW鵠兜峅疂虂<��十鱵刳�9軌骱v鑃僩望泌��^y贪啗㎝Z媩-e�柺;前祅斚覾浫#s�烓�y哕&腣oi7+;�蕁蔷1糭�0乞,脧墔牝d�"番螘盨鍣u 娸f�L?橭祅*錪�<q-逪﨨j=,aS�2n€螘7惷\gR�~抒矞ㄘA鵠瓿�)鲜睢\�薃淮b(��褀嵹割A;~邽軷彵�2{逷階�肿�<婡]=/���F岝栳踽鍕嚽/>{秫脀龃R嘻r蝱�:鯿潈蚦$�鍮芌髗e'锕e圍牉o食箧�蘊7阜ov/g?竎租縑麄/岿腘葔鍮艬�#薮鱂1鱕褶廪%'�贂6�(捋南行惀{泟=淮�+c~大�怆4炾=轫w*l瞕囻�:趍鄞鉾s恶讷程丈譽&嶇鵄釼謜婓/掣鉩导苬蔠"韱mW甾誺j� 苘搀b浽聘~柌茸S竊趾T枡�vtO�b绫嵉识澱5楓k侔*o揆w4毑茜(|啲U旼?G焌�跲i��Oj絋�#@�&阫!o�}\坦鑬�5硶矒�i( 玦�+?雷�*溫7� +[X�洇�5i1?iM/裬貣吨煎迩�>蕴#:疈�#�7 蟗�早任�氲�<G�?夕N_��-硝岰_噝�+寏琖/窥忾袂^�欠芚�蠋�胥雝^犭S潖Nu_^頝螩悖i瘖眑文喛{os硪�8颔苖臱#�%2&�<]遵�鞼浼錜喸)c墓b襝2�0&)赙硈�3冉wX^醅ca�饽�鎅���欁哑犹湒9q_份蠡�;胩硸>B忒}湻墲堕l葷y�4�腙>Gc�<+^腷2;罪!��'}輞>杝暫井最叿Cv��<b甋焟H鏷z黖3涘窥郄9P{Tv9侗e�囨0�E妗~b勘鴐!嵭骗馞瘠酦j�<宽�B�>'蛢�郏鴲屹ンNxR鳖蘿dS�0峅5OnUy�R授︙�霷�如ヮ儿躾z吭?蠾&v麤q'h3! 嘺|sb=,孻�扈 苼糉>$�/愗袁槈韟��庞�'�+*�.�樸$?H曛v儽AV#澭x4kaI�#-,摇%茒u憦l蓍龥�`�欤顼]�?劚鶪^笸<�%v聗Q靝NE[雘e;��?蓐Lj湸氘h枯m�9紌耩椣�玞岀�c筱勉锞z炍+|7潵su�7躈�'7喳躬紕t苢ns切6綗rr瀷砉~:�3蒟g�}�那}(龍�脐讼R^B�3餦穏燏0l酉鸃9鹰=蕇廒措g5嘫{i�<nnJ鸼\鈍嗠z�;y>檯怔襼8n[?�跖�3佂$�軣楏[h峊.9 �;嵊緸;c� wp邾�/�-��3�,i;d"撕T逌�'蠲4&鸺dl2Ol�<栫/z晏�4扢溓犬SeI�DN`�9翎mr檣a6⺪6騇�骾鵛+縞?�娍撞隧籗蟌飞�茄櫩U巸�8_窘<︿2征:麑邔估m毐2{(>硎=银U煲�0NL鉞�;锬6御|⒛bl稶s茷戫h�6镵麔e\蓓甆吣曁k�7]铒$�45?撇杜n*3䴖鴐鼋=务�&]鶠q� 鎟毡2瓩錵礿暻衋^}蝸顯W侓�0可;譖r军8r摰硽Y趎L錚�鶐� +c儸� +鞦精<~NJ嬟屭嶒届咎��嶇滙≈�8拘屣n浧璌炃蠡>倌鲬苽O4梧鯹�#]�籝豌x�/鎉鄿胚1璵丆R|$寚蛌s竪�*� +傀曩馩?揪U?诌龜齒懕参纳魨裍挴蘀Cz岿�踡犦荌�3hM懢飄方蕍厑3o�9蝥�2貼4�摂�'毵=�;3凵繎�,鏭鸟{��#柗-su^S鎧荰.茏旣L�螽�+賳�/遅�"s�0J_ス)拽讚辕鶀鲄=塭鑮烫 y无蒤p�;=oY�&;hd#d藕�?垡&~�4鱫`^L宂竷趨�3�萅� 纛�Ns�.�=饌f雠盁�諿t衍�卽麨骥�鉌茥�竲{�t暜┨盩r}*k{娠鹍董讋憎i €飴黚碧X�/旵m7R^My謿漞n讓~闟ノ黕�2�a'f�2NP受稭贝鮱囼伍潳瞓?)�蟅_w啽;赟�-c塣7韶SX缭n�糔�&觚-\L�'�圫埍�訵�;隘3展籦_,絆�5xs绌莱鬻�=衸E龍讆妍忰顧宾疠o痈>晘粟镱牽�>*�蚇矕涞.錪&Z離{ Q儷e嘗u瀥€=劉諈鸂Z[K鹺挟ビ�/郗磶睉琛:: 擑�$鏚霚幣蝐,�G+邒b,闧鼛g�/�2護伇愊Y�;蠿徧哻菛讬;5X$>夻0搽K�4苐痑䦂e=�媽蹼╈�i9{颹熅管嗰圹"� 6Ⅰ9�铘�cQ{Q�s�0疀垪�.�圛绎�v0问澑E�3Q��%溺仨趔 +洋B例髫绨9�2烇呡v\>i,蕈5�>豌葲簘�7"�k愴痺閉錵},楽楮p購孅*蠜渠;<��3�<�椐�?庪s��)鮼缲r济畷陖Z�砤N}K�2h.!9囘=+p�1嶢膉斪3鹴?z#}姽豴���8�|_yQ�};�;�劚)嘸Vs霍顾鬘咞�;椠曳撣m薻殝��7琌斱X�9耟萖龠懽 +4�#�lX釅擁@l遡�唛�5竖摍 弃雕钵骡i�)|Jk@fJ鹋�<sd,螨O聣s櫙�/奓9��'4�!婼沺y驨黊<吠u�k �悒|OMm瓡諧 茒�/齑m瓔�8+賣r蜰鋾�肵暥闂 .嘩P[9juN�62 笥6瀚s綂'肠(sl鲍赋雍翠驚0置隱礦6孍k抵=cR邟1 �?戋鋡聵�%綩蚗i,$逩|�0讛1锥40c輳岝(1V鬰箜� 塔明/巁|聃獹千�=8<�}杠塑ユ遈8嬫⑤鯦�5�#云v��魈銰"v�2怗∟C�,�边P�-"胅��薨D>篯yv獡鍾hZ7蟾卭�j�餯i�;�鲑�6藌炡m鱪��剿嵐愲�=鈄/旵珅X�;け蝾﹐蒎�z猴m彳hs瓜|曟�fai飄椬鄥噂�/叔 f輖�珉N酆}K9芊垯壛J鹠�肩u钮鈃b^鎍� 含蠅�疧笍]�7秋?葶N�沙堰%蛥▲�(轊鳔芧瘕N饉1F壪0N缕鴐胸g�=~gc�nd鯥~牺0岆�嬂5澳貈Mf騍kf楑漟M~@檁�>S.飾�p8�?}?錈夜qw.ve珺爚^`,5€洜瘮u,c覼屩Y�羱庖邎-煉o岞炧� 砬淫V錵cGK�@宯艏.c慮b睍a�鉩#崼�鍋禫SU確)嚜;脻sw]茒,F鰸�H壉坃備ヘ滣娽鎝靍琂c��璚.yo�茝E隚妎苔Qn�!橈#y�3_6��6懕钝磲;)琮穇=?1肢[g�"c}鲛裾藝趋��?訴s$3實莏_4�竉X爬犕pl牭�婝a樻@鬠蠓>j?�3�!E"s潑_�S鎖阋⺻d吒糬|蕹赲 �?澍D叽觱暖�8I�9Zr�4#荝烵v�%~C螼�9囨9豨6稆w湎d^呱麱|尲L9$�8炊鎪M衄鋬Ms䴙謫y}w彭L鵊癩鬍塥�娄�%愲�苂壘M魸 +S\&?,鷚褔驾\*沃綫a� �往�拀叞N毎锶\瑌ⅩR齚#韰6�Q��鐂^'�8$���%鑉i-E�6�&撥#糋j7淸�9柉I�恕崩嫦�=�jf�.-贆X;�鏴 儁肿Ev磶岫C鲧o$邸譺厄掦F鱂馭赱7柤#研mM`盳k撬|'7�鶸蒋K厇4遫狄�,7�替霔N0Vh+诤頿�$壅ye钂�>?洬�%肺宅7*w龙/6厍F忊q�\?癘态U��<O�)璣z蓩弡鵹鸧赪誧f��忂鱽馽軰�%lⅢ�1�参{陳宠y%? 虼�<濗-妒W>�2暦躀N*�,�=n澏3{1�>�Zh4bn疌盢八规�瀝祼Qg�$7h�5)�7�=I濎Ig唔@{滀Y9窎莙X舷掦羭戍9[鼋p汸?Rv5z{�)?�8化木+歄�>侑O�墰液氹攟曩蘂敨E蟪萸!>QD�蚋�3泽=趒讃G<0鷅銟1 +�.R桛籦郞蛒↘礠��=uy掇鱟y頼e儅 +y幨S�>k蝕^�1螎L"u3�瞀鐮弤1鋋a寅�ḿ閇楀{�=~呒?岊�7p�8o∠X�)�7�遅kL]g醀孟u_恞�蓫�>Qf鏏鰡I迿鋖塮jU�3Xi�Q鱊濤庆�鶸&�当墴紲'驖e;�/熾颧D�,涍痳誈噪�3�;�R迻瞩�7嫻XI蟖炽�嚉�07Y�&�6�禅c婍_魸a静襕�1撉�綆�1悠ID[|��;�9� k(Ы彘悸嗣鉍讎_�{+隂F 裱囷�?}|x蝠㱮蛂�w�健揸9掉哾O&妥礂�x/駮�帙}骥竺曮 %梼�*�;<錣蹥nn0浃謠�%�cC�<鱕慟�-磯捭幭Z�4 +4^-侃莛畘法 羬襆yJ/彯訧{緝訜�/m�焓\脅軠{c螝廉�>畉0&� c福珷�倽蔥瀯9鋊嘽K+韦泐鷿荡癉od�髺厓$�赎葂;:錣��碰濅�!o)忶業嫽>鄼鰙爭€�!��=搌.� 歶Q程杦c |蟰N1v� e湿�>盲�'諀j薂鲥z蛗奺�齑�qp炲wV鐘蠢噸bн峮wUV€wm|闖开G-'_媢訞恪�#�'��痔g腧~题繆{潭詭葦矝A硜8繐X穷鬾/O體糥下咽恫ZS鶿詸蝽�&暿蒥挟壹剉 �lh1釬}焗焚l搉聯G�学旚本y槐聼>Ju�=�艮駜gON岝嗄X箎鷗啧瀌芟e鏉馇^+sv樄鵢�9-鑯怿>h焮祝_蓀b纆h0��$粖� f,耒璥-<颷Vm�5铢Vm躯,袔�8詆滩锯橓 {���镆w,k.c姿鷮鏊Wg螽�'馳朱+莋膹9m沵莮w鰸倂乮�!�6羬欲歪嘱=mUl闫{偌W�孜2鲈f煳趨枬pJ�!_/焷�彵宴i�'d寪鱁糰顺L躡q№悑�=�L>製薾+v扰曙箔薣�涷p�!�.髇?芄扈Z梛k诗档笼褆蟌馄�(鍛.晭O�6佌靡绐_E�#��+k囲%硅V擞挂~�#A� uK蒄~哯W荒X╱�,m驗� 豣y聍懎铎�Wi_┲切gA臌蘫藺b*k较P賮挖龀rO蹅顳�%vF���X叱队琪D昏刍sb�窍>}鼬蒿�就硉~�8榧篚筱Эy�腦���;於�c刳�3稇e +n'c.閟dtyZ鷵豇2X玟旂1鑈 醭c肽�:踳苧蝨$齉vro8�_繺帖[��をO早�涑c& +5w魖煻e'<媀|q醭R�4/尹/銌e眽荁棄戍E�癤輛�;挘粅Vk�:v竉jp跠�躓u裩殿p鷫但刭遁嶌錄p熈皣千-;*蠟氇X|\b駢�%�?槌迱睗u嘼q渺kf_钝,柗6�*綸彎臢隡_索c� 3篢�,B騉nt 畊tHYS�€诬z锆]h�2鐃7臬x'謁 铽鞤鏹 qAe鞷麊澚\棁蓖�G帿�z9�'k5l�馾�O}X圾鐪5礆{7�:桵澅hr嬴<8�+�+f� >c圎�?鴆汛跿v;�?G?V:U:�3:�/穡&�?~�$i悀荗>z�絿�譿铩�s�0NK�:�&o +i靠褋祔Gi�!7沮k甤�;卥X验�N貱畇�1勫a�鏅D揸醳櫑翢姽�6苽��亿誯褛O�<闈%.v鹶礉鲧2煤� +7衽X5芚芶睋q虓c"�!脌莺s鎄c�9褯Ox敋嬽乇萖f]萭0�>厹彌栫澚�毽v2龴直g2�;麲骎躽�'嘶H蘒梦豽�㈨旯僗<�9F辪z譅恧烪宖�-穳訹孰认 +vv}R籴�$4勰鉏��1鎨U|J韭ay�丮汅nh瓀t�5稘7忕61�,�;;?埘�魎D�4(=颸h���]�0;zV8�3嶏韉撷傍嗐傸6缢貞n鱉摚E>畑V!]X秏暇潑畏躇撞羈湎[缝:�黲S�1蛹謠鉠郮 蠃銡嫔k蒿w噚f喑ё荗O岝�c戏荴�,�?G弃�沁|鴑赪x�鶱b,寎27蜆[昴蓛梵芢9'夦Cq惟煺廛K儒}Sb'襺怨垄K牭�&�Ir,�s'PT?/h?豋3觹R盥鳱黾谲c�_�K砥鶠萿郞跑�诙A烄形��袕k�5y_�=桪鏚€.痓I?a屭芺形茢�9形� +[錯撸鴏�詉� 淲4h煝騛饸X騇瓱榔�8迃啽=粙晘{6|陼髦搀�6琐蟒氡掽潑脂�.�/觊u[N87�{<ve^羌e鋠駤'f ^燄3�9企睐�~Q铔�市b琔衯�;kH玀硲澝Nl囻鶠Y'飞2謪a@Z�3T歋�9觊W颃�恙�Zt�4G�薢%�+虓堳6�%,郾6i褊_ 珲,秂/zY7a瑬瘚�)湵觡仲]囋c蘾灊奭:梬U邸_l�7囕n{竪e,澔W�?墈塺N仓]!>衶嶥w�+珅�tyf氽儃Gh?胯� +褆迄绨憓姶�=�-x生U匷j_秸痓�-g_�,za�<膙无Y築�;葀`�馤Un粻驦榧+�沜坴骙;�猻k�p錘纞<S诈r6ly�7鶛繝�(?擈N0?E�欲沑&AC蜀+籕�埙鼊~V�,銠x灊蜁ㄋ�顷貕so哻笨x腧畵€眓<噮Y�髋孂癞诋kp1�3賦婆�/*緛FL憓;gb徖b然^8?隭虶笌a6?~暮閉蚇U屍醁薭銏䦂;i頻齿\cIn4g笨(詫%殻}�c嫨禰c嵉匮畓V裌�5�赲H�0嬇1%cQ逈錮f槉�va杇7,�1辙诘� 買<睅伻�:W}�5鑓k迨t��9娜X鳂眓7V樝淫軼蠋緕||麴:韒L�偗剆M)瘨椽q屯qf馝蓹z:棑竸t�0萙:宠i �頪狳眶3襘��+a9Z梉�(晢绀5躖秢紈Z蟞香jz^~V仫>jvù酝\�黌姍F娇�1+aO屑g算紷嗸悪p/雀d窍__藇扒j�#巈迅m枃甲�&胻柽玒W飝锡蔯b]蟍俟岉埘a2镖捱N脦赎{芑с庳袴s鼻籩>'粰x�)蟨1q麁{续0}沏b速槼]鐙�>7�0>e算�rT)菐�S蘧�:鞢>�%g�:稯鶌租磞[*o驾写觪錠y脓j.Wg�fS甭A�4輀{��.鴊�;柜2衚�>@S芞k芌殻-期,莣y6閒盫翮z]躞歬 駩�_?r� v紪Zyv:破�75Pn甼��88祠:8r牮黫汕�62猪寮g剖~,b萖�?嵄!7 w菽哫烯�烑Kv腦J疮s碒G2�搏�*a&c6�9C鬹i�杝)長[湙巘涘\茵&-'秲媃尩l�%OC�茖|卌)鱿糋驦禎~禿穟韍�,k泰�芋W皀�1|_謓0v頜�7娹N�<+豌轶A�Y藏Q灈0伆2夣乊&骑勤X_鼯v悒鵉坡;堈/偕�,c囯�;dm|�滕&褔z�钯鉭�@侠v硃濎5譳囮Y纎K髝藫dg�5晢�=e韊韛d+鱃uJ御銳訒譹>'趞藵谖鷐枉n爸岱�║b� +F氽楆�1k衸E�6繺劲\瑏}rN�$>/鹧h=�+誺TYu肱1氣孰洈缲a~綇痛弼 �>庠�湳勉a宋�'{8=;�8�護UL磊鯎烵阗y1唕舼瑯簋嗔澝巷?�糨�n蹚鮉a9弐姇�7,iH�=d檈郸'鏶�4痮M�9櫨s^瘖f>畂辙骝>DC +霐=T�#�j~婃瀔[r飃瓡塿|�1'� +oVy疱∝�铅5快Go賛v�?鞬�0頖�9縱徶顚祺隭剗�5鬳�3_�:F晏\糰&曙V莙*籭莄啩gMv聊{ v剗X�L>乛熢�i勶觑7XR�.p燸点�<�鱮苔<=O跍:z�ゎ�}4┚sv�%毐f瑶9{/WmQXP賺聺畂鵀乞�,D锱跚6碲|*~踡U霾咧�=梚�港�1'*>誰卐恸a€�泷�碉漼m縶0� 謳戡��勛怚篰8懫+辕熺�鶝�8汸嘺w繺U孍�-隥諶顒;┺h楋1D獴�7�-睷?槎fB5煹:媸εL搋VvX�+2V錅x&鬢熆煷v孃X�ub�毪�蟊茒汅萖4緔赑6鐥�躍荓弋洳~1�;鉄鮁q:舯�3a艞聋� +'鈣�?yH诈�&!'�-戏自�(邤鋛繼肗qnわ蝐�憘a,m滋丮㳠�?k;濓Ac浨墥� �7闯\W=隓}钅夒疙4"�5圬0[记:Y缭�镱僒�(�%a�1飨F巶韜K4藲晃3GN醻L|阂y�4煝~呭N欦澕サa疋镝鏧v�9簆N+U攥碪 wv� {釪淜�=�v吘羟矟Y�3+NW屁鼾[恍�� +琞0�e'yn掲)e!庻霻.诹|司0巙蟨�<�,-:S1焛勉罢な�'劲I�靶D�%�*勾-輐U� 龛9庀H觹K孍黋��x~炘歎鏨鹅l>&仵�囻H['杇c �4霻潟澽忊�8甃塷"c朋 +繋�?墚�G弃Q肷銂)+迡瑆!鳜�着��(螂`l蠇塈瀬鴚j6帘S|E斪eu神捡膨p璏溫馍^X趝耥樨s[踽-c乷�k办d|E4煶0飏a/鬣斫猻jy緑楬� 鰎/诹�+�d梆樵�C\#9�&<柜踕ョ鯸�4攸Nl銣忛q[杶g�!X乆琲g鱚澯U�卡嘶V椫鉙軴Zv玌捅槪蛁赔馫~诬夲掉n頌D雊輺\橯誝1 鵈乧u藓0G^�,耖V�舫Z-瑂霔g蝡Zv0鱾弳岛�.]:擒谘X肱遑8瑢+:.Xkf弪�蓣X^帧埭XE鯡q�鐱籰J?H~(腋"�>残攠G�愺�'`X瓏E~$�/藆B綉脞鴊�渿5史J鷄2I>YsC慁蠜;院k赖Y�徍ZKqz7�<3αX赕�ykBcG� 鈾�1V�胨_oW凈�'帇uE苲锷踺{�汸�*堑-�`gXh贆�c瑬浽�o�5說,詵UL蟰癡�8尪觷浬\椃�5%|贞;m;a鳱赔l_莛~O�v"嬽�犧8呛諧e昨�,r鈎9A缡银Zk%w甀揊騭o聺~y儂轆蒋�9磫愝/?(;昵-芞�>U哿XY��哌iY|霐gxw羔�鳷�.撇藎1@耮炳Szg毐j�,鋁糋實亍觑~<捩守队L辂�鷞a袂铸撣竮泛縞mgxw盹-覼暢d蹌險k�&裯&R^脖ZX嗷K蹑{SS9檐O膸Ft畩^諮r飬u逗�訳恠�_ �D阜文zya�.辩褥侃}y_(惟�i蹝鞻炤[阩 珥(�s8�:韜踱8v][螩杯7汳a瑖蓮鯂颻荜韭烵e�沓旣雽寀嵇N裯�(&篒N��vV鉻�.且[v葊擮b�'x鵶#t础坋R綈g*v�<a于N处嗂n!荈鎫�?db'嶒�3_鰕;~坏猈冥釴礜刧m賟y>熩� 彲 幣�(�r蔆熲Z�貿頒嶰iV��%3~ǜX�M闒琍鈒耣��劧�6臡传鳉ayq辤臲俜蘰囻�飠稀圬畞-'h瑵嬒ifJ借髉u腣�[3甬Y{竚rvq駟Y�9Р輁1慻缝缶筼滫�9澯敾攔#'�藸\o�8癦X澵弯彮孰Ea蔤塩Q蛋嗏吠v!��: R颴轃癩�碀諞嘬 �鰮�%舿< 媄�)�6)转カE~|詜�6姳�MRb,�3k膮柨巓�$3铸c舼�c艤鳠nQ毵?�:~魍鱼g�>>�<鹷逰:锺,漺埞l龹倹濞菰劼=V*椡仵Ny经蟡�'婺9&o4挫Χ澱^旈耕箿P粲c�瘼:G虜圌�=刭z�?=;躉晿邑aN噂с;蛫恮要椌{浨�9"柍玸� 3嫍y5馯<�"預-kI蝰w瀡e铹�肪Xx幈斦襚Uv阑^�� *�贤�1ノ�S^9澂碡蟗x椻�嚤�1}'謼弎鲣秘靌.1v鰕映v唻q �,鏈勉pv磉誽�氋 f�(硝郛 ;嵉嫌�(盼徢*沪O敝C繅]�'乗Lv鏧岦]-;��+Tvk荖�76擘W灞��X3+H,0� l�jku扜+綠�9@[媌�+��.f�#恫唐{�/穛 \_牆�#�椃術�芺&阦`瑅燊8l漸遦埔~而�c�o`榧炏>墝u/3纸r朜跒�8铐Us膙m頨暎f�8�u&� 韅^3o榮Ν搽粔�,啃z崔�,鮵麛CoM1樏J冊�1妚誴芅鐝J炵栀 奇�腠<蜂:巐� +儺O欘喎偄)CQ%�4襊ff蓣啰?芬靾憏�!蚸Qd�'笏0;[g譡-��8縎诼5^盎T衬uR媣贫b嚭� +�"�:擦磚,禩5肟壼満1AO$h璵�缍鯥vs秲n堘q鬕�V琷皰髇軳ud尩)/-瀖�-__寢P��V涤铯#胹A�O哋貼净n�=!>� +�&?04C*g'3飊|廁h肛鸓9VX戧l埳梮奉穟⺌o讘]赤n箆嶍r\V浤GyYC 鶟哊kU甴礴8蹣抠 q耈�烳hc吰吲v鑣晌鐤;薠闛驅誢痘"]要]蒟踀嫎�统�>や?3u€嵱立1胟灹邾恭+靫;層�筪飨碬�M5HC嘻鹷)+� +�/+0V�9蘕釋溺Oo帍n逼濒�9j>�">|:m齸斟]ho)熄f莙螕瑣�?vO�+鏗晚硽�>嗎;酿M鎨驗逊搋qF稉Z椲纣惦気�籑榍耢3谝zOf&�>{豈6w碖kぎ慊蘔厨�=��$3驤櫗�!蟖樀=閣婕箔��,33SZ=[郡体� 憁栰啵Bx嶶�岀鶖�g��3�u躥粱卤郦]kx梮rR夼樌鳌芄#d;e詠�+鴚儻�81崨�>藫;輜5阫錹€� )疕u/�:蓒�q渃�=�>差[� @vC}濹 玻y捍CN国<u/痝肴w搣T唰+�b譟蒤��+�舕�F厦狲)楳笈任礧�篑�!铟雊;谲偤fV�.塬顗檵j�9硗楈z睸]押X蠹^�:札&.忕c鞖.逩��!焌�5}蠟�?{�籼X=鐫+nb>V� 麥Z枉診6泏Vg盳N� +}嶼墮蜑Y攉,i鴝�%瓉dGuk=k9珰T�K巌滑IU氟;{�c饨傛2踧诡/�W~锪|姷饶澞#蠹儇�ks1骛痫貵冪"篦*1盻SC�薣痑圅覛徻:�*r棐� i�)6'龗W帘磶晨�9烛�0犡pk識o��屗�.�┭螸Pp靈Y膒靀醁鐝Gp琺+䦂瓌w�!翄︼Qm {挐g觽Q氆浖]�2携o髩r鐤xwkx梱刴琅恬蘈點;倏 S輲|凌{玮鷇L4�2N9_b喥囑�5�.Uk�旊f裁k巨K�+籀餗咘Hs蕶O1/伢毩vG晑拔 殻^攞!曊W恮嶇企帙s妻�0楋綒镉骘髠�旬*稐韯�.羼T埯竱焛渂M_堊=腥X鳜蒺�?}典窥蛸轫'廚/�=実Bw]O,A齑R}昿6轞涎-珫质期,漡�罾y洑譖茒u漖蔾(�$矂9s掤鑸爬e>炗甖�h�>d╊F鶖橫髠]繖cdu廉┶靛3蝱鄄κ2�2鄄陑漴�1楆榬�$�鎜瓽鼢9,像8囍每cq{�.,遦X荓{竾�μba﨨Ky醫餇规�.屏姆1�9咎ke�喒疔V順O瘣胗:邒穝LI|邝%莚,忶*�"l]椒C<*�/k�噡αrⅧYW罐夠翷{>螛yw.�=穃��j�OB測锥�>溿思;姹jc莛]2'俶嫁挶�k|魏�1,�抗=/%薜箳田堞慎�晦]|疡Y睗鴚+ZS冏�e经踙瀱<稀b郓縃b�=閂蓅殆!]�{崭b}U剧夀靷Mx涽G�7泽}a`涳�<)燂3更!崄鴟焃<ヌ�泸揆R�鐑]西饼鵿�>鞆O_?=笪7_綀甭鹍���!鲴妥/O羨鲦鍝阌嚪琨溸膳<)f[烛怀@嫐%'v猭m併塛+wm鈉,婾赟&"篇痦`�g骴須坹V肼<c閆lk牁澣弖旬�斧����0%嫳]镾�R`a�#<戺鋟 �&笊$箢捿F�-�?脍蝗���s鋌{�v≥焸c�6X;莢禀4�N嵆耢衈憩2~vio�-驀�靫L錐�1蹤鰎>mO糩r�9]k歼隗�伺蕻-炖攀濅S纠�&圃嵚D�=涆敒�,�#~鶗遢�0q'隡�y}(蠑|}瘫�)踾�kCy}蹈`a譈7諠洂銈嗪处S躌�3�'逼糬畊_o豃黁C蘳b}U諹皏}磎9� }獩朁>�0/竛霫菨笜笳翖夥$�,閈乪�� ?�6囡宁韕娅胼岣=�??洑g棢S�c铲>�;_西┴礪颶邬\�C�忛V�翉曃+�CnT�-}��7�颯肟ro邼~胗O>{~z轳伲踓是陫氲吉u +jg髊:鏑諝y籤W赢29[耹u;|7萋;磛揷�2P熠�<�v*cl踮&礳6憹o,媦 佌vK礧麹<'�4/X魐蘕�砞瘜e�0m{XK攁樑Qc� 宔欇阀靌s7阙I> e�2n笋=�沧艬\邀妽Zvr����悷锄s繊�.甖蒃侊Qy穦泣胃=c琥 ~�4Mf6閣u賻茾a湷觡硡鰳頄鷀箈鯮{+騟�(9{�<娠*vM耢纮帑5q"绛絢O顑�>]~樻|濐?$遊btv^8�鏏1?s\|﹡嘘R蚘#譀馨豝搖甃集鬩u-霻s于A7K醢诸0�勖qE搪緂拈t軛1撉�.鬈�.�贤�+儇V=弴�)~n�<膕ks�0涾A荴Wx{�;緙u{�2� 龡{蘺岝�轊濛/>�8}蜿神耥鮵>N毵┅G蜵ok�;�;v隯Й絿�慃砣�-k鞥VN珉橏湞蟯Y扼鐬謐fim蟟渣t季T逦X裒豊篼钚貝跨&蚍7 贩0R緭�;跋_鹠M�熉{f保笓鶻圦i�叨6�6}藇蹞~Q镖悯]秭6.f謅瞔?!X憝�xvK肀遡�魉衔鲏5'蜛f}杰飄�?�k[鴎�=�v�骴萎垩3︸d�鹡+衔�-絒f,�+v鮳孥&獙暥瀑w�)a幨粖復汲n*附鍳6岜R畴U�1诤萇袘&}gd摸�.麧捨Uk�9睴Vs.a讐䝼鑑9x潌誏f�暪>f臚c塊vI蟻痮,k0W�)冿j?镡}做 瀴尶陆�5欧痈塷僺�綤�-6腘�瑙r监8W�+鏴髛4觌飌虒%~�c}wf� +鵛纷鹀獥秛<�ぞF?侉飐杇€zy帊�:�1煭琯燦詾�榮M{>�v6�鰘^�"y�>�贳#;�k?�ф~庄鋷殰�虴�{j阂足e籞繈5��c[�%迠 q聿鯦s?8�腼vN9�9祰歽渊�<湸��嗵靑瑯�4窙YkH�9J懬6}謌鈤灯 啐歜W撴%sM曚龈�┫暦q丑祬g兊搆d宂高Y颱� 葁Z�+qm痬睚"邏雖治.\熌е糭癨蘬禵I^矮邨碣{%-劕諈�瀈>Y1鶻�/]焔E^g迷��幷�:?s{毸V�x煵膌彌絿誆餁w徂恙Q~炃濅R^懣n禜S矽�1VShgb摣J霚鹠槰�悶�v庶臍�1�篩溜�,朾鉓�0ul�s錃D�,莢E��踖~壒XSbY�3橼絭��~h櫊�%��鉆�澘傜kG+兕�4穽鎞u艰踺e噞-胫2纸灔�>==}t}茱P薗�9〖~諘专=bG5熠頥鶍���.q^授{娉d穻J-N�谴秙�3�厕扃i^鱵逫�-攎�m翓雽�9{畒GTOD蠀烢O礖蘿脌|嶞滆迀�~\縿9r沋#5V>訖姿明�5u炕>�7穹�跜|^x.紪'蹧~羶�.�/2@g}~&↓xg鸴�!�=偶熨j 蘻弦'�R锞钃�&�'s灘�'髫¥髁�%� ~粀y軉饿韜閪Ц轒扥淈9竾杰3/�\_h+��{尤鳚jz%籺崱唪}纥詌�1gyW5<瞧w�4滍跊KnOg濇鑫� 颻s俚&3迮息惋8躓垴� r��?o��畂櫝柳xw閩朁,yV菇m�=a���S嗺 {叺rq娕i�9篌:窊苼幱Zk_踭Y軛�9x踅�1瑺墶suh颿烃�&穬v�'�}䴔�?Kn1諹叡jz钖艤轙叡Zb,鯿晫曤だDmRe;刁Z]鈍k烧*孅vm臀8f�s恲嘱l� 酀Q�C䞍戨K�7�境��Z+��7勉 +�/i蛢�v`6帶p尒�診,{6︻稾朦�陀櫛鰃苲xf�砷�?�?弃駤�~wf琽蠈躅殚衙0W#�0蚎s苡n蒧憻�&1�7^c 窦嶛7喬i� m惟綅r3锩纤榻�o�奫)晃�釛a桏�,疞�!y帉k_徇ザ恻壮C鼇;w樼櫉X�&嶓t3駞睧蟤咀a皽�5恙96?忺M煜鱬豞G;屆>?[|7籰纵� 蒙:�7\~f�ΣZ� 撲僾骪K{x諼収痫r甙K旎/龸簭�$h鞣弻w-L坲�:�'}穪琐郰镨^蘳绍�禳/]缩聱p{<nろ9� �v�&趀�/尫t嵒�/�><镯V�婊v岬緀,虎輿�?鷾部徢3*樢s鐍�呖>o~~�=`�荅湮ky.嬸呗鞣#嗇觷渞�#竐数涶愮�kB1掬蜗�)�/列騶1囦x�鲳M眚7焳镰瀚m瀘癢€=2"颯�襴犄�冗襲~>�>t渳慃澜�!羡�.w釢劧嘺+悉索=鋡噂蘚饥躼炭|蘀掦Th攇#炌9禋 訹X;�*7]qN槶*~'f禯-蚃s� +蚎餆癊V$W`珻xw踼骝鷻探�7忹翡WHk�A骐)�踙兛鐄z涚鎽苵�5g大鏋�黟盤珼}�驑o铵V}V^;�'甤醣�椐o熅縴wq弻蹂櫛>;圩褟貘Q楥W笗�蹅c�)睶芟L�E.蝲谀}譖�i镛惎r擏○_往狡�"讔裣绪0�5|�蝿F[貤!巿�;駊o樇飼甭}呢Q;{7<揵彈焿燧騵�:牃(袝茷涙�+効縁鰻�蔓颇觋�瀴筠lb寍�<?b钗�c<�蚝!y乜疷��9�U?g旓B鎑駉サ}Уe栯讁龺譡;oc蛨Lp}�7忒�/�胈烜潮簫X#o�啃爵闊I~v乊�陶蘪慿鍪_厍�愵鉦s两歧笨蓽qp�瑣5j稶啎kL捹 螞�<w顪M�軬8F菩� 網鴕貵枸貖o馴郎�bE逵跒賡镅鳴sN�6�)迚瞞�嬗菸23b芵?0q�R� ++e_璯1芩,鲾恹坫:�=E_侙忹羮Ly/萝,>T褫现.�潲�*枫昔紮�:y�?�0o囫�菟祶y屓赝讎xA堖廾爑叏?鬦�.h�3j�,!]蓈蘟�鯱�,f捻綮)婗`繚笋G濃 簚�'�;V\粶,��:斃X�,�{�F裪苹段犨<�'煲�_蜣�8蜍FL�=1窌�1榛�玦鞀�9�逊1犏他,謐擉&�;�>黯骀伲銍飨O盔贈�?�W髌X№��+|vz�8|{sO[�刧μ1;e燅N轈G|舿@绚�'楚&.昱�X疗�;獐I婏f�炌 变M龇r�4'~v錏0砈�4迳瑎qk�$�0&糠聵眣璢dO癯鎞謮5眎d别M羚� w:?��/氖俔淉夃�&�吙Ks畹�+S鎪-�#騀~~询K�hMa*�4.FN嘉氇焖狍坦媠|鍰醶b6��w6馁�72�3i9Hs@玫'剖紗鳑YWb$褓ヵ价gg棷s�+f坡xA\<1t�6� [儇QZR焫v狷瘘嚆叜*讷䦶)缙l卌碌]GV;�5$窠F幙g%蝩騸�!V姷q洐囐 +歋報囯c芉;錝鵀�q窄曾b甅綛鴑od�!贖萯婑冉pl竀魦u剗о%�髿鳵蠡妇N}钸鸇甄K柄qu�~四]探锈評廦籤锰偌�?1S�=惫0鎊龓z?稘k�Bl{b^肓k�=|籚kz汕が9�毵檷]蠰b漇搽于椢濹澯�.4虳欠撕Y�鞖浦帣k籄�?�7G縞fE虲諝{�b+�影�匐�?蠍smd�e鯭[眮�綽霿5楓′擢q氭k霱�mu蛭'�低�8滅鋐�7煒o+{�0�=|x|躜神嬒_澗Ё?烓�?�c呖>煙钧袍覱>�8絰v廾vq�檜5_9麙|�6稞嗢罋旧稗(cq灧0�&逡练1�9舦3l��O喔m圣皔樨;翖柒5�煒耷 ~%0eZ逨a�&�蔢�蝤 +譯騊憢嚇鳕zDh1諱鰬咑vy.N�%Si滃 吪�7y"_燌�f倭蹽d�膻狅-膻_�%6��辡滙髜漳汜�$积V節}юj�%�R鉎�ㄣ偪(軓�5勶>\;证衞擓_艼擌Icf盽綾炸毋t>L膚栛A^Md蝗O)g塻浲^斗瑑纰��%�+鸏鎦攟嵀被栯/�苮漶lg赋压5p妊N呢穗K洄爝觸/�/�>�2�2�1犿轴w9婷吝�9��馭�撱{�]bй鑏脇€9y繵鉺内閉h紑cj淸`r濜d坯碇e罖a崑�2�c69檞�7郰峜騔Dqvyo饍)嫃�90鷺峄礸Y逼U\嘋;mE_曭A%喸e~n菋v荣b渋#zX檕�.�獄ㄔ穡*資=T珘:t� �6'pKin�儌�k啅蟕pBc=昏�霓嵶r莎�4廞�eb篻佭烍+5?媕猷Si郧i腌誈莡Vh'� +捃_�胨�$� +紾 �齕`�懕倂秒徬�灍�3鸺雍鄒4�"�0檄坝挤I镜&s� +寘XP到垫vq~紴駣9s�謰 �!鎎畹VC羦渥Y绲~琺f鬸 鍩檢幷疨繕e`6iO镜漞孄菨鴿峤禉培梙槺6蔤梥祙-篽島�?2e�uH\蹡踞I�$�)|蟊搅绽1ce�.?籞漮鴚�/顑�,鞭 禀�a6y椰'齡s奜1s椠&�m狛赯溁�9�值缜T叵牾榫囘漠痦i逫C +|和<夳攮V�#婅`夤鋙鼊1赖陒芮碧v氲鶳Q�*�眴 撇�2浟�Xk*唢d脲|M|藊~浀�潢�1�;蓛w邫�#M:鱒�歯疔q潪g虬Gf攮顽飄潧璢;J� s<r鄺�|3b圏碍圷X�,�'鋉钩漹b屝�_�8炨醌�3顾n顽 �o誑.� �2b僎芪本A�&{蒛ㄨ��%煔瀮#9\櫡��;暪橌D[婕�6�;苹匦z+鉚蜴瑥佺磈鼴腈猏禟q溬h<螯�1h騷r<试�6tn鍊�c唔u轤>t>#4仫S会�?~q鷠� ん�(�<��莳禐�-纾�}7鵌T簧�9冉4zY嶮曜雑馴璯\ �y褛f���<嚟e'甉mm-嶛�隣觎X詙修弁鶎� 鵥窮U�K�$潛貛莢W掷�]€礭鶁徵皻T蔢qnU�5u�&嫮E�� 謘�廨螊�%�<聫�楬j郄篰麁袨bm鳻皏E +��2璈畿��9壽愕簂忺S辕澡g痦﹏讋淤D摬Dx擗63犠t�>T灖q旬�.枝絴&挶�*齠唔褐汬g襼恍`�1丹��眵�{lw�)沲uVK�kw稺讎繼�6枔輼{六�鷽]摯jy醈歾�"/\希罾賅Z晴筻蛹譯 啘�蓙鹺啃竍�,鹫&壅r猵}}媵癡鯨h皹>?鎹搌晰蝘h誉娩耵u鴡�8籱謞妨檒虫鏂<�.踰d7蟛�3衈矗y骉� � 蠟�Cn苑?}y滯鼢w栁�?渵簖'~酤輷荧弿�圏偨呢髄Z襩 繑瞂M跘鵍�6嘡SIuFg盈矇誶2�l�l{�:;蓻Q╦麾L0瓔在>�鐐0聃�k0lQk)便挹,堆湗“硓��/哋夨啘�=箋皅邹労蚎蜤做l控�蓟h椫迾嚭迅�(蟤">狯l秃�輁#Q煗誚雕灊g稓澰驶敌鳑妞J蛕泮]烀l4X]{�9申t紫s1鱇麉Z繄榤Uy~薼g镒hM钩 $⺈c濎蹜�槇�`'6Wz/纡:дN魈颿I吭?鏴]R�9適Mr]陾.閽~嘉� 尷g"堼粥4猥v檜渘�9緣鼭誸VょP豜齭vV"漚幽w孃罠窗宂loYⅲ~�0F~劃玗4vT窐tN�<鷑往+�]磧N鸝席iyp�'H^PG裹W嵳jwvw蹲聩#梄g琳5N脇�;3钟'長鑟诬舯躯c瑃&魶��3�?聆槃s裈� Z爟盿;涔壷�豭釤延D|縎嵱z{>齩Y� 綟�7礚�籝|*掲:Z}1疂`On擄嫰6釩�+� s俚e錓�6餩籢uゝ鱨8從非躬⒘J腼厵�-xr'�!O擁述�gㄢ�6�>軆醁娰Z;錧酓鱊晕S嗡,�萛碳隧�>熤橘p瓶b巁@荙鼐左惲9�75╙/溚|�鳌�eY飇Mvo]笊F欢�.牮�\�v䴗-�Ml7�煣詬鱊胇�/莢藤E{庂.诹/缦挪v鯸y9譭m鉨刁鐥碡繏�5硥g,:砱]斌~漐{z^J碥N:壉V瓑�祠犚^7Ym~;鴴槺g枕l[捧u梄��摬]y}�?�阚Z伇糗ge'亻傧鎩紛濜鱸{�/舅咑条U�溦沩Z櫍1疺8鹓閘贡�黊O熫僌檫芚� +岝��"B嘻硗>补夰ml=b臡c当YCL眙�� y��8ズ娏琲:B鮩�>�� 1�#!蜎�5`�?蟢}� 欳垰槥�9vh5|咸6竳�!殣8歡苬Z?�<ObH疒╘€~5f?棅/孹�}z楝 -no�橧a泫擸SX鰝濆葙h/�9v跑9矟潆Z灉H?�va粦U磗菕媞瓛鼡j楊>a癖VX~T靁 +顪阴颃5M摶芉赜j�vy宨瓲鉊c�,k|沥讖55徠Lz烖蚾6\焑荳�彷睥]�-/鳽a�){&;�」颇粻�$y��_皙簟殀€vじ� +S�謘蜲尸c松荙癵隟鏧K-蹺;驔€鍦>眼嶊$货甖�狪吅�"Hl國Y≌Iq粬櫗)5赤颾vRf硓扁郴*鄢L旪N�:cI>XG琗�'礐吭� +q8照��d鞈�憇A{乱晰抈�5拓-袨?鐥�钬雾�/靖螡慙餖1pN�Н﨧甭阀焴纛軸�+qp�!鳝�9Cr7湥望}璭@鞇k�8溨�4�"�-錧�/�-xHu鴓}Z1a蟋h+QMP▋慭灥鎨舿〇o�4V苰灡願�鄐椉躡-��M:蟍�4\4讘癪k^qv荺�+xN坪6U�hO�.褛�v鮭i{琌c�3d囏`|v�;丵鯔亱zv箦鰻塊鮐X啳�7}sz�9做0OJ]炽��1?僡='聼�5x�N櫦縛gX}鷎�3� +繐焨t�妤{哶Tm誻]氨aYo蕱c綇楉�3炀'綻�蟛�0瘷�:瓔/儇�!�83蘫�t_�|孻熄騘柃扥对毑v蟶务@祡聤%�=�瑵h峎s偎sJ}~�+鍮栅"卉嫘萘斕€v勂U-繈s召巗�>蕩檼� +}�+洆5t刑jタ饘哊导屻�$黹嚤i4$膸鉌煦琰l禨轪绘庼l痉誷�7a�;�儩娊[jょ忝汣蘺�蛐踸>K鐙╯鬘邿鹼q铥鷝�礠�"絖�- 韡^{庭仦傛|薃鱾榧崭Bn{�-€崎�D覑傁�纭牣酵飺�<郸 +孍u灀脂鏷4砅�$Ry蜌TㄏgXDmh妩1�猋j^%秦燧\ns鲢旂巊5��#1�;g7U� 6媛龷�婍Q~╈{憔BsxGw抸魤4�(啠箹辏┑楁dh祭v韗俧顥�宻�韁\虢鳬VZ�d靎>o%�.�M抗�&s5y氃彛uMT鱈\€o竡�諵惜 k +-�$孑貯&鹷邸`T渝5�0*1貥u俲[cc�饘j}矓��F%柇rl謠示蓺�锭隭措q�鍩�在裺"&6:R濹E摢鈸陞嚟闙Q蘩囗恄 辜进肞'�澫般[y椬v�8孳�,c邅aO~鹘�V櫼卣俪wv�=`脞J�1d� +?膤�,筺鴙涭熎€鶈趵`胿&��.诹o�?^�穹3[e[溴鬄�5醫烪�� s� 餭弃輔邼徻 A凈�?�;}胗g�>咻灟�TXK臈絈}Ff繑�2謿ぉ�!埔9谥榦坲��ョ,鎭緛Y�3粈睈儚:d玔�c1;沓�|qt �5甉毓QMO魤s,�.�j鐗~�隉*眝淥咇1o餘铺b绑眷痫樫$追��6恴tI惯KvK韥燌K韰o{Ⅵ|�鰜�!鋤/<[蜽聋E<9\焳緸妑柾~冬灰~5�1�>蕰槼褳鑖\祏籌鞷瑖sd(莌㈦銄>舮貤夵!丨<+扥薄汑� +u6��5幓!り摰隩誻蹢聚歄L敬>騷◤字e1噸侑�5輟^拥拗簒;潺6lG㑇�州禥o攴屉霚O-鵃-纺淡禋L迼绳<虲罋W趒嫁�F� �we\驹�2v�5o]狽cQ柨SNy错�1�繠窘%;轿9k-E媂蜝劃袽蛚沮讫囄/炪鋃哿鍹�v>芃衩気zE�b"秲�鵗9耷ao23x/萀軼靷氚�脃6焴�(�炏淫鬅>滯體ⅵ^溵紌r|6嶪hp=迃��_�X廝c;�9蚘挋u牽瀟|�經艏�&1秦槺V腦� }"趪繈齒肖侼-� I雓^�1謿��5V_�_黊Y匙纲€k�1袴s8硝%挺�sT�稕f�陼杛<禐瓴鏌鈂鶌�必碰`7�霑藍PS_QgX�5蠀0禬y鈸佼�e换�#<鐴勤駤韒蜆�X;焈佼穤钓�j琊愱周�+t)迈]�>T諁(}�S撢y闡S癰z氾沩咾v渃4h鐨阙怶os莶/8�\eY�7�-鋒峊缋>�晴豱*譝�嗸邪窈釭%�5��'c拑�%饁+&;�+H�粏}V旓%v澋泮<滞B�隬狷紐書v�[蠼参曯�1S獜+�斢劧_恙�烹蛑%賺f廹�嶻謐&�+[k� 洰�狔纚n磺€b[j琏�&^醟N��聶幱x冀�呒�=}�+紀弃7莀揝�=}黯巽Gq~鐪蝤=醭3\锵�9禟9L袆^语sv尌:误X獷IgJ髴�,{┩谪躼9噏R]m洺猍=�毎]fEc浊Z位瑊�>;<盲幔q$鋲5.gTrK輾yW襯{楜N皨lR�憉$弮v阭M各亳簍戫ǘ>壂U�9x�c![c禥橅r{鹫,1鹡谬j�.婢倽騭i頱愧絍钭芮豹蹲汌東 3%X�2F�|ㄌv笍誙c钆瞓颉xザ玺&躶61h灿qyo圍1蠆Ov赹a罘緰赞莾碚�吒祍,K祦xoX琰XY灿醯眘U�+4 畾bN虎逬{M铽f卿g7汏喇雤63挴〞w噖醹W襟)乪M=T濷∨Zj�&� +苛韒1媪x�=霻!鵚/蜸X趽=#鵠j韰�桓g蘽笈綘��/�;鉷�93蛛W7Н緓v滯鰲熫;c?謼熆<�?3煮�鬁柘V贘蝎&�;礊^��<rIf陀楾儷區!銁保x t熮繇r(�果膅= 柀箆凂肊輊蝈蹨<�c岉 彂F玷滕顺鮨揭,�3(鲪s網�-购袨�+扊颹謵Ⅻ�"Wh61'�6lzcYo1uW踌蝚呱�&L┕be縖�排谿袄v��9科奷g豱丵欃)凤[灀(鲨�锍僝m 1s躥壻*鳑赘婶{橯k屶賶機�8缫妖^妠=z縨貔裒敱目楋冑畼鸐{w�!綯�9旪.鶢漖佛\V到h讻~?督簼1W;�k�|}氥\靪�>:箏�?驘>__水逐姷I嚿>�7a碔鸕汥姿砱b�>�C<l戊i}J櫝3嬚鰀翹櫝�#獚'塁鋢暌廦L|S晘罼肄E�1�..鞟[鷑�:�:苲� +�3�r柯Y:镛<;> 鶻覾男鯇�47樅va皾盓M吭蒰�>烥W;?坨璨妲� u友3F蜪尸�9诅uD禐>鵡� 黈u籌鈆Z�畊C�诒>S┟%箌U;{�5�}-惔斋員M粩雼4gT歴P�C^&氻�/變4浕扈Sp澦W寸nt媣‥鏆蘘靷髃庖/��蘇录楈(f�玅鎁齯�耳�/�<&訹J靏麉�'I宍E<Y鬕~Of^S3`s.昈K?俰飆櫟�)k�0飕k�蚯9V綮n俪涡霿dF�攌T鼮n/0謦�胞弃f[d�+珖~橫驾2猐镵穠兡良䝼眐瓭e� �頽忢�9苲�5G旆�.邺�#j�;�/ow{唦泖撂F�可.�T驩)脌盽纺:腷v�刻Xlw壟�?%憬蔢m鵠T隮訿�w0窒緔u崇^>9>� g靓yv6艥嵌9嘑�经Z~毇WW�鋎Z禕~溒苯濆{][e翼;煞酏r==b隩�4佧`咲�<r,�P锡磞昞'EuH讲,k梲v酮A埚Z@淐)�&�闿檁詭� +F�?[�Υ豸\譊u鼭蟄�m昚5鞦7晄U鶠w�E,�-{S+燀d桃{a�%绚耎sv狪宓唨篌J]裭4那浛%V簭倅k� ;闻哵珄'唝76溓棸歃�鐍鹭啓发囮XV�瑵2閎�3�F霽�邜漥�?��6氛瑕V豷上8�;醭y?e�7櫯?q�癸劃eJ劐\1w}�:f峿鄼c攜坐夠煸2脁;f瑐a6厪*�={蓛bS徊遤a�)煕,h�;�蠲窏熠豆婊櫓[蘳红嶞>屨�>璨蜟啃o闱'�斨埔躣韋檣栰z睰~� +w9難吻哼X醥�箅?�zz蹯疡醬�)_iゾeN� 趠t⺪\聚\涹Ve緵o羡裒蔦K吾嶊幭ンS�诿縔�=9譅剧淟[纤ZN湏i蛑蚣 �V汍l�&鐭r.<�.i峔覑业噪@r{b赘J{餺﹩�2Ya譲虠禋坦E=q6抱鏝銽柕?麧鸳渠�%�镏禳I帙T|该,�)R凗宰[謵y霏iW暫T钠�﹠�3饵G冰lgrB�'F5v虎oc渍uS-薆圂捑關a^Jg搓-tS;�h鼨[g番沯tX7郾�2�鎟[c妪彩M�继n胿V�~蕁a綨鏼M�.18痣墒欗8禰搗A^婯f%绌�/貯#云�諢蚎0�2柲壉j冥+n瘺T觡料&鮷莞籏1�!鶪v摦w艤灍o/N僻�县鑋琄谎醋齙证�:亅祏盂-j傲撷彪潩~翅髏|鴓|涬 +脃�>s捱苲狁醓c厷Ks☆>颱荿k糫y鲐ヶ瞊V�=�个€}灜醋憹氡軿-�9��祙魨炽貍腍$鱁鼯佪[��3麁秊W鎛~L{m�B\u丗摯QM*譺|;檹=g�.□RdW⿹弣�√C4覑b_1N'v澰沊硖v*箊菇�4�*馬稕&甼J>^]髚{吃+an5~贆齕Z�-s鞂蟲-#鎔c7挴懝x$&悩鴶氡4煩势薘�vU杣1gXv�,霗1JaO眉%焃柇鱹塭�)墜琐s艞i}峥�徑茠_重吝跁gE傻u5F%�(1T谓u��1詮阹z萦yIfE鳩L頏ksG9uS駨�粥豷�:;��\衍�9颯�),} +��3狦�籒髲X鰼�;%>�}枯痺�3g砟w2慎群S紈誜�$c\cm优��,b艮G何庣-�现>撌�:峉詙&濿鴭o_燓鹈�褰灔筵_�=匵a騝=<>�9d} 腕�1Q\�;�P媼矟Z`盾奘鳻郦]g�(G倶 9(緉艽椏�M?�=重媵R{F?郆 �T螽崫��孜ъ砀_鲔++贶X{~鬄T醯,Z��8鎑煆欗府�靼葃(W钓*齬{Z菑:乙巫員�/鷃�!�)ㄣ稠郭漴裸跬;�)|迹�跓愞-閯圿E�??;袳杀-甶R縋�>皅�Un杕昬Uk姌累戯埞N匣猦H �'_Y沋叮祘t� 蛈謵)藌軹霞[涆i曵鉜�-螒P�%�-e�瘒鈕_νy,|布^塌n习'瓑摮�5麄�=y-婢u=O尛躔9鳏貂\�贐蕺鴲�%�=�8&踗鎶>��+Y谎�':O记竉h眐,u(図䎬�?D乌:龸�/Jr];�$律9/堲2艵籢�-纴�8适r諪7毐膥Z痮眑Gg隋龐�捵"鑶q^Px纷嘽8楖'�=?go螌躅^� +嚚�x.豉媾沣撣t&茨X/0研)�/盌#v踮'觀縗坠媣杣仡畘�愱齂?,硴谡疧雮]Z譵 �]慷G5莆礕�"_c苵参l蛆繩~g暂嬢R辌鏺號阭�5暿~Q囄拽髅~来钭遫`n颮�0XL硎z�齷_u5縯惮錞|C�=/彐|瑔訦v虰{�)�U蟻Rv穕躂幀瞝�=巽搯阅ZS._佡s騴�dg鈅螏櫡毌 l<�<{距澓┙得Se^�&嘏<刄'y 5;鳬6隞軈8遺}U蚠肶V�>z鰠 薘躯'Z;齔lt�?b-fV�)蘇�蠆��埚智l7堖譳脙I礝o勤?:L品db钤骣|O伋嗨倊�=颷s帧Q-緢嫡甖层簷Z�cと跀箷綹s^�湮��#-9��我yu鏈�;?;s蟧��|M髋X�駤�+<脲撱覩非軻遣鮋碘郱疭&箦浦�;�槂#;規j茷菐謓楜蝒>灆鱃e殭螸镕胋厺涽椲k蕕�,V�跟�:c妖篇髹w晤c羘┢僣l珈zW�1X段b�戎颺墠kx龊実{痘婹�/院麉鳅粟F裯龖v��祅謢{}猍�8歒u=~.U同暈'`欁蹜v誨贅m�)s{婝爕8佩穟�'驈 +C{V� 嚛b缝o礕褠&祂氍韐Nk憨獼{�?xEk'萸2骿>?/倭槢┙AtNq�6w埭vIoJ鄢�?�:郗?苙誚�&跖d6^Cw腶�eh�*闇H,k齁)g曡lfa派喊:���&筚蔵J舼圬y牷l�1&搘s羘核.廜�5朁!�5>&�'� +c咉 +煘~嬘鬟�>咻遈:?~yo吲螫?耖躞Gg坪夌鷃郼馛V韱耼1瞗分簐熕孥粯g賃�1譽;裩Z曱锲N鎺翈訾i忶眝Z'彵#y牭�*k儵Wo椫's居歫\]籧@祍韂鹱爸攎/�/k\Ou逗z�9t薻餧9埅敖唐T浕哀{賆sNL�0.�禍�5钯H{楜€势)圎_e诗邶术諡藪>h吷+氦h囐頝朷裒襰练f9�39�'霁蕇谷咂>藐鮑逈h\鳢�龏鸯}8咣<琰�{�哆b� ��>H藥鐥咑8g碟~�i:�R{<Puji�=墡鑂�7琥E}wl譛霽d晴`3!w`}~蕖︷.m行Vb知藇椲3篁pA+�*iy輞}�'K追詏:鼁)�6A�=� �'Н緗v/_�臊甭櫺�r +汄o�<岡X弌kw鰷�"藜`g魥湞�5筶6&^帆拍氲@枸奈7u;\_襚}p{�9o渔*繬4I�'楈|m劮僨jQ�4个j赑絵謀'o��9>粅押衷颚鬰幔觊塓晬楆�+yL蜕g�%;ns1'�3)塍m2k9�5麀埏婄h穷e{�%珪瓦/砣�礪'絡/蹽�檷s=場�5椠瓰={m�.侄k刊1塓∑�隧妖恺 +.T雫J�)v�﨧a防€靇^羲z嗛橅戍O 縧W闛烲��>肽枪oMv�?�鉇i漀觨禰vヮ冴4雼刊�脺婚�2衺體t誘t祯壿鞥膚&~謺婰粞v撛{迿锍`w屙頯�2擐Y��-苲误co伇聶酗�>&坪??V修wo��'g苲耵鰔{�?瘲鯨u�祏\犁4v�9片鏵鸤惰棦揩i滫糓峚[;溴嶟\� 褢k�楉嘞鋕T[稕崫褟2齤{b涆��<潆鋂専懼嵷紜B单骬楈z狝Z�唡�$坩瀷~筕I5〥K讷蚌�9膆vzφ紷{萫e )~喩=[6n�&UEC拾q檽�4��5╆v鞊5�0=诅[喚跱s詰3S鴜硋U閲钐3d鯸蕎�2C;M#炱聿?竨扉魈锂獈c镧5韊艉涬橶鞙v3C-鞿bE敕璍Y薊皏�G蘶巙▽U�繈睒偃禶_祴屨ㄝf伇液蒷繶W壄繶欤2z�逽-�>檹吵磲堋柔騦S蒿R~幖僋髕妡�-�鍇煀澤麽|犒瓖M突�9�>(\_� +c}aF苲鹺sf�'�琼6�r({Y�p灧檽砖瀆4焭沪I�|蚹抲7琴愫范鏺胣患f奟驣郸蕑鷼6赇�6腻wBs�7駮]搽�<u�鈤�6R3絗�9炇^4;毁败8咱孅U裋5�6┚*稶ms��#� +;䜩}罂S�#� �=j萁祿��fZ袉猭M-仵;�;﹣顣C=溩�/簀鏹�3揋籝�"w�55媀�=%Ra靨阊��鷝<�5e順y5座抅Ek书皞e�2賮※尓B_5鳂�?橑琘W鴥G�h{扃莞kT嗘��鵨洔+Q銽8荒荐�-�79奴{蜺;無�3鈐憝�6&呄礷.?L[夗]箿,鴘j> +箺Q鎫c]姨b�& 1牥�&硺矒灊h齒灡觏U槰rl烳籩隲酷�5長�?h騔解X�=W貐眻1鞅yA玼]3玾憝塾�.x咧众锛澠R|炑孔嚈鞭縶"鵛A藐>齒酟娜X痮Oo�L:;顲j汄溡鱐嘚1�&苺�&囼�t唉磃饄f濦捐���罭�!¦汾K蒼济侮�沺灑�?�/狼fp{殳H1敪便� ��,8眅3縆,眄e�n鮝t截瞉G>慎歁{ɑ25耐嘀軁�2o阒€p韃瓿牾舳_壛6%?嬢luN� +?o�L�-磷搙d/霟縈[=焿頊龏澃湱烺举gn 旒-隰屖\i篕l7R唧\2猳髀<�kM%絾=1e阦\�_�H烾顩�#窓|┏2o紬=輜〤k鵲oX�5]%,;胭c瓍i廉c朷`T9s5�,s漰魳4葼q卻晖�&宙3aYG兦c黇脇亦�-}巪}g蟎��宏隕巣?U鏝a�!鐋H.俒Z沢*殲�殆I`;kg�=5N0YV魚;b6溩\薙cf肽庛�>墫C-靤宙mI纪閒�.∮3Lk侖堣斷= ╩溚冃鳯� 誹諀珺�"蜇瑌婊頯2�)f犿晇雏kyFA;煅韚糖龴袁 +赨?啘�~)h士yt+|�}矽�%咄约瑱�:肵�K;v8:芸|凃-r晋昔涼夐诶衊媠G69o m糵Q痬�<戅踤Ng*倽0椸黨礙骕�#]炤�P�!��-靨y-@��&f县藜橱标h徻K]�-s�2)蠛?纛逛{js}烅灼働_稘銮妙粔� ,黄<玼wXz�7�┧孰E`秈庱�)刷=車e�5电0蚎}漄篚N睔Om靪珩部蝐tk��;溝y8蹌u��/屋靐輷<8Zo麋g~S~/mk舶缣,嫎閌Y63X<Gt籓g玾y~Φ6阧嗹麦他��g沒嘘9�9�;�3#.枉m�訚�%кg峇�/Y�!2�[┿��3齎X堵褀1hg梞=冡矧Y畇~�x莂軇?舆銡r6k簵C圏on鉄z唊鑗逩lgw愸m 簅抟毲綾腚輺9�=鰽題约 +�爙宂SV僢6v�M䜣诒?螙2:WrV缭隷郶y�饥x镬Xs攕W9W$�5滌阝敛扠灥杌�曪峳歋<#賖<E丹x钣藉$�b佰a鳁举4薨炩;铭o鱎鷠砣V�~/�&庴`+罅謀鸘龌酠b�?彋UA琮>弦��君閾7廚Ac>h头策%堺_\^#'澍Yx摞黒|�0V3D话廴X�.僡0L�厶L府萈橫`梄,3l沴t]穟鑙_7 +75�.�?苇帤6蓖1�;簎�+禘|g鼂)荂�"q/洰kgX邦k藽檓潁E盻鉺�<�&�征杶x辺o唘虺寰&R?藒Wr2L� 1[h琥p琪� +钔,搢烽9蟳紭蟙f岖�%r疽}C7授訄:鶐x�7虇5*2t~W咸跇罏氲rv皪L沟骰蒫v�>秖还>�n虀��罐87}囻�(嬊w剖湗中d藎�5筒'暾�枠7磄�+肄(�#蘭怀輼�9<7�;票|埾$<y请攪€絵耸豳緵e/赉屩蹧<3e拑皡9[=~�31�>鰨gm|G� 悫=鑸歓 肔{�酿5濳|�肯�汌暿蛒6� ++eNK}そ娘閊%幒�5+�阝鲆顯�泘浠*汁鵣|橊�$g陵Q-逭瞉姽棜鉋�-�;isP�)褢"頖瓰j裌坘瘃y鲴啮(oU}A敁扄�B檼4D}潣鴹靁 茙黀陾玽闄屟��&VT灰�6(飧蘮鎏媃8� 馥嫌苠筳蝱_颜望⒗VaL掬�c)w蛎7媫D获;脶廚鉳椏國銄A�&%呲]_蟝�8鞆O熫?�牖�r�?滯绡_�c|s�??蘳1h田髹热M麸蛁m坰鲶釞w摤檃璌v簾Ok�鏬謃嗟锨采橚tkM饗韫竎^_羌迣r}al`蝵,[雲軋羸荦�5幹餟鰙�涱9��>祇�禆*�7暹(隬d�<f碸2驣^铭�+母�Tx2蒒� +{�鋕L�1��#鵮&醭 j�8�8�鷡良M|拷歼饇梅&W6�5;�0t+�茥�=g鶈5v瘄賱诿�*{�<抩;鵓�€_,峽}71V皨5唆缷裯�Kh蘦� m麋肓z ?oK鲖o巬@惶�蘶欀A� ,�>橯gbO篲寎狷西�=钙鴡觹\勭甮)C荖礅x�<喥髃鋥觸3罐磵髙�!侻�7阪齌|穉完觲|b`,<囊�<3骑?軬��)晎�?��*�"娅软犸罯逊�55励�#e遠x喲O直鼃簐躲b啼v纶�七王Cy6�.鮵m遠瀷8�6嫠單螮} V�1鶾(_k2蚓�鹐8?l�R覯y﹋嘰-he�9珠�%�9求啒嚺u杼儴﹤~轻�)9汒�61�υw娲鐿b縍�F邓Z]Q'u�7淞�9(E込℅<�!f疟悚y悯0兡樷>侖鶰�;罿q繚緢8/臱�6幯鸳a妆=岝0痶�肸霹>X'S~飝韼�]呖vf�?骃�5荮+�4HC|蝈髧芹泒|W2_褰稣s溝�2o咞嶽涞z墓�h>綼�槪辨疖喌}秠災�驕�9G摯�9瓅v蜏}榼R鋶a嘬wE�+铉w鈼`/蘽2�厶X�謮骦痥+黺徇專�x彏珬o�s%胬�聤��H�)疘啽蟒 k�v璙�鸀(n&麽�:耎澁丮^_ c褳j-�8瓧�5nL9~蕗�忎��g罯�K�3綇}叡魸4亠壍+�R]K�<�>�+聫 +�K柠坨鞭�2(s鋅毮滗颂c>蛓:�j1|鴜1f焋��3|梑G綾杂峁D�搦z縱\燊F�8斥榮�丐绮縎�3(糠鏾匪5iO撯卩r鶁�)蟻s|餝&咖~�'O~喘錂bj皐棕O彎鱱V4欷隢�嗝EV�d;|沗伟嶦&�>>�c巴��3螩2�s�邦�8€9�)r.捪ocym +[� S諂`m(m蟟妉R畏礢S�煟�5搇鈙霘潒 杤6OJ蜫l�"拮焊`趟$鲷v=�3sX蜐曠O0^支z`�筀S蹯6珹kf,�`膘噀_E涽H�塋椿夁b有:姳I�瞁lz瘾齎黚騧#�鵆q.�1B�n非噺荗�>壘ム曲呖�c�-h慆�>�%?:锆捨{袦莮焳謄�)镅扥P}銂b>貔摁�'嵖膤:�&猝Ms鱹裙i_8g遖���褙!停i>e~6y膽mw袾鎓緱�2V槦氈�|災缋Y姗網ㄤ張1屄坅听x醈���������7S�������韢W揺蓂�聮夐炬豮跮鹖?=摞欇賟k€]�R遥~盀籀杰3疑u贽�%�8懷鎫濆勃緭晻'殓�<+g價4 穷{� fIR铁鮣$`�3q8�鄗蹒輓6膂襓�琸X�僙_>`\瘲篃�K嚊唐#,F畛n�}=,t�Н�覯g怂}/潳谱e'WC�=I|y牤左?兙<b筍訵b;�-岓e個N凶┧Z^�?;\輄E�9`�/�C潠旰A={� デ藻A櫊~�L跭}泮�~讽�1IK卓�星鮾>剘殂C篗蠴で銃澈價蘶�8nP?n�桦�3W顠從廬O費9� 睙A郒`鼁递d蝞啴餾稴鱅-疄4&u麪\�繟;狀甠鷅_`邢`W �獰g3€��鉌术�'竐�?a +�>�_7�7gS闳灐-`?]g袞艿陪 +�#�燺恨`<栄;菽峿扄:铛正缝勞捄��尦g7n貛N"6� 莣v�e�;;詋矗噕mM�>@蒈\�1`玡铐迧磿飘��9�瀘赹W躞牣羚K劫%%味j澬oE]洗.镽O尼zh兙= 溨缰8腶筂}spKsph_�屒岮Y曛眍)\醧薓躵顷穗v鱦踃Z岔€1f琘盀�闃>L撒未�.匉t€澚遼麙�8溜饂梓霌艚嶉趼昐��%~蝹 �耋佒 +縪邻�煆i璈齖tv泋踭6ZcA�鳀鏝譡挎fj_髙_婓侅䥽觥L�)0顷1桴覻Q硶曆l�蔶u珂N蹶鵴跽���?��j�弴礬璭粬a-说�/��6D`唞蘅9瓰?9揶瀕U嘩6g;雞煂p�駷 +骽€{眺抡萲賽0铥堶�菋鯹�/E颸瞰靡丬轞铞R膩q 偤R��4阢0N淄曪棵摺~0�0nP冢\鲐q摐�"}� ��〗w�8V�#>�#埛G�'癴f脜h╲衵�!�*�6聉d葁軏2霨瞣Xg还沷0妨帺霷� +斮�穜�%碰b贇jN�*渒鑣u藊?剈婜契q辂�鮽笶p4�c稦8綜麙餓m囋^氾P╫咓魯鱰j奉洅蹜簋/u攔塁S�j3釰e四u/羠蠹d[咜��旪玻8��麤鲫N�钭荚��最蜱耬7Qc夯殦#� nG髺8*漀孪谋<G鮷�2怠� +N�#邢炿xqO=vT�釄3�#溣'兑〓^︾鋁X繋� 啜�"俿u谋藞G泌挄竁�2�-4飱>洉8n﹜p<箻_鈰睪蕓*�;n,頎5剄幍腬о}{y�/|�彡=緸珵#攷�锖�尗�'钃菉銁 幷�1g铘覼杍��p喇*凰鞨}QN凓<�)匊\ +xV7qc�!w晖酘0N緙�_n�=+%顈癅��銷汅%粳七=遇�3�%蝁鋁|F�"'Jdョ鉵W� 斻�,�ND隴�&鐌捀摤;X>�处涓肵u{�,/驓c gW鯲5莦螨�?莦鷛挎X徽匍vur�=徊�1[橪�PW跨e�7訛嬳鮷嗙惘~�fD鹽9苪艔u婝-�+鈎�1pv�1~~�3g�z�.�攳癲N%捍�r ��窈溮<B�2@[爱�9婐�cC>�G{0隨mfNR|R�譠碗極j>[皭瞉遟%颱灴娃O�-Kq髵鱸獠�)S享R稯Z�=@輾S�8朅 G%踦P醯��:�,m.棚�"鱈S籊Si.x}埫�誜搣{>��>�=鎂软e∣竇獆4v歆4糔茞灄h<0IrU�!?[$�=S謾m蓧vI_殴蹈�+俱鶗鍰靸�5叮鴔*蟕赪I>/釾f�荺�#& �提玖珊F稺势=P='f蹍? _詜垅�7司臋鰆\爮��爨��.WI痝筍�:鬰�懼1秣磠否<hp嶬=伺�遛孔�=�0潏>�0I栖俼幣� q!�醏^鳑\蘱,胾"�8q'鉥篸睂凖w�婋�獽禝�2稸缣9栶��?Y召飇献e碼go妵艳K媫篸楕\D{*碗鍘蘀�+5.鬳�3L6堛柵謸~�(�?w +勤坎V莨礫絲�嘽輆幍3圻贉璑O镌k�>� ~E闲fm"n:�9�恭桁 }溩`軳垞=崯駮犠E顪Y~E��'?e/幁魠鸈?X�4庼)肮��跊�3憦夬dTl.[�=夛Mq^�褓剏� +�%G�5��/癮釼!�%抌�4椪䲠&.鄪首鋣1q4峒�'GZ��#a/�+&臅姧呪裘�鳶J翓1\Fg� +W鴡w宄[猥鋨B馳议副~謄\揝f鐲占`鑤c檢鄣躍馁Z儯�}胑�5oJs驕yj剡�誶园幪e�hy摂+8鉃灈K�>�)萻Z疧}�5蝧弈 sO鄏竦58�:�8狓H娇k廄%苓駁,鄝紬!� 瘾n7窿耒\捻靁W焬q1�/Dn�}�脜g€濧,�9跡#g{]鯯Y.朳P辣4g?A/8齋┝羸1锹6蟢釥nE鏳叓�欞k�;b{雥V(顢猤,鯫'z�麛P燄0�y队v.敢嗄/� x镵Q_萇x.*}]7O觶车雕扈餽u镂�?+黃rj庻淅q,8+<谶氻9?諸�0鼆�>+櫅�3�#~8:�* +釽傰}抭<<kk`琝:g磡Mp罒r<o!~逑m矵|虁�莙9祗屻榹r;�-�8鸟yqp8n7屸�7谂v�35鋁|>.B螢缸J蘎熛 甌kl饻睚�%汨@燇h�!傿8�lゆP)掀诜`苟斔�2澉�s抾�簯9I紖瀒z欳�3▉咬94�-�(d_铟創圂滙�9滘Gx���2�.嗖v�q��8韔$縟&䦃魈qme緣k�"I賯+r虻枽r�,�&啜鋥!蝁�:�g奰【1頸勈%溾敗N娌壱i手麉鉃黒7板騸栂�9p埶2猕隀M�=P�N潒:κf螊缵:.@棴9k G伍|�9�5縭gP磭哀鴷祚 +缥狖|甅~{冦酬抉uyB䴖D|=藲�绯�)-�?9`熽(纾次j鲝;,漮蹄z靋Z茦E鎙葢�>�,�>阵o<绑/�%迼鲺S�3'闩v�姗G聮课栌�94pb绁櫑 \_為玢汧p馢g鵯<�6/N�7�w疶熂r瑆oN玤5莚馲й瀋mm苔� 票ヂ%簴;'襮*�?a\嬫X餇�51N�8�'ZK.\G舧p<嬧'Q.栦猯ZO愲牤�8%挪vM{pOu�r1Wn/3�'鯎x)聈溎wH� =#^R�:�.炑�)抇妡蒢�1顟p.f]狒�$椝g�3��忊祗⿱偝:{X"u俊镶z婀X� 墈Z}旺羱 舷^h3:易�竈诪祫\V舂r楀�讵b�胑薳�9嬣颯�,k9oa8%舺唤,嗐鬆R=*邇釆x迼h.Kg�曵Z|V◇U鈥谧Cq}朇泱�顿麡,7�瓾{汍邌陷!G蛢g�&�齮娆}笌g妤�y.�甔(?"壠Q{ +叛覊8虸I<>軧鰷"膉^瓂嗸-貈S&柅嫈�电钼!�咑Z釆鶵�xX圕钌珙�-涼dgC┎K壽犯L鵩R墰R:墢殉漰J釆溷cS�8モaj,鯟O}銁O^o恆/蜽XO擂搨齎逻ネ趏�+.T0.SsL酨=瘎s憄zl4W襼G玱丽�*.�>襓 �'+玉lgkm>w鯸<昼o晓d塍wg諎簩�5熁~躲獗缽�9栧0]釴;鈽-玕Dp欿薪楤輜乹�>'婂�8惥�.剫 鍨逤雺宐6z�;�;=�O璫曈抷輱"頓\宑E99泺T�+仒��,WTw宀sJǐ諩q谩/嫔R�?{,馳谙c~浈.S牯�.i闧姈�89/囿e鈯s�炮嬶�>疞q咆愧r桾{檣&E#~b)�騋�與|3S縩'錇=鏪n<岅k�+躍蹅胾,蝦霹8�膅(蜬8蜻v墧涺ク�@獯�?旮р�妍\a炢5椪87�o怵y CN墱梷�/�墎驕7営<趕���+笸箿:.踚灴�屜夡�9就缸� 麱簂猕醈嬘{谗��詰8IJ�.砛D泗*湧d螔?p猾�!�Fq鵿\�/:�$咰螞拡>�3盅p^�迤嚫琡邔�/X绂Ilm2澀謠x+秃缺Ma攠烏�c8<KY抺廦b�h.数H�5憹撓邢1��� p爬�}朆紈X?_L�:=蕤n哕疄<篟絳}�'鉞_}竃絶u祕t�牶u}�:=荞k2qw隨uo滎▓乥墕糖�>C.鞭)��珥瞠�*�桲Bw褷LwМ�?孟%o乸捅@_B:膘苷mb顑檐頶�,&髌8穪kGa|b�€齫��)S屔襖憇魋兆鰩荺巺眾4沑'聺2;1棾潱�字鄉8 馽�?>��!~o讏t溓乡攅>熪鵻騋鶀hQ{庅Q饉/W陔置�兲鍁遘樖漺宐x`Lz��玢O\龢{螐}v�~鳅萔鶿{嶅唓*F_鋝诹鉇y斶S?h遙人媒G|嬆藚G/﹔�Rp嬽舼瑶^釔绉� � n綩�瑁y軝兯誢诛g|o弯p蛒9#泳}N冬我BT婑R漞}廆�6@qJ砻振Y�3O)鲎丬瀕p咇Ey污W|6纄r&)>\�箮ャ%帲:縌j|=�χGG�*M-�j1乗2�7\�.蹁捘芐漜q�4�8\莡鋵勂(禙u魋e�'Aqe 軠硵�}湏觩0�9謉兜�2;<X痭\攥?塬迀z郮g1庻鯒穔帾g;振翓溯0{y桍諛竛{铢帋%_腷I.�s�$厦&5o氃�唏颈$-U��膷W幐X辕q焿%黓4ㄗ�9V�鈒寞$�s y䴔 _[敨乻>Q;皫i:p跨 +F{綄}l殲-瀣鼶磶+.&締'象9蛏�p�鐣�7X�&7炳�3眠.┙争:o�/鄓︓|`霏��9跙顃屷鎟涧_€c$�Y�8旨鰡窫\琸�-竤痯~熤2&]:_.e襼砦y�>:[帊1漌贸絔7rn\de�c鶭�.,�味詏稐l:�-)�%嵥蟔毧G枉 芋T躒嫌Gw�s$袟圭暼\b溫Vl/#焒聘襭E379f緇�#P公疮"'?e87;筨脟孃R臟坛溁?嫣挏T車|跋|宲�巨帱义j��誱善秌n譍咖珙=uo限%H耦a殛Ⅲru 莚g�县 +讍ムL�<W"�$� 苂v�0姿�y�<�/(W�骈兿缽�:澨6/O]~,郮O�膈�<巙�9郑P�?N躅醯暄觎t�:覆Q椏纥X.P鼬w郶&惹餘�艤�1垮轩v黓@�$蠞V�>�荔鵁c嘙'�G>ボ�$"宙�擽4_惕寪騆!�"]炦)躳庶妡h梘H閮sS魤崌�x溣欫稊西m���6`N堋M��舙鸀弟防u7躐vO睍6涺辊J鹖儃E:�(奡苣腸-K�$骿舂翟鈧�鳈t邜茎e麑�9{�…7响WL錣帝盶⒘Q鵜m�犳N!71k批��艦%棛�<3★搙9�P>�囜�.8vЁ苾箻螕旟�$�K\1Md_]臐趔E8n1溵�;�梙鈿�(i鴰iO嶏咅�8歄琦z��8踈_ej髢瀷[p�錩�1&溛qワ�%掲常踜�/(}辄\Sb[E€� :V"q�=ワ狭鎖 >+酚倒怙!.X3搤峲�9砲鞝� 腉P�帽z蕪ヲr醶}6QkJ��3柵}.F�-q粂8帽癘锨暡>土罼 +菤�鲎獩76玤O甌镛D齒従#呛V算P席抗[�8謺觎闢悼wyvymZs�)ZJ沫(拽�9�!yJ%�髧:Q蝴鉺:L�"��釪腉嗞蟊釫淿E悒靵*荒s筒�>$鄆敍[疃#甈笭LSOl锶V�=綧S�氏Nm槹_l瘫癳巅往4没G┦UF鳌閚O飃�)�M\艡籐x~i畲3約藂⒘=Z)W�3�;E鷰 腚趚R}�揵�.儇�6�3E�憬⒇y蠲Lbk�;鞹Gjo縪飝�曣肐围掯%猃規�(錴満�4��;鸕鶛Z�%蟹�"窧穋)危娠挥rE}8c隞H刘k�8呶葁,嫗 巨垷堏菁龗鼶�-� w�池p骲浌鳫u�睄鷟/时.\'�胾�W1燄R忬;5騳唡€sH捰=郮�+殦蕄�.铙)�Q>#巅萕�,衟盭{��鎪堘€籺桿R獘.銙<浶\'鬰憹7p统妺醜宺吮漊\��?�K�0塌蔰督5�疻wnoW/烇W熆?峲葲.卤v�$泽O考�騩={|P莞綸]賉玍W穷軖铑SNB鱚陶G摼溚 K�$耷dsCY?貥�艩R�+2难s2輌g6術yc昸詿1毤烀�:Z}�^_�損馵﹞鑄7鏈 +G笻�峰�=�;綔� �;K� 壝,.銿鷰愾4q6��Xg€喻儁Q'�果d�.e?�擼�n`Ku魉直亱迲焥椌=)^捧U�罴霍 \瘷�!瘫 w槌鱐wa綫�/]�$藵{洍T穮x`�蓿布渂a埀犒V�8l獠!г酰麘藠爰e圼桏;貂3侖}*>+9�鶆m'}侥-Y虈;邨�G>鯝8��(賩丿�>�飉妞2�纹緩O�9攂綴�]暬*欍KY秠D玮杺淭Ft� 硒膘鵡摨豾鏿�梯埊'銬d魉簙瓮}|秿煋�0?呯m 茢閈r���鯝黋L"8易i鈷�g蛎's蔧�>阈喡vN踆幐euf囗蔓癭轔疲倨鷗<琥祶暄嬽鯒�>F8�銶;鋁譳y犍齩���'/彨{wv悯牝:p煆�~�4d掦擈[QL 臉彂GP�洽+\殁耈~�9 +珉(�醁s鈦巗f�;|t栨淆勭ぉ蕌嶗%砘`詛謇'dr9然I栎�[咩鳨娧.蹁籓汣*�8)�;糋E�)I�){O)�#緼,嘥堛鸊輋~�7囶憃嬶)5p攌J�q2ns嵯閳程裴y炣羼麲p蛙>o猵a綡Z雞�隩�xjPG蛖 C準沯p艑r祀�5г鼂.G�~敪汍f�E驦%凛|�+W2绲罵>*;鎍�焷覿�y9�'飜扻�8n�W昁笃洫弱髢鲠J奇}A�娅�5晻_-隓�酷胅東jp噁Ly垞�熣皝[掿[s;苪Tn(*�/9�;q遟槗*軛-O%巃|喠{}确蠝hY舛$�*aB} 煁嘁~<.滭� 雓鎢�>肈殡�9!腷演K�7�#nB�,豽{譄h槣涸绌谨(9Im幱瑏隋Y琄{湂-Q鷝隀嶖� X�<�%蝪鯗尘:欗n�oT黝B庽藐�WV宑=E�4廲�%uV豨�䥽G;?w蛰a紇禮眍琓+討藝 +u�3萄��#南埩;y{﨨錳楛痱>/嶃\檤6以瑛I鵠p*呒枎书U颀ヴ�7O邎鶗_狃潣]i苫Q(V隱铻�vE镡员9�9��2yW�9kQ1汪��民=%s邿�+,>岶轙漦*腮�.絶�!}標盂譁;肩釋螮rH辂G軥_萉u⿶驲_篾�8ボ悃� 庩G窮逇L鍐�R欌�9*倔牤蛑(^iy寸菎R!幐M闺_�/�!鴉O崟璼A>汯^倚�*榦6� 卽勤銈湀煹yS咉z攥��6sHe�/滇涰7sM5}�_jм9�鈓�7髀g�&N奚D驛绻 +sHyI#8潱-蘇J_rY圬�絿�/K遾9犆%畄鍻�)鋠�鉘�<W趪�1睌�#� +甮麹黮€6�矽軖rJ4r峧�輒p銞jl3g崱櫙滄绀摕�"端蠟\緶d7r�苻<簏e<�8嵳亳!鋖丞^<=xwV�?�� 票�!o⒊B郤?塸珹-[坿�鍳饳菘籗�疻�!^ |Xu辣|蝀�'芴螲笮睇*V$腻各缒朥�畀欿h★\倄 棭餘zO8�駍�8嫼迍+2阚o嘁�G�"�-N窒駡瀻+�8謼溯蜇�3莘"}笪� n�>捎9?嚁廼\<gV3廻�\?Rn'鶵�銦醭く_9�3闚屆�5髰*}��銛衄+9〇8贌鍉初�'⑿9�"顸故!畔戃P +H舝C敷m武幖棋grHql橋�(鞪)鉺m囵=濔>膧髨騵�護鴦ね鎦玖西挖w*飴鋯 +|婁哜基>K毽鋹䱷��$�濠爬�9ソ戶�2u�鷉S洍旙:瘙坓=�+�)s�?抇6魙殅4搒镉嗍&庿嵰\�!曁蹧U炗炴熉G柁^苰NS>冃�覘)拷>俗慁鸋S鲞�(W麼裣^向�0荳襅鶛炭_Q銏"?�<�9I麡's碤�:wU_鵟mN羪緲:澖F�{FO|涄晶B俏鰗6��l|C[yG鬃绹�:兓}O霿轡瓇跬�(緽庻y�颞恈朘�祃b||脧E虔靠��?获裼WG战�;蔗醃统爊Yt煜 +}>长q6琧Oi樐�鴾f跰鞄w垱{W})袟6shHL炣?殢�8L����!\�撑鍇�*毘亦孢�0玎箇� 7缇呂W2弸��;逓叟c淳貆�%Q筀琌�嶇A Z五灍�9�凼管f.肿躇F ̄儯鐣�8~n槗k鼠;昣�?�眉�47q蚢竏9�<'砪澁�;蚲梼r夔pJ嶦R>Cy�罍\N�T頜Z_梕醷歽�5?頓p尲营�+�'ミ凹臉3捂X%瘪f蕳跁w羣聓丢瘆嶶霙 y%馽�J�瘸濝辄>窟JL備�*澉_層欤択J�I栓q�%#蕙p�擗x/艆^牴l?� +薋D湒鉓澠/�3鉉 +p膡贌�<慀撣#懐突B緖釩鼍G稗!巖缺O呯aⅣ暅菒頺顺-khx鍮yI管"掣,熄犓瘾辩W�+Yf蚲V�;范玂^V咴|鏮鏦蕪u嘃〡>蹉€c鼵-Y-氲溒b薜燂�乍/廫=N幹�5鱪熔1ZY踞越�b蓘s% y輓8;�疘�0漬_p��%鈯&~龣謬�栭眻KW启A�\� +N�1E莛\\鎙噏P.bB\侜犾P_噋夎#\/纔{>龀�嚈bD法\闏铝=梓F箞儽跜\哙@_廁b}�-.足�3�螀�廁昴���,対崇@熺跈�缑咠 �鑋*窐S�.賹�:<虥f箄�/癨_郡塁[€稀N_?甯3vJ熰氻吙颇诖�)�纴m檝$<�N岻楑%� +W&鄿m5趤秴鸂c多鐊�8咦>�账諳p#做�H厶P跮硚l珣1骢m�,K�咦v湞m9湻铡婭饻�昝uk剗M髎N廔哙�/皝緣4&皢�鮽~唘�( +�'~碸�%舷A猁F稥p坘蹬鵋�甀P瘡鈗蠪�#�W竪*N�q0犾頮�=(€3eN'鑲龌�7}�爭��>�?鼹�鹻圜�鳽鎡A?�9!� $蟷$j�/擀弃T旂鰻晾�5�>蒦5ńe蝯鮔專xtl�呀獜沏{喅q萄�2现W�3�/哕樚j~錼5<莜緓Z7风�+髜婞)C>�9謴jZ抁Vj9�"� �<雊瀏=阜W菁镒侉 N祢:洇�靡舑伬Y"糲�|~�>灚�\蘩璅pEQ疧兟齧揪茔隉侒M骊�8W恰縊@8鑬嵥雙e� +n*笢p畮u[苸� +彌`�} 窵p#[.鉹榌穮�+<.?玺y)阸�>$礋p杳瞐鼱 7f\�晁r�?儊镫U��/g}秴�q燵楇琐m�>淒蔝8ハ袤爥兌妇檸�v}m���[€� +q�7搼�/(7S}=E滆� .G麣\S�屮眿讖pッ�<3�}ywa�>�7車p�烓sg+W鎓寷�X}黧z�)�<拮j�,N觊q2&��4卵\�168惆拓捅�n:庛 +尼紱o9鉜盪極J��鲘??頫剄衞Y鎱q4&7乽玥�'卵�g-苕�>茀}樥<'Oq~录�6OF�7€q8c�吽�-y魨蹮d裏繼鬭聋貝麊赲鑯苬屒'%顣�n]鎮丁)庡足(�,\僭熱篽讚醱颅饅糷蓠鏺髉0��硑y张凤懋T荊k窄沎巁}xwZ�7�+鋁�7� �>�#疟~X诉找璭T薾-肺与愠~蟦V颺烿�Vwo鞻g蔗诀kA鷯薙w~拶\u�儋Zu?C\€?俵荃�!n損5譢骕瓤*傅�7檹獷汔�癙檄�n僷䴗�2積蛿mqc淠+A賯[�1 P6誵菲膦经�:7B苤Z€y�1h趁璏fuu渌^�6飭刚1釬軚喚€!伈⿴剝~兿WV� 滆[u�:躂=媳�柳y}c鞴谜耺贁独螰邐/卪僬��8g嫧o圹底幡.[�斔(岓s��蹚鉌f溋f犥晻�稁X疃)w€B8諊�/鐄狙搁t郉pc琳脖.�4蔚籴VQ�8喽謀�>翨[�V錘U浀輑猪_嵿V� 螃﹐欣�nj鷓^;� +'}咦}緊�╫b8�:苠楣窾膍o瀮S}附光粝荕6i嚸 輝�.墩�>�殻踕3瘗べ讞���铔b乎f梅卨々q�~>���-U_l]&}�鹿举q媰>劰|yz�摼� Y讅8醧案�浊黄腧蚤噐t崗]]↓d惚q舾躱郎i唳v �;��-郧:恺咜3�杩轁召蚜尻晟fu齦澈wG騚� +9�-銶#銺困~�8�0��%^F縒#C攇崆_}}脬�7д�'諆粄諠�;諐稠 +b飘oVg' [�饉艙K丈a-G顆�軚鄇9 p�5�*鉊膓q\k緕獯l�6 铌軌*鸏a B�#嵺6X�I�w�%諳襑鮣й鄮k埄R)逯窩襂疙瞑苺c賡�9芎� e�>l7隱=RGlG +w阭M鉆帲u躷�鑠kp�&A潺仧O帺l�溣w爌雿�n瓊w5€老\兑鍌>翾俸澗c`q泂qW鯲胳余牞+垉�a﹡€跜\-P6崛独F囡勸负-嚎菇k珉笌u旕疱謽��#郚�-Qb]沀袤pPG嬠pS�#豰\�陪d�6}觠彴XG�;案=�{�5侓�鷗[�;'鶹yN铊 Rn-緊�n萼t貵豧7��W髻尬訩豧�好vx茉�3�;rМ-Q芪�酐6z阷 +�$h撑)澔�封��1�#W氻瘊V豱糾璅q車8.G`8a洀|羄巃捺�@+欺屻喬icSc�gl缏佖呧T=№{wJkS€髒亇ip+�燶(x瘦踸.氟城隬囌W_渳瘹9骛葪.#ZB>�疟緩1Y噙曜2〆瘱鄣|z憆削>~蟪�遾vR絴vP=y革挈柁~跣蓵炅�=珑簎}私�渲峬鞣g劳~鱲嵒盪莠17k黰妮3�+�F銣�;W�!嚓哚α軫}��梆;鹈踰貾厩鞾}u{罨鹅赶A�穏qP菦; 軁.w垅藇榌V�吇噀遳8�吟�垴�*0訴羺uDl�=�=@�>�篢l倬庺7^XG吇?愤轩@��.碬p凄孨_>�"���w椝桛 qw盻Y�=i弉�='�9�=4X�1ず喐籨g�忸远q琴铜@遌��,铝� 睾棉� �(6殒猛z顮伟h>犁癋�蛛6壐鷖纴�頭埢K錸粂韚�9v弆r︓軚:*� q辈e-坻5祥亩8k�<螺垟莔哼踟,翴�Gk虻 �#鉖┒苘a;{p'�8杗帥谜锐x輹结蹅e咦�鉷道轅6徭�躸l廩S镬瀷育mpg梇鄔哌;�闻]椂X軉羜�&麐韵磞鳘m譯艄m炒霹<p|稻[踹爚黠4��t躭熳;v]莭媝7;与0鑳v+麢嚮I港玢�.芉�€�?ytP絲vT靳簸偧T纁~髹篷W奯}�<iySy皓�+庻讀^攘r屳:苨品)秣u絶耋��r;@溨�/彨�/O狾_淭/�杭Z�霽廽侊�k鄮/�U�<?v�W髋+牧螼n蟘鄘狯輌�q愾�鈄=?獮=\X?�;Y寋俏�!誵瘉麛p枣�G��'坽J竄炘e鑢A^�6頠�/們摺-瘗嚮鈖拒#�/�;p��+椱�秹ワ苗O]um郟��c�鲓鮵��唷�g陎�>{��淧�4qR6皂�3漏::lm嬽呃続o◤p醩]稾醩�1遐昌�懏#鵠a}賯崭W 躴鱎雦b廙=t]>A�&迅蟃`唤}0襑GO"8?F/u�!铋幯aw倁荏躝X�龛寡y偠6L6鱈厦cU睢�8;W8蜘术sg唠�忊h..60O詼5eGp~M俜e3罾蚹扶誯�,e�<蟾'z軨軏g�q忀悍嵇K郾霹趸Q6胗朦?�Fq�靫,柾�狒>剓怯'滴Ь鞐h狒�<簖祺J椒IA�+殆Цш=餎]�'u`怇D蟝渟苙澗p�9b�鰾嶕y笚!翁儅翙u恜G岓�鉅莸]縹uR絳}祩髯|嶊7�x玢奎钷E[銰侨梤銸媩戬曲烌e齡<OYW旷镡y!烏O�?7>B均�>淯_烛諊ku甎镞湼wV雯p眞痥霆脇A跟飲pN咣毸街竎噞烁隢> 顛褀鋚X遳黧<溦w叠[X?z鮑-熆=s沖n嶜pf蝕甿!頜w�?☆洏>杳鳈�s{x8撺6吃緾邁艍P�饙獰痒乸' +自缵鼥剜�>陆e\紐_}~黼怎吤紽}o}h�黝<}(绪剝�瞰诐 筿y-鸂�+軛飋苒P遻溢砥籽他鰽鉔]y镦岚-饂��轃Gq~犁�?髛齇8i撤YhC6鬭洷巀绌�砍>��鑰9聟m囅&礼笭蛜顃瀥yw外P'嗫 潄.i穙��3纝蘠達o栳2T=�⒏牊琝銁車&��g� M琽冿;Fn,q蒹}*8嚟g埒爌8F蜦pLY'牖f�pⅢZw阸垥z^嬥戎�: :掎減谸羚4g呖%{?躘?g呓�8况渪{&{榴螂娞颴賨n雍B霗.;唭�c聃�7玱炯U焚�-�;瀋f欮蘗�!顙�俩9`梓/礜鴂�缱痣障扛Q}蟪浾过駑烤黢客�醀飸]U9焙葻~寍陒奵� .�'x�|^鉶整/食ZiVZiV �+齸�1颔@銼p�3C堊�)轆�(烏鐔襃+襃+�Q�+~5A烎S銶?D�=捅烏�<�*�?^(緯VZiVZi�/]0君驙y�1~uA�5苨莄專縋^嘨ZiVZi縏鏶笉黦w釽郰}岆傴y抚� n!瘍矷x_蟬�>礕�<lVZiVZ�3�'繱€��o�<��x��=�€�馶7�罣 !�顲籍��收VZiVZi?!nB\E��;��7纒€����<繅_-郰/�!�p8萭 +y汜�<理鄛余C埝譄U钹檄匆J+襃+9��3纊€������� 郈�f~醂斪�>@~遣€�%啁鱈C绹6lVZiVZ��1纆€����|x�郃绹Ⅶ��<媩ZP��抠%�萺+襃+沂_��>�� ��;纚葁鮃醀� +怪凹a� ?A鶝VZiVZi� !C�� ��;哰}鸊釽鞼~礯鞼~礯鞼~礯鞼~礯鞼珧��兮戩麱������������������磔[éU餱戚(]逶tP!垈権E7A�fcv A壢�.-�#阿騊$霡"杣W]Ei垝圴T`姧dtF悠&潤�蚙_砱�gf燒.~��7遻�蠠抵忿照誫����������<M债{7<S_/�涝F.�浧q%�蠇椘uqVl嫹�9谩眦�7徬�wj�"^/幁q�8瞧�a戀烔Y=澣��p鞃歾\�g那廒鴁|?~?�;泐鳮�-肚}k�韠晴阽�繈_�qk黷|�恸�&�W痲U\椘囥�8/螏浊閝谌o瘜W嶖算%駛戙6�3莭畬沣亵$踜箬"谓轀[�3zM�)�2炿頠�€�4jn�'菣#泓5墋�:憓k慰�{c细戚駊<�q�8瞵yo�?W蠂�~非/哰鈍q觓鶴觞贋[藗崑恽檏讁e|7n巁��3骇d饣苂轞}s阍}�娈�8�珡�<蚴T檍�-蜻"k�瓰U'G废禍鷯牦粵︻��0W涨e甄籀�(踢s莔逃�!�<庩霋轠}缘涘漾K�7\櫤��?﹊譢眧诩� 眜�>�sS}灠恁瘅詌栂o獯1�蘉鮵�+蠟篰硘邡蕉莾5Y�0T�#陜征6樅V硿赹m-焳�`u緅{d^U謅q溱�mZ�V鱣V遅]锯h磚飉甕��^鮱铉V�}�蛂k齂%c纀烉诱� Ξ�,分�>S2�,2謚e瀽W旨焈~W�媤~s鯔遄蕙4�藺鯇鯐2幣裪^洤钣�0�3昼蕑,嶭随�5顸2O�鸘蟈娸3ㄗ,桮鈳犒巒-� +�捼竒5涘哑J蒞��⿵'菨3ㄛ,�6鳄帓���1R弸嫪肯w隁蛂icY_孧S鱟�槢觌旓欰絝岝潚��� 者s�2喤慽胧帛;�o +�<岙詋朞[彽�€僒呛 楢絝勾1悚1�蘍j�)q�j6衰黼䴙X櫤�n幩蕓!嚡鯐掀塖鱛�槼允-竦Q;椒�'寅茙鳧<К�€�含g蛆qK貂Y彇糆A诉7臲q略}�朓觚H踸甾椖雕酶碟毉鼍潠�疄瘤廁粸Y瑌鳛觑苉琮G醯@;珡┸7雟;�?畏{�细绲蛛�呋w<雟 �寚�廖5坠�贩G棚愣阠済W厢鰅�€#T}\氚zOi{/�征愈@|$.�/莡qC觚(沷e粆柞�3^�殂征榵踹A�=螇稶�;`�:帝y�飲K鉙qE\5\煆封芶qG揖q茺撰铩觌�.�慵8w�露c躰�3泗8)�/髠�皀闌鲒唉饺b嬨眓a"嘵�Y_{O榻O葭����������������������������������������������������������������������������������������������������������������������������������������������������������������������x挲嶕S���������#�������砻A ��※7}鸙$T棯陓r篚t��������#�������砻A ��※7}鸙$T棯陓r篚t��������#�������砻A ��※7}鸙$T棯陓r篚t���������w�������砻A ��※7}s�$T棯�杩麱�������������������磔1n覲繿6.� +�S+�j'砥w`+�墔 F8�b 墶7柃�览勀DpiRx;N躱技黴-�'�(Q杵���������������������╨�姘H_U椉X寸 ON觏9撶蒼h县冢{Y\煣O粸穳�3~op厢頭鰿作*�l撫0�)煙J螋l釣E譃髥锳d相诿鬭d鲇m恸F瘂酁饕�慎U��&KcU�4�T穹+︽煣侊壊Os�澖/V糦蚕猃+}髦Ac5?o誜�泄N�%O檞鮵┍�爏歟{鐛~ζ€握j€犷^��=^d锏5K�甋c昸>�鲶�<��6�"缜f?k����K飙敝譞��X萏\��75励箱|�y�.瞱琘-;o-�y僰5�鬎テj篩Ⅺ$邧澐掌ja捺Z��健焙�7竀c@oTi€沙"y貶充闆贋�-;o珝掌紋�%h鰴g酉8*�駓摕3�-�(襕;�憝��`%m�=�鸵鈾鱒kE嬲X��>kC缯X�罢X�<y鼼鷔+k|苇4笡�4轝摉 +��`=XqF繈yWj瑲4�4Ncm杓�禯��(ng裴c兠潺ο;Y3L�冹q#�沙闉�8��k臃�2o|^��氤I `^��}1y枛帍�;��<窍︼ =�'{痳^(騵�;i杕浄掌猼o,��p]詞Χ}&{摎e坻誜��14V忔誜���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@忺\\#��������#�������砻A ��※7}鸙$T棯陓r篚t��������#�������砻A ��※7}鸙$T棯陓r篚t��������#�������砻A ��※7}鸙$T棯陓r篚t���������w�������砻A ��※7}s�$T棯�杩麱� \ No newline at end of file diff --git a/core/assets/options/video.png b/core/assets/options/video.png new file mode 100644 index 0000000000000000000000000000000000000000..183e94b33431ee55041b5b044b58d48970036bd5 Binary files /dev/null and b/core/assets/options/video.png differ diff --git a/core/assets/options_select2.png b/core/assets/options_select2.png new file mode 100644 index 0000000000000000000000000000000000000000..258bff8af645c25851d517960f6df0599471c137 Binary files /dev/null and b/core/assets/options_select2.png differ diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/pause.png b/core/assets/pause.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/pause.png rename to core/assets/pause.png diff --git a/core/assets/quit_on.png b/core/assets/quit_on.png new file mode 100644 index 0000000000000000000000000000000000000000..f2936ed78a9f3209abdadf6d43c4f88b5224aad4 Binary files /dev/null and b/core/assets/quit_on.png differ diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/upgradeUI/Equipment/tabButtons/sell_buy_on.png b/core/assets/sell_buy_on.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/upgradeUI/Equipment/tabButtons/sell_buy_on.png rename to core/assets/sell_buy_on.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/ship/anaerobic_cruiser_2_base.png b/core/assets/ship/anaerobic/an2base.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/ship/anaerobic_cruiser_2_base.png rename to core/assets/ship/anaerobic/an2base.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/ship/anaerobic_cruiser_2_floor.png b/core/assets/ship/anaerobic/an2floor.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/ship/anaerobic_cruiser_2_floor.png rename to core/assets/ship/anaerobic/an2floor.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/ship/anaerobic_cruiser_shields1.png b/core/assets/ship/anaerobic/shields.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/ship/anaerobic_cruiser_shields1.png rename to core/assets/ship/anaerobic/shields.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/ship/anaerobic_cruiser_base.png b/core/assets/ship/cruiser/anaerobic_cruiser_base.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/ship/anaerobic_cruiser_base.png rename to core/assets/ship/cruiser/anaerobic_cruiser_base.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/ship/anaerobic_cruiser_floor.png b/core/assets/ship/cruiser/anaerobic_cruiser_floor.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/ship/anaerobic_cruiser_floor.png rename to core/assets/ship/cruiser/anaerobic_cruiser_floor.png diff --git a/core/assets/shippick_on.png b/core/assets/shippick_on.png new file mode 100644 index 0000000000000000000000000000000000000000..b9eb655ad403cc6722cc5837d34cb1c61321f333 Binary files /dev/null and b/core/assets/shippick_on.png differ diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/customizeUI/button_easy_on.png b/core/assets/shipselector/button_easy_on.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/customizeUI/button_easy_on.png rename to core/assets/shipselector/button_easy_on.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/customizeUI/button_hard_on.png b/core/assets/shipselector/button_hard_on.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/customizeUI/button_hard_on.png rename to core/assets/shipselector/button_hard_on.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/customizeUI/button_normal_on.png b/core/assets/shipselector/button_normal_on.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/customizeUI/button_normal_on.png rename to core/assets/shipselector/button_normal_on.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/customizeUI/button_typea_on.png b/core/assets/shipselector/button_typea_on.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/customizeUI/button_typea_on.png rename to core/assets/shipselector/button_typea_on.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/customizeUI/button_typeb_on.png b/core/assets/shipselector/button_typeb_on.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/customizeUI/button_typeb_on.png rename to core/assets/shipselector/button_typeb_on.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/customizeUI/button_typec_on.png b/core/assets/shipselector/button_typec_on.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/customizeUI/button_typec_on.png rename to core/assets/shipselector/button_typec_on.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/misc/crosshairs_placed.png b/core/assets/shipsys/crosshairs_placed.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/misc/crosshairs_placed.png rename to core/assets/shipsys/crosshairs_placed.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_engines_green1.png b/core/assets/shipsys/engine/enginegreen.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_engines_green1.png rename to core/assets/shipsys/engine/enginegreen.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_engines_orange1.png b/core/assets/shipsys/engine/engineorange.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_engines_orange1.png rename to core/assets/shipsys/engine/engineorange.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_engines_overlay.png b/core/assets/shipsys/engine/engineover.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_engines_overlay.png rename to core/assets/shipsys/engine/engineover.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_engines_red1.png b/core/assets/shipsys/engine/enginered.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_engines_red1.png rename to core/assets/shipsys/engine/enginered.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/effects/low_o2_stripes_1x2.png b/core/assets/shipsys/low_o2_stripes_1x2.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/effects/low_o2_stripes_1x2.png rename to core/assets/shipsys/low_o2_stripes_1x2.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/effects/low_o2_stripes_2x1.png b/core/assets/shipsys/low_o2_stripes_2x1.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/effects/low_o2_stripes_2x1.png rename to core/assets/shipsys/low_o2_stripes_2x1.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/effects/low_o2_stripes_2x2.png b/core/assets/shipsys/low_o2_stripes_2x2.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/effects/low_o2_stripes_2x2.png rename to core/assets/shipsys/low_o2_stripes_2x2.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_shields_green1.png b/core/assets/shipsys/shields/shieldsgreen.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_shields_green1.png rename to core/assets/shipsys/shields/shieldsgreen.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_shields_orange1.png b/core/assets/shipsys/shields/shieldsorange.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_shields_orange1.png rename to core/assets/shipsys/shields/shieldsorange.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_shields_overlay.png b/core/assets/shipsys/shields/shieldsover.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_shields_overlay.png rename to core/assets/shipsys/shields/shieldsover.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_shields_red1.png b/core/assets/shipsys/shields/shieldsred.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_shields_red1.png rename to core/assets/shipsys/shields/shieldsred.png diff --git a/core/assets/shipsys/weapon/desktop.ini b/core/assets/shipsys/weapon/desktop.ini new file mode 100644 index 0000000000000000000000000000000000000000..aa69d3d9a9149834715235d75ed7b4c675226f7a --- /dev/null +++ b/core/assets/shipsys/weapon/desktop.ini @@ -0,0 +1,2 @@ +[LocalizedFileNames] +box_weapons_on.png=@box_weapons_on,0 diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/box_weapons_bottom3.png b/core/assets/shipsys/weapon/generalbox.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/box_weapons_bottom3.png rename to core/assets/shipsys/weapon/generalbox.png diff --git a/core/assets/shipsys/weapon/laser.png b/core/assets/shipsys/weapon/laser.png new file mode 100644 index 0000000000000000000000000000000000000000..8668aa5ecd75452a1987b733f4ec45f1baef8936 Binary files /dev/null and b/core/assets/shipsys/weapon/laser.png differ diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/bar_weapon_minibox_glow.png b/core/assets/shipsys/weapon/minibox.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/bar_weapon_minibox_glow.png rename to core/assets/shipsys/weapon/minibox.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_weapons_overlay.png b/core/assets/shipsys/weapon/s_weapons_overlay.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_weapons_overlay.png rename to core/assets/shipsys/weapon/s_weapons_overlay.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/upgradeUI/Equipment/box_weapons_on.png b/core/assets/shipsys/weapon/smallbox.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/upgradeUI/Equipment/box_weapons_on.png rename to core/assets/shipsys/weapon/smallbox.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_weapons_green1.png b/core/assets/shipsys/weapon/weaponsgreen.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_weapons_green1.png rename to core/assets/shipsys/weapon/weaponsgreen.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_weapons_orange1.png b/core/assets/shipsys/weapon/weaponsorange.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_weapons_orange1.png rename to core/assets/shipsys/weapon/weaponsorange.png diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_weapons_red1.png b/core/assets/shipsys/weapon/weaponsred.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/icons/s_weapons_red1.png rename to core/assets/shipsys/weapon/weaponsred.png diff --git a/core/assets/shop/storeback.png b/core/assets/shop/storeback.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bc6287fe46747894d67ecaa64e94f759cd0e55 Binary files /dev/null and b/core/assets/shop/storeback.png differ diff --git a/core/assets/startgame.png b/core/assets/startgame.png new file mode 100644 index 0000000000000000000000000000000000000000..041c7f0dd1f9044c668468c1049fae1fbb69fe61 Binary files /dev/null and b/core/assets/startgame.png differ diff --git a/Ressourcen/Rainmeter-skin/resources/game_data/img/statusUI/top_ship_on.png b/core/assets/top_ship_on.png similarity index 100% rename from Ressourcen/Rainmeter-skin/resources/game_data/img/statusUI/top_ship_on.png rename to core/assets/top_ship_on.png diff --git a/core/assets/yes.png b/core/assets/yes.png new file mode 100644 index 0000000000000000000000000000000000000000..b6f8d7b869b6cc21219c28d595d195e9a392f1fd Binary files /dev/null and b/core/assets/yes.png differ diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TraderController.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TraderController.java index 443bb79babe252a25d43527ccdbe3e272a51fb27..706877335a6caa5161101d9f7c5dc0c006d0e267 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TraderController.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Controller/TraderController.java @@ -1,57 +1,256 @@ package com.galaxytrucker.galaxytruckerreloaded.Controller; +import com.badlogic.gdx.Screen; +import com.galaxytrucker.galaxytruckerreloaded.Communication.ClientControllerCommunicator; import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; +import com.galaxytrucker.galaxytruckerreloaded.Server.RequestObject; +import com.galaxytrucker.galaxytruckerreloaded.Server.RequestType; +import com.galaxytrucker.galaxytruckerreloaded.Server.ResponseObject; import lombok.*; +import java.util.List; + @Getter @Setter @RequiredArgsConstructor(access = AccessLevel.PUBLIC) public class TraderController extends Controller{ - /** My own ship */ - @NonNull - private Ship myself; + /** the trader */ @NonNull private Trader trader; + /** ClientControllerCommunicator */ + @NonNull + private ClientControllerCommunicator clientControllerCommunicator; + /** * Buy a weapon from the trader * @param weapon - the weapon to buy */ - private void purchaseWeapon(Weapon weapon) { + public boolean purchaseWeapon(Weapon weapon) { + try { + RequestObject requestObject = new RequestObject(); + requestObject.setWeapon(weapon); + requestObject.setShip(clientControllerCommunicator.getClientShip()); + requestObject.setTrader(trader); + requestObject.setRequestType(RequestType.TRADERBUYWEAPON); + ResponseObject responseObject = clientControllerCommunicator.sendRequest(requestObject); + if (responseObject.isValidRequest()) { + //remove from trader + List<Weapon> traderWeapons = trader.getWeaponStock(); + traderWeapons.remove(weapon); + trader.setWeaponStock(traderWeapons); + //add to ship + Ship ship = clientControllerCommunicator.getClientShip(); + List<Weapon> shipWeapons = ship.getInventory(); + shipWeapons.add(weapon); + ship.setInventory(shipWeapons); + ship.setCoins(ship.getCoins() - weapon.getPrice().get(weapon.getWeaponLevel())); + clientControllerCommunicator.setClientShip(ship); + return true; + } + return false; + } + catch(Exception e) { + e.printStackTrace(); + return false; + } } /** * Buy crew from a trader * @param crew - the crew to buy */ - public void purchaseCrew(Crew crew) { + public boolean purchaseCrew(Crew crew) { + try { + RequestObject requestObject = new RequestObject(); + requestObject.setRequestType(RequestType.TRADERBUYCREW); + requestObject.setTrader(trader); + requestObject.setShip(clientControllerCommunicator.getClientShip()); + requestObject.setCrew(crew); + ResponseObject responseObject = clientControllerCommunicator.sendRequest(requestObject); + if(responseObject.isValidRequest()) { + //remove from trader + List<Crew> tcrew = trader.getCrewStock(); + tcrew.remove(crew); + trader.setCrewStock(tcrew); + //put in room + Ship ship = clientControllerCommunicator.getClientShip(); + crew.setCurrentRoom(ship.getSystems().get(0)); + crew.setAssociatedUser(clientControllerCommunicator.getClientShip().getAssociatedUser()); + ship.setCoins(ship.getCoins() - crew.getPrice()); + clientControllerCommunicator.setClientShip(ship); + return true; + } + return false; + } + catch(Exception e) { + e.printStackTrace(); + return false; + } } /** * Buy rockets from the trader * @param amount - the amount of rockets to buy */ - public void purchaseRockets(int amount) { + public boolean purchaseRockets(int amount) { + try { + RequestObject requestObject = new RequestObject(); + requestObject.setRequestType(RequestType.TRADERBUYROCKETS); + requestObject.setShip(clientControllerCommunicator.getClientShip()); + requestObject.setTrader(trader); + requestObject.setIntAmount(amount); + ResponseObject responseObject = clientControllerCommunicator.sendRequest(requestObject); + if(responseObject.isValidRequest()) { + //remove from trader + int tAmount = trader.getMissileStock(); + tAmount -= amount; + trader.setMissileStock(tAmount); + //add to ship + Ship ship = clientControllerCommunicator.getClientShip(); + ship.setMissiles(ship.getMissiles() + amount); + ship.setCoins(ship.getCoins() - 5*amount); //TODO festpreis + clientControllerCommunicator.setClientShip(ship); + return true; + } + return false; + } + catch(Exception e) { + e.printStackTrace(); + return false; + } } /** * Buy fuel from the trader * @param amount - the amount of fuel to buy */ - public void purchaseFuel( int amount) { + public boolean purchaseFuel( int amount) { + try { + RequestObject requestObject = new RequestObject(); + requestObject.setShip(clientControllerCommunicator.getClientShip()); + requestObject.setTrader(trader); + requestObject.setRequestType(RequestType.TRADERBUYFUEL); + requestObject.setIntAmount(amount); + ResponseObject responseObject = clientControllerCommunicator.sendRequest(requestObject); + if(responseObject.isValidRequest()) { + //remove from trader + int tAmount = trader.getFuelStock(); + tAmount -= amount; + trader.setFuelStock(tAmount); + //add to ship + Ship ship = clientControllerCommunicator.getClientShip(); + ship.setFuel(ship.getFuel() + amount); + ship.setCoins(ship.getCoins() - 5*amount); //TODO festpreis + clientControllerCommunicator.setClientShip(ship); + return true; + } + return false; + } + catch(Exception e) { + e.printStackTrace(); + return false; + } } /** * Buy health from the trader * @param amount - the amount to buy */ - public void purchaseHP(int amount) { + public boolean purchaseHP(int amount) { + try { + RequestObject requestObject = new RequestObject(); + requestObject.setShip(clientControllerCommunicator.getClientShip()); + requestObject.setTrader(trader); + requestObject.setRequestType(RequestType.TRADERBUYHP); + requestObject.setIntAmount(amount); + ResponseObject responseObject = clientControllerCommunicator.sendRequest(requestObject); + if(responseObject.isValidRequest()) { + //remove from trader + int tAmount = trader.getHpStock(); + tAmount -= amount; + trader.setHpStock(tAmount); + //add to ship + Ship ship = clientControllerCommunicator.getClientShip(); + ship.setHp(ship.getHp() + amount); + ship.setCoins(ship.getCoins() - 5*amount); //TODO festpreis + clientControllerCommunicator.setClientShip(ship); + return true; + } + return false; + } + catch(Exception e) { + e.printStackTrace(); + return false; + } } + /** + * Sell weapon to the trader + * @param weapon the weapon + */ + public boolean sellWeapon(Weapon weapon) { + try { + RequestObject requestObject = new RequestObject(); + requestObject.setShip(clientControllerCommunicator.getClientShip()); + requestObject.setTrader(trader); + requestObject.setWeapon(weapon); + requestObject.setRequestType(RequestType.TRADERSELLWEAPON); + ResponseObject responseObject = clientControllerCommunicator.sendRequest(requestObject); + if(responseObject.isValidRequest()) { + //add to trader + List<Weapon> traderWeapon = trader.getWeaponStock(); + traderWeapon.add(weapon); + trader.setWeaponStock(traderWeapon); + //remove from ship + Ship ship = clientControllerCommunicator.getClientShip(); + List<Weapon> shipWeapon = ship.getInventory(); + shipWeapon.remove(weapon); + ship.setInventory(shipWeapon); + ship.setCoins(ship.getCoins() + weapon.getPrice().get(weapon.getWeaponLevel())); + clientControllerCommunicator.setClientShip(ship); + return true; + } + return false; + } + catch(Exception e) { + e.printStackTrace(); + return false; + } + } + /** + * sell rockets to the trader + * @param amount the amount of rockets + */ + public boolean sellRockets(int amount) { + try { + RequestObject requestObject = new RequestObject(); + requestObject.setShip(clientControllerCommunicator.getClientShip()); + requestObject.setTrader(trader); + requestObject.setRequestType(RequestType.TRADERSELLROCKETS); + requestObject.setIntAmount(amount); + ResponseObject responseObject = clientControllerCommunicator.sendRequest(requestObject); + if(responseObject.isValidRequest()) { + //add to trader + trader.setMissileStock(trader.getMissileStock() + amount); + //remove from ship + Ship ship = clientControllerCommunicator.getClientShip(); + ship.setMissiles(ship.getMissiles() - amount); + ship.setCoins(ship.getCoins() + 5*amount); + clientControllerCommunicator.setClientShip(ship); + return true; + } + return false; + } + catch(Exception e) { + e.printStackTrace(); + return false; + } + } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Main.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Main.java index ab2811cca4f59da10f3ebbf85fb7cb1937b98484..fdaeae6d6f6bfd31b01360175d2f62991013becd 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Main.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Main.java @@ -1,6 +1,7 @@ package com.galaxytrucker.galaxytruckerreloaded; import com.badlogic.gdx.ApplicationAdapter; +import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; @@ -8,7 +9,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GameStateManager; import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; -public class Main extends ApplicationAdapter { +public class Main extends Game { /** * Settings @@ -17,39 +18,27 @@ public class Main extends ApplicationAdapter { public static final int HEIGHT = 1080; public static final String TITLE = "Galaxy Trucker"; - private GameStateManager gsm; /** * Sprite batch */ - private SpriteBatch batch; - - /** - * Orthographic camera - */ - private OrthographicCamera camera; + public SpriteBatch batch; @Override public void create() { batch = new SpriteBatch(); - gsm = new GameStateManager(); - //this.camera = new OrthographicCamera(); - Gdx.gl.glClearColor(1, 0, 0, 1); - gsm.push(new MainMenu(gsm)); + + setScreen(new MainMenu(this)); } @Override public void render() { - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + /*Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); gsm.update(Gdx.graphics.getDeltaTime()); //batch.begin(); //batch.draw("1080p.png",0,0,WIDTH, HEIGHT); gsm.render(batch); - //batch.end(); - } - - @Override - public void dispose() { - + //batch.end();*/ + super.render(); } /** @@ -61,12 +50,11 @@ public class Main extends ApplicationAdapter { return this.batch; } - /** - * Get the orthographic camera - * - * @return the orthographic camera - */ - public OrthographicCamera getCamera() { - return this.camera; + public void setFullscreen() { + Gdx.graphics.setFullscreenMode(Gdx.graphics.getDisplayMode()); + } + + public void setWindowed() { + Gdx.graphics.setWindowedMode(WIDTH,HEIGHT); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Crew/Crew.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Crew/Crew.java index ebc56560effbe0dfd67209f9e10464102a0c10e0..d7dfc054894f3d7a3211a0afbf0e04c37de4a595 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Crew/Crew.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Crew/Crew.java @@ -53,6 +53,11 @@ public class Crew implements Serializable { @OneToOne private Room currentRoom; + /** + * The price of the different crew-members + */ + private int price; + /** * The user who owns this crew member */ diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Planet.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Planet.java index f7a276bd2fc5b3553175a20a49b59848f98e6a74..cf54603a0dab7aedc70183b756a67468b9f9a1b4 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Planet.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Planet.java @@ -43,7 +43,7 @@ public class Planet implements Serializable { * Ereignis dass auf diesem Planeten eintrifft */ @NonNull - private Enum<PlanetEvent> event; + private PlanetEvent event; /** * If already discovered set to true diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Trader.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Trader.java index fce3efc8cc281041e6a3a50cde3d04271ddf2107..e58c4c847459df7fb9b285c863a04deeaf7b7206 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Trader.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Map/Trader.java @@ -37,6 +37,10 @@ public class Trader implements Serializable { @NonNull private int fuelStock; + /** HP for sale */ + @NonNull + private int hpStock; + /** Crew for sale */ @OneToMany (cascade = CascadeType.ALL) @NonNull diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Weapons/Weapon.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Weapons/Weapon.java index d251c9bea88ff51205963a0c5d45afb31e044fe9..6a750208be1ba0157591797ba1afec3a61370509 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Weapons/Weapon.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Model/Weapons/Weapon.java @@ -5,6 +5,7 @@ import lombok.*; import javax.persistence.*; import java.io.Serializable; +import java.util.List; @Getter @@ -83,6 +84,12 @@ public abstract class Weapon implements Serializable { @NonNull private int burst; + /** + * Weapon price, sorted by Weapon-level 1-6 + */ + @ElementCollection + private List<Integer> price; + /** Weapon system this weapon belongs to */ @OneToOne private System weaponSystem; diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java index f9913f0b72cfbf4b4e85040f9163a39d37fd65a3..63ce21a283505c21f9f606f619c48de05214e1a2 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java @@ -80,7 +80,7 @@ public class ClientHandler implements Runnable { /** * Planet name list */ - private List<String> planetNames; + private List<String> planetNames = new ArrayList<>(); /** * Used planet names list diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java index fd8164b1d5c2d504ed5d7bcc8e98f0aa90c0cf6c..5d900d63f65287c81d5ae28478d47148e9feda38 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java @@ -5,6 +5,7 @@ import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room; +import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; import lombok.Getter; import lombok.Setter; @@ -38,10 +39,16 @@ public class RequestObject { /** Room */ private Room room; + /** Weapon */ + private Weapon weapon; /** Heal amount */ private int healAmount; /** Damage amount */ private int damageAmount; + /** int - eg fuel, rockets, hp for trader */ + private int intAmount; + + } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java index 90458beeb834acfa4bc2b93dab91b5754e44fa74..807283e4c025a9c9ae9e4d732e97d715481c9698 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java @@ -2,5 +2,5 @@ package com.galaxytrucker.galaxytruckerreloaded.Server; /** Type of request sent to the server */ public enum RequestType { - LOGOUT, HYPERJUMP, MoveCrew, HealCrew, HealCrewInRoom, DamageCrew, FixSystems, RepairBreach + LOGOUT, HYPERJUMP, TRADERBUYWEAPON, TRADERBUYFUEL, TRADERBUYROCKETS, TRADERBUYCREW, TRADERBUYHP, TRADERSELLROCKETS, TRADERSELLWEAPON, MoveCrew, HealCrew, HealCrewInRoom, DamageCrew, FixSystems, RepairBreach } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java index c3c01d46db3cac1db6d5c43411d700f6a73be623..af0c651a0b51e823f5b48162adcafe79c5a7b150 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java @@ -1,10 +1,14 @@ package com.galaxytrucker.galaxytruckerreloaded.Server; +import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import com.galaxytrucker.galaxytruckerreloaded.Model.User; +import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; import com.galaxytrucker.galaxytruckerreloaded.Server.Exception.UserNotFoundException; +import com.galaxytrucker.galaxytruckerreloaded.Server.Services.TraderService; import com.galaxytrucker.galaxytruckerreloaded.Server.Services.TravelService; import com.galaxytrucker.galaxytruckerreloaded.Server.Services.UserService; import lombok.AccessLevel; @@ -25,6 +29,9 @@ public class ServerServiceCommunicator { /** TravelService */ private TravelService travelService = new TravelService(); + /** TraderService */ + private TraderService traderService = new TraderService(); + /** Take a request from the client side, pass it through the services * and return a response * @return the server's response to the client's request */ @@ -35,6 +42,20 @@ public class ServerServiceCommunicator { case HYPERJUMP: return jump(request.getShip(),request.getPlanet()); //TODO OTHERS + case TRADERBUYCREW: + return purchaseCrew(request.getShip(), request.getTrader(), request.getCrew()); + case TRADERBUYFUEL: + return purchaseFuel(request.getShip(), request.getTrader(), request.getIntAmount()); + case TRADERBUYWEAPON: + return purchaseWeapon(request.getShip(), request.getTrader(), request.getWeapon()); + case TRADERBUYHP: + return purchaseHP(request.getShip(), request.getTrader(), request.getIntAmount()); + case TRADERBUYROCKETS: + return purchaseRockets(request.getShip(), request.getTrader(), request.getIntAmount()); + case TRADERSELLROCKETS: + return sellRockets(request.getShip(), request.getTrader(), request.getIntAmount()); + case TRADERSELLWEAPON: + return sellWeapons(request.getShip(), request.getTrader(), request.getWeapon()); } return null; } @@ -123,6 +144,166 @@ public class ServerServiceCommunicator { return responseObject; } + // ==================================== TRADER SERVICE ==================================== + + /** + * purchase a weapon from a trader + * @param ship the ship that buys + * @param trader the trader that sells + * @param weapon the weapon that is bought + * @return a ResponseObject + */ + private ResponseObject purchaseWeapon(Ship ship, Trader trader, Weapon weapon) { + ResponseObject responseObject = new ResponseObject(); + try { + if(traderService.validatePurchase(ship, weapon.getPrice().get(weapon.getWeaponLevel()))) { + boolean successfulPurchase = traderService.purchaseWeapon(ship, trader, weapon); + if (successfulPurchase) { + responseObject.setValidRequest(true); + } + } + } + catch(Exception e) { + e.printStackTrace(); + } + return responseObject; + } + + /** + * purchase a crew member from a trader + * @param ship the ship that buys + * @param trader the trader that sells + * @param crew the crew member that is bought + * @return a ResponseObject + */ + private ResponseObject purchaseCrew(Ship ship, Trader trader, Crew crew) { + ResponseObject responseObject = new ResponseObject(); + try { + if(traderService.validatePurchase(ship, crew.getPrice())) { + boolean successfulPurchase = traderService.purchaseCrew(ship, trader, crew); + if (successfulPurchase) { + responseObject.setValidRequest(true); + } + } + } + catch(Exception e) { + e.printStackTrace(); + } + return responseObject; + } + + /** + * purchase rockets from a trader + * @param ship the ship that buys + * @param trader the trader that sells + * @param amount the amount of rockets that are bought + * @return a ResponseObject + */ + private ResponseObject purchaseRockets(Ship ship, Trader trader, int amount) { + ResponseObject responseObject = new ResponseObject(); + try { + if(traderService.validatePurchase(ship, 5*amount)) { //TODO festpreis + boolean successfulPurchase = traderService.purchaseRockets(ship, trader, amount); + if (successfulPurchase) { + responseObject.setValidRequest(true); + } + } + } + catch(Exception e) { + e.printStackTrace(); + } + return responseObject; + } + + /** + * purchase fuel from a trader + * @param ship the ship that buys + * @param trader the trader that sells + * @param amount the amount of fuel that is bought + * @return a ResponseObject + */ + private ResponseObject purchaseFuel(Ship ship, Trader trader, int amount) { + ResponseObject responseObject = new ResponseObject(); + try { + if(traderService.validatePurchase(ship, 5*amount)) { //TODO festpreis + boolean successfulPurchase = traderService.purchaseFuel(ship, trader, amount); + if (successfulPurchase) { + responseObject.setValidRequest(true); + } + } + } + catch(Exception e) { + e.printStackTrace(); + } + return responseObject; + } + + /** + * purchase HP from a trader + * @param ship the ship that buys + * @param trader the trader that sells + * @param amount the amount of hp that is bought + * @return a ResponseObject + */ + private ResponseObject purchaseHP(Ship ship, Trader trader, int amount) { + ResponseObject responseObject = new ResponseObject(); + try { + if(traderService.validatePurchase(ship, 5*amount)) { //TODO festpreis + boolean successfulPurchase = traderService.purchaseHP(ship, trader, amount); + if (successfulPurchase) { + responseObject.setValidRequest(true); + } + } + } + catch(Exception e) { + e.printStackTrace(); + } + return responseObject; + } + + /** + * sell weapons to a trader + * @param ship the ship that sells + * @param trader the trader that buys + * @param weapon the weapon that is sold + * @return a ResponseObject + */ + private ResponseObject sellWeapons(Ship ship, Trader trader, Weapon weapon) { + ResponseObject responseObject = new ResponseObject(); + try { + boolean successfulPurchase = traderService.sellWeapon(ship, trader, weapon); + if (successfulPurchase) { + responseObject.setValidRequest(true); + } + } + catch(Exception e) { + e.printStackTrace(); + } + return responseObject; + } + + /** + * sell rockets to a trader + * @param ship the ship that sells + * @param trader the trader that buys + * @param amount the amount of rockets that is sold + * @return a ResponseObject + */ + private ResponseObject sellRockets(Ship ship, Trader trader, int amount) { + ResponseObject responseObject = new ResponseObject(); + try { + boolean successfulPurchase = traderService.sellRockets(ship, trader, amount); + if (successfulPurchase) { + responseObject.setValidRequest(true); + } + + } + catch(Exception e) { + e.printStackTrace(); + } + return responseObject; + } + // ======================================================================================== /** Get instance */ diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TraderService.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TraderService.java index 4fec03b002bb7445217d6cb35cb635a088a79e64..b6f34195bbca401e6aedfe3b9247f578c9c74263 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TraderService.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Services/TraderService.java @@ -1,8 +1,6 @@ package com.galaxytrucker.galaxytruckerreloaded.Server.Services; -import com.badlogic.gdx.scenes.scene2d.ui.List; import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; -import com.galaxytrucker.galaxytruckerreloaded.Model.Map.PlanetEvent; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; @@ -12,6 +10,8 @@ import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.TraderDAO; import com.galaxytrucker.galaxytruckerreloaded.Server.Persistence.WeaponDAO; import lombok.*; +import java.util.List; + @Getter @Setter @RequiredArgsConstructor(access = AccessLevel.PUBLIC) @@ -21,19 +21,25 @@ public class TraderService extends PlanetEventService { * Trader DAO */ @NonNull - private TraderDAO traderDAO; + private TraderDAO traderDAO = new TraderDAO(); /** * WeaponDAO */ @NonNull - private WeaponDAO weaponDAO; + private WeaponDAO weaponDAO = new WeaponDAO(); /** * CrewDAO */ @NonNull - private CrewDAO crewDAO; + private CrewDAO crewDAO = new CrewDAO(); + + /** + * ship DAO + */ + @NonNull + private ShipDAO shipDAO = new ShipDAO(); /** * Validate purchase by checking if the client has enough money @@ -43,7 +49,7 @@ public class TraderService extends PlanetEventService { * @return true if the ship has enough money else false */ public boolean validatePurchase(Ship ship, int price) { - return false; + return ship.getCoins() >= price; } /** @@ -53,8 +59,45 @@ public class TraderService extends PlanetEventService { * @param trader - the trader to buy the weapon from * @param weapon - the weapon to buy */ - private void purchaseWeapon(Ship ship, Trader trader, Weapon weapon) { - + public boolean purchaseWeapon(Ship ship, Trader trader, Weapon weapon) { + try { + List<Weapon> traderWeapons = trader.getWeaponStock(); + List<Weapon> shipWeapons = ship.getInventory(); + int shipCoins = ship.getCoins(); + try { + //remove weapon from trader + traderWeapons.remove(weapon); + trader.setWeaponStock(traderWeapons); + traderDAO.update(trader); + //add weapon to ship + shipWeapons.add(weapon); + ship.setInventory(shipWeapons); + ship.setCoins(shipCoins - weapon.getPrice().get(weapon.getWeaponLevel())); + shipDAO.update(ship); + //muss was an weapon ge盲ndert werden?? + return true; + } catch (Exception e) { //exception in daos + e.printStackTrace(); + //revert changes + try { + //revert trader changes + trader.setWeaponStock(traderWeapons); + traderDAO.update(trader); + //revert ship inventory changes + ship.setInventory(shipWeapons); + ship.setCoins(shipCoins); + shipDAO.update(ship); + //was an weapon? + } catch (Exception f) { //exception in daos + f.printStackTrace(); + } + return false; + } + } + catch(Exception g) { //nullpointer + g.printStackTrace(); + return false; + } } /** @@ -64,7 +107,48 @@ public class TraderService extends PlanetEventService { * @param trader - the trader to buy from * @param crew - the crew to buy */ - public void purchaseCrew(Ship ship, Trader trader, Crew crew) { + public boolean purchaseCrew(Ship ship, Trader trader, Crew crew) { + try { + List<Crew> traderCrew = trader.getCrewStock(); + int shipCoins = ship.getCoins(); + String user = crew.getAssociatedUser(); + try { + //remove from trader + traderCrew.remove(crew); + trader.setCrewStock(traderCrew); + traderDAO.update(trader); + //add to ship + ship.setCoins(shipCoins - crew.getPrice()); + //List<Crew> shipCrew = ship. TODO wie crew von schiff? + //set current Room + crew.setCurrentRoom(ship.getSystems().get(0)); //TODO in welchen raum setzen? + crew.setAssociatedUser(ship.getAssociatedUser()); + crewDAO.update(crew); + return true; + } catch (Exception e) { //exception in daos + e.printStackTrace(); + //revert changes + try { + //add to trader + trader.setCrewStock(traderCrew); + traderDAO.update(trader); + //set current Room + crew.setCurrentRoom(null); //TODO ? + crew.setAssociatedUser(user); + crewDAO.update(crew); + //remove from ship? + ship.setCoins(shipCoins); + shipDAO.update(ship); + } catch (Exception f) { //exception in daos + f.printStackTrace(); + } + return false; + } + } + catch(Exception g) { //nullpointer + g.printStackTrace(); + return false; + } } /** @@ -74,8 +158,46 @@ public class TraderService extends PlanetEventService { * @param trader - the trader to buy from * @param amount - the amount of rockets to buy */ - public void purchaseRockets(Ship ship, Trader trader, int amount) { - + public boolean purchaseRockets(Ship ship, Trader trader, int amount) { + try { + int traderAmount = trader.getMissileStock(); + int shipAmount = ship.getMissiles(); + int shipCoins = ship.getCoins(); + try { + //remove from trader + if (traderAmount < amount) { + return false; + } + traderAmount -= amount; + trader.setMissileStock(traderAmount); + traderDAO.update(trader); + //add to ship + shipAmount += amount; + ship.setMissiles(shipAmount); + ship.setCoins(shipCoins - 5*amount); //TODO was f眉r einen festpreis? + shipDAO.update(ship); + return true; + } catch (Exception e) { //exception in daos + e.printStackTrace(); + try { + //undo + //add to trader + trader.setMissileStock(traderAmount); + traderDAO.update(trader); + //remove from ship + ship.setMissiles(shipAmount); + ship.setCoins(shipCoins); + shipDAO.update(ship); + } catch (Exception f) { //exception in daos + f.printStackTrace(); + } + return false; + } + } + catch(Exception g) { //nullpointer + g.printStackTrace(); + return false; + } } /** @@ -85,7 +207,46 @@ public class TraderService extends PlanetEventService { * @param trader - the trader to buy from * @param amount - the amount of fuel to buy */ - public void purchaseFuel(Ship ship, Trader trader, int amount) { + public boolean purchaseFuel(Ship ship, Trader trader, int amount) { + try { + int traderAmount = trader.getFuelStock(); + int shipAmount = ship.getFuel(); + int shipCoins = ship.getCoins(); + try { + //remove from trader + if (traderAmount < amount) { + return false; + } + traderAmount -= amount; + trader.setFuelStock(traderAmount); + traderDAO.update(trader); + //add to ship + shipAmount += amount; + ship.setFuel(shipAmount); + ship.setCoins(shipCoins - 5*amount); //TODO was f眉r ein festpreis? + shipDAO.update(ship); + return true; + } catch (Exception e) { //exception in daos + e.printStackTrace(); + try { + //undo + //add to trader + trader.setFuelStock(traderAmount); + traderDAO.update(trader); + //remove from ship + ship.setFuel(shipAmount); + ship.setCoins(shipCoins); + shipDAO.update(ship); + } catch (Exception f) { //exception in daos + f.printStackTrace(); + } + return false; + } + } + catch(Exception g) { //nullpointer + g.printStackTrace(); + return false; + } } /** @@ -95,8 +256,44 @@ public class TraderService extends PlanetEventService { * @param trader - the trader to buy from * @param amount - the amount to buy */ - public void purchaseHP(Ship ship, Trader trader, int amount) { + public boolean purchaseHP(Ship ship, Trader trader, int amount) { + try { + int traderAmount = trader.getHpStock(); + int shipAmount = ship.getHp(); + int coins = ship.getCoins(); + try { + //remove from trader + if (traderAmount < amount) { + return false; + } + traderAmount -= amount; + trader.setHpStock(traderAmount); + traderDAO.update(trader); + //add to ship + shipAmount += amount; + ship.setHp(shipAmount); + ship.setCoins(coins - 5*amount); //TODO festpreis? + shipDAO.update(ship); + return true; + } catch (Exception e) { //exception in daos + e.printStackTrace(); + try { + ship.setHp(shipAmount); + ship.setCoins(coins); + shipDAO.update(ship); + trader.setHpStock(traderAmount); + traderDAO.update(trader); + } catch (Exception f) { //exception in daos + f.printStackTrace(); + } + return false; + } + } + catch(Exception g) { // Nullpointer + g.printStackTrace(); + return false; + } } /** @@ -106,8 +303,41 @@ public class TraderService extends PlanetEventService { * @param trader - the trader to sell the weapons to * @param weapon - the weapon to sell */ - public void sellWeapon(Ship ship, Trader trader, Weapon weapon) { - + public boolean sellWeapon(Ship ship, Trader trader, Weapon weapon) { + try { + List<Weapon> traderWeapon = trader.getWeaponStock(); + List<Weapon> shipWeapon = ship.getInventory(); + int shipCoins = ship.getCoins(); + try { + //add to trader + traderWeapon.add(weapon); + trader.setWeaponStock(traderWeapon); + traderDAO.update(trader); + //remove from ship + shipWeapon.remove(weapon); + ship.setInventory(shipWeapon); + ship.setCoins(shipCoins + weapon.getPrice().get(weapon.getWeaponLevel())); + shipDAO.update(ship); + return true; + } catch (Exception e) { // exception in daos + e.printStackTrace(); + try { + //undo + trader.setWeaponStock(traderWeapon); + traderDAO.update(trader); + ship.setInventory(shipWeapon); + ship.setCoins(shipCoins); + shipDAO.update(ship); + } catch (Exception f) { //exception in daos + f.printStackTrace(); + } + return false; + } + } + catch(Exception g) { //nullpointer + g.printStackTrace(); + return false; + } } /** @@ -117,7 +347,43 @@ public class TraderService extends PlanetEventService { * @param trader - the trader to sell the rockets to * @param amount - the amount of rockets to sell */ - public void sellRockets(Ship ship, Trader trader, int amount) { - + public boolean sellRockets(Ship ship, Trader trader, int amount) { + try { + int traderAmount = trader.getMissileStock(); + int shipAmount = ship.getMissiles(); + int shipCoins = ship.getCoins(); + try { + //add to trader + traderAmount += amount; + trader.setMissileStock(traderAmount); + traderDAO.update(trader); + //remove from ship + if (shipAmount < amount) { + return false; + } + shipAmount -= amount; + ship.setMissiles(shipAmount); + ship.setCoins(ship.getCoins() + 5*amount); //TODO festpreis? + shipDAO.update(ship); + return true; + } catch (Exception e) { //exception in daos + e.printStackTrace(); + try { + //undo + trader.setMissileStock(traderAmount); + traderDAO.update(trader); + ship.setMissiles(shipAmount); + ship.setCoins(shipCoins); + shipDAO.update(ship); + } catch (Exception f) { //exception in daos + f.printStackTrace(); + } + return false; + } + } + catch(Exception g) { //nullpointer + g.printStackTrace(); + return false; + } } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/TraderDAOTest.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/TraderDAOTest.java index 104dff2ed20649115d7e865501289b83282d151e..96f9383049cdd626a2b4616638f1510cc00fb544 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/TraderDAOTest.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Test/Server/Persistence/TraderDAOTest.java @@ -39,7 +39,7 @@ public class TraderDAOTest { @Test public void testPersist() { Trader trader = new Trader(UUID.randomUUID().hashCode(), new Planet(UUID.randomUUID().hashCode(),planetNameGenerator(), 10, 10, - PlanetEvent.SHOP, new ArrayList<Ship>()), new ArrayList<Weapon>(), 0, 0, new ArrayList<Crew>()); + PlanetEvent.SHOP, new ArrayList<Ship>()), new ArrayList<Weapon>(), 0, 0, 0, new ArrayList<Crew>()); try { traderDAO.persist(trader); entityManager.getTransaction().begin(); @@ -58,7 +58,7 @@ public class TraderDAOTest { @Test public void testEdit() { Trader trader = new Trader(UUID.randomUUID().hashCode(), new Planet(UUID.randomUUID().hashCode(),planetNameGenerator(), 10, 10, - PlanetEvent.SHOP, new ArrayList<Ship>()), new ArrayList<Weapon>(), 0, 0, new ArrayList<Crew>()); + PlanetEvent.SHOP, new ArrayList<Ship>()), new ArrayList<Weapon>(), 0, 0, 0, new ArrayList<Crew>()); try { traderDAO.persist(trader); entityManager.getTransaction().begin(); @@ -79,7 +79,7 @@ public class TraderDAOTest { @Test public void testRemove() { Trader trader = new Trader(UUID.randomUUID().hashCode(), new Planet(UUID.randomUUID().hashCode(),planetNameGenerator(), 10, 10, - PlanetEvent.SHOP, new ArrayList<Ship>()), new ArrayList<Weapon>(), 0, 0, new ArrayList<Crew>()); + PlanetEvent.SHOP, new ArrayList<Ship>()), new ArrayList<Weapon>(), 0, 0, 0, new ArrayList<Crew>()); try { traderDAO.persist(trader); traderDAO.remove(trader); diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/ImButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/ImButton.java new file mode 100644 index 0000000000000000000000000000000000000000..9aad9ba88f48e5fff19b8e91c44b30d903aa833d --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/ImButton.java @@ -0,0 +1,19 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.Event; +import com.badlogic.gdx.scenes.scene2d.EventListener; +import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; + +public abstract class ImButton extends ImageButton { + + public ImButton(Texture texture, float x, float y, float width, float height) { + super(new TextureRegionDrawable(new TextureRegion(texture))); + setPosition(x, y); + setSize(width, height); + } + + public abstract void leftClick(); +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/AutofireButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/AutofireButton.java index 9fed8d8816a738e917a0d9170abbb1ad2f4e29a7..e82534723f69f9acd0fb8879204488c0123e59c4 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/AutofireButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/AutofireButton.java @@ -6,35 +6,24 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView; /** * Button to activate Autofire-Function during fights */ -public class AutofireButton extends Button +public class AutofireButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ private Sound clickSound; - boolean down = false; - /** * the ui this button is on */ @@ -43,27 +32,21 @@ public class AutofireButton extends Button /** * Constructor * - * @param main - main class * @param ui the ui this button is on */ - public AutofireButton(Main main, ShipView ui) { - -// /** -// * Send data to server -// */ -// private void sendData(Packet data) { -// } -// -// /** -// * Receive data from server -// */ -// private Packet receiveData() { -// return null; + public AutofireButton(float x, float y, float width, float height, ShipView ui) { + super(new Texture("autofire_on.png"), x, y, width, height); + this.ui = ui; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } public void leftClick() { - down = !down; + //ui.autofire(); } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ContinueButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ContinueButton.java index 9cd99f2b65079657c5b852ecd87c4cea0a10702a..d1017a4342c448a8e2aba94d6335717d76398e7e 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ContinueButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ContinueButton.java @@ -1,56 +1,46 @@ package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons; import com.badlogic.gdx.audio.Sound; -import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.galaxytrucker.galaxytruckerreloaded.Main; -import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; -import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionsUI; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.PauseMenuUI; /** * continue button for ingame options */ -public class ContinueButton extends Button { +public class ContinueButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ private Sound clickSound; - boolean down = false; - /** * the options ui this button is on */ - private OptionsUI ui; + private PauseMenuUI ui; /** * Left-Click action of the Button. */ - @Override public void leftClick() { + ui.disposePauseMenuUI(); } /** * constructor - * @param main the main class * @param ui the ui this is on */ - public ContinueButton(Main main, OptionsUI ui) { - + public ContinueButton(float x, float y, float width, float height, PauseMenuUI ui) { + super(new Texture("ingame_continue.png"), x, y, width, height); + this.ui = ui; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CreateGameButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CreateGameButton.java new file mode 100644 index 0000000000000000000000000000000000000000..79cb4deab0c7ec40d45dc944454e4e08fd1b3a09 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CreateGameButton.java @@ -0,0 +1,30 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.ShipSelector; + +public class CreateGameButton extends ImButton { + + private Sound clickSound; + + private ShipSelector screen; + + @Override + public void leftClick() { + screen.startGame(); + } + + public CreateGameButton(float x, float y, float width, float height, ShipSelector screen) { + super(new Texture("startgame.png"), x, y, width, height); + this.screen = screen; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewDismissButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewDismissButton.java index a139d6e0b1fd29f5f967f1ae910951adb5f88b83..df0ca86366ef80273ff45e064bb63b2f050aeff6 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewDismissButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/CrewDismissButton.java @@ -4,24 +4,19 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation.CrewUI; /** * Button for dismissing a Crew Member */ -public class CrewDismissButton extends Button +public class CrewDismissButton extends ImButton { - - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; /** * Background */ @@ -33,18 +28,30 @@ public class CrewDismissButton extends Button private int crewID; + /** + * the ui with this button + */ + private CrewUI ui; + /** * Constructor * - * @param main - main class * @param crew the crew member */ - public CrewDismissButton(Main main, int crew) { + public CrewDismissButton(Texture texture, float x, float y, float width, float height, int crew, CrewUI ui) { + super(texture, x, y, width, height); + this.crewID = crew; + this.ui = ui; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } public void leftClick() { - // dismiss crew + ui.crewMoving(); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/EventPageButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/EventPageButton.java index 26b091b1455ff05f553dec22aad5ac170bc95f64..d80e0379a48dce58635945aa3d6734fa0be2b239 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/EventPageButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/EventPageButton.java @@ -4,31 +4,20 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.UI.Events.EventGUI; -public class EventPageButton extends Button { +public class EventPageButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ private Sound clickSound; - boolean down = false; - /** * the ui the button is on */ @@ -37,16 +26,23 @@ public class EventPageButton extends Button { /** * what happens when there is a left click on the button */ - public void leftClick() {down=!down;} + public void leftClick() { + eventgui.nextPage(); + } /** * constructor * - * @param main the main class - * * @param eventgui the ui the button is on */ - public EventPageButton(Main main, EventGUI eventgui) { + public EventPageButton(float x, float y, float width, float height, EventGUI eventgui) { + super(new Texture("continue_on.png"), x, y, width, height); + this.eventgui = eventgui; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/InventoryCloseButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/InventoryCloseButton.java index 060093f947eff44c7799ab44c7dbc4150547fdaa..dbd1aa5f4932cdf359c00c630ca00f7674968e65 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/InventoryCloseButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/InventoryCloseButton.java @@ -4,35 +4,24 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.UI.Events.ShopUI; import com.galaxytrucker.galaxytruckerreloaded.View.UI.Inventory.InventoryUI; /** * used to close the inventory */ -public class InventoryCloseButton extends Button { +public class InventoryCloseButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ private Sound clickSound; - boolean down = false; - /** * shop ui, if button on shop * otherwise null @@ -50,16 +39,27 @@ public class InventoryCloseButton extends Button { */ @Override public void leftClick() { + if(shop != null) { + } + else if(inventory != null) { + inventory.disposeInventoryUI(); + } } /** * constructor - * @param main the main class * @param ui the shop ui this is on, or null * @param inventory the inventory ui this is on, or null */ - public InventoryCloseButton(Main main, ShopUI ui, InventoryUI inventory) { - + public InventoryCloseButton(float x, float y, float width, float height, ShopUI ui, InventoryUI inventory) { + super(new Texture("close_on.png"), x, y, width, height); + shop = ui; + this.inventory = inventory; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MainMenuButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MainMenuButton.java index 862c0eec5fa736ce06135f39d9c806c5de81e564..e17a65014d733b58e47683b197aaa4ebc4b762f2 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MainMenuButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MainMenuButton.java @@ -4,48 +4,43 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; import com.galaxytrucker.galaxytruckerreloaded.View.UI.Events.GameOver; /*** * button used to return to the main menu */ -public class MainMenuButton extends Button { - - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; +public class MainMenuButton extends ImButton { /** * Click sound effect */ private Sound clickSound; - boolean down = false; - + private Main main; /** * Left-Click action of the Button. opens the main menu screen */ @Override public void leftClick() { - + main.setScreen(new MainMenu(main)); } /** * constructor - * @param main the main class */ - public MainMenuButton(Main main) { - + public MainMenuButton(float x, float y, float width, float height, Main main) { + super(new Texture("control/mainmenu.png"), x, y, width, height); + this.main = main; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MapButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MapButton.java new file mode 100644 index 0000000000000000000000000000000000000000..37a35a40dd7061606c5f2977c528c39c77572b58 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MapButton.java @@ -0,0 +1,58 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Map.MapUI; + +/** + * button representing one planet on the map + */ +public class MapButton extends ImButton { + + /** + * planet + */ + private Planet planet; + + /** + * the ui this is on + */ + private MapUI ui; + + /** + * the sound when clicked + */ + private Sound clickSound; + + /** + * constructor + * @param texture texture of button + * @param x x pos of button + * @param y y pos of button + * @param width width of button + * @param height height of button + */ + public MapButton(Texture texture, float x, float y, float width, float height, MapUI ui, Planet planet) { + super(texture, x, y, width, height); + this.ui = ui; + this.planet = planet; + + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + /** + * what happens on left click (method in UI) + */ + @Override + public void leftClick() { + ui.moveToPlanet(planet); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MoveButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MoveButton.java index 3b62e99ea33aa219378a9a2a7094fabdd58be03d..63ea2a560c533359f8a272d58e2abb41ff12f4a0 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MoveButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/MoveButton.java @@ -4,34 +4,23 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView; /** * button used to move the ship. upper middle corner, opens the map */ -public class MoveButton extends Button { +public class MoveButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ private Sound clickSound; - boolean down = false; - /** * the ui this button is on */ @@ -42,15 +31,20 @@ public class MoveButton extends Button { */ @Override public void leftClick() { - + ui.openMap(); } /** * constructor - * @param main the main class * @param ui the ui this button is on */ - public MoveButton(Main main, ShipView ui) { - + public MoveButton(float x, float y, float width, float height, ShipView ui) { + super(new Texture("FTL_JUMP.png"), x, y, width, height); + this.ui = ui; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButton.java new file mode 100644 index 0000000000000000000000000000000000000000..cc615218fdfdd78086e9633194fd58450f137363 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButton.java @@ -0,0 +1,52 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.PauseMenu; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.PauseMenuUI; + +/** + * creates a new OptionButton + */ +public class OptionButton extends ImButton{ + + /** + * Click sound effect + */ + private Sound clickSound; + + private PauseMenuUI pauseMenuUI; + + /** Menu object */ + private MainMenu mainMenu; + + /** + * Constructor + * + */ + public OptionButton(float x, float y, float width, float height, PauseMenuUI ui) { + super(new Texture("escape_options_on.png"), x, y, width, height); + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + this.pauseMenuUI = ui; + } + + /** + * Creats new Game + */ + public void leftClick() + { + pauseMenuUI.openOptions(); + } + +} + + diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Audio/AudioButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Audio/AudioButton.java new file mode 100644 index 0000000000000000000000000000000000000000..842a80daf8b39da39c9b35749d3930eebd405ef5 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Audio/AudioButton.java @@ -0,0 +1,33 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Audio; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.PauseMenuUI; + +public class AudioButton extends ImButton { + + private Sound clickSound; + + private OptionUI optionUI; + + private PauseMenuUI pauseMenuUI; + + public AudioButton(float x, float y, float width, float height, OptionUI optionUI) { + super(new Texture("options/escape_audio_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + @Override + public void leftClick() { + optionUI.openAudio(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Audio/BackButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Audio/BackButton.java new file mode 100644 index 0000000000000000000000000000000000000000..e5edb932cc8429b7af38fa37182f4b597c0b79fc --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Audio/BackButton.java @@ -0,0 +1,36 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Audio; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.AudioUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.GeneralUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionUI; + +public class BackButton extends ImButton { + + private Sound clickSound; + + private OptionUI optionUI; + + private AudioUI audioUI; + + public BackButton(float x, float y, float width, float height, OptionUI optionUI, AudioUI audioUI) { + super(new Texture("options/escape_back_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.audioUI = audioUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + @Override + public void leftClick() { + // Einkommentieren wenn disposeAudioUI implementiert// audioUI.disposeAudioUI(); + optionUI.showOptionsUI(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Control/BackButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Control/BackButton.java new file mode 100644 index 0000000000000000000000000000000000000000..56b0db55204858fa50468c86bb30425ecd02c3e5 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Control/BackButton.java @@ -0,0 +1,36 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Control; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.ControlUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.GeneralUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionUI; + +public class BackButton extends ImButton { + + private Sound clickSound; + + private OptionUI optionUI; + + private ControlUI controlUI; + + public BackButton(float x, float y, float width, float height, OptionUI optionUI, ControlUI controlUI) { + super(new Texture("options/escape_back_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.controlUI = controlUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + @Override + public void leftClick() { + // Einkommentieren wenn disposeControlUI implementiert// controlUI.disposeControlUI(); + optionUI.showOptionsUI(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Control/ControlButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Control/ControlButton.java new file mode 100644 index 0000000000000000000000000000000000000000..43f0e9d542e0349062c5808cff838443f608b3a3 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Control/ControlButton.java @@ -0,0 +1,33 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Control; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.PauseMenuUI; + +public class ControlButton extends ImButton { + + private Sound clickSound; + + private OptionUI optionUI; + + private PauseMenuUI pauseMenuUI; + + public ControlButton(float x, float y, float width, float height, OptionUI optionUI) { + super(new Texture("options/escape_control_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + @Override + public void leftClick() { + optionUI.openControl(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Credits/BackButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Credits/BackButton.java new file mode 100644 index 0000000000000000000000000000000000000000..49b4eaac577a75b8cef0ab9f47569936b44d5842 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Credits/BackButton.java @@ -0,0 +1,36 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Credits; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.CreditsUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.GeneralUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionUI; + +public class BackButton extends ImButton { + + private Sound clickSound; + + private OptionUI optionUI; + + private CreditsUI creditsUI; + + public BackButton(float x, float y, float width, float height, OptionUI optionUI, CreditsUI creditsUI) { + super(new Texture("options/escape_back_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.creditsUI = creditsUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + @Override + public void leftClick() { + // Einkommentieren wenn disposeCreditsUI implementiert// creditsUI.disposeCreditsUI(); + optionUI.showOptionsUI(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Credits/CreditsButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Credits/CreditsButton.java new file mode 100644 index 0000000000000000000000000000000000000000..23bb46ae69fea136fe9f903f2f085d3408824ed3 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Credits/CreditsButton.java @@ -0,0 +1,33 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Credits; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.PauseMenuUI; + +public class CreditsButton extends ImButton { + + private Sound clickSound; + + private OptionUI optionUI; + + private PauseMenuUI pauseMenuUI; + + public CreditsButton(float x, float y, float width, float height, OptionUI optionUI) { + super(new Texture("options/escape_credits_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + @Override + public void leftClick() { + optionUI.openCredits(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/General/BackButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/General/BackButton.java new file mode 100644 index 0000000000000000000000000000000000000000..8a7a4f5e9e472b617dad00a1d10104700c2156ff --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/General/BackButton.java @@ -0,0 +1,91 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.General; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.*; + +public class BackButton extends ImButton { + + private Sound clickSound; + + private OptionUI optionUI; + + private ControlUI controlUI; + + private CreditsUI creditUI; + + private GeneralUI generalUI; + + private VideoUI videoUI; + + private AudioUI audioUI; + + public BackButton(float x, float y, float width, float height, OptionUI optionUI, ControlUI controlUI) { + super(new Texture("options/escape_back_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.controlUI = controlUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + public BackButton(float x, float y, float width, float height, OptionUI optionUI, CreditsUI creditsUI) { + super(new Texture("options/escape_back_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.creditUI = creditsUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + public BackButton(float x, float y, float width, float height, OptionUI optionUI, GeneralUI generalUI) { + super(new Texture("options/escape_back_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.generalUI = generalUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + public BackButton(float x, float y, float width, float height, OptionUI optionUI, VideoUI videoUI) { + super(new Texture("options/escape_back_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.videoUI = videoUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + public BackButton(float x, float y, float width, float height, OptionUI optionUI, AudioUI audioUI) { + super(new Texture("options/escape_back_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.audioUI = audioUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + @Override + public void leftClick() { + + if(controlUI != null){controlUI.disposeControlUI();} + else if(creditUI != null){creditUI.disposeCreditUI();} + else if(generalUI != null){generalUI.disposeGeneralUI();} + else if(videoUI != null){videoUI.disposeVideoUI();} + else if(audioUI != null){audioUI.disposeAudioUI();} + optionUI.showOptionsUI(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/General/GeneralButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/General/GeneralButton.java new file mode 100644 index 0000000000000000000000000000000000000000..84e795f7e678044126ceb43c82a692dc480900d0 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/General/GeneralButton.java @@ -0,0 +1,33 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.General; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.PauseMenuUI; + +public class GeneralButton extends ImButton { + + private Sound clickSound; + + private OptionUI optionUI; + + private PauseMenuUI pauseMenuUI; + + public GeneralButton(float x, float y, float width, float height, OptionUI optionUI) { + super(new Texture("options/escape_general_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + @Override + public void leftClick() { + optionUI.openGeneral(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/OptionenBackButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/OptionenBackButton.java new file mode 100644 index 0000000000000000000000000000000000000000..366d6edc9c8c787924c2109ffaa70442a94987af --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/OptionenBackButton.java @@ -0,0 +1,37 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.PauseMenuUI; + +public class OptionenBackButton extends ImButton { + + private Sound clickSound; + + private OptionUI optionUI; + + private PauseMenuUI pauseMenuUI; + + public OptionenBackButton(float x, float y, float width, float height, OptionUI optionUI, PauseMenuUI pauseMenuUI) { + super(new Texture("options/escape_back_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.pauseMenuUI = pauseMenuUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + @Override + public void leftClick() { + optionUI.disposeOptionsUI(); + if(pauseMenuUI!=null) { + pauseMenuUI.showPauseMenuUI(); + } + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Video/BackButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Video/BackButton.java new file mode 100644 index 0000000000000000000000000000000000000000..6e7f9dc3f4da7c8e182f6bb75f9a84df3eaa0ecd --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Video/BackButton.java @@ -0,0 +1,36 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Video; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.GeneralUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.VideoUI; + +public class BackButton extends ImButton { + + private Sound clickSound; + + private OptionUI optionUI; + + private VideoUI videoUI; + + public BackButton(float x, float y, float width, float height, OptionUI optionUI, VideoUI videoUI) { + super(new Texture("options/escape_back_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.videoUI = videoUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + @Override + public void leftClick() { + videoUI.disposeVideoUI(); + optionUI.showOptionsUI(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Video/FullscreenEnableButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Video/FullscreenEnableButton.java new file mode 100644 index 0000000000000000000000000000000000000000..6c594ece426d667a982276c6e210be9e084332f9 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Video/FullscreenEnableButton.java @@ -0,0 +1,30 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Video; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; + +public class FullscreenEnableButton extends ImButton { + + private Sound clickSound; + + private Main main; + + public FullscreenEnableButton(float x, float y, float width, float height, Main main) { + super(new Texture("options/escape_enable_on.png"), x, y, width, height); + this.main = main; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + @Override + public void leftClick() { + main.setFullscreen(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Video/VideoButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Video/VideoButton.java new file mode 100644 index 0000000000000000000000000000000000000000..9f9ef3de07a3df0cd72ef8fbff0825414ce783e6 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Video/VideoButton.java @@ -0,0 +1,33 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Video; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.PauseMenuUI; + +public class VideoButton extends ImButton { + + private Sound clickSound; + + private OptionUI optionUI; + + private PauseMenuUI pauseMenuUI; + + public VideoButton(float x, float y, float width, float height, OptionUI optionUI) { + super(new Texture("options/escape_video_on.png"), x, y, width, height); + this.optionUI = optionUI; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + @Override + public void leftClick() { + optionUI.openVideo(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Video/WindowedButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Video/WindowedButton.java new file mode 100644 index 0000000000000000000000000000000000000000..30ef43a6574cf19c038999a919d32899859de1a0 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/OptionButtons/Video/WindowedButton.java @@ -0,0 +1,30 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Video; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; + +public class WindowedButton extends ImButton { + + private Sound clickSound; + + private Main main; + + public WindowedButton(float x, float y, float width, float height, Main main) { + super(new Texture("options/escape_window_on.png"), x, y, width, height); + this.main = main; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + @Override + public void leftClick() { + main.setWindowed(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ShipButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ShipButton.java index eb6cc83ea6f722c4e9938738dec79fd407fe9260..d489b1a156ee1673efc3e5576c4d7846668239f1 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ShipButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ShipButton.java @@ -4,28 +4,19 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView; /** * Button for opening the Ship-Interface * */ -public class ShipButton extends Button +public class ShipButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ @@ -39,10 +30,16 @@ public class ShipButton extends Button /** * Constructor * - * @param main - main class * @param ui the ui this button is on */ - public ShipButton(Main main, ShipView ui) { + public ShipButton(float x, float y, float width, float height, ShipView ui) { + super(new Texture("top_ship_on.png"), x, y, width, height); + this.ui = ui; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } @@ -51,6 +48,6 @@ public class ShipButton extends Button */ public void leftClick() { - + ui.openInventory(); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ShopBuyButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ShopBuyButton.java index 93f732b35f2ae7a45e86c9271555f4af67322a7c..ffdff436f66b40f7cb97cdb219e8b10d1d6dd5f5 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ShopBuyButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ShopBuyButton.java @@ -1,61 +1,44 @@ package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons; import com.badlogic.gdx.audio.Sound; -import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.galaxytrucker.galaxytruckerreloaded.Main; -import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; -import com.galaxytrucker.galaxytruckerreloaded.View.UI.Events.ShopUI; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Events.ShopElement; /** * button used to buy something in the shop */ -public class ShopBuyButton extends Button { +public class ShopBuyButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ private Sound clickSound; - boolean down = false; - - /** - * the item this button belongs to - * index of list in shopui - */ - private int item; - /** * the ui this button is on */ - private ShopUI shop; + private ShopElement shop; /** * Constructor * - * @param main - main class - * @param item the item * @param ui the ui this button is on */ - public ShopBuyButton(Main main, int item, ShopUI ui) { - + public ShopBuyButton(float x, float y, float width, float height, ShopElement ui) { + super(new Texture("sell_buy_on.png"), x, y, width, height); + shop = ui; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } public void leftClick() { - down = !down; + shop.buy(); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ShopSellButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ShopSellButton.java new file mode 100644 index 0000000000000000000000000000000000000000..e2a8f02edaa0fce8a44bca4cdb74c31094373326 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/ShopSellButton.java @@ -0,0 +1,41 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Events.ShopElement; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Events.ShopSellElement; + +public class ShopSellButton extends ImButton { + /** + * Click sound effect + */ + private Sound clickSound; + + /** + * the ui this button is on + */ + private ShopSellElement shop; + + /** + * Constructor + * + * @param ui the ui this button is on + */ + public ShopSellButton(float x, float y, float width, float height, ShopSellElement ui) { + super(new Texture("sell_buy_on.png"), x, y, width, height); + shop = ui; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + } + + public void leftClick() + { + shop.sell(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/SystemButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/SystemButton.java index 51029a3b41648cfaeac84d2933c26013a566e55c..60b5c02ed9e7de8610b79f7fac1d9c14030867f2 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/SystemButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/SystemButton.java @@ -1,41 +1,28 @@ package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation.SubsystemUI; /** * Button for regulation of (Sub)-System energie supplyment */ -public class SystemButton extends Button +public class SystemButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ private Sound clickSound; - private Texture image_off; - private Texture image_hover_off; - - Texture glow; - /** * the ui this button belongs to */ @@ -44,21 +31,21 @@ public class SystemButton extends Button /** * Constructor * - * @param main - main class * @param ui the ui this button belongs to */ - public SystemButton(Main main, SubsystemUI ui) { - } - - public void setGlowTexture(Texture glow) - { - this.glow = glow; - } - - public void setOffTextures(Texture image_off, Texture image_hover_off) - { - this.image_off = image_off; - this.image_hover_off = image_hover_off; + public SystemButton(Texture texture, float x, float y, float width, float height, SubsystemUI ui) { + super(texture, x, y, width, height); + this.ui = ui; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + if(event.getButton() == Input.Buttons.RIGHT) { + rightClick(); + } + else if(event.getButton() == Input.Buttons.LEFT) { + leftClick(); + } + } + }); } @@ -67,82 +54,13 @@ public class SystemButton extends Button */ public void rightClick() { -// int power = -1; -// if(system instanceof ShieldSystem) -// power = -2; -// -// if(system instanceof WeaponSystem) -// { -// WeaponSystem weaponSystem = (WeaponSystem)system; -// for(int i = 3; i >= 0; i--) -// { -// if(weaponSystem.getWeapon(i) != null && weaponSystem.getWeapon(i).isPowered()) -// { -// int prevPower = system.getPower(); -// weaponSystem.powerDownWeapon(i); -// if(prevPower != system.getPower()) -// { -// Sounds.playSound("buttonOff"); -// } -// break; -// } -// } -// } -// else -// { -// int prevPower = system.getPower(); -// system.addPower(power); -// if(prevPower != system.getPower()) -// { -// Sounds.playSound("buttonOff"); -// } -// } + ui.lessEnergy(); //TODO how much? } /** * increases the Energie provided for a System */ - @Override - public void leftClick(){ -// { -// int power = 1; -// if(system instanceof ShieldSystem) -// power = 2; -// -// if(system instanceof WeaponSystem) -// { -// WeaponSystem weaponSystem = (WeaponSystem)system; -// for(int i = 0; i < 4; i++) -// { -// if(!weaponSystem.getWeapon(i).isPowered()) -// { -// int prevPower = system.getPower(); -// weaponSystem.powerOnWeapon(i); -// if(prevPower != system.getPower()) -// { -// Sounds.playSound("buttonOn"); -// } -// else -// { -// Sounds.playSound("buttonFail"); -// } -// break; -// } -// } -// } -// else -// { -// int prevPower = system.getPower(); -// system.addPower(power); -// if(prevPower != system.getPower()) -// { -// Sounds.playSound("buttonOn"); -// } -// else -// { -// Sounds.playSound("buttonFail"); -// } -// } -// } -} + public void leftClick() { + ui.activateEnergy(); + } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/WeaponActivateButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/WeaponActivateButton.java index 40ea4db5ccaa974341a0e36f78875825998454e5..8ebfd779f9673ec8268f83928a8f770e0e5d96a7 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/WeaponActivateButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/InGameButtons/WeaponActivateButton.java @@ -4,8 +4,11 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation.WeaponUI; import java.io.BufferedWriter; @@ -13,27 +16,13 @@ import java.io.BufferedWriter; /** * button used to activate/deactivate weapon */ -public class WeaponActivateButton extends Button { +public class WeaponActivateButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ private Sound clickSound; - boolean down = false; - /** * the ui this button belongs to */ @@ -44,15 +33,20 @@ public class WeaponActivateButton extends Button { */ @Override public void leftClick() { - + ui.weaponactivated(); } /** * constructor - * @param main the main class * @param ui the ui this button belongs to */ - public WeaponActivateButton(Main main, WeaponUI ui) { - + public WeaponActivateButton(Texture texture, float x, float y, float width, float height, WeaponUI ui) { + super(texture, x, y, width, height); + this.ui = ui; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/DifficultyButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/DifficultyButton.java index c1d9672a1a95f091384737d156b201a470dcc550..b40733ba94e99001961fe0d7d4b7c48e486b17dd 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/DifficultyButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/DifficultyButton.java @@ -4,32 +4,26 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.Screen.ShipSelector; /** * Button for setting the degree of diffiulty */ -public class DifficultyButton extends Button +public class DifficultyButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ private Sound clickSound; + /** + * the difficulty + */ private int difficulty; /** @@ -40,11 +34,17 @@ public class DifficultyButton extends Button /** * Constructor * - * @param main - main class - * @param difficulty the difficulty this button represents * @param screen the screen this button is on */ - public DifficultyButton(Main main, int difficulty, ShipSelector screen) { + public DifficultyButton(float x, float y, float width, float height, ShipSelector screen, int difficulty) { + super(new Texture("yes.png"), x, y, width, height); + this.screen = screen; + this.difficulty = difficulty; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } /** @@ -53,7 +53,7 @@ public class DifficultyButton extends Button @Override public void leftClick() { - // setDifficulty(difficulty); + screen.setDifficulty(difficulty); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/LoginButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/LoginButton.java index b577b59bd156879b9120b0d2cac15fa476ab03fa..0679459c4304b0d8cc754b145e94df21e9e33052 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/LoginButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/LoginButton.java @@ -4,27 +4,18 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.Screen.LoginScreen; /** * the login button for the login screen */ -public class LoginButton extends Button { +public class LoginButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ @@ -41,15 +32,20 @@ public class LoginButton extends Button { */ @Override public void leftClick() { - + screen.login(); } /** * the constructor - * @param main the main class * @param screen the login screen this button belongs to */ - public LoginButton(Main main, LoginScreen screen) { - + public LoginButton(float x, float y, float width, float height, LoginScreen screen) { + super(new Texture("yes.png"), x, y, width, height); + this.screen = screen; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/NewGameButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/NewGameButton.java index a2466e8bc49c759d9424c88feef5b20c112e3878..3e4ded701c31fbe2900ecea2e816dfa91ce0cd79 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/NewGameButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/NewGameButton.java @@ -4,63 +4,52 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.Event; +import com.badlogic.gdx.scenes.scene2d.EventListener; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; /** * Starts a new Game */ -public class NewGameButton extends Button +public class NewGameButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ private Sound clickSound; - /** - * the screen this button is on - */ - private MainMenu screen; + + private MainMenu mainMenu; + /** * Constructor * - * @param main - main class - * @param screen the screen this button is on */ - public NewGameButton(Main main, MainMenu screen) { - } + public NewGameButton(float x, float y, float width, float height, MainMenu menu) { + super(new Texture("start_select2.png"), x, y, width, height); + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); -// /** -// * Send data to server -// */ -// private void sendData(Packet data) { -// } -// -// /** -// * Receive data from server -// */ -// private Packet receiveData() { -// return null; -// } + mainMenu = menu; + } /** * Creats new Game */ public void leftClick() { + mainMenu.newGame(); } + } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/OptionButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/OptionButton.java new file mode 100644 index 0000000000000000000000000000000000000000..ff2b741ccab8455bb7b5f75ac3a2d7895863f45f --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/OptionButton.java @@ -0,0 +1,55 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons; + +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.PauseMenuUI; + +/** + * creates a new OptionButton + */ +public class OptionButton extends ImButton{ + + /** + * Click sound effect + */ + private Sound clickSound; + + /** Menu object */ + private MainMenu mainMenu; + + /** + * Constructor + * + */ + public OptionButton(float x, float y, float width, float height, MainMenu mainMenu) { + super(new Texture("options_select2.png"), x, y, width, height); + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); + this.mainMenu = mainMenu; + } + + /** + * Creats new Game + */ + public void leftClick() + { + //ui.render(); + if(mainMenu != null){ + mainMenu.createOptions(); + } + else { + System.out.println("Fehler"); + } + } + +} + + diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/QuitButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/QuitButton.java index 97604472d573e2b05fd20b4ab38894d33e259684..7348c36d0ca2e8e1e4598fec054bc16f749f5efe 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/QuitButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/QuitButton.java @@ -4,66 +4,43 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; /** * Ends the Game */ -public class QuitButton extends Button +public class QuitButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; - /** - * Click sound effect - */ - private Sound clickSound; - - /** - * the screen this button is on - */ - private MainMenu screen; + private MainMenu menu; /** * Constructor * - * @param main - main class - * @param screen the screen this button is on */ - public QuitButton(Main main, MainMenu screen) { - } + public QuitButton(float x, float y, float width, float height, MainMenu menu) { + super(new Texture("quit_on.png"), x, y, width, height); + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); -// /** -// * Send data to server -// */ -// private void sendData(Packet data) { -// } -// -// /** -// * Receive data from server -// */ -// private Packet receiveData() { -// return null; -// } + this.menu = menu; + } /** - * Ends the Game + * left click action */ - @Override - public void leftClick() - { - System.exit(0); + public void leftClick() { + menu.quit(); } + } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/ShipSelectButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/ShipSelectButton.java index 8f8916bdfa98057d11582e0248ed47ea29cd83e0..f130674403963489af33795a2efdb225c1fcb6cf 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/ShipSelectButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/ShipSelectButton.java @@ -4,27 +4,18 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.Screen.ShipSelector; /** * the button representing one ship in the ship selector */ -public class ShipSelectButton extends Button { +public class ShipSelectButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ @@ -45,16 +36,22 @@ public class ShipSelectButton extends Button { */ @Override public void leftClick() { - + screen.setShip(ship); } /** * constructor - * @param main the main class * @param ship the ship, (index of ship in list in shipselector) * @param screen the screen this button is on */ - public ShipSelectButton(Main main, int ship, ShipSelector screen) { - + public ShipSelectButton(float x, float y, float width, float height, int ship, ShipSelector screen) { + super(new Texture("yes.png"), x, y, width, height); + this.screen = screen; + this.ship = ship; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/SinglePlayerButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/SinglePlayerButton.java index 074080462523542726b6d1962d675c6ce058abc1..a7b06f37b4bbc0b53122a097a3da3cc1de91caf9 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/SinglePlayerButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/SinglePlayerButton.java @@ -4,27 +4,17 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.Screen.ShipSelector; /** * button to choose single player in the ship selector */ -public class SinglePlayerButton extends Button { - - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; +public class SinglePlayerButton extends ImButton { /** * Click sound effect */ @@ -45,16 +35,22 @@ public class SinglePlayerButton extends Button { */ @Override public void leftClick() { - + singlePlayer = !singlePlayer; + screen.setSinglePlayer(singlePlayer); } /** * constructor * * @param screen the screen this button is on - * @param main the main class */ - public SinglePlayerButton(Main main, ShipSelector screen) { - + public SinglePlayerButton(float x, float y, float width, float height, ShipSelector screen) { + super(new Texture("yes.png"), x, y, width, height); + this.screen = screen; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/StartButton.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/StartButton.java index eb9e3328a43c69c04695bfec224b86f182da49f8..a20dbb8a626d634cf85f8ccdb05b7b462e1973ff 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/StartButton.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Buttons/MenuButtons/StartButton.java @@ -1,30 +1,22 @@ package com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons; +import com.badlogic.gdx.Screen; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.Button; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.ImButton; import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; /** * Starts a new Game */ -public class StartButton extends Button +public class StartButton extends ImButton { - /** - * Sprite batch - */ - private SpriteBatch batch; - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** - * Background - */ - private Texture background; /** * Click sound effect */ @@ -35,35 +27,26 @@ public class StartButton extends Button */ private MainMenu screen; - /** * Constructor * - * @param main - main class * @param screen the screen this button is on */ - public StartButton(Main main, MainMenu screen) { + public StartButton(float x, float y, float width, float height, MainMenu screen) { + super(new Texture("continue.png"), x, y, width, height); + this.screen = screen; + this.addListener(new ClickListener() { + public void clicked(InputEvent event, float x, float y) { + leftClick(); + } + }); } -// /** -// * Send data to server -// */ -// private void sendData(Packet data) { -// } -// -// /** -// * Receive data from server -// */ -// private Packet receiveData() { -// return null; -// } - /** * Creates s a new Instance of PLayer an an new Ship */ public void leftClick() { - // FTLGame.instance().setPlayer(hanger.getShip()); - // FTLView.instance().setScreen(new SpaceScreen()); + screen.resumeGame(); } } \ No newline at end of file diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/GamePlay.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/GamePlay.java index 2b6bc82049a9e714811e1373cd20e6c848c2a9c7..4dc4624f663b60bcfc82b72a5f0e5da9a43c75f3 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/GamePlay.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/GamePlay.java @@ -1,32 +1,43 @@ package com.galaxytrucker.galaxytruckerreloaded.View.Screen; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; import com.badlogic.gdx.Screen; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.audio.Sound; -import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.utils.viewport.FitViewport; +import com.badlogic.gdx.utils.viewport.Viewport; import com.galaxytrucker.galaxytruckerreloaded.Main; -import com.galaxytrucker.galaxytruckerreloaded.View.UI.Inventory.InventoryUI; -import com.galaxytrucker.galaxytruckerreloaded.View.UI.Map.MapUI; -import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.OptionsUI; +import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.PlanetEvent; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader; +import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; +import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.BlankRoom; +import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room; +import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.ShipType; +import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.LaserBlaster; +import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Events.EventGUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Events.GameOver; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Events.ShopUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.*; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.EnemyShip; import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; + /** * Main game screen */ public class GamePlay implements Screen { - /** - * SpriteBatch - */ - private SpriteBatch batch; - - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** * Background texture */ @@ -43,19 +54,135 @@ public class GamePlay implements Screen { private Sound clickSound; /** - * MultiPlayer active + * ship of the player + */ + private ShipView player; + + /** + * the enemy, if existing */ - private boolean multiPlayer; + private EnemyShip enemy; /** - * Current map + * the shop, if existing */ - private MapUI gameMap; + private ShopUI shopUI; /** - * ship of the player + * the event ui if existing */ - private ShipView player; + private EventGUI eventGUI; + + /*** + * the game over ui, if existing + */ + private GameOver gameOverUI; + + /** + * ingame general settings + */ + private GeneralUI generalUI; + + /** + * ingame Video settings + */ + private VideoUI videoUI; + + /** + * audio settings ui + */ + private AudioUI audioUI; + + /** + * credits ui + */ + private CreditsUI creditsUI; + + /** + * control settings ui + */ + private ControlUI controlUI; + + /** + * the ingame options ui, if existing + */ + private OptionUI optionUI; + + /** + * the main game class + */ + private Main main; + + /** + * the stage for the buttons + */ + public Stage stage; + + /** + * the stage for the buttons of the pause menu + */ + private Stage pauseStage; + + /** + * the viewport + */ + private Viewport viewport; + + /** + * the pause menu ui, if existing + */ + private PauseMenuUI pauseMenuUI; + + /** + * Constructor + * + * @param main - main class + */ + public GamePlay(Main main) { + this.main = main; + background = new Texture("1080p.png"); + + viewport = new FitViewport(main.WIDTH, main.HEIGHT); + stage = new Stage(viewport); + pauseStage = new Stage(viewport); + + player = new ShipView(main, fakeShip(), stage, fakeMap(), this); //TODO wie schiff aus controller? + + Gdx.input.setInputProcessor(stage); + } + + //TODO only for testing + public Ship fakeShip(){ + Trader trader = new Trader(); + //Planet planet = new Planet("planet", 125f, 125f, PlanetEvent.SHOP, false, new LinkedList<>(), trader); + Planet planet = new Planet(); + List<Room> rooms = new LinkedList<>(); + rooms.add(new BlankRoom()); + rooms.add(new BlankRoom()); + rooms.add(new BlankRoom()); + List<Weapon> weapons = new LinkedList<>(); + weapons.add(new LaserBlaster("karl")); + weapons.add(new LaserBlaster("test")); + return new Ship(1, "aaron", ShipType.DEFAULT, 100, 49, 5, 5, 7, 9, 23, 6f, planet, 6, 6, rooms, weapons, false); + } + + /** + * sp盲ter durch laden aus controller ersetzen + */ + public Overworld fakeMap() { + Overworld res = new Overworld(2, 1, "aaron"); + HashMap<String, Planet> hmap = new HashMap<>(); + Planet sp = new Planet(0, "planet1", (float) 78, (float) 199, PlanetEvent.SHOP, new LinkedList<Ship>()); + String f = "78, 199"; + hmap.put(f, sp); + Planet sp1 = new Planet(1, "planet2", (float) 200, (float) 154, PlanetEvent.COMBAT, new LinkedList<Ship>()); + String f1 = "200, 154"; + hmap.put(f1, sp1); + res.setPlanetMap(hmap); + res.setStartPlanet(sp); + + return res; + } @Override @@ -63,33 +190,463 @@ public class GamePlay implements Screen { } + @Override + public void resize(int width, int height) { + viewport.update(width, height); + } + @Override public void render(float delta) { + updateInput(); + + Gdx.gl.glClearColor(1, 1, 1, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + main.batch.begin(); + main.batch.draw(background, 0, 0, main.WIDTH, main.HEIGHT); + main.batch.end(); + + player.render(); + + if(eventGUI != null) { eventGUI.render(); } + else if(shopUI != null) { shopUI.render(); } + else if(gameOverUI != null) { gameOverUI.render(); } + else if(videoUI != null) { videoUI.render(); } + else if(generalUI != null) { generalUI.render(); } + else if(optionUI != null) { optionUI.render(); } + else if(pauseMenuUI != null) { pauseMenuUI.render(); } + + stage.draw(); } @Override - public void resize(int width, int height) { + public void dispose() { + background.dispose(); + player.disposeShipView(); + if(shopUI != null) { shopUI.disposeShopUI(); } + if(eventGUI != null) { eventGUI.disposeEventGUI(); } + if(gameOverUI != null) { gameOverUI.disposeGameoverUI(); } + if(videoUI != null) { videoUI.disposeVideoUI(); } + if(generalUI != null) { generalUI.disposeGeneralUI(); } + if(optionUI != null) { optionUI.disposeOptionsUI(); } + if(pauseMenuUI != null) { pauseMenuUI.disposePauseMenuUI(); } + stage.dispose(); + } + + /** + * handles input to pause game, open options + */ + public void updateInput() { + if(Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) { + // Pause-menu + Gdx.input.setInputProcessor(pauseStage); + createPauseMenu(); + } + } + /** + * new event ui + */ + public void createEvent(PlanetEvent event) { + eventGUI = new EventGUI(main, event, stage, this); } - @Override - public void pause() { + /** + * remove the event ui from the screen + */ + public void deleteEvent() { + eventGUI = null; + } + + /** + * travel to a planet + * call to travelController + * + * if valid request, travel to new planet with execution of event etc + * if not, error message? + * + * @param planet the target planet + * @return whether or not it is a valid request + */ + public boolean travel(Planet planet) { + boolean success = true; //TODO call to controller + if(success) { + createEvent(planet.getEvent()); + if(planet.getEvent() == PlanetEvent.SHOP) { + createShop(planet.getTrader()); + } + } + return success; + } + + /** + * shop ui pops up + */ + public void createShop(Trader trader) { + if(shopUI == null) { + shopUI = new ShopUI(main, stage, this, trader, null, 0); + } + } //TODO + + /** + * remove the shop + */ + public void deleteShop() { + shopUI = null; + } + + /** + * buy a weapon from the trader + * call to controller + * @param weapon the weapon + */ + public boolean buyWeapon(Weapon weapon) { + boolean success = false; //TODO controller + if(success) { + player.changeAmountScrap(-(weapon.getPrice().get(weapon.getWeaponLevel()))); + } + return success; + } + + /** + * buy a crew member from the trader + * call to controller + * @param crew the crew member + */ + public boolean buyCrew(Crew crew) { + boolean success = false; //TODO controller + if(success) { + player.changeAmountScrap(-(crew.getPrice())); + } + return success; + } + + /** + * buy fuel from the trader + * call to controller + * @param amount the amount of fuel + */ + public boolean buyFuel(int amount) { + boolean success = false; //TODO controller + if(success) { + player.changeAmountScrap(-(5*amount)); //TODO festpreis + } + return success; + } + + /** + * buy missiles from the trader + * call to controller + * @param amount the amount of missiles + */ + public boolean buyMissiles(int amount) { + boolean success = false; //TODO controller + if(success) { + player.changeAmountScrap(-(5*amount)); //TODO festpreis + } + return success; + } + + /** + * buy hp from the trader + * call to controller + * @param amount the amount of hp + */ + public boolean buyHp(int amount) { + boolean success = false; //TODO controller + if(success) { + player.changeAmountScrap(-(5*amount)); //TODO festpreis + } + return success; + } + + /** + * sell missiles to the trader + * @param amount the amount of missiles + * @return successfull? call to controller + */ + public boolean sellMissiles(int amount) { + boolean success = false; //TODO controller + if(success) { + player.changeAmountScrap(5*amount); //TODO festpreis + } + return success; + } + /** + * sell weapon to trader + * @param weapon the weapon + * @return successfull? call to controller + */ + public boolean sellWeapon(Weapon weapon) { + boolean success = false; //TODO controller + if(success) { + player.changeAmountScrap(weapon.getPrice().get(weapon.getWeaponLevel())); + } + return success; } + /** + * create a game over ui if it does not yet exist + * @param won whether the game was won + */ + public void createGameOver(boolean won) { + if(gameOverUI == null) { + gameOverUI = new GameOver(main, stage, won, this); + } + } + + /** + * delete the game over ui + */ + public void deleteGameOver() { + gameOverUI = null; + } + + /** + * opens in game pause menu + * called by controller + */ + public void createPauseMenu() { + if(pauseMenuUI == null) { + pauseStage = new Stage(viewport); + Gdx.input.setInputProcessor(pauseStage); + pauseMenuUI = new PauseMenuUI(main, pauseStage, this); + } + //TODO controller sagen dass spiel "pausiert"? + } + + /** + * closes in game pause menu + */ + public void deletePauseMenu() { + pauseMenuUI = null; + Gdx.input.setInputProcessor(stage); + } + + /** + * opens in game options + */ + public void createOptions() { + if(optionUI == null) { + optionUI = new OptionUI(main, pauseStage, this, null); + } + } + + /** + * closes in game options + */ + public void deleteOptions() { + optionUI = null; + } + + /** + * opens in game general options + */ + public void createGeneralUI() { + if(generalUI == null) { + generalUI = new GeneralUI(main, pauseStage, this, null); + } + } + + /** + * closes in game general options + */ + public void deleteGeneralUI() { + generalUI = null; + } + + /** + * opens in game video options + */ + public void createVideoUI() { + if(videoUI == null) { + videoUI = new VideoUI(main, pauseStage, this, null); + } + } + + /** + * closes ingame video settings + */ + public void deleteVideoUI() { + videoUI = null; + } + + /** + * create audio option ui, if it does not yet exist + */ + public void createAudioUI(){ + if(audioUI == null) { + audioUI = new AudioUI(main, pauseStage, this, null); + } + } + + /** + * delete the audio option ui + */ + public void deleteAudioUI(){ + audioUI = null; + } + + /** + * create the credit ui, if it does not yet exist + */ + public void createCreditUI(){ + if(creditsUI == null) { + creditsUI = new CreditsUI(main, pauseStage, this, null); + } + } + + /** + * delete the credit ui + */ + public void deleteCreditUI(){ + creditsUI = null; + } + + /** + * create the control option ui, if it does not yet exist + */ + public void createControlUI(){ + if(controlUI == null) { + controlUI = new ControlUI(main, pauseStage, this, null); + } + } + + /** + * delete the control ui + */ + public void deleteControlUI(){ + controlUI = null; + } + + /** + * delete the ship + */ + public void deleteShip() { + player = null; + } + + /** + * the crew moved from one room to the other + * @param crew the id of the crew member + * @param room the new room + */ + public void crewMoved(int crew, Room room) {} //call controller, ask for permission + + /** + * update the health of a crew member + * @param crew the crew member + * @param health the new health + */ + public void crewHealth(int crew, int health) { player.crewHealth(crew, health); } + + /** + * update the energy status of the overall energy not yet assigned to a system + * @param energy the new energy + */ + public void energyStatusUpdate(int energy) { player.energyStatusUpdate(energy); } + + /** + * update the status of the hull + * @param status the new status + */ + public void hullStatusUpdate(int status) { player.hullStatusUpdate(status); } + + /** + * the player has chosen a new amount of energy for a system + * @param amount how much should be subtracted/added + */ + public void roomSystemEnergyChosen(int id, int amount) { + //call controller + } + + /** + * the energy for a system is updated + * @param amount the new total amount + */ + public void roomSystemEnergyUpdate(int id, int amount) { + player.roomSystemEnergyUpdate(id, amount); + } + + /** + * update the status of a system + * @param id the id of the system + * @param amount the new status + */ + public void roomSystemStatusUpdate(int id, int amount) { + player.roomSystemStatusUpdate(id, amount); + } + + /** + * change the amount of scrap + * @param amount the new amount + */ + public void changeAmountScrap(int amount) { + player.changeAmountScrap(amount); + } + + /** + * the player has chosen a weapon and a room + * call to controller, add id of the enemyship + * + * @param id the weapon id + * @param room the room + */ + public void weaponShot(int id, Room room) {} //call controller + + /** + * load the crew of a ship + * @param shipId the ship id + * @return the crew members + */ + public List<Crew> loadCrew(int shipId) { //TODO call controller + List<Crew> result = new LinkedList<>(); + Crew c1 = new Crew(1, "ana", 7, 10); + result.add(c1); + Crew c2 = new Crew(2, "battle", 8, 10); + result.add(c2); + return result; + } + + /** + * load the weapons of a ship + * @param shipId the ship id + * @return the weapons of the ship in a list + */ + public List<Weapon> loadWeapons(int shipId) { + List<Weapon> weapons = new LinkedList<>(); + weapons.add(new LaserBlaster("karl")); + weapons.add(new LaserBlaster("test")); + return weapons; + } + + /** + * load the missiles of a ship + * @param shipId the id of the ship + * @return the amount of missiles + */ + public int loadMissiles(int shipId) { return 0; } + + /** + * load the fuel of a ship + * @param shipId the id of the ship + * @return the amount of fuel + */ + public int loadFuel(int shipId) { return 0; } + @Override - public void resume() { + public void pause() { } @Override - public void hide() { + public void resume() { } @Override - public void dispose() { + public void hide() { } @@ -103,23 +660,18 @@ public class GamePlay implements Screen { } /** - * Constructor - * - * @param main - main class + * Gets the current open OptionUI + * @return current OptionUI */ - public GamePlay(Main main) { + public OptionUI getOptionUI() { + return optionUI; } -// /** -// * Send data to server -// */ -// private void sendData(Packet data) { -// } -// -// /** -// * Receive data from server -// */ -// private Packet receiveData() { -// return null; -// } + /** + * Gets the current PauseMenu. + * @return current PauseMenuUI + */ + public PauseMenuUI getPauseMenuUI() { + return pauseMenuUI; + } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LoginScreen.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LoginScreen.java index 1c5fac7654fd17cde62c123826d91520c3a94f16..32f9c5859317020234b3db9681220b2cdc2e918f 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LoginScreen.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/LoginScreen.java @@ -1,12 +1,17 @@ package com.galaxytrucker.galaxytruckerreloaded.View.Screen; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; +import com.badlogic.gdx.assets.loaders.AssetLoader; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.badlogic.gdx.scenes.scene2d.ui.TextField; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.LoginButton; @@ -16,16 +21,6 @@ import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.LoginBut */ public class LoginScreen implements Screen { - /** - * SpriteBatch - */ - private SpriteBatch batch; - - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** * Background image */ @@ -51,6 +46,33 @@ public class LoginScreen implements Screen { */ private Sound clickSound; + /** + * the main game class + */ + private Main main; + + /** + * the stage + */ + private Stage stage; + + /** + * Constructor + * + * @param main - main class + */ + public LoginScreen(Main main) { + this.main = main; + background = new Texture("1080p.png"); + loginButton = new LoginButton(main.WIDTH/2, main.HEIGHT/2, 248, 50, this); + username = new TextField("", new Skin()); + + stage = new Stage(); + stage.addActor(loginButton); + + Gdx.input.setInputProcessor(stage); + } + @Override public void show() { @@ -58,7 +80,12 @@ public class LoginScreen implements Screen { @Override public void render(float delta) { - + Gdx.gl.glClearColor(1, 1, 1, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + main.batch.begin(); + main.batch.draw(background, 0, 0, main.WIDTH, main.HEIGHT); + main.batch.end(); + stage.draw(); } @Override @@ -83,21 +110,15 @@ public class LoginScreen implements Screen { @Override public void dispose() { - + background.dispose(); + stage.dispose(); } /** * login method, called by the button */ public void login() { - - } - - /** - * Constructor - * - * @param main - main class - */ - public LoginScreen(Main main) { + String name = username.getText(); + //TODO welcher controller?? } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/MainMenu.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/MainMenu.java index 0f462c2e7e30ddf68aa66a8a9095b40c6d80496d..c14346b7646656ee72b071def4221c846f9be303 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/MainMenu.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/MainMenu.java @@ -1,87 +1,294 @@ package com.galaxytrucker.galaxytruckerreloaded.View.Screen; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Screen; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.utils.viewport.FitViewport; +import com.badlogic.gdx.utils.viewport.Viewport; import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.NewGameButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.OptionButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.QuitButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Options.*; /** * Main menu screen */ -public class MainMenu extends State { +public class MainMenu implements Screen { + /** + * the background texture + */ private Texture background; - private Texture newGame; + + /** + * the main class extending game + */ + private Main main; + + /** + * the stage for the buttons + */ + private Stage stage; + + /** + * the viewport for the stage + */ + private Viewport viewport; + + /** + * the option ui, if it exists + */ + private OptionUI optionUI; + + /** + * the general option ui, if it exists + */ + private GeneralUI generalUI; + + /** + * the video option ui, if it exists + */ + private VideoUI videoUI; + + /** + * the audio option ui, if it exists + */ + private AudioUI audioUI; + + /** + * the control option ui, if it exists + */ + private ControlUI controlUI; + + /** + * the credits ui, if it exists + */ + private CreditsUI creditsUI; + + /** + * the button to start a new game + */ + private NewGameButton newGame; + + /** + * the button to open the options + */ + private OptionButton optionButton; + + /** + * the button to quit + */ + private QuitButton quit; + /** Constructor */ - public MainMenu(GameStateManager gsm){ - super(gsm); + public MainMenu(Main main){ + this.main = main; background = new Texture("1080p.png"); - newGame = new Texture("start_select2.png"); + newGame = new NewGameButton(main.WIDTH/2 - 124, main.HEIGHT/2 - 25, 248, 50, this); + optionButton = new OptionButton(main.WIDTH/2 - 97, main.HEIGHT/2 -50 - 25, 194, 50,this); + quit = new QuitButton(main.WIDTH/2 - 124 , main.HEIGHT/2 - 100 - 25, 248, 50, this); + + viewport = new FitViewport(main.WIDTH, main.HEIGHT); + stage = new Stage(viewport); + stage.addActor(quit); + stage.addActor(optionButton); + stage.addActor(newGame); + + Gdx.input.setInputProcessor(stage); } + /** + * Called when this screen becomes the current screen for a game + */ @Override - public void handleInput() { - + public void show() { + newGame.setVisible(true); + optionButton.setVisible(true); + quit.setVisible(true); } + /** + * Called when the screen should render itself. + * + * @param delta The time in seconds since the last render. + */ @Override - public void update(float dt) { + public void render(float delta) { + Gdx.gl.glClearColor(1, 1, 1, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + main.batch.begin(); + main.batch.draw(background, 0, 0, main.WIDTH, main.HEIGHT); + main.batch.end(); + if(optionUI!=null) { + optionUI.render(); + } + stage.draw(); + } + /** + * @param width the new width + * @param height the new height + */ + @Override + public void resize(int width, int height) { + viewport.update(width, height); } + /** + * pauses + */ @Override - public void render(SpriteBatch sb) { - sb.begin(); - sb.draw(background, 0,0); - sb.draw(newGame, Main.WIDTH/2 - newGame.getWidth()/2,Main.HEIGHT/2, 248,50); - sb.end(); - } - - /* *//** - * The sprite batch - *//* - private SpriteBatch batch; - - *//** - * Orthographic camera - *//* - private OrthographicCamera camera; - - *//** - * The screen texture - *//* - private Texture background; + public void pause() { - *//** - * new game button. leads to shipselector - *//* - private NewGameButton newGame; + } - *//** - * start game button. continues old game - *//* - private StartButton startGame; + /** + */ + @Override + public void resume() { - *//** - * quit button - *//* - private QuitButton quitButton; + } - *//** - * Looping music track - *//* - private Music music; + /** + * Called when this screen is no longer the current screen for a game + */ + @Override + public void hide() { + newGame.setVisible(false); + optionButton.setVisible(false); + quit.setVisible(false); + } - *//** - * Click sound effect - *//* - private Sound clickSound;*/ + /** + * Called when this screen should release all resources. + */ + @Override + public void dispose() { + background.dispose(); + stage.dispose(); + if(optionUI!=null) { + optionUI.disposeOptionsUI(); + } + } /** * starts a new game. * called by button */ public void newGame() { + main.setScreen(new ShipSelector(main)); + dispose(); + } + + /** + * create the option ui, if it does not yet exist + */ + public void createOptions(){ + if(optionUI==null) { + hide(); + optionUI = new OptionUI(main, stage, null, this); + } + } + + /** + * remove the option ui + */ + public void deleteOptions(){ + show(); + optionUI = null; + } + + /** + * return the option ui + * @return the option ui + */ + public OptionUI getOptionUI() { + return optionUI; + } + + /** + * create a general option ui, if it does not yet exist + */ + public void createGeneralUI() { + if(generalUI == null) { + generalUI = new GeneralUI(main, stage, null, this); + } + } + + /** + * remove the general option ui + */ + public void deleteGeneralUI() { + generalUI = null; + } + + /** + * create a video option ui, if it does not yet exist + */ + public void createVideoUI() { + if(videoUI == null) { + videoUI = new VideoUI(main, stage, null, this); + } + } + + /** + * delete the video option ui + */ + public void deleteVideoUI() { + videoUI = null; + } + + /** + * create an audio option ui, if it does not yet exist + */ + public void createAudioUI(){ + if(audioUI == null) { + audioUI = new AudioUI(main, stage, null, this); + } + } + + /** + * delete the audio option ui + */ + public void deleteAudioUI(){ + audioUI = null; + } + /** + * create a credit ui, if it does not yet exist + */ + public void createCreditUI(){ + if(creditsUI == null) { + creditsUI = new CreditsUI(main, stage, null, this); + } + } + + /** + * delete the credit ui + */ + public void deleteCreditUI(){ + creditsUI = null; + } + + /** + * create the control option ui, if it does not yet exist + */ + public void createControlUI(){ + if(controlUI == null) { + controlUI = new ControlUI(main, stage, null, this); + } + } + + /** + * delete the control option ui + */ + public void deleteControlUI(){ + controlUI = null; } /** @@ -96,8 +303,8 @@ public class MainMenu extends State { * quits. * called by button */ - public void quit() { - + public void quit() { + Gdx.app.exit(); } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/PauseMenu.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/PauseMenu.java index 5290086244da856b09424b5b1ef4a0b224c4160f..feb5615c27ddd404ae75bf633bb486ae1ae9d3ff 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/PauseMenu.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/PauseMenu.java @@ -1,6 +1,8 @@ package com.galaxytrucker.galaxytruckerreloaded.View.Screen; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; +import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; @@ -12,19 +14,22 @@ import com.galaxytrucker.galaxytruckerreloaded.Main; public class PauseMenu implements Screen { /** - * Sptire batch + * Game paused texture */ - private SpriteBatch batch; + private Texture pausedTexture; - /** - * Orthographic camera - */ - private OrthographicCamera camera; + private Main main; /** - * Game paused texture - */ - private Texture pausedTexture; + * Constructor + * + * @param main - main class + * + * */ + public PauseMenu(Main main) { + this.main = main; + pausedTexture = new Texture("pause.png"); + } @Override public void show() { @@ -33,7 +38,11 @@ public class PauseMenu implements Screen { @Override public void render(float delta) { - + Gdx.gl.glClearColor(1, 1, 1, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + main.batch.begin(); + main.batch.draw(pausedTexture, 0, 0, main.WIDTH, main.HEIGHT); + main.batch.end(); } @Override @@ -58,11 +67,6 @@ public class PauseMenu implements Screen { @Override public void dispose() { - - } - - /** Constructor - * @param main - main class */ - public PauseMenu(Main main) { + pausedTexture.dispose(); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/ShipSelector.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/ShipSelector.java index bd669ddaebd0283bbcf794cf4070d2e06b584361..8f35a81b4c9a36af6fc95ec6ad7d5fdd50d42e51 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/ShipSelector.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/Screen/ShipSelector.java @@ -1,31 +1,30 @@ package com.galaxytrucker.galaxytruckerreloaded.View.Screen; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; -import com.badlogic.gdx.audio.Music; -import com.badlogic.gdx.audio.Sound; -import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.scenes.scene2d.ui.List; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.utils.viewport.FitViewport; +import com.badlogic.gdx.utils.viewport.Viewport; +import com.galaxytrucker.galaxytruckerreloaded.Controller.HangerController; import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.CreateGameButton; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.DifficultyButton; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.ShipSelectButton; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.MenuButtons.SinglePlayerButton; +import java.util.LinkedList; +import java.util.List; + /** * Ship selector screen when creating new game */ public class ShipSelector implements Screen { - /** - * Sprite batch - */ - private SpriteBatch batch; + private Main main; - /** - * Orthographic camera - */ - private OrthographicCamera camera; + private Stage stage; /** * Background @@ -53,14 +52,40 @@ public class ShipSelector implements Screen { private SinglePlayerButton singlePlayerButton; /** - * Looping music + * button to create game */ - private Music music; + private CreateGameButton createGameButton; - /** - * Click sound effect - */ - private Sound clickSound; + private HangerController controller; + + private Viewport viewport; + + /** Constructor + * @param main - main class */ + public ShipSelector(Main main){ + this.main = main; + controller = new HangerController(); + //TODO methode um m枚gliche schiffe zu bekommen, dann f眉r jeden eine Textur in liste + einen button + + background = new Texture("1080p.png"); + + viewport = new FitViewport(main.WIDTH, main.HEIGHT); + stage = new Stage(viewport); + + singlePlayerButton = new SinglePlayerButton(main.WIDTH-100, main.HEIGHT-100, 248, 50, this); + stage.addActor(singlePlayerButton); + difficulties = new LinkedList<>(); + for(int i=0; i<=3; i++) { + DifficultyButton difficulty1 = new DifficultyButton(main.WIDTH-100, main.HEIGHT/2 - 100 - 75*i, 248, 50, this, i); + difficulties.add(difficulty1); + stage.addActor(difficulty1); + } + + createGameButton = new CreateGameButton(main.WIDTH/2, main.HEIGHT/2, 248, 50, this); + stage.addActor(createGameButton); + + Gdx.input.setInputProcessor(stage); + } @Override public void show() { @@ -69,12 +94,17 @@ public class ShipSelector implements Screen { @Override public void render(float delta) { - + Gdx.gl.glClearColor(0, 0, 0, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + main.batch.begin(); + main.batch.draw(background, 0, 0, main.WIDTH, main.HEIGHT); + main.batch.end(); + stage.draw(); } @Override public void resize(int width, int height) { - + viewport.update(width, height); } @Override @@ -94,7 +124,8 @@ public class ShipSelector implements Screen { @Override public void dispose() { - + background.dispose(); + stage.dispose(); } /** @@ -110,7 +141,7 @@ public class ShipSelector implements Screen { * @param ship the index of the ship in the list of possible ships */ public void setShip(int ship) { - + //TODO was f眉r 1 username?? } /** @@ -121,7 +152,11 @@ public class ShipSelector implements Screen { } - /** Constructor TODO wie werden die schiffe dargestellt - * @param main - main class */ - public ShipSelector(Main main){} + /** + * start the game + */ + public void startGame() { + main.setScreen(new GamePlay(main)); //TODO nur f眉r tests!!! + dispose(); + } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/EnemyShipInfo/EnemyHullUI.java~RasmusAaron b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/EnemyShipInfo/EnemyHullUI.java~RasmusAaron deleted file mode 100644 index d9910d678464dc20392d81dbd1821839ab2316d6..0000000000000000000000000000000000000000 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/EnemyShipInfo/EnemyHullUI.java~RasmusAaron +++ /dev/null @@ -1,74 +0,0 @@ -package com.galaxytrucker.galaxytruckerreloaded.View.UI.EnemyShipInfo; - -import com.badlogic.gdx.graphics.OrthographicCamera; -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.scenes.scene2d.ui.List; -import com.galaxytrucker.galaxytruckerreloaded.Main; - -public class EnemyHullUI { - - /** - * SpriteBatch - */ - private SpriteBatch batch; - - /** - * Orthographic camera - */ - private OrthographicCamera camera; - - /** - * the texture for the background - */ - private Texture HullBackground; - - /** - * the textures to display the current status of the hull - */ - private List<Texture> hullStatusTextures; - - - /** - * the status needs to be updated - * @param status the new status - */ - public void hullStatusUpdate(int status) { - - } - - /** - * Setup called after initialisation - */ - private void setup() { - } - - /** - * show the enemy hull ui - */ - public void showEnemyHullUI() { - - } - - /** - * hide the enemy hull ui - */ - public void hideEnemyHullUI() { - - } - - /** - * dispose of the enemy hull UI - */ - public void disposeEnemyHullUI() { - - } - - /** - * constructor - * @param main the main class - */ - public EnemyHullUI(Main main) { - - } -} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/EventGUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/EventGUI.java index fc9f5a3f08b4be110eab62c8eb0d4f2c3dcbcebb..8c27b87b2696b72b651e5cfde07c16f9a29207be 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/EventGUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/EventGUI.java @@ -1,12 +1,15 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.Events; -import com.badlogic.gdx.graphics.OrthographicCamera; + import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.scenes.scene2d.ui.List; +import com.badlogic.gdx.scenes.scene2d.Stage; +import java.util.List; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.Model.Map.PlanetEvent; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.EventPageButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GamePlay; + +import java.util.LinkedList; /** * Shows an event @@ -15,26 +18,11 @@ import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.EventP */ public class EventGUI { - /** - * SpriteBatch - */ - private SpriteBatch batch; - - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** * Event pages */ private List<EventPage> eventPages; - /** - * First event page - */ - private EventPage firstPage; - /** * what kind of event it is */ @@ -53,29 +41,93 @@ public class EventGUI { */ private Texture backgroundTexture; + /** + * the main class extending game + */ + private Main main; /** - * Setup called after initialisation + * the current page */ - private void setup() { - } + private EventPage currentPage; /** - * Show the event gui + * the game play screen */ - public void showEventGUI() { - } + private GamePlay game; /** - * Hide the event gui + * Constructor + * + * @param main - main class object for SpriteBatch + * @param event what kind of event it is + * */ - public void hideEventGUI() { + public EventGUI(Main main, PlanetEvent event, Stage stage, GamePlay game) { + this.main = main; + this.event = event; + this.game = game; + + backgroundTexture = new Texture("event/eventbackground.png"); + + nextPage = new EventPageButton(0, 0, 10, 10, this); //TODO whxy + stage.addActor(nextPage); + + eventPages = new LinkedList<>(); + + List<Texture> drawables = new LinkedList<>(); + + if(event == PlanetEvent.SHOP) { + currentPage = new EventPage(main, drawables, "this is a shop", 0, 0); //TODO drawables, xy + eventPages.add(currentPage); + } + else if(event == PlanetEvent.COMBAT) { + currentPage = new EventPage(main, drawables, "this is a fight", 0, 0); //TODO drawables, xy + eventPages.add(currentPage); + } + else if(event == PlanetEvent.BOSS) { + currentPage = new EventPage(main, drawables, "this is the boss", 0, 0); + eventPages.add(currentPage); + } + else if(event == PlanetEvent.METEORSHOWER) { + currentPage = new EventPage(main, drawables, "this is a meteor shower", 0, 0); + eventPages.add(currentPage); + } + else if(event == PlanetEvent.NEBULA) { + currentPage = new EventPage(main, drawables, "this is a nebula", 0, 0); + eventPages.add(currentPage); + } + else if(event == PlanetEvent.PVP) { + currentPage = new EventPage(main, null, "this is a pvp fight", 0, 0); + eventPages.add(currentPage); + } + else { //VOID + currentPage = new EventPage(main, null, "this planet is empty", 0, 0); + eventPages.add(currentPage); + } } /** * Dispose eventGUI */ public void disposeEventGUI() { + backgroundTexture.dispose(); + nextPage.remove(); + for(EventPage p : eventPages) { + p.disposePage(); + } + game.deleteEvent(); + } + + /** + * render + * no stage stuff + */ + public void render() { + main.batch.begin(); + main.batch.draw(backgroundTexture, 0, 0, 15, 15); + main.batch.end(); + currentPage.render(); } /** @@ -85,30 +137,32 @@ public class EventGUI { * * called by button */ - private void nextPage() { + public void nextPage() { + currentPage.disposePage(); + if(eventPages.size() > 0) { + currentPage = eventPages.remove(0); + } + else { + disposeEventGUI(); + } } + /** - * starts a fight, if the event is a fight + * Setup called after initialisation */ - private void startFight() { - + private void setup() { } /** - * opens a shop, if the event is a shop + * Show the event gui */ - private void openShop() { - + public void showEventGUI() { } /** - * Constructor - * - * @param main - main class object for SpriteBatch - * @param event what kind of event it is - * + * Hide the event gui */ - public EventGUI(Main main, PlanetEvent event) { + public void hideEventGUI() { } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/EventPage.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/EventPage.java index b161417f95f230ca9aeb7b2590571081c8f1e771..2c5b6b7b1c31cddabdda51ee2fcb67f08bbc76af 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/EventPage.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/EventPage.java @@ -1,64 +1,87 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.Events; -import com.badlogic.gdx.graphics.OrthographicCamera; + import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; -import com.badlogic.gdx.scenes.scene2d.ui.List; import com.galaxytrucker.galaxytruckerreloaded.Main; -import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.EventPageButton; + +import java.util.List; /** Includes all content shown on a single event page */ public class EventPage { /** - * SpriteBatch + * Icons to draw (such as rewards) */ - private SpriteBatch batch; + private List<Texture> drawables; /** - * Orthographic camera + * the text to display on this event page */ - private OrthographicCamera camera; + private String text; /** - * Icons to draw (such as rewards) + * the coordinates where drawing should begin */ - private List<Texture> drawables; + private float x, y; + /** + * the main game class + */ + private Main main; /** - * Setup called after initialisation + * Constructor + * + * @param main - the main class object + * @param draw the drawables on this page + * @param text the text displayed on this page */ - private void setup() { + public EventPage(Main main, List<Texture> draw, String text, float x, float y) { + drawables = draw; + this.text = text; + this.main = main; + this.x = x; + this.y = y; } + /** + * render + */ + public void render() { + main.batch.begin(); + int i = 0; + for(Texture t : drawables) { + main.batch.draw(t, x+i, y+i, 10, 10); + i += 15; + } + main.batch.end(); + } /** - * Draw on top of event gui + * Dispose of page */ - public void showPage() { + public void disposePage() { + for(Texture t : drawables) { + t.dispose(); + } } /** - * Hide the page + * Setup called after initialisation */ - public void hidePage() { + private void setup() { } + /** - * Dispose of page + * Draw on top of event gui */ - public void disposePage() { + public void showPage() { } /** - * Constructor - * - * @param main - the main class object - * @param draw the drawables on this page - * @param text the text displayed on this page + * Hide the page */ - public EventPage(Main main, List<Texture> draw, String text) { + public void hidePage() { } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/GameOver.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/GameOver.java index 470ec9daa852ffa5c15eb1e5050e70735ea7ab35..3894a37d4cc8f3dafa89781efbbbb177fb08135e 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/GameOver.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/GameOver.java @@ -1,9 +1,12 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.Events; import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.MainMenuButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GamePlay; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; /** * view for the event that the player has lost or won the game @@ -16,44 +19,70 @@ public class GameOver { private Texture gameOverTexture; /** - * Game won texture + * button to main menu */ - private Texture gameWonTexture; + private MainMenuButton menuButton; + + private Main main; + + private Stage stage; + + private GamePlay game; /** - * button to main menu + * Constructor + * + * @param main - main class */ - private MainMenuButton menuButton; + public GameOver(Main main, Stage stage, boolean won, GamePlay game) { + this.main = main; + this.stage = stage; + this.game = game; + + if(won) { + gameOverTexture = new Texture("gameover/victory_background.png"); + } + else { + gameOverTexture = new Texture("gameover/gameover_main.png"); + } + + menuButton = new MainMenuButton(0, 0, 10, 10, main); //TODO whxy + stage.addActor(menuButton); + + } /** - * Setup called after initialisation + * Dispose of the ui */ - private void setup() { + public void disposeGameoverUI() { + gameOverTexture.dispose(); + menuButton.remove(); } /** - * show the ui + * render stuff except stage stuff */ - public void showGameOverUI() { + public void render() { + main.batch.begin(); + main.batch.draw(gameOverTexture, 0, 0, 10, 10); //TODO whxy + main.batch.end(); } /** - * hide the ui + * Setup called after initialisation */ - public void hideGameOverUI() { + private void setup() { } /** - * Dispose of the ui + * show the ui */ - public void disposeGameoverUI() { + public void showGameOverUI() { } /** - * Constructor - * - * @param main - main class + * hide the ui */ - public GameOver(Main main) { + public void hideGameOverUI() { } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopElement.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopElement.java new file mode 100644 index 0000000000000000000000000000000000000000..cbefb9820bdb553b0915f877ca4bd928e18477e6 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopElement.java @@ -0,0 +1,123 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.UI.Events; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; +import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.ShopBuyButton; + +public class ShopElement { + + /** + * the main class extending game + */ + private Main main; + + /** + * the button with which to buy something + */ + private ShopBuyButton button; + + /** + * the texture of this element + */ + private Texture texture; + + /** + * the position on the screen + */ + private float x, y; + + /** + * the weapon, if this is a weapon + */ + private Weapon weapon; + + /** + * the crew member, if this is a crew member + */ + private Crew crew; + + /** + * the amount, if this is fuel, hp or missiles + */ + private int amount; + + /** + * the name (fuel, hp, or missiles) if this is one of those + */ + private String type; + + /** + * the shop ui this element is on + */ + private ShopUI shop; + + /** + * constructor + * @param main the main game class + * @param texture the texture for this element + */ + public ShopElement(Main main, Stage stage, Texture texture, float x, float y, ShopUI shop, Weapon weapon, Crew crew, int amount, String type) { + this.main = main; + this.texture = texture; + this.x = x; + this.y = y; + this.shop = shop; + this.weapon = weapon; + this.crew = crew; + this.amount = amount; + this.type = type; + + button = new ShopBuyButton(0, 0, 10, 10, this); //TODO whxy + stage.addActor(button); + } + + /** + * render no stage stuff + */ + public void render() { + main.batch.begin(); + main.batch.draw(texture, x, y, 10, 10); //TODO whxy + main.batch.end(); + } + + /** + * dispose of this ui + */ + public void disposeShopElement() { + texture.dispose(); + button.remove(); + shop.removeBuyElement(this); + } + + /** + * button was clicked, this item is to be bought + */ + public void buy() { + boolean success = false; + if(weapon != null) { + success = shop.buyWeapon(weapon); + } + else if(crew != null) { + success = shop.buyCrew(crew); + } + else if(type != null) { + switch (type) { + case "missiles": + success = shop.buyMissiles(amount); + break; + case "fuel": + success = shop.buyFuel(amount); + break; + case "hp": + success = shop.buyHp(amount); + break; + } + } + if(success) { + disposeShopElement(); + } + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopSellElement.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopSellElement.java new file mode 100644 index 0000000000000000000000000000000000000000..83cb1ce8f888e127a0b40b358e7593f53cf571cf --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopSellElement.java @@ -0,0 +1,116 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.UI.Events; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.ShopSellButton; +import lombok.Getter; + +@Getter +public class ShopSellElement { + + /** + * the main class extending game + */ + private Main main; + + /** + * the button with which to buy something + */ + private ShopSellButton button; + + /** + * the texture of this element + */ + private Texture texture; + + /** + * the position on the screen + */ + private float x, y; + + /** + * the weapon, if this is a weapon + */ + private Weapon weapon; + + /** + * the amount, if this is fuel, hp or missiles + */ + private int amount; + + /** + * the shop ui this element is on + */ + private ShopUI shop; + + /** + * the constructor + * @param main the main class + * @param stage the stage for buttons + * @param texture the texture for this element + * @param x the position + * @param y the position + * @param shop the shop this is on + * @param weapon the weapon if this represents a weapon + * @param amount the amount, if this represents missiles + */ + public ShopSellElement(Main main, Stage stage, Texture texture, float x, float y, ShopUI shop, Weapon weapon, int amount) { + this.main = main; + this.texture = texture; + this.x = x; + this.y = y; + this.shop = shop; + this.weapon = weapon; + this.amount = amount; + + button = new ShopSellButton(0, 0, 10, 10, this); + stage.addActor(button); + } + + /** + * dispose of the shop sell element + */ + public void disposeShopSellElement() { + shop.removeSellElement(this); + texture.dispose(); + button.remove(); + } + + public void render() { + main.batch.begin(); + main.batch.draw(texture, 0, 0, 10, 10); + main.batch.end(); + } + + /** + * buy something + */ + public void sell() { + boolean success = false; + if(weapon != null) { + success = sellWeapon(); + } + else { + success = sellMissiles(); + } + if(success) { + disposeShopSellElement(); + } + } + + /** + * sell a weapon + */ + private boolean sellWeapon() { + return shop.sellWeapon(weapon); + } + + /** + * sell missiles + */ + private boolean sellMissiles() { + return shop.sellMissiles(amount); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopUI.java index cb73080f3ce54265af8f5683ecfd10695371cf84..76cc4f212db079d5c563f108a2c5932fa9bcc5c2 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Events/ShopUI.java @@ -1,12 +1,18 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.Events; -import com.badlogic.gdx.graphics.OrthographicCamera; + import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.scenes.scene2d.ui.List; +import com.badlogic.gdx.scenes.scene2d.Stage; import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Trader; +import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.InventoryCloseButton; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.ShopBuyButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GamePlay; + +import java.util.LinkedList; +import java.util.List; /** @@ -18,70 +24,196 @@ import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.ShopBu public class ShopUI { /** - * SpriteBatch + * to close the shop */ - private SpriteBatch batch; + private InventoryCloseButton closeButton; /** - * Orthographic camera + * the background texture */ - private OrthographicCamera camera; + private Texture background; /** - * to close the shop + * the items that can be bought */ - private InventoryCloseButton closeButton; + private List<ShopElement> elements; /** - * list of textures to display stuff. each texture gets one button + * the items that can be sold */ - private List<Texture> textures; + private List<ShopSellElement> sellElements; /** - * buttons to buy stuff, set up in setup + * the main class extending game */ - private List<ShopBuyButton> buttons; + private Main main; /** - * Setup called after initialisation + * the screen all of this is on, for the buy/sell methods that need to communicate with the controllers */ - private void setup() { + private GamePlay game; + + /** + * constructor + * @param main the main class + */ + public ShopUI(Main main, Stage stage, GamePlay game, Trader trader, List<Weapon> shipWeapons, int shipMissiles) { + this.main = main; + this.game = game; + + // add all the items the trader has to offer to the ui + elements = new LinkedList<>(); + //crew stock + for(Crew c : trader.getCrewStock()) { + Texture t; + if(c.getName().equals("ana")) { + t = new Texture("crew/anaerobic.png"); + } + else if(c.getName().equals("battle")) { + t = new Texture("crew/battle.png"); + } + else { + t = new Texture("crew/energy.png"); //TODO wie sieht das mit namen aus? + } + elements.add(new ShopElement(main, stage, t, 0, 0, this, null, c, 0, null)); + } + //weapon stock + for(Weapon w : trader.getWeaponStock()) { + elements.add(new ShopElement(main, stage, new Texture("laser.png"), 0, 0, this, w, null, 0, null)); + } + //fuel + elements.add(new ShopElement(main, stage, new Texture("fuel.png"), 0, 0, this, null, null, trader.getFuelStock(), "fuel")); + //hp + elements.add(new ShopElement(main, stage, new Texture("hp.png"), 0, 0, this, null, null, trader.getHpStock(), "hp")); + //missiles/rockets + elements.add(new ShopElement(main, stage, new Texture("missiles.png"), 0, 0, this, null, null, trader.getMissileStock(), "missiles")); + + //add all the items that can be sold TODO geldanzeige immer 盲ndern + sellElements = new LinkedList<>(); + //missiles + sellElements.add(new ShopSellElement(main, stage, new Texture("missiles.png"), 0, 0, this, null, shipMissiles)); + //weapons + for(Weapon w : shipWeapons) { + sellElements.add(new ShopSellElement(main, stage, new Texture("laser.png"), 0, 0, this, w, 0)); + } + + closeButton = new InventoryCloseButton(0, 0, 10, 10, this, null); + stage.addActor(closeButton); + + background = new Texture("shop/storeback.png"); } /** - * Show the shop ui + * buy a weapon from the trader + * @param weapon the weapon */ - public void showShopUI() { + boolean buyWeapon(Weapon weapon) { + return game.buyWeapon(weapon); } /** - * Hide the shop ui + * buy a crew member from the trader + * @param crew the crew member */ - public void hideShopUI() { + boolean buyCrew(Crew crew) { + return game.buyCrew(crew); + } + + /** + * buy fuel from the trader + * @param amount the amount of fuel + */ + boolean buyFuel(int amount) { + return game.buyFuel(amount); + } + + /** + * buy missiles from the trader + * @param amount the amount of missiles + */ + boolean buyMissiles(int amount) { + return game.buyMissiles(amount); + } + + /** + * buy hp from the trader + * @param amount the amount of hp + */ + boolean buyHp(int amount) { + return game.buyHp(amount); + } + + /** + * sell missiles to the trader + * @param amount the amount + * @return successful? + */ + boolean sellMissiles(int amount) { + return game.sellMissiles(amount); + } + + /** + * sell weapon to trader + * @param weapon the weapon + */ + boolean sellWeapon(Weapon weapon) { + return game.sellWeapon(weapon); } /** * Dispose shop ui */ public void disposeShopUI() { + for(ShopElement e : elements) { + e.disposeShopElement(); + } + closeButton.remove(); + background.dispose(); + game.deleteShop(); } /** - * an item is bought - * called by button - * @param item the item (index in the list) + * remove a buyable element */ - public void buy(int item) { + public void removeBuyElement(ShopElement e) { + elements.remove(e); //TODO add to the list of sellable, if weapon/missiles + } + /** + * remove a sellable element + * @param e the element + */ + public void removeSellElement(ShopSellElement e) { + sellElements.remove(e); //TODO add to the list of buyable items } + /** + * render without stage stuff + */ + public void render() { + main.batch.begin(); + main.batch.draw(background, 0, 0, 10, 10); //TODO whxy + main.batch.end(); + for(ShopElement e : elements) { + e.render(); + } + } /** - * constructor - * @param main the main class - * TODO wie werden hier die objekte die zum verkauf stehen 眉bergeben? + * Setup called after initialisation + */ + private void setup() { + } + + /** + * Show the shop ui */ - public ShopUI(Main main) { + public void showShopUI() { + } + /** + * Hide the shop ui + */ + public void hideShopUI() { } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryCrewSlotUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryCrewSlotUI.java index a01a97d94a81fea17b4dc69a5a5ce1c66e75eaa6..23202b09d033832ca2bbc65983bbc92572a5da11 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryCrewSlotUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryCrewSlotUI.java @@ -1,7 +1,9 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.Inventory; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.scenes.scene2d.ui.List; + +import java.util.LinkedList; +import java.util.List; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; @@ -15,6 +17,16 @@ public class InventoryCrewSlotUI extends InventorySlotUI { */ private Texture crewTexture; + /** + * the textures to display the health status + */ + private Texture healthStatus; + + /** + * the surrounding box for the health bar + */ + private Texture healthBox; + /** * the name of the crew member */ @@ -30,23 +42,50 @@ public class InventoryCrewSlotUI extends InventorySlotUI { */ private int maxhealth; - /** - * the textures to display the health status - */ - private List<Texture> healthStatus; + private int currTexture; /** - * show the ui + * Constructor + * + * @param main - main class */ - public void showInventorySlotUI() { + public InventoryCrewSlotUI(Main main, Crew crew, float x, float y) { + super(main, x, y); + + name = crew.getName(); + health = crew.getHealth(); + maxhealth = crew.getMaxhealth(); + currTexture = (int) (((float) health/maxhealth) * 10); + healthStatus = new Texture("gameuis/energybar.png"); + healthBox = new Texture("crew/health_box.png"); + + if(crew.getName().equals("ana")) { + crewTexture = new Texture("crew/anaerobic.png"); + } + else if(crew.getName().equals("battle")) { + crewTexture = new Texture("crew/battle.png"); + } + else { + crewTexture = new Texture("crew/energy.png"); //TODO wie sieht das mit namen aus? + } } /** - * Hide inventory slot ui + * render + * without stage stuff */ - public void hideInventorySlotUI() { - + public void render() { + super.render(); + main.batch.begin(); + main.batch.draw(crewTexture, posX, posY, 72, 72); //48 + main.batch.draw(healthBox, posX+5, posY-15, 50, 15); + float x = posX+11; + for(int i=0;i<currTexture;i++) { + main.batch.draw(healthStatus, x, posY-10, 4, 5); + x+=4; + } + main.batch.end(); } /** @@ -54,15 +93,24 @@ public class InventoryCrewSlotUI extends InventorySlotUI { */ @Override public void disposeInventorySlotUI() { + super.disposeInventorySlotUI(); + crewTexture.dispose(); + healthStatus.dispose(); + healthBox.dispose(); } /** - * Constructor - * - * @param main - main class + * show the ui */ - public InventoryCrewSlotUI(Main main, Crew crew) { - super(main); + public void showInventorySlotUI() { + + } + + /** + * Hide inventory slot ui + */ + public void hideInventorySlotUI() { + } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryIntSlotUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryIntSlotUI.java index 457cefef746dd644ac1c44d69650699e01314d2f..3590eb42144ec465e9500cc94a4103c14ce96b7f 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryIntSlotUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryIntSlotUI.java @@ -21,35 +21,50 @@ public class InventoryIntSlotUI extends InventorySlotUI { private String text; /** - * show the ui + * Constructor + * + * @param main - main class */ - @Override - public void showInventorySlotUI() { - + public InventoryIntSlotUI(Main main, int value, float x, float y, String text) { + super(main, x, y); + this.value = value; + this.text = text; + //texture = new Texture(); } /** - * Hide inventory slot ui + * Dispose inventory slot ui */ @Override - public void hideInventorySlotUI() { + public void disposeInventorySlotUI() { + super.disposeInventorySlotUI(); + //texture.dispose(); + } + /** + * render + * without stage stuff + */ + public void render() { + super.render(); + /*main.batch.begin(); + main.batch.draw(texture, 0, 0, 0, 0);//TODO whxy + main.batch.end();*/ } /** - * Dispose inventory slot ui + * show the ui */ @Override - public void disposeInventorySlotUI() { + public void showInventorySlotUI() { } /** - * Constructor - * - * @param main - main class + * Hide inventory slot ui */ - public InventoryIntSlotUI(Main main, int value) { - super(main); + @Override + public void hideInventorySlotUI() { + } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventorySlotUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventorySlotUI.java index 99397262611de9bcb326f65bb3e0c312758d7cdc..ae6f80c72b99524701036634ce483301dd948fa2 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventorySlotUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventorySlotUI.java @@ -7,51 +7,62 @@ import com.galaxytrucker.galaxytruckerreloaded.Main; public abstract class InventorySlotUI { - /** - * Sprite batch for rendering - */ - private SpriteBatch batch; - - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** * Inventory slot position x */ - private float posX; + protected float posX; /** * Inventory slot position y */ - private float posY; + protected float posY; /** * Inventory slot background */ private Texture inventorySlotTexture; + protected Main main; + /** - * show the ui + * Constructor + * + * @param main - main class */ - public abstract void showInventorySlotUI(); + public InventorySlotUI(Main main, float x, float y) { + this.main = main; + + posX = x; + posY = y; + + //inventorySlotTexture = new Texture(); + } /** - * Hide inventory slot ui + * render + * without stage stuff */ - public abstract void hideInventorySlotUI(); + public void render() { + /*main.batch.begin(); + main.batch.draw(inventorySlotTexture, posX, posY, 0, 0); //TODO wh + main.batch.end();*/ + } /** * Dispose inventory slot ui */ - public abstract void disposeInventorySlotUI(); + public void disposeInventorySlotUI() { + //inventorySlotTexture.dispose(); + } /** - * Constructor - * - * @param main - main class + * show the ui */ - public InventorySlotUI(Main main) { - } + public abstract void showInventorySlotUI(); + + /** + * Hide inventory slot ui + */ + public abstract void hideInventorySlotUI(); + } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryUI.java index c10f9f4e8a9990dbbf874da00a91b8fd54438b85..1f5804f9454689358d5a9e56261470c2b10b1f26 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryUI.java @@ -1,28 +1,19 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.Inventory; -import com.badlogic.gdx.graphics.OrthographicCamera; + import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; -import com.badlogic.gdx.scenes.scene2d.ui.List; +import com.badlogic.gdx.scenes.scene2d.Stage; + +import java.util.LinkedList; +import java.util.List; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; -import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.InventoryCloseButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView; public class InventoryUI { - /** - * Sprite batch - */ - private SpriteBatch batch; - - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** * Inventory background texture */ @@ -38,41 +29,94 @@ public class InventoryUI { */ private InventoryCloseButton closeButton; + private Main main; + + private Stage stage; + + private ShipView shipView; + + private float x, y; + /** - * setup called after initialisation + * Constructor * - * here the inventory slots are initialised for fuel, missiles, crew, weapons, and money + * @param main - main class + * @param crew the crew members + * @param weapons the weapons */ - private void setup() { + public InventoryUI(Main main, List<Crew> crew, List<Weapon> weapons, int fuel, int missiles, Stage stage, ShipView shipView) { + this.main = main; + this.stage = stage; + this.shipView = shipView; + + inventoryBackground = new Texture("inventory/inventory.png"); + + x = main.WIDTH/2 - inventoryBackground.getWidth()/2; + y = main.HEIGHT/2 - inventoryBackground.getHeight()/2; + + closeButton = new InventoryCloseButton(x+750, y+5, 248, 50, null, this); + stage.addActor(closeButton); + + slots = new LinkedList<>(); + float cx = x + 25; + float cy = y + 560; + for(Crew c : crew) { + slots.add(new InventoryCrewSlotUI(main, c, cx, cy)); + cy -= 80; + } + float wy = y + 550; + float wx = cx + 200; + for(Weapon w : weapons) { + slots.add(new InventoryWeaponSlotUI(main, w, wx, wy)); + wy -=90; + } + slots.add(new InventoryIntSlotUI(main, fuel, wx+200, y+550, "fuel")); //TODO xy + slots.add(new InventoryIntSlotUI(main, missiles, wx+200, y+750, "missiles")); //TODO xy } /** - * show the inventory + * render + * no stage stuff */ - public void showInventoryUI() { + public void render() { + main.batch.begin(); + main.batch.draw(inventoryBackground, x, y, 900, 706); + main.batch.end(); + + for(InventorySlotUI u : slots) { + u.render(); + } } /** - * hide the inventory + * Dispose of inventory */ - public void hideInventoryUI() { + public void disposeInventoryUI() { + inventoryBackground.dispose(); + for(InventorySlotUI u : slots) { + u.disposeInventorySlotUI(); + } + shipView.deleteInventory(); + closeButton.remove(); } /** - * Dispose of inventory + * setup called after initialisation + * + * here the inventory slots are initialised for fuel, missiles, crew, weapons, and money */ - public void disposeInventoryUI() { + private void setup() { } + /** + * show the inventory + */ + public void showInventoryUI() { + } /** - * Constructor - * - * @param main - main class - * @param crew the crew members - * @param weapons the weapons - * @param integerValues the integer values to be displayed for a ship + * hide the inventory */ - public InventoryUI(Main main, List<Crew> crew, List<Weapon> weapons, List<Integer> integerValues) { + public void hideInventoryUI() { } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryWeaponSlotUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryWeaponSlotUI.java index 3dd1b12501e90c50779fb86bd30faee7814a03dc..b38e81405471aa4e52332e5bf2d2215f7202d706 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryWeaponSlotUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Inventory/InventoryWeaponSlotUI.java @@ -30,26 +30,53 @@ public class InventoryWeaponSlotUI extends InventorySlotUI { private float precision; /** - * show the ui + * constructor + * @param main the main class + * @param weapon the weapon to be displayed + */ + public InventoryWeaponSlotUI(Main main, Weapon weapon, float x, float y) { + super(main, x, y); + damage = weapon.getDamage(); + cooldown = weapon.getCooldown(); + energy = weapon.getEnergy(); + missileCost = weapon.getMissileCost(); + dropchance = weapon.getDropChance(); + crewdamage = weapon.getCrewDamage(); + burst = weapon.getBurst(); + precision = weapon.getPrecision(); + + weaponTexture = new Texture("shipsys/weapon/laser.png"); + } + + /** + * Dispose inventory slot ui */ @Override - public void showInventorySlotUI() { + public void disposeInventorySlotUI() { + super.disposeInventorySlotUI(); + weaponTexture.dispose(); + } + public void render() { + super.render(); + main.batch.begin(); + main.batch.draw(weaponTexture, posX, posY, 22, 67); + main.batch.end(); } /** - * Hide inventory slot ui + * show the ui */ @Override - public void hideInventorySlotUI() { + public void showInventorySlotUI() { } /** - * Dispose inventory slot ui + * Hide inventory slot ui */ @Override - public void disposeInventorySlotUI() { + public void hideInventorySlotUI() { } @@ -60,13 +87,4 @@ public class InventoryWeaponSlotUI extends InventorySlotUI { { } - - /** - * constructor - * @param main the main class - * @param weapon the weapon to be displayed - */ - public InventoryWeaponSlotUI(Main main, Weapon weapon) { - super(main); - } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Map/MapUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Map/MapUI.java index a184108258c7d767e2a07eba31fa27f95201ff8f..2bf3cf9fdca92bd8d4bc8aeb6f7a891e6862a5ff 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Map/MapUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Map/MapUI.java @@ -1,51 +1,107 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.Map; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.Stage; import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.MapButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView; + +import java.util.LinkedList; +import java.util.List; public class MapUI { /** - * Sprite batch + * Map texture background */ - private SpriteBatch batch; + private Texture mapTexture; + + private List<MapButton> locations; + + private Main main; + + private Stage stage; + + private ShipView shipView; + + private float x; + private float y; /** - * Map texture + * Constructor + * @param main - main class */ - private Texture mapTexture; + public MapUI(Main main, Stage stage, Overworld map, ShipView shipView) { + this.main = main; + this.stage = stage; + this.shipView = shipView; + + mapTexture = new Texture("map/map_overlay.png"); + x = main.WIDTH/2 - mapTexture.getWidth()/2; + y = main.HEIGHT/2 - mapTexture.getHeight()/2; + + locations = new LinkedList<>(); + for(String f : map.getPlanetMap().keySet()) { + float fx = Float.parseFloat(f.split(",")[0]); + float fy = Float.parseFloat(f.split(",")[1]); + MapButton mb = new MapButton(new Texture("map/map_button.png"), (x+fx), (y+fy), 10, 10, this, map.getPlanetMap().get(f)); + locations.add(mb); + stage.addActor(mb); + } + } /** - * Setup called after initialisation + * render + * no stage stuff */ - private void setup() { + public void render() { + main.batch.begin(); + main.batch.draw(mapTexture, x, y, 1160, 626); + main.batch.end(); } /** - * show the ui + * Dispose of ui */ - public void showMapUI() { + public void disposeMapUI() { + mapTexture.dispose(); + for(MapButton m : locations) { + m.remove(); + } + shipView.deleteMap(); + } /** - * hide the ui + * move to new planet + * called by mapbutton + * @param planet the new planet */ - public void hideMapUI() { + public void moveToPlanet(Planet planet) { + boolean success = shipView.travel(planet); + if(success) { + disposeMapUI(); + } } /** - * Dispose of ui + * Setup called after initialisation */ - public void disposeMapUI() { + private void setup() { } /** - * Constructor - * TODO die map hier 眉bergeben in irgendeiner form, evtl attribute hinzuf眉gen - * @param main - main class + * show the ui */ - public MapUI(Main main) { + public void showMapUI() { + } + + /** + * hide the ui + */ + public void hideMapUI() { } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/AudioUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/AudioUI.java new file mode 100644 index 0000000000000000000000000000000000000000..31fec312ae91e1cc2f192ed443d6b3f6ece18684 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/AudioUI.java @@ -0,0 +1,101 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.UI.Options; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.General.BackButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GamePlay; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; + +public class AudioUI { + + private Texture audioBackgroundTexture; + private Main main; + private GamePlay gamePlay; + private OptionUI optionUI; + private float x, y; + private BackButton backButton; + private Stage stage; + private MainMenu mainMenu; + + /** + * Constructor + * @param main + * @param stage + * @param gamePlay + */ + public AudioUI(Main main, Stage stage, GamePlay gamePlay, MainMenu mainMenu) { + this.main = main; + this.gamePlay = gamePlay; + this.stage = stage; + this.mainMenu = mainMenu; + //this.optionUI = gamePlay.getOptionUI(); + if(gamePlay!=null) { + this.optionUI = gamePlay.getOptionUI(); + } + else if(mainMenu != null) { + this.optionUI = mainMenu.getOptionUI(); + } + audioBackgroundTexture = new Texture("options/audio.png"); + + x = main.WIDTH / 2 - audioBackgroundTexture.getWidth() / 2; + y = main.HEIGHT / 2 - audioBackgroundTexture.getHeight() / 2; + + backButton = new BackButton(x + 220, y + 100, 128, 24, optionUI, this); + + stage.addActor(backButton); + } + + /** + * render + * no stage stuff + */ + public void render() { + updateInput(); + main.batch.begin(); + main.batch.draw(audioBackgroundTexture, x, y, 601, 471); + main.batch.end(); + + stage.draw(); + } + + /** + * Dispose of options ui + */ + public void disposeAudioUI() { + audioBackgroundTexture.dispose(); + backButton.remove(); + if(gamePlay != null){ + gamePlay.deleteAudioUI(); + } + else if(mainMenu != null){ + mainMenu.deleteAudioUI(); + } + } + + /** + * Open the options menu + */ + public void showGeneralUI() { + backButton.setVisible(true); + } + /** + * Close the options menu + */ + public void hideGeneralUI() { + backButton.setVisible(false); + } + + /** + * handles input to pause game, open options + */ + public void updateInput() { + if(Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) { + disposeAudioUI();; + optionUI.showOptionsUI(); + } + } + +} \ No newline at end of file diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/ControlUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/ControlUI.java new file mode 100644 index 0000000000000000000000000000000000000000..0f11bf740f8954661e60845f4fe89eaf9da52f42 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/ControlUI.java @@ -0,0 +1,103 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.UI.Options; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.General.BackButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GamePlay; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; + +public class ControlUI { + + private Texture controleBackgroundTextuere; + private Main main; + private GamePlay gamePlay; + private OptionUI optionUI; + private float x, y; + private BackButton backButton; + private Stage stage; + private MainMenu mainMenu; + + /** + * Constructor + * @param main + * @param stage + * @param gamePlay + */ + public ControlUI(Main main, Stage stage, GamePlay gamePlay, MainMenu mainMenu) { + this.main = main; + this.gamePlay = gamePlay; + this.stage = stage; + //this.optionUI = gamePlay.getOptionUI(); + this.mainMenu = mainMenu; + + if(gamePlay!=null) { + this.optionUI = gamePlay.getOptionUI(); + } + else if(mainMenu != null) { + this.optionUI = mainMenu.getOptionUI(); + } + controleBackgroundTextuere = new Texture("options/control.png"); + + x = main.WIDTH / 2 - controleBackgroundTextuere.getWidth() / 2; + y = main.HEIGHT / 2 - controleBackgroundTextuere.getHeight() / 2; + + backButton = new BackButton(x + 220, y + 100, 128, 24, optionUI, this); + + stage.addActor(backButton); + } + + /** + * render + * no stage stuff + */ + public void render() { + updateInput(); + main.batch.begin(); + main.batch.draw(controleBackgroundTextuere, x, y, 601, 471); + main.batch.end(); + + stage.draw(); + } + + /** + * Dispose of options ui + */ + public void disposeControlUI() { + controleBackgroundTextuere.dispose(); + backButton.remove(); + if(gamePlay != null){ + gamePlay.deleteControlUI(); + } + else if(mainMenu != null){ + mainMenu.deleteControlUI(); + } + } + + /** + * Open the options menu + */ + public void showGeneralUI() { + backButton.setVisible(true); + } + /** + * Close the options menu + */ + public void hideGeneralUI() { + backButton.setVisible(false); + } + + /** + * handles input to pause game, open options + */ + public void updateInput() { + if(Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) { + disposeControlUI(); + optionUI.showOptionsUI(); + } + } + + +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/CreditsUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/CreditsUI.java new file mode 100644 index 0000000000000000000000000000000000000000..210b207f76148753622b0ec7d423404c0f8afc9e --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/CreditsUI.java @@ -0,0 +1,102 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.UI.Options; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.General.BackButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GamePlay; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; + +public class CreditsUI { + private Texture CreditBackgroundTexture; + private Main main; + private GamePlay gamePlay; + private OptionUI optionUI; + private float x, y; + private BackButton backButton; + private Stage stage; + private MainMenu mainMenu; + + /** + * Constructor + * @param main + * @param stage + * @param gamePlay + */ + public CreditsUI(Main main, Stage stage, GamePlay gamePlay, MainMenu mainMenu) { + this.main = main; + this.gamePlay = gamePlay; + this.stage = stage; + //this.optionUI = gamePlay.getOptionUI(); + this.mainMenu = mainMenu; + if(gamePlay!=null) { + this.optionUI = gamePlay.getOptionUI(); + } + else if(mainMenu != null) { + this.optionUI = mainMenu.getOptionUI(); + } + + CreditBackgroundTexture = new Texture("options/credits.png"); + + x = main.WIDTH / 2 - CreditBackgroundTexture.getWidth() / 2; + y = main.HEIGHT / 2 - CreditBackgroundTexture.getHeight() / 2; + + backButton = new BackButton(x + 220, y + 100, 128, 24, optionUI, this); + + stage.addActor(backButton); + } + + /** + * render + * no stage stuff + */ + public void render() { + updateInput(); + main.batch.begin(); + main.batch.draw(CreditBackgroundTexture, x, y, 601, 471); + main.batch.end(); + + stage.draw(); + } + + /** + * Dispose of options ui + */ + public void disposeCreditUI() { + CreditBackgroundTexture.dispose(); + backButton.remove(); + if(gamePlay != null){ + gamePlay.deleteCreditUI(); + } + else if(mainMenu != null){ + mainMenu.deleteCreditUI(); + } + } + + /** + * Open the options menu + */ + public void showCreditUI() { + backButton.setVisible(true); + } + /** + * Close the options menu + */ + public void hideCreditUI() { + backButton.setVisible(false); + } + + /** + * handles input to pause game, open options + */ + public void updateInput() { + if(Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) { + disposeCreditUI();; + optionUI.showOptionsUI(); + } + } + + +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/GeneralUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/GeneralUI.java new file mode 100644 index 0000000000000000000000000000000000000000..112ff7d2984a0f4a3648f1c26be8ceba1ffb6688 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/GeneralUI.java @@ -0,0 +1,138 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.UI.Options; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.General.BackButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GamePlay; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; + + +/** + * ingame options/general screen + */ +public class GeneralUI { + + /** + * background + */ + private Texture generalBackgroundTexture; + + /** + * Main instance of the running game. + */ + private Main main; + + /** + * Gameplay instance of the running game; + */ + private GamePlay gamePlay; + + private MainMenu mainMenu; + + /** + * OptionUI of the running Optionmenu. + */ + private OptionUI optionUI; + + /** + * Position of the Window + */ + private float x, y; + + /** + * Back Button + */ + private BackButton backButton; + + private Stage stage; + + /** + * Constructor + * @param main current Main instance + * @param stage current stage instance + * @param gamePlay current gameplay instance + */ + public GeneralUI (Main main, Stage stage, GamePlay gamePlay, MainMenu mainMenu) { + this.main = main; + this.gamePlay = gamePlay; + this.mainMenu = mainMenu; + this.stage = stage; + if(gamePlay != null) { + this.optionUI = gamePlay.getOptionUI(); + } + else if(mainMenu != null) { + this.optionUI = mainMenu.getOptionUI(); + } + generalBackgroundTexture = new Texture("options/general.png"); + + x = main.WIDTH / 2 - generalBackgroundTexture.getWidth() / 2; + y = main.HEIGHT / 2 - generalBackgroundTexture.getHeight() / 2; + + backButton = new BackButton(x + 220, y + 100, 128, 24, optionUI, this); + + stage.addActor(backButton); + } + + /** + * render + * no stage stuff + */ + public void render() { + updateInput(); + main.batch.begin(); + main.batch.draw(generalBackgroundTexture, x, y, 601, 471); + main.batch.end(); + + stage.draw(); + } + + /** + * Dispose of options ui + */ + public void disposeGeneralUI() { + generalBackgroundTexture.dispose(); + backButton.remove(); + if(gamePlay != null) { + gamePlay.deleteGeneralUI(); + } + else if(mainMenu != null) { + mainMenu.deleteGeneralUI(); + } + } + + /** + * Setup called after initialisation + */ + private void setup() { + } + + /** + * Open the options menu + */ + public void showGeneralUI() { + backButton.setVisible(true); + } + + /** + * Close the options menu + */ + public void hideGeneralUI() { + backButton.setVisible(false); + } + + /** + * handles input to pause game, open options + */ + public void updateInput() { + if(Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) { + disposeGeneralUI(); + optionUI.showOptionsUI(); + } + } + + + +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/OptionUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/OptionUI.java new file mode 100644 index 0000000000000000000000000000000000000000..e763124647b35dfe0bc4d65caaad959cac1c20f5 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/OptionUI.java @@ -0,0 +1,205 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.UI.Options; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Audio.AudioButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Control.ControlButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Credits.CreditsButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.General.GeneralButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.OptionenBackButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Video.VideoButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GamePlay; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; + +/** + * Ingame Option screen + */ +public class OptionUI { + + /** + * Options ui background + */ + private Texture optionsBackgroundTexture; + + private VideoButton videoButton; + + private OptionenBackButton optionenBackButton; + + private GeneralButton generalButton; + + private ControlButton controlButton; + + private CreditsButton creditsButton; + + private AudioButton audioButton; + + private Main main; + + private GamePlay game; + + private PauseMenuUI pauseMenuUI; + + private Stage stage; + + private float x, y; + + private MainMenu mainMenu; + + /** + * Constructor + * + * @param main - main class + */ + public OptionUI(Main main, Stage stage, GamePlay game, MainMenu mainMenu) { + this.main = main; + this.game = game; + this.stage = stage; + this.mainMenu = mainMenu; + if(game != null){this.pauseMenuUI = game.getPauseMenuUI(); } + optionsBackgroundTexture = new Texture("options/options.png"); + + x = main.WIDTH/2 - optionsBackgroundTexture.getWidth()/2; + y = main.HEIGHT/2 - optionsBackgroundTexture.getHeight()/2; + + optionenBackButton = new OptionenBackButton(x+220, y+(y/6), 128, 24, this, pauseMenuUI); + videoButton = new VideoButton(x+220, y+(2*y/6), 128, 24, this); + generalButton = new GeneralButton(x+220, y+(3*y/6), 128, 24, this); + controlButton = new ControlButton(x+ 220, y+ (4*y/6), 128, 24, this ); + creditsButton = new CreditsButton(x + 220, y + (5*y/6), 128, 24, this); + audioButton = new AudioButton(x +220, y+(6*y/6), 128, 24, this); + + stage.addActor(optionenBackButton); + stage.addActor(generalButton); + stage.addActor(videoButton); + stage.addActor(controlButton); + stage.addActor(creditsButton); + stage.addActor(audioButton); + } + + /** + * render + * no stage stuff + */ + public void render() { + updateInput(); + main.batch.begin(); + main.batch.draw(optionsBackgroundTexture, x, y, 601, 471); + main.batch.end(); + stage.draw(); + } + + /** + * Dispose of options ui + */ + public void disposeOptionsUI() { + optionsBackgroundTexture.dispose(); + optionenBackButton.remove(); + generalButton.remove(); + videoButton.remove(); + audioButton.remove(); + controlButton.remove(); + creditsButton.remove(); + if(mainMenu == null){ + game.deleteOptions(); + } + else{ + mainMenu.deleteOptions(); + } + } + + /** + * Setup called after initialisation + */ + private void setup() { + } + + /** + * Open the options menu + */ + public void showOptionsUI() { + generalButton.setVisible(true); + optionenBackButton.setVisible(true); + videoButton.setVisible(true); + audioButton.setVisible(true); + creditsButton.setVisible(true); + controlButton.setVisible(true); + + } + + /** + * Close the options menu + */ + public void hideOptionsUI() { + generalButton.setVisible(false); + optionenBackButton.setVisible(false); + videoButton.setVisible(false); + audioButton.setVisible(false); + creditsButton.setVisible(false); + controlButton.setVisible(false); + } + + /** + * handles input to pause game, open options + */ + public void updateInput() { + if(Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) { + disposeOptionsUI(); + if(pauseMenuUI!=null) { + pauseMenuUI.showPauseMenuUI(); + } + } + } + + public void openGeneral() { + this.hideOptionsUI(); + if(game!=null) { + game.createGeneralUI(); + } + else if(mainMenu!=null) { + mainMenu.createGeneralUI(); + } + } + + public void openVideo() { + this.hideOptionsUI(); + if(game!=null) { + game.createVideoUI(); + } + else if(mainMenu!=null) { + mainMenu.createVideoUI(); + } + } + + public void openCredits(){ + this.hideOptionsUI(); + if(game !=null){ + game.createCreditUI(); + } + else if(mainMenu != null){ + mainMenu.createCreditUI(); + } + } + + public void openAudio(){ + this.hideOptionsUI(); + if(game != null){ + game.createAudioUI(); + } + else if(mainMenu != null){ + mainMenu.createAudioUI(); + } + } + + public void openControl(){ + this.hideOptionsUI(); + if(game != null){ + game.createControlUI(); + } + else if(mainMenu != null){ + mainMenu.createControlUI(); + } + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/OptionsUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/OptionsUI.java deleted file mode 100644 index e0b97ed0e8b4348e5fb946945123dbd8175c7377..0000000000000000000000000000000000000000 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/OptionsUI.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.galaxytrucker.galaxytruckerreloaded.View.UI.Options; - -import com.badlogic.gdx.graphics.OrthographicCamera; -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; -import com.galaxytrucker.galaxytruckerreloaded.Main; -import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.ContinueButton; -import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.MainMenuButton; - -/** - * Ingame options UI - */ -public class OptionsUI { - - /** - * SpriteBatch - */ - private SpriteBatch batch; - - /** - * Orthographic camera - */ - private OrthographicCamera camera; - - /** - * Options ui background - */ - private Texture optionsBackgroundTexture; - - /** - * continue button - */ - private ContinueButton continueButton; - - /** - * main menu button - */ - private MainMenuButton mainMenuButton; - - /** - * Setup called after initialisation - */ - private void setup() { - } - - /** - * Open the options menu - */ - public void showOptionsUI() { - } - - /** - * Close the options menu - */ - public void hideOptionsUI() { - } - - /** - * Dispose of options ui - */ - public void disposeOptionsUI() { - } - - /** - * Constructor - * - * @param main - main class - */ - public OptionsUI(Main main) { - - } -} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/PauseMenuUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/PauseMenuUI.java new file mode 100644 index 0000000000000000000000000000000000000000..0c5f95ba2175932396578b88870a64fc65e45508 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/PauseMenuUI.java @@ -0,0 +1,126 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.UI.Options; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.ContinueButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.MainMenuButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GamePlay; + +/** + * Ingame options UI + */ +public class PauseMenuUI { + + /** + * Options ui background + */ + private Texture optionsBackgroundTexture; + + /** + * continue button + */ + private ContinueButton continueButton; + + /** + * main menu button + */ + private MainMenuButton mainMenuButton; + + private Main main; + + private GamePlay game; + + private OptionUI optionUI; + + private Stage pauseStage; + + /** + * Options button + */ + private OptionButton optionButton; + + private float x, y; + + /** + * Constructor + * + * @param main - main class + */ + public PauseMenuUI(Main main, Stage pauseStage, GamePlay game) { + this.main = main; + this.game = game; + this.pauseStage = pauseStage; + + optionsBackgroundTexture = new Texture("options/pause.PNG"); + + x = main.WIDTH/2 - optionsBackgroundTexture.getWidth()/2; + y = main.HEIGHT/2 - optionsBackgroundTexture.getHeight()/2; + + continueButton = new ContinueButton(x+220, y+220, 128, 24, this); + mainMenuButton = new MainMenuButton(x+220, y+270, 128, 24, main); + optionButton = new OptionButton(x+220,y+320,128,24, this); + + pauseStage.addActor(continueButton); + pauseStage.addActor(mainMenuButton); + pauseStage.addActor(optionButton); + } + + /** + * render + * no stage stuff + */ + public void render() { + main.batch.begin(); + main.batch.draw(optionsBackgroundTexture, x, y, 601, 471); + main.batch.end(); + + pauseStage.draw(); + } + + /** + * Dispose of options ui + */ + public void disposePauseMenuUI() { + //optionsBackgroundTexture.dispose(); + //continueButton.remove(); + //mainMenuButton.remove(); + //optionButton.remove(); + optionsBackgroundTexture.dispose(); + pauseStage.dispose(); + game.deletePauseMenu(); + + } + + /** + * Setup called after initialisation + */ + private void setup() { + } + + /** + * Open the options menu + */ + public void showPauseMenuUI() { + continueButton.setVisible(true); + mainMenuButton.setVisible(true); + optionButton.setVisible(true); + } + + /** + * Close the options menu + */ + public void hidePauseMenuUI() { + continueButton.setVisible(false); + mainMenuButton.setVisible(false); + optionButton.setVisible(false); + } + + public void openOptions () { + this.hidePauseMenuUI(); + game.createOptions(); + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/VideoUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/VideoUI.java new file mode 100644 index 0000000000000000000000000000000000000000..7a2193f12d120676b0f912de575ba4446be46536 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Options/VideoUI.java @@ -0,0 +1,148 @@ +package com.galaxytrucker.galaxytruckerreloaded.View.UI.Options; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Video.BackButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Video.WindowedButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.OptionButtons.Video.FullscreenEnableButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GamePlay; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.MainMenu; + +public class VideoUI { + + /** + * background + */ + private Texture backgroundTexture; + + /** + * Main instance of the running game. + */ + private Main main; + + /** + * Gameplay instance of the running game; + */ + private GamePlay gamePlay; + + private MainMenu mainMenu; + + /** + * OptionUI of the running Optionmenu. + */ + private OptionUI optionUI; + + /** + * Position of the Window + */ + private float x, y; + + /** + * Back Button + */ + private BackButton backButton; + + private FullscreenEnableButton fullscreenEnableButton; + + private WindowedButton windowedButton; + + private Stage stage; + + /** + * Constructor + * @param main current Main instance + * @param stage current stage instance + * @param gamePlay current gameplay instance + */ + public VideoUI (Main main, Stage stage, GamePlay gamePlay, MainMenu mainMenu) { + this.main = main; + this.gamePlay = gamePlay; + this.mainMenu = mainMenu; + if(gamePlay!=null) { + this.optionUI = gamePlay.getOptionUI(); + } + else if(mainMenu != null) { + this.optionUI = mainMenu.getOptionUI(); + } + this.stage = stage; + backgroundTexture = new Texture("options/video.png"); + + x = main.WIDTH / 2 - backgroundTexture.getWidth() / 2; + y = main.HEIGHT / 2 - backgroundTexture.getHeight() / 2; + + + backButton = new BackButton(x + 220, y + 100, 128, 24, optionUI, this); + windowedButton = new WindowedButton(x + 220+65, y + 320, 128, 24, main); + fullscreenEnableButton = new FullscreenEnableButton(x + 220-65, y + 320, 128, 24, main); + + stage.addActor(backButton); + stage.addActor(windowedButton); + stage.addActor(fullscreenEnableButton); + } + + /** + * render + * no stage stuff + */ + public void render() { + updateInput(); + main.batch.begin(); + main.batch.draw(backgroundTexture, x, y, 601, 471); + main.batch.end(); + + stage.draw(); + } + + /** + * Dispose of options ui + */ + public void disposeVideoUI() { + backgroundTexture.dispose(); + backButton.remove(); + fullscreenEnableButton.remove(); + windowedButton.remove(); + if(gamePlay != null) { + gamePlay.deleteVideoUI(); + } + else if(mainMenu != null) { + mainMenu.deleteVideoUI(); + } + } + + /** + * Setup called after initialisation + */ + private void setup() { + } + + /** + * Open the options menu + */ + public void showVideoUI() { + backButton.setVisible(true); + windowedButton.setVisible(true); + fullscreenEnableButton.setVisible(true); + } + + /** + * Close the options menu + */ + public void hideVideoUI() { + backButton.setVisible(false); + windowedButton.setVisible(false); + fullscreenEnableButton.setVisible(false); + } + + /** + * handles input to pause game, open options + */ + public void updateInput() { + if(Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE)) { + disposeVideoUI(); + optionUI.showOptionsUI(); + } + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/AbstractShip.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/AbstractShip.java index e26a4675799c29e501a58fb0b9fd6c4f4e1d39d0..68763f5ff2b865645b0556633f3f5d4e49234979 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/AbstractShip.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/AbstractShip.java @@ -1,38 +1,57 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship; -import com.badlogic.gdx.graphics.OrthographicCamera; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.scenes.scene2d.ui.List; + +import java.util.LinkedList; +import java.util.List; + +import com.badlogic.gdx.scenes.scene2d.Stage; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; +import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GamePlay; import com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation.RoomUI; public abstract class AbstractShip { /** - * SpriteBatch + * HP */ - private SpriteBatch batch; + protected int hp; /** - * Orthographic camera + * Shields */ - private OrthographicCamera camera; + protected int shields; /** - * HP + * the id of the ship */ - private int hp; + protected int id; + + protected Main main; + + protected Stage stage; + + protected GamePlay game; /** - * Shields + * Constructor + * + * @param main - the main class for SpriteBatch */ - private int shields; + public AbstractShip(Main main, Ship ship, Stage stage, GamePlay game) { + this.main = main; + this.stage = stage; + this.game = game; + hp = ship.getHp(); + shields = ship.getShields(); + id = ship.getId(); + } /** - * the rooms of the ship + * to render the ui */ - private List<RoomUI> rooms; + public abstract void render(); /** * show the ship @@ -61,11 +80,4 @@ public abstract class AbstractShip { */ public abstract void shieldStatusUpdate(int shieldvalue); - /** - * Constructor - * - * @param main - the main class for SpriteBatch - */ - public AbstractShip(Main main, Ship ship) { - } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/EnemyShip.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/EnemyShip.java index 8ae2709df594a1911363443e4bd264e0a3e21887..663110a39da5e92288b371dd9457dcf757229edd 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/EnemyShip.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/EnemyShip.java @@ -1,9 +1,11 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship; import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.List; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GamePlay; import com.galaxytrucker.galaxytruckerreloaded.View.UI.EnemyShipInfo.EnemyHullUI; import com.galaxytrucker.galaxytruckerreloaded.View.UI.EnemyShipInfo.EnemySystemUI; @@ -24,6 +26,14 @@ public class EnemyShip extends AbstractShip { */ private EnemyHullUI hull; + /** + * to render the ui + */ + @Override + public void render() { + + } + /** * show the ship */ @@ -105,7 +115,7 @@ public class EnemyShip extends AbstractShip { * TODO methods to access all shipinfo stuff * @param main - the main class for SpriteBatch */ - public EnemyShip(Main main, Ship ship) { - super(main, ship); + public EnemyShip(Main main, Ship ship, Stage stage, GamePlay game) { + super(main, ship, stage, game); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/ShipView.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/ShipView.java index 3558c732a2cf983000bc1c3b799602e8b640ddab..21442971f00500ecf896ea3626c9ef73b91b39aa 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/ShipView.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/Ship/ShipView.java @@ -1,20 +1,34 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.scenes.scene2d.ui.List; +import com.badlogic.gdx.scenes.scene2d.Stage; import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Overworld; +import com.galaxytrucker.galaxytruckerreloaded.Model.Map.Planet; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; +import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.AutofireButton; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.MoveButton; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.ShipButton; +import com.galaxytrucker.galaxytruckerreloaded.View.Screen.GamePlay; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Inventory.InventoryUI; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Map.MapUI; import com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation.*; +import java.util.HashMap; +import java.util.List; + public class ShipView extends AbstractShip { /** - * the uis of all the crew members + * the uis of the crew members, matched with their ids + */ + private HashMap<Integer, CrewUI> crew; + + /** + * rooms of the ship, key is system id */ - private List<CrewUI> crew; + private HashMap<Integer, RoomUI> rooms; /** * the energy ui of this ship @@ -42,16 +56,15 @@ public class ShipView extends AbstractShip { */ private MoveButton moveButton; - /** - * the weapon autofire button - */ - private AutofireButton weaponAutofire; - /** * the background texture of the ship */ private Texture shipBackground; + /** + * the room overlay + */ + private Texture shipRoomBackground; /** * the general background for the weapon display in the bottom left corner next to the energy status display @@ -59,32 +72,99 @@ public class ShipView extends AbstractShip { private Texture weaponGeneralBackground; /** - * for display in the upper left corner + * the map (needed for the mapui) */ - private Texture statusTexture; + private Overworld map; + /** - * Setup called after initialisation + * the inventory, if existing */ - private void setup() { - } + private InventoryUI inventoryUI; /** - * Show the ship + * the map, if existing */ - public void showShipView() { + private MapUI mapUI; + + /** + * Constructor + * @param main - the main class for SpriteBatch + */ + public ShipView(Main main, Ship ship, Stage stage, Overworld map, GamePlay game) { + super(main, ship, stage, game); + //java.util.List crew = ship.get ?? + + this.map = map; + + rooms = new HashMap<>(); + List<Room> existingRooms = ship.getSystems(); + for(Room r : existingRooms) { + //TODO wie system das zu raum geh枚rt? dann sys id als key, roomui als value + } + + moveButton = new MoveButton(850, main.HEIGHT - 90, 150, 92, this); + inventory = new ShipButton(750,main.HEIGHT - 80, 50, 92, this); + + money = new ScrapUI(main, ship.getCoins()); + hull = new HullUI(main, ship.getHp()); + energy = new EnergyUI(main, ship.getEnergy()); + + shipBackground = new Texture("ship/anaerobic/an2base.png"); + shipRoomBackground = new Texture("ship/anaerobic/an2floor.png"); + weaponGeneralBackground = new Texture("shipsys/weapon/generalbox.png"); + + stage.addActor(inventory); + stage.addActor(moveButton); } - + /** - * Hide the ship + * renders the ship + * no stage stuff!! only textures */ - public void hideShipView() { + @Override + public void render() { + + main.batch.begin(); + main.batch.draw(shipBackground, main.WIDTH -1730, main.HEIGHT/2 - shipBackground.getHeight()/2 - 200, 1000, 1000); + main.batch.draw(shipRoomBackground, main.WIDTH -1500, main.HEIGHT/2 - shipRoomBackground.getHeight()/2 - 100, 550, 550); + main.batch.draw(weaponGeneralBackground, 700, 100, 328, 90); + main.batch.end(); + + money.render(); + hull.render(); + energy.render(); + + if(inventoryUI != null) { + inventoryUI.render(); + } + else if(mapUI != null) { + mapUI.render(); + } + + for(RoomUI r : rooms.values()) { + r.render(); + } } /** * Dispose of ship */ public void disposeShipView() { + shipBackground.dispose(); + shipRoomBackground.dispose(); + weaponGeneralBackground.dispose(); + money.disposeScrapUI(); + hull.disposeHullUI(); + energy.disposeEnergyUI(); + if(mapUI!=null) {mapUI.disposeMapUI();} + if(inventoryUI!=null) {inventoryUI.disposeInventoryUI();} + game.deleteShip(); + inventory.remove(); + moveButton.remove(); + for(RoomUI r : rooms.values()) { + r.disposeRoomUI(); + } } /** @@ -94,7 +174,7 @@ public class ShipView extends AbstractShip { */ @Override public void hullStatusUpdate(int hpvalue) { - + hull.updateStatus(hpvalue); } /** @@ -104,7 +184,7 @@ public class ShipView extends AbstractShip { */ @Override public void shieldStatusUpdate(int shieldvalue) { - + shields = shieldvalue; } /** @@ -112,7 +192,9 @@ public class ShipView extends AbstractShip { * called by ship button */ public void openInventory() { - + if(inventoryUI == null){ + inventoryUI = new InventoryUI(main, game.loadCrew(id), game.loadWeapons(id), game.loadFuel(id), game.loadMissiles(id), stage, this); + } } /** @@ -120,17 +202,98 @@ public class ShipView extends AbstractShip { * called by move button */ public void openMap() { + if(mapUI == null){ + mapUI = new MapUI(main, stage, map, this); + } + + } + + /** + * travel to a planet + * + * send to gameplay, through that to travelcontroller, which declares whether this jump is possible + * + * if possible, travel to new planet (with execution of event etc) + * if not, error message?? + * + * @param planet the target planet + * @return whether travel valid + */ + public boolean travel(Planet planet) { + return game.travel(planet); + } + + public void deleteInventory() { + inventoryUI = null; + } + + public void deleteMap() { + mapUI = null; + } + + + + /** + * a crew member is moved to a new room + * called by crew ui after player attempts to move a crew + * @param crewid the id of the crew member + * @param room the new room + */ + public void crewMoved(int crewid, Room room) { + game.crewMoved(crewid, room); + } + + /** + * crew member health update. called by game + * @param crewid the crew member + * @param health the new health + */ + public void crewHealth(int crewid, int health) { + if(health == 0) { + crew.get(crewid).crewDied(); + } + else { + crew.get(crewid).statusUpdate(health); + } + } + public void energyStatusUpdate(int status) { + energy.energyUpdate(status); } /** - * autofire - * called by autofire button + * update the energy of a system in a room + * @param amount the new total amount */ - public void autofire() { + public void roomSystemEnergyUpdate(int sysid, int amount) { + rooms.get(sysid).systemEnergyUpdate(amount); + } + /** + * update the status of a system in a room + * @param sysid the system id + * @param amount the new status + */ + public void roomSystemStatusUpdate(int sysid, int amount) { + rooms.get(sysid).systemStatusUpdate(amount); + } + + /** + * the player has chosen a new amount of energy + * @param amount how much should be subtracted/added + */ + public void roomSystemEnergyChosen(int id, int amount) { + game.roomSystemEnergyChosen(id, amount); } + /** + * change the amount of scrap/money displayed + * @param amount by how much the amount is changed + */ + public void changeAmountScrap(int amount) { money.changeAmount(amount);} + + public void weaponShot(int weaponid, Room room) { game.weaponShot(weaponid, room);} + /** * Ship hop animation */ @@ -144,11 +307,21 @@ public class ShipView extends AbstractShip { } /** - * Constructor - * TODO methods to access all shipinformation stuff - * @param main - the main class for SpriteBatch + * Setup called after initialisation + */ + private void setup() { + } + + /** + * Show the ship */ - public ShipView(Main main, Ship ship) { - super(main, ship); + public void showShipView() { } + + /** + * Hide the ship + */ + public void hideShipView() { + } + } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/CrewUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/CrewUI.java index aebfc4021cb58b19ecbd1f74fcfbcf904271d414..7ad26c643923731f42f0917d6b465198d5f51755 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/CrewUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/CrewUI.java @@ -1,28 +1,25 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation; -import com.badlogic.gdx.graphics.OrthographicCamera; + +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.Stage; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.Model.Crew.Crew; -import com.badlogic.gdx.scenes.scene2d.ui.List; +import java.util.LinkedList; +import java.util.List; + +import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.CrewDismissButton; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView; /** * shows the crew on board */ public class CrewUI { - /** - * Sprite batch - */ - private SpriteBatch batch; - - /** Orthographic camera */ - private OrthographicCamera camera; - /** image of the crew member for the side bar **/ private Texture crewImage; @@ -34,7 +31,17 @@ public class CrewUI { /** * texture for the status of the crew member */ - private List<Texture> crewStatus; + private Texture crewStatus; + + /** + * health box (empty) + */ + private Texture box; + + /** + * the current texture for status + */ + private int currentTexture; /** * button to click to send the crew to another room. After the button is clicked, @@ -47,6 +54,11 @@ public class CrewUI { */ private String name; + /** + * id of the crew member + */ + private int id; + /** * the current health of the crew member */ @@ -57,38 +69,150 @@ public class CrewUI { */ private int maxhealth; + /** + * the main class + */ + private Main main; + + /** + * the stage for buttons + */ + private Stage stage; + + /** + * rooms of the ship + */ + private List<Room> rooms; + + private ShipView shipView; + + /** + * constructor + * @param main the main class + * @param crew the crew member + */ + public CrewUI(Main main, Crew crew, Stage stage, Ship ship, ShipView shipView) { + this.main = main; + this.stage = stage; + this.shipView = shipView; + + name = crew.getName(); + maxhealth = crew.getMaxhealth(); + health = crew.getHealth(); + id = crew.getId(); + + if(crew.getName().equals("ana")) { + crewImage = new Texture("crew/anaerobic.png"); + } + else if(crew.getName().equals("battle")) { + crewImage = new Texture("crew/battle.png"); + } + else { + crewImage = new Texture("crew/energy.png"); //TODO wie sieht das mit namen aus? + } + + crewButton = new CrewDismissButton(crewImage, 0, 0, 10, 10, crew.getId(), this); + stage.addActor(crewButton); + + crewInShip = crewImage; //TODO for now + + crewStatus = new Texture("gameuis/energybar.png"); + + box = new Texture("crew/health_box.png"); + + currentTexture = 10; + + rooms = ship.getSystems(); + } + + /** + * dispose of the crew UI + */ + public void disposeCrewUI() { + crewImage.dispose(); + crewInShip.dispose(); + box.dispose(); + crewStatus.dispose(); + + crewButton.remove(); + } + + /** + * render + * no stage stuff + */ + public void render() { + main.batch.begin(); + main.batch.draw(crewInShip, 0, 0, 0, 0); //TODO whxy + main.batch.draw(box, 0, 0, 10, 10); //TODO xywh + float x=0; + for(int i=0;i<=currentTexture;i++) { + main.batch.draw(crewStatus, x, 0, 0, 0); //TODO whxy + x+=5; + } + main.batch.end(); + } + /** * the crew member was moved to a new room * + * * @param room the new room */ public void crewMoved(Room room) { - + shipView.crewMoved(id, room); } /** * the crew was chosen to be moved * called by button crewdismiss - * not waiting for the user to choose a room on the ship + * now waiting for the user to choose a room on the ship */ public void crewMoving() { - + boolean chosen = false; + while(!chosen) { + if(Gdx.input.justTouched()) { + int tx = Gdx.input.getX(); + int ty = Gdx.input.getY(); + for(Room r : rooms) { + if (r.getPosX() <= tx && r.getPosX() + r.getWidth() >= tx //TODO ist die berechnung richtig + && r.getPosY() <= ty && r.getPosY()+r.getHeight() >= ty) { //TODO wo sind die x und y koordinaten des schiffes? + chosen = true; + crewMoved(r); + break; + } + } + } + } } /** * the crew member died + * called by controller */ public void crewDied() { - + this.disposeCrewUI(); } /** * animation showing the crew member is currently repairing something + * called by controller? */ public void crewRepairAnimation() { } + /** + * the crew member was hit and the status needs to be updated + * called by controller + * @param status the new status + */ + public void statusUpdate(int status) { + int percent = status/maxhealth; + currentTexture = percent * 10; + //adapt currentTexture according to amount of textures we end up having + } + /** * Setup called after initialisation */ @@ -108,27 +232,4 @@ public class CrewUI { public void hideCrewUI() { } - - /** - * dispose of the crew UI - */ - public void disposeCrewUI() { - - } - - /** - * the crew member was hit and the status needs to be updated - */ - public void statusUpdate() { - - } - - /** - * constructor - * @param main the main class - * @param crew the crew member - */ - public CrewUI(Main main, Crew crew) { - - } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/EnergyUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/EnergyUI.java index 37673fcf2679f2046cb218e98def39faa5497011..f12904ebd3b82b119f7c0e8a78f8289a15807db4 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/EnergyUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/EnergyUI.java @@ -1,10 +1,10 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation; -import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.galaxytrucker.galaxytruckerreloaded.Main; -import com.badlogic.gdx.scenes.scene2d.ui.List; + +import java.util.LinkedList; +import java.util.List; /** * shows the energy the ship has @@ -12,29 +12,60 @@ import com.badlogic.gdx.scenes.scene2d.ui.List; public class EnergyUI { /** - * Sprite batch + * the texture to display the amount of energy not given to a system yet */ - private SpriteBatch batch; + private Texture energyTexture; - /** Orthographic camera */ - private OrthographicCamera camera; + /** + * the amount of energy left not allocated to systems + */ + private int energy; /** - * the textures to display the overall amount of - * energy that was not yet given to any system + * amount of blocks on the bottom right corner */ - private List<Texture> energyTextures; + private int currentTexture; + + private Main main; /** - * the amount of energy left not allocated to systems + * constructor + * @param main the main class + * @param energy the amount of energy unallocated to systems */ - private int energy; + public EnergyUI(Main main, int energy) { + this.main = main; + this.energy = energy; + + currentTexture = 8; + + energyTexture = new Texture("gameuis/energybar.png"); + } /** * the current status of the energy needs to be updated * @param energyStatus the new status */ public void energyUpdate(int energyStatus) { + energy = energyStatus; + //TODO currentTexture berechnen + } + + public void render() { + main.batch.begin(); + float y = 100; + for(int i =0; i<=currentTexture; i++) { + main.batch.draw(energyTexture, 25, y, 44, 13); + y+=20; + } + main.batch.end(); + } + + /** + * dispose of the EnergyUI + */ + public void disposeEnergyUI() { + energyTexture.dispose(); } @@ -58,22 +89,4 @@ public class EnergyUI { public void hideEnergyUI() { } - - /** - * dispose of the EnergyUI - */ - public void disposeEnergyUI() { - - } - - - - /** - * constructor - * @param main the main class - * @param energy the amount of energy unallocated to systems - */ - public EnergyUI(Main main, int energy) { - - } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/HullUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/HullUI.java index 8c3362f184880c8e28a5e6819c207a7a4e14583b..400e101ba049987453cbe55213cc8679d98e9a25 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/HullUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/HullUI.java @@ -1,9 +1,8 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation; -import com.badlogic.gdx.graphics.OrthographicCamera; + import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.scenes.scene2d.ui.List; + import com.galaxytrucker.galaxytruckerreloaded.Main; /** @@ -12,67 +11,90 @@ import com.galaxytrucker.galaxytruckerreloaded.Main; public class HullUI { /** - * SpriteBatch + * HullUI background texture */ - private SpriteBatch batch; + private Texture hullBackgroundTexture; /** - * Orthographic camera + * Change amount of hull integrity based on hp */ - private OrthographicCamera camera; + private Texture hullTexture; /** - * HullUI background texture + * the current status */ - private Texture HullBackgroundTexture; + private int status; + + private Main main; /** - * Change amount of hull integrity based on hp + * how many bars in hullTexture? */ - private List<Texture> hullTextures; + private int currentTexture; /** - * the current status + * Constructor + * + * @param main - main class + * @param status the current status of the hull */ - private int status; + public HullUI(Main main, int status) { + this.main = main; + this.status = status; + + currentTexture = 8; + + hullBackgroundTexture = new Texture("gameuis/top_hull.png"); + hullTexture = new Texture("gameuis/hull.png"); + + } /** - * setup called after initialisation + * the status of the hull was updated, meaning a new texture needs to be displayed */ - private void setup() { + public void updateStatus(int status) { + this.status = status; + //TODO richtige texture berechnen } /** - * show ui + * render + * no stage stuff */ - public void showHullUI() { + public void render() { + main.batch.begin(); + float x = 25; + for(int i=0; i<=currentTexture; i++) { + main.batch.draw(hullTexture, x, main.HEIGHT - 83, 25, 25); + x+=12; + } + main.batch.draw(hullBackgroundTexture, 25, main.HEIGHT - 112, 577, 97); + main.batch.end(); } /** - * hide ui + * setup called after initialisation */ - public void hideHullUI() { + private void setup() { } /** - * dispose + * show ui */ - public void disposeHullUI() { + public void showHullUI() { } /** - * the status of the hull was updated, meaning a new texture needs to be displayed + * hide ui */ - public void updateStatus() { - + public void hideHullUI() { } /** - * Constructor - * - * @param main - main class - * @param status the current status of the hull + * dispose */ - public HullUI(Main main, int status) { + public void disposeHullUI() { + hullBackgroundTexture.dispose(); + hullTexture.dispose(); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/RoomUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/RoomUI.java index 1dee9703bfd5c78816856ce377bd847d7c9d1056..a01317c3a5939a75952358b1a4914daa699c695d 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/RoomUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/RoomUI.java @@ -3,22 +3,15 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.Stage; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.AbstractShip; +import com.galaxytrucker.galaxytruckerreloaded.View.UI.Ship.ShipView; public class RoomUI { - /** - * SpriteBatch - */ - private SpriteBatch batch; - - /** - * Orthographic camera - */ - private OrthographicCamera camera; - /** * the system of this room */ @@ -44,6 +37,63 @@ public class RoomUI { */ private int width; + private Main main; + + private ShipView ship; + + /** + * Constructor + * + * @param main - the main class for SpriteBatch + * @param room the room + */ + public RoomUI(Main main, Room room, Stage stage, ShipView ship) { + this.main = main; + height = room.getHeight(); + width = room.getWidth(); + + //System sys = TODO wie system? + //dann neue systemui mit stage + } + + /** + * renders everything this room consists of + */ + public void render() { + system.render(); + //und textures TODO r盲ume sch枚ner abtrennen? aktuell einfach generell + symbole + } + + /** + * Dispose of room ui + */ + public void disposeRoomUI() { + system.disposeSubsystemUI(); + //texturen + } + + /** + * energy status update from controller + */ + public void systemEnergyUpdate(int energy) { + system.energyUpdate(energy); + } + + /** + * system status update from controller + */ + public void systemStatusUpdate(int damage) { + system.systemStatusUpdate(damage); + } + + /** + * the player chooses a new amount + * @param amount how much should be subtracted/added + */ + public void systemEnergyChosen(int id, int amount) { + ship.roomSystemEnergyChosen(id, amount); + } + /** * animation for the case that the room was hit */ @@ -85,19 +135,4 @@ public class RoomUI { */ public void hideRoomUI() { } - - /** - * Dispose of room ui - */ - public void disposeRoomUI() { - } - - /** - * Constructor - * - * @param main - the main class for SpriteBatch - * @param room the room - */ - public RoomUI(Main main, Room room) { - } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ScrapUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ScrapUI.java index 4455db5116dbfabf269ed1a11bf3c8e2e70ef736..3e0d6590c3383f7a54a64841bd8e437ed5a82d29 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ScrapUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ScrapUI.java @@ -1,31 +1,48 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation; -import com.badlogic.gdx.graphics.OrthographicCamera; + import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.galaxytrucker.galaxytruckerreloaded.Main; public class ScrapUI { /** - * Sprite batch + * Scrap UI background */ - private SpriteBatch batch; + private Texture scrapBackground; /** - * Orthographic Camera + * the amount of money */ - private OrthographicCamera camera; + private int amount; /** - * Scrap UI background + * the main class with the sprite batch */ - private Texture scrapBackground; + private Main main; /** - * the amount of money + * Constructor + * + * @param main - main class used for sprite batch and camera + * @param money the amount of money */ - private int amount; + public ScrapUI(Main main, int money) { + this.main = main; + amount = money; + + scrapBackground = new Texture("gameuis/top_scrap.png"); + } + + /** + * render + * no stage stuff + */ + public void render() { + main.batch.begin(); + main.batch.draw(scrapBackground, 600, main.HEIGHT - 90, 147, 60); + main.batch.end(); + } /** * setup called after initialisation @@ -49,22 +66,14 @@ public class ScrapUI { * Dispose of ui */ public void disposeScrapUI() { + scrapBackground.dispose(); } /** * the amount of money is updated - * @param amount the new amount + * @param amount by how much the amount is changed */ public void changeAmount(int amount) { - - } - - /** - * Constructor - * - * @param main - main class used for sprite batch and camera - * @param money the amount of money - */ - public ScrapUI(Main main, int money) { + this.amount += amount; } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ShieldUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ShieldUI.java index 6335bd82e1fc323436cb4ab7b1d1d471ac5d333f..53a1ec23d0ad4da93a5bc2102264a672fd9be745 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ShieldUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/ShieldUI.java @@ -1,81 +1,116 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation; -import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.scenes.scene2d.ui.List; +import com.badlogic.gdx.scenes.scene2d.Stage; + +import java.util.LinkedList; +import java.util.List; import com.galaxytrucker.galaxytruckerreloaded.Main; import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Shield; public class ShieldUI extends SubsystemUI { /** - * Sprite batch + * the texture for display in the actual gameplay */ - private SpriteBatch batch; - - /** Orthographic camera */ - private OrthographicCamera camera; + private Texture onShip; /** - * the texture for display in the actual gameplay + * dot for upper left corner */ - private Texture onShip; + private Texture shieldTexture; /** - * Shield textures + * background for upper left corner */ - private List<Texture> shieldTextures; + private Texture upperBackground; /** - * Setup called after initialisation + * the amount of dots in upper left corner */ - private void setup() { - } + private int currentTexture; /** - * Show shield ui + * Constructor + * + * @param main - the main class + * @param shield the shield */ - public void showShieldUI() { + public ShieldUI(Main main, Shield shield, Stage stage, RoomUI roomUI) { + super(main, shield, stage, roomUI); + + onShip = new Texture("ship/anaerobic/shields.png"); + + shieldTexture = new Texture("gameuis/shield_top.png"); + upperBackground = new Texture("gameuis/shield_topbackground.png"); + + currentTexture = 4; } /** - * hide the shield ui + * the status of the system was updated either by damage or by repair + * here + * + * @param damage the current status, with 0 being completely functional */ - public void hideShieldUI() { + @Override + public void systemStatusUpdate(int damage) { + //TODO what in ship is this? } /** * Dispose of shield ui */ public void disposeShieldUI() { + super.disposeSubsystemUI(); + + shieldTexture.dispose(); + upperBackground.dispose(); + + onShip.dispose(); + } /** - * shield was hit + * render + * no stage stuff */ - public void shieldHitAnimation() { + public void render() { + super.render(); + main.batch.begin(); + main.batch.draw(onShip, 0, 0, 0 ,0); //TODO whxy + main.batch.draw(upperBackground, 0, 0, 10, 10); + float x = 0; //TODO + for(int i = 0; i <= currentTexture; i++) { + main.batch.draw(shieldTexture, x, 0, 10, 10); //TODO whxy + x +=10; //TODO + } + main.batch.end(); } /** - * the status of the system was updated either by damage or by repair - * here - * - * @param damage the current status, with 0 being completely functional + * Setup called after initialisation */ - @Override - public void systemStatusUpdate(int damage) { + private void setup() { + } + + /** + * Show shield ui + */ + public void showShieldUI() { + } + /** + * hide the shield ui + */ + public void hideShieldUI() { } /** - * Constructor - * - * @param main - the main class - * @param shield the shield + * shield was hit */ - public ShieldUI(Main main, Shield shield) { - super(main, shield); + public void shieldHitAnimation() { + } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/SubsystemUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/SubsystemUI.java index fb9922f94e45b74e6de67be69ae9210547d7dab9..e864eb23d629e8f1b9037c3afb78a74b1908b540 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/SubsystemUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/SubsystemUI.java @@ -1,11 +1,17 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation; -import com.badlogic.gdx.graphics.OrthographicCamera; + +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.scenes.scene2d.ui.List; +import com.badlogic.gdx.scenes.scene2d.Stage; + +import java.util.LinkedList; +import java.util.List; import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Engine; +import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Shield; import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.System; +import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.WeaponSystem; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.SystemButton; /** @@ -13,25 +19,17 @@ import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.System */ public class SubsystemUI { - /** - * Sprite batch - */ - private SpriteBatch batch; - - /** Orthographic camera */ - private OrthographicCamera camera; - /** * the textures to display the system in its current damage level * use for both the room on the ship and the bottom left corner */ - private List<Texture> systemTexture; + private java.util.List<Texture> systemTexture; /** * the textures for the energy * bottom left corner */ - private List<Texture> energyTexture; + private Texture energyTexture; /** * botton representing the system in the bottom left corner. @@ -62,6 +60,73 @@ public class SubsystemUI { */ private int damage; + /** + * id of the subsystem + */ + protected int id; + + protected Main main; + + protected Stage stage; + + private int currentStatus; + + private RoomUI roomUI; + + /** + * constructor + * @param main the main class + * @param system the system + */ + public SubsystemUI(Main main, System system, Stage stage, RoomUI roomUI) { + this.main = main; + this.stage = stage; + this.roomUI = roomUI; + + x = system.getPosX(); + y = system.getPosY(); + energy = system.getEnergy(); + maxEnergy = system.getMaxEnergy(); + damage = system.getDamage(); + systemTexture = new java.util.LinkedList<>(); + id = system.getId(); + + if(system instanceof Engine) { + systemTexture.add(new Texture("shipsys/engine/enginegreen.png")); + systemTexture.add(new Texture("shipsys/engine/engineorange.png")); + systemTexture.add(new Texture("shipsys/engine/enginered.png")); + } + else if (system instanceof Shield) { + systemTexture.add(new Texture("shipsys/shields/shieldsgreen.png")); + systemTexture.add(new Texture("shipsys/shields/shieldsorange.png")); + systemTexture.add(new Texture("shipsys/shields/shieldsred.png")); + } + else if(system instanceof WeaponSystem) { + systemTexture.add(new Texture("shipsys/weapon/weapongreen.png")); + systemTexture.add(new Texture("shipsys/weapon/weaponorange.png")); + systemTexture.add(new Texture("shipsys/weapon/weaponred.png")); + } + energyButton = new SystemButton(systemTexture.get(0), x, y, 15, 15, this); //TODO w, h also x y for corner!! not these + + energyTexture = new Texture("gameuis/energybar.png"); + + stage.addActor(energyButton); + + Gdx.input.setInputProcessor(stage); + } + + public void render() { + main.batch.begin(); + float x = 0; //TODO + for(int i = 0; i<energy; i++) { + main.batch.draw(energyTexture, x, 0, 10, 10); + x += 5; //TODO? + } + //TODO else f眉r alle level + main.batch.draw(systemTexture.get(currentStatus), 0, 0, 15, 15); //TODO position, w, h + main.batch.end(); + } + /** * Setup called after initialisation */ @@ -86,23 +151,34 @@ public class SubsystemUI { * dispose of the Subsystem UI */ public void disposeSubsystemUI() { + energyTexture.dispose(); + for(Texture t : systemTexture) { + t.dispose(); + } + stage.dispose(); + energyButton.remove(); } /** * updates the energy of the system (bottom left) - * @param energy the current energy level + * called by controller + * @param energy the new amount */ public void energyUpdate(int energy) { - + this.energy = energy; + //TODO call controller } /** * the status of the system was updated either by damage or by repair + * called by controller * @param damage the current status, with 0 being completely functional */ public void systemStatusUpdate(int damage) { - + if(!(currentStatus == systemTexture.size())) { + currentStatus++; + } } /** @@ -111,23 +187,14 @@ public class SubsystemUI { * if energy supply already activated and not at maximum, then more energy to this system */ public void activateEnergy() { - + roomUI.systemEnergyChosen(id, 1); //TODO how much } /** - * the energy supply for this system is lowered, unless there is no supply - * called by systembutton + * subtracts energy supply + * called by button */ public void lessEnergy() { - - } - - /** - * constructor - * @param main the main class - * @param system the system - */ - public SubsystemUI(Main main, System system) { - + roomUI.systemEnergyChosen(id, -1); } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/WeaponUI.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/WeaponUI.java index 9a6ba9a254dfd86e716119513866fa7690700641..304233127f19aca7ccab1e57d729766b0af208f1 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/WeaponUI.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/View/UI/ShipInformation/WeaponUI.java @@ -1,18 +1,19 @@ package com.galaxytrucker.galaxytruckerreloaded.View.UI.ShipInformation; -import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.scenes.scene2d.ui.List; +import com.badlogic.gdx.scenes.scene2d.Stage; + +import java.util.LinkedList; +import java.util.List; import com.galaxytrucker.galaxytruckerreloaded.Main; +import com.galaxytrucker.galaxytruckerreloaded.Model.ShipLayout.Room; import com.galaxytrucker.galaxytruckerreloaded.Model.Weapons.Weapon; import com.galaxytrucker.galaxytruckerreloaded.View.Buttons.InGameButtons.WeaponActivateButton; /** * shows the weapons of the ship */ -//TODO als subklasse zu subsystemui sobald gemergt mit master -public class WeaponUI { +public class WeaponUI extends SubsystemUI { /** Weapon coolDown */ private int cooldown; @@ -25,6 +26,8 @@ public class WeaponUI { */ private int burst; + private int id; + /** * the texure to display the weapon background */ @@ -35,12 +38,68 @@ public class WeaponUI { */ private List<Texture> weaponCooldown; + /** + * the current texture in weapon cooldown + */ + private int currentTexture; + /** * button used to activate/deactive weapon in the bottom left corner * after weapon is activated, a room in the enemy ship needs to be selected */ private WeaponActivateButton activateButton; + /** + * constructor + * @param main the main class + * @param weapon the weapon + */ + public WeaponUI(Main main, Weapon weapon, Stage stage, RoomUI roomUI) { + super(main, weapon.getWeaponSystem(), stage, roomUI); + + cooldown = weapon.getCooldown(); + energy = weapon.getEnergy(); + burst = weapon.getBurst(); + id = weapon.getId(); + + //weaponBackground = new Texture("shipsys/weapon/smallbox.png"); + + //weaponCooldown = new LinkedList<>(); + //weaponCooldown.add(new Texture("")); + //currentTexture = 0; + + activateButton = new WeaponActivateButton(new Texture("shipsys/weapon/minibox.png"), 0, 0, 10, 10, this); + stage.addActor(activateButton); + } + + /** + * render + * no stage stuff + */ + public void render() { + super.render(); + + /*main.batch.begin(); + main.batch.draw(weaponBackground, 0, 0, 0, 0); //TODO whxy + //main.batch.draw(weaponCooldown.get(currentTexture), 0, 0, 0, 0); //TODO whxy + main.batch.end();*/ + } + + /** + * dispose of everything + */ + public void disposeWeaponUI() { + super.disposeSubsystemUI(); + + //weaponBackground.dispose(); + + /*for(Texture t : weaponCooldown) { + t.dispose(); + }*/ + + activateButton.remove(); + } + /** * Setup called after initialisation */ @@ -60,14 +119,6 @@ public class WeaponUI { * called by weaponactivatebutton */ public void weaponactivated() { - - } - - /** - * constructor - * @param main the main class - * @param weapon the weapon - */ - public WeaponUI(Main main, Weapon weapon) { + //TODO do this } }