From 43e223cc6708b22333d6deb303c477a42e6ef6f3 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Tue, 27 Jan 2015 19:24:21 +0900 Subject: [PATCH 02/16] Initial Commit. Protex done / 32bit, 64bit build check done Change-Id: I8eed99175598874bcc34d773474d2b88c439be79 Signed-off-by: Kim Tae Soo --- CMakeLists.txt | 134 ++ LICENSE | 204 ++ icons/org.tizen.music-player-tv-ref.png | Bin 0 -> 20867 bytes icons/org.tizen.music-player-tv-ref_4x2.png | Bin 0 -> 117742 bytes include/ExtBaseLayout.h | 37 + include/album-layout.h | 80 + include/album-songs-layout.h | 52 + include/album_info.h | 41 + include/artist-layout.h | 37 + include/base-view.h | 92 + include/bus.h | 22 + include/category-layout.h | 177 ++ include/category_info.h | 51 + include/common-ui.h | 40 + include/common.h | 172 ++ include/context-view.h | 83 + include/dbg.h | 45 + include/define.h | 412 ++++ include/entry-popup.h | 24 + include/folder-layout.h | 75 + include/folder_info.h | 38 + include/genre-layout.h | 37 + include/i18n.h | 35 + include/mediadata.h | 99 + include/music-controller.h | 141 ++ include/playback-mgr.h | 81 + include/playback-view.h | 156 ++ include/playlist-layout.h | 44 + include/playlist-mgr.h | 73 + include/song-layout.h | 56 + include/song_info.h | 56 + include/volume-control.h | 32 + org.tizen.music-player-tv-ref.manifest | 26 + org.tizen.music-player-tv-ref.xml.in | 10 + packaging/org.tizen.music-player-tv-ref.spec | 71 + po/CMakeLists.txt | 37 + po/POTFILES.in | 2 + po/de_DE.po | 22 + po/el_GR.po | 22 + po/en.po | 22 + po/es_ES.po | 22 + po/fr_FR.po | 22 + po/it_IT.po | 22 + po/ja_JP.po | 22 + po/ko_KR.po | 22 + po/music-app.pot | 22 + po/nl_NL.po | 22 + po/pt_PT.po | 22 + po/ru_RU.po | 22 + po/tr_TR.po | 22 + po/update-po.sh | 59 + po/zh_CN.po | 22 + po/zh_HK.po | 22 + po/zh_TW.po | 22 + res/edc/CMakeLists.txt | 17 + res/edc/images/00_c_progress_balloon_arrow_up.png | Bin 0 -> 197 bytes res/edc/images/Music_bg_light.png | Bin 0 -> 63572 bytes res/edc/images/allbrowser_menu_bg.png | Bin 0 -> 17782 bytes res/edc/images/btn_bg_round_72x72.png | Bin 0 -> 15964 bytes res/edc/images/btn_bg_round_stroke.png | Bin 0 -> 19096 bytes res/edc/images/checkbox_check_dim.png | Bin 0 -> 18070 bytes res/edc/images/checkbox_check_foc.png | Bin 0 -> 18046 bytes res/edc/images/checkbox_check_nor.png | Bin 0 -> 18054 bytes res/edc/images/checkbox_uncheck_dim.png | Bin 0 -> 17807 bytes res/edc/images/checkbox_uncheck_foc.png | Bin 0 -> 17817 bytes res/edc/images/checkbox_uncheck_nor.png | Bin 0 -> 17813 bytes res/edc/images/contextual_menu_bg.png | Bin 0 -> 40491 bytes res/edc/images/dynamicbar_shadow.png | Bin 0 -> 15404 bytes res/edc/images/focused_app_bg.png | Bin 0 -> 18839 bytes res/edc/images/function_button_foc.png | Bin 0 -> 18940 bytes res/edc/images/function_button_nor.png | Bin 0 -> 3132357 bytes res/edc/images/ico_arrow_20.png | Bin 0 -> 17811 bytes res/edc/images/ico_check_foc.png | Bin 0 -> 18262 bytes res/edc/images/ico_dropdown_menu_check.png | Bin 0 -> 17850 bytes res/edc/images/ico_ff.png | Bin 0 -> 18474 bytes res/edc/images/ico_music.png | Bin 0 -> 20867 bytes res/edc/images/ico_mute.png | Bin 0 -> 18097 bytes res/edc/images/ico_pause.png | Bin 0 -> 17872 bytes res/edc/images/ico_play.png | Bin 0 -> 18254 bytes res/edc/images/ico_pulldown_nor.png | Bin 0 -> 17785 bytes res/edc/images/ico_repeat_off.png | Bin 0 -> 19045 bytes res/edc/images/ico_repeat_on.png | Bin 0 -> 18514 bytes res/edc/images/ico_repeat_only.png | Bin 0 -> 18370 bytes res/edc/images/ico_rew.png | Bin 0 -> 18148 bytes res/edc/images/ico_setting.png | Bin 0 -> 18250 bytes res/edc/images/ico_shuffle_off.png | Bin 0 -> 18475 bytes res/edc/images/ico_shuffle_on.png | Bin 0 -> 18328 bytes res/edc/images/ico_vol.png | Bin 0 -> 18333 bytes res/edc/images/music_bg_button_foc.png | Bin 0 -> 19302 bytes res/edc/images/music_bg_button_nor.png | Bin 0 -> 19016 bytes res/edc/images/music_ico_album.png | Bin 0 -> 18269 bytes res/edc/images/music_ico_back.png | Bin 0 -> 17855 bytes res/edc/images/music_ico_play.png | Bin 0 -> 17724 bytes res/edc/images/music_ico_playback.png | Bin 0 -> 18423 bytes res/edc/images/music_ico_song.png | Bin 0 -> 18007 bytes res/edc/images/music_ico_time.png | Bin 0 -> 18055 bytes res/edc/images/music_playback_shadow.png | Bin 0 -> 17719 bytes res/edc/images/music_progressbar_handle_dim.png | Bin 0 -> 18926 bytes res/edc/images/music_progressbar_handle_foc.png | Bin 0 -> 18764 bytes res/edc/images/music_progressbar_handle_nor.png | Bin 0 -> 18926 bytes res/edc/images/popover_arrow_down.png | Bin 0 -> 419 bytes res/edc/images/popover_arrow_up.png | Bin 0 -> 17778 bytes res/edc/images/progress_balloon.png | Bin 0 -> 675 bytes res/edc/images/round_rectangle_4X4.png | Bin 0 -> 18179 bytes res/edc/images/round_rectangle_4X4_bottom.png | Bin 0 -> 17711 bytes res/edc/images/round_rectangle_4X4_top.png | Bin 0 -> 17710 bytes res/edc/images/round_rectangle_9X9.png | Bin 0 -> 15130 bytes res/edc/music-player-theme.edc | 10 + res/edc/music-player.edc | 19 + res/edc/views/album-layout.edc | 19 + res/edc/views/album-songs-layout.edc | 70 + res/edc/views/base-view.edc | 88 + res/edc/views/cat-albums-layout.edc | 55 + res/edc/views/cat-selectlist-layout.edc | 35 + res/edc/views/cat-songs-layout.edc | 77 + res/edc/views/category-layout.edc | 20 + res/edc/views/common.edc | 219 ++ res/edc/views/context-view.edc | 728 +++++++ res/edc/views/entrypopup-layout.edc | 74 + res/edc/views/folder-layout.edc | 55 + res/edc/views/message-layout.edc | 85 + res/edc/views/playback-view.edc | 104 + res/edc/views/settings-layout.edc | 18 + res/edc/views/song-layout.edc | 19 + res/edc/views/volume-layout.edc | 195 ++ res/edc/widgets/button.edc | 2364 +++++++++++++++++++++ res/edc/widgets/ctxpopup.edc | 27 + res/edc/widgets/gengrid.edc | 441 ++++ res/edc/widgets/genlist.edc | 1528 +++++++++++++ res/edc/widgets/progressbar.edc | 369 ++++ res/edc/widgets/slider.edc | 363 ++++ res/images/ico_add_nor.png | Bin 0 -> 303 bytes res/images/ico_addlast_nor.png | Bin 0 -> 17931 bytes res/images/ico_addnext_nor.png | Bin 0 -> 17934 bytes res/images/ico_addto_nor.png | Bin 0 -> 1208 bytes res/images/ico_default_music_126.png | Bin 0 -> 19251 bytes res/images/ico_default_music_180.png | Bin 0 -> 5262 bytes res/images/ico_default_music_450.png | Bin 0 -> 23245 bytes res/images/ico_default_music_79.png | Bin 0 -> 18068 bytes res/images/ico_default_other_180.png | Bin 0 -> 3345 bytes res/images/ico_del_nor.png | Bin 0 -> 17877 bytes res/images/ico_folder.png | Bin 0 -> 19252 bytes res/images/ico_music_album.png | Bin 0 -> 18088 bytes res/images/ico_music_artist.png | Bin 0 -> 18222 bytes res/images/ico_music_folder.png | Bin 0 -> 17808 bytes res/images/ico_music_genre.png | Bin 0 -> 17758 bytes res/images/ico_music_playlist.png | Bin 0 -> 918 bytes res/images/ico_music_song.png | Bin 0 -> 17972 bytes res/images/ico_newlist_music_126.png | Bin 0 -> 1917 bytes res/images/ico_pause_nor.png | Bin 0 -> 17799 bytes res/images/ico_play_nor.png | Bin 0 -> 18072 bytes res/images/ico_remove_nor.png | Bin 0 -> 231 bytes res/images/ico_rename_nor.png | Bin 0 -> 920 bytes res/images/loading_48_01.png | Bin 0 -> 3657 bytes res/images/music_def_126.png | Bin 0 -> 1937 bytes res/images/music_def_450.png | Bin 0 -> 9768 bytes res/images/music_def_79.png | Bin 0 -> 891 bytes res/images/music_ico_add_last.png | Bin 0 -> 17841 bytes res/images/music_ico_add_next.png | Bin 0 -> 17847 bytes res/images/music_ico_add_play.png | Bin 0 -> 17873 bytes src/data/album_info.cpp | 142 ++ src/data/bus.cpp | 73 + src/data/category_info.cpp | 211 ++ src/data/folder_info.cpp | 127 ++ src/data/mediadata.cpp | 1322 ++++++++++++ src/data/song_info.cpp | 275 +++ src/main.cpp | 265 +++ src/playback/music-controller.cpp | 997 +++++++++ src/playback/playback-mgr.cpp | 361 ++++ src/playback/playlist-mgr.cpp | 483 +++++ src/playback/volume-control.cpp | 147 ++ src/views/ExtBaseLayout.cpp | 45 + src/views/HandleVolume.cpp | 211 ++ src/views/HandleVolume.h | 46 + src/views/album-layout.cpp | 692 ++++++ src/views/album-songs-layout.cpp | 758 +++++++ src/views/artist-layout.cpp | 81 + src/views/base-view.cpp | 1266 +++++++++++ src/views/category-layout.cpp | 1883 ++++++++++++++++ src/views/common-ui.cpp | 298 +++ src/views/context-view.cpp | 1701 +++++++++++++++ src/views/entry-popup.cpp | 149 ++ src/views/folder-layout.cpp | 1071 ++++++++++ src/views/genre-layout.cpp | 82 + src/views/playback-view.cpp | 2203 +++++++++++++++++++ src/views/playlist-layout.cpp | 171 ++ src/views/song-layout.cpp | 640 ++++++ 187 files changed, 25882 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100755 icons/org.tizen.music-player-tv-ref.png create mode 100755 icons/org.tizen.music-player-tv-ref_4x2.png create mode 100644 include/ExtBaseLayout.h create mode 100644 include/album-layout.h create mode 100644 include/album-songs-layout.h create mode 100644 include/album_info.h create mode 100644 include/artist-layout.h create mode 100644 include/base-view.h create mode 100644 include/bus.h create mode 100644 include/category-layout.h create mode 100644 include/category_info.h create mode 100644 include/common-ui.h create mode 100644 include/common.h create mode 100644 include/context-view.h create mode 100644 include/dbg.h create mode 100644 include/define.h create mode 100644 include/entry-popup.h create mode 100644 include/folder-layout.h create mode 100644 include/folder_info.h create mode 100644 include/genre-layout.h create mode 100644 include/i18n.h create mode 100644 include/mediadata.h create mode 100644 include/music-controller.h create mode 100644 include/playback-mgr.h create mode 100644 include/playback-view.h create mode 100644 include/playlist-layout.h create mode 100644 include/playlist-mgr.h create mode 100644 include/song-layout.h create mode 100644 include/song_info.h create mode 100644 include/volume-control.h create mode 100644 org.tizen.music-player-tv-ref.manifest create mode 100644 org.tizen.music-player-tv-ref.xml.in create mode 100755 packaging/org.tizen.music-player-tv-ref.spec create mode 100755 po/CMakeLists.txt create mode 100755 po/POTFILES.in create mode 100644 po/de_DE.po create mode 100644 po/el_GR.po create mode 100644 po/en.po create mode 100644 po/es_ES.po create mode 100644 po/fr_FR.po create mode 100644 po/it_IT.po create mode 100644 po/ja_JP.po create mode 100644 po/ko_KR.po create mode 100644 po/music-app.pot create mode 100644 po/nl_NL.po create mode 100644 po/pt_PT.po create mode 100644 po/ru_RU.po create mode 100644 po/tr_TR.po create mode 100755 po/update-po.sh create mode 100644 po/zh_CN.po create mode 100644 po/zh_HK.po create mode 100644 po/zh_TW.po create mode 100755 res/edc/CMakeLists.txt create mode 100644 res/edc/images/00_c_progress_balloon_arrow_up.png create mode 100644 res/edc/images/Music_bg_light.png create mode 100644 res/edc/images/allbrowser_menu_bg.png create mode 100644 res/edc/images/btn_bg_round_72x72.png create mode 100644 res/edc/images/btn_bg_round_stroke.png create mode 100644 res/edc/images/checkbox_check_dim.png create mode 100644 res/edc/images/checkbox_check_foc.png create mode 100644 res/edc/images/checkbox_check_nor.png create mode 100644 res/edc/images/checkbox_uncheck_dim.png create mode 100644 res/edc/images/checkbox_uncheck_foc.png create mode 100644 res/edc/images/checkbox_uncheck_nor.png create mode 100644 res/edc/images/contextual_menu_bg.png create mode 100644 res/edc/images/dynamicbar_shadow.png create mode 100644 res/edc/images/focused_app_bg.png create mode 100644 res/edc/images/function_button_foc.png create mode 100644 res/edc/images/function_button_nor.png create mode 100644 res/edc/images/ico_arrow_20.png create mode 100644 res/edc/images/ico_check_foc.png create mode 100644 res/edc/images/ico_dropdown_menu_check.png create mode 100644 res/edc/images/ico_ff.png create mode 100644 res/edc/images/ico_music.png create mode 100644 res/edc/images/ico_mute.png create mode 100644 res/edc/images/ico_pause.png create mode 100644 res/edc/images/ico_play.png create mode 100644 res/edc/images/ico_pulldown_nor.png create mode 100644 res/edc/images/ico_repeat_off.png create mode 100644 res/edc/images/ico_repeat_on.png create mode 100644 res/edc/images/ico_repeat_only.png create mode 100644 res/edc/images/ico_rew.png create mode 100644 res/edc/images/ico_setting.png create mode 100644 res/edc/images/ico_shuffle_off.png create mode 100644 res/edc/images/ico_shuffle_on.png create mode 100644 res/edc/images/ico_vol.png create mode 100644 res/edc/images/music_bg_button_foc.png create mode 100644 res/edc/images/music_bg_button_nor.png create mode 100644 res/edc/images/music_ico_album.png create mode 100644 res/edc/images/music_ico_back.png create mode 100644 res/edc/images/music_ico_play.png create mode 100644 res/edc/images/music_ico_playback.png create mode 100644 res/edc/images/music_ico_song.png create mode 100644 res/edc/images/music_ico_time.png create mode 100644 res/edc/images/music_playback_shadow.png create mode 100644 res/edc/images/music_progressbar_handle_dim.png create mode 100644 res/edc/images/music_progressbar_handle_foc.png create mode 100644 res/edc/images/music_progressbar_handle_nor.png create mode 100644 res/edc/images/popover_arrow_down.png create mode 100644 res/edc/images/popover_arrow_up.png create mode 100644 res/edc/images/progress_balloon.png create mode 100644 res/edc/images/round_rectangle_4X4.png create mode 100644 res/edc/images/round_rectangle_4X4_bottom.png create mode 100644 res/edc/images/round_rectangle_4X4_top.png create mode 100644 res/edc/images/round_rectangle_9X9.png create mode 100644 res/edc/music-player-theme.edc create mode 100644 res/edc/music-player.edc create mode 100644 res/edc/views/album-layout.edc create mode 100644 res/edc/views/album-songs-layout.edc create mode 100644 res/edc/views/base-view.edc create mode 100644 res/edc/views/cat-albums-layout.edc create mode 100644 res/edc/views/cat-selectlist-layout.edc create mode 100644 res/edc/views/cat-songs-layout.edc create mode 100644 res/edc/views/category-layout.edc create mode 100644 res/edc/views/common.edc create mode 100644 res/edc/views/context-view.edc create mode 100644 res/edc/views/entrypopup-layout.edc create mode 100644 res/edc/views/folder-layout.edc create mode 100644 res/edc/views/message-layout.edc create mode 100644 res/edc/views/playback-view.edc create mode 100644 res/edc/views/settings-layout.edc create mode 100644 res/edc/views/song-layout.edc create mode 100644 res/edc/views/volume-layout.edc create mode 100644 res/edc/widgets/button.edc create mode 100755 res/edc/widgets/ctxpopup.edc create mode 100644 res/edc/widgets/gengrid.edc create mode 100644 res/edc/widgets/genlist.edc create mode 100644 res/edc/widgets/progressbar.edc create mode 100644 res/edc/widgets/slider.edc create mode 100644 res/images/ico_add_nor.png create mode 100644 res/images/ico_addlast_nor.png create mode 100644 res/images/ico_addnext_nor.png create mode 100644 res/images/ico_addto_nor.png create mode 100644 res/images/ico_default_music_126.png create mode 100644 res/images/ico_default_music_180.png create mode 100644 res/images/ico_default_music_450.png create mode 100644 res/images/ico_default_music_79.png create mode 100644 res/images/ico_default_other_180.png create mode 100644 res/images/ico_del_nor.png create mode 100644 res/images/ico_folder.png create mode 100644 res/images/ico_music_album.png create mode 100644 res/images/ico_music_artist.png create mode 100644 res/images/ico_music_folder.png create mode 100644 res/images/ico_music_genre.png create mode 100644 res/images/ico_music_playlist.png create mode 100644 res/images/ico_music_song.png create mode 100644 res/images/ico_newlist_music_126.png create mode 100644 res/images/ico_pause_nor.png create mode 100644 res/images/ico_play_nor.png create mode 100644 res/images/ico_remove_nor.png create mode 100644 res/images/ico_rename_nor.png create mode 100644 res/images/loading_48_01.png create mode 100644 res/images/music_def_126.png create mode 100644 res/images/music_def_450.png create mode 100644 res/images/music_def_79.png create mode 100644 res/images/music_ico_add_last.png create mode 100644 res/images/music_ico_add_next.png create mode 100644 res/images/music_ico_add_play.png create mode 100644 src/data/album_info.cpp create mode 100644 src/data/bus.cpp create mode 100644 src/data/category_info.cpp create mode 100644 src/data/folder_info.cpp create mode 100644 src/data/mediadata.cpp create mode 100644 src/data/song_info.cpp create mode 100644 src/main.cpp create mode 100644 src/playback/music-controller.cpp create mode 100644 src/playback/playback-mgr.cpp create mode 100644 src/playback/playlist-mgr.cpp create mode 100644 src/playback/volume-control.cpp create mode 100644 src/views/ExtBaseLayout.cpp create mode 100644 src/views/HandleVolume.cpp create mode 100644 src/views/HandleVolume.h create mode 100644 src/views/album-layout.cpp create mode 100644 src/views/album-songs-layout.cpp create mode 100644 src/views/artist-layout.cpp create mode 100644 src/views/base-view.cpp create mode 100644 src/views/category-layout.cpp create mode 100644 src/views/common-ui.cpp create mode 100644 src/views/context-view.cpp create mode 100644 src/views/entry-popup.cpp create mode 100644 src/views/folder-layout.cpp create mode 100644 src/views/genre-layout.cpp create mode 100644 src/views/playback-view.cpp create mode 100644 src/views/playlist-layout.cpp create mode 100644 src/views/song-layout.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..518e81b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,134 @@ +# Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT("music-player" CXX) + + +IF(NOT DEFINED PACKAGE_NAME) + SET(PACKAGE_NAME "org.tizen.music-player-tv-ref") +ENDIF(NOT DEFINED PACKAGE_NAME) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +IF(NOT DEFINED BINDIR) + SET(BINDIR"${PREFIX}/bin") +ENDIF(NOT DEFINED BINDIR) +IF(NOT DEFINED RESDIR) + SET(RESDIR "${PREFIX}/res") +ENDIF(NOT DEFINED RESDIR) +IF(NOT DEFINED EDJEDIR) + SET(EDJEDIR "${PREFIX}/res/edje") +ENDIF(NOT DEFINED EDJEDIR) +IF(NOT DEFINED LOCALEDIR) + SET(LOCALEDIR "${PREFIX}/res/locale") +ENDIF(NOT DEFINED LOCALEDIR) +IF(NOT DEFINED IMAGEDIR) + SET(IMAGEDIR "${PREFIX}/res/images") +ENDIF(NOT DEFINED IMAGEDIR) +IF(NOT DEFINED MANIFESTDIR) + SET(MANIFESTDIR "/usr/share/packages") +ENDIF(NOT DEFINED MANIFESTDIR) +IF(NOT DEFINED MEDIA_AUDIO_DIR) + SET(MEDIA_AUDIO_DIR "/opt/usr/media/Sounds") +ENDIF(NOT DEFINED MEDIA_AUDIO_DIR) +IF(NOT DEFINED DESKTOP_ICONDIR) + SET(DESKTOP_ICONDIR "/usr/share/icons/default/small") +ENDIF(NOT DEFINED DESKTOP_ICONDIR) +IF(NOT DEFINED DESKTOP_ICON) + SET(DESKTOP_ICON ${PACKAGE_NAME}.png) +ENDIF(NOT DEFINED DESKTOP_ICON) +IF(NOT DEFINED LANDSCAPE_ICON) + SET(LANDSCAPE_ICON ${PACKAGE_NAME}_4x2.png) +ENDIF(NOT DEFINED LANDSCAPE_ICON) + +SET(SRCS src/main.cpp + src/views/song-layout.cpp + src/views/album-layout.cpp + src/views/category-layout.cpp + src/views/folder-layout.cpp + src/views/album-songs-layout.cpp + src/views/entry-popup.cpp + src/views/base-view.cpp + src/views/playback-view.cpp + src/views/context-view.cpp + src/views/artist-layout.cpp + src/views/genre-layout.cpp + src/views/playlist-layout.cpp + src/views/HandleVolume.cpp + src/views/common-ui.cpp + src/views/ExtBaseLayout.cpp + src/playback/playlist-mgr.cpp + src/playback/music-controller.cpp + src/playback/playback-mgr.cpp + src/playback/volume-control.cpp + src/data/mediadata.cpp + src/data/song_info.cpp + src/data/album_info.cpp + src/data/category_info.cpp + src/data/folder_info.cpp + src/data/bus.cpp +) + +SET(TARGET_EDJ "${PROJECT_NAME}.edj") +SET(THEME_EDJ "${PROJECT_NAME}-theme.edj") + +ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE_NAME}\"") +ADD_DEFINITIONS("-DEDJEDIR=\"${EDJEDIR}\"") +ADD_DEFINITIONS("-DIMAGEDIR=\"${IMAGEDIR}\"") +ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"") +ADD_DEFINITIONS("-DTHEMEFILE=\"${EDJEDIR}/${THEME_EDJ}\"") +ADD_DEFINITIONS("-DEDJEFILE=\"${EDJEDIR}/${TARGET_EDJ}\"") + +INCLUDE(FindPkgConfig) +pkg_check_modules(PKGS REQUIRED + capi-appfw-application + application-common + dlog + elementary + edje + capi-media-player + capi-media-sound-manager + capi-content-media-content + #capi-system-usbdevice + mm-player + edje + utilX + x11 + gio-2.0 +) + +FOREACH(flag ${PKGS_CFLAGS}) + SET(EXTRA_CFLGAS "${EXTRA_CFLGAS} ${flag}") +ENDFOREACH(flag) + +#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLGAS} -fvisibility=hidden -Wall -Werror") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLGAS} -fvisibility=hidden -Wall") +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) + +ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PKGS_LDFLAGS}) +CONFIGURE_FILE(${PACKAGE_NAME}.xml.in ${PACKAGE_NAME}.xml) + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR}) +INSTALL(FILES ${PACKAGE_NAME}.xml DESTINATION ${MANIFESTDIR}) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/res/images DESTINATION ${RESDIR}) +INSTALL(FILES ${CMAKE_SOURCE_DIR}/icons/${DESKTOP_ICON} DESTINATION ${DESKTOP_ICONDIR}) +INSTALL(FILES ${CMAKE_SOURCE_DIR}/icons/${LANDSCAPE_ICON} DESTINATION ${DESKTOP_ICONDIR}) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/demosongs DESTINATION ${MEDIA_AUDIO_DIR}) + +#i18n +ADD_SUBDIRECTORY(po) +ADD_SUBDIRECTORY(res/edc) + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..54b213e --- /dev/null +++ b/LICENSE @@ -0,0 +1,204 @@ +Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/icons/org.tizen.music-player-tv-ref.png b/icons/org.tizen.music-player-tv-ref.png new file mode 100755 index 0000000000000000000000000000000000000000..93f492b7446f66089e8e0a2d777ee62477c53c98 GIT binary patch literal 20867 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 Ve5kx6u=8Iw20A9%Wm?D2{4ar|GQt1= literal 0 HcmV?d00001 diff --git a/icons/org.tizen.music-player-tv-ref_4x2.png b/icons/org.tizen.music-player-tv-ref_4x2.png new file mode 100755 index 0000000000000000000000000000000000000000..c5ea0461ca90cc7ab2e4f16138b5be3cd64f47a8 GIT binary patch literal 117742 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

D`c|pO#&!W+yU77vNM2&BL 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 Hu0mjf*16So literal 0 HcmV?d00001 diff --git a/include/ExtBaseLayout.h b/include/ExtBaseLayout.h new file mode 100644 index 0000000..e9cedd1 --- /dev/null +++ b/include/ExtBaseLayout.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __EXT_BASE_LAYOUT_H__ +#define __EXT_BASE_LAYOUT_H + +#include "BaseLayout.h" + +class CExtBaseLayout : public CBaseLayout { +private: + bool m_bEmptyStatus; + +public: + CExtBaseLayout(const char *szLayoutId); + virtual ~CExtBaseLayout(); + + void SetEmptyStatus(bool flag); + bool EmptyStatus(void); + + virtual void Update(bool flag) {} +}; + + +#endif /* __EXT_BASE_LAYOUT_H__ */ diff --git a/include/album-layout.h b/include/album-layout.h new file mode 100644 index 0000000..b64ca94 --- /dev/null +++ b/include/album-layout.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef __ALBUM_LAYOUT_H__ +#define __ALBUM_LAYOUT_H__ + + +struct SAlbumItemInfo; + +class CAlbumLayout : public CExtBaseLayout, public CListenerMgr, + public IKeyDownListener, public IMouseMoveListener, + public IRealizedListener, public IUnrealizedListener { +private: + struct SAlbumLayout *m; + +private: + static char *sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part); + static Evas_Object *sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part); + static void sm_CbRemoveGridItem(void *data, Evas_Object *obj); + + static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid); + void m_OnCtxtUpdate(EActionType type, int lid); + + static void sm_CbCtxtClose(void *dt); + void m_OnCtxtClose(void); + + static void sm_CbItemSelect(void *data, Elm_Object_Item *it, const char *emission, const char *source); + void m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source); + +private: + SAlbumItemInfo *m_FindItemInfo(Eina_List *list, Elm_Object_Item *item); + SAlbumItemInfo *m_FindItemInfoById(Eina_List *list, int alid); + void m_ShowAlbumSongs(void); + void m_RemoveAlbumList(Eina_List *list); + void m_CreateAlbumGrid(void); + void m_EmptyAlbumGrid(bool sort_flag); + void m_SortAlbumGrid(void); + void m_UpdateAlbumGrid(bool sort_flag); + +protected: + virtual void t_OnShow(void); + +public: + CAlbumLayout(const char *pLayoutId) : + CExtBaseLayout(pLayoutId), + IKeyDownListener(this), + IMouseMoveListener(this), + IRealizedListener(this), + IUnrealizedListener(this), + m(0) {} + virtual ~CAlbumLayout() {} + + bool Create(CLayoutMgr *mgr, const char *albumId); + virtual void Destroy(void); + + virtual void Update(bool focusFlag); + void SetEmptyStatusHandleCallback(void(*handleEmptyStatusCb)(void *cookie, bool emptyStatus), void *cookie); + +public: + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); + virtual void OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item); + virtual void OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item); +}; + + +#endif /*__ALBUM_LAYOUT_H__*/ diff --git a/include/album-songs-layout.h b/include/album-songs-layout.h new file mode 100644 index 0000000..373852d --- /dev/null +++ b/include/album-songs-layout.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef __ALBUM_SONGS_LAYOUT_H__ +#define __ALBUM_SONGS_LAYOUT_H__ + + +class CAlbumSongsLayout : public CExtBaseLayout, public CListenerMgr, public IKeyDownListener { +private: + struct SAlbumSongsLayout *m; + +private: + static char *sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part); + static void sm_CbRemoveListItem(void *data, Evas_Object *obj); + static void sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId); + +private: + inline int m_ConvertToMin(int milsec); + void m_GotoPlayback(int mode, char *id); + Evas_Object *m_AddAlbumCover(void); + void m_CreateTopSection(void); + void m_CreateSongList(void); + +protected: + virtual void t_OnShow(void); + +public: + CAlbumSongsLayout(const char *pLayoutId) : CExtBaseLayout(pLayoutId), IKeyDownListener(this), m(0) {} + virtual ~CAlbumSongsLayout() {} + + bool Create(CLayoutMgr *mgr); + virtual void Destroy(void); + +public: + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); +}; + + +#endif /*__ALBUM_SONGS_LAYOUT_H__*/ diff --git a/include/album_info.h b/include/album_info.h new file mode 100644 index 0000000..0eace3f --- /dev/null +++ b/include/album_info.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ALBUM_INFO_H__ +#define __ALBUM_INFO_H__ + +struct album_info { + int album_id; + char *name; + char *artist; + char *genre; + char *thumbnail_path; + int song_count; +}; + +struct album_info *album_info_create(); +void album_info_destroy(struct album_info *alinfo); + +int album_info_get_album_id(struct album_info *calinfo); +char *album_info_get_name(struct album_info *calinfo); +char *album_info_get_artist(struct album_info *calinfo); +char *album_info_get_genre(struct album_info *calinfo); +char *album_info_get_thumb(struct album_info *calinfo); +struct album_info *album_info_duplicate(struct album_info *s_alinfo); +int sortalbums_za(const void *d1, const void *d2); +int sortalbums_az(const void *d1, const void *d2); + +#endif /*__ALBUM_INFO_H__*/ diff --git a/include/artist-layout.h b/include/artist-layout.h new file mode 100644 index 0000000..53ad620 --- /dev/null +++ b/include/artist-layout.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ARTIST_LAYOUT_H__ +#define __ARTIST_LAYOUT_H__ + + +class CArtistLayout : public CCategoryLayout { +private: + struct SArtistLayout* m; + +protected: + virtual void t_HandleItemSelect(SCatItemInfo *itinfo); + virtual bool t_GetMediaList(Eina_List **list); + virtual EContextType t_ContextType(void) { return CONTEXT_TYPE_PLAYLIST; } + virtual ECategoryType t_CategoryType(void) { return CAT_TYPE_ARTIST; } + +public: + CArtistLayout(const char *pLayoutId) : CCategoryLayout(pLayoutId), m(0) {} + virtual ~CArtistLayout(){} +}; + + +#endif /* __ARTIST_LAYOUT_H__ */ \ No newline at end of file diff --git a/include/base-view.h b/include/base-view.h new file mode 100644 index 0000000..ecd0738 --- /dev/null +++ b/include/base-view.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef __MUSIC_BASE_VIEW_H__ +#define __MUSIC_BASE_VIEW_H__ + + +struct _arg_list { + char *album_id; + char *uri; + char *source; +}; + + +class CMusicBaseView : public CBaseView, public CListenerMgr, public IKeyDownListener, public IKeyUpListener, + IMusicControllerListener +{ +private: + struct SMusicBaseView* m; + +private: + static void sm_CbHandleEmptyStatus(void *cookie, bool emptyStatus); + void m_OnHandleEmptyStatus(bool emptyStatus); + +private: + void m_UpdateFocusSequence(void); + void m_UpdateEmptyFocusSequence(void); + + static void sm_CbClickedGroupBtn(void *cookie, Evas_Object *obj); + void m_OnClickedGroupBtn(Evas_Object *obj); + + static void sm_CbClickedCtxBtn(void *cookie, Evas_Object *obj); + void m_OnClickedCtxBtn(Evas_Object *obj); + + void m_ShowCurrentLayout(void); + + + void m_DestroyPopup(void); + void m_DestroyCtxPopup(void); + Evas_Object *m_CreateLoadingPopup(void); + void m_UpdatePlaysongLabel(void); + void m_AddPlaysongLabel(void); + void m_CreateTopSection(void); + void m_CreateLeftSection(void); + void m_CreateFullView(void); + + void m_SetSourceType(void); + void m_UpdateCurrentLayout(bool focusFlag); + +protected: + virtual void t_OnShow(void); + virtual void t_OnHide(void); + virtual void t_OnUpdate(void* data); + +public: + CMusicBaseView(const char *pViewId) : CBaseView(pViewId), IKeyDownListener(this), IKeyUpListener(this), m(0) {} + virtual ~CMusicBaseView() {} + + virtual bool Create(void *data); + virtual void Destroy(void); + + virtual Evas_Object* Base(void); + +public: + + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); + virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev); + +protected: + + virtual void t_OnComplete(void); + virtual void t_OnError(void); + virtual void t_OnUsbConnected(void); + virtual void t_OnUpdateContent(void); +}; + + +#endif /*__MUSIC_BASE_VIEW_H__*/ + diff --git a/include/bus.h b/include/bus.h new file mode 100644 index 0000000..d62a244 --- /dev/null +++ b/include/bus.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef __BUS_H__ +#define __BUS_H__ + +void bus_send_signal(); + +#endif /*__BUS_H__*/ diff --git a/include/category-layout.h b/include/category-layout.h new file mode 100644 index 0000000..ae50715 --- /dev/null +++ b/include/category-layout.h @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef __CATEGORY_LAYOUT_H__ +#define __CATEGORY_LAYOUT_H__ + + +class CCategoryLayout : public CExtBaseLayout, public CListenerMgr, public IKeyDownListener { +private: + struct SCategoryLayout *m; + +public: + enum EDepthType { + E_DEPTH_CATEGORY, + E_DEPTH_ALBUM, + E_DEPTH_SONG, + E_DEPTH_SELECT_LIST, + E_DEPTH_SHOW_LIST + }; + + enum ESelectType { + SELECT_CREATE, + SELECT_ADD, + SELECT_REMOVE + }; + + struct SCatItemInfo { + category_info *catinfo; + ECategoryType type; + album_info *alinfo; + SSongInfo *sinfo; + Elm_Object_Item *item; + bool check_status; + }; + +protected: + struct SCategoryLayoutProtected { + int depth; + category_info *c_catinfo; + album_info *c_alinfo; + SContentInfo *ctxtinfo; + ESelectType sel_type; + Evas_Object *grid; + Evas_Object *epopup; + Evas_Object *base; + Elm_Object_Item *focused_item; + } t; + +private: + static Eina_Bool sm_CbFocusIdler(void *dt); + Eina_Bool m_OnFocusIdler(void); + + static void sm_CbEntrynameSet(void *dt, const char *name); + void m_OnEntrynameSet(const char *name); + + static void sm_CbSelectAllClicked(void *dt, Evas_Object *obj, void *ev); + void m_OnSelectAllClicked(Evas_Object *obj, void *ev); + + static void sm_CbDoneBtnClicked(void *dt, Evas_Object *obj, void *ev); + void m_OnDoneBtnClicked(Evas_Object *obj, void *ev); + + static void sm_CbCancelBtnClicked(void *dt, Evas_Object *obj, void *ev); + void m_OnCancelBtnClicked(Evas_Object *obj, void *ev); + + static void sm_CbPlayBtnClicked(void *dt, Evas_Object *obj, void *ev); + void m_OnPlayBtnClicked(Evas_Object *obj, void *ev); + + static void sm_CbNextBtnClicked(void *dt, Evas_Object *obj, void *ev); + void m_OnNextBtnClicked(Evas_Object *obj, void *ev); + + static void sm_CbLastBtnClicked(void *dt, Evas_Object *obj, void *ev); + void m_OnLastBtnClicked(Evas_Object *obj, void *ev); + + static char *sm_CbGetSelectlistItemText(void *data, Evas_Object *obj, const char *part); + static char *sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part); + static void sm_CbRemoveListItem(void *data, Evas_Object *obj); + + static void sm_CbSongItemSelect(void *data, Evas_Object *obj, void *event_info); + void m_OnSongItemSelect(Evas_Object *obj, Elm_Object_Item *event_info); + + static void sm_CbSelectlistItemSelect(void *data, Evas_Object *obj, void *event_info); + void m_OnSelectlistItemSelect(Evas_Object *obj, void *event_info); + + static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid); +protected: + virtual void t_OnCtxtUpdate(enum EActionType type, int lid); + +private: + static void sm_CbCtxtClose(void *dt); + void m_OnCtxtClose(void); + + static char *sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part); + static char *sm_CbGetGridAlbumItemText(void *data, Evas_Object *obj, const char *part); + static Evas_Object *sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part); + static Evas_Object *sm_CbGetGridAlbumitemContent(void *data, Evas_Object *obj, const char *part); + static void sm_CbRemoveGridItem(void *data, Evas_Object *obj); + + static void sm_CbItemSelect(void *data, Elm_Object_Item *it, const char *emission, const char *source); + void m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source); + + static void sm_CbGengridRealized(void *data, Evas_Object *obj, void *event_info); + static void sm_CbGengridUnrealized(void *data, Evas_Object *obj, void *event_info); + + static void sm_CbKeyDown(void *dt, Evas *e, Evas_Object *obj, void *ei); + void m_OnKeyDown(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); + + static void sm_CbKeyPressed(void *dt, Evas *e, Evas_Object *obj, void *ei); + void m_OnKeyPressed(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); + +private: + inline int m_ConvertToMin(int milsec); + void m_RemoveFocusIdler(void); + Elm_Object_Item *m_FindItemByInfo(Eina_List *list, void *info); + SCatItemInfo *m_FindItemInfo(Eina_List *list, Elm_Object_Item *item); + void m_GotoPlayback(int mode, char *id); + Eina_List *m_GetSelectedList(Eina_List *infolist, int type); + void m_AddSelectedSongs(void); + void m_RemoveSelectedSongs(void); + void m_AddAlbumsToPlayback(int mode); + void m_AddSongsToPlayback(int mode); + Evas_Object *m_AddAlbumCover(void); + Evas_Object *m_AddGrid(void); + void m_AddCategoryItem(Elm_Gengrid_Item_Class *grid_item, ECategoryType type, void *info); + void m_AddButtons(void); + void m_AddSelectlistButtons(void); + + void m_CreateSongsTopSection(void); + void m_CreateSongList(void); + void m_CreateAlbumgrid(void); + void m_CreateCatgrid(bool sort_flag); + void m_SortCatgrid(void); + void m_EmptyLayout(bool sort_flag); + +protected: + bool t_SetEdje(const char *layout); + void t_UpdateLayout(bool sort_flag); + void t_UpdateLayoutWithFocus(void); + +protected: + virtual void t_OnShow(void); + +protected: + virtual void t_HandleItemSelect(SCatItemInfo *itinfo) = 0; + virtual EContextType t_ContextType(void) = 0; + virtual bool t_GetMediaList(Eina_List **list) = 0; + virtual ECategoryType t_CategoryType(void) = 0; + +public: + CCategoryLayout(const char *pLayoutId) : CExtBaseLayout(pLayoutId), IKeyDownListener(this), m(0) { + memset(&t, 0, sizeof(t)); + } + virtual ~CCategoryLayout() {} + + bool Create(CLayoutMgr *mgr); + virtual void Destroy(void); + + virtual void Update(bool focusFlag); + +public: + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); +}; + + +#endif /*__CATEGORY_LAYOUT_H__*/ diff --git a/include/category_info.h b/include/category_info.h new file mode 100644 index 0000000..cd42a85 --- /dev/null +++ b/include/category_info.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CATEGORY_INFO_H__ +#define __CATEGORY_INFO_H__ +#include + +struct list_member { + char *media_id; + int member_id; +}; + +struct category_info { + int id; + const char *name; + char *thumb; + int album_count; + int song_count; + Eina_List *albumlist; + Eina_List *memberlist; +}; + +struct category_info *category_info_create(); +void category_info_destroy(struct category_info *catinfo); + +int category_info_get_category_id(struct category_info *catinfo); +const char *category_info_get_name(struct category_info *catinfo); +char *category_info_get_thumb(struct category_info *catinfo); +int category_info_get_albumcount(struct category_info *catinfo); +int category_info_get_songcount(struct category_info *catinfo); +Eina_List *category_info_get_albumlist(struct category_info *catinfo); +Eina_List *category_info_get_memberlist(struct category_info *catinfo); +struct category_info *category_info_duplicate(struct category_info *catinfo); +int sortcategorys_za(const void *d1, const void *d2); +int sortcategorys_az(const void *d1, const void *d2); +struct category_info *find_category(Eina_List *list, const char *category); + +#endif /*__CATEGORY_INFO_H__*/ diff --git a/include/common-ui.h b/include/common-ui.h new file mode 100644 index 0000000..79b7a22 --- /dev/null +++ b/include/common-ui.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef __COMMON_UI_H__ +#define __COMMON_UI_H__ + +#include + +enum EAddType; +struct view_mgr; + +char *_get_timestr_from_milseconds(int mseconds); +void _set_object_text(Evas_Object *lbl, char *text, int size, + const char *style); +Evas_Object *_add_box(Evas_Object *base); +Evas_Object *_add_base(Evas_Object *win, const char *layout); +void _object_mouse_moved(void *dt, Evas *e, Evas_Object *obj, void *ei); +void _genlist_mouse_moved(void *dt, Evas *e, Evas_Object *obj, void *ei); +void _gengrid_mouse_moved(void *dt, Evas *e, + Evas_Object *obj, void *event_info); +void _update_playback_view(enum EAddType type, + Evas_Object *layout, Elm_Object_Item *focused_item); +void _create_message_box(Evas_Object *base, const char *msg); +Evas_Object *_create_remove_popup(Evas_Object *base, const char *msg, + Evas_Object_Event_Cb _close_cb, Evas_Smart_Cb _remove_cb, + Evas_Smart_Cb _cancel_cb, void *dt); +#endif /*__COMMON_UI_H__*/ diff --git a/include/common.h b/include/common.h new file mode 100644 index 0000000..6f7fae1 --- /dev/null +++ b/include/common.h @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __COMMON_H__ +#define __COMMON_H__ + + +struct SCbInfo { + void (*cb)(void *dt); + void *data; + int type; +}; + +struct SCtxtPlaylistItem { + char *name; + int id; +}; + +enum { + GRP_SONG, + GRP_ALBUM, + GRP_ARTIST, + GRP_GENRE, + GRP_FOLDER, + GRP_PLAYLISTS +}; + +enum ESourceType { + SOURCE_TYPE_NONE = -1, + SOURCE_TYPE_ALL, + SOURCE_TYPE_TV, + SOURCE_TYPE_USB +}; + +enum sorttype { + E_SORT_TITLE_A_Z, + E_SORT_TITLE_Z_A, + E_SORT_ARTIST_A_Z, + E_SORT_ARTIST_Z_A, + E_SORT_ALBUM_A_Z, + E_SORT_ALBUM_Z_A +}; + +enum EAddType { + ADD_TYPE_FRESH, + ADD_TYPE_NEXT, + ADD_TYPE_END +}; + + +enum ETopBtnType { + TOP_BTN_TYPE_PLAYBACK, + TOP_BTN_TYPE_SOURCE, + TOP_BTN_TYPE_SORT, +}; + +enum EPlayStatus { + PLAY_STATUS_INITIAL = -1, + PLAY_STATUS_STOP, + PLAY_STATUS_PLAY, + PLAY_STATUS_PAUSE +}; + +enum EShuffleStatus { + SHUFFLE_STATUS_OFF = 0, + SHUFFLE_STATUS_ON +}; + +enum ERepeatStatus { + REPEAT_STATUS_NONE = 0, + REPEAT_STATUS_ALL, + REPEAT_STATUS_ONE +}; + +enum update_type { + E_KEY_PRESS, + E_KEY_RELEASE, + E_PLAYLIST_UPDATE, + E_FOCUS_UPDATE, + E_LAYOUT_UPDATE, + E_DEPTH_UPDATE, + E_SONG_UPDATE +}; + +enum EListType { + LIST_TYPE_SONG, + LIST_TYPE_ALBUM, + LIST_TYPE_ALBUM_SONG, + LIST_TYPE_FOLDER, + LIST_TYPE_FOLDER_SONG, + LIST_TYPE_ARTIST, + LIST_TYPE_GENRE, + LIST_TYPE_PLAYLISTS, + LIST_TYPE_PLAYLISTS_SONG +}; + +enum cb_type { + E_SONG_COMPLETE, + E_CONTENT_UPDATE, + E_USB_CONNECT, + E_PLAYBACK_ERROR, + E_CALLBACK_MAX +}; + +enum EContextType { + CONTEXT_TYPE_SONG, + CONTEXT_TYPE_ALBUM, + CONTEXT_TYPE_ARTIST, + CONTEXT_TYPE_GENRE, + CONTEXT_TYPE_FOLDER, + CONTEXT_TYPE_PLAYLIST, + CONTEXT_TYPE_PLAYSONG +}; + +enum EActionType { + ACTION_TYPE_PLAY, + ACTION_TYPE_ADDNEXT, + ACTION_TYPE_ADDLAST, + ACTION_TYPE_DELETE, + ACTION_TYPE_ADDTO, + ACTION_TYPE_RENAME, + ACTION_TYPE_ADDSONG, + ACTION_TYPE_REMOVESONG, +}; + +struct SContentInfo { + enum EContextType type; + enum EPlayStatus status; + + void (*update)(void *data, enum EActionType type, int id); + void (*close)(void *data); + + void *cbdata; + void *context; +}; + +enum ECategoryType { + CAT_TYPE_ARTIST, + CAT_TYPE_GENRE, + CAT_TYPE_PLAYLISTS, + CAT_TYPE_PLAYLIST_NEW +}; + +struct SParcel { + SContentInfo *ctxtInfo; + int updateType; + const char *layoutId; + const char *keyEvent; +}; + +// this values should be defined +#define KEY_PLAY "Play" +#define KEY_ENTER "Enter" +#define KEY_NEXT "Next" +#define KEY_PREVIOUS "Previous" +#define KEY_EXIT "Exit" + + +#endif /* __COMMON_H__ */ diff --git a/include/context-view.h b/include/context-view.h new file mode 100644 index 0000000..c3c852c --- /dev/null +++ b/include/context-view.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef __CONTEXT_VIEW_H__ +#define __CONTEXT_VIEW_H__ + + +struct SContentInfo; +struct SRltvCtnt; + +class CContextView : public CBaseView, public CListenerMgr, public IKeyDownListener { +private: + struct SContextView* m; + +private: + static void sm_CbRltdCtntSelected(void *data, Evas_Object *obj, const char *emission, const char *source); + static void sm_CbAddScroller(void *cookie, Evas_Object *base, Evas_Object **scroller); + void m_OnAddScroller(Evas_Object *base, Evas_Object **scroller); + +private: + Evas_Object *m_AddScroller(Evas_Object *base); + void m_SetBtnDownFocus(Evas_Object *btn); + void m_SetLayoutFocusOrder(Evas_Object *btn); + void m_SetBtnsFocusOrder(Evas_Object *btn, Evas_Object *prv, + int btnTypeIndex, int btnTypeFirst, int btnTypeLast); + bool m_AddBtnLabel(Evas_Object *btn, const char *txt); + bool m_AddBtnIcon(Evas_Object *btn, const char *icon); + bool m_AddBtnInfo(Evas_Object *btn, const char *icon, const char *txt); + Evas_Object *m_AddButton(Evas_Object *base); + Evas_Object *m_AddBtnBox(Evas_Object *base); + bool m_CreateBtnsPart(void); + Eina_List *m_OtherSongsOfArtist(char *artist, char *title); + Eina_List *m_OtherAlbumsOfArtist(char *artist, char *album); + Eina_List *m_OtherSimilarArtist(char *artist); + Eina_List *m_OtherSongsOfGenre(char *genre); + SRltvCtnt *m_InfoOfAlbum(char *album); + SRltvCtnt *m_InfoOfArtist(char *artist); + SRltvCtnt *m_InfoOfGenre(char *genre); + bool m_GetContextDetails(SContentInfo *cinfo, char **path, + char **title, char **subtitle, char **subtitle2, + char **rltvtitle, SRltvCtnt **ctntinfo, + Eina_List **rltvlist); + Evas_Object *m_AddRltvCtnt(Evas_Object *obj, char *name, char *icon); + bool m_AddTableContents(Eina_List *list); + Evas_Object *m_AddTable(Evas_Object *base); + bool m_CreateRltvContent(Eina_List *list); + bool m_CreateMoreinfoLayout(SRltvCtnt *rctnt, Evas_Object *img); + bool m_CreateInfoPart(void); + bool m_CreateFullView(void); + +protected: + virtual void t_OnShow(void); + virtual void t_OnHide(void); + virtual void t_OnUpdate(void* data); + +public: + CContextView(const char *pViewId) : CBaseView(pViewId), IKeyDownListener(this), m(0) {} + virtual ~CContextView() {} + + virtual bool Create(void *data); + virtual void Destroy(void); + + virtual Evas_Object* Base(void); + +public: + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); +}; + + +#endif /*__CONTEXT_VIEW_H__*/ diff --git a/include/dbg.h b/include/dbg.h new file mode 100644 index 0000000..6163a5c --- /dev/null +++ b/include/dbg.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DBG_H__ +#define __DBG_H__ + +#include + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "org.tizen.music-player-tv-ref" + +#ifndef _ERR +#define _ERR(fmt, args...) LOGE("[%s:%d] "fmt"\n", __func__, __LINE__, ##args) +#endif + +#ifndef _DBG +#define _DBG(fmt, args...) LOGD("[%s:%d] "fmt"\n", __func__, __LINE__, ##args) +#endif + +#ifndef _INFO +#define _INFO(fmt, args...) LOGI("[%s:%d] "fmt"\n", __func__, __LINE__, ##args) +#endif + +/* enums */ +enum music_error_status { + MUSIC_ERROR = -1, + MUSIC_ERROR_NONE +}; + +#endif /* __DBG_H__ */ diff --git a/include/define.h b/include/define.h new file mode 100644 index 0000000..32eeb51 --- /dev/null +++ b/include/define.h @@ -0,0 +1,412 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DEFINE_H__ +#define __DEFINE_H__ + +/* TEXT */ +#define NO_MUSIC_MESSAGE N_("No Music") +#define NO_MUSIC_MESSAGE_SUB \ + "There is no music in selected source" +#define NO_PLAYLIST_MESSAGE N_("No Music") +#define NO_PLAYLIST_MESSAGE_SUB N_("No music in playback") +#define MUSIC_TEXT_LOADING N_("Updating...") +#define MUSIC_TEXT_PLAYBACK_ERROR \ + N_("Could not read from source. Please check source.") + +#define MUSIC_STR_EMPTY "" +#define MUSIC_STR_PLAY N_("Play") +#define MUSIC_STR_ADDNEXT N_("Add Next") +#define MUSIC_STR_ADDLAST N_("Add Last") +#define MUSIC_TEXT_SONG N_("SONG") +#define MUSIC_TEXT_ARTIST N_("ARTIST") +#define MUSIC_TEXT_ALBUM N_("ALBUM") +#define MUSIC_TEXT_GENRE N_("GENRE") +#define MUSIC_TEXT_FOLDER N_("FOLDER") +#define MUSIC_TEXT_PLAYLIST N_("PLAYLIST") +#define MUSIC_TEXT_CREATE_PLAYLIST N_("Create Playlist") +#define MUSIC_TEXT_MIN N_("min") +#define MUSIC_TEXT_OK N_("OK") +#define MUSIC_TEXT_EDIT_PLAYLIST N_("Edit playback") +#define MUSIC_TEXT_CLEAR_PLAYLIST N_("Clear playback") +#define MUSIC_TEXT_CANCEL N_("Cancel") +#define MUSIC_TEXT_DESELECT N_("Deselect all") +#define MUSIC_TEXT_DELETE N_("Delete") +#define MUSIC_TEXT_SONGS N_("Songs") +#define MUSIC_TEXT_PLAY_THIS N_("PLAY THIS") +#define MUSIC_TEXT_ADD_NEXT N_("ADD NEXT") +#define MUSIC_TEXT_ADD_LAST N_("ADD LAST") +#define MUSIC_TEXT_DEL N_("DELETE") +#define MUSIC_TEXT_PLAY N_("PLAY") +#define MUSIC_TEXT_PAUSE N_("PAUSE") +#define MUSIC_TEXT_ADD_TO_PLAYLIST N_("ADD TO PLAYLIST") +#define MUSIC_TEXT_MOREINFO N_("More information") +#define MUSIC_TEXT_SONG_RLTV N_("Other songs of artist") +#define MUSIC_TEXT_ALBUM_RLTV N_("Other albums of artist") +#define MUSIC_TEXT_ARTIST_RLTV N_("Other similar artists") +#define MUSIC_TEXT_GENRE_RLTV N_("Other songs of genre") +#define MUSIC_TEXT_SELECT_ALL N_("Select All") +#define MUSIC_TEXT_DESELECT_ALL N_("Deselect All") +#define MUSIC_TEXT_LIST_DONE N_("Done") +#define MUSIC_TEXT_LIST_CANCEL N_("Cancel") +#define MUSIC_TEXT_NEXT_MSG N_("Songs are added next to current playing.") +#define MUSIC_TEXT_LAST_MSG N_("Songs are added to end of playback list.") +#define MUSIC_TEXT_ADDTO_MSG N_("Songs are added to selected playlist.") +#define MUSIC_TEXT_INUSE_MSG N_("List with same name exists. Give new name.") +#define MUSIC_TEXT_RENAME N_("RENAME") +#define MUSIC_TEXT_ADDSONG N_("ADD SONGS") +#define MUSIC_TEXT_REMOVESONG N_("REMOVE SONGS") +#define MUSIC_TEXT_LIST_CREATE_MSG N_("Select songs to create playlist.") +#define MUSIC_TEXT_LIST_ADD_MSG N_("Select songs to add to playlist.") +#define MUSIC_TEXT_LIST_REMOVE_MSG \ + N_("Select songs to remove from playlist.") +#define MUSIC_TEXT_NO_SONGS N_("There are no songs in the playlist") +#define MUSIC_TEXT_REMOVE N_("Remove") +#define MUSIC_TEXT_REMOVE_PLMSG \ + N_("Are you sure to delete this playlist?") +#define MUSIC_TEXT_REMOVE_SMSG \ + N_("Are you sure to remove this song from playback?") +#define MUSIC_TEXT_NOLIST_MSG \ + N_("There are no playlists. Create one using \"PLAYLIST\".") +#define MUSIC_TEXT_EMPTY_NAME \ + N_("Playlist name can not be empty. Please give some name.") + +/* FONTS */ +#define FONT_STYLE_REGULAR "TizenSans" +#define FONT_STYLE_BOLD "TizenSans:style=Bold" +#define FONT_STYLE_MEDIUM "TizenSans:style=Medium" + +/* GENERAL */ +#define MAX_LENGTH 1024 +#define MUSIC_MESSAGE_LAYOUT "MUSIC_MESSAGE_LAYOUT" +#define MUSIC_PART_MESSAGE "MUSIC_PART_MESSAGE" +#define RGB_MUSIC 229 72 113 +#define RGBA_BLACK_BG 0 0 0 (255*0.9) +#define RGBA_COLOR_BG RGB_MUSIC (255*0.25) + +/* BASE VIEW MACROS */ +#define BASE_VIEW_DATA "BASE_VIEW_DATA" +#define MUSIC_BASE_VIEW "MUSIC_BASE_VIEW" + +#define MUSIC_TEXT_TITLE "MUSIC" +#define MUSIC_TEXT_PLAYBACK_BTN "Playback" +#define MUSIC_PART_TITLE "MUSIC_PART_TITLE" +#define MUSIC_PART_MUSIC_ICON "MUSIC_PART_MUSIC_ICON" +#define MUSIC_PART_PLAY_ICON "MUSIC_PART_PLAY_ICON" +#define MUSIC_PART_PLAYBACK_ICON "MUSIC_PART_PLAY_ICON" +#define MUSIC_PART_GROUPBTN_BOX "MUSIC_PART_GROUPBTN_BOX" +#define MUSIC_PART_SOURCE_HOVERSEL "MUSIC_PART_SOURCE_HOVERSEL" +#define MUSIC_PART_SORT_HOVERSEL "MUSIC_PART_SORT_HOVERSEL" +#define MUSIC_PART_SORT_POPUP "MUSIC_PART_SORT_POPUP" +#define MUSIC_PART_SOURCE_POPUP "MUSIC_PART_SOURCE_POPUP" +#define MUSIC_PART_CONTENT "MUSIC_PART_CONTENT" +#define MUSIC_PART_PLAYBACK_BTN "MUSIC_PART_PLAYBACK_BTN" +#define MUSIC_PART_PLAYSONG_LBL "MUSIC_PART_PLAYSONG_LBL" +#define MUSIC_PART_NO_CONTENT "MUSIC_PART_NO_CONTENT" +#define MUSIC_PART_NO_CONTENT_SUB "MUSIC_PART_NO_CONTENT_SUB" + + /* styles */ +#define MUSIC_STYLE_SORT_BTN "music_sortbtn" +#define MUSIC_STYLE_SOURCE_BTN "music_sourcebtn" +#define MUSIC_STYLE_HOVER_ENTRY "music_hover_entry" +#define MUSIC_STYLE_HOVER_CTXPOPUP "music-common-popup" +#define MUSIC_STYLE_GROUPBTN "menubtn" +#define MUSIC_STYLE_PLAYSONG_LBL "slide_long" +#define MUSIC_STYLE_PLAYBACK_BTN "playbackbtn" +#define MUSIC_STYLE_WIN_FOCUS "invisible" +#define MUSIC_STYLE_LOADING_POPUP "loading" +#define MUSIC_STYLE_ERROR_POPUP "message" +#define MUSIC_STYLE_LOADING_LABEL "popup/loading" +#define MUSIC_STYLE_ERROR_LABEL "popup/message" + +/* PLAYBACK VIEW MACROS */ +#define PLAYBACK_VIEW_DATA "PLAYBACK_VIEW_DATA" + +#define MUSIC_PLAYBACK_VIEW "MUSIC_PLAYBACK_VIEW" +#define MUSIC_SETTINGS_LAYOUT "MUSIC_SETTINGS_LAYOUT" +#define MUSIC_VOLUME_LAYOUT "MUSIC_VOLUME_LAYOUT" + +#define MUSIC_PART_ALBUMCOVER "MUSIC_PART_ALBUMCOVER" +#define MUSIC_PART_PROGRESSTIME "MUSIC_PART_PROGRESSTIME" +#define MUSIC_PART_PROGRESSBAR "MUSIC_PART_PROGRESSBAR" +#define MUSIC_PART_FULLTIME "MUSIC_PART_FULLTIME" +#define MUSIC_PART_SONGINFO "MUSIC_PART_SONGINFO" +#define MUSIC_PART_CONTROLBTNS "MUSIC_PART_CONTROLBTNS" +#define MUSIC_PART_EDITBTNS "MUSIC_PART_EDITBTNS" +#define MUSIC_PART_SONG_TITLE "MUSIC_PART_SONG_TITLE" +#define MUSIC_PART_ARTIST_ALBUM "MUSIC_PART_ARTIST_ALBUM" +#define MUSIC_PART_PLAYLIST "MUSIC_PART_PLAYLIST" +#define MUSIC_PART_SETTINGS_BTNBOX "MUSIC_PART_SETTINGS_BTNBOX" +#define MUSIC_PART_SETTINGS_POPUP "MUSIC_PART_SETTINGS_POPUP" +#define MUSIC_PART_PLAYBACK_SHADOW "MUSIC_PART_PLAYBACK_SHADOW" +#define MUSIC_PART_VOLUME_BAR "MUSIC_PART_VOLUME_BAR" +#define MUSIC_PART_VOLUME_LAYOUT "MUSIC_PART_VOLUME_LAYOUT" +#define MUSIC_PART_VOLUME_VALUE "MUSIC_PART_VOLUME_VALUE" + +#define MUSIC_CONTROL_BTNS_PADDING 26 +#define MUSIC_EDIT_BTNS_PADDING 10 + + /* styles */ +#define MUSIC_STYLE_BTN_SETTINGS "music_btn_settings" +#define MUSIC_STYLE_BTN_SHUFFLE "music_btn_shuffle" +#define MUSIC_STYLE_BTN_REPEAT "music_btn_repeat" +#define MUSIC_STYLE_BTN_PLAY "music_btn_play" +#define MUSIC_STYLE_BTN_REWIND "music_btn_rewind" +#define MUSIC_STYLE_BTN_FORWARD "music_btn_forward" +#define MUSIC_STYLE_EDIT_BTN "music_btn_edit" +#define MUSIC_STYLE_SETTING_BTN_T "music_btn_settings_option_t" +#define MUSIC_STYLE_SETTING_BTN_B "music_btn_settings_option_b" +#define MUSIC_STYLE_SLIDER "music_progress_slider" +#define MUSIC_STYLE_SETTING_POPUP "music-common-popup" +#define MUSIC_STYLE_PLAYLIST_ODD "music_playlist_odd" +#define MUSIC_STYLE_PLAYLIST_EVEN "music_playlist_even" +#define MUSIC_STYLE_PLAYLIST "music_playlist" +#define MUSIC_STYLE_VOLUME_BAR "music_volume_bar" + +/* CONTEXT VIEW MACROS */ +#define CONTEXT_VIEW_DATA "CONTEXT_VIEW_DATA" +#define MUSIC_CONTEXT_VIEW "MUSIC_CONTEXT_VIEW" +#define MUSIC_CONTEXT_BTN "MUSIC_CONTEXT_BTN" +#define MUSIC_CONTEXT_INFO "MUSIC_CONTEXT_INFO" +#define MUSIC_CONTEXT_REL_CONTENT "MUSIC_CONTEXT_REL_CONTENT" +#define MUSIC_PART_CTXT_ICON "MUSIC_PART_CTXT_ICON" +#define MUSIC_PART_CTXT_TITLE "MUSIC_PART_CTXT_TITLE" +#define MUSIC_PART_CTXT_SUBTITLE "MUSIC_PART_CTXT_SUBTITLE" +#define MUSIC_PART_CTXT_SUBTITLE2 "MUSIC_PART_CTXT_SUBTITLE2" +#define MUSIC_PART_CTXT_BTNAREA "MUSIC_PART_CTXT_BTNAREA" +#define MUSIC_PART_CTXT_BTNBG "MUSIC_PART_CTXT_BTNBG" +#define MUSIC_PART_CTXT_BTNICON "MUSIC_PART_CTXT_BTNICON" +#define MUSIC_PART_CTXT_BTNTEXT "MUSIC_PART_CTXT_BTNTEXT" +#define MUSIC_PART_CTXT_RELCTNTTEXT "MUSIC_PART_CTXT_RELCTNTTEXT" +#define MUSIC_PART_CTXT_RELCTNTAREA "MUSIC_PART_CTXT_RELCTNTAREA" +#define MUSIC_PART_CTXT_BTNBG_NOR "function_button_nor.png" +#define MUSIC_PART_CTXT_BTNBG_FOC "function_button_foc.png" +#define MUSIC_PART_CTXT_RELCTNT_ICON "MUSIC_PART_CTXT_RELCTNT_ICON" +#define MUSIC_PART_CTXT_RELCTNT_NAME "MUSIC_PART_CTXT_RELCTNT_NAME" +#define MUSIC_PART_CTXT_INFO "MUSIC_PART_CTXT_INFO" +#define MUSIC_PART_CTXT_INFOICON "MUSIC_PART_CTXT_INFOICON" +#define MUSIC_PART_CTXT_INFOTEXT "MUSIC_PART_CTXT_INFOTEXT" +#define MUSIC_PART_LIST_POPUP "MUSIC_PART_LIST_POPUP" +#define MUSIC_PART_PLIST_POPUP "MUSIC_PART_PLIST_POPUP" +#define MUSIC_PART_RPOPUP_TITLE "title,text" +#define MUSIC_PART_RPOPUP_BTN1 "button1" +#define MUSIC_PART_RPOPUP_BTN2 "button2" +#define MUSIC_STYLE_TOPTEXT_BTN "music_toptext_btn" +#define MUSIC_STYLE_BOTTOMTEXT_BTN "music_bottomtext_btn" +#define MUSIC_STYLE_MIDDLETEXT_BTN "music_middletext_btn" +#define MUSIC_STYLE_LIST_POPUP "music_listpopup" +#define MUSIC_STYLE_REMOVE_POPUP "title.3line.2button" +#define MUSIC_STYLE_REMOVE_LABEL "popup/title.3line.2button" + +/* SONG LAYOUT MACROS */ +#define SONG_LAYOUT_DATA "SONG_LAYOUT_DATA" +#define MUSIC_SONG_LAYOUT "MUSIC_SONG_LAYOUT" +#define MUSIC_PART_SONGLIST "MUSIC_PART_SONGLIST" +#define MUSIC_STYLE_SONGLIST "music_songlist" + +/* ALBUM LAYOUT MACROS */ +#define ALBUM_LAYOUT_DATA "ALBUM_LAYOUT_DATA" +#define MUSIC_ALBUM_LAYOUT "MUSIC_ALBUM_LAYOUT" +#define MUSIC_PART_ALBUM_GRID "MUSIC_PART_ALBUM_GRID" +#define MUSIC_STYLE_ALBUM_GRID "music_albumgrid" + +/* FOLDER LAYOUT MACROS */ +#define FOLDER_LAYOUT_DATA "FOLDER_LAYOUT_DATA" +#define MUSIC_FOLDER_LAYOUT "MUSIC_FOLDER_LAYOUT" +#define MUSIC_PART_FOLDER_GRID "MUSIC_PART_FOLDER_GRID" +#define MUSIC_STYLE_FOLDER_GRID "music_albumgrid" +#define MUSIC_PART_FOLDER_NAME "MUSIC_PART_FOLDER_NAME" +#define MUSIC_PART_FOLDER_SONGCOUNT "MUSIC_PART_FOLDER_SONGCOUNT" +#define MUSIC_PART_FOLDER_TIME "MUSIC_PART_FOLDER_TIME" +#define MUSIC_PART_FOLDER_PLAYBTN "MUSIC_PART_FOLDER_PLAYBTN" +#define MUSIC_PART_FOLDER_NEXTBTN "MUSIC_PART_FOLDER_NEXTBTN" +#define MUSIC_PART_FOLDER_LASTBTN "MUSIC_PART_FOLDER_LASTBTN" + +/* CATEGORY LAYOUT MACROS */ +#define CATEGORY_LAYOUT_DATA "CATEGORY_LAYOUT_DATA" +#define MUSIC_CATEGORY_LAYOUT "MUSIC_CATEGORY_LAYOUT" +#define MUSIC_CATEGORY_ARTIST_LAYOUT "MUSIC_CATEGORY_ARTIST_LAYOUT" +#define MUSIC_CATEGORY_GENRE_LAYOUT "MUSIC_CATEGORY_GENRE_LAYOUT" +#define MUSIC_CATEGORY_PLAYLISTS_LAYOUT "MUSIC_CATEGORY_PLAYLISTS_LAYOUT" +#define MUSIC_CATEGORY_ALBUM_LAYOUT "MUSIC_CATEGORY_ALBUM_LAYOUT" +#define MUSIC_CATEGORY_SONGS_LAYOUT "MUSIC_CATEGORY_SONGS_LAYOUT" +#define MUSIC_CATEGORY_SELECTLIST_LAYOUT "MUSIC_CATEGORY_SELECTLIST_LAYOUT" +#define MUSIC_PART_CATEGORY_GRID "MUSIC_PART_CATEGORY_GRID" +#define MUSIC_PART_CATEGORY_ALBUM_GRID "MUSIC_PART_CATEGORY_ALBUM_GRID" +#define MUSIC_PART_CATEGORY_NAME "MUSIC_PART_CATEGORY_NAME" +#define MUSIC_PART_SONG_IMAGE "MUSIC_PART_SONG_IMAGE" +#define MUSIC_PART_CATEGORY_SONGCOUNT "MUSIC_PART_CATEGORY_SONGCOUNT" +#define MUSIC_PART_ALBUM_IMAGE "MUSIC_PART_ALBUM_IMAGE" +#define MUSIC_PART_CATEGORY_ALBUMCOUNT "MUSIC_PART_CATEGORY_ALBUMCOUNT" +#define MUSIC_PART_CATEGORY_PLAYBTN "MUSIC_PART_CATEGORY_PLAYBTN" +#define MUSIC_PART_CATEGORY_NEXTBTN "MUSIC_PART_CATEGORY_NEXTBTN" +#define MUSIC_PART_CATEGORY_LASTBTN "MUSIC_PART_CATEGORY_LASTBTN" +#define MUSIC_PART_LIST_SELECT_ALL "MUSIC_PART_LIST_SELECT_ALL" +#define MUSIC_PART_LIST_DONE_BTN "MUSIC_PART_LIST_DONE_BTN" +#define MUSIC_PART_LIST_CANCEL_BTN "MUSIC_PART_LIST_CANCEL_BTN" +#define MUSIC_PART_LIST_MSG "MUSIC_PART_LIST_MSG" +#define MUSIC_STYLE_CATEGORY_GRID "music_albumgrid" +#define MUSIC_STYLE_LIST_BTN "music_listbtn" +#define MUSIC_STYLE_SELECT_LIST "music_selectlist" + +/* GENRE LAYOUT MACROS */ +#define GENRE_LAYOUT_DATA "GENRE_LAYOUT_DATA" +#define MUSIC_GENRE_LAYOUT "MUSIC_GENRE_LAYOUT" + +/* ALBUM SONGS LAYOUT MACROS */ +#define ALBUM_SONGS_LAYOUT_DATA "ALBUM_SONGS_LAYOUT_DATA" +#define MUSIC_ALBUM_SONGS_LAYOUT "MUSIC_ALBUM_SONGS_LAYOUT" +#define MUSIC_STYLE_ALBUM_SONGLIST "music_album_songlist" +#define MUSIC_PART_ALBUM_THUMB "MUSIC_PART_ALBUM_THUMB" +#define MUSIC_PART_ALBUM_NAME "MUSIC_PART_ALBUM_NAME" +#define MUSIC_PART_ALBUM_ARTIST "MUSIC_PART_ALBUM_ARTIST" +#define MUSIC_PART_COUNT_IMAGE "MUSIC_PART_COUNT_IMAGE" +#define MUSIC_PART_ALBUM_SONGCOUNT "MUSIC_PART_ALBUM_SONGCOUNT" +#define MUSIC_PART_TIME_IMAGE "MUSIC_PART_TIME_IMAGE" +#define MUSIC_PART_ALBUM_TIME "MUSIC_PART_ALBUM_TIME" +#define MUSIC_PART_ALBUM_PLAYBTN "MUSIC_PART_ALBUM_PLAYBTN" +#define MUSIC_PART_ALBUM_NEXTBTN "MUSIC_PART_ALBUM_NEXTBTN" +#define MUSIC_PART_ALBUM_LASTBTN "MUSIC_PART_ALBUM_LASTBTN" + /* styles */ +#define MUSIC_STYLE_ADD_PLAY_BTN "add_play_btn" +#define MUSIC_STYLE_ADD_NEXT_BTN "add_next_btn" +#define MUSIC_STYLE_ADD_LAST_BTN "add_last_btn" + +/* ENTRY POPUP LAYOUT MACROS */ +#define MUSIC_ENTRY_POPUP_LAYOUT "MUSIC_ENTRY_POPUP_LAYOUT" +#define MUSIC_ENTRY_POPUP_DATA "MUSIC_ENTRY_POPUP_DATA" +#define MUSIC_PART_ENTRY "MUSIC_PART_ENTRY" +#define MUSIC_STYLE_ENTRY "focus" + +/* SIGNAL MACROS */ +#define MUSIC_SIGNAL_CLICKED "clicked" +#define MUSIC_SIGNAL_FOCUSED "focused" +#define MUSIC_SIGNAL_UNFOCUSED "unfocused" +#define MUSIC_SIGNAL_SELECTED "selected" +#define MUSIC_SIGNAL_REPEATED "repeated" +#define MUSIC_SIGNAL_PRESSED "pressed" +#define MUSIC_SIGNAL_UNPRESSED "unpressed" +#define MUSIC_SIGNAL_CHANGED "changed" +#define MUSIC_SIGNAL_ACTIVATED "activated" +#define MUSIC_SIGNAL_REALIZED "realized" +#define MUSIC_SIGNAL_UNREALIZED "unrealized" +#define MUSIC_SIGNAL_SHOW "show" +#define MUSIC_SIGNAL_HIDE "hide" +#define MUSIC_SIGNAL_HIDELINE "MUSIC_SIGNAL_HIDELINE" +#define MUSIC_SIGNAL_BTN_CLICKED "MUSIC_SIGNAL_BTN_CLICKED" +#define MUSIC_SIGNAL_GROUP_SELECTED "MUSIC_SIGNAL_GROUP_SELECTED" +#define MUSIC_SIGNAL_GROUP_UNSELECTED "MUSIC_SIGNAL_GROUP_UNSELECTED" +#define MUSIC_SIGNAL_CONTROL_SELECTED "MUSIC_SIGNAL_CONTROL_SELECTED" +#define MUSIC_SIGNAL_EDIT_MODE "MUSIC_SIGNAL_EDIT_MODE" +#define MUSIC_SIGNAL_PLAYBACK_MODE "MUSIC_SIGNAL_PLAYBACK_MODE" +#define MUSIC_SIGNAL_SHUFFLE_OFF "MUSIC_SIGNAL_SHUFFLE_OFF" +#define MUSIC_SIGNAL_SHUFFLE_ON "MUSIC_SIGNAL_SHUFFLE_ON" +#define MUSIC_SIGNAL_REPEAT_OFF "MUSIC_SIGNAL_REPEAT_OFF" +#define MUSIC_SIGNAL_REPEAT_ALL "MUSIC_SIGNAL_REPEAT_ALL" +#define MUSIC_SIGNAL_REPEAT_ONE "MUSIC_SIGNAL_REPEAT_ONE" +#define MUSIC_SIGNAL_PLAY "MUSIC_SIGNAL_PLAY" +#define MUSIC_SIGNAL_PAUSE "MUSIC_SIGNAL_PAUSE" +#define MUSIC_SIGNAL_SELECT_ITEM "MUSIC_SIGNAL_SELECT_ITEM" +#define MUSIC_SIGNAL_UNSELECT_ITEM "MUSIC_SIGNAL_UNSELECT_ITEM" +#define MUSIC_SIGNAL_EDITMODE_ON "MUSIC_SIGNAL_EDITMODE_ON" +#define MUSIC_SIGNAL_EDITMODE_OFF "MUSIC_SIGNAL_EDITMODE_OFF" +#define MUSIC_SIGNAL_CHECK_ON "MUSIC_SIGNAL_CHECK_ON" +#define MUSIC_SIGNAL_CHECK_OFF "MUSIC_SIGNAL_CHECK_OFF" +#define MUSIC_SIGNAL_CHECK_CLICKED "MUSIC_SIGNAL_CHECK_CLICKED" +#define MUSIC_SIGNAL_ODD_ROW "MUSIC_SIGNAL_ODD_ROW" +#define MUSIC_SIGNAL_EVEN_ROW "MUSIC_SIGNAL_EVEN_ROW" +#define MUSIC_SIGNAL_VOLUME_MUTE "MUSIC_SIGNAL_VOLUME_MUTE" +#define MUSIC_SIGNAL_VOLUME_UNMUTE "MUSIC_SIGNAL_VOLUME_UNMUTE" +#define MUSIC_SIGNAL_CONTENT_CLICKED "MUSIC_SIGNAL_CONTENT_CLICKED" +#define MUSIC_SIGNAL_SHOW_PLAYLIST "MUSIC_SIGNAL_SHOW_PLAYLIST" + +/* IMAGE FILES */ +#define MUSIC_IMAGE_GRPBTN_SONG "ico_music_song.png" +#define MUSIC_IMAGE_GRPBTN_ALBUM "ico_music_album.png" +#define MUSIC_IMAGE_GRPBTN_ARTIST "ico_music_artist.png" +#define MUSIC_IMAGE_GRPBTN_GENRE "ico_music_genre.png" +#define MUSIC_IMAGE_GRPBTN_FOLDER "ico_music_folder.png" +#define MUSIC_IMAGE_GRPBTN_PLAYLISTS "ico_music_playlist.png" +#define MUSIC_IMAGE_CREATE_PLAYLIST "ico_newlist_music_126.png" +#define MUSIC_IMAGE_ICON "ico_music.png" +#define MUSIC_IMAGE_PLAY_ICON "music_ico_play.png" +#define MUSIC_IMAGE_PLAYBACK_ICON "music_ico_playback.png" +#define MUSIC_IMAGE_PLAYBACK_ROUND_ICON "round_rectangle_4X4.png" +#define MUSIC_IMAGE_PLAYBACK_ROUNDT_ICON "round_rectangle_4X4_top.png" +#define MUSIC_IMAGE_PLAYBACK_ROUNDB_ICON "round_rectangle_4X4_bottom.png" +#define MUSIC_GROUPBTN_BG "allbrowser_menu_bg.png" +#define MUSIC_IMAGE_BTN_NORMAL_BG "btn_bg_round_stroke.png" +#define MUSIC_IMAGE_BTN_FOCUS_BG "btn_bg_round_72x72.png" +#define MUSIC_IMAGE_BTN_SETTINGS "ico_setting.png" +#define MUSIC_IMAGE_BTN_REWIND "ico_rew.png" +#define MUSIC_IMAGE_BTN_FORWARD "ico_ff.png" +#define MUSIC_IMAGE_BTN_SHUFFLE_OFF "ico_shuffle_off.png" +#define MUSIC_IMAGE_BTN_SHUFFLE_ON "ico_shuffle_on.png" +#define MUSIC_IMAGE_BTN_REPEAT_OFF "ico_repeat_off.png" +#define MUSIC_IMAGE_BTN_REPEAT_ON "ico_repeat_on.png" +#define MUSIC_IMAGE_BTN_REPEAT_ONLY "ico_repeat_only.png" +#define MUSIC_IMAGE_BTN_PLAY "ico_play.png" +#define MUSIC_IMAGE_BTN_PAUSE "ico_pause.png" +#define MUSIC_IMAGE_SLIDER_NOB_NORMAL "music_progressbar_handle_nor.png" +#define MUSIC_IMAGE_SLIDER_NOB_FOCUS "music_progressbar_handle_foc.png" +#define MUSIC_IMAGE_SLIDER_NOB_DIM "music_progressbar_handle_dim.png" +#define MUSIC_IMAGE_PLAYBACK_SHADOW "music_playback_shadow.png" +#define MUSIC_IMAGE_UNCHECK_NORMAL "checkbox_uncheck_nor.png" +#define MUSIC_IMAGE_UNCHECK_FOCUS "checkbox_uncheck_foc.png" +#define MUSIC_IMAGE_UNCHECK_DIM "checkbox_uncheck_dim.png" +#define MUSIC_IMAGE_CHECK_NORMAL "checkbox_check_nor.png" +#define MUSIC_IMAGE_CHECK_FOCUS "checkbox_check_foc.png" +#define MUSIC_IMAGE_CHECK_DIM "checkbox_check_dim.png" +#define MUSIC_IMAGE_TICK "ico_check_foc.png" +#define MUSIC_IMAGE_POPUP_DOWN_ARROW "popover_arrow_down.png" +#define MUSIC_IMAGE_PULLDOWN_ARROW "ico_pulldown_nor.png" +#define MUSIC_IMAGE_DEFAULT_THUMB "ico_default_music_79.png" +#define MUSIC_IMAGE_DEFAULT_THUMB_450 "ico_default_music_450.png" +#define MUSIC_IMAGE_DEFAULT_THUMB_126 "ico_default_music_126.png" +#define MUSIC_IMAGE_DEFAULT_THUMB_180 "ico_default_music_180.png" +#define MUSIC_IMAGE_ADDBTN_BG_NORMAL "music_bg_button_nor.png" +#define MUSIC_IMAGE_ADDBTN_BG_FOCUS "music_bg_button_foc.png" +#define MUSIC_IMAGE_SONG_COUNT "music_ico_song.png" +#define MUSIC_IMAGE_ALBUM_TIME "music_ico_time.png" +#define MUSIC_IMAGE_ADD_PLAY "music_ico_add_play.png" +#define MUSIC_IMAGE_ADD_NEXT "music_ico_add_next.png" +#define MUSIC_IMAGE_ADD_LAST "music_ico_add_last.png" +#define MUSIC_IMAGE_FOLDER "ico_folder.png" +#define MUSIC_IMAGE_BACK "music_ico_back.png" +#define MUSIC_IMAGE_ALBUM_COUNT "music_ico_album.png" +#define MUSIC_IMAGE_LOADING "loading_48_01.png" +#define MUSIC_IMAGE_CTXT_BG "contextual_menu_bg.png" +#define MUSIC_IMAGE_CTXT_ITEM_BG "focused_app_bg.png" +#define MUSIC_IMAGE_CTXT_BTNBG_NOR "function_button_nor.png" +#define MUSIC_IMAGE_CTXT_BTNBG_FOC "function_button_foc.png" +#define MUSIC_IMAGE_CTXT_BTNPLAY "ico_play_nor.png" +#define MUSIC_IMAGE_CTXT_BTNPAUSE "ico_pause_nor.png" +#define MUSIC_IMAGE_CTXT_BTNNEXT "ico_addnext_nor.png" +#define MUSIC_IMAGE_CTXT_BTNLAST "ico_addlast_nor.png" +#define MUSIC_IMAGE_CTXT_ADDTO "ico_addto_nor.png" +#define MUSIC_IMAGE_CTXT_BTNDEL "ico_del_nor.png" +#define MUSIC_IMAGE_CTXT_ARROW "ico_arrow_20.png" +#define MUSIC_IMAGE_CTXT_RENAME "ico_rename_nor.png" +#define MUSIC_IMAGE_CTXT_ADDSONG "ico_add_nor.png" +#define MUSIC_IMAGE_CTXT_REMOVESONG "ico_remove_nor.png" +#define MUSIC_IMAGE_POPUP_UP_ARROW "popover_arrow_up.png" + +/* SWALLOW ICONS */ +#define MUSIC_PART_ELM_SWALLOWICON "MUSIC_PART_ELM_SWALLOWICON" +#define MUSIC_SWALLOW_ICON "elm.swallow.icon" +#define MUSIC_PART_POPUP_BUTTON "button1" + +#endif /* __DEFINE_H__ */ diff --git a/include/entry-popup.h b/include/entry-popup.h new file mode 100644 index 0000000..e4bfa24 --- /dev/null +++ b/include/entry-popup.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ENTRY_POPUP_H__ +#define __ENTRY_POPUP_H__ + +Evas_Object *create_entry_popup(Evas_Object *base, const char *text, + void (*)(void *, const char *), void *data); +void destroy_entry_popup(Evas_Object *layout); + +#endif /* __ENTRY_POPUP_H__ */ diff --git a/include/folder-layout.h b/include/folder-layout.h new file mode 100644 index 0000000..7d842bc --- /dev/null +++ b/include/folder-layout.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef __FOLDER_LAYOUT_H__ +#define __FOLDER_LAYOUT_H__ + + +struct SFolderItemInfo; +struct folder_info; + +class CFolderLayout : public CExtBaseLayout, public CListenerMgr, public IKeyDownListener { +private: + struct SFolderLayout *m; + +private: + static Eina_Bool sm_CbFocusIdler(void *dt); + static void sm_CbGoToContextView(void *cookie, SContentInfo *contextInfo); + static void sm_CbUpdateGrid(void *cookie); + static void sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId); + + static char *sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part); + static char *sm_CbGetGridSongItemText(void *data, Evas_Object *obj, const char *part); + static Evas_Object *sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part); + static Evas_Object *sm_CbGetGridSongItemContent(void *data, Evas_Object *obj, const char *part); + static void sm_CbRemoveGridItem(void *data, Evas_Object *obj); + +private: + void m_OnFocusIdler(void); + void m_OnGotoPlaybackView(char *mediaId); + void m_OnGotoContextView(SContentInfo *contextInfo); + void m_OnCbUpdateGrid(void); + +private: + inline int m_ConvertToMin(int milsec); + void m_RemoveFocusIdler(void); + void m_GotoPlayback(int mode, char *id); + SFolderItemInfo *m_FindItemInfo(Eina_List *list, Elm_Object_Item *item); + Elm_Object_Item *m_FindItemByInfo(Eina_List *list, folder_info *finfo); + void m_SortFolderGrid(void); + void m_CreateFolderGrid(void); + void m_EmptyFolderGrid(bool sort_flag); + void m_UpdateFolderGrid(bool sort_flag); + void m_CreateTopsection(void); + +protected: + virtual void t_OnShow(void); + +public: + CFolderLayout(const char *pLayoutId) : CExtBaseLayout(pLayoutId), IKeyDownListener(this), m(0) {} + virtual ~CFolderLayout() {} + + bool Create(CLayoutMgr *mgr); + virtual void Destroy(void); + + virtual void Update(bool focusFlag); + +public: + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); +}; + + +#endif /*__FOLDER_LAYOUT_H__*/ diff --git a/include/folder_info.h b/include/folder_info.h new file mode 100644 index 0000000..3e3d103 --- /dev/null +++ b/include/folder_info.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __FOLDER_INFO_H__ +#define __FOLDER_INFO_H__ + +struct folder_info { + char *folder_id; + char *name; + int count; + int duration; +}; + +struct folder_info *folder_info_create(); +void folder_info_destroy(struct folder_info *finfo); + +int folder_info_get_count(struct folder_info *cfinfo); +int folder_info_get_duration(struct folder_info *cfinfo); +char *folder_info_get_name(struct folder_info *cfinfo); +char *folder_info_get_folder_id(struct folder_info *cfinfo); +struct folder_info *folder_info_duplicate(struct folder_info *s_finfo); +int sortfolders_za(const void *d1, const void *d2); +int sortfolders_az(const void *d1, const void *d2); + +#endif /*__FOLDER_INFO_H__*/ diff --git a/include/genre-layout.h b/include/genre-layout.h new file mode 100644 index 0000000..b0ea187 --- /dev/null +++ b/include/genre-layout.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __GENRE_LAYOUT_H__ +#define __GENRE_LAYOUT_H__ + + +class CGenreLayout : public CCategoryLayout { +private: + struct SArtistLayout* m; + +protected: + virtual void t_HandleItemSelect(SCatItemInfo *itinfo); + virtual bool t_GetMediaList(Eina_List **list); + virtual EContextType t_ContextType(void){ return CONTEXT_TYPE_GENRE; } + virtual ECategoryType t_CategoryType(void) { return CAT_TYPE_GENRE; } + +public: + CGenreLayout(const char *pLayoutId) : CCategoryLayout(pLayoutId), m(0) {} + virtual ~CGenreLayout(){} +}; + + +#endif /* __GENRE_LAYOUT_H__ */ \ No newline at end of file diff --git a/include/i18n.h b/include/i18n.h new file mode 100644 index 0000000..2775003 --- /dev/null +++ b/include/i18n.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __I18N_H__ +#define __I18N_H__ + +#include + +#define i18n_init() bindtextdomain(PACKAGE, LOCALEDIR) + +#ifdef _ +#undef _ +#endif +#define _(s) dgettext(PACKAGE, s) +#define dgettext_noop(s) (s) + +#ifdef N_ +#undef N_ +#endif +#define N_(s) dgettext_noop(s) + +#endif /* __I18N_H__ */ diff --git a/include/mediadata.h b/include/mediadata.h new file mode 100644 index 0000000..fa00297 --- /dev/null +++ b/include/mediadata.h @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef __MEDIA_DATA_H__ +#define __MEDIA_DATA_H__ + +struct mediadata; +struct album_info; +struct category_info; +struct folder_info; + +#include +#include "common.h" + +class CMediadata { +private: + struct SMediadata* m; + +private: + static void sm_CbContentUpdate(media_content_error_e err, int pid, + media_content_db_update_item_type_e update_item, + media_content_db_update_type_e update_type, + media_content_type_e media_type, + char *uuid, char *path, char *mime_type, + void *dt); + static bool sm_CbTotalDuration(media_info_h md_h, void *dt); + static bool sm_CbEachMediaData(media_info_h md_h, void *dt); + static bool sm_CbEachFolderData(media_folder_h folder_h, void *dt); + static bool sm_CbEachAlbumData(media_album_h album_h, void *dt); + static bool sm_CbEachPlaylist(media_playlist_h ph, void *dt); + static bool sm_CbPlaylistMember(int memb_id, media_info_h mdh, void *dt); + static bool sm_CbPlaylist(media_playlist_h ph, void *dt); + +private: + void m_HandleContentUpdate(media_content_error_e err, int pid, + media_content_db_update_item_type_e update_item, + media_content_db_update_type_e update_type, + media_content_type_e media_type, + char *uuid, char *path, char *mime_type); + bool m_HandleEachMediaData(media_info_h md_h); + bool m_HandleEachFolderData(media_folder_h folder_h); + bool m_HandleEachAlbumData(media_album_h album_h); + bool m_HandleEachPlaylist(media_playlist_h ph); + void m_DeleteSongList(void); + void m_DeleteFolderSongList(void); + void m_DeleteAlbumSongList(void); + void m_DeletePlaylistSongList(void); + void m_DeleteFolderList(void); + void m_DeleteAlbumList(void); + void m_DeleteCategoryList(ECategoryType type); + bool m_CreateFilter(void); + bool m_DestroyFilter(void); + int m_GetPlaylistList(void); + void m_GetCategoryList(ECategoryType type); + int m_GetPlaylistSongList(category_info *catinfo); + int m_GetFolderSongList(folder_info *finfo); + int m_GetFolderList(void); + int m_GetAlbumSongList(album_info *alinfo); + int m_GetAlbumList(void); + int m_GetSongList(void); + void m_UpdateLists(void); + +public: + CMediadata() : m(0) {} + virtual ~CMediadata() {} + bool FlagCreate(void) { return !!m; } + + bool Create(void); + virtual void Destroy(void); + + struct SSongInfo *SongByUri(char *uri); + Eina_List *Medialist(int source_type, int EListType, void *info); + struct SCbInfo *AddCallback(int type, void(*cb)(void *dt), void *data); + bool RemoveCallback(struct SCbInfo *cbinfo); + bool SetPlayedTime(char *media_id); + bool InsertPlaylist(const char *name, Eina_List *idlist); + bool ExistPlaylist(const char *name); + bool DeletePlaylist(int id); + bool RenamePlaylist(int id, const char *name); + bool AddmediaPlaylist(int lid, Eina_List *idlist); + bool RemovemediaPlaylist(int lid, Eina_List *idlist); + + static Eina_List *PlaylistsForCtxt(void); +}; + +#endif /*__MEDIA_DATA_H__*/ diff --git a/include/music-controller.h b/include/music-controller.h new file mode 100644 index 0000000..be0c9ff --- /dev/null +++ b/include/music-controller.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MUSIC_CONTROLLER_H__ +#define __MUSIC_CONTROLLER_H__ + + +#include +//#include + +struct SSongInfo; +struct album_info; + + +class IMusicControllerListener { +private: + static void sm_CbComplete(void *cookie); + static void sm_CbError(void *cookie); + static void sm_CbUsbConnected(void *cookie); + static void sm_CbUpdateContent(void *cookie); + +protected: + virtual void t_OnComplete(void) = 0; + virtual void t_OnError(void) = 0; + virtual void t_OnUsbConnected(void) = 0; + virtual void t_OnUpdateContent(void) = 0; +}; + + +class CMusicController { +private: + static CMusicController *instance; + static int refCnt; + struct SMusicController *m; + +private: + + enum EDirectionType { + DIR_PREVIOUS, + DIR_NEXT + }; + + enum ENextType { + E_ON_COMPLETE, + E_BUTTON_CLICK + }; +private: + CMusicController() {} + virtual ~CMusicController() {} + +private: + static void sm_CbPlaybackCompletion(void *data); + void m_OnPlaybackCompletion(void); + + //static void sm_CbConnected(usb_device_h usb_device, char *action, void *dt); + //void m_OnConnected(usb_device_h usb_device, char *action); + +protected: + bool t_PlayNext(int direction, int playnext_type); + SMusicController* t_Create(void); + void t_Destroy(void); + +public: + static bool Initialize(void); + static void Finalize(void); + + static CMusicController* GetInstance(void); + + bool Start(void); + bool Stop(void); + bool Resume(void); + bool Pause(void); + + bool AddListener(IMusicControllerListener *listener); + bool RemoveListener(IMusicControllerListener *listener); + + bool GetCurrentSongIndex(int *ind); + bool SetCurrentSongIndex(int ind); + bool GetTotalSongs(int *ts); + bool GetSonginfoFromIndex(int index, struct SSongInfo **const csinfo); + + int PlayState(void); + bool SetPlayState(int state); + + int ShuffleState(void); + bool SetShuffleState(int state); + + int RepeatState(void); + bool SetRepeatState(int state); + + int SourceType(void); + int SortType(void); + + bool SetSourceType(int type); + bool SetSortType(int type); + bool SetPosition(int milsec); + bool GetPosition(int *const milseconds); + + bool SetCurrentSong(char *mediaid); + + bool GetCurrentSong(struct SSongInfo **const sinfo); + bool SetCurrentAlbum(struct album_info *alinfo); + + struct album_info *CurrentAlbum(void); + + bool UpdatePlaylist(Eina_List *slist, int addmode); + bool EmptyPlaylist(void); + bool PlaylistUpdateShuffle(void); + bool PlayPreviousSong(void); + bool PlayNextSong(void); + bool PlayIndexSong(int index); + bool RemoveSong(struct SSongInfo *sinfo, int index); + bool CheckUsb(void); + + bool MediaGetList(int EListType, void *info, Eina_List **list); + bool MediaInsertPlaylist(const char *name, Eina_List *idlist); + bool MediaExistPlaylist(const char *name); + bool MediaDeletePlaylist(int id); + bool MediaRenamePlaylist(int id, const char *name); + bool MediaAddmediaPlaylist(int id, Eina_List *idlist); + bool MediaRemovemediaPlaylist(int id, Eina_List *idlist); + bool MediaAddsongsPlaylist(int lid, Eina_List *list); + struct SSongInfo *MediaSongByUri(char *uri); +}; + + + +#endif /*__MUSIC_CONTROLLER_H__*/ diff --git a/include/playback-mgr.h b/include/playback-mgr.h new file mode 100644 index 0000000..6ad1e7a --- /dev/null +++ b/include/playback-mgr.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __PLAYBACK_MGR_H__ +#define __PLAYBACK_MGR_H__ + + +#include + + +class CPlayback { +private: + struct SPlayback* m; + +public: + + CPlayback() : m(0) {} + virtual ~CPlayback() {} + bool FlagCreate(void) { return !!m; } + + bool Create(void); + virtual void Destroy(void); + + bool SetCallback(player_completed_cb cbPlaybackCompletion, void *data); + bool UnsetCallback(void); + + bool SetMute(bool flag); + bool SetLooping(bool flag); + + bool Start(void); + bool Stop(void); + + bool Resume(void); + bool Pause(void); + + bool SetNextUri(const char *path); + bool SetUri(const char *path); + bool Prepare(void); + bool Unprepare(void); + + bool SetPosition(int milsec); + bool GetPosition(int *const milsec); +}; +/* +struct playback; + +struct playback *playback_create(); +void playback_destroy(struct playback *plback); +int playback_start(struct playback *plback); +int playback_stop(struct playback *plback); + +int playback_add_completed_cb(struct playback *plback, + player_completed_cb on_playback_completion, void *data); +int playback_remove_completed_cb(struct playback *plback); + +int playback_set_mute(struct playback *plback, bool flag); +int playback_set_looping(struct playback *plback, bool flag); + +int playback_resume(struct playback *plback); +int playback_pause(struct playback *plback); +int playback_set_next_uri(struct playback *plback, const char *path); +int playback_set_uri(struct playback *plback, const char *path); +int playback_prepare(struct playback *plback); +int playback_unprepare(struct playback *plback); +int playback_set_position(struct playback *plback, int milsec); +int playback_get_position(struct playback *plback, int *const milsec); +*/ +#endif /*__PLAYBACK_MGR_H__*/ diff --git a/include/playback-view.h b/include/playback-view.h new file mode 100644 index 0000000..7438dea --- /dev/null +++ b/include/playback-view.h @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef __PLAYBACK_VIEW_H__ +#define __PLAYBACK_VIEW_H__ + + +#include "common.h" + + +struct SItemInfo; + + +class CPlaybackView : public CBaseView, CListenerMgr, + IKeyDownListener, IKeyUpListener, IMouseClickedListener, IMouseMoveListener, + IPressedListener, IUnpressedListener, IChangedListener, IRealizedListener, IUnrealizedListener, + IActivatedListener, + IMusicControllerListener { +private: + struct SPlaybackView* m; + +private: + static Eina_Bool sm_CbUpdateSlider(void *dt); + static Eina_Bool sm_CbLongpressTimer(void *dt); + static Eina_Bool sm_CbWaitTimer(void *dt); + static Eina_Bool sm_CbVolumeTimer(void *dt); + + static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info); + + static void sm_CbGenlistItemCheckClicked(void *data, Elm_Object_Item *it, const char *emission, const char *source); + void m_OnGenlistItemCheckClicked(Elm_Object_Item *it, const char *emission, const char *source); + + static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid); + static void sm_CbCtxtClose(void *dt); + +private: + void m_HandleKeyPress(char *keyname); + void m_HandleKeyUnpress(char *keyname); + + void m_KeyBackPress(void); + void m_KeyExitPress(void); + void m_KeyPlayPress(void); + void m_KeyPausePress(void); + void m_KeyNextPress(void); + void m_KeyPreviousPress(void); + + void m_KeyNextUnpress(void); + void m_KeyPreviousUnpress(void); + + + + void m_RemoveTimer(int timer_code); + void m_PlaybackPause(void); + void m_PlaybackResume(void); + void m_ChangeEditmodeAll(Eina_List *list, bool flag); + void m_DisableCheckAll(Eina_List *list); + void m_SelectItem(SItemInfo *it_info); + void m_UnselectItem(SItemInfo *it_info); + void m_UpdateControlBtns(void); + void m_UpdateCurrentSongProgressbar(void); + void m_UpdateCurrentSongThumbnail(void); + void m_UpdateCurrentSongLabels(void); + void m_UpdateEmptySongInfo(void); + void m_UpdateCtxtView(int playStatus); + void m_UpdateCurrentSongItem(int index); + void m_UpdateEditmodeFocusSequence(void); + void m_UpdatePlaymodeFocusSequence(void); + void m_UpdateCurrentSongInfo(void); + void m_DisableEditButtons(bool flag); + void m_CreateErrorPopup(void); + void m_DestroyErrorPopup(void); + void m_CreateSettingsPopup(void); + void m_DestroySettingsPopup(void); + void m_FromEditToPlaybackMode(void); + void m_FromPlaybackToEditMode(void); + void m_HandleOnRepeated(void); + void m_DeleteSelectedItems(void); + + + void m_AddSlider(void); + void m_AddAlbumCover(void); + void m_AddCurrentSonginfo(void); + void m_AddEditPlaylistButtons(void); + void m_AddControlButtons(void); + struct SItemInfo *m_FindItemInfoFromSong(Eina_List *list, SSongInfo *sinfo); + struct SItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item); + void m_UpdateItemCheck(SItemInfo *itinfo); + Elm_Genlist_Item_Class *m_GetItemClass(); + void m_AddGenlist(void); + void m_AddPlaylist(void); + void m_RemovePlaylist(void); + void m_HandleRewindBtnClicked(Evas_Object *obj); + void m_HandleForwardBtnClicked(Evas_Object *obj); + void m_HandleOnPressed(Evas_Object *obj); + void m_HandleOnUnpressed(Evas_Object *obj); + void m_HandleGenlistItemActivated(Evas_Object *obj, Elm_Object_Item *genListItem); + +protected: + // When button is clicked. + void t_OnClickedSettings(Evas_Object *obj); + void t_OnClickedShuffle(Evas_Object *obj); + void t_OnClickedRepeat(Evas_Object *obj); + void t_OnClickedPlay(Evas_Object *obj); + +protected: + virtual void t_OnShow(void); + virtual void t_OnHide(void); + virtual void t_OnUpdate(void* data); + +public: + CPlaybackView(const char *pViewId) : CBaseView(pViewId), + IKeyDownListener(this), IKeyUpListener(this), IMouseClickedListener(this), IMouseMoveListener(this), + IPressedListener(this), IUnpressedListener(this), IChangedListener(this), + IRealizedListener(this), IUnrealizedListener(this), IActivatedListener(this), + m(0) {} + virtual ~CPlaybackView() {} + + virtual bool Create(void *data); + virtual void Destroy(void); + + virtual Evas_Object* Base(void); + + // Listener virtual function + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); + virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev); + virtual void OnMouseClicked(int id, Evas_Object *obj); + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); + virtual void OnPressed(int id, Evas_Object *obj); + virtual void OnUnpressed(int id, Evas_Object *obj); + virtual void OnChanged(int id, Evas_Object *obj); + virtual void OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item); + virtual void OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item); + virtual void OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item); + +protected: + virtual void t_OnComplete(void); + virtual void t_OnError(void); + virtual void t_OnUsbConnected(void); + virtual void t_OnUpdateContent(void); +}; + + +#endif /*__PLAYBACK_VIEW_H__*/ diff --git a/include/playlist-layout.h b/include/playlist-layout.h new file mode 100644 index 0000000..38522be --- /dev/null +++ b/include/playlist-layout.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __PLAYLIST_LAYOUT_H__ +#define __PLAYLIST_LAYOUT_H__ + + +class CPlaylistLayout : public CCategoryLayout { +private: + struct SArtistLayout* m; + +private: + static void sm_CbEntryRename(void *dt, const char *name); + void m_OnEntryRename(const char *name); + + void m_PlaylistCtxtAction(EActionType type); + +protected: + virtual void t_HandleItemSelect(SCatItemInfo *itinfo); + virtual EContextType t_ContextType(void) { return CONTEXT_TYPE_PLAYLIST; } + virtual ECategoryType t_CategoryType(void) { return CAT_TYPE_PLAYLISTS; } + virtual bool t_GetMediaList(Eina_List **list); + virtual void t_OnCtxtUpdate(enum EActionType type, int lid); + +public: + CPlaylistLayout(const char *pLayoutId) : CCategoryLayout(pLayoutId), m(0) {} + virtual ~CPlaylistLayout(){} +}; + + +#endif /* __PLAYLIST_LAYOUT_H__ */ \ No newline at end of file diff --git a/include/playlist-mgr.h b/include/playlist-mgr.h new file mode 100644 index 0000000..7e7f6dd --- /dev/null +++ b/include/playlist-mgr.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __PLAYLIST_MGR_H__ +#define __PLAYLIST_MGR_H__ + + +#include + + +struct SSongInfo; + + +class CPlaylist { +private: + struct SPlaylist* m; + +public: + CPlaylist() : m(0) {} + virtual ~CPlaylist() {} + bool FlagCreate(void) { return !!m; } + + bool Create(Eina_List *songlist); + virtual void Destroy(void); + + bool Update(Eina_List *songlist, int addmode); + + const char *SongpathFromIndex(int index); + bool GetSonginfoFromIndex(int index, struct SSongInfo **const csinfo); + bool GetTotalSongs(int *total_songs); + bool GetCurSongIndex(int *index); + bool SetCurSongIndex(int index); + bool LoadNextSong(int shufstate); + bool LoadPreviousSong(int shufstate); + bool RemoveSong(struct SSongInfo *sinfo, int index, int shufstate); + bool UpdateShuffle(void); + bool SetCurrentSong(char *mediaid); +}; + +/* +struct playlist *playlist_create(Eina_List *songlist); +struct playlist *playlist_update(struct playlist *plist, Eina_List *songlist, + int addmode); +void playlist_destroy(struct playlist *plist); + +const char *playlist_get_songpath_from_index(struct playlist *plist, int index); +int playlist_get_songinfo_from_index(struct playlist *plist, int index, + struct SSongInfo **const csinfo); +int playlist_get_total_songs(struct playlist *plist, int *total_songs); +int playlist_get_cur_song_index(struct playlist *plist, int *index); +int playlist_set_cur_song_index(struct playlist *plist, int index); +int playlist_load_next_song(struct playlist *plist, int shufstate); +int playlist_load_previous_song(struct playlist *plist, int shufstate); +int playlist_remove_song(struct playlist *plist, struct SSongInfo *sinfo, + int index, int shufstate); +void playlist_update_shuffle(struct playlist *plist); +int playlist_set_current_song(struct playlist *plist, char *mediaid); +*/ + +#endif /*__PLAYLIST_MGR_H__*/ diff --git a/include/song-layout.h b/include/song-layout.h new file mode 100644 index 0000000..fe1be2b --- /dev/null +++ b/include/song-layout.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SONG_LAYOUT_H__ +#define __SONG_LAYOUT_H__ + + +class CSongLayout : public CExtBaseLayout, public CListenerMgr, public IKeyDownListener { +private: + struct SSongLayout *m; + +private: + static char *sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part); + static Evas_Object *sm_CbGetListItemContent(void *data, Evas_Object *obj, const char *part); + static void sm_CbRemoveListItem(void *data, Evas_Object *obj); + static void sm_CbGenlistKeyDown(void *dt, Evas *e, Evas_Object *obj, void *ei); + + static void sm_CbSelectItem(void *cookie); + void m_OnSelectItem(void); + +private: + void m_GotoPlayback(void); + void m_GotoPlaybackUri(void); + void m_CreateSongList(void); + +protected: + virtual void t_OnShow(void); + +public: + CSongLayout(const char *pLayoutId) : CExtBaseLayout(pLayoutId), IKeyDownListener(this), m(0) {} + virtual ~CSongLayout() {} + + bool Create(CLayoutMgr *mgr, const char *uri); + virtual void Destroy(void); + + virtual void Update(bool focusFlag); + +public: + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); +}; + + +#endif /*__SONG_LAYOUT_H__*/ diff --git a/include/song_info.h b/include/song_info.h new file mode 100644 index 0000000..93f7c49 --- /dev/null +++ b/include/song_info.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SONG_INFO_H__ +#define __SONG_INFO_H__ + +struct SSongInfo { + char *media_id; + char *title; + char *artist; + char *album; + char *album_artist; + char *genre; + char *composer; + char *thumbnail_path; + char *filepath; + int type; + int duration; + int member_id; /* if it is member of any playlist */ +}; + +struct SSongInfo *song_info_create(); +void song_info_destroy(struct SSongInfo *sinfo); + +char *song_info_get_media_id(struct SSongInfo *csinfo); +int song_info_get_member_id(struct SSongInfo *csinfo); +char *song_info_get_title(struct SSongInfo *csinfo); +char *song_info_get_artist(struct SSongInfo *csinfo); +char *song_info_get_genre(struct SSongInfo *csinfo); +char *song_info_get_album(struct SSongInfo *csinfo); +char *song_info_get_filepath(struct SSongInfo *csinfo); +char *song_info_get_thumb(struct SSongInfo *csinfo); +bool song_info_get_duration(struct SSongInfo *csinfo, int *dur); +struct SSongInfo *song_info_duplicate(struct SSongInfo *s_sinfo); + +int sortsongs_title_az(const void *d1, const void *d2); +int sortsongs_title_za(const void *d1, const void *d2); +int sortsongs_artist_az(const void *d1, const void *d2); +int sortsongs_artist_za(const void *d1, const void *d2); +int sortsongs_album_az(const void *d1, const void *d2); +int sortsongs_album_za(const void *d1, const void *d2); + +#endif /*__SONG_INFO_H__*/ diff --git a/include/volume-control.h b/include/volume-control.h new file mode 100644 index 0000000..28041cb --- /dev/null +++ b/include/volume-control.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VOLUME_CONTROL_H__ +#define __VOLUME_CONTROL_H__ + + +class CVolumeController { +public: + static bool Mute(void); + static bool Unmute(void); + static bool IsMute(void); + static bool Get(int *volume); + static bool Up(void); + static bool Down(void); +}; + + +#endif /*__VOLUME_CONTROL_H__*/ \ No newline at end of file diff --git a/org.tizen.music-player-tv-ref.manifest b/org.tizen.music-player-tv-ref.manifest new file mode 100644 index 0000000..d146a8d --- /dev/null +++ b/org.tizen.music-player-tv-ref.manifest @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.tizen.music-player-tv-ref.xml.in b/org.tizen.music-player-tv-ref.xml.in new file mode 100644 index 0000000..ce322f6 --- /dev/null +++ b/org.tizen.music-player-tv-ref.xml.in @@ -0,0 +1,10 @@ + + + + PRAVEENYA + Music-player + + + @DESKTOP_ICON@ + + diff --git a/packaging/org.tizen.music-player-tv-ref.spec b/packaging/org.tizen.music-player-tv-ref.spec new file mode 100755 index 0000000..cfec9df --- /dev/null +++ b/packaging/org.tizen.music-player-tv-ref.spec @@ -0,0 +1,71 @@ +Name: org.tizen.music-player-tv-ref +Summary: Open UX music player application +Version: 0.2 +Release: 1 +Group: Applications/Core Applications +License: Apache-2.0 +Source0: %{name}-%{version}.tar.gz + +BuildRequires: cmake +BuildRequires: pkgconfig(edje) +BuildRequires: gstreamer +BuildRequires: gst-plugins-base +BuildRequires: pkgconfig(capi-appfw-application) +BuildRequires: pkgconfig(capi-media-player) +BuildRequires: pkgconfig(capi-media-sound-manager) +BuildRequires: pkgconfig(capi-content-media-content) +#BuildRequires: pkgconfig(capi-system-usbdevice) +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(mm-player) +BuildRequires: pkgconfig(edje) +BuildRequires: pkgconfig(utilX) +BuildRequires: pkgconfig(x11) +BuildRequires: pkgconfig(gio-2.0) +BuildRequires: pkgconfig(application-common) +BuildRequires: edje-bin +BuildRequires: gettext-devel + +%define _pkgdir /usr/apps/%{name} +%define _bindir %{_pkgdir}/bin +%define _resdir %{_pkgdir}/res +%define _localedir %{_resdir}/locale +%define _manifestdir /usr/share/packages +%define _media_audiodir /opt/usr/media/Sounds +%define _desktop_icondir /usr/share/icons/default/small + +%description +PUT DESCRIPTION HERE + +%prep +%setup -q + +%build +cmake \ + -DCMAKE_INSTALL_PREFIX=%{_pkgdir} \ + -DPACKAGE_NAME=%{name} \ + -DBINDIR=%{_bindir} \ + -DLOCALEDIR=%{_localedir} \ + -DMANIFESTDIR=%{_manifestdir} \ + -DMEDIA_AUDIO_DIR=%{_media_audiodir} \ + -DDESKTOP_ICONDIR=%{_desktop_icondir} \ + -DVERSION=%{version} + +make %{?jobs:-j%jobs} + +%install +%make_install + +%clean +rm -rf %{buildroot} + +%files + +%defattr(-,root,root,-) +%manifest %{name}.manifest +%{_bindir}/* +%{_resdir}/* +%{_manifestdir}/%{name}.xml +%{_media_audiodir}/* +%{_desktop_icondir}/%{name}.png +%{_desktop_icondir}/%{name}_4x2.png diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt new file mode 100755 index 0000000..39d02c3 --- /dev/null +++ b/po/CMakeLists.txt @@ -0,0 +1,37 @@ +# for i18n + +SET(POFILES de_DE.po + el_GR.po + en.po + es_ES.po + fr_FR.po + it_IT.po + ja_JP.po + ko_KR.po + nl_NL.po + pt_PT.po + ru_RU.po + tr_TR.po + zh_CN.po + zh_HK.po + zh_TW.po) +SET(MSGFMT "/usr/bin/msgfmt") + +FOREACH(pofile ${POFILES}) + SET(pofile ${CMAKE_CURRENT_SOURCE_DIR}/${pofile}) + MESSAGE("PO: ${pofile}") + GET_FILENAME_COMPONENT(absPofile ${pofile} ABSOLUTE) + GET_FILENAME_COMPONENT(lang ${absPofile} NAME_WE) + SET(moFile ${CMAKE_CURRENT_BINARY_DIR}/${lang}.mo) + ADD_CUSTOM_COMMAND( + OUTPUT ${moFile} + COMMAND ${MSGFMT} -o ${moFile} ${absPofile} + DEPENDS ${absPofile} + ) + INSTALL(FILES ${moFile} + DESTINATION ${LOCALEDIR}/${lang}/LC_MESSAGES RENAME ${PROJECT_NAME}.mo) + SET(moFiles ${moFiles} ${moFile}) +ENDFOREACH(pofile) + +MESSAGE(".mo files: ${moFiles}") +ADD_CUSTOM_TARGET(po ALL DEPENDS ${moFiles}) diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100755 index 0000000..5dda005 --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,2 @@ +# List of source files containing translatable strings. +src/main.c diff --git a/po/de_DE.po b/po/de_DE.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/de_DE.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/el_GR.po b/po/el_GR.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/el_GR.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/en.po b/po/en.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/en.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/es_ES.po b/po/es_ES.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/es_ES.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/fr_FR.po b/po/fr_FR.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/fr_FR.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/it_IT.po b/po/it_IT.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/it_IT.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/ja_JP.po b/po/ja_JP.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/ja_JP.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/ko_KR.po b/po/ko_KR.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/ko_KR.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/music-app.pot b/po/music-app.pot new file mode 100644 index 0000000..cd4b686 --- /dev/null +++ b/po/music-app.pot @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/nl_NL.po b/po/nl_NL.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/nl_NL.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/pt_PT.po b/po/pt_PT.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/pt_PT.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/ru_RU.po b/po/ru_RU.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/ru_RU.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/tr_TR.po b/po/tr_TR.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/tr_TR.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/update-po.sh b/po/update-po.sh new file mode 100755 index 0000000..1b67682 --- /dev/null +++ b/po/update-po.sh @@ -0,0 +1,59 @@ +#!/bin/sh + +APPNAME=music-player +SRCROOT=.. +POTFILES=POTFILES.in + +ALL_LINGUAS="de_DE el_GR en es_ES fr_FR it_IT ja_JP ko_KR nl_NL pt_PT ru_RU tr_TR zh_CN zh_HK zh_TW" + +XGETTEXT=/usr/bin/xgettext +MSGMERGE=/usr/bin/msgmerge + +echo -n "Make ${APPNAME}.pot " +if [ ! -e $POTFILES ] ; then + echo "$POTFILES not found" + exit 1 +fi + +$XGETTEXT --default-domain=${APPNAME} --directory=${SRCROOT} \ + --add-comments --keyword=_ --keyword=N_ --files-from=$POTFILES +if [ $? -ne 0 ]; then + echo "xgettext error" + exit 1 +fi + +if [ ! -f ${APPNAME}.po ]; then + echo "No such file: ${APPNAME}.po" + exit 1 +fi + +rm -f ${APPNAME}.pot && mv ${APPNAME}.po ${APPNAME}.pot +echo "done" + +for LANG in $ALL_LINGUAS; do + echo "$LANG : " + + if [ ! -e $LANG.po ] ; then + sed 's/CHARSET/UTF-8/g' ${APPNAME}.pot > ${LANG}.po + echo "${LANG}.po created" + else + if $MSGMERGE ${LANG}.po ${APPNAME}.pot -o ${LANG}.new.po ; then + if cmp ${LANG}.po ${LANG}.new.po > /dev/null 2>&1; then + rm -f ${LANG}.new.po + else + if mv -f ${LANG}.new.po ${LANG}.po; then + echo "" + else + echo "msgmerge for $LANG.po failed: cannot move $LANG.new.po to $LANG.po" 1>&2 + rm -f ${LANG}.new.po + exit 1 + fi + fi + else + echo "msgmerge for $LANG failed!" + rm -f ${LANG}.new.po + fi + fi + echo "" +done + diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/zh_HK.po b/po/zh_HK.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/zh_HK.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100644 index 0000000..0a262a7 --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-20 17:28+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:50 +msgid "Hello! Tizen" +msgstr "" diff --git a/res/edc/CMakeLists.txt b/res/edc/CMakeLists.txt new file mode 100755 index 0000000..0cd5335 --- /dev/null +++ b/res/edc/CMakeLists.txt @@ -0,0 +1,17 @@ +ADD_CUSTOM_TARGET(${TARGET_EDJ} + COMMAND edje_cc -id images + ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.edc + ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_EDJ} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} ${TARGET_EDJ}) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_EDJ} DESTINATION ${EDJEDIR}) + +ADD_CUSTOM_TARGET(${THEME_EDJ} + COMMAND edje_cc -id images + ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}-theme.edc + ${CMAKE_CURRENT_BINARY_DIR}/${THEME_EDJ} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}-theme.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} ${THEME_EDJ}) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${THEME_EDJ} DESTINATION ${EDJEDIR}) diff --git a/res/edc/images/00_c_progress_balloon_arrow_up.png b/res/edc/images/00_c_progress_balloon_arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..b412dd1deafd8b63d984a7f5b8133581ae7b129d GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W;!3HFgc;@~FQY^(zo*^7SP{WbZ0p!@yXG5YVHIsJ7)Hx=JmwoEc(l~dMCRVKHs^~%0}T?XRS_H u+r#Hl8)kPsP5iKQoyM`I-jes~dl?d|@|_f~X!rr$!QkoY=d#Wzp$P!X6-#XZ literal 0 HcmV?d00001 diff --git a/res/edc/images/Music_bg_light.png b/res/edc/images/Music_bg_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d104e7d2a92b349cb43f2fe4eefa4d8b1e38458a GIT binary patch literal 63572 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 LiIN_ipStE>6AKK5 literal 0 HcmV?d00001 diff --git a/res/edc/images/btn_bg_round_stroke.png b/res/edc/images/btn_bg_round_stroke.png new file mode 100644 index 0000000000000000000000000000000000000000..f324eccab51d88d4deece7c2dcb2716bfb8c27c4 GIT binary patch literal 19096 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/checkbox_check_dim.png b/res/edc/images/checkbox_check_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..22d671e048ac4e78e1949aa2ed820feeba85ea77 GIT binary patch literal 18070 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/checkbox_check_foc.png b/res/edc/images/checkbox_check_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ea81a6c242c6797491b75185020ce33571deeb GIT binary patch literal 18046 zcmeI3c{r49yvH9e*|&;RqOl~&thQzvV;O5mwooc#W{k-)V`j=$A`#UaQrRNvExQ(_ zge-~57L^tvTT(Ah=p}_SDD+fw-gBLE{y5h)&vni6yMOoZdq4N*{@uUlnYpefYTH&* zG2zw1004-Yn;F@%Kjmj$g8c0F&4~O9><=NjnKKgrM3&FIcz~pHD*-^*nu^D7+vY)I z(U=}II>a20htL@`cd8c|0Q_I2*ir25`d8?VwT~KFM24KUpxH_bLTn9>he*Y$s3{0Z zZi!S#e<^KKvDDa@Pxe7tB=5dbX5|y{(_R z`5f1mJCah+C{Qjade%(CMk_=#%TRvlo3NUy>dqdReyFfA9gq|(ASo~>m3V;hU@Uf{ zV!6OwfXDxdh#*jIm0XTkb97qbyFG9E8yq|lUHppm)R(#P56V5qz|hMNL+;q)s%QMQU?HOvC{0>j!gPD zi03ynXrC+;-vfPL#y_p-=GHyc+n7Vw2Y^miaMP4JykK?6X8sWGsSE1{`8;-ur0p9! z?tWcD|0a;u|H^TMKEuX1J*Md8%if-z7h9?fcM={s9-N|7?kRVi^!gl({W|vP&D}2L zP}HtaQ@-&xm35<*m)10%5<246_BPt|>n)M#uX0ZmtIXYsoYbVcZI=0-G)g)#g1V#_ zWq4}C{dLXLq^=J2FTA)8E#T^298XXzG;0;Z2ZXqrpYjEO-A2kV`$q+OHG%+OloqOX)j)Q%Vx@XH|C)*=Z51M4UA2!G zDpyq+N*W52Le?-`H{>2RRE?;=DyQZOf2uF1S#IMI5l0t?RXW@j*QHBL5Cl^zR7*mI z_zWHhE+;6wisW%S=A?8|P$n^aT%p2@Z`pBW$iqk}8%2v)Eij=V-gFQ6ulxX`7z_hYTXms>3xrL zJS1L4o*G^)H1uJzc?njhb?P~&nT zZ9YFk2tnS!%*oPe>kG3?$QotMrLTl^gm{nGRIXQy%e1(ma%bu1s+Ddi9pzjLQ0>X3~O z!h2GB?)7N&$o41of9O;~zUV*Y=yfi+{&E z>L)4|Asto|Nl{&uyi#B#WtHE`D+!jDS3Nnts>U9ngZz-tmne})b8u2CR68IY`$+iA zmNP16WYysIS=pDf+p|R+MjUGGqqBC~9n3dz(6H;y5_)iW4T~ zijV7NXQiX@8e23R3v5SDyXy&bC-{z^V{H}cQ_YAU2|m^?HMF5?gY0EZ%OWJ%#WVYC z{8^_QvmBco(+{QE`2!g#mrIR{oxg;N8`NxB@3P*M65X&QrO)oA-RlhDj1^Y8m{0kz zY|l%w>BUBVWj+~$38{B?hooB4GTH-5`zF>LgiqQ}dQW70G8J{=FA!DcZxwA=iM_Ao zOT)^+Yg#|r;CJ2A$6q3xA;fnci7jfvUVLWqr-{S~YPCzZa<_N2clAXTeia233#<25 zgGshlMVB{R-fX$qvZlVS{z83AqE@ml@;Rz6xi9&7a>p sWDi3o{FElg+R9?6~Ya zSXkl{z60%i$;n~It^$+1l)QB<#d*aUOEZeL#%;|>ZK2$|`myj~Vb-lxS9@RZx8@gm z7ak-~++--X?&sedj4O>hc<11slez+8M_-EP$nB5|X5L^(VYXx1lN!zq>K(j4dbS@< zacY!oe4)`@xV&~l6*a{!`H3k-hEl`~8;Lv~WpTI`7LS7^%T~XBP};MF^~rZvXJGTE zl;ncs%7M(*D}&mD)WM@|=j$}jZ%B34U_QS00RP6Ow@FXr{27F2M{ck+-a3?Wvrh?5 zgvUDOJ->SEl3(^1VMqq|4~}uZ8`q81X-Bm?@2S%%zxCi&t@S-x>Ynfp{2`@j(sbZ- z6Oa+Ij)%e<6>1Q=^N%m%fd>@IPU>M=$^Tq`Ibd)it;j&yAo_6L;ogco1&;@R$K)xD z^(8dKHc-XGw*|jzc`QJ9OE`WnSaf~((QwBIy_57vr`1i!crCxCHaxS#Xu{~MQF}54 zX^p-D-J+$2%ZBa6zS6m)c}K4r=I&hg%qhjm+{X@_omXTXGo&FC4Nwv%sC)N!w_gi;TIG|FllA;K2(r$`; zfp<}p-#TojW)*nq@7NNp0Ok7{m(+WUj;zm$DX|o@e4UI*U6HgO;*HY9lp@1U#m4v= zW-D056;j?)-n#Fv%_WClpStgJ{1#mPjKD+Bf|%ST&QRe(!^`jNcc?yB6Sz(xJGz(E zM?FHH%}L!@KTucjs5M6C+|c>yfn}A;I!_f|im-5m$~nC)&E1Q>j`a;_74DW^vN2*i ze=hd+u|hTPXVy6bj`8`yr7D3|o}s%d9v!Z@$>aG!#6h?>{NRVS=L5T}o#4(LHwhCF zDY7`}sAKt3tupb_hhC_*`S;2mr9CQ3Y&(4;E2pZ6)ac&q-v728nz~c`YNu2KhITnDbbArdiuwNI>zM1Ft7HX z2+Hjgc(QiC97PVk*Dz@~$t2k>>B~;Hop-G3a7``m+XKIvwyu>pr-^kA*fL`Okov0s z@RK;oaN~)TGbsmyVV~PvTQ3v_^${C7_Dax(?ntsan~kTB_iZlO+~6{Nn>BpBwRgGW zZO5c5m_6R_S?{q^aZjvkiq91%z7T{X?Q(a8t`$&bj!0;wC?ND zkwDtm{jpCSD_#dP)=xIn7QggcKbTiyU9x9Xf56}+{`JvkdON4uUJSJz+FS0IHqz8) zI>sL!);JaWDOv)*Bswv=HbN}oL+U0R8r`MGnC$T5Kn|%+ zdwjn3$?kE+m$+4NanpRf2_s*L8qih%z$~ZQJF%RsEHOlyH;h1{xshT1-gNejC;(vf z{OJUuCz%CtBU7k8x{5=^Wr`3gNmtQP%L-vd$CEv%W`PW{UEo%GVxT7xO;Xgu31j^+ zYyodFivaQW_VQt3{B;#)busMkGtF>C$ZQvur>>&G%zzLlt8EZGjX{QJ!L*=61PTe! zLBo(*nrI|a9fCq2HQ-1D9EFA=kr+)K3{o5N?NG!Cv%g^(BzKIhk;%8=*p{xM2a83= zz~O#=elR}`7>z-JBhhFy9D#zPP*8RcC^Nu^Mev9EFqP&+zUvr~nM4Ma&Z5$MATzoI zH`+dyuA<`1K=a49d3n?42l8QlW5=cl_b1TdNEibCn;zEjQ6w8uS9{I~tpnv}b zG9UiKY0SHSJ9`$@ePMBah@J8LHjL~~{Y}`6XD)0u73Nk5%g#RxoUg+K5KnHvxA2b+%m42@EEAW*6!ze&2@k^<}<%%*4#@ zW(RrFW|qUJg2`X{P$z{d60cLCH$P!Y_H#oFlp{A zKLUenKw;;^f3Xec1b>VGD`Vj^HQ9^$f3OBj!v6o+3jDh*^#6SY7IK&9LGYoFNjUiT zwEf=j?-p%tDSzBg-z&_|`wvSZV%%vAZvqQP^(IiraJml#3twnl7!x~x6~f?YUNnXk zjYP(2VBx=N{$&*V&$VrH|E=Mewx)&V0F%%XmabY`w&7f30b=0#C6 z7uz|gcI^8?GLAhpa1*%qHmX0_%gKn!z9ukdDxC&ARwGgE-ub|Kwd5`5D?BL7Z+zfATJje z2nc7Bi;FWKke7=K1cbB6#l@Kq$jikA0>atk;^NE)DuF3x;FUM?;W5Y8qS7iT^oFBcaG2xpUvi!&dP zmx~JogtN)T#hDMt%f$r(!rA2F;>-u+<>CSX;cRkoapnW^a&duxa5lNPIP(E{xwt?; zIGY@C2`@b9N%mns-s#7Fj&lul!vy;oPzce?)(QXu*8xCC7yx{pW`Fhrz&->3ymw_k zKAHdkGPF~B?wbGr&oOf&1AG5he?KpS^Agt7d>q@gc|2BIcd5EprF))1?)FMZ=URy9 z3jVOz`w>URm%CJ|^2>&$^O}dnL{>GPeFB4iLdJ|Qt!ZlC_hv+(?L%tcm$tFb@~2{+ zs#A?mDNT2ktgJtUP`(MY>Ys3Bh*XK0Z`7BlsMc0S>ub7h@-$mUjxS&K?W!>BGVmCGJ4HcG3WoGbqMaYB&4!W%U=w<^1qf~I` zF0qPTEy4|(l=`OMEmu9@$gku1hb%edxtMug`S$WM#DGc+Uss42=>VSw++>XzP7KJ> Xx!l5P(?ZWY#%pf8)hOT4_3(cJz#H

3V$6&&VFoj0DI!@)H%VoSTe?fx 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 z%0D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 literal 0 HcmV?d00001 diff --git a/res/edc/images/checkbox_uncheck_nor.png b/res/edc/images/checkbox_uncheck_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..091ee372a10b6a72a50306bfa193bf1e287e2e99 GIT binary patch literal 17813 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/contextual_menu_bg.png b/res/edc/images/contextual_menu_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7fabda605226f6079fff6fac2ea578c140d5e556 GIT binary patch literal 40491 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 Q6C?tAYiFw*OP_834gC5LHUIzs literal 0 HcmV?d00001 diff --git a/res/edc/images/function_button_foc.png b/res/edc/images/function_button_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f236bd68afb8ebfac3a83cd3a9f4a506ccb368 GIT binary patch literal 18940 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⁣ zAVFv_z3p<14um-QK8m{?Mz3zvHgv8XJ3l2i<#MJfgh`R6Qq-E!^hFWcn!J$IS~s7)}o9tTabi=>=)6~5A)=Speb1Z^J5VVW>$W{ zd>yeXEwZsUnL%fyWJEp)eB{w&RaXs95OF|og5IT4mB}NeI~_}1fpIoRCns$_f zEV0btb6b>7QFj9flfa|KmA`tL%>O+Fdd+=l#UfEAV`O8yXl9mE92{uoc~W2M>si`a zA$H;~;hYfTSt$jTzZy40GGYeS#cPyF;T#HVtK!-j7dm89R7YF&gl3I#zDbZKoZMD+k@3sXS=F7^f`By-9CwDW?G5O>&q-u%WJlKgg{s;FYhWNM1=LK34MCG^fDWloJvv@6BWzqxi zFu(%!0(rdeb7P7CqsJ7)n8o4Vbxl_)?7LmB|C1i|(wTV@5MhVlv2Z z>e-X#J_{sq|8eq10qi4}9Vhq1o zBf!xtpAhCwTHwFn-$?c^OOqn~x-}$EckOBuSD>v{lBUelQT_M5H zFhgZ&i5X=hGeW~;_*#(7tz6t;sPVhNX*H@u)pUcfS^YcK#G*LTXMuilP_e*)C{)cd>4+Zt&i0vnKG4^cFW(8U*q1nN$`AXFOl!A z5Tl+XO{p*aqyynIfflkMEsu&K*e$0L`M*A>;x+`H#%IU#$*&V$_2(GZ zJ_w7J6$=(bQr#;rmN=Ee=P7W`UCt5Qc8I4)Ilsopq|^$G34NEP^()rc%>bT_T1OB7 z<+sty5?kJMTbRqz_8NcGpClXc*h4>+hbOxUj1dRGOa~{KCZWS&uSq4>Est^eT&tD0 zw8jT2bouIFE=*_+=E;x!#50@9UoCStC9%WYjIO;lwZkQy#HAP zgsEJ*n;DcJFpUp_dAfT_Elb;L9$+py=)Pg0iA~utZs|*Vwti!2izBX4?!D?p7~$Z% zVI&qwy+pPe`C?+6QKK8u>P9~!vaPq5JQa6e;Fh|> z#`;$SPEOGY4oIX&zR2}$i`QIZoVs8+F(XKdm%Kzs^LF9E?yb{&M=Xy&w1hc}kay5w96^1^ulm1hQ%v1F#(8wEa=)Y*H zO*tu7M%yW^DANNX(dr~IRUK6j2PajzJLx|H$}I{0 zUU;G|xiI}A_sq+@e|1EwLq67mA&q-0`+-?{4Rx=t>RfvpUj)I;jH%iT1NXFQnT8WB0+pO*dz-~9IN4p1Pso(p!&LsyYIm=dCAb-Lv9MiA zU)~UOz=h91ZQazj!}3LL0EymHbOk*ph|vU(abR}PB3lhZ#Co0 z_z6LzWIUR6O@`f+gQV`H3b`^dSuLLsxR}-WMZ>y*NfT5(4}Qx)PcZTz2CIi}KVdBFc{!NipuiR_#dh-JJ9jh&h;q9QkL385Mt?DwYXaq7B}()(RFV< z)j&_khrX#pl6)d^c2+wJ>u6f8@QhzUtH7dZ0TV1qHAn}n8p`w#bDigjN3TrkX3qhn zXHZ3KV5C5CLtv}!^~lc+Ixae9ZA0`_zocX4&Pg|nb-jN1V z6v;Q2v089YH8SfVk*0jSF8UiJBt`&Qh=8}mPpXH{Qj#Es&_ruEh9@>XU!9(6CU*ev2fmiZXF2i_EA(_xgS=4V>8bM0I7nCBs7b-s)=voGB=oh& zL9`7~%a8~QYWy7cr%+oKLs%EOK$(F#zn?q=72Pp^Q=%YDgzQ)T8PUUIwx*-p(nrk$%GyvZb8j=#9(kKs>*$H4a%j4$aI0d?hC&LqT#M8zVUhrXF#5E@NqtD1|hd z$h9=YWH^aoIQtK8^}U9-Q8?z=y}OB=$gK@m#ZQy^^+1a+FRPBZ`sGnF&d$2~|vu*0u2swik>X)o3< zEImIcilIH39pz_qI6PibK%G$Io@d=ANXveFj1ZZ$d)m)vuNi8ALr_eP%-vr98Nqa+ z?r0EU9OkQ|Y2hqFJjp2awvAG%CxkGv$0~{iz4xS$9+cF`RL-8Khn#tN>BEPq>)7lh zdrCUle55xJE5j?gh}DVoN^tJI$qtSkXw8NM+O0ieW*omeW6m;W!O|<-{5{WZ+iS($ z?#f34N+SoNs*Gx}v`LpF5)h=-GET^8)EgWfY*H6fc@T3ZZq($3nX~UQ7z*z~9+@(;+B&l5)AP#R= zW(82HNc4sr)fl2b1pJz&MW^%W;)Io{Vtl;#c||F*ytGpt)CRhI+iPtnElE99f5K`S zc6*gO3;+JV|8M{EfBql-)6YNsU&BBDod1m8@;|+X|K{hv{`-IacgyncmjC5n{!2Mo zAXwmf@bXDp$O(}Ir+=-jNPUrHDT}k}hP-H%-IM`3dTr@oCpW+4i~AFK;|G0#^3v;L zeq%$77x-V3nHpgH8zFj;88{Y}m)2Z{Rr?X8@}ej5J;McHVlYzl_VMN63EqF2_d;nm zZ~!sT8_wZlv-*bgD~nXGeQA&FFD&i7r8C4I-2>@_h^O)4z3ez)&0WKhmzFWBBgBI$-FX(J4uzECs8jXw(8;2rqSEf z_>4|kJACg5n)3%n3f7ln)l^^lSd_bwTf6d*XTt=i=T41xVSHL%S_5HIqw7Dl&Vrxu z?)&wxLH8*(DG|y`&ruEx(xQtYfOG8dd=GUUrUlv3vSPuCk|gIlv=IL?CNcO5rUN`W zwx4AxPG1^C^*5F_LzDmiED#2{GMX+4R8F8=5~l4w)qh4j)u;-h6||)TXo10#l1a<_ z2nvt#&xn&m2-g$-7cnl3FxeB2Y5@eepuRLBvs|4JRvY=)5Zd?B5)2DTus@)FWvENu zC@g{~wFfNfYt9N!(%cr%#4`6Ec-!zq$!O@+Qg>gyCr=|@1!VEi(l19ovqlIaw=wE& z?M0`%pw`s)Kq)u=MRxFv;1LPBat$fkdFfdgR`WIAC3_-Gx z_>HIx`oI|P<*$ZEpVD;?@vdzMN|B)>06plF<6Y+MQcUrAEIycC1+A5m6s%i8rT_yr zrjby-GMW_!Li&$M|23%62auT2YQ@)Lkyd6@QE(s~sPRdAu06XNIH=yn(j?5B_=szj z_u7G`of0{^_7sGQBQe{IX}l4V;Ig)se~uTMVYaQpzA{VC5C& z&Z_ZHbwX?iS1qlUWz5(vwuRLV(N5U_+kXMLyP~MF{L8$tkBz0)0kV-tBWn|x`&T)J z>~WC}A0%Cn_R72_Xf`+o90vFtxaRVPD8m;hI~t;&>?t=0rcK$WJ-n7}C*TL15B&-n zU7st%_gP3Gj?1i&l3BUhMYQ0sqsGlJy=@2=uYdtayK!N&TjiW@pQ#ziL-5jDejSOl zz=e?N#R7Npx=yf9=e`+C@)Q@EyP1 zYw1vNeqm``9M_wl?-fIMt4iHTIFg5Wsz~d5jbc3;o=^*IdB}xR)q`_3sOXPn^|fXl zdZV_Z_jpZj5l;?lmk2ophkJSYujOI<7rymhZ=+6w z!;Kwc3{ET*83De-lhNatk zaWbp%8nnq*I@jA@v)$yZOgSf8{eadizcL5#fFjYk?#3kQgS4ATWnlDTj7y2jUrow0 zm<1Jii+pxHwsZjcA^%WesQ-)v^g)6jK++90o~FgTn%oiM2mlBIue{e_U5-ZYK z`238?iI3TQ9_TKn8PyX)Qi~du&cfbRPds4z$*BdNY5i4TadP;AWHwEL-P%xy zh`qndZzJ6$Fj{Yy33OlDP*8)2Q;xVDI%&E5kC9Xyhi6=}EUm6Xv4{-J4Ht}aRoSCz zJ&j(#QGWxz_P;Iv@9V$(*MIr>@BZVz{2xF6>woxv{^{rZk2>Z5=Rf_Yb@{*l<@rDV z@Bia}D4uK08h>XM5-H;3*Le!?qP;RWPtH1vw`y@ml1Z~xP<0wwvH+a)l*GSHeB*1( zlIahYe!O&oP=bZO7Wtrq2d#X0p1JdB28gP^Iby--zc#+o^HxoRA5AhK?EWlR08u^>gjfjV2mp?RKsORepam zh7Emd=J{53LZl5z5;%wBB8^LNn8J9^cwn=m9R0Jr*Kg@B+>^h4s@+h`92U(u?HfXO z9-;DHV}&pT06LDe^_Ywt+ZgP4TE2Fw6!T0M!;E z%>QdPF!vaCWE?Q*E+;0zX>vEp|H=&_OS^PbPhh@2y{97;81BEB&y!G4IXns1SY*Ke zi$Kzzg2-niog|}Ae;B~1dO}z(O;O5NHryV2?G-@RwLdpAAM`U&o$}I80FwX4XuQ}^X@I6nN>%3tkrq#r`l?n=y{5P?MKx8TcQJ(aOI z>8qTJ4Z*HxONVpwY3p_ULGQj6l^Vs zT_O}goCR~4@(B?)jr;Y&!;)!BC-=zQ3I_BBs#-Swdq|!rz!=GpgY6d`DN)A24KY`XY?n;%?nEACOD0Bn zY1B$hWd~W>Ma-0!Eax-+)H3?&Z@R0GXHn(@)_lc>kl7{Yf+^f;1V zw-b_!ZYT)nuC2-$mrrncX+sFzJR|6{Egim$>`#{~f=7hG%H_YgokGbDJHTxy=qW(4 zFz`^gpNe!?v+`F1!fnQD{(x2$NX)*}v=E$48#htIPS7WWKFg7BT4Z(5NWmq(%Imyygsr2FK)U+8` zusEt3+U`%;walvA(0@p-NwdnTS@-t6_6L~^Qqkmy%No3FOk!zGWurP*riCY~>Q+#J z9Wt3YSJg=QXH;2`-606xr=%upvtJc{P?@d)%?`1=v}zm{pT$QPJr$l}CI3GFbiRa?Ur) zCjkP3w8)Dt^1Zl@C0?8OVo5W>s%{83H%3p&B!hu$h^B?nsN2r8Mtrd&)sgFW8%b=jY{5P$r#L|8^o)#+0SvNq z;Kq^ddPi_u&ISlu-s@8NaYFp(ZrV^wIjGVHiiZ{&W(OyQ zh#lrh%)GcX0XddmnT0o>rkR2R5xCt(@N0k4!D4(6wdq4v4h@sNn3eot<9$a`jf3;39+7ne=FBvUOSG1yCV`I3b_p3&ybJW*m74kU$p^ zQ#wDRw4uR`$JM+>H`p<$-bT(C5O7SpNY!R(ha-4I=0RYB#KH_E%1h&zY5D$uj(&Pi z7`0mC#z`#WCJwRnr7@hC#ToFn4T0*8#03IFM5Hw?%8FpY6k|z(ctXtd4GE_M5=DMS z+Wn~}Eq^uqJW%Qn50%y$_x*2gJ9P-vF4Qg+qUzF)nvx}0_lA2)V#c{K1pwPDFFnI*_yu`@w{%j@n(|-3V`e5f(f%wi%{U1F z;)lOmtI=(UL7>|x>&D;Eh$=q?4|G(q?*}pF8u@6hidK{|8DPH`Rd4yLw?#+G^dGK0 zhtF3V54bX?w(X)7_XiuYy?iu~^o4bI_#&vn@DoIY=sRLS`Kyo6tUZeuy1rTk_T*0G z0h=Owr2Ie1$-?6V&DHbVF4B0$#`Fst_nVJkb z*7D&)jEOag9bnJuXLR_ISYlNXztVfJV}dnUSXn6U0IS;4DkSYJ$DGlJEP^3;xwBw4 zH=hdW*WBgkAlE`O&{@C)qxuH4RNiZ{x-i_Vd|i~5EIg&_Iu}d@G>BG&t@6_FYeD-P z7+km~<24`-GP8>ag`;0Z*GhN~0@%*Qh1L>2%yj*X;Q!R6G#$!c&B}vSO?oTe7M?)* zqV<~AIP~4M*I)8YV!A=hCuVe-Pg&YiFcPiO+tTK1{ipJ6BpkR|5hOp1t<*AdGXLN< zyYlgV!8un?h?C10UVk>s7E8+{)0>l04UF!AC+i>%q;XR~F$B@SZ-~i(oDa9mpgR_h z^$lUNjvD?G#88&D&2UgZL^#az4#bfc0%~Y%dcq%`wKl7j+MLa^ks;f7-^_P zv$Q1mODrGCx>?$l`HiLd>jY$hsGqO)ltF))aA3p{(AT*rKLu}uc6Uyn&xF9zsT)Zb z228G-KjHhzIy=?fiw;q*JEHZ);5<~O}<*IB_bcGOC_(0r}~70>4wqY{IdjmXleO1w5RM0z|lN< zF-s_awQ=hXR7OOv)s1>jt1ELbPy3Kb3z<5@wT*Q z7jMYi2jLxsFzA!|()vJ|@$8OCTUx0YmtYsiI2ob5eE4>+%fkBr;;TIcHpF#QsKe0= zu%EW4{MCRsPaS+Vd>2j?4n4D7jCTZNE!+BDx20{!FD(7W=P?5Vj=3h%51<88SVOzv zWCBp{J?Rz7zLp=lZdXa#nsFv~@QLms`GWFZ!zRtzk%lPkXH1_@v=Tk;3=4N{=5plo zTA^xq3a$z)juXj*r;!2Hpy^&F*Mi%~m<;U*S+*D=NhMn)PXn(XbTg*2T%(&gL-dep zWzcn9^k|gsHu^a_HWaL@dwtvyU2QWjs!xqB8}lA86+~|dKdHR5C7($rW1i%qdv>iU z8Iie$T<|Vip2DgbbRilOe!!$ypQLi`1UbqD2a8%7S9!vl zX%_&Z)F!nIwfM(!kajPJr(^T#5|>f!US0RE71BDupxsggk6`v%G+97TFjNV5!!rKO<` z&^uYrWoeN~n^r68^)?!d;!e5zm;A%45iFcK7Dwej>I5ImL~-I``c_7@oGH;|sxJH0 zYSC0MR=3%tpfdR>pX(EdjNajo0-)W-K)Y!poKKX}$#wh#DvqVM8~r&gfYy8REJ6do z^FiDRFK_Vl^5J_+bIrgIk}i=C2z{7fPA$~eBqwE^V1Ickp$4SCfKyGzM`HGe)cDos zQ=&&G2wz4Y_~7DD+z_mD3Pj=luT51@PWia&@AD<{7}Fc$=Uraf zQ&LR<2r-!6vO0vnH|+`&h*15rw7Svrz@21bFeBjN`jo$#jnqq5nTq2F6C9Y&dmvEl zoB3;3s{-SOXu~tscHQ&UBH!lG@d~T%WMv2_<*#l_1ONZR($rL(GAP7P7w5r^B#lqB z-Pg))w_5GWZ;@*f$35;XC?quOeL&-JL_AJYG8 zhfiI1Bfv`(<{*ttPyStf3ZCpeGj$G|wrz-K5j0w7fm)03chC_jpAaoo)H>>G$}k(E zDo~}8Sp)=y3qVJ&|BTF$lidJ#UmFsyW3|%#mOYwo2-_8)Q>Bce;_;5QxmsLzJna%SidTtj}j@Uza;#n*O=yDlnY=nM8W<*X8hp ztZV{9A^p`s9BE%*3hr?eF`yT`%JI4{Em`=5r7`T9W8Begfo z-K8lir;+XLKO@;m{6?f&Obgldt(q*DapTqD0Ebo4mwpUew-B+4@c}j5Qz+)E{i~D80O-jRpek+h`nf)L+X@I4xx2O@3|iBA zmkNVyk>e=;jDt307*Erte71DLQ&M-fce*%3ngG=kqTw;d;WMC(>#LWfCA3iQ9!~yD zRe&Sd^6=srj|Zj<^VJfk)aW2OhSEF{Uu9!$OAE?rOzw!%mew(gFkRTZlnjHxEBKGA)j!z~5r2WVBfQhXli4nHOL+)EaFWc7Kg$h7RRd76DzwV~`G$S7G_#pbhZ9|+p+zp17z@#+06eIPYafdw-pwaeP z-3SgL*^}a+Y37D5W!jUS9%FZyWZ~*g8jT`a_}gG7xld)KJ4>(myTjsO*t(7G_?NIa z`0VGhJJQ>|Ltr&6Ci17pLo@0{K!kl#^~xAfy^Xbvk9u1x(;nShSCYpfg&&d#^`%1z zG$+33e3sr@(2hsFTot|Q&z9ym{0mEiRP9DShQ#fJcx8gcc>_d2=TOTjL%ZQ!fs+i? z=#yO7NkJ7{1ep}q6OyYeSg7F+vj9x0Z`i(C!`-`uA&faVv#$l-E$=nn6A=jQ+Fr}J z@(dS}Q=-N`5b7W0T4u!A%UJhDUN=`p_LodGGQ1n{i4fSzUk!Rm@a0ESuVqhKhM9Q4LJmBrQF_G_`;M_!Pc0`J`v%$Tt#H)v9HA+Vc=O>uP;~U|F}P zmy&JytA%9JK!Qexo_NX*3YWXKzHSsFsj|oi`w@eNXb|ai_Q=PXBLpH|O#_Y}f1>JF zgMgT`>X;e0X6dx9838=P`^QsvX{tR{=DJ?)#fY9jca}DnNh@jx&(|FG7L=W9&0d&0 z$;5cRwpl@DuMP}Sw^ieuUN$$fv>_&}JN!etGIBmr+eS(o^9B>Fx@WgDhP`KLtkkx& zcn$Fgg^0qni!RXQ<)4v=z8SPK0HL(+H7^7|BT&^aBK4NtuYGlv29x=PrOmpcYy=P1 z4xgW~38rf;>OPMwGs;OYOqN6hUhN`-Wx^4uR?j-11ti<8{Om&3d8iDkaxUz(r6I*- zJoF(r;`%FO;yUisNIh$3fU24-BEr5%ntEgJ*l!4t-5u--8vA}c

c%eY<`p2qqaQ-&ol~>ZUOs%_+pwLmhhG<8r`Zj$7qY(xJR9QK4I*~;x{#RiQg zEgie)`R7KgB};4InEU%jOix5?^++|SE_4(R&~6L0rG51r)@s0$Dkvhy+@=`SmDPOs#XU6MrKWkzZAc`{5Sh&;MoydyK1%t@EG7*>$k^7_YSE12 zaDm?l#PGzPp3AQ8O7Q=WwtMMuXjzuS{EONk*OSzY&!G)_AV8k+X~}>s!H^99e1B1k zy)_cfy4l^fakcM}Pwmyks>;mBh)B;+O!Ge{#6v~aNI(=hRK`FL@eONt<9 zLz4gE0r2aFW^kRM_Nkr_uaMcEdLUzvUC(xf3S2~U>a2) z)6-x4YB&%`MI(muT=v>ok)FDZP^W%iu)Qxos>GuF#B)a$Ri^S^8tC7IIAXYQx7(G^ zHCrwL1sI3Oov((NX;68zQ9$onSenPx6N0#>OW^r15XjPM4I?f?kBjdj$V<&vUwVfH z*R#c4`Z7Tl5@qlmC+5{19!-5|K9F)U!t?g>31EgXYo^2FrIc#C^2?|8^!}qA>Ud?Z zleH7&;I8GO-|q1K@>iRTOw?&KB*}5x>w6}T?bX-Tjom_hL!#iG9ln=W+E-h3py8lm z=((wIwEV$WYZ8#q{zbE!_#FSz#5mlTe6T~$W&;|I8pvcf;ikb2oqS!Dh9^(@> zzU(y=j%7T4TuR3bI<9UAO;V$Y^C$SA?zc%O@W&{hy4|dAQ(k)7Yqa_WGit#JQTGDM zWS5iI#Sf_vDKD+HvA4M|7PgU3Ac{{HPj$=D%(j#IT53uv(0qP&c}h zNuIX#oDV~ROqz=RxwvJj8?!a&7wk?MA#(Go?zNHteE^cm?>RrCf5K2#HF^Jx02to8 zA1>{B|H0BQ-^Ra=yxUj9uY;+=Dk=7vA=W9ddy)j>z$6}_TeJ<)PjO`c+r&SPX8q-3 zD*oD_R86LvW@$eoiXt^)Xb&ZYghw0#S#c)*wCibFGcC%Wf9MK<@vk~=3xy?VCz?g3FlMG=r78DYINbm zfV5AqK*>n0m7nn?nKx~$?0OPsF@=FBqu|Ph*yh|u{plwWVkbJ5Q5^G;d8f7spY1mO zo~;0A7NJ;@=XYx_pNsxWbM7pSxuShUMEgk=(CDdr;0qYRGii4jG4r*EhE52)HhY~n zL==7@MPMV!1na$BGG_B|v@~XuU@R@7GgwJo8izC$!nS^800>F|td>P{2gwGqLKOMY zJ#Z(<{HpJD9OEM|j)%>1_>3>3?!z`#C>Uf`e?!Q+?|P1z>fVwCd!13f_L{lTxHapt zoIN4`zVN;N0(*Lz5=!{X)YDuhKO;OusYrw<$P8~z_hb1{eNLuRr6+GTj-^v@=%!#H zLgH@Vma&fF@SVd&<>oUjWs-g)M-osD84k)^KbFl9C|bk&?%hM<=?vJabKQ}R z5mQO1wCeLS>ZltLBo7HVsm!~TJ@j=N9>$mjo&0|Jz+B;_H? zz@4bv-FxEzG&cR!JGXr3h1 z&-vl0n$)7S;eo1)Zs1c_-fP(g-8qnX5#EJC#Ev;cFb3Ega;-X(nQV`HHi{>3CFfd6 zja=$1W*i-m;Rh%Vh?ySnX0I1{h}%MB9J1=}&9Bv*pE88VGzIxhK@k6qPbh#1KZHzP z_a?Q}2{RGb1{I&;hGS`Yh|wDqRsQ36V@>6$I4I(%=-Q$x{T9G<)>xy1qVQ2b<|!7+ zhtJ>5*6zzGZb`8Bnl~cPIOBG`vq-SzMis|6$OK{8ygaHd`UGA`4r~}I8GYFcQE3ZW z5MXeQTh3=ywhhu%{8g?NhJu%KJ~JBLYQ(SEK=k~Ku&2!Wq#x=w?~Z8ZRnD(LKqdsG z!MMP+(!HI;^{u*Q3GPiSJCj0dy%LfI&K4~X39-OgdA#_pt8wHa)t~Wy`>+4`KmI@e zV0$v0j+&EeaU5712&+AU4LP6 z0Q&{Vvfz_OO^1s36}#>e8ZfBHJr}|QB=Lq@OtN` zT>e{H!`NwKv)*oFc&ZU=(X??Pqa82Pd~O?K$}$TQc<~{V@-$XAzNkIB4HTw4CHS@> zRx{`Yk!rD7^r*6-w=3Nnw}YE`St)2~O;MG z`^6nzPKt@KoNt-X`8w=f^{5oa@LM0SfbYyi`K77pV9vQawLXOGd zLs2z6?~AXos0-?^Ym;y!hc0d7C#8RuZZ$fl1?HLoC1yF^s`ND|VVd)y+AY?9fkNWw zkdYB2I^1T;7d`F);%ge`Z9~*Dlp7#KKjB-2&X}V5Gm?>+0nvSt^t5wrRRkY<9ly8K z*zfY;L#TMLvrA{{JM0>C0&3x;f*F@wqWskY!Hu#4^xl3(v2o{L!p)1f7TKLS^*>wM zSO3A%4oGM|6S02|pC5FW!H8yM7z@KCt*qOXoy%fk2+mk#S(;KQ*^_+UsiYV#$40g$ z*v65vEXEUFK0IUgN#4T|aG^S=?zL)#Yn(@kOgCQ*8s9+{sPhRfLJ}*B#z`M2fMJF- z{%x;uCvVLhGDF5DP+k2|9UNfD9&~b9TC%W-3M$ifx0@}~r}9OIYH4n3nS?stVxzes zYMGH&iFp%OgH+tQzjjsJ{g77G*$)C_c%rJs}tzL)miYvosRNA1n>5K=wl5TMP@8c}7Cu zUz;h~DOZ&Z)t`|S-AKbI0Qet%#`a#r_gTyk8{3ugK+D@W*%O~hblo7t+(w|wFN|I% z>B(43?I{$`22gP=7C8LJ{$6iTjqPq8(ont2$%QT5S*ZI zs3tAS*c$4xOvS;Z=Onc&L*wx!aqXf_N(Uvij5ZAaTAi-R|i6LLX?u;7S7$k_wrs#>*8_G;yCYhTABLAiUhEh z?ix*SIWeQxo3+c4NtgNPz&NA@a>p63VDmEis2srbF>#6|9^4@EGomRO8Aqj$?4r2S zxG(1+6U=?U-$3PPFQ4}`W0c;6Axz(%!g~Fykx{u5eEB!DP~d|bl@gAYpkRu5prm)kePkkR~`EbUQ^3jooK#qUl?85+OMgMbB$ zOL~^2!=OhR1fUUhu=APAeoyf$GrL!>fLd)iA;$Ctu8kDJ3-B7tsr!6$F=AF5D5o7h z7=z-`{Plqu0@haf@IkM1huKp7Bi1sx0b<6gg~JC_wd@&ZA_g(AYWF^yzTvBrm}&Kz z=itpV5%32nPG*6#dxOnnevMlE z=*ElbsjwTbNI8NM=^?A!lwUr8A)`f^YV;<)I?OnPbQXHA7cYlQ1S{|Lo<$mqU>5YP zMK7W!G7tn9Ng8r(dHfZKU3Etk4YX;84`_kF5d|!K(lBr_z5La@sQ62My+6a~+(rWs zp_9PLj8pMKm6!GyyZMeV7x?S^yq4sggAPLOU60;1kL3m<| zJ;8~layrQ>vok8hqx7vdrlb@qNvHRoa_!ynxz0c)qe<21{G@y}Fphm5ux}Xok8!ju zyBkN!K6XYGAew!b|8FF6p%Sc$=%>S5Js~mT$RJf+srK>-<}9S7P`JjX4H&>)2IDkx zSzW`z%}vRM#L}`+$M4)!*b1tY%3qDO`=)cEiTIol-LDvqyX0@`IEhYqX(t1JfFsyK zHIUxdAG7=hOkk)1} zeXX1X3o(o3Bv>U&WBB+~WfJk~%!Y_mwYnj3Q!%}gcWoPxCK=hi1)UV6=%jlnL-~Yw zF@yqp!IowDYF>^(f&~Ke?=tkc{MANRkOg~`zF92}j3{QCIdVuqw3Gn;8gQpT$!i9ICk5i&JPj$Xm2ddF)vFiq?HMo{-+ZO zM|AwkUp+IZaZz@DxGe2(#4D1PFF8GL?Xq2lPR47>+aKNNve$^rHk^P+Yt|VoQ@d}l ztLFFQcWa?Q3L+$WSz#>ZQ79bCNw67L1P}NRe#d1)fC?Ngjpn2j6n&rNy(VZeo(d5R z+?S=L4Lf82qBhhp{|^pO^=CB7$Ayz$t01$qu!{-o<>NXF$$e0_)t7FF${)}&ja}RA zJR|Vgg}5se=wjM>?nZ_iJ@t*tU#;VX!;Oox6nCx+r$Xo?6R3@UC*^l}>HAwfj#%*C z=4XUXN*1J(@8_s-!bh)c4oPOgNKwwmQ1OE-7>edBiaO4YH|qyW>m5BDj=k%i6C%JE z8;r@pJ8js$IB%CzVEjtUhtG8THednz(Jp$RB1{zV zp?@>3dB5s7ADy+12F54BMZVezA(2smX+UlOCC^8BLv&h&Fz15%+_Kj!TAh#wt_$H( z9IUH{Pk)1nv^NBm(b6Gt{1(ke2lp=h`ohw00Zc8UbES~(H<{kW453`@J~@Jo_F~>H z^fgJa*1Raj)kfKCIA=NML&;3fK(D(;SWAkbE zry%-#^iSE%6pkx<`QIPf&<^Qk+Ft*jUWU*0Y)+#T z;nxM9md2H|&CEPf+r3>2xtL_-gE`WasY#zCdmO>ENx?l&jl0;`1ruDd+rg{uf`aqjYIzb z48={qQR1qDX}UDitsgKg-VSx2`GmlmG;#@@tF~ginq+eK|JDoIIbh4|bV(R0H6U^XZJChLQAA zwUtkZuN`r5Hc4zOopX&`6;&LR5^ucDb?1S=0LGOGL#c&b_GJ-A@G%E4kFR?6^hPMy z#o3-;W0r=)!L!hOlz2Keu1tMHfTni=hSgQx>qdd~KQa(E(|nj$m0>OO{aCW1c(U}( zSKDR|&>3h6j7rwmSHBwPDfY|ZVJ?02v~~T{lirS<@4S7Mty(`zv&;C4rKMo7r;X9e zpPx}9iNvgjJ`p~8Vv6V5S7&LX#{OVwg%Fc_Oy++Eq#1;b?>O*Jh5#6iQ~v5On=l%G z-w<4NgesXM?XYF9VMChKo+tDqw#lg;%U`V;cq+c=C0l;&dD3oEfe}9{%O<=|zLJ_Pu|@Mv+toK1q7`(M3i7W{B9%HU2g3 zBoJpOH}P+-R$!KXY-8svj*IqW7ASOlGN$_y*ib%M*w^bH;}@s6zg3 zX)PaHWPf;hJ@sZxj4Xfk&EmkaSRZ6*hl4X8i5Un-MZM=-QeIje9e-*E?SljZh=6f# zkJimud`;!BYntVFPvx(l=BuUF22Exj7%tT?(1DftA*`645rwoi$9FnuEQHiuoA1!#wtU0kb5kj%N^;vMwgrbvEU`A^fLxzmhnU=EvIMbRi;DS zGXNcb%|+j|Hzd$_&h`C~85+I)D(Bb!%LJbKjhtDQb8X0ldn3){6y&RKKUkWXl)XT= zZV}yAgfTtpj;>~4ZI#jT!TGYY>b7&?@+2ZroJf%BpwF1702mW#tK%48IpK)xhKL zvot|wh-PLa?zZ>Gru_0{UN79^4@ew3NmNcuss))(-N={^hG7<)ItNvxs{)@?WLg7J z)BZYseIL2MhWXVEi|dI;Z$}q_VPT@>i$=OU&{C0z&EqzPw7eWXE|w58bH+`2qtdVc zjMP-_Ide#55|hMVYCc>9^re@aroq$s8XyCL0$P?oD*RAnFz zX54G(NbCMX_YlE6P@XK!s`72*MQ3nIr0$C<)5}M2;$`K|uTa;tDT5YcMtpdbOwsx- zlZZ&w)kdj~2s*B7^?Aa*hBZYtznIs^6QnjF|8u$M@e}KK2=d{?2`1xZTSS+{|I*~z zds{lpufJHD^jsm$TKDr_D^Y#Ailf_4JSpm!D)uFAE}sRokk6H&r_DStB0MU`zHEzo zH&okPcOBQL<5~cVr>p=*un$BtHobmATxCAvUt93UvUJQQD9)s){(;)Kd}U-fcf1G1 z%VK&8a7U+P4oOVqR7xDmwG15@pAYZRM**vrVJYIkOgsVEfsf^00cR6ehDo&%ObtTx zPt@KaahMK?nN3<%zKsk>RR#v`ygxV}!Yy*rw0GB4N#j`FYpD$Xk=qx-d;4mDzJW&m z2y!+$oN+Ac3h+$$3C>p!XRC!Lh;3A=0y&1sz;{)X~~JatV3Fjg&}rXV3U z8kCew%lJ)WTQ2_%q<%lVOpJ`$&)5oGXK|vHiP3_3toqePEF?vuC2gjs>D*>qciKzV64_q25yu>W+Ep70zf98#=t&x{4j zOREW@O?v7NFQGtdJrh5W7B+8_C(2e*v_n)$_TmZDTbAB$x#YgH9lY0Hq$lOCes=0a zsXObWEN$0mE40@*oPo_y@9Kw-694Xj&al@kt%mlGWKZ%{#X6_U^5N4Q-kQoHbzeq& zFu(#BY4G-ZXL``cyZqJrp_fhODK+cfSA!6Z5)^h7PtriBaCxuy!{B#&L~Y!nOv3K( zsEwhA97sdui+*ysGMW#Jlq9MKa>}#oU(H{Qv-21Id0X0ssF;Av`<+&|F+pYRzmZ*< z5F`bVmNZX7(4=Puea}BA?(j}tJjF0A+H8pYOMoxT*t}H2 zIZ&jGshS!+upzk23mlJfHO?KHz=YU8~NHbWw!xrIoD|l zn!oE;1#D5+(%jWIM3@R2NdWsq891f=!QjF*1CQ6iIG$Q+X1#)`z1K+=BKC5Mu zyD3E`$-;8@F!X8m0jp+b&V!>_2Q8QzF||)vQS$m~sXLz>pono4ES22Gas|fE{jMeb zMLE?jI=XRYn!jL&trRgeqq-s9rWbQk6wgK3EjIGaQxy<^_1ZwlkL9J!+e{e)B>Mgt zIhdtaFi!Mk`e5asQ73+KgunQZw!Kz*&|M=gkYp+sUfZ(YlVc0^6b#+&w%5XLM(@ZJ zI-Zu=S7jqkOJ^7rvoW&3oDi8RPOWrOi;10Y_w4H@gbEA;j_K*b)&j;E*a!XO0t%oJH&!x~mzGQ7 zO@4XyKT(EDhETvx#O!N>*?#ad-qS}DV1B=DB%RbR2PH66%n2dIX*7BfV)w>mldYCF z#1Q&N`hoc2Sz7t8BZ0>&%bxXS7&DibMt~dj8?Eu#>-)?E&~zZCKK_vyth}`O)K6G= zvJqb`?0Wg~)rPNOGEl{W<3OXzQ}u?yOj*_nt#`^17nr_`9l za#aBHh$&@dLtYVH%aCRbUZO;>l$ARi>ns&ovG=nzcd^5WXyJM74&83^>!w z)$iq|;A^l{hQN%=xt0WbsP!{}afI$KUGMVGs09XH2YfDUEue*=pK;=dxwbJs^@0QY z92guY>4kI`0-~-2F7Uo1^qFbns$b2QTU30TK(uT~3=2sXROr-DCNJVYm6wL8qHl+u z^~tZTs#U7}uZs4rmR-9UQnO}FZBu)o&icsljv4Y^B_ zCbYeYDt^d#NDP61y>iGE$^$D`4qxcXdlP{~%^|B<$K5L~c51xt7W7K=fa! zFPk;bQ*yo-U~#ZPv|<`hm|ooLht|B9p0?=XK?Kptd~~jEO#hg7NlNNVM>W-BS}ZtU zmPTPfAiSgQQmU6FX1-c*ZBW8*a~2G^W`U*qKjCp_uMv;O43aWJniuNM`KhKjpQX{) z{$S~ui?6!Tu!axn{#z<~oQEyP0|NaBfrVYzQ-(7c=;r^S7iND{J|WZ^7SVuReBEU? zhCd56nrqx;C=#oH{$qn5l1!4RSbIa{A!DAWF_5ZJJgj)iUyb{#-3>Eb-fOXuF%?%q zW%TVWZ7UD7WO;hasCyQ~XpQz7Xn_PF>@pj0cM!I!>7=FE@Jklrc$KAr7L?+;uzfB% zf1+}V^AHoE)E=eqsw@qRix1nLl~0)Iq=?msZfPe%WzJ)#m84P}le(Y*Jmd2Hs`Tp5 zxGase@fS-!!p8X`==t16W)_}rFCj{bA&X^s$O9rClRwy#6WBt*K72&O09hwXRO@q- zEG?h3xw7>3Gs;6Y919rT$*g(4*HxL1_`=~g#onkrs)G41*&A6p#7+#E=fdYpdky}s zO{3j-+aOw$0~jd&R{{OU7L67^L0<;p#D>86j3^Ll$Q$2gB6@7AU)_lV z_l$pKWs#*d>-n=nnx~C}b0^TRf^jU&_%~`bdiz@_NVSXnFHsP^iU8R;x;S0!che3kA6{7S?x*`^*oPHf7?K3S(i{=26w~&qbHPx;S%L zG>)T|&}s+_7<>6@7E<2WA>vY#Meu2=7u`+q^ljCRi_ZcItl0APkf@3UM(&K|6M_l- zh=qfful%XmUJ{&TJ|`9v|M@np8Nn&otoHr$bTvVmF3B+ZRfH6TQ(RAxgi&COkqMW*g$=+k(2D_ zS2XSU>U2pn>u4Lh0XW@Up78l_su`c^?S7Pkdb`F}DQE~`Z)i%`j^z`g!x2`usdFt; zg*~z5#|G<3L)5BuwiccRw^Mc*NOtYzbFNvmqEtPYe&V$u`jo%=B@}p`P+MBqjjN!4 zliBDL-+Yta^)ks6#NN=qD7(MQqD9=c&f|9xFo^U5ELh*976J3$DXuwXQEM`x#++GYiSR1+i|Wvs&jc*278Iu zn@>JN6)8fyGMqAGPoAf7|3Dxrj|qY;Yw9%m+OMONM7zONam*SXl1z1j7_pNqkSxgF zU*-3jyDXA4Bp5X&8V^;jXn{xRdi4Vo6u(b@G8sl5St^%`$@b#bdS%Ax;Xd*oVrNS|~_F zXC80tAH~wk<205*3;xLXD~2ql&EaPRTKpE&0(t6L_k>B%_Sze=B@TYj@{ODR?L914 z1)gNDTkM{f_L@+jWe?lZ8e`7!`a!|5EKRrj2TOa~v|P~+7h#;+sJY=$gNPF+Wt+tErTqQKpJe5a*;9WIH6@a``{=2%X{?*DdL!{JM>GlY`7;7O=kZ;hU8M z`OG(Kr+l?@Z5GKFrl1fe8&Ts_Z=-UEklv~^;#nF}i+Pc=h>eFh`Kae1W@UQw}6$6aNaZqQ&} zN%`fI9bvyY*BR!v-EzX-2YJCD2|4;aF)u+!j86tNgCgB3>-`Q8QElzPQGnPoAXnCL)<-l z5E|eRx-ISdGd$F~#`BqBhLTb~e2@1Nxj>4uSnkL}0^EA|lzdW1|J&%lx&<7HMhvrT9b{()aPzV6BWgmbc%q z&v=QHse;@`^vgwbgZ>&oBnki&ynK=ypeL0`ITT=*7@5L3iGx7C8YbKU^xvK0hVef= zdi{hnGKJen&zGg6qK^nMzv!T(eAG+QJpl)@MwBP*HcD{@R#Mz3%^;KYZOa0phpv>- zl_|LvPiDPcv&P&;UDK!0$=fnX`oX!KpThnRjP4&SoHk!Ndm+zM}cZLSSd((UUb!zv6B-o9)qrfijwIn!wCGpGj zHEj2>{_>F|JR8?!zYK6tfvGVtEtJ=Mas5eUWWj4Mvj!njGUtTIo}SL4Vcp{k$&3cE zobx?KYo`ksqa8~pC}3%tJD%2uPDGtSv@EUe`m3eGX#D-J4$;+n{rl7TRN`J{Ty(y1 z4OtMoq7>xS!rmRD4>hxT8z1-1rGedy9=-O4{FYBJP7JwxoRe^>vb1VfehClZD?q2t zK(3tPPEyAvX{Rxr)nX3I;Hmc&2g4+5A`y|_4jH+BAUWqxZ$ z6%T|g4QlzLr8VvTZ0UH${r-l~`1C1W%v1QB>ls~S#}ACs=O(wRUzyj8A%h#J>Rpx& zuhze5W?}=0*GH%xKFn}oMikI{w)A4CqSG`RWFIDoJN0 z82`n+^r8IK#(q&>{YkYxgVGQJw;sHKY#srgim-m|eqmg0) zSZoVgNBSAhYAu8vt66g+%QZTdMj!HxSlE`c9YL&Vpuj8{DQ}3*a|f?r64}nR=1<1baV;ElY%r+H100wYY}qWJuld+zuZdrw z`dDp-nfoE?VfW2Rk$0d0#H}xrWFZ!5P!^VNGtpDM4Z#+ZiVSNr8%b z@{kAj?jmn);GiMS9_ z9CL`fI_C#VlcYmBu}rdb=nyXFBiST$SYxlcG+&+joza+c@z2Op4p5*LavAP?{DQ0P zwI@`IzpAx-@HW!^Rjjh`HPeQ`r9Egy(V+^FhhX^=Q8sjbRxGR{^@y1X>Y zco3&?DvMIk;WHCfPR!`i_%4K(>dW`s+&Jaw{?F(!%g@NWR%tLqQ^4JbfV%wE4_5|= z`uiPeycIt8F8c4=hgw?i1w9Ka(l!K&1BC-L@asnCH722Y8`-&$3N=h}LCjp4Su#aA z=}?=L&R(Fp*EIAJ4#U;xsG0=ZO6nx} zDL#5b7Q}XX5v&&NwHr<*x3Thu#PusPPR&HfhWy_2YhUfhqL<G&~UzftF`tBJYHW~*FO_1(XCsrAe1V{glXU4-{{}Gt0rd8 zEfV9v5mzrGdo2&yv&l6LODA3H1Pi&EsnXUp5l5hwPb>4cpcYF@MP%(ZplwLg%P4*y zrc`x0>hkXL;nPO)SEqf{en!1rW3Py{F!~0=wa2a;z@p#)*oGhSovE4^>Wy^|SxhA( zEPpis(zuK-e3N!%)H29Q!LQ9|GM9NOx9CZ)rO;9kqn$q;j^AQ@s_S~WH2fO#Ay-B> z2@gH^xG@76!aJ42ZcYKlhIFZU5GB9X8TD_{Jpsmzb*ollCxh}t8AkfwVfR77V1k~Z zY|S#RikN9*7-p1yn#Hmq@ts6+F_+1u>_HjZ^5HYM&52fFWPI(i*W?=#SF=3_VcZkRi6_Qg=WdaQ=r=xGd5RPKRcC}5YI#G7QeYFS^JA9(*}N4MBLqf~9^Wp0EEYTa?8_A4)qS~t6c)W*3o z{>cDTu@@BL)-bXu*Nxcy=4xm3A*ugzW%i-~cL<)$!WUUzITZA6p(%R*fEJh*FNTXK zZKfM{@P>Q&c@jzF!GJyDz2&Rn*ER$}jF>r=Fy$+Q`TD+_W`qjcLV=%=s{<(N-T^;( zW|ZABp8ypuYj4Bo7AvW=Ap`}_2br{2wI9lPhzX&pFi;DZ{%i8-!gW%=>Zx%jm$_L54;)#7rj1q!fe*e-XTP$mHd7?Se?} zR2biH2z`1mRlHhuU^@d)t4nKekanWLetZ@r3lKO8*a0C$!Lgmn>Etv35VIG$Gudlk zoZu)i3ynE$4t*JFnRtz7#7D%%S^5{N-HE|k^fFACK83XTD%21x{{crciD~_-Z$?XM zY5W0VMzJ8>NH=L}nW}V>H&8I!9Ya+Iuso637=(wm4kWl=1fRk#eM^%}laarpNGu;d zO*yM6{?DBlK{o0nOR=#vx-wcrovYhIxnN4wn@N663f#EHW|OTArA z2!srq@(J-KQ>cMjK5b*Xf6n)DH-=j<{=dJd$Cgl6O^{jR42b7~s<%LA0jY)jL6AtuIZ%2+N17eiwHW%ODRP0tODprk>*Hw!++q zTIgn$uhuseZ#eD<3|sa?;Kb3-P-oMfB$8ql?`2J&(O@`MsWvUeb)`L1dfT zmD$nTCYieFuWw#dgyp?f=Fai7h?!Y?RQc8@?ob)@>S2gwCyw}PDO$wFH0CYsT(jht zx{sQ>dg+g$eE1B-xlQJ$aE)%EKoU+zbVEIla-$tS>11=d!?YNBzyhgR^=CwggP4I@)Jx0HsN?V6Lo%L}TCPm_ zgh2VIfz9DC{yR%c%mf(!V|;8QB$uR=zgh>zosNVmd#(Iukp>!P(P5Ibh*KV?^2}f) z!wFPi4UEgufJ!G&*r85@l9VsH&h~p8FfBA(vmwc^y?opR{2xY7Zgyq3b|>)iPWqa_ z6U&C&;_zo+r2PmgcY8rAC4K@1{p)TrkWoHg4e(L&C-HdtvN*Pc?!rJ zdn2A*B@XH%DIVEV=^<)9n7@q9q(DYt@Mh1p{)joqKFe0=m%6pyC5P%c2+AIwl znt?9#1ev#E6m)q^ka2$|UFqC$hyNgE_pn-672rsRR#YBWCu~{LyXWevl6h!40bu!?j zM#@WD_=YfUwsU(_)5CkxfpvPuJO%K+%jX&g2MB4^etG#cPjIRPNPP&Ch#B;iQ5+(n zUEF*~fLnf@0L*enn~|&SOEFSbuVEXbIUzW9%oaa;jVuHBBoUTBnY&vKU}j~qhwn4Q z{FA9>%9x9;i^)9>u3Em0l%0fRD5RlVv`1C^wJXerZ4nQ~sfoNG-})>q-@3!7zI0o3Tsdv=VPZneJk$?7L1d2d z(pnh8fPt2a!%XXND0vwXKNYJWuksrb-AU+W<{q>YBApEP6Hl%q_Lh48Wa-!JYHJ@Y zgSAyiigRFP#F~RK7k&A?*3@~E+oy_EpY9$d-}a5ev9XWNBZW zTF+QLUSaplhA6*$0fOVW`$%)9UG%$%rbd6#WqPdNWyf7uJ8}XnJb-eRj-??w!jtub;_O+6f?Di2^J|pKa^0u~e`$2ZX7O|QaI|74GAJ1x_Bq`5yRb?hWXx zz9GbQJ6_TPz!D17b?nPkV2DWubn3B}^J~t3W|f7f3Ip&nN-UwwaX0R_1KTbXx$;+A zB$H)(57Kh@nuk6Pn`yhcA9(Qfr90ekEg!zXSz5CjWCr&0*s4T00+geS^o#Jz9BE+F zvLQ|7^U^U0camncydmtfjb$QaMr+B^zsR)U`|o9b1zAV{3u5L}DB0N-lC(VbyE0Fe z)lk%zYTSi??Syn{Jzy$V5i%?Ni0aP>LXg;rGUjb&L)^xwjWL`@bU`(59a(sda8sUW zjGaEk9SBihX4>Fu&8+{+_MuOL7M}5a{4rX=(L#Yd=Vd$$jp@cb>GFn5Tc#EnV!m(| zoRH?P!m~R$PPZvLaXf(`86WUPw%jT(ypJ%_31jxdSrS&ovYa2PtjQc0zPGe#uE1Xzy~X z{54Bk_GGW)Zt*k|oLA7ieU^PEKT9{Y@!u@n)W(0av~JQLYzPyFjF*)Qx7(;7K;Lq2 zkX`V`{R_)%E!Zps3(ZFomFFobPUaOL^UB)U6Fti1KLltqg2qjI`6OmUubP6BfX0dk zR99}mzGI%Ro5YYW1&2^@!;sKHLCiE@)yRQzvcPey>uZQK9(L?8ev8YG8WAQL@4RpVe4Q0 zmMkbZgv8HYQ%CdA-*i3T7FnvqZsWPu16f(IM z^tSwrI~T=62p=*%6g94Xt|h^-QbjNRq&O&~mS(Xi7nBI@%Af_3TIRxi&H6^m&xn6* zS29OlYhCVFE|U!QGu{}B58RifrS5e90=zylQ(JxBa+G1~wtuMn$q4c@(k(P0^OK=~ ze?{gB)=!8bcQf`VNnisll9=f$862XN29Beql+U%7liXF+u*y{dcAeLACAxE%Y2JkcIka=smd3vZto9XStPMd&dFdM!eVbeh zNo^7RHfzNSJQ}6i9)5!I(s#Z_#+|Si_%u&Y2jdE3<_9^cq^kPzv1;iUipLIOp;URf z)2wI0N#cxq(v|B*M0wBxXHt~chKB^!5)|Z4P*$!K7{b*J@oa9fh@zuvON;Fg7LL0c zG#@A*>#_3E(n-U)gq82MF-Lc3fP`(k)ed9wUS8S}*r8UCH-2MJ)1LR33JfJ1b7Zap zpJ4I(oaV{zyJfy~p4o+>E>nW!Tst8qx4Mm(AxzRtNh`m6%hF+>|NhbjT7-~Jr{AKC zWI>k^Yuv>r*CN&|KTn*sU1#oVEM>AG;i-m$r@_fqG#rs?it|Dr(jEpfcZ-Rh-Y!9r z*ho0ZCBe&DzUYW2V3lwd7Os0^_JPJt?Q^KXM{{}Ueq(VbL=n(3Re6Hzs7#(_LCpM1bTSP?F)NI6t9sG< zzUOiUY>I246Qboq)&XeHEHyxRAXTj|twY6Pq5tn1j$h)szl?u;XU-i1rO$hPpS*$i zAu9K+R@0-3n7uU6UR;R3(BT@gphA*2Xiyt!tUaNVP+$77MV(BtfJW59uKD6Xk?EB| zE6Rd$mz3WDiy4w&vlUu?Eq2LV<=6Xu0QKR^l#^g=8;C4GJPlr7EeW1-On8b80}9k` zU*8bQI)+s7_-tPdc7oA*v~k*ISp*~U>fsy2RtQsk7QTx+#Rg%V!WwxES+IQ3CFn8z zw!`j?4QV-<6o-MCw2wRSy^5IeMg|dS=EB1N={E{s*q9vye6*Z03-Lvj=?Ri}xH|c2 zWlRRE0CncZus5@yyw?xR5U*&YompD>Z{Rhg8M_{<;4SV{mo@{9TdR(%@m$MZJ8&F$ zwzJISrinL{Psk|4xp_|kk*#hNU^17KuQAZlh(zAN~{^JOU5cK`#S0noNv zjALE)G9f)n$4^|1{>{*L8NJtR`LX|JKvDUkPvEN;WrcA-ZLhWHSy9MC$ZJzfZ{Fq9 zUG0xuM^Oc7%Fn1|)K&BHc@O>H!I;YzT~F{$BrOyB?l&?o$JXN2%#s6-qh2N%jf4ly zlUbz7SL@5fuG;(-6pRUDX0GowZ5etASV&@HY1~h?RbS6Hl_NsVwm#9~W!Sv;lcK64 zx?cL|=1M!}Kq*-dOuzg*xq5?Et8G|@n0uUyJHRpL_1koRbu`pYH!Y z{17KHkPDmpGToTGEOQBXN4fFYYl#zeg|Eit82vre^yRNMGBwjwxd*nEPq>q@F(1+M z!H9CJa&gBV6iO&N_~>OU%@GHyh357l($vS?8xYJw7B`Tt{R537Hpgs?PmU^mJD10B zVp(7V@|GPvt;=3Z79_49@s5QMmUOw0HkNgh@|H%a#YWu5;FMZ|fH)KBBqP9i0GXgs=8L37((LlmI!5f5wb#BQI;k9FfkUKQKWQVBPlyqGIKe6U7hOT9 zCuCvr_KB|+jYu6Dhq~$fsXZVNOX-V;wq8v-_h z4o!2}tHtahPUG)36t{(48zKwM z?wJ9r`0~}VC$oVP&oKQmRG>V+@r7-T6rGX|sc&hXq-|`fHYE6EILWPi8?jPBt=VfS2uR!E z?#=Nf(9~5bAHJKl^>&F`TF&P+(UI}8I@5BsX;V)Y5Q?Qph+sD?K3{F=4m_ecVbnOd zoKIT$t8tB|F+-`AN7Yl^VFx4cg3{hb%+$l~{=FFnBn!;WZ#;z8lTaYZ)J>vVD5E$T zS+3DVo5YpRhB$X~9#xN%w`qool;05kdn&k81rEn@_yW4bNtLk(fn#5WT5iNFnRmqz zvV{UaWAZ4f5ZRN6K6mw{DJ-C3+7JtOQun{-FheXdyf6z4H!D{Kd@CD8)l>JKU*~1z zF?jbox}9a81u+UNiTrPdV{5MkS+F7WrABDzj@5NwmgZNcBh3`}(<=}VRbV=sclAO) zmd9|iXfXU$wR=a2&f!yy!aD&_Y0qbX=(F5jLz&b%rl{(^2mk51+7;JG;V5j@lLboX z@lN*i2M}UJ*7^i0XAJ`zA^_VWFDt-hxIu->%5F7u_B6q^{}ddePTG%;EprG;usR)r ze}fC@t4*C>en!Tm3JzKvCc#_dO6#|g?(zktzzoj07QlG9$*&=Zh9Ke~mlaj78>JzE zBeO9B5bU+58Y?zZcdefdv}IR6eC`U=KJwzWA&R@6jt$RUI!K#+D|-<6Y7@m>bgljt zcD<+YJp~y{8*vxktQ^2@uZI-cP+XZ#HbmmYbj`1dFd`0QBy%-3ny|oNQHqfFuAOUp z3<(DG5yu&dRc12tE4#g861T%4{rrq^0YGXC#Zizb`>B4GcK!Zf=|QMfAx%2w%Z4;0 zI3_E?4M)^{xhgQgoNteawO=?39=%`k=X>1~10_yR)2{Q?ws|KM5TkH*V^gn9Q9dDv zmrOAt>uHD2(m+L@9*e1r1bdWI9R37cs&WUHz4lM=D0z-Ta-`&t1(&~?vXf1t&fUTw z0y}Le-?4!KME%HJw2a~~sKqb=fTYZ@*TIH{U{5G>vdIl=pXygX$O<}GcxJvVS0)2E zM26Tmm>I8KQ(l^e5#if2L!&31-1!+1IqFLj?9PFHm-jl|e|!CejYr-%?8<(sFYh$=TK}aVpOVzBTh#N- zPgw~DxvVqemZjNc{K3);ffRC5oaLhHNCVm-iUi{l5~X_i@R4rFNEzYCq?dDjXDF(} zK@d!pLN8MeV0@lNt^_2(^zKU%%%)J-W%gv<+pRp2*-${Fpi) zvikC)`jn=|i$q!4z_=85{6j+bHe~^-e=8>ov>JF1ty*jVkqVNsQOS!|D?!n_k z@bZ0gf`7|*lBM_n_PAqwE=-GPlZ=&C;f?fKH-w0CzwsrB*(v&wt(!0|y#fJVdeQ@* zXAQmb3Bg6(@EZokEl^8X-3+j3YWHM`Mi)Nnd(EJREv8Yv->!n1Ki=z&2{Q)65D}H% zYhoEv=#EVFdlDkpNj&3xm7?_dgDZnXYJ?s?RUFD3zTeYG8*ZPao6-HRFTG=3$urKB ziMF(yRl+Sm^5LMQ&tqP`GTerYzEUV=%x7zMBV8!j`I^DEbneO>j+bWClo8AyvoXlR z4b&nR;huk=!E}_7zPs&6Amwf2) zs_!+X1+(EVS$dcj!JclCY&km%$I(5X%0deYSgjpmE#Swp*ZWDCr?<{wf$@ipukN)9 z&P!*0isoXLcK9gPQl=!-S%@O}E3;~#6YYdZ7WlLH8MO?IQ=#fDUzv9sTFJ*u zslIH;Zwd5YZ(KoyuRqX8f0kyC`Rnp)OB<-lex5_xCs{DHCJk6p9ELWT3Q#^F=11$m zC~udg0q(E-ubIoNrOc0_4A*+6AB^(c#%10v6vwPnDWKd5%ZzhG`J%r$qM?4J2K~Gt zv5%lY4( z+4gj>xY^~UGcqb8^yY8s34*cr+AKjsw_sgAI3cFtJ{^uOwSWzALXr*x;h7%op(I`T z<%3=6qAk4E~C?oVYm`qXcl zFKNK?-DxL;4TAO>aFQ*(RzcYp2Z`P^Obj2Mo1d@tD?%SUR)N&}7JpKR;vI>Q5!G7QNzNQ+@fo)x5cEgS;cp6NvJTou7f0 z4?2;|H?P(*WQGLRnu6Z{_A>&A?y4HhYZ$Qq4DwJuAv#`$Wm1VRQ*i`yPS0BOOvs2C z(yyv6z1t78&K&(Y|Z|`+jCkzJkQp{vB<)SP5U+ZT_o}@)j50b-|#4O_42O_;;@jtM8<_0{g z(qkpXwxB&vJRyi9Vi{q-^&6}2wWSrEO0G`m{$AP}!X;O4SM%;wHge-PbQS?x~Y5{5#=$K{ccLREUgV;BUHOQ zZ3z~(q!QIDV^qi|fbng#G{lU~bO#6@c zu$+*4q&RXDK0f=KDTd{}My80B6ftF_F#rxXGM#j>%T5EKLLI#Gr_HOPXwNcn`Qbh!$O=)(fFr1SvBasHsO zxX;wJ)gIWpp8@O$e9HfJWq@&moOLhn+0Xp>>H_^Yx+p;=>YQ{`HQBnHW3{?di`28iIDo)q`U zlyQbU<*LBb!PH*FLKn&j(MQJ`^65KDK4^;>Le&%E>gnI&7sp+pEp3vLWC5v9?WpTh zRvQz0?&$e=jpur|uuJ5Lt%YcYD)HdlRp0BIEE z6F$w1WYNh;ul(|jeP;lKmqS&ar2_)vBVuyAiMGIKW#aCet26&RKc2gnr9mOv4C~`S zhTP%*vOFu((z-e!)|x_+rTvVt!!~mPOBK)5K-lWfXv{DtY34PDAVL*{&6#;hu|S_wFQge< z8|A}@Q!DrL)yQyW3@FTCaWI~8&X<`44Cpj-m#V;fO`>kY8O%J)w4J82Q$rwAdJ0rtjx521w)1U-uf1tC3_hvmuu0*FHERO;Vf@BLV_g_V~0krVM%X zAKbt7{vZ zewT3r^@2kIXF#oVY(rz*enu4-GX%pMM;kTj4wk>#Xo+VCh@C5GX%L^$!*NVAZ<}j3 z^Ty5xsr&FGh6rhSA7S9P|G2)qcibl3&NxUA832GhyqqA#WY^dj=CxAZsm^ z`!aj=D7wEpvZ#ELy8n(L_?yDo+~pg`f`!#$X_Yk2F=IDWu<8D)|BSR6I>&s18UD4s zhLs7B4$@YZmeIG8uzB|8Edz@3(vLy13uO^veRZ&>U$T;7 zKm-xtvBPZP8+$UR@attHb5Anv?W%vZCVE=*xPk3lE6-!I_+$?;Jy2(+vW0`>`VoVE zi3cACKVzIY=$BJWoGYw~;sX^NS0-IxMBvwP#@ul2JRD+)Qu6i4pQ8D2c!i`H>zIq=f zihUygVV`7NQ+;UzQ*}7@47##(G7=(9Z3yWxtExwNmJjO2_!@Zx!BD?B!A4|4nt9i7 zt2T_M{?+)`F$$VAkC(6JbY}<*l7tMcixF{oL$pfRlX&kW>`Ro{;&G#Hc)d80l_A83s?N2DJmiy@MFyqS`{rGP z)5|-fdO}!5NyPA;(u-*48c_=#vVnVI2WuLZ;aVL~paHgKre%3U0D1f&jK5lh%);(3jlaTU#x|tkU{BZ{RoN5q zkdaJuA)_%4eI2f4^D4N?4&u4y%B0$LgThQCdWsIL-2D$fjrG6m05{XpAE|YT zZ&khmOuOGChb)~9@h|ajVm=Poy46!0M{j3FHDUo{G)spR2UF$h$j7VS^Uf%TU3PZt zp1ZGZT%eXn7H}selV;ii%}v~@9zFmf!>;kmBJEL?TC^?-KU8Lw!YW!Z;K#F$F;C&?s~PJ zt>~D#yG&(!BVmBOk(bX%!S>Y--z^e6_{e0ch+(beN0nqgUQ&pu`t-h9Q?Q5L^5>A! zGg;wKTKySKkfp*0{p!XqKclJ1&UMtUrp5^q{{F5OMWe}9)RF-Hz^vS&R6p*Z@1B-ihXElEnf{RLW}Z6CvBo10&4-A zmlJ}VME0bU*A1rH)O~_kXnFa0+;1LB4@|Ga*dSFw+@2WwsGiDu?MfTz7CVSfhlBT3 z6lVaJeS9bTGU~2nOo~pGN&b}$Nn#m1gdaBTwI6p^ey_=zjDdN6nVy`m8|=v(CP^@t zgh}Q111=6;CLuwv6^bNZEe}bvo?$^~?l_23xtnBZ!UQ`oEaM76Eira`Dnrb0knOz6 zObeYw`F*&KDOIkKWqb!?cfjE%U~Owgt5R3rRYn7MZGK0kLI6M>LmDh)4;#U_|~2@ zy*@XIRE8mo&J{Ersrfvw*1bikCoR4^9l8C{rS5?wP8 z_lkkO|D(lGiy6%lL{PE#^1UX_EedZ`Gvkl2N-?1R<*od0|II$H`~M5#usL10XCCIu z`MTX6r_nzgj>n5C_I|Im`_do%E02!+C8ut`J5J}ZA5Zi4 z(qC81Z~p$4%XI3dsQfQ=?>TPc{jFSx<5?LFHIzMHPC78U&I0+ zkJD~<$ZgzR`^#Z)0GY0wyA^tx&+hu{lzU#%+eG_=z2tMf6d z?5@+{GGCnD!*#kIR==3z=`>t7*Lm#P?(RL4m*Z&|&evg0vGVzgrr~;W=4VerUhiSt z91eR==;mTz(Z5a&zgHQLq#<6Z=_kL@T(Y0rHK5vib-Ny6wlij6K7=hkh*IouvMzQS5>2Et9H^b^kvgJ&WowBXVGy#o{1mUzuvp!&|lAtB!2c6ox8&{cn^N`GI-+RoplsM@-j&HE*I11 zPW@%O8&}68qIj?U?mG1CPW#`m53i?A5+h)*{iXMt1ES0JuwVA&vfW=g^0euC-TfP4 zK&G^KZ1>w1VfVYMP@rzwT`&sItK;;(8+(%`+`slqPur7WyM_r4o9q6%`W_+7`+<5f zKdbC7m&^V-SYXC7*{UY=8JwVDQDNNqo+ZO0+v2Oyat3JYFkcukUZ! zAFs0J?S9Fcr(=KgcAf=%g4WeJ!*SakkJm1la`L)jv`-qfxm<}UmK<|)JkI{6>s85h zSpO~KUjB03Uc}VoQUq?-^Kn0%d+V=XWiLu^Pv>5?YZdyq!^JOs@O7tt^$j?lD6%{b zKdS>y+pG7j2>MnpfSE~{J)oB7gmsl$0cd-RTzi0@Xee!b7b;h25sr`$#v z*<~jSGSs6xIfrZS(Rom;$=St^t!;6qj)|82;k+A8tE0Ugy(p*7)0Fq+zy<1ZVskF# z>_HD}zvZ&+Py4ICVTtzRW{|n7FO)~Rz^hm3y35&nKO9?4a#q=^)F+wHbXuP^U&j5m zm;5V5Qt^%5c@J4uVDq<{SKolP%Js*q9J*0azWqeCc{&~(mGgX>P%uub_r*Eg0*MZJ zU!-PZFIPPr&r*8C?A5EBM4sJgICgoxkAuC|Dfc1M$%C7VQtyMYX5$0)8kCR^REXoq)OZ z-7z;{cRg*u)U*qi)5Y-JwfmBY=6x9jv1A_3{>87O+`}>)R-ZZ%LljboEcnZrRonUE zY1y9+o8#&i(+xUblE*Do`PFp-cN`>GCy(Ijzv#5_(8`0hE!s<1Py1s(U%FFwnO0{W z*R!j4_C~e8Xn&axp1kYs$jk1!!oO&FcMav3`rq$({=0}6s` z!cMO9*@<5H8`;StaKU@mPTk?EDj)mnVLt9f{MGx?O{dcg`I*lxXK>g6X72OlFm=<~ ze0K{YGYn!6zx=!}fJBfa52E9Bzc#9Ed2g5my!E;yBU3Z(PAI8owejS4Te~mn#FI$} z65bX`4m+T#@?t*i&i!fxQf}z1d*6-?f3Yo+)cmg-2c}wC`fbksriW;e^(0W;)V{ZH7ak?J&(o%Qe)Ll$r|IIPs-TzKc-Sf@Cf9s|8+U8tG$@pGVLXA#+nt7Wd*^(QH1E6`^)uG_1jgE3 zMWOuCJimkcZLiFmF2bnmovA zi`A=u*^V}HKV=ndtc~#4NgKAO<7M^Bu%C{@Mbf|5B6I_UkNqsA+lXoIi@ zrp}JKUwx0{+_3ZQkYCBSOj{*^`bIrWqO*E;58eI>P?CM*1{}B3bUbS;+Z?B8ZDj*P z%7xjxHu;v_N&MJL;-w*qrq%fi*l=?iBu?$c+))Xf(%U#)U^3^`ztKUHv-7kq{i6d8 z-dWux*87iE3{?8O4BprAa^#{c`}V%*1YaNzc$s>+o3%LRR_(1-gwfPGV&F(!OF0m5 z6!&`d`*Q5&qbkeSxAVfMLKUz9cc}T#tMBv?%5czr^%NvK)F?cFm-JNkhvR8=WplKR z`>8uDxzxeWt>H3h&tX=Kt6y)p>?J-N-rby+%Td9l`*_xbQEaWfM-oY3dEY5Y+NonN zG-?Ke;ZLsS>Q#p0@u-{`mMY7NQbVsq8t|*piY>H8K*ls#I?K}3!$XV~-xEF4?Z$UD>(^5=i1}oY(VC zt3p2vRVfAA+I>MnfCORnw3h+=or`o*i|WvwSLY0{!;=GcTuz-_%%37!?$5LAa5X}p zRjLs8vnumalWa!U*(V*{tnKO>V3lh(UgaKHCqnZxMBy%E@ zUozDx+^wBE1j8Fv;|#nV6%q$MuqkI(Hr8Ktm8Et4d42z=Ll!&AGC*bRH#%*g1?T-~ zipTWoN?4NzI<7u1x+K?& z;5dOwlGl0b9AgS`NyujHD+Tq$Jitj>_%CX;>7u;$zsu4#YvZ)UU76Se6_$6`fD$|c zER92+$j`ZBI z3D)Mjn4#AZEY(YT6OTMDrz;+gViYZT_3j!c=}v30H2fu%@S&5>J3|;#YpV%vP?xZG zbVu60>_;q}{1T z%PZxl(IUAHSW1U}#SF3~gV*PgIYssnC<DixxA~dj8>ekpnfA0%c zsHUD|HMj8yX2XkscpZ*%hSj;00-p1zk#X5ylx^g5`M+P^y;xmMpj5~*kC26y1<9Rz zM&Hm(A_)KI+EaJZ?bn@F(X?OMB}!_g&~htRbJ|i3Ir);f!&&{g^WR4zLuwZoHpkWR z=nM|i{?hHw*%d_GC%^omBNE)LMcTRx{tR}ASEmer8xzF33t`Gd?199(eQWn6 z>AU;2&xo%TeeCh=+hAerkhYB#UFN4*>h zqYdc2V23WWkJ$-qn}ep~+Hdh}53`qd;lUs2?#?+r(8w-N@=?mja54u3-wfCqW zl+8+EEcO_2Wb^Xgg+z()JzCVDlK*M;q&G66FYo2~8#80A94f=lB92fOK! zflhAsywy~=uKtUJo~ycbvnXVC*d3q-gx90^y;@~JC1f-Wxh4js-^icR=@~|QHlg0G zeRmN~{5=QMh^0@0EF~fUMJ;vhSKk0i{b|Z5&=wpN=Tzfm^(!UVx6Yh!mima1p&wp_a!_Zl z&UZ0)#=*6wrvJPzm|Mou?=}>htGg}iUvbzlo0c5&z-Y!-;H}^z>y52Fb@VyNn6k2_ z<3nY0A>?%+Re9O!UwTLNr<4KmwexZ&bvr|>6>aL9)i=O)3>Uro1+55~`RsDacL_39 zcP*8!SMOAK6s?*-@>HeJz=aC4TAiNLuMI5Di-frW7YN7>FToDa{aWl0(h?ehm$va; zi_EyTNVR&sWs4*tds#^7m)7-;n>9!7!^ zjrx|q1oT6_64lPQ8msr^?7t#s=E9b5!Q}F+K)NXV0AH(f%&0$T15iU-4A4qF;cF-# zv3gdcIIv2;ZYtNMXQL{@@|<-VXbo5MntR#cnf#yVG;dv$P#6vU{=@@=chTD2y=e6S z$tER{joAZtB^}_@>y{>C_3o0BoUk~%pS_r14&-~h!$p52iAqllB`h~=Eke-ia&LR= zCaGNR(avsb+@K4hb9JkKX^KLmwjZ(=g?hL*7*%2ATL@WoRE?ZKf2AE-o!2e=5_tE5 zdjqv3ocI-y|3wgmaU%y`UU1+c^jm<1#Sp-) zUga#GqYQHkQX^?poUs6q6QYn>eUE%c_%DWP2L8w zm}DP7>$6fH=|pP3{ss_Tdr*X+cIvcbWpwc`68Bj(uKpHy7=!`jmv7N{tn>u5ir_Xs z8 z3bcOt9%SL&1wZRAYXYtQ7Q#0Y1r)>Bo+744UusBIl^@#@aPaO89WJ)!={Dh{9hMLvbDN}MG)*LjPvdydBlefsht!8S846;YA|}N zTl+H+R+B>q{u)`H{C@Q>tr(UxP#7=XIAJG4EwqP;7FYL$hf^P?D)vi4tbK8{kJJk~ z_ZWbyl_^%y|HXmf5a=%w^Wpg@+vw5Sf2;Qe&=wPfALb0d!eZCBom-BvFaQJtBAXz^ zR5$*%wZF8YYy?Fy!fE@m5tlGTnd#ZA^|A4yk%l|T#h~ReZt>Il=(^MCR}_t{%JRzbkD+Fz;qkDqJ};Wl7rhPQy`@$wAzYH3 zI1gPZb{OO!&b5dIfrGSLn;WqqD1kOsa7e@x+O^gCTu(PD1WTz;cNxF! z>isM>uuf7d<`~3y(2Ohs|ma7;qSBg{dZk5o`ZHYxkDq*pVCobVX%`!W*A> z?t|Uz-v1JGJhDdL&O(i39F8>1zPL9tGQz{%1ATDIvOG50e}0{R{d+b`pjJ!Dc#nK- zB%0GlGV?*=EsY0rAr!QyAc8=g41L3;^4jdlDX;)peb8*x---X6e?n(?IYgo5^Vfl7 zp6-T?_0Pg(FwTcArhIKZKaIj^QzI0#RUe~5>{&Jlpt@kI8i%};Ar-NBV^!-Uv7ObnbO;Fdj~q5?g`#ZZD#4{|8NH1TkbL!_ zwaSskY?k_2UV5l%B3Zb8ENP*NOA@T$(G0485mPo2Y~ED&yj`7K1UpV%YHOYEHr~<8 zQ7s8GuKJ(^7uAx6mL%Z8Z?Ikk&oDY;8RD$M7&4}9TZ9iuNSg^Al%6;7E*FVsxlmNe z6@}yMoLbFf71xlEkn+eX{H17{_PS+aRqgAc=VH5gi0`F)GJ7T6LdMikjwaEnpSAI@D+~R=)`5@v!^v>T^g#ja(mGXwfh6 zP@Mk#jidxw8;^?3c3le`n55wHzp3803i>$a)LVE^oWMTyuVRst_@cT(I=w407|_)$ zM!tM!wq#(6eY!3;)(BL~z_)`~cWUc<(3C9-iMM~Vt z?|u&_J5ZlueZv|C;==F&N?|bK)Z8|g`VLUsX`AYBEWDYzUrzEF9Pg$!arOU1zx`+H9DEla@#XaWr@nJ8MSU$G<|Ue=CRvx zoNCcFq@o|tQDblEdIER@qC3+&G!HwET@@MKssBZ>efGag8Gc1;#vBi0JK}-*4glXX zecNfu&24}2Y%c}2)AeM-(!N~^W!ps`X=U-a{XmbKGR3krJK}JE#*+q#epFtIaUvB8 z^3kJ8_P?^1dCYR=!@1LlC(cuw>z~y3G*jVNGQrQ2OL4!F^9B};^-itE7M>m$9-e;i zLunxg7+h1Rq?TL#cJWnpz<6KGei6rkGM{|EF=z?M+HVBd(s^`r7FP)^_!|=d4)W{_ znl#?tur4FOKF$V*emIZjJ$-KWziKyu!yjWGO_eyE{+j*u*OakeJ5$|R4PH!-`uu(R z+rFQ4{xdB?gqt3lLoI-78jk-$`+i6_q^7zoqngyeai=()w8Zvw?fQ_@gtO(^pBmC4 z6vT(P$RWzqPP$gnFqBC_XH#+EsM#}j&YQYab>8bF84MytU3oA6!`QKKJ5~}pndQF8 zDsi;)1M)1MOUp#5ttJ3nw6~j8v~L*uy@gz`4~qk?ojY;no36ep2WRKq{4Px(;2p#J zi4dk>sIBR1jroA5w0s!KHP(${FXzEztUwGkfeS%_qdacE5#BDZh$xt3L!ntng={xQ ze{iZc*W@FuHusONJ5pr=)u+ogn1GJG%^j>F{xYL^E6x}vu-SSQdRe)bbeYv%EH<_r zCbf;*_o54&vh{>Ko9sD~I5~q(y0~2H%rj14j*#roDsrQX#+|z^(jhbP%) zLn%UY7!_@kJ@XNen)zxVluPY98xEyP@y4WYzBHBvE6SM$UeD8tn8V% z5Pqg9#G$FiosU1FcRWfx@QH;y-3n)#Ck6a)QdtaqPf$GP9$h+3}=3w4t@<)2lgG>r&JSTuMcDOmrq6ls4(+H9BYc5QY z=2_BK;z+%ZfmYwA&^P)4jiFWUa2G0hZZsr2M8nwaJEy>_s_|7!Vmc7yI`L%gM%XA| z2CEE(uGXX;b);XPN14y^Z{9#X%%5W0#=5xn9#6%|jx3Ip^DLYZo-7?foLp4y^*x;% z2&3%@+|PX!H;MS}`w19gvL5XaJB^?+K>EOiA(#PBFJV>7`vPnNh@nvD;_S zcjw>CPk5MV6r3zhB^^0QR7UM8+|9TLxqg;Yl#w|omC9olrPM_ADyovWFPbTk{o)Hp zI-umjC9m~JYT?Zez~EoAU#N&th9Fa+&-FD49Exj&bZU7HniI@CjaEh1L|3)`MXVVd zoCDB0SbWB2IgSyk7#&i_7gqI>X5V^6%)N{Iuu=A5qxa5YqKOOV1|a%(ylMCvdnqtufQ&nUQ>;Gzi|ZdIN#ChE>d7)jJ3_7}N=Y5q zrCChefyT7ohtyzYpa&O zNWLE;52f*_y>9RY$4AbK9_F5ES0Q)Dt9Y{3%iF!4KFv^kJ`kQ=nKiO>`qYaxbcH8Q ze$hAGYq7^v!Ezp(B|1=8B3lDt;&#VVZqE@t7KPQ3U)G!ep6on*rDOO<@rBrxT;;aag?#TU*HE|+Tdi~CxH!3fu5 zL!zozp=`Vw2lmAXmWgSkf>mYFAcuC9;M|}5$9-|n0^`j@4H{7DxX+r!qI;#y@rnJl z&|@_s^WCR5cR zhB@;$iVrUNLc3oaA59l+3crVkKh}wGr+5UC-fK98RtdbeYUIJL`EF(){0H=XaN zab-X*xkxRo5}HE7d*XUgC=vO%;j`t5-oc+dhjUgx?cgYO)|2 zU4EH5AKI5FEN#!6*G?P|wV)az+W&*}CC0^YYElac0 z&^2R9eXLIaNR}s#`5sdr>B39@!+zxkf%H`WB4wxA42^d73wu_!059_d@FeQ4F5NK! zDa8FtOP5A-_$SQxZ|H#Sv-syfx7tO(iA1RfGhg;JBB6gZ&s<13ug0L!LRiWV|q0f3CLry_n&$ zzu~bh1TxO`^!rCi5Qo(IODk+>nwU_->kPEnP>GQjx>^v@`z$D{#3=2(RX9bsN918& zJwB-B^Kvr~K+an8?9d=gf>A1J)#N6jGod6xlp{!`v2Ne4v`LfM@T>7{(|^ZdM_+O= zK4eJsDhg>)6ICgDH<=74PlNwV7&zB6A6O&HcH+hHR+Sa851J93@Z4(JY1&%aP#Hf` z<8_iB_%03W(ypBk?tOWy2`cK8R~@BN^QIxZ5G56T##tNl6l=TMUzJP#Nn9i0TZ&0$ zEGA}B*gghOY`@Wuu-W6LBt7JINvR@JMFA8m$j;)8TKCnMIbF`wwd@bwjj`l%sv+qp z^0Crve-T3ga)Top!+dF02T$?*z#IU3x~_zO#K9b2QB>KRVw#%dcIBf150WxScbU)D zzX;TgmgdDyRZbUv!xTj#K+malbSE6NJEWy z`2m?Zl~we?$VzzoVyK_%U8f^r*0(_h%byG_pEtGy6G!7(E9d1IRK2!_`#o&-r>t4j z)_-Sk)Sn}t^8lQ3pUo;V7sUkrN(NikOm?JD(FNKT!mFDEF%mYlqr()VYR;ck@Xbvb zUz$D%k@3xH0*Wt*L;IyQIXM(^rhiK{FUD?IT}6(Pz3WLJAWBK7tXVE?&Y;8o1D@<$ z5A}KQD88niaCw!EsRaCmSfD%sTs8^zmGNut4?csTUee{~g`-=oRL?*$bc_tO%n9If zh7PPn2Ck*vZEt(4*cMr9wD*2soYN>x5Q_UdfGh?^jL68gHfK7ED5*KFg0Ab1J37&Z zk$?eJk(+5f#UhLzj?Oh>MBBHUI*lb+294VI42qd2uq3` zEDi8xyUM{4kn4Ur(>}Ggs;1f8j3}0T){1PxIo?^CgV;q@N#BTs^wTxX!QoQ>B1BV- zavp)Jn+x?gOFd#;9CmvBi?q4rPt5i5cAX#!qk@{8NnDV? z>aEtR{DjMbk~gydHz&xAl!JkQxh2V(xwsG^gRjX3II7os_h_)e9jQsik=y=zlNdPy z8U%CHjvfy=ewCcSbdU778JE=YWrpCLjbWJ{A0(Akpk|Pal^COrn9!f?Q|r^lPhKZ( zYfn?z5_|3HUb&~<@$CvmH)lHbeqn1HL~5FJoipHQL6%bntUG|>UA=e&_;UVk(Q`L? zuIT73^DH;PiTNk>I~Wf;q20Sy(YsPRgtjHGqp9MHjT3C^)T~agk!sXi4c#iZ6nA2o zyD@=qo&Fn%Y#3~I$l%_-jE;|-=<}4Za`mmor;3MxWNtD1&E#NcsteCoR9C2dFH(+A zY|1#zI|0yP7cN63bk%J?xsy>A`L*Myk0yg>hQ~sSuTj{G`+6cf3$D-yz`65_N3^v#NDf+KGz@D*xd1-Bvdfw`{OGbF6Ue(T>w@V?VE;b{H?Y42p z^|J((kQ%<#K}FnUV;wruU_l@$XrfQOYMnY_V!&sQ;I>ZO)xMACF|N~-ilcuo3Myxh zEJ@QdZuP(Dtq+v3YGTl`Z{3uZRD%TR3$;s3ow4X zQ0h6|u2!@ad*v;sZt?~N2?wR+#mMFTTX&5U>&@H6S_dr|-wd@jf~tKl-YwSH z##FHR(posIR9L~F=4hhVtFXsLhBF#%PUH79ms-GX>dYZpj6pOSUq@-n)hC4tB-PxLSiLLq+g}vKUc3)rl3dC&@sPdAAo%w5H;GAlyfX|Nmw8)d z18ER0=}_-{(A%D{yWLz=eb@KuX^o5k=tiY@x%twR_xKrPml=dxz881tk=e14gL9K$ z)$7-6w1rtQ>KN9mm|QLubXCu3y!sp2rQA@`Tj!WY=`l~zi{?T%`7T#G976tC0&?x@ z%YH*@njy2k5LN`Qa6Hd5N^vG>wcp4p_+C6YfOd1k9`tNt9YrkuI@RxGOtLgS-D5L|769IgOnIqNu4w0KB;ilK+Uq8yVkQTfy8KpT zP{PI=;^=J8FNy`DQ!UM8_fYdZ!t*AmF~?$fhtcl18dduM=SSW9R5?o}Gbmy`i<=2a z1I8tD)wpiI(IMPHD66t)lBku@nEat3w5J% z|OVNFc|$ham^!u+=SOcN)V?g8O?rw-7|028{~IcNDs0w-HLLs}i`OlPX!F3-gs zFKye!Dwr$K4o#q#brZMLtFXHDAnKzzN8daF_@#U54~&<@I^+SCe^M#kbC^TRFxB+A z-idkP-#GyQYwZnA-`Gy7llm7?{P;}RlM6c};6oq4m2lTlKD6&8Q=vXNGF(R^7WYJn z3sPL@MaTLCphZ)Z!63i-_HH9QRi{czsa6BV*WUY8_{!>Z``A#ksbacJ!YOvOzvxH& zaRfRu-Hn6H%n5s!B=!smHU?B6W;B%8^_h zjtsL9x)p2O25Y9aWA`xQK3#yh8&N#fHLlBCO7$FF*g5n?8$ynnxNGAZBEb(*+g@Y1 z{Y3)ONkzhLEnnIV2k-z_!yQzmEi$XIap!QUpBqZD+aB=EVCt%@4K&+7iyz?!$d&Vp zPS8;2lZfAN(%R*LY3M~60vDUps81-`I1a28_Pq4lXOXRFTOLs(X4hd{k0{E%Rw4Bg8oB;8P zXdGQPhmJe5E1g&xk#^Tn4WZCr zTTT8Vr@QLpV@MB&LC5KF%?Fr zPZP2}0j7hK&+Xnrl+v(78hEo3CM|=N)7Nv8R0k+*xU6b6N>zELw3RRwEobB#6TQ`0 z)Iluw1Q1*c`tKwQ&goQBTM0CrWvQ!@vwgzxw6d`i4D!n!T>0v1U))+#XhjX(F{q?Dmpzf-(X66U-Q~q@;Q@z2z)m<)W_2jvZyCK2lc0VkqLZ(h? zH=UfM-*u-@vz56$ukb5D3qC_qUsYBt^D(XK=nYZ;|M(3HXNazxOFVBH_J#dDjeM-x zuA)jcfrd<575)jt0Qa!|(w<)x09IYRLtPRKc$AR@i(2t;rQ<_12U(66O-$x7UN<0K z_Q!o?V*mi$U-LE*Q+F`i=d`gb_wq;oi*OE1Mj(tCgn-C}@BYbsO`%&m{bW!lGF&E} z=N#E<>b1;u(c>~Fsy#;tJ-XTPbDd}5M9phh(L_DZ+OJ&&Jy4e>_VD>h`s6R^xXeKe z*KMd*VHV&N=&#I8!ublGV@^HmP3dR7iq;iNUw~Lv`EIPE{ZK0Uz^k5qs`Ckt6`-Qm zy+v{4qo(l+)rv;nDC`Uv5bQ;%#g3`{MR(s;Ut+^^F<<(Ov#s@M&qbG2e(H=n}QNj;(uuQp>J7c!-^zsQXcj9k#`|I*0)*AI6}gVLZp&KCa9Gl*XLow$JB&lPvuKr zUTG*WNszwd61Mxrxe*lZjN0Zj^7uAd^1#*x-=fAbfnt=2cD)duybj_Z7dpv2yq$U~ z4Rk{O0vHyuXYZPauA>{lJGOIuj$YiFcPMqs?d@u&v;>W>pBH1AWBXomUoZ~4OHlKR zP%C5&@lnKSuYD`LL1UU(eZMs)5Mxpk8Cn>4*0aEpNQS&3qGg|{{6&CvIp$|9Kc~t9 zmfhVX1hKl^bq7^@Bln^VY&qSNm4I=qjL{|L)z8A=_K+z=UrYqv401EOM+CpNl?^!; zrLl(lTL=N-nBFf{xeEz)s0`+FoS8o^dt~SO7lFz5w>O*NL~KZDqO37 zU==^=%~gKFcT4YxZphJL>tVy-c_85?$iRBdpQzspHz!GU9JzConAxKXgvfF-qJ7tY zqx4B2tLX?>C6-%T>`V!?Dy2S0MAsOYxLb?An@hxm`pM%tC$_(6hp%M~IZK{}6kJ<3 zTwYBAf{Jz(1w0)HYUorp`Yf5k=xk~?Z0kt`ibOv^LdN|fXIgbm@`LOAGV-M6R)9h; z`iq>^Ci9R=MIs3$zL+peNaOPdhbowq9qQlLy# zA&05eU2z~zUk!+wTP;32=@t^HW6{(cYo$j9XQ3upgGxZk8H%P1f*zxGk+IqAJDIl$ z>V6T|Id3Kapb=B%$+YhU-3kSG$0c-D@w37JaG^m^`nSuVi2bjxG+8qm+IQGR4lyQ~ zLSW6cajWoyq29zzP?OeY+6<2~s=3z?WL5(f2aU)|jeY{|x9o1a5xyw^+!p2+ajE^t(7lu%Pdjb-%(u7aE+cQp4R zRk1dif~S5Kj3yIYWI}7#=~Qa_@p^Lu*hB4?R`G^;uBMo0(F+R%h=xKI*q?wXhp;G( z(hL5=3PiJ!*1^?JLs#GS4<-+3*~l}JHOI>o%k8-hKd4q20ITtjqe@(ghYc89PfZ%k zh`n}L1KDFBoA&*fs$3s8RWa?p9xS-UgtLSb-vcdOus)_H-F26yR zqm`qHoL%>THAe%%&_&HxpJ|*Ko|qba?`T_YVcy&_6?^qQIRVIZDHmP?d$jLG_&0Jq zJ-zwTM;lj07Uy#*c+2WUlGVs^6PgK`+$a29?W3J)A6vDK4BTQU$@v+)b*sGux})4Q zqa2lKth4Y#!HEf0ePnR<0J)YL23RsO&4gG$N3vd@00SiX+uH6^+hdhEj|M_QcBC>b zE=6P{AG<4BSI+Rgp75QeAHyUBObiyMaeBf$GtnAiURdrIN6wfxCU_&C#!sS?$3jCv zL8Ppw0$U{zH$mWVE6&^)e3E`a79Z(`~$vw^AL^JfFf25GDd8)j{S<_~+ z;IKuw2JmaqYldSpr|;hj%;tWkaCxV%CceQxP!)@+ z$vhy2I&}FuxMXIDwO<;Yjg6Uiy6|1*AP-%fV|dB?n$;<23zoKrZQ~}P7Qz-~a<$j| zG1Rwy7CJM;LqdnSr~O-u$jJEEl+;Qy9t8RUSWWMpBeLh6RL}v=eFP!Ec8Z+T{VJ7c zf06DPn=Le@K_KxCGgzL2N9Phhu3klalVk_4^JWm>Bgo>3$GQ1j`;nnONY*pIW;z`5 zUO8{HG4hU6JzFQPmYMbp8=f1Mc1_n1cz0(wQ7dGuf@!$N!JJiO;_*j7blXOM+2WXN z=M-wN^8Mm&xfgjaf{od(aj$6KF6;+({-98w>XSH7#%U4_xuYoFuA(ETvAMgHEjS&b{ye#9|0xAu#YmNLxrJ46j>Lwnm}P0IPfF1~bXwR|B_ z6TM#;t*7EhC{GX|HOV^}nN@H)L_5qlzer+*-*h3~VGDzj*?uG17Un*-|1h<=Bg32V zt`famj`b>dIC5N_!Fju=FA%Z~#xw?Qoi&@9M^vB!S#C_U7z7w5VVLsHLbSdEG(|2i zzIRGji|N(L7ZbR!#@YY0zevi2RPAI>2Nlebyb5ThRjqkbuL4hlSQvztdpcMd>k4^Z zs{I;iyF=Qcj&J(cDR{wTpKtQWXg=f_G0mFl)5bTgC610xgL&%hd%=A;gE_c$y45m4 zJ#7U^rqD~w)UGnY1O^knp+Da}t1&Babpi;H+EsXe&=nr|*JST%!}Rno@743HsN2QmUCVdD^I!#owi!gO5q;9PwxE%x#q)n4*MGDo*1fEUyS` z4czJs=-Zm#Tzfik=CtWIPbEc80IG#6+ZbQtJsiunhBe9wT?`>1WuC)*ADUiCZw9gmgNLG)}W7vl_G87MQuzeOJ6MyCjtdQG2)^9Ours%+%eYD64 z-plj3#|3@wRwL%6!1F?fNvX2Q)FHYK#!hHG^)CXsfOL^E=NEm?7su>6AiV0?tIT^r z1CYF+Yskvj8nn;i1~lzUcX?qRnY*QP4mq*&YV=&o31q1g{ZM61%T2r#XL)bswZut1|2HJ4CAS~vUwmQ3zuY);Y*RjGCbEiLV)z~>wFi) zM@l6-h{)2jZ1Qi^J}AkIE7~l`DonsogVxk7K5e*DN`2BM^r!Yr%df$*hc|Cn#}~a1 zthQ#Q&`hXNIF>{vY#WxlPCL--F3sgN|Hwoq*o)~N0$otmdKC?B_ELI_lfTH88A^th z09&djXhdO_xh50>bB?|@)z2#aTn790u7`;#5XPp}W~_SejV7x#MJHBh6L)DyG4{A; z(6ye_$nAUK`AkU5jAY?bQUy7KQ$(%Sb7qm=A!o($$e1G}TiWfV6P7D*Lsc5k zH6iHK&%$;nY4cLDl2T{l3cZVs%b>Vjg$1N)kJISlKr(l@fr9)TKyU4PuCg~U3(ZzP zAXSzR&(}|PH^@WnSdL$!KgohgN|@?Xx+`D`by~&!1Tc&YrM*`Gh;;&F;<{1h`Z0h} z8`S$nkK93003$M3g``6;r=QlwF`=n_yFyZ|2tekOdjmVPEPZx87}-RL9&Wm87clVgL5JL^|QoT_Gq-*m#dkS znWBm7N}LB@^=S<27H~Oz<#Y-&tb|^SIS5L8TTesINy=m8iujeio0AD`xQSHIzxM6g zZb)EY-mj{BCzPW$uwzuM)OVw|BAEk}y@Oas&Z|m$WZIU9`Arw!2O_=R(Lq)=cO!>l zQ@WYa5VOMP+xHTtpF^B+!inA#6W}4kmKk~>FxIOuF5 z=D|qf_xJiVz9@O6+-9=Pu5*gMF>}a#uFMzQ7+x_aV5drlgJ5XHNU6S$v;*CWC%Hp% zOg|;mdaQmBv|rlpUE~?mP!k>I?Sc+>Sn=X7R2_(2uaaY=idL%yuOk&0O-KCOo^>}j zFC*Mxim=JZpph8)?s=&QG`@V6Cu)WHA5zK{F?}H35j5oo!)5A@yVK|X;jkw6&f9&U zdhdij5D~z*-E~$`1PC(75y8le7S!L+^hqGD89fXXsM*!z&@8u_Tncl=PGN`vHE83D zt;%!vAhylh6`6DhGld|2RrSO;-#I>4pS))01mHa}xXH9*o|Lsd0Adp!Gc(_?L zgT+rhOOd+0NBQ-=XEAOo5e%@$(W7WHGE5P) zQn=Vcl%!NxTU&3%^Jt8O(@FO-!Yi4_ z_xyL^hB8C2Jtk%LE~T#xnop5`v18EQj}TT1-cU5S}sL@fELZxTaKO*%)XT%G0M3%Z2T5&FcsCIJD# z2+g5+Yw9_>#)vZyV)wcOWWGQLzwt)>)8-5qN?61gj9)xe6OFOKF5YhvzWTjD>r9x? zLR-FDuKkQ`K1P@2o^4M+5?!vniu#-*Yz70`Bv(T(tDWaGv(uZ_-OdwX-a=+MZy`W( zGp#!uR&lxN9<3Zxm45-FZ)D^8yZudq%E0qQS-v_P5-XMD-ViP8)C>)OBF1j)_Q%hI zzouS?AgnTWXSY?B$-9`kysiG{MdO*|istEMURs^k$^7L9be=2oAe;xt(1AR{@UQnv zM7TIW$maRd$W8DDOkmwu^u@MM;zpNA83iKrIs@Xr$uDfX2L_Kbry4J`{JHJT6Gqd1klo8NPxX6| z12Uz=wOaMG|G)#=6rW66Y=>$N?goZjYc&YAK)1wz! zk=d*gUOBLQvG!npYH#1zF_}-2x62A%qNh1)DE9?9xQ$YBV@c)ptFxSOYfv)32W8}3 z&q~2_#GaIetv;;D;8sjimU2=eT|Wzt9^(P|^i1XfXUs*Ab&~~M&MGCoFJ?d+)cRS! z7rV_EdX3n3I7))73gkt&F(}UYB=DL2nVyThxjv1c3KSrpWNtN0pLj%JmEmQQnze5i z5@eU96ka)|E8YmuSXr|wuJc`3E(>hdPzzDolbKPDLeImcbN@>!I@`4A%owO zajVZYhU@o&i-u1m?!yDfbR^+kDrauJv0ML(xUa%Y0QYZY@Xy#3v0F}W!7oC^;Ye&a zDxAu_)_x-u>w`ba7qcHr$}xI{Rj)r?_XBXWK-1wGj!Ke4vECCpLkcE@uJT#9deWD)Q*QTY*aK{bPJ_}wm8v>QhJAIPZr;0U{ zJb^pt7KNA=CY`*Lk*u$N7Oo~#l@tPV!cg=&4z&9 zzTFIKhTOoKQRRRZv+z3o7R*J3a3(=s>Ro3RCFukz{+cj| zSRZ#yUZU8q^)yu>;1PEA0g)gK4J0xH+DzBvn(`k`030e#KQPdFFW<`<;_$<39o78H z&x2AP&W4RE^S!rmmmC~U5-;Pq12S9{0}&CIsUCe{`;Bl?A6r553ndnXlckC{Uh}Sh z7WxL;UIX={v+zzXWyVl?2>e`E<{>zReiiwegtvaXM!`Q_0`E=t=A-6f6s*^jS>;~F z`nmG)|2}I>Rr`qkNX%Ux$%M)RY)~ zDt+@~U}V1YwvKgBF&`NJa?N5g75icArXDQ8d_CP;e-Ue3BWlf83klbjAx}3&4)oi; zT}%Wyj0<&jP8Zv<(*ii-8DCV%f785{{AliaO-BeE-LjLbvl zyVoq+8YrpUc<_m3hX6#avHv`M*I-O&kYP-k35hQ$fLWc8kn--o*L(LznA$)fjR+$h zm{Mkz0h3}3NMbJzT0B47ZzNjtqy)#(ekdQ%-_!Gq`8iQY9bXV=Ogl8}Yxaw?t)hJb znmMfEG1kwbsSUBD6rHz=f|iQL=)#o8^-V$`Ce-1d&m91cqMz0cH5ZR{PyH-(xu0oW z>I10DDO}LVd1|<*DGus$#MO+#;Y}_vgIwSMr_ME#6=G<*x6Vtn9r#%7+YLKB<6_u@ z=)_)_^MF#kof8IPo!9+>pB{hz{@5LMzdwF|?*I8X|M|23*!|l7Ise&iejhG>y64Gk z%<#KWzSeh=MxZ;#gWuKL_F}DqNUtUy#^(_~_^!{fMJ1?_}|nZ)^x97g)G+x+=+_}Kj3et!J3+yDOfb@}I?kIV1F zZ_uPa;m_atd42$I@I3C=z*}~2A}26Z0VkU{*w<~xki{|E81FYDy|c=<`qWm@qVR^_ z(z@&MA>yNaz;q^KeLh3rlE+9|ZRPgu>Ox@wID$(7jV#Kal1>3FylJL+HfZew2tC zdCLLo7kko7R_6%bp%&&QO6rbNTjsr1QOUeJ4bm#Qs3ek*q}jV{DhaBj0FoJ;hxWb1 zHACTwbCOj;=Z(14@bF-8C2l8!(O$kA)cj6|*(zk=aSaId+a`?}CV5 zTqw342gp?-*C;TyDF30CG%Tl4(~hkX*}TZ`Z1Y~LP%I#4qFH1WSv)R10-zZ=v`O`T zk*q#dC$O&ByEH(0Lh5ouflsZ5E~FkjSr^HBx7ts*?u#q39(K!zn2dWb&gO%R+1x~Y znAYvVDkhgRm6W#*hs(fNW3<5WJMzaqzThv0C(52OwTVLb$lUjQCjPw=p0|;K^AHxy z!(ZkbX};*1bESOHSbg@Z{D7+gIz=d$xR1FEMJWm^6X3LO(A@Ygx4($u0)7ZgMQ3)~ zBfxkiH>Rc>?OLDASdz?~aHO`J09*hZi}X-p1bwQXg(DPZMh5&0_k@oH_X>?}^aAO9 z`-@O-s6TbPr<0ob!rsjdJrjq#?MCsKV0&Z+20Gh{b>HFSSjB9UO`d=Hjv4rNxtS`w z*&0W1uJ36?h6n8Ot-0l&n>z-=KEv>UAIZq1GVUl?OonaOZ5zi#bE(0Z zBU))IV$UMLGCo2UcN&2*xGY{ZIK(z;y;rOPdQWrgi^WK~i7O0W-z-w#z*!K#(S{b*1wR!W3;dWATVtlisRgbXR~2Qp9o5|d;9(iEUu zsMV76#nG4{qV1>Ri>Dd;9xoOx$L(7`i!Fwqgy(11WgHoRAj3n?F78cTQv-#cGIk!& ziMwo;9VG?+jgyy5sC||f9zKv389xf58~8snr}!Z-{ci&f$^J-T{ne5qEu~W4sZRvO+G#hBCnbJ#T5XtK*%~|Y*77;h$P(V@39!Y7qkwp$oeD6JmN8& z!KTBGH~6sqMG;RJ%kU6;bCamWGgTO+938fGeIwFDhS&*k?C+e$3y(^^&+b`iu!z+@ zixvVuVoZWL0pIh-fn;(MV@VU4e7H*VwHOW%9NY`nL;WmITqX2AituF3^lL7DSDGZm z)@fIXx(t}BQ9XOt-;Yj!5Q3L^{VX`r@-g1B^ImvfLI2EIn<3<_n~dK8$z;3hAmv$5 zlI_Ci1VR#OHFQ>q*(L{BpLT&*h5KL>wQP~}V~Q}t~O zmtq-Z8ifhC?Kg6_8*{%iiAKak8Fx8p+dW;D?8WMvg!exR{Dz}Q;;tUI?=wU7;vrl1 zwDMIB{@dzb-7vSBl7#ab?+364&O`f);^oI!4Ly5KBM&Vu$6nQe0bR?E@GQ`pNKxZW zqY{QOpD|aqxOSPo(mqQVy!>e7+KHHo8YENi)?^UnWPOw1ac-!8@Z{!8`xP&hjyfF` zto0{$O{-Kh&<{{2GN2fRaF?l0dv-nbO=8C3C%1ge^*PhNyPMLPpx=b=wC@EsD0JJT zgo#pML?Aqt8g)v|di9I^%S9$G%-h8Tg_E}F+^QWVVXwkVdNLN7#Y+v zc#^@uJWw>ikB3amL1L|cQC4BY`va>O@%H8_$l8aK0TyxSR?lusc8X@*%uW81?Jsis zJb=@0ak#wEG=8MYww`bFy?M)4(NHGT$Le2^A?7wFfn^k_7IyoK;`W@msv1VA157(4 zr%+YES(QxnD&PT?r}H?gAWRdnhvGuex^b1MS2_Oub@==7??3;XKlZ;jr;lI%{`vKB{&hJ1gBnan{I_07 zPzgrIx6l?wEnvqXmEeGmUtGT%G|?lNdh-sC>(g08z!7V?W+huCsd&Z_?_j`}7GV2} z1n;d__164n&w}1|2o`1E5gA^EZ4<=pXeC@-4R0yKXgEZr<@Jpk!P$ULMC8Gvs(%sd zI@ypsb#gnj0wXTbT68&TcRs%eUBkG~*K&!HHLC#SnZZaE>+Q3M(=&Q>^vjXVnDeSM z*Jy}>tX>6}r9H8INB?7=OUdLb;Ey@iA;&8trFryKHQGkB=9^Mb;G*XQxU(}PM*@$~ z-s-yXOMXB#|EWtUZ=u0kObyqw8rF^N@fge1CqPa{)}@qrgPG=8KtSmEv{1PRFc|>^ z>VqpAWy2ZUFO9;;P>GfM^o76Y7W)|kRMVX9v^H}mv516A!n{=d*Va!X)5BojloN09 zVA$N6Yy*v@$WHATFOIX>B~;y{xAixoc{8OU4$iZ8841x)x}fx=P(IqXOO9>7QfaMc z@x5_9qBb;OpvHrUeA&5*m@pS7;LL;{_M%;ZZ_2v0eHOY%e=xG&atg$_8lI(3j(AN2)k`J> zW5O@O&D7}9{i|2;PZ))vl$re^{Ojc3fJ)~bd3e7HbIm=}Vz@yut`%_HQkbHOrFIo_ zh+*&q?xUslk@eqIHY6ci@3&q>Ck_cG_SmvjUNG9STK@tlWmElj)vV&2JSaR-TwuxJ zlVn_d-_PVAtP11HpQ|xu?-Eow0d(hSNFm|XzldHRSDc(`zLApg!CIB##1P$finM2u zRhk#d^ zYJ6w`y{!YZUxaPT&jt)SC*Vd9$lD3Cfop8dKU6_;%(dg<2P5b8C=?-lR5F9Hod%ZX z=lcrVtl}wVtBz+ITopNoRR<3@F|d8RHXNkbHL!SXIInU4R0d+8v|0gwGJ(#!j^VzB zNiti-6?@}EZ^0A1k2@G6&U+obO#_1gA(*b}25^D~lYPrS_FUg;>%sat7{rT<#C#bW*9BlS$c**9Ifto?#U=qZHNOT_{YMYP8QH zDEPSW%XH|(mVHb|*yys4HPpObg%9vfzmwoCH>|-R#8#IJ|4uQzz18C6dqe`d&%6iX zbQg(YSjKA{V_khZgmD|<>$K_s{&o0^#Im^+TKDqlq5&zmVCz--MY1|hJ2Hq&O}VxC zF7>vVDMXfEE_D1aSk)6bG1-1?ThyA06$MSF6U|QM0X+20#B$dfhsX8~Fg`t_2i#-{ z4Af2F*^E_v`rg2$_DjnoF(K(wR;Qc1L&MV3`RlW0)f3sX-Nhz&$4x*TL`oGagSXgD zAk-HhJB-dz@Y^`L~&XGs>aC$B=}B0sL5CEN<)W!=VfIdl${BWXyf?a%eD zW5XNU@Fy*Qzt3U#5pGDF8_B>yLdAt5(^x+q`nM6w!fEMJlVer+@0$=ul zY?6uI89l*0^o6g_%&6@lQB_ICd?pt`_KUZC4Hs88NRzi;MFWW_%7EpG4Bzt1_g>DR zE!~KC49dtNkg}faj#X42Ukt)~TN{g}yTN})GcoBkccVFHyuC7i5Z+tYus|I9g{>dS zdiHK+H0a0jK-6+;eT*^`J3;O}2k5Lqkggv`D3E92YG!(zXrb}~p0&FU#>e1{bHt!H z!5`u0m`{$nysBMAH#x&Loxkjtq4%IyGAM;uZCjiH7frdh!5dkfZkoP0I~jTyGmQRO z5b+skX)YvZkWyttG0kvnf$w#!1HqFxxMnk16~vGUsnQ>r>$7&QWnYS6>VJ5h%&rRw zj8<54iuX>F_TT!@k`1I2?W%s5!KP`e7bK4QKpA$ALkgIH&wV(rv5a)*8uC_YK7AtO`qiFC*S zOSSwcNt{w=HU3EV1DOcpkL1vR;SFH&O;tvcHat=LlPfJgE4 z7*y6>)SdWfJR8@+H#{sf95L`;>>BiRMenO2eV6?w98lj}q165&s$M&T#rATcGl^Z3 z@MtHpo9rXQ)BGXGglagd~{rQ)T|`|Iz*;l$n_7i6;{=4K6`rH#>sa zpZQMpDtuK{iMz#Bjdg`=Q>sZN06eKzk!NFl3z+#ux~Um8^VB!~@K@?2JkXc;Z`*xxdA20uO?2(}q z$-Pb5WFW5PPLD4SZr@9o)~N7Qjq@z3^2|eZ!AfmvHYKd_2UN$}HRp$>7|z$6X?ZIr zQ?y>m2#Q?&i`WmDwaH{^_O2-!49#bV%Zp&4T}AbfMuIAF&QT5kSzn~6y0P^t(m)f62N&GJJ?EVeh+6{$f~&^_b{#FISkhIfJYT*unuf<_w~@Bn0p+ zW4*_;p^bIPyP=Csreu+x)pE_ zx~rm&SU9-1t3{$I+ccD>jZ$Q+n!h?WYtpyIj|hQw$FdK~)kg0<=Q|_Yj_fez?MhR_ zieUmxjlXHDa!pt^`;^#kp`jsBU<%^Fteim~C_*BiF6LhK-qk600u8Vj{+4|UmjVJA zpMrPVqFa0PKq2-MXK|vGU5t8;?-`{)-B(lAJtCDniJPe#Sx{dTw0@V<^dDA{`3K?p z(ok!_>WV$R7$`=qPNZ`-1OqLUY}2#MY_Z6_qW%PZwDE;%C}h{KxlGC$8k;9Ge-m6x zMz2@VxsO&3qLn*9wS^LfzNZv6Mz>x?$tU-MHfQfjWx~bTqSnObqs{9udHnHFU<^M_ zvBzBmmnZBTw!`(a+=ZzAaRj^|^{V&xELp_w z_E|2sz+*Q3;-6z!QzXG=j|$?}T^JLTmYdZMEOkXG7gEqJ+W$D?wa=o5a6cf7Z0Egr z6)q9Tkf6htrap}frJ|XB%h4CK>>WA-oFV5lLVHboV|MQ{(WGd95#bO=;)ClaH|&iE zOYX-EWzs0Fcimlk#dU<7JoohXJU#a84-6wCH5lXsw;9C={ROw?#R#@Nl%L-cEPTgy}4cRnSm7@rIh;PLG2=qE0gX7gF-26J^fv zAg5IK%IaN*bjUJd&(mgZd-^U7OqBMk4)eawy&+lt0sOqxSHm8J!@HaaR=}<8HU3$gz0i?T)x$90SurQMg6~S`|mNG4onX> zIAb@WV;yS#Tg0u%uiWmf-hLx`c1b3=1b%<`FDyQMWiLDC8s~P`0g}|@tT?`^a-7A? zvsR>MW?Oq7WoS8Z*AUQh+aF~^m{&9}nYz%TTWl&|yQU#6w89QND(Q8r!6*p1<=zEH z8Gz~sK^8=Bj!f`KgVYHzAO~&cF`(ANO?Vz2nHpf^q&88wPAx`844^zB>hd;IPwRJr zF4+0|cA)U~7nyn`|DppNt&K|bl#J*Ia+ZX&r%@|fFHC`EUR8L_H#x+{Z$Tna7__&V zRe-2mZPI1*cKLA;%G*6?y(V?kzX(LO@r&Hb>D$LqQe$~$J=K$&0o8Po=4}G=a{}T< z%~8%wr3Wb82-HOAMj1`T-E~!2 z1P>T7EDdz-5uV#s+=Ye*(OJ$tZJ6GUDTt`y=_1Zm^J3w@X|QeCqPlpkmH>f z`)6?wuAZ`_W{YTL?=)!m0?Qci=i`<2(sl$VrKo7%u9_y~voLN`Wg%U=xk(KfOlym^ ztDwsOXXD>76`v2RtHpE8$eh|2Shec}ab%*94AOSv*PZcZPu*&@TK_DRo^r#RQDTWw zo+|VK0{Tn3HuW!}GxLF<0rOtseH5oZl^SMmn;o*4+iT}Rkd~grm2lU6%!sFrq4({x z$V*S=Ll7M&)?GCUJ%=LJzcWFpSJ~5mARaC+UO-|j^Ua@-co?5quVOarF*B|ttGU%o zl6&GI5O#CBsdpV|JeJCv`T&(s;BvFpCQ3!EBWG2_>OtOW9}WN20DY3WsYzS~$S?od ztq|f#K+Ek!r_VVu#)6R;Ll{msF5Wt4(1w!+of#R;If|(^ZgHj)py}69N~1hnk1q{1 z&wTx1e*PPhP0!eVX_uF{utCq8XJKVcYw0kdkH8b_RkZiu)9<-k5(hv^_~?2U&NPlv zrnM4on(g9JXrILp5K%3?BIn3U1%i`hZ^4oW4_L1fdskyo?V3D`xbI4Y`Oyo=S?g8& z_l0fs_^cxCC0uT~chkhyHwj(tCOPw4ou9Zb#(t5n?>x&R4h=9F9GD~OUi*tO*aq)i z_K{WSYSmnjL!|aJ{`yt$7NAqkbShy6Cq_oegATClKF3VTF6Ad!$Zdbq^+&5=h#`~4 zFsq+Mz}%qfX$km6$zPPB<_sFl<^NHx!eLN&LY}l$vtPdFGsr8$7)SnLWIl;6$PIXH z5%Zy%p4$C#)P&GlrgvEQ%PFF<439(EsOMm4s?EG`RmgID(<02oDDlNR{%oU^s#h36 zBzQ~3q`}9IHLrM0oE6C(2OIbv|K#?bwu-id{UUnXFTi`gPCGO5j69KewqH85iU+30 zSKSCPH=O&xP?s%VJM~Htj=U(sy*0PiDr&QM73L~Sl%fpLhQh>=HPkoB5txM)k-Th9 zK&Gx}PXpkyquYpi{E3;%F)c?WMN4Isud_xOh0_W65XPCu)nD43tS1fYyX71~BUNb( z8*oJsGTX>-^df+BxT(WL$TZWiqvhXH%v#T#GyHzNX9m_W_5RtC4)dGgu9p$88V@pIkq{B)CTR0O9oRncPX!*x75ZghYaBbS^Aqi zO9n2e>wUV|FW0e7T;uL0z%8zy#v?fjKN^jAiD&zbenhi;gyWN)!doWCq)7o-08>I3 z>iy9uPyF{;wX7Z=5tXBWEl1ZvC|pNxIVyVHMtE3}K>+2LX{3u;i0uqIDj3%1{^Srm zass~R!wx?U|CbHS@L%){Gb0o7!j%;Ju>D53>Kp}m>MiAv!WuJ<#U$HL+@N|D(?&5M zjGhS2fatB`h;$kmYwxM5PkNCvVLFZS8Le0edqZ4A4n5Z{4_fxnc6^>FMzz-r*%UE7 zSO_GwyCqBl5UZ2`#-<+tv!IvBFLEc;sua?HR9nB{i@BmjNK!>nwWWnS)aOW638!{< zET$8HR=+$xj`lzwy^-RG!oYN2{eY;Ec4&k#A==j`AZD0k@fl#?K7y{@DIJV~IpiqR zyAJ12T@IIBH3=F5Nw`2P?KSJH-F2#GFqEx3{;v2MZUjXd!iJu1zseamL-vn=nQjY9 zN#3(hvyBb_yZQv^w(BO7IVbE=Nor(SDkO5t*SDG~jme3w_VR4zb#>DyN#NCHsOuv& zgJI9|R1GY*{U;fybeEF=*OrXY)I%XYZ_Zt3AI<7c}FZ1bnk(E-mcK1 zADZjWjft36 zK8r>g;|l$+(L!ZRJnkVFUeo?L{Jl!Ir#E z>(N{GUI8;)tlD4n#G#O@podP5$(G*GmNO)W?@s@Aaq;XH?3H;IuIwTm#$oKsb$aV( z(G2hkaM<*T9roTTFIq+j5T?nTBZhvy4=;{Hx_kYlS%vy2d~4tF)sD6y9!|P?*)L)@f(IM~ zQjtNI?UzAapm6ft~`cHe_gJm$Jai>X(6>h>Ra zjxKZyHw{(*leHN^iuEe~XiR)DC7B2BLstNc5{ME%nf8V~afR3WGVXRx0RD}bD~|v^ zfa2ST3BBQ!ffN1CJUqoFH!?K*w`L2^Dn_GxXioh5vETju^YPE&?>`^r0{=ez+Mj>_ zvup1px2ow&w0~bdyf8CbR>L^lE}DJqcjCVbEjLPZJnG%K^a{Q{EYQfGde88ja1TU> zH+Rw{HMZ1Br^K#lnGu;QsTAMdGKt1nO8T4oS|PX<`PyHkr2x8nSmt|A$Hd4>i${uDx<@ax{Kg4J^TSpRDDpNtv-?H z-4W@Uo#?%o#Osxsh>eP`lemwU{V)~1&-i!x;0t?c@Pa`K;wT~1+?_;Drgj<(o(+JILbz>hRa3oqwcyp zEhIlw605#9ZUwLANm;v-S@q{gOIOV2)I7{_oNwd14oDl}bzSQH!ZFLJo|iKjeud6N zMAi6QjA6(F>u=;3Uc(+A9fx{+V>FmPOva$MQ$$U`k-G$i@@s1tw%FP$dP!^A|#LE;IuH{H<@*h^weYzXxKH4l& z44>@Ehya<90a5=fw5!lmuzn&YsXELf1k0nMsedmSZi1Kh<)??V9o8y(oFRs_;`n61 z#Dn1vBxkZRopQap|LXWgJf)GqZ3~wy6)50=7?vfSU+3m+-wV6ZbhmHRo>>JS$X!I? z?usPP>sR^b^SJ+T8~*;l3O#@P)}D~&it8GfOPLo4)SWW zV0Y@1<+K(6g*Vs>{LSy6?b12BW>{qC!|HaU|3S^j@a4k$8jIIV@ZWY>f2rT(hvws$ z)*x1aX4>zRO3%r5d*o|lr9H2#_%&m02)J#v#V-h|CHGO=C&myUL2*2u`CwRO?Xz6n z0Mj~M>NkcMij#P_0BieJEV%;Gms>Sk8q2AZICOwf z>azqH2spgM1aJ@VbmB6#=Z~bq==H+vq^R2^G4h7oCg3`KVe~;A0yfa?FEV)`_!@7i zycY#A<7QbREDyJ`-n(qT7&pE-*~6qn#IMvi^No1OxhY{)1}8fb_1op1`=D=O-#ZZ; zzfykPJ!uLB;zU$~{Yw~Gt zpM~QUzpGU7~ESTwsg;HO*g*`;mEWsc!Sq#`ie=j3jWM7>bcgT!XZeIe14(m z$OM|rT(Zrrs`~zBM1$n!fq2W!%E(B4bo=QWp`~xa=jRm%tD8YE5L36k(;Fp=l zfy|3CQGTNsw4t9xk3A;>Ej^ce_8c$&~+}U{r|=+NvH&p)OwVaBCw2UZ?al zPFah4qIcp4DUhwRsk@i<>>lQ<#o-v_SpdcI-V6i1f}7g+B4dzgA4uM(>f7sid>$yG z7(Se9+{32$0rkFBaD(kT>mU_R(0D$2axwD zkO-K$hXxOEIO_NE&)?(U-N)|p-+w>+inBNT=iiUR=bvAf-@gw3{Hb~I0u{l#<}Qpu z0zvbRXm3QZEM@~sY@dhl#ym%M9_x-IdV%yO2iG~Q-7s805UPl~-sv)!Llf-fP1grk z;&yWbID_C*RfJp2LyMC|x|?k_6d{J{+N&Kb2IR(nNWzDcA}gtPo>W0+E+%-n3$AWg zAQvw;$~Z)U_8ZAQG}+Lumd-rh>?G%KM6HKMn}eIdf+ULl3OP;=&MB62II<8i^sAoA zZWW4msH~~SK`yT8r)B{LC|*+gizsHeY@@))g`yq?oDtk;>{{#AqA0kS(w1}@(iw|I z0WpNFjM*Nav-(+NRT2M-pR-@6w8Cp=y{vF=k#w$&baY45ZT7QHqh1;I2#KIBG4r$f zS%CVX1FTuyIze%Xx@+rTe%5YY!U}m!vUXoc_G^A%Hs1k>LxEjC3!|L?WA8b}MrD~< zL2!ooMyL_6N&YKmWWZWYN*usSlIa7BhvaukB?lD1gqCuv)#~V9nowffLTN!3dVdl; zgDtcS>TKvDq>N&6cxCW6NtPwty-s9(>oZz5n+9)Xc`?SmZD>sMFm)bd9@q_N3?cKS zFIpyi$C=Tcujdp8?XF`*%IX0(A^t&f_?Qn-ddHOLTw}e^pIDw}K-6T3Zhq|r#9Z1y z!<5@+L9+PtCb=`rY5ZQlIG!)w?dn9(ZN) zp1j@6UUnS0Uz(A`LcD!15{$@Hv{Z8kI8w@Kls)5A5G(61&3;ApY=GnR*jUivFy>yl z(^~cW#U#5u5S$)lei7m*1{2Q*vpF=c>tD3zxXH7J16@L;01+}I{1Bj1PX|`~suyJ& z?n0}az0#ZM5%G@zOV;0rd_%)MM#-~^x>4c8nTxs(!>0a4pqH0sDh_Raky0SHB|J1i6os5z)$bP+wd=d=>zahVf zhd&k|{UiDwc2=Exvlp~crR%c__LNaV=mJK^fBt^B051Rh{=M7&Q?o0*%ZvZ;GHaMIOWN@5DG-`SWZ(5+0Z94dGe%?b zh6_@yo=e~JWP74Fwxm*-wU0*cdC#b_K2y#eEk`WdMCIo zZ5<1o)zspt`_)UroZ~iy7_SgG)p$J06)L(qe0joLBvy#4fm5)i>;ABv3-vb8dU3f} zK!3&&kzuB;LyexqUhRDc6=THsjlkFz16J$9?H~O;Lw_=e_8akGLEohh2-`?W4+b&K zg{hWsQFG%jxPp|~EaQfYn1s`I<8nmUAU|uL1)#(+iqza$RF?pp^`cBuw~z=}ucGm( z-NL|dvUp*F;6MU^4DM*xt7MXqtHYU;#01uf;~F1j?!NVWCL)%UNS0437lKjJC#a+MdPqrBY&3zDFr~u2cKWW-%HrlT;-20?Q7qQ?hR8t zUwTy(^zK@IH>ixM^R?4FA{k){gFpK2#9fbq#_~Y5%YfASy&${lJOVnfjNBx)f3#o0 zaxioIUnC_oUlNxg&J$*MvAw|}(eL0F-{#+;w7DBIH#ENpITIla9a2sc*U0wmYP{R4 zz~+^e>9MJEKQj}xn6NaO}3hTgE}3i zsrsw+-6jJn8?kvX2y@%3jAgETOH6mR0qXa{_yIuo9+wLoqy?+2a;v$g;bbZ`h#OlO zErvQ`>I7i+Y}qbPd;t{0?Bd9;`BK-^GLBfNFm)8^Qm^5Mg$9+eMu4*Ry@-*9l1ZB; z#~fFp&ts+628dk})rVKf(<2-ubEcCjDAut}T>*XcW(m*OQ87MFAyK*t4Zam|913{-i%=xQCHAv(8X5ih zU?&bAxUcmzfEYVrRbWg_$3?Htg+>V%{vi0QeHIElZLtXY=DmPJlP5y%jF#zhDO4H_ zv6y1mySfS)EhhNJ4G8P4eija~bb(a(^DLgs)Ivt)$k#OI^(wp@?K0jrbK4_1P{2@} z#0`Z4GdwgQ4a`B>>)&qjRMtcC%K1gHOU8K8onolpXF;}DG)ckOJPW<9XAv4AC8JAg z-wTJ#Kpon0c@`lrLPHx`zKc*&uX4mDrsaDt-=z$&-*hQPA(&yuwC0wC67^0Ym|rAJ zd#_{|60W#RBse8Z2*Le(iJjw(+vRda;_V{HvA}Y+0fF^<@n+GQbtQ6>P}#}}1wOD0 zJh09@7^TR+^pO^GTU*Yd5Vs6k5RL0+p%c^p0pZWCgDt2VNlQ?VuJ!y{XEBBV3e8oM zSn8ai+q6YevbxIB?ZH?Loj#w*EQ*t)jKz8)=)TT^i(X~>*L?uAHuZf!YT?D5+7 zV%R4Xo#b)yU6>RCEd@Pab2U?&Gq7gmeB#{bQ~1_w(KD|sw0*bQxjjc$Lxs_0SsavDIgkODPVUYD7q?c1e|VO?mp-#a=jv60U_&{~MHRc44dYFnmLGjMCO z<|{TNcbY8?eZCPpEv09C7Wjn-fAuet|DccKF?bd!GgBoleYTFXP-BPYS9_H&T&Kw~ zfyVMfVOvR>K1cg3ku|}~!Mtm~7(2c-slyNlR@?PyMDGj?g=3Mo>pnsuVZ!D>p$gZ# z&IUVW)MiL&-mWv`x9LM^Vxl*+zX(Ve5Qi_#I!C;1DZstR#XyG36Z%&Us#VgXRqGH>f? zd8+ri2a-+ChGi?o44jQRPEvg~@_ssqvEL`hcZzuD=oFN9{@0H`9!Cm(6R6HUq&<3fn#ltq;gP7E6P)VVp{@ z@Z}@{aHe_{cZf^SRD+3ijKldHX7?ZFW8b8OoTHQePh=o!jq3+jaa8O zA`Oo;gRYtBYq@u^tYU+Q*fxA(C7Lge21EQvz}c??;|6m$I8%MHn<9}yBQwDb6`+0= zq`~+>e&M^$G`WJ(3*ZI3Xjjn>iwuJ@d!p3+40i;qJ|jD;wT{M_hHi!AzZi_sfU?3> zF_F;Mdn+m14$>TRE-b>p|NB@-hLdOx<{Lq$AXB7| z8J}~keF+#>2#gpItIC4cxsVntrR&k&_E1Ac1n}uK>(VB{ghwee1ddX*t?f1RfLL2Z zw2bwV8JhkXlT(Tr&8Zeq!VJOb5wdmqg5oeZBa}MIgiu=QZZ5FSW=BHC_j3nap6p}I z^GyE1s<+J}HHxvP#CDoJQ&gpDyKs0 zNyL;&F@Qk9^~w7QLfSjHp=!0g4AnOZ^VJ*D|AE8QJ^=Lk<^jh#Ztc47%`oRt1^7mb z(C^RP$P_OlZV)4)d2f*uP@!ay?oM#9W3VA9_@ufnCjGiP*5U1_8bqm8O{89C0b{PKQisr zEY^s84ong9c5m`l*W}&p?f=@}N8Y7Y(NP<1ZW8|y6-H=~MQAs)?*;KZjJn9Xod8}7 z2EFo8G(81|(yyZYH2U0B?cDaf7Qm|}>lqh$5=`4?ahMq?QGpERL31BeUwW2FDm7k* zbmneE@c+ul5D1=lyY6+4zSW=R3aAP3)CF62V`OunF2~>*=12Kn z#*!E8opefk`DV`saD6)YrLfPwl`W$g3AJKfD^IKm6&=9c@Lqo zJpoa1fVLh6M6G)|^YD&dIA8O9%@_pU7-DL0=z19UTRd|D#+Zv(Pf0*AcL&6nW+JBe z8RsGP0svd7XZv=+ur5^zhx<&$7nX>3l_XfcS$`uJDMc>fj6>4_)>-IaUikerMtk}yYW6PK_w!vTda$DJ@w54 z3V4xI)h9rAUA_9|%#yn~V)$M`tS3sv4Nu4MuJogCX{!ksCVg&9_a{?@FkEPdO*ncz z+)4Eb(D`AWq?}$Jl|=IBBZ(ApiQ1Q)i5SHiaumvlx2u)5(ESY+$?4 z++@icEWNaXO@B)gQ*&lhbZR>BgI}H}Mrt96K!iwv5IyQ=!8d_UE5-9Hcxf~oc)?~O zLBi`*fPU-@M94M2_Ms(+JJ5n%xXy!D9H*L4O@RxU-=G~#QT{6#^I z1GZyxpy;dp>NNu}Lnxq(J)c$BPXK0PhM^3sqc=lsu8qL_@kQ{ZXtEg9gAmOb?pIM? z0mzK5$Tzz1;MEdl03f{rz_s6q!;f(#YP6LFg@zkFDRUf?1=`-H9D6|7IHri0)T7aD zdI|(%QnC73^ova5I;=TFXC!T6P-H|z8Wi4omGm}zXtTrNn1-nnjU9E6_#Ik(qbjuIE*q=B-WNvvDQTTvECcPx%!!9Vl5jDvV zXmhQCc$T3(OK0PekW`Si0ga)gVRyelSM61A6&`U?O!b6pO6sFL;YS19 zBu}j)13HnOHfflA7edTgO^&LvH+TxrRlgSqH~SVRa?Vj~auTP^*aNB8r;%C|`sou- zeZ+F=9A&KThI_Z3g#O?euIvq8aZV%TJoh{%8bqd#3_qgSG+#%r1s_B85ZoKPhdUG- zTD@=BQu}rdMLJ&HXgCPLy%i=`4pVG2PFmgV-Ka^fl@K=F;Jbh~eNYUTqh1?5QTr@W z1i!7dw7&wJ8;hf!@m>I}$7=58dDWJksiR~k*sQLn+BdHPih zoRDTNypFZ$XN(HH8B-!_PXtm%;x?UFGw*#WW6PaO<9BWdyl8jrvpm!?iyBI^5QPR7i1Ww23UcX7$71N+>gilwnzTbZj{En!?8wQ zl-Zpz{3d6Rzery;*Z>Z>uvva-?F<|O6OmBPb05Vu#Xw$bItu&tKFZW|2_kRH*>&*z z(9R=XBSorvd;n1HmgMm|r^y)<#`l;g8fpN^Y4h-If9ISztCz> zeo&LF{KbeVit20dixZ!{_7`zuB4h%^&a>!YnLU9(h@9iw)h7VvZqf?(_2HaQ2{_)k z{VHKMZN2Ll(*yHAQD-JfU9lGlQi%*j<5~+v=uiL3XXO^ZPSXQKaoQu4JCfykK1jwK zYmV?bT=x+~6BJ6uM8}zZsrQkV+<7m5M1ng@?cs#1K>HP!iOUG6%rjmep0>^sq z>dPsnGYDq7E&SRf3~FP~Cxo}ZNQtRu*&pq>Jm}|L`mjh*QxA@Iyi+B)Yb6?FO~S2+<)S(cAsVf`i%5Sh12E?Pv+ji@86r# z`ZRkbm>~*7ZhKbc$Phq4?N4u~K1V1knFm6-n)l+SKhpxbR@fD?UTMEHVOORnu}_*+ zF1p-tLx({^i0b!p=4(h#h_N{NON{JX^vJ|FMD{v=Q4odw0)v^mQ9lBe3?&FkKvP%$ zq7yQySD{-ddS|{8PlWK{aYgDbHy6K+X|=A6$quC-*la9V>>&wjeIIG>F|jcNV6sDL z6xT_x`YW7TzrAI%Pcja;2e;RE!`(>GVFJ|jt zMuUe;6DRqqf02P#3KH%uqr#R#XQ($B>|ZqQ=j~>S0k>NJ!oIEN8Bl6$$hJ|dS7oE$t`{l+ z#$4LeIvY(i2tx*S&KziLD>*!po}?_Tg7z1oJF@W=tVataP1Gg~KMxZD@v2_srdA{< zh&b1-BeKmm{@m;$suN+sZO?s(f#`ML=9uh0g<86@w>Yz;#&OZ1ds_Fj!6|UEt)vr0?OeZ?t&q!# z0L?Bp36YmWi0I12(M8wpI*=jG37sVRWbQ`&ZNCqDeS=|H-}YcOLy+W#QPWyQmWrhz z_{L3o-)3Znk)ZD|Oc%Y?d^q`9sjQ*s-2KKj3zGkg4fd zfoPrjpWchMDNi&QHqUQhYkR9PTEtO71J;U5j;XZgeh7d+8?sP)#-TA2-$}vF!$#8( z6L1wdkaN17`t5?ph=av$$dqTywzt~Dc8 zlD@Mz^Nysj{VEcdfS+?u;|g+aM58pB@wurLn?QS?8e3p7Ox2H>`zo~pSd%fe&k`BB z5*9W*zvz3@Xo$mPUm>iF&xs)?F=dB(3+F1O`dOSAEj@!!bB-9?@HZoLk;yC1>$po! z1Fn(M+4@f79-69CXqwAO&DUn|oFx!Mbodlmo<$XT;vR!o6dv%s{zVD^P4}%ye)D!M z1@=G2Z$$cldO&M673ybU zNec)yyka?KeXpDQiXo1cioP&99?6m!&Oi7D*N?x|3(EcJ*M;+mJ?;~1& zgglVa@OSN9_*6VTB+_Pex6eXK68pu=>P-+S@NnUk4{EiS>u(erNXmF2?u`@h?{@S1 z^Y{5<_xJDR*IX+_3y{u-~XO|@3;T#|Ni>7{8fMCPSTi`59%Xf!MDS7A8Zp#oCq)Nx#il&DgVh*&U1VBlQIiEf_PW!P8{IncV}~ zY_nFY+@+T?F)>(GplXAEz#J5&YV>jkTIH!VVCTGZH<`Vm4JznW0vR8-eY?^awJ7q_TYHy~BSz(eS*vGd%}QI63j9GnG3~P$CBU!^ z!)efh*m%-(YqP=jxj3||Fit{v!dhCZ@MZ;0LNc%>z_j%$L_=&YSyIm1l}YHDqu6-c zvh#Ws&%kShz$NlQT44KF(Y%Skh z<&(=H=$z8bIf}ASu?3BE6c}9Bzv#eHp1CCbQEF>LB_-3aFCSlXwq6Aq6Mr`Bpg~c% z2)V>vnr0QZ4n)#SV7%c2p%ME?7jP&-7Bs`az1^5C#T!R(+YxWLUOGI&JE2 zq!Q6m!2cdaHq63zhs`*W1U&U=1gFa8^%$ZIysOz@fy{%L37A?^-}c}~0F(GKY%snw zI1Q%IVQDgzspGEZpqdCi`UYdqENZt0rzm`>yj^??-<@E9D9_bfXC9^zco;myxz*et zcQPWA$+SF}KDFoQ#*-suTGX3ReP{|>07la4^LmE4UnEV4MZSi)$dH$O<{%wy>s}+j zeika&Pa2}JhX)ENO8hE}D(tD2%e!@_MP{!_JV+PlkkcBdEDjDX$M#t;8F1RXjFrE9 zOD!WWeDL?l5P)Hj>qaT@kpm3;#>A~pfO|yZ^FO~H25Uypq4N@`P&Czh7fnuzF&_7c zQlNO+HJmx-Kjvw*?}aJJ_I!%h>)ZiKYbh$WK9>!oyLuH=8j+t!Wg=$Sl!$k3f{6{BnlJ~PDo)SZ0UDe$Et1gW*9hW zq0TCrN;mz&qahYL&h36-RL&w^8&Ea)6gx;eT|fz+t|(wTU)-|&u*YgmQ4n-?xZ zAtQ^JVwB&=Kk3zKztB=7e}SE8#1L$eboje=6}ZbJb6G={%JB{K0iy@YZ2I@2PXP=1 ze_y?*T;bSPmlBmy8!?Rzkis}QOB;*hfKziM=48&{dT4)zu`7TWq5M;+ zb*WFI88$B^fbkQP?`~X<+}8~10k78iE;ae_u9-#ZFkjkzozYc_YaP`ZIWap?%I?ob zI7(zNxLjQ!L>YxaDc-&p^|#$3J6wH=Z}kRrdO)L24Y$txBBqzu`05FtK@{r~aQyf8 zpYz|3-M{BxY?lqR?eO>G^w0VC=lNgN%HR4#nkbKQr$!oXj>7ZmeM6==lxf|y?}iiu z#SYDGISMeO3r8M1P5Zl5H5rt(v*+!)wSOZ`LG6`*Fri{HP(O<onX!8b`rThhPdtnVG+wnk=sbwOs7uG%tl_Yi$ zedFSw$la0ZMIE?@`>9O?p`(e+B5$pkm9VXySuj?Km7@qAwXn_W7g6=S>U+Q;!r_hZ zVPdbFpLAI&vrPx1MYu9?B?GJ}Q*r{ZzC-Ah9|p;39ZLZBh8Rec=?3OBsu<7UW?gGU z+H;+iHt5Iymh?oAqV7UVRUkg7Nme zH6kd+DeNL*GM^}Q!OvGQ>0m1J>smmKr^~`sWMSVR6J1%;KVb#9g!PU8!Xoo9cNQ?Y zlUOQgz#ll(%MV-jh*o3DaCHb`LiP)W!o^>B!>gU@T?YrnHj=dC*jdF+i)2P)Gjf+p z8|xe-lpu6W_jP zFe6b^N+`C_NKjGR)0kE8_RbjggR6oPaZobqJ_n=SyKF2VV_G*cRQGmMlw=m10-uVr zyWbk=5J}#cL#|09>5dr= z;?9koVq3>r1$M$pL(e^3Z%Bi|x?#Qy=3AYH>O%X91D!0As$>m6aMyJ%?`1G-=MHiCD zmtTbj;7a04fd1jVml0f~){wAa7D9{itPw9;C5&(w+K!?72X8|WnK5Z%FAO_+U0@qw zPph0{Z-QB&QTOFqBDdrm0_Rclvi*raY!d&@%m(gU^QM`;_GmZZVQVlX2&YQK^03bS!|&f+aebn{+~Xat}= z`)7%ELJJDtI{gxbg>HksfE!;5+dc~pxv5YgNzbnHZm|bl_LN`8y7Ge}F%bhT&;dd8 zG0hBq%m19w&0575W{%OY@RP8Na^uU&WO{Vxx~uG2>R)s_WMUk)_UsqY`$4^ z^)7i9^mB+|CR2O6b|8YIX_<6NIO_GYWX>{cN@zuH6H6%q=xmu(QV+DN{Dk5Q2DuaO zh=;@X^L9b3=BY<}qpWUcxuC2PtL3vI2POMBZY7=cf!ckz%Jr@@58*SD%~#swfM&7CImKea~d{Q{G9V%*tp`0L5v zko^I&Gcd@RCghiW>o|sR-)fSQ1%5K3Gd5gYaCcB`ak3!HBZZShw_h4JNTq0C=BoN& ze##v*!aW)BrT#`#9RJ7K-DNj&BufHb5zhhfk4FF`_EDvh_P>Pw%!B=I#pK+X+mfa$ zm57Y+a5pzI_ank5&#sG|qOl>SV>9sli_`ezPhyOiI%LkY%PdT3G-I*2&&onBm3?oT zLBY(%)D|@eYmG!q7Ho2bCzlPjH6%vu>awSw@WuiukpWXatOO(PXZ}e06nrnqsCCEHEvr6>7@mX7!VK^2qf?(9~mG`BON?=VFSFU@v z<*s^)?TQ2&RbEzCVXxtgmZP-hdr z5KXiGDeh+3*cR0F;y)Ld~CZzGloQzDjjoeFvL5W8y$S0O?e$2COvG7Kqs$D zP87etd+KRS=XQ0ewA3Xo#>HgMG=Uhf=}kaF>U9a3CiGj=J5yyv9_X2X5O{daNDy0y zy`WpMsrQuJw_*H|(J0H?+*?$*DTcPq7C1`734D6mOWQIqBbe6J=^2ZJHQ6rWf})2cBCK9OsJ0NcBfnE|jSs;@2ii^O1T z2tdX2i)`S(SA4kw(?>JE4$hD|AfS*=-zOVIL&55A3EG}^1I)zr-Kw)Sm`^S(ZrWH4DiOy08YSq zo7Yhqt3DN*W@uR#u|}`N`$d3>^4y+)2y5w%7;oiFXVxlhTw1bZ<29mWR*L_TOF>Zb zjl>9svBt!|6L;2VD4SxvD54#pUuqK27Svdrk(P1YYkyH@n2(w7AhVBm4+PkSeqyp* z9e1%Q7>|sl3{Gq@+y7;DR@dXPsYU3YMV7a!ePIkhxtKBTTP)p6HqR(m^he#{)CRR-?Wf z6*hq#?T;-ti6PWD8IrHHF3zT%hZhDnzSf#30HLIkkys92B7^H+G5k8;HKJNIG#nNm z{&JQ$jURv|!tBxQHtQI;)gmWYLCBB{-1H)x0JLxaMEgiPfD6Q5JS8@`#03lU0K?F% zfkUYu%x-JHG{2HuUtAOOjkrdHhJ}sb??45A@f5Tqmyhj2pA`b5A*WJ$=c&&QO&#QZ z!AE@MOsKr)Vlz;J+ECh2VD&RGpqCZ+o+G^WYQD6~-~nH;U?41SRI62x_Ml zbAB-J^Of9vs$n!36uVF=0kmMQc3n*2P*7+BEbRMRPFh2bFmnXVvE0s}%o^`_`VltO zH~tZlW!kt$tSmm3j5$gfL88X5e^G23Xnr@bMm&LXN5-PQPxg@u$&`VEtQCIN#yj&> zRpomotqT#w<0W0NUo;pf$l71Tmz}U=V-CZK26||H<3Zf zXJZuDE}exqwL|gP?)(MDD}C4CqZ(D+D-r_7~|W_!cZMmW~cr>LpNU0BM)h%3~>mq$Lxjx8#{X0hN^{`O-y6XYLk>7&;RG z>;1wq$Tsy8<_@?$1g$&yv(_x&uRcf02NXoUOh|H~)X9`G*V=<6BeH0{x{TTwS{S`H zolC94pz>I4wxX-5{YD}!buTo3`oiBt^Yzb?#BF{G5w~t3v#RV}Q5)YQO;pkw@JaoP z07}vZ_9=53<4>9~=2ASi()E1=4v<&wgp&BPhVX?AKlt!3o?@~q;=#sW1ngt@of`EzwNugr_C+bjGfaMdJl^m z2@SSB4r~1s&HqRgrDLf}psHvEtiDukzJC1_W>N92Alz_{@E~Ojc%zwK`QAES5*)J$ z$Na+H-Esn4L{KiJ^i<}k1Jsjg467n*PigOh{vKM9ODH)5%piQ=cZ?yIT8r`Wg(vl7 z!V;Ra(+I-$+x)$?#Yb;f*P%nak_j%Q7lVRK3fl#Nppj~yg3hnfqraX?iytFM=4gC^ zPK+*4{S>Mlvo`-f!P8#hiUcQB_iO9cPcab_S(YS6wc|AhFN|YaP+~ zMB9Dg?7q6F@_8*@{LYa))+az6p?k%!WxC6LT?Shy(jl7a&vspe0+u>YLb}O3georw$qsT;|LAg5K((ohtVuO#NFHh2<#a=jAjbBYv(#5v7=L1Urrp8 z9Wprpe6TkMr3hU0y11cFi1|Re+^`D3Pbw*ZxB&%q#Yg2sU+HB)c3@s9Dg@BT?gQl) zO>_A!rYcF@*>=%6CTpf2)mn(4L-AGjKZ)Zh3z#MAswHBc#5kVnNQg?vb_SfmZA{^z z-UHdNR z>Mz>2n9c>wH`0+62A`aM}vTOa-N<5w!2LwN$-yo22b^Nflc;EV;wPJ??(AMQowW<0PwK1*D8RS!9 z*WuSe42V+9RN>iEe}o zqPW>D+oT(DWqP2Impo0M zH6BT`ulBPu8xYS>cY>%qu^03J{zmTyrT6{_nTefA@u^G1hnv5KUSvoZYI^Gvj9`MA z%9bNL#Agcs73*mX2B-pC#6p$%8B?6-ZoJDw22VJo@xo#ZGok&`6huom z=G?Gj+F zef7Ke&MY-_yH{4mgb}3x9zS+g!M5>*o+d5cU66k6q`0zoV(V2gz_4@pLaS(n#1-4 z2ns$A;}k76KLaO+VY}-R=O6vAjdf=Z06Wb%_O+=%HCuw45l`TZTx)f$`9+*my-|o@ zneSx(G7>oA@`hmCt}eL7Kv7KIEj~tMN3Wf7kvaR?bt)}|F{8iz6Ct*K7kLIZMo8>L zsZdZnK-O%nYrPHh@Lx62+aH3IxA*ryzu$fx_W!&YWPkZ@|Ie@YfBv)?;E7L%YIkg|!{yjWaus zpN0yVGU-B(RHHczvtj_F6R`HoIaWJ+c!k7F%GtgPw^%nDMTW+?Q-BC5>x^Nf!9l2Ndo?7Q>y6yk-BkY~M@QxXP@2_^Q%!8scnIC7n%k$? zyt?L4!?~+7Lx(*KHN<#4wK*@>t~AAB6Oq09O(%@=<@yI}@9nhvXZHrc{O9c#Z0ha( z*B{Bpf4}uH>vOFujlOsio!m?2y|OjGAm+xLz*XL^%>^Y$JuW58Su!mizRwR1Z`wbs z395| zu-P%U5jQw0OU(QGdhU5Na!sV%ZnU-JV;XlzX8Tu*x`k$EScCx`gSy>~<-ERdS==vp zE%pAr-gjbcW?Ib7Q`KY)ltDFkW|#h5G>DN{{_nmS4Jk6Xu{_}%*D=Oi8NtMl8sBdm zM7SBoXKeczFtlG!{fnp;AQWSx#D(!nl|;LdEjOZK=UMvwHvfJr*t)M#5M0rXAY-f z5}^y!6lnb)q17iSjb{Ra~=ITLAG@P$b75^R}9!OVr1 z9UtbzT_=dG93xJhil>aPeHS4>HKJ&ntjxM7w@gnkWzMYjdcRNxh`f^zS_|7`j}OUx zMON?nuHQw|2UV62Z=9*QJNeS252SvG==FVM);I03(&p;~z?|vU$rK%@cIL2Xzn33^ z4%w@#t0}9DEQ=1B%RujY0-2!XllOjc%3`cX6rsUp7uFsLNR`hso8)jlvUiU<%tv_* z#n?kXs9at5x(+vUV)#wI5$-u!rmLP@TMw{)ifqF$UBuZH>+E5lDtMKowaq*LvscqA zOn6^+qlJY8`c<3=T@3BJsHwD><1Mple20;(9Et_;S)Dl>!z;t!!*W~GEZ{LXq70I* zGz9hR2k9*s63h_&jb1JbBTm((u`|ge2kv@ZG+y+^ zLP$4Z&Nm7ji}2DYAuYB#N+GG9 z-FCrMxec0{69f7BDJ&X9D6PGfzwGF>+$MIjLcjh+22{!f(MM7@YI39%pYd(dBNW>9 zUHlS-D>!wYg1mwwZ}c_x9BY{R7vTxIdI*O`i(~|w-@~3U?Ag<$%^4J`Pj~c5LN!t9 z_}ax6nvo&}MISNEH+5jb7s-C{r!zZ;4I!Z5&_@O{jN(shGH_l-cE(I19a+$UM6q36 zO%4Qh9rxu4Ml>v9Ar0wu$?WQI=JIg?&t1--sfWgD9v0<!HO zG$$?*ePIUuFM4G-r2zTG%c1eoaPvBFgZ@j4uf~mRWY*iZpqeWV*OYM{v62h`_o1MIUUfsj0oo-1cT_WXzo=rfjI5 z&0(^h`!o@AwB6Wk_>~-}AkZFC-_s}+jL2r@@$6lVOSfePSZP$ZwLL6MkD0~rZZSNS zvR>gpCg3d9F6IDugnmI_6OYSNBz5pG-o(0>1WnF$20tKqnikf6qZl_T@mRjit;VWh zau|6~=*IO^kOt0P#u%>Lu<@*w0Apb}*tH587s6SL^Uz|jNTlwHv~Zvlef6$m>n)>1 zXkRRUlOcoXGe}}x|52X+6zPmv+otqFsiPcHfho^ ze-TJo`GL+h_YvGqal|@M{ifAW|03U(od;NKq7()gBXU|!!^)^J>Zf28QTFaPoknQ} znA?uyqGWaH29Q}4jiQTzC~X$xDNwb%{KA6bI~!^l6h4C^+h63zxH@(K>iN>3cu$2L zWB)TwuAic`d+^J|W_LG|z9Hn8-^sMkK59?n6>pGx3?lrOk`%Sa%n;@Tq3rcfQ7_uM zCTGs-qA?njX8fQmUVpa!MGiIVeMzB+`ANbdiN2t};(kD7+NanlTtWbLnTNq7N(zNi zj+lE6+oFDo@-^CvZM%-Q0pawEZf-I%7?=JS&8@*Fr+V6m#GjDr6DfJIJ2O}&)>%hk zSI4maMfk)R#-XZv@nu^kTXkNJ}Jes&x}DwHI1!N{EbWj~sE;0^jqK*3H95 zKC&2D)$j!q;rXPkQypJwj|6gBo{83T&0W()h5KdX2nj#Cg!UV8ponBfOLo2yZl<2X z5g8Cp+(%7X2R%Y`&dK80c8hc@@tkkd1N+rgQ=?~JHo2n;Fa{~X6(T1|eV@^wPNcdo zI@@|(G;mdpGWSGHtpAL-X2PSrMz-5N#rZW_hHu>BL-I<-2jj`%is~mJLV|u^W(kh; zc%0d2a}St1sq(^%akR89>tFQL?br8r_^d7kgh5e?+AvREb%zc=3Q`V0+7`h%@|sQZ zcBCnNyZkZi<~O=q*kIS+|0%ZUZQEa^%ZHa^NxsyI-|~rP{KG^>XCqz~e44oY8IU1? z(8V+sqkfl+dW9dRM7MuUEP+607*&ev`YBgG=*a|Hj+&gx%vjzU>YW2tSlt1-dW1|v z$X^I8`!|&%6*3kRW={KyWOPW@k?qV)dzT0aRCc3cu8+OeQ^Ej&UoqxGL2TQxm)Rjq z*I$~~-<`R92L6e0h*wYp;8Z&JRGIBB`Vr3t1QydGUZ#6Y29l8_`fIQTC$D-b~!b z-8G*GP9p-a#t26oF)_P-7r94tE=}EgJPJ>)koTq4l6vbndzcFk z$G&}+M_f1#7@g~u1=u}eJSo!*d9Hp6RRG>V265WG2uC{JAMB*5JAgy=Q*0D?gPEpI zfO!WovBkWmVzY97JU<_0-u};D7lI2Mes&G9K;7Y%y7-1^95Vs4yp4#RBDb~5G zPe4d)@*qa$b62BkYBBqjY#RUK9MS569Oxcao@t5rj9GCGgyx>Lt1HH89|@(8zRFgjz4ZE9s1*=7_G`;c0@pkEH-KnpUvIO2{QEJSiArnAb~*AbJ0 zU3B}I`5^!1nC%yxW4R+2>MK7IAO!m(55&nEC1;A~&rX@EZWD!Ej90@6^kag%B08<{oia z_GL2ZJjz`Zebn;=u6T28rV6#^WWc$KHFlmtKqpE`#liD@3(7k{jD7{L-o**eQ!og4 zi}BMZ`od$apOW8zvcfsYyAVLjngjHvV_0{)Z`?_kP^Zm3zeuj@R?~o2Oh9wmccHJM z1f{r-!Y{jy>kYDM3}~fO^;0yc-5dH8vo7D8ae&>*mJ(&xcMXP!)sLqfVrP84>T{$^ zj}%AXI`?!^Z!l!!ppt+`n`3Iy!0(;kFLyCsbksL@mIds99`$KtPCy!PR;^9`5^*6% zPgt9^uCpLCG;JHMK?*IAVQ$7xqy)?hx|Npkgx#0XS!XQxg|;cWkVa_H3@5LdJvXz> zcB1$Hy>c+@G(o+_&grW2U8Ei&RNW`#jdMh=z^6JGKV%8jtlf1ix8kHRxwGYTkTn&Q zjpyJn^|~Pa;ZR~fF5c85$VTC5tE%81@fvG$Umh1MKfMLL+L;TzBFPe z>t;Mnje_T`j^2{@tKxybYxaw0GVa!=c$glmIa>cBl`!`U4ia-3rMh&WA;_5;So;}~ zK+9S1`*#Zq0y}^}WFs-i>-R3h+C9-H5`0c$e0$i_m^tF2l9si9x_;auZpP8~qeVZ@}+OGL>mrap~Y zbaMW?l4gDpj+%ap*!u|KqrL-vM6*D+gn@i8$$5Fg9089&UW-JA|5@JwzOy0%>1!cv zv2;h#%=9NYVjb&PGpI=+EW~@`iLny zrSGpLJ2~cz|IVCYZ7Af1c3q?#<|*pBOnpSrnpxeU1{f~TM=2K&CO^#rn3#%`o4Ub2 zTp^$AG5%t8q3&9RY?*@Bk!SOcBI!f?rYowW6tM*w*hZu+-g@jkFr9|S>y;3=;^eisB=aU%#p9#KU$A7+TWyX@s!w1{ z{24(q%t5j3+lYBr-AS0WSQhRr;nd|bNRyrNxz?C_%KP!1a@l@O{&Kp3nJJmwCO%!8 zWAeQ)Jy(ZjP1s}U0;|4;)qCV_(N=tS?I(aJ74;yql4Tr7t`9NDAO&sr%X@tPA;X&8 zDP>gXp%Q?Wu$JoC;dfYYXw||>ZW4K2Mx8!6esd(OXKx~(qrB*qkd+K_g0#m`fLo0; zvv%fCz%ysi2HsS|YDMrv;NuU!Pe#T?7is*U;R52_wLLy}G}TUQw1!U>J73d(u-oME zz2=gnQR08Vix}KHI(JCh-c^J_xNGCCr?8p0xd5i?er3!=QfSyb+7Vo}-7i`sur?%` zK~50I5q;oh&>)J|{wX{{G7n*K&|}&f&sDZ(f^qG#K!wCC9GPtOk3dVh8zA{Cx&M#$ z7t#Moe6AEkvv(dUc4K;?voFrhEIltymKt8b@%HjOqn)51)2nx(kq#DfhZwOk-sBl zDXQCbk-xjx_@#_iEQ(enhl~?vl3J^4p+2;@Pg;XnU3~Otvk9UyVB_9$rtZdki_;tD zXfeK3*MoP}Ye689H88(rRJen?x++KG(Iz~_5Md&w6qQ*Sw+CR34otne@&(Nn#q+$2 z5A_YbjTs>s+7QTM&Ji|meo}Z9ESK6U3)rHw%odMY%sIl)!-RM9Lulc|^$n|q=Kk5} z!$nrYKPWKun)WAp!tp5~uHxpkzF~dPkk;+qd?OW3#sINK5OR9vVBDP`pqe8~SAsgL zu8%(sMpr$RSAcT-gkDOJybCp*d(A9dq~e}6=qHG;Ht?G80hJQ(Od#SRL0H<>jc$2Z ziCb;4B7hXpp7B0|Q~@B`y?a9sH4ZP%5pv82pEAvDG2uf6SF1?DHja{ORdSik18+cd z5*jF7)F$n_q#5Ru#K$OS`kUv7{S4}Q{9`6-&LD9*Z^6#|mOl9&6VW@Qsm@D1uT!zevDja9|T@pGdRn8Zg3jaB&Tx#Lf|89C_G@yEKztbejGtMs7h=F_Kb~a94<5pI^lirtTlX4-1eD@;hmuATJQ>t`dy-&NR>6UT1M%DJiyI}#ZF}X6gh(|bp#OB<-p@3 zzL)0o;#AiAg_Fp54PkePFK&W^zdFU|SJ_zK0btonW}`6`N%Vg5MnE+ZCJqpx{wY?K zBk-PkdG;==On|04n&d$Lr(G945&d%1&UH`AISr?LW`qRrtzH)vm80xhuD<9dT&mtd z#_}3dnCo}Z_>2cGT5)nIl`A)2j3q6y-u3?BI>hO;kPBzH@HQniMB32at?vLq7x2wJ z%Ye0WcA1MqIxOe|NQ!tau$nf#JmYBiXwe z{{$siPsn5$1=sEuc%QMcMtCMvy%V;8JfLkJN*35gOi8LC@rupEbpJsY3P*N&SWc+H z^_PYcBFaj+#~T5P!Y%?MOiXvzwK%30i7usYEBWxH!9TJH>DdRTYS2NuF4&KnHv9%B z?mjL$NP^ZrL{E~Y{wXLCI?8LR9)C0&h{y1t}!QCvEy{-+|CbGxef{N zuh$kz{4;$V34c_i*5$;iir1^?+s`avzNE!@V-c~URJ?KEw1$pA?&|9EVYfhGaefys zh|v$4M{JDp8(W+~#VgqW&#ieoa$n|Vt|w=RhPl1fA`^~nxz@^56Y3*fC@eQMHlk|# zjZpGU)YfR9p0M5kk_MF(KZ;k6OQoOj%00j&B)7ex^E8hLT*kTaLTcXyDH_Cw481sQ z-{UBuR*OinT%2#jLJ1`~Y=#W{u4{WrtT-Kx$3n70O{g1c#*ODDFXa~VkiEk<;t;WX zt+mei#DZYFo{Y6#7pQkU@YeiVxg0}+56<1_f81)?rznshe;cRkY4ytvk_8Pf$Suu) zPA}AAnfXx17gSl;vIgC%vap)vc+}#?l%dnNzv#&tUImIGzG_%EELH@%bf!wzcYxyi z1Zmszyz-@q@pRh}&v&8Z)a+=66Nzs6|867DFbDBWB>+{aRO)Vv&1(O14qx7s4%2~2 zi9}N!*v|mv*5zi7v%}&uaE!udjvbN2_ueAb+PBfaZat0A0TdoTVGHk&E5k{cGQMbG zLF63FfZYGld`OI`5%~4QLY` zr*>Ul#vKa&%nwI9M}RLsi#IjaRgL;-ZW|C{4uChwX{1?Kz5?w885wx_E>Bg1JY|RN zmv00CM2Oo(M3D()ZDg1!Fv*(VnOp1CXid7k`cH7(eq@gb{+F&pIDoZda^x7 z7{kb=vfNFWs>x&syyP&ckz}fD1Rw^ili@iGRNDPQOR|%~$jhcCQIhKffN}sHyd>JE zs6KJ&24`>!pdaWaJI{Vqh;dT9}odk3DK zaojYxl1l-<)%q!H?4SdD>n38-vT|o7E0+LpG_Ri`f592h37dCe@J>=_VGJsusA!)8 zh?*I#OUW8lxCYri1DO@K^*1sl>Wq)(&QH$pP0xI*igV>0Z+i+VgW#x}G3XX9CXg9x z@FG?)3~blMQ*<=6SmrcxvL;{ixlY`sm|4_M30(%dMpEt!&>v}XXZJo-jddl=zec|) zHvJ1FHaid`bBLKQCT$(-Vka;6-sYFj9V;VDC1$xBX)FP6phsx0`N=gF1Pj#!Gk$d8 zy9nq|DlB3#mt|&KW$6V(U~pweHXQ3Xg=6EVF5dy>+izr8NdkVnk3_)NqK_f=Jgv{kW z==Tet*}DwVCt}J9neG5z5dMLo^?u111)Zy$fZUCyWP(Sf5He@gTm6gVqwEh<;@K}T z#$&Xp(~!YWb;XBE%1H_7S#bW^b@`EL1Rx+D)@%{hls~frED`ORrA8%aF%SJxeRAJ)TV$ZQj%Zm&ZWO+p zees#;4oHyquR88(1!P!aIyIgHW;3ZwzR1{)e^H&myGl+-cE-j{+&w9-K?X|v2aQ*K zPfPb{WQh1uWoahgFG{tHB2DwY|3x$#&;Tlw^)3i|dPkoojj^++pJED4KB~2t6W~7c z2o)oMNN1_tb?K@d>A2*o`9&|e@9~OKZ-(NocIbXOei?5C_m~r4w7Sv&@0z8J60Ut0 z)5{;)c`&~`#i%m{iqU-Zm-@u@FN%2v(Pv4o#@vLs+rtZJS zxQVgB4!;~Ofm`Shcs{6Cb;al6fO?-(}dIx+(*k!>YcZ>zZ9&>}8cm+>xfN{7k8(Jr z(9#sLIeU>c;aIz_>&e#a=ruT~kG6ejDYB@)k=Ly0igcn1=a!PY5judKiMyUb;IB4% z8}p#rgLuTmJrx=_hNlw(p-5Nzsv`NSQNNu z=!-?4 z!J&ZV<1;MWTdsiRNihJIt-VaO7ES31HGA#=Ga+qcg_hZ>8O&S1%Zm-X5^qhUiFJg= z_s)P`1n0U>!qDNx7*GHo^c)3~U`XV~bJpZ;(X9;EX8T2?mP}RM#vq&I;H)#uq`R#H zI3J*7pc<||Y?!V@d zvgg*1Uc6=;uA97>>6^K9r#ger#H={*@jv%2gkJks%JMLtdahrJ&&<#(Ly6|GU0tJb*gQ}aY|#|z_Q!qQ?9s1^kL2bK zmcnf#yKFNuPl+XVAi6n?-(%7EL@*y*G@I4JaDy^=1&~5WO~})(F5bK14ivjIVi}F8 zWF!)f|6yHCV0rQJ#oeKlOl?o2;CN=>8A5y=F=-@rwA>rrb1BpHoRsB@0fy)l)xkbS z<}_dJ-KdEs)x`~6?xSvfXec(1GC;c8_5=J24IBzqG5#;?`INIsm=)NNkaF)Dmx5iP z#VuV=WYChbm-UZ;FYfF1DfE$skSR=7t!A`#>?z4^uo7xs5J9C@7<=Y0Gm`JJhIJV4 zZ0EF_>(v#IAo=dpVQK>sfl}HyASP<97R3Q#!Az(S4UI@%r?6q$#SVtzf%ksBF3K2= zB$Qc`!2{i3yOMX(Cb6b{3MDI|ticl#z2&VE2+hw^Myv1JoWT|Sp9`8kYP7q09vEYX!RX0P@+!Jbh}us`5uChq#eFeUt35_fvKdUZ3x z3?0*0kLk8Ji@Z5d=~48+7VR&BO39kJ+^#B%?CcZaR14NI-?w*woHmAlwknG(zvxP? z5ObQi*!6jx4tEB6oHZn7b*cHJzrMVyzV`t8G&XwmoRBT|L`w62poN;LvLs z|2l4}SbGj9Q;j&Jw%^Du)fLGS=MI2?DnMNT=03aa`llp`0<1bl$uVC?q6(Dvht>sT>f>Gfm|1f=fI>O_4*gN({?vjEh}QWZ_W02VG9C4YArW;{tq~F0~lf= z&zW=77Z`F75Tw0_tl3@N{vvZh(v?N;*=?NNQAHu6-9c zw@VcXoBgo3TX$0#NOEHV%E{9GcY(*Xz5{|0 zi!iKX@{2Txz60d$hDe(cFZ@T785j?42mwAhwbX(Sfkb%tUbL?u=nY~-WcR1RejW_k#|!@ z!Ds%F)A*3+Cdc&9$V}?!jn_>;yRlCajKlWO1sKFy;v(E+E8EZjly+T^ks%x}y^>+{ z$Xtz-#u=e{w8;IThj3kzamlkOMl#Db!B3UmVCF)guI>IbdiZS!sb%~d8h=*VO0ItzD zil(R=kz(p|gbyT{ifj8?-JDAeNb|ukZ~Ld99nfrYBAY1XKg~hMQ9{;}P}jdGT@7uu zRZrj4MueXh+!PFeVEGhln>T-;Sj;a%2IA!oV*;-BSP=TpixQD1^4v$JBXezISEx9G zdbH8oM%5F0s7toE;29#10-?|(HBdf)5T8srBzmd0YBeC&MJP3$JE!v8YJ65?bwPD} ztJ-JQf#D}eu*APbO+w|xa}b+7M(B8V?Kg7s@DGkTO1cUbmvA8%o5`wD;rc1M+LCy| zVIroC%2XRslxK?4t9=ThE-OpYfZ^|w48_F=T@J2uspE^Gr&=~AgkQ3M>%x%IZo8d7 z5BT1yOQmQe|2y$)afen%V;zmb4=nL%B_E?NTE#Y)MA*8z~ zcKdhXjFRbsn^cm*nszjQ3C+r6L7_9GiOHIok|Gvvy^1{NQP~DaVW%?6pRMvKIZ+@FNkgN_7KYDEoqjd_mAn3~zAtTmoW@IwuK|Pz*Qz)Gy zj^Euh_X>h1$%sn?D_)LddKSig7+ZQ3n+ySyY9S%KA zlpHQ#?NeyNQbF4!>l{T+0-XxBiT77O#d=Dgws|jxg>OC4*X9mDt+xBvMP%-+2}1R| z2;4Ht4}3T)1ELBw2{+9lw*lIxAP^7&X#0$395R9Uq{Ex>zQ)4*#Zye!Qk+f1)cZuT z-qHP#4)sVrXqibHbXV$=SjTdOX)G3@?24Ih`z~}JI?EYDJ!q)dWE|rodIiOGz3bGw zeA#YjJ=t~97zA{X-dyGp)W1kXU^J&dniGJ3AphYb zqaT16Q9ng96`qyE`fGtL7czlZugHM02Z6WFU(2&5REfcx%KOI&Bmm z*BF~7I0KL5WK!HP01)+5cy1sRy(Z-@PfGWJso$VX^&cF&ts4ospg7t^q}!>=GYrbS z*xkwaAM=yj)#Wb%tx>Q}H`iaGG;0vUJrHy1cj0@T5m2y`*>%K@cV=ywkg4%g?_F03 zp9n&Zb=xDNQ#6Tx+=7lZy7gNtV1G2r_t)k6c0B*Syb&+_^Y+K?qx<42JUv2#Tk0tWy*YWM&f6o^$c09cOI-IU=u7^MW zTz<32Xx+MR(@#4+>q{eN(H13If9+Wf+6^sw3@x~mU z!y{0>ehR8!hHPTICXzEZ4PJ{%VrpxvB7(eY%dx05xh?nyCLlEl+I48l}&Z{>76GG7s@j^?71An_Nyt71XO}2$b z!gex!HcWH|4D~s(S=oE*@6A($U-TuPNWy3bm9>&z6wZ^zuHqsXmFzbzKm5*01E(PBjy~LvwA>Sg+U1Bf3dot?tB)L>Syo5 zgEF%i&U*oC*XzP|m$oEr{HagED^NjlY>VsKUpxhHogUw+xT0hZoNuf(clUl>bQoRM zgn)yA)5D4mIyW+!+H=-7;vM6}-~&yqWT1tywUMJzB(+lj%m6SwK*uu<{>kQf!;QQdNM;K}Si~M)rDGP0p=wlNfBAe&01YN9a0gjN= z_H^^pBUY=&MbSLl2e<9_k_|w6kGeuoj$}H&NEZq5n-eYC4>Y;`MXE#%c!~1r5hwq~ zXQU2=Ikg_R$byPQgMZMU<}69CQ1;zV8s{Qd`z}8**FBTgtc#WOxfAaYT0XG|!$^tw zU;Qq8#gI_+xzl}#Z>K1X@`+sl$E%;h>ed(!bmw`OWO{NtH``vSR-b?;SIUf(Uv&wG zzHoka*mu}jeFaJw%T-2MEz3l;znrDt!X4O&dsMwH&!iq_5~h`ZL(;>RwtEcxZhN7O zO2`xqGJv9IU4W7L-rk7<63wCBFB%;Ctj*fHA>MI*)qIZ>r{$n{7Y>E+W^}=vBMdD4 z0?Mz{U6f$$m)3sbGRXOSWkR0-80oKZ4XjOD#f-vEaETqYtjs~8AVPHJ*??Hf`l|j$ zI?KGt?AxWB=NFFf#HL%#_V7?r<%n4f@zF-g>`e%Abks&n?<+*9hsE1dlgD_O8JON5_zEQ6C$5wOw6B zk)AtpLi(6&>NCi~Xe%-+%vgJ(TZbq@{KRFeb_!u~#AJ#+A;W&NnUO`YD_-J?d*7 zslE&Cqmq=aQ!~Hazmjd$o^kanI$)Xtu_N|4$U$1=Bu)*E69-X~bMuQ(FEj~Y&v+%w zn%cXX-4w_ry5FfPAe(T_J&cNY0GFd(7bDp1e;~@BT#@o{vp8W^;i}a*3{YMLfp{oL zOz#BS6y1_>YlbAW`4ri5C^>qwi-+RpSk+G@Xvq5QDex4nS#e;B3Z8nXQy-Z`9{$8f zy}A;AmWl3yWMwgc4n^M(L9Ua$*V@%}jsRSrtg}2t3M9NxCF8E52iKVp9Uq!${4gf= z>dNY3hMwg+q5ib*f`G0R!J6e%A52Iy#vzC+uN$S!K4>7+Rr*@geRj;<0FyAGSk-HX z)>#P$&ctw&10Ah-U~8hq%CsG-y0^)~>~{e{jJ+oolmYEERI?f|k| z?rMFPcO*tV&|ylLI?EhB?hElTIn^hCA1nVknDf;5I)>C%>0z05S0Sai-NqEvso(VR<+BTxnKQOecz60<97~$FPGiyO5>Za6=a=j>;>R-g* z29wOU-O?|?veOiPseTtT7+9;AAW1z*;`?29;~`+f0I%mvi!40t%>R}*5cah31y1Jy zEC5zr;srz+{hC?%P*Fe%e}mo;Z5W82~7M;&K*rqn8m!gDS+cA)St=%L%bSt%RdW-+s^u@mntZU-Hc zDv0*F1F4Zdpi0nrR)oHJpT9^8Ge^`wqb>Ili)^d$4*t%&;3Z(@d?>yoysv&;p8lkG z2ldOY3*$PM{mUqd_u7G9)`cgbeQ6Hj)b|Q%jXr~YF}ltzznH;;GXuQ2?bp;~@d}S) ztjYw7I%0mP?}JA%MzStoARc-8)-15#RrQzt0MVu+w-oFAKA7fbzU~2DR(I*b){|+! zOv9e6nIR-3h?7f3=6u%q%O@LPrUEF%v$`_P*nVVcIG$KrBT;d%4Z@_{;#wlk{eZiB zp29$v@&7S7rXG@=Ok>5C#Sn?s1=LgY0Zi>Nvvx8vo7m)tlR{ex{88sG>89z@4Xw*L zvZ9>k_oiV?Hr>Wubb1r92?tgd^c1lORfs9DCLS$%l1a-JLEf^?G&@`5N?j!znHyL6 zF0xWi%LsSy0(XGgMEeB6U3V#tfAv#x0XcrFZbTVDB5`$NKi`cTsGkxQr#LIFq{=cu z)B(>7Ak%wVe;VWBOiw{RB!-@+yc8pRVW<~flP#;=Q#AY7b#pdLeZ(sb=}8ZW@2Z-u zy^ipwI&b) zCOjhWv7M?RC9ye~x5f5vN)%PRZM){9Hw98vZet9@q12KPp{ zNFxS$>e6P-ror>#3JD7{-`+)1_Hoe3&yM-4&4Tt&hFG;-WIm$Q19=O|sz8CU>OZzo zO7K@EQmQX50Va+9;m3|<4E9j(x}R__G{09(Zyu7K&+NL~018@Ww4WJK*8U1dJTUltuiqJ=PdaAWr>_K(G`8gl|?w+&6L!4W23$(hEPV-$fCQ=s`N^DGx(E zGW$pCTRP5QpnVE)7Y2mAyXIqyG>EUrVPqZk?4JWB5e1zh1fACzK+%j1*NbFKNAp?d z-q^q4wi!N}{en;s6GCVrF1Q`t{-TFHr^w6Pa8HT!3`T}bNNB~Ex_$~<%gjD;-}}@! zhkzH(5hzQW zbf63DyShFyzeQt>x%|{e5Bc-;27Dlf_Sx#w$km25D|OanWNLz_x4?G%{unj2`$cX@ zI0q))!qPD4^JtWk$qI`zbz@IMaAOm()@Zfn9E!;;4ZeTZ<(5}c5<5~_<+{|2`C9}s z6j}YSt5htJ0WZhXL~i|RtlD~A7;A7@B~D$ZQ9>_jD$&4Jg&L3pj?z{ z{|_A_kpVRaj(9q&viHtp`7Sm({NKMfyd2S+OW^07)|Ko1hYn2r6y5n?Fd!4Z2ro@p zk(rw&i#hJ~Q=onq?KKtcc)5kp}Dir=Ao6w3w3|TovXzWd7psD3K3nDc|6QWYD3%79~ z_Yqew@rBkvL2W879wSV@eG0o2cKPJ;gOOQN_@jC8T8I9leite)p44=t>of{BFWqTW zU_ME=I=+Bxgd}!{lX)OCBh*7{GkMV6R{x@d2C5`z&7@|5qDyS|a$6u5ucOq-glsUI z4$|zGPqi`p1CApLs=ErATjUaqRC)I9_q2s-iI*;#0VB)ljA&UI>#im~hS9d`!iY=W ztwSTux*H9t%!E~?I_k+sn|os+sD|SAw@|-b9PlZKtQKF2I%4XhNjylPho$Et!#Oox zRo?`cz20?a^F|1-Gi=)l0PB8ZrXwMVn-zR${BG7o`oP0Vc|Szhx;H__q?hI+;kbGV ze}ucD5y*zEcdnUnni6WgQ0$iKf$5si>z}2N?N8$c${! zGlS%3_K(5_C~t}^U0wT&G7m@EgYq|#As!#BjTB6}E$yV7*z@2bh_a@mW$$_|R8^NH zu{efM`!0`*(c^s9mnA( zR+J`N_)@-(UOmCH=0b1=?MuuLBybrFtEBo}w0w~JO_R%)ru$JvKxTP2;3d~L>`%_-Ik(;*f+L72iQPGkEnsB6LicVc|+@R|?o3|O6IQV1n< z{S+6pKbt{kc^4J1L`ZrF-tScg__5IGv=LT44V=CE(=n;$|5w+IWMS$2Kq*xzyMs`#JGwFNWZcFP< zbASz?DFxpLh_>rulPP8x7%q;rkRTCq*MS?9x9w9@h#4RUSj*~4bHAfF7Foc;pE|)` zyu(oGf$z)+GC!w&7q^(NqW-pFxGC|{aE>TQoo4_6 z(lqb;mgixZ8P;te90mfSH~&~^gWe@FgS4vsMH!nC+p8@ueFsFkT&ni`oJPVs>H>cW zm6x&B_mQc_w4w(-QTat2k)KeY7RAak&b|I4}1LGHq{j$%h)g(?9{JyVZ~*B!(N`s z!l%BE_yg;bpaw0zl(gMV!p;_b4_U8W7xtyv6On4JoB_q(T_j_6Ot1C3j6jAyN5d!I z$W#M7@}ovRx?ejN53>Z&#+Zuj@w|(M32wb##W`C(UH>A}-=KAbKj{bD!_`g`hzpV7 zJ^e32pa%$>#Wi)KC}9^KSfmka)yijJjhkBWtUoAv8xN)Rh`)HmZquG>f6-k@lEh)T z?5G0}fE7yyq;g)Z?`f7&Fcjda{yNU>EwaxA7 z_9>=Zg?6(axy5(&)5v&gSVERBybkbeX>}%)6TVjcF1`s1b5g9y>%hF41Ibq%^S&ne zApU?lo{dEc)(lOz`60(_reO~CyU^O39jdz>eE?E%Kxe#V5kL6CKB7 zo%`@CXmx$9`b>W^Tg+v@^Z~xN&NKrrZofOyj{02?PNY3vX)+If6QSX#Oz@rCnMjDo z{IyDS;`Ga@J2dn^Gb~>iWy2 z6a~^mwm5G47rVgvDOYNR531>Tm(Y1)te_Bfuhq&S2J<>tL-oQ`j|-`tn~y}keW_x;zI19JJR2<{Oeb^HyY$UQ)t2+iTqinFcE zsGlO=1+;M`$y2Zqv`HwC?ye4aqrHkN7Ho7DRR`t8kK69A>n62LTp+IqtgtC3gK{=E>o`r32 z)l4L!@xD+i=vvh8Li=Q>X%q(jJSfR9biO-GIdF1oO>A7xS?HmI!ZM9whjY1(%jERR5Dx$yr@5!{GPR%Uz@zk2uTBe1N($(Sb= zTJ0~AG)t0SAfd^5S=d7T9BH%8l*#o|5Un7?BL#G(-S~e$@m1rKyORSHf7oz?3^75s z(_stiyJjQES4RQ_4pQ;7zsS#5^Ia95gIEZ;_!VeDnuX_f=1vBq zA>e8ZYMoBRq&E|d{k7Yv&SBUj8WHZUMFOyU(doGaev(2t()elZFXGOCqQO+{i#3QV zbmv5aV#js6&8MP>H4$T@*9oW3Bw+ec%Zu0Tp?R){$n;z7RR1F67maqqle4-YKX5ge zSJXwbsP`^>Kx^4k<{Krxd>Em{TP8?e9e44P#A}YX6B(#va*`C~gfoVDw!cU~Lhalc zCpXSR7bnrj2N#Qc{ktfrogM()U=1z;UfYfYS^%j{9qSm|6XzIsG9HZgkM!o^=cSiV z`_=v;*=<^b=pnfqzsX)XWqz%HZBR(ZQAaHqnOnrr5R|9(T`>FPrn*scPxE`D@l|ER z5h=y$Ta6gz1MgQSDZ9?$Ci|E7ioOJJ^}5Im)SLl%*Hg$^y_bG29!-D4W~}_yNi67F zMx&~K)7cYwQE}u_0C?!mUogkj(~NH8f<6i_3_EZR7ck%~^;nB=X=T}_N=19uyIfUB zET=+%rTXb}-cQ#NNK4x@`-S5hoi9&4_iKHB>#{?4yn^&Yhkf(fmXyELSj-LxE}MTh;e8&LjSO zB0=7T|5uomqMS~AJ&WjYGO>lrI9a5`-%WxRjEXL+6VOSt+xP-h+v%dQN1ihsy7b?> zm#f3sWNMb!XEI(o)b!SHX)yG~Z0Q3VkvPavtx=H8s6}UajnWk>{xlgj@um{`z z1SKLXGr|o(kn?CBjX6TnGqaTG@Y|dLyY2^O{*ZrvXv!h+uIWzaBceW+hgk8uyxU#p zDY!tu)ngEXsP;kd3evs#U^SYL+DA~L6^ose3_c^Wwc0{TGp(jRN9bp!nqrVm9q_=P za-S)>p5o|7eFEeh6bsA;)@h8*S)hH$JZ!3d7c9ZgL0q=vyL?-)(c;%NXF4=(^iq_x z9SgVGP0Uk_sCOGda&nH6`~$H$g8(4vN;oJ!0speuFu>Ru#S}$j-UVt53kqLVm7(COe-ZjHT7y>QoPc1w{!(Q?pml6(d+-3F){U@m zJXKk}Va$?LY0YX>wE3eEf2 znZOzi69HCMuP)8#UGR?2Ya)ZA?2dh*#)S!6p8yhY(GBHw-sPKfC6O11RwZ&WC=pZ7 z2JMvm#$~DB-C`bTH)X&TM)5=`nWhfB3qQ=g8pre$UxX3yQXEIBs0s!^8jaH{)cMXJ z@|#2Xb(2Iy;VXY+-h;M68(*GA8}lCkLQbFLj+OkGso`e7o%&n~>B=dJ-^Hv87|Cet zh@f$AYrTRR1a^p2%04dpCE2rJF1thCsJqMO=+m|THP`YK3E{h@B?AG@&2sW~T|QKH zA_~IR>=(hGQ3^XUJJ(UFp8_VgN47Zx>ICbG&^SC7k{?e>bJLhO0z&%uLLQ?lBHLK( zIJCtN0P)juU4T>VFOsUe#Wv~{GUGuWx3Le)CRU_hemGGE-}LXGSF1FjQ5!&JhU8RKXGt)@JCV5|yO zh*Rw^f`Y*jku{MWURguQVci9P+r?F4PrA4OgX;dZfs1omW|)SovLS| zl92~@!BirT_n+=(UwTYn=u_Kz8Yt(!r$}@!=MMOkwB}ATsmGv(whqvxWMYFjwixv| z`oP4@3D)Rv-?i)VBd!w?!(6E(^GaXU#0jy;z$n8xVCXf@z|Q*zd=b0}!i-vrY$GVK zRG9@NUq2pueV-)12g)H?o_-@-41b2w!00s%!#ckFh`WMOmaKLGv76LptT~~?nMfQI z2cL+=CI>9=8@gN{ceR}4PJHxcT_Pvt|E8mQjXP3{zevZpQtjbNtD76ESL$g+*WM|u zBLivrNuFT%ZN9WtrAkTqA-b4r^fym2IgYp0up)?|j;P!Aj~4Iq+5aN)Y124p{^veA zLst!(XERCQQEMF49fn05Ij$3%E*&hxKkQmVa=VCERb&AaR$;-pcis(p@< z^_K?K84oCJ9-SE6kn;&ENw;H6THAHuANk1yBpwZ3=cbcN?*dMFf_Ca|3m5I+8+ros zi@vE)&s-`AKN|D=B6M52Ib2ow6cD}bs{!$0ut+L24t|j{4Z_@!m>^C0`1QK*IB+?@GHt6YGOoA|;UF(hGK?j@D}X>bC)rv1E_SKR?m%OlcOf)q=Aj6l zVR|)l1!-LoE(lP~=P6inALLP{Cj+_m^*O?Nmm{DOZ#soAZrZPqt3Gv%$6M1|(0*7x)$eE^#W-K%*QtyCQo zdU>;QK5B$b% z>Dnkbw3&0+t}Z-xWHp=Oi=JARk{V^Pu5^;{DAm_T)4S@5PdGss0lRYo%j${|ayxWJ z?K;zl+Fz9Jm!4iIIoZ44%U{f1!XmKKsP!GkE8v94765IcubZuY7d1T^GH>xY0sJX7 zcGc>RDHoRdDK`nSP@sCuyXa~dm#CFbys6t)KjkMh92x+6BC30RqxnW08@M1H8MQ@7 z+P;f98el0_BJPpQe$l94Dez8_A=zxXTcBJ|i96f2r}!Ku81b&i>YA34?T3_)tgR7K z|01jzoJB4v`O+dK0Ecfm6LMH|sz+a1GiG_jd^pM63EL7`YXrd*Yp=B7)@l6#{@ zFsL$!PMBVsZ4x&15cb)w))^}f?@W{V-BHXa$y|jV#Q~W7tDE8LuU7qL0f>6uT zQ6NXwPoW-VqW(mt%nge$j+_*^0@t_Nfz&n;xfv2{@~(hZ{{TaSgQ>ZDt=(Nx~)2>8d_>{YdNYK?(p8%p$ zlL+Xk##NXmmQ67y>MMer^s0Urd(_qQ(74GRfMDltgnHA#0pi=IaN{s5#UBTLddmLv z$;0l{u~9A&;c+WWZm{iIeuddRwY68ZBG$y#uT_^rY~wS zkS=hd=6jwAt?f6m`}tO5GS8P*2g6jg1#DbJR*QKcAsEGw!9M?Ii*SW8MG0_5@=)&= z74#_X*#D=RKrM>HBt^#!OjO5R?2H?=e=x-CUG{e|QOEPg!mXXnG>>2vZqqekDmf;@ zTLXI3NQS7itBbmTzs#0?G7q~&E{^7ghJs01M+TRg`NmWvE8n%s1SVWeu`Q54>UYtG zrI#~TGrP{OfcXW-k;7sbxh64GU)lIXDra}w!goKh^f1DRFHguQb*8FpylKvuN|MzzZc0D+1jj)n z*BNWSk(UomFcRI|M`%wVGwynE$gDl4XutJNHL17NYA-i4IXENv*)OQghD^oG)FoNF z6>=#&#_XBL)!ZZ!_Xi#(Ck@i9+GFba-#N%q{Vc_rsFG8F z7V7h>1fpR(w|CMF&jVj14!)uTgDTJqfb_)$$z|2>R0Y$l?tld+`5bdM%(BojHqm+@hXuuNrS0I=ykSFw0!-plO?MY*{*NF4|U27 z#*t}!&HWTXuW%+iFI~v`93iKoG?$r~bGHg%cex7{z?OH*c% zVB{R>EjvDh6pYJXGWq%`Fg_#^wr1{t_>E`CH{qms;q%u|i9l28vV7swHy;|A1i*NZ zI@Ucrf~$$fWqy$jyf;(+6EuZ`{;c0cLdM(yU&S+2ZFCo(isO@HT7uNp0`4#;QIl@v zb`LH+_KD%Q{N*tL+jZfwuSZU=v!xo2?I<;`HU1+A4Ld$cI>Ih0|B+Z&+p=DlMAh@f^qc(M_v@01m&9l3p=fmlVRnZcX($(3u7|z?s-6$R z*(~wJv^X;x5F6tAT_eQ^6@~&DtGyg{0P3nN1C8z^)d;=qH!`vj7y!AMTMgE%U%>>1 zjspv@%?{H-KnB+R9CVg8R%&LpHjDwdTE7dR<)S5rCNg(pnl>48hMRwrG`7FUIsA;u zb751oF21pOuPGiA_|q2*P=9Ri&8-DOoF;u2J52D;+Fxy z?OQaMHun}63>iFxKA!l32dtKL=ce_-cA;Gt1#e~@8p62Y4vX8}V=wbduG!k?CipM5$Ku#YSp@_rfg!XHSYW*_FHjid z+S>X_n4QLI`$C+nPQ8ZuF3*F)rfVbZX;g0-W0J4#=qtfAow9u;6F}%6KgT3D1A9H4ji(rK9Tw; zYpK?(uB=%X)qoxh3rcs>Rol)b3K_|ftIfYTPjR-RrQnJ|D_Bpjzz{jJYqLofqJ+4J zwZRk#t)2mRySfJEW-tg{?Cf2)>mYLJEv#N0Kuz7nXH9tuikaw5uTz3a~Ec*i-8i+<4~MsK?R zT-bNp_1I0YTsC=spxhaq4um_SzlwH;NIr&Axn{$oc^3m`;jG%idO5ccL}S zfy{!McR9bKY4~blgY>(93MB`uA>$Rs1&PJ%2VIgv$B2UZ1h^Biln$)Zv$~>!)J1bT zhOZ`yw(EjCNhJg-T)YzqAbzvTmUV3J$OKA~>E4{`l}o*(9@_tMk?^S6I>7J>U<)LN z31s%mDJ?0Q4DlbuxZZUn2FTH`CxpNeFxvp2ihd}m=Urc~Zb-<=PN#7AIAghjW1KYA zCD5*}O2|*K>le2f&a5)mJ=gj%SGs))9`c2bBqWjCB;P|IF+ojEsFbs?P7&I5=I(k4(K1*PT#fly7hzsPdx#a-WVq7i`Jg&LVl>zyH(m{Wfv@gK#4R1LN&GFTo?``G9w0A!8i%YEbwyewbyE_i>+ z>!2s*JIaIE!Q|wAxwTQ!euDcWjKQ0~pWV!F|{`E~VNvD^~y^ z?U|!qp7L<4WQ*7hQcg^&@*CM)%=0ik)b=@zpe`CzFdJ8ORJ-~q6rQ4^|1-bn6HUn& zFEt-S)c5v=x97-Hj&eD)_bq6}1LGtcg!jh03nqF-K_?4FwX46hN+OfB)#a+#2Tvs!yeXT9 zbGo5z#5C{%r32QG#-4T2P&M6B{=Ey=y3OFF42U=k=tQU7jWkJ*v|4cExbWAjdt|4E zeCZ;{Q*av~*ccoBX+~eRdsh{%t4xrx?f}IS)+?Q?-{^X1pCWk?^(oAQz%Yk*37l*j zixQ`s{wWzz5BONfEaZiQ7lQ(6>aAw<#2^_JT8BllO2#Jx%G?u;frt4QZDr$rCLG#F zb1{)Y8wz(82@LoQHfw(oy#lg8)b8sXDUI-z9L|Xl{ZpUVpzIfVlS0AZe7tI>8x?s$6tNH8}C)0oM&rzQHr#QZ9tHpsd znFcjjP6nT1gjjzgSP2K1vHy1h1U!|!0hcF)V!3AhF0|!b9drvPN&(t@dp5@e6+Pzh zP*7`#xq}vy(o9O0$Hs4=2m9;xT}b1VShyxDXCOG1E=r4z8SK&GFK{~Cs5puZqh7-7 zcxoq{QkK?w1%OXnR5#AFG3)LJJTj9Ovh_eCn{}c0q;E-Kp#$mGZ&#PsA&r~Jun>ZD zmIH-S9_aMdccW3Gww#{p(*00{(6?Z-Sz(>?_Fa(JOyNW98(uyKA(>bv_8^iQjMP4b zzZ+^ahV}F&Y(ldb(Og9-0D7Hy;5jjJ6$l2!u}EMlNV7bRw_}TArhSW~w@+Q=o(6>) zH0Zttho2cu)xXFv5z$&pV4iYwnMqrzLa27?*{ni6R?v9x=1jwg5u4A9*w68It=C0* zK<;T~*YZ3Jn?9bvAb8TT`i7OR3*Rt~)e&RNC%Vuj?J;?4+#CCz>#nMd5khKM>l-&0 zB&EJC0|T ze9U!kY+(Hqk_0kOwZwdB$Iv9}BXR}NS{*T2K=K~o1Ep`28&E@Tw37XiO#s(W2cB*<;|ivVni_D7q3&A}tFg#yW@^zH?ic6EPb<^;f9BBbdk z?gnX7Q^f01DawoJ(nfFfE_tH%Ahw8a#BB=NW!#k331WMD8hHxi=}MixDjNzm5HtR4 zh*Y(2oI%=}dh+B=^^tktC;A?SUBjd_www-C%p9Un-ObgQV?##YK%A0Ym-$JV)M|1T z>UbM>flsKU{45uCNXvxhWY#bp6AZfEFYy(L_$bB(!ol8zKexd}W^YJZTb0AMU<+oD zVHD*lN+S>q?;gM=bC`DTGJ*1`$uC9;5+7;#kgx0#Fao1~N}4uY7gtw7=SOuPUQjNT z+PmVZk(=q5iupk+%qLTszDrz@Aj2@KGkBvG&8QM&HfcY3O-J)_cKYVF4-c3!zY3)aiu{1H5_~s#h$R7UVHellIPnYOh9}5!3U#Z=6CtyxTpaA+#`P}}Uo(6zu)CfSm6)G-n1%1`_UC`-m6}xUCrtCS=a?@!pC<(PY zce?&_N5^rr&%1n2 z^FzDs^fIsTug)DnHy0mX)udidf5QUtrTx10Yf3Uo#fOPtG;8)xAL~SYIIbm_Uil3Z zShA^WdOGM3-u@}rXej5*1agx&-%5Jk@74oIyBpshBu#yf^ z9i`|cKxF&Z^6OMqIOC?HiFx=0fAbXh3k~(Ss&WpMWuhE@kdwgX+g(S-OI#_OEPh=$ zvE0Mg`ADJ~F>5<&Y8LUf4ei*YOH-m@QyDoO?CJn_vZ_W|&V%VWze1rDtyHWn5 z9+$Ic3YapVg*pdBhSHdJhx$wZNZ&r5_O=Fudfl*mM(CP2fL*ji>n;?8IirX87EKL% z2RS_5)x5dUS87LWALj?U|124HdvtyxnK_LPClaEZF)Mtpvmi|cR1sX4g%Z26IbOxm z12MU;kE96iaZx7(5nK-qjh{lP};F5z+C_El;DcAoIeOG}CHV`- zEdplefN1PlyV^)HxD`U|D15Aosz~S422K~rr)u}hp2{rzhxi$IiriO2fO9yFqYqy{ zMbeI8jlGz2ly{M!alv&Ud8@Wh;qU+wh(p$_i@m}|5f*N=LZ9!(mX#pbojA;XcH^={ z2s%7e%xfzf?bD3#)1jWsL#G_=m8YXd&Joe0{zb^ykOI}F{6s%mjV8F%4$I1mT#QtRzA)qUYG(T2}jn2C!gGvGnkP|B+zXx6;EL^ z5Z)z-3$6H;@2$d~UdJ_U>TSZ3n@H0~%+(T5s<*!gICsO5B16i%$Uux-fla~S_w2;l zrwG!TJ>unjY2gJu4|h8xU_*}Ur$mr~O|Ncrjxa;rEKn(e8xpbpUDUl&L8Qg33-m*m zVWumYg!Iv7%{s1hk`bxR3DB;|gd5a4s%3M(>tBTZkmnGQ*e~&~z*0g|rQJO5>-a+b zWGXyG_&9N>DS+ODLrlhO#5yv_noNwo=xNWbCSL|$%c7WPsYu&j6u*IC&QGm|=js?K zZ?MbEg6V&ec_wBR@qf&_P#dez1UZDB2-NF$Va|-H<$qxReS&CHel2rjIjPpCc8BoS8^q)H?R9ECkC5XvgcS zzU_?^j^%{DSk5#mkS}e_10PdbiuyEWY?1A+{WLj)CMI6KPiEe0KSjec~Xnpc}BWxNOMkggGi4SufqbvqDF+}GVL0^&(p^6~l5QWt5 zazfSR9jaL_`~K!+oVf8|ZxK8!=B*4u@MrCt&|CWu!2MN?xb!PiW$0uKJ9j|&85_Iy z8+i)V4+++nu3RZB=gbg99gA9n3gTm{Oj5|Gd;C$=Uo`55;F}SxsA}7-wNGfj{ zBxcX8o?HP-B?2d7f)aa>A_5YQ7f0QSanwdkPvPfn&kY)?@C!%J&m-Y6xuQM+oVoyz z#BP-3ei1>e8($IuhWV&5Rc-p1?rvo18TV{lj26f8N!H>>x6vWjE5UtgzY%waK&o*J za3ASH@h*zz7Rf%2T>TWaGeGpPX*#_$PF-WL0x>`^GHpvGEd_@}57D%Km#2GC-fr8( z+0yTEo3J=G3B#dipJIBK-YvP1H_uSKZOpP5tnvn~pK@pT&pe2~cw zA(3RPPp#Apw60?vxLQXq1h(N2_{>oi>UHZb)Q;F;R2#*RzI*ly7caa{A4wJ@1+OCm zgwI$8M{?XpQO=o~$zRw3D3t2FPVLO>B3?4HE_8g(wMy75bC$aG>i&dM9-r+dP8u_} z5NixbEm;>7tqwv<`!2$Cgt?eO`9&DbZZtFmcq(tzIx=vnbq!={`NTR}JO!vzu5)sz zaRwhk@r&~Kg^{7UvLofWk4bQ3Czo8kE~u`UA!_l-;4$;TF+!EaHpH&& zw&<-J9SVPO8gtvHr=@j{X6+Zf*LS1l=TV)drpi5SUGJD5G{{HQbggfcVEgZr@44J9 zuY!c7wNFiV1NE(MSh=m%b~^ppFQ{Mi%X~k1;0dJlFESVl{CMCwk^3mI`x~5mRlQy( zvD_v;CSDOjTY5I$#C;tslmL$JiW;;(M=WOLf;QfA&ONipPqqNAMsKUnG{wGIt{Kak zT*`%rMQMt;L!hBq$K6+mFQ~e@bLltAr6OP_)9R9K?`nl(hA`fZr+f;{cFaE$#An!V`CEq_+2Td>J57KFZVqk`|2@(Izt~WsL2+ zoZ>zjJNi*~J&ZwMBFD2wOO!iU`xKqUm=SMtR)EXN`mZ=6!emv>+7x~Nq2T1PbK8o&N-*YE@CtzrASlKQR{yhW9Cf4ay zCu5KT#T~D`?LEcd+`Vjlo{~8pxM}QvG@>-i|Hs;$B}ta#xB}fuZ@@)t9zNZseZ-Xe zUqT;Hz5Wqy@v5F=Rd$8uwR=^mBnW`@FN)Kl&&vubyUu zUsn_M#tY?&CG4C4gbMLR<6g>Z&USs1@GwIZ(ainw0P|jN=3B;$+9lb(-G8Eo)x^3V z0L(zq6-(Rp7<^T3SUE-*;?&Q3qo>WlEJ_Y_x%U#;ycomYJ%f(x_mU|D z0K@kb4^gBL%ZCS?bCjW|l04jV#kxDc-7l~W&>U{F{K+?ByU5x;O+s}|A79+BnJDQ2 z=2;G=1LKgXQi#54Zm32?hJPSywm|DEbaZ{VayKswb4f^DIm}AXLg@Y(&4UU4>;5EG)u;xdUMFq*S03?i}*? zdKJw{c9_JhSq1%&+KUe4<#(~K>Q_M`qSIV)SE@;VL<$bp#LjP5`LX?R`0v-|<8u9d z{jgcLAD6?Q-N)weWBcdNkJIVb=|}lIzvNH9kDHI*KQE_`-{-@hkIR3T-yf$xzkmFp z6sLe}GqYbmO>x?qwRZjW>m!Hr0|$Ucl|K7 zXaDh2wE8$5fB2QIPcTCF>u7Ecn8c#F0kQdJ8nW(N>RruZBIbS-m=Y4=;&Op@AnH_3 ziCz1av*cOAph1`7f}1*$#U=bg0&s{~TA7Jtm5fjapG>WK49$^Hc|0Rb}PgXsl5Fq56PJW zSWhNmekd|{Myf;lYaOUnzzm$o+}@MV2nil%tK?QswtjYouxIQd#gALsnZ}(utNdbR zh>p_s2dqNA9AF3GBw4iAYUJ@4E5(PZJpty}X~LerST%;WAuSpC4GLj%Q^%Ln?v?~C zH+6DOm9oqVauGH3wf;u@g?0Y*b{A{!iBU;ms3?~DwJLsGWH}TYI*f~XFWOoRR0!Hm zP^)%QTI2mu`(gvz|Wk`RV*JV9~6SImSb)_M&Hbs5Qe8Pa_T)LNM zu9;QRU>B=%?%U(JmHDq#ko--7jGjAZn)njE$4oG@evQ^^-!3_ZhhnDgS6f8~pGWbYj?M2FO+tsH>0}hZ?z|G z^3g<)uW5F%?bLNsp=;c=92Cz2G}+1G-%R-Dz`8Cz&Xj<>CvG<-uK#0@$ja}iKBRQt~4P7Tvt@;jl5t_ktln=oYu^eZyNlDGr{xg~MBNL+b{G=V@ZLc5nHsgg6Hg^mkZ!CZNb0ciD5& zH07&aC9^Oj-DF9=6S{`hnYyi=&h}aMCcp4l zBW9jcaE}XJeCJ)0<`dPcCRo+*(rV$0=1rw7<*}$qu zb30!wg}f$3as4b(OcZ5Ne@=m&9|LdFE%wl@Zx6n-j_{61X3e~Zd66wp-!rN~eQ57$ zTNhs>vt8eq!s1zQ8DCnE^gr%uT82kBuu?_`y}o5*ePsqlPENiw|3Qb7#8x(~?Nxv2 z1J6V61x05f6)^<%QS4Qv6K&t`5T+bVb(*10KvS>AY%2=m(`A*4O#r{WB2$$wLXuHYU-)?KFXHU|M3`f=nkZ$X z>;(o6{K?Et^$ExTJTXbvC1;v54JH7oUc7EFChBL=h8GIx@Uw~E=t+lv|nxFqc=#Ly5!jU1L_zO=vMkbfeJ#$>v!hBGM~t5@1Tb!^Nq z2mrJ#@SV9Q*U#b#Ok3=WM{CbLl?5Rr;-l1O8Y~rk6z|v-89Wz_t>&BRzK^?JtCk(k z-?-_wtg?fbkZ-X)TMXvHkh9gd!X4bq`M+_?Av1Z zTkkr>8TmiC!aInlEI|gQT;qRX*O}`9+;S=%BOI;zOXE&mC5Yy=&EBP%^rcC}CG!5= zz8AL!6Mxju;VnslbXB41nuth_^?T9s4q-acO`fSnB4F3^kdGkS)W68)z?Xe9|Bh53 zBU)uEc`wd$ULSLqQi-ea|8x|59XxbXWhP2ZRj2|A>!;7wH2_HYL5W zf#admej~!8NI}vt&o9c9r>Djy{u5WPI^TsX?9%3qb|||p7YPwV7BbeeeipM%m`Q^P z@+{wD24|Lr>r4adG+bxn*LXZ_u#9;ky{`Q)VpRxNJ1vv|b|P`sY#~?yjMjS>sOxH1 zSHE?pGiToC#kp`dY7^4RK6ipm-caka9Z~|jafDYOLn4DVM@$5@rqJB#&ZQYHz!pez zkb&Gs;75F@9L&r=X}`3D2iyQ|9z-z##@i6fj<IrPtBK0IaZi}j!{Eju$~<4E5L&(hnR$ zd^R+&?z$(N3;k*rs~)TPgRd5Q0h7vGppFK&hAFDrZ{Pn@1R{5gD2Ms6EpTk%Y(2c*k4GDFn@;S8#Bf`iL2f z6k01t>zV~a`-?!J{DYDuWR+^8^IPwiV)Tfbs?>Lsw_~kw_oW`6TUQhTRvc39Q zLTJ-THCrQ5O7mX(G=jkduX+^}@H4ZM7#LYamb()cII7^U=z+G+0#Y^6%L^X$S(tYz zgM~a*X{(xH|8m*_*L)Dkzqd<;0CSMStJzrNwa*f{y zZD9ts&tih2*5#X7kc18pi^j0BuSfXs2HeV89L{8bFI>tEm?Tt zZhDYtMjQ{~3|H?LW8M@o0PE%V`YlIwuwh&^9^|kyF*8kk^k>fmgqPB^-$>c1QF*>& zuT0#f{?b%16HDl9U6Eif@&jO@M0ajjG#W4te;OBq`mKHz);MRrq;GY9@cJKa#MnVk z+*RPEZ{>2-NpB;e-VNd{2gYvlm~8Dq0n*VDc)j9Q-j)mMvs7UWU-9@c$}wCOn+8gApQ>7BOThHI5u zMP1AGyZuEbbK}{@GH~ujl?Y!g1v18y&t0!#!^hlLt3zavaN-2Sb`_yUyP{ns(7!a* zl#^680(SiOm0p=}(f=amwe~LWiO~W1tL%_;_=WC7hg?4kDZde5_jjB(54&H#-90}) z{`|O{KMu#AI=a7q{Kf+R@kg8Dz;CsEo_%$4Mgw7&>=B2rRwOtvZyi8qDLhq;5|M7xR{ znMe$`ZbeP@j1n?NclerA@bxNVT95uXZqV*rY;Aj3Me4F`BbBtDLW-yQTh*`z-x1Vp z4-X2dzhGcJ(E_4QhC;W$2tJl_V7syp2?X6b9@h*gsu=(zvZh(c<=*?!Sl@nyiemC9 z{ZFysQz@X*Fr}saMP?OCRPhB@FV@gl7ZMU|@`#!>Vlan_1l&P?k#nT|4jDps29dIo zs-Fdl^T6?6%w$0e&4U=nmKIIhN=x~SvJL55Yy>y-406WLzp;R-cbx+STE^R&?hgkl z>eP%^WF}~UN&AZ!b8AoVh+3Jm$u4n^b$w?-aJ@<>MSQ5KTqZIY%tgd*0tH3^=(>Ft zP6_wuQv|rl;zgSqFG8xFkQC}wjOK83w(odV!b)Q78)#viK>3$|nPW1Yu-WR(ts9+QFOb1`VwZ-AiG&+;$k`-;5UKSZt^#Rlj7mgBt18V`bwfJ@V-z6!&v zry%nuY?Rgy*D8DtG!!($a^q9EP$p}x;(Z@+mfA0EYNm8WraM&y*^FPPn-rxM^q^h^ zPn?#6gT=g;w3ap3(8|QWbN!9d{XF2DD`nGPGmzGaR#ghXIx+3D_@m}X6Qq8R-3AgK7WK1UBwtgQXZ$riN?z2cBg=8jiteGjOL zDAh1-CsI+agO(&D8S;YDUcVOwmiX-!ntDLJ1DT@mliwl9wX0}oona_%Is9szdJ}4b z6N+ZuE{;WLxa3I`K<#{As~}sOCm_$A`cX1sG`lr2$G+x!nB)i+HeC`Ic&bo7=I0Zl z9IVXb%KE)r`6+5u!-zc%0UWr&oC3`xNlY zbA*@fQud4KrVhAnm^0Qlewyx>(oAIYjQ}SuD4&h#3}!?9UikNfWM`K8?7CnT7=SK2 zh03GOVUlQY4vI5sVjTr(DBL0@AE)8EFqrY zTSaUp?y_UH3^JCV13oBE07kOLlPz~z`L{$N^JWN<=?m*lDl!5py*)pU&^G}J&?|Wc zLw-Wb>Su8`CauH-%V|uvT)j_2L%&?BprO=23p@zJ%6w_vc5TdUut~z(XB&4Fp8#(} z?YM5+yXV6$_N4KcNqOD=B5zZoz=SmH2s|3@(0u72(fY%+?$RE`!PWH97YGhR{0y#* ztv>--JDuHVFmD!BO6Hzll)m?sH7Q?4jgGpHB$)y;fEVQ7o`rLuR5wf-rg`-Qw~Q%! zQ4CWEuUpMS-LY3pxMpTmcbMhM5CYPL7;5Dg>7DrIyvbopHU8~kuyL5x>lo%tlNH8T zOI^y7t=9C(516c-cX*VuchmUf4W_?*nwE<`hVfrg)xG@#rqJ@vhfEH1x-E~L& zW9N<*BPYO2b4LM=r)Kif>&SpL$buPVb)hHd+d2e6Rz<2>H6JrY;aiEnd}=a3@Qz5u zp#$NmK8=tHZ&ycoIq}nVbIDL0vuoJbXz@YbrHGY&t*rTJmaeX&=2F0^Huq+O5Gy`kn%gF@jduiRf)2 zCbw(7GN_l*5k<1aJ@7+A?tqJ}ye_>UPNlNl^kv)n2v_U*)wxQ0lKuYksmSka3JY_cKx%!DS*^wxXlSbUc#V-A6f}_s{TcovU|!d z_VCH;%pYX2yVpj~FVy8#$2x=O8MuTiaNiDR}VTC-;<~d>x|5#R`K3ea3&Z<^H8-H^ZqwqAfc-PM@oBkHwABsChmuj?q zyYVm*GueR7{te!1{2EgtBg1O+MBfRM2Ni8$4Q3Y}^*G|$YENEUoQ#Z?X%*J?niPCN z%)~74|0&-M#cF>MlOU#|deU=OXKFXPU)*V(%bLqeHhtHrMnRbj(X@`O+r)#A=y}fi zS)N+MF^^cx;T9vwO!oa+H-9;tmVWMKlPECyadQuT^h0F^O-zS^Q* zMgNsA0(Q^3s~Mbe+)=BW@^x-AXFo>+Uldq#FQGBH+2F?57Od9WXE9CPC~B18b+chv z1B(4bY?z*ra1`QXb9T!@iUDSb>1KqI9rG7!p9QW!i$s6DSliAJg*NQml?0G%S5Z$u zAfF1^LC`g)_HA16c=1(V%x6kqf58UK*{$Q}oZ%sqQd?e^_Il4>dN1&#%(3LF|88AIjz7m0N&;^8m(MmS)k>Q`JlztXIWb`|W-gPe>_c2H|R z4I6R}`GYC0+STAS`LVB?kgXG3r$B7oLf%(%!@}N%^q+OC(;dHR^*hvgyJB~SsEO#f1z6$bd*M=&43*i+^c=|#;Mb&^XhU9kdpDZA zWloyPY&Xv$F%!r^k@lU`q0KzdFb_te%Mpe-Xu1YYm(*R3h&-!D36gOx1StSy3IbREB3~)4`ETV6fot^Yb&Xd46Sd6|l8-?G(U#h00p>$5 zb??_b%}~jGD~}+gXX#n55|4+Vm$Ub96DiMy}!q~mT#qpx#N@Ufz+zflMlIwKmGlfO{O>cLBTGlsZ7N0?jY!utga zKNN2>t;R`^k>BeRpndg;0h1|x4$>zABn(3;L_q)~ZQriSD8%z<0i6IXtT>v}Cgmm9 zIRjZNNiMtP?* zwaq>73c{eg27v?P>z#);uvKLNYA5HtYR-m{34kLht=}%Jg$U1%iC+~ch^v9wM0mjv zyxJ>`=L_KDDrkG zwmz@kEDbZP>0IYi$khl^F8p`+hw!<`!VzcCEBr^(XZ2&v06*CS{obXu(bGbZd#k!h z5zY5PvnBVVzaT&*x5FEv_iIn1HhYY^qX}vD$V&Cz<+1q$fXd^N zzfj>lwA{~dJ2+YG8=ox$ z;SAO&SJA&khcL-70a#u~2Zx1kJzwMP#FHL~!WT_t05W zHBh=3MInyX??tFH&f*gzc}_rlF41%3F>r&r6D7aoD|JBzn*HKS>mFeS2@4?l`n~LB zw_HyMG3Hr(cCQwOcte!iwNXkgFbSGkR+VFekg2 z%|3V#hFY&{Fpc6x3;6ZC9%O_p(55E8s0CBI)LWY&9E^>Jbn|Iiaq zgN9w~UnYEb&5)t?9BEo=X=Sp<#22j7PvVJKA~F7Jdje7&2Alq=Z{>BU;~;dy^`O?t z>$E#EA&+q}D5UNz5a~!vPiO$?t)-SF<#0WX9Ix(jU>`7BJ2Rt+U5NgTp~1itLa9ul zs3WGzEW=X(qS-GQTz{h+JBFd$>ut<*e=1?^wm}FYn!KM6NW~IqpjG>&i9e`h6t1hb zXHtwomF}GG%dS3+sqSoe;6iSD?OZjrp(jL&(#{rD%A^#|3LxFpqecV1VhEeS_Mlm) z_wMz~!dgKRBRZWQcO}$Xg_QE`+#)9-H#0fO-*8=EVP4lRg#f<6%I12b3-1O6M!=XE+AKs_tto` zz8)#lc1A;ezZ1nSj+J%PAg-}QDQSD=U=9RbBk1H^U@0$QO$7sA>x!uW4Z4;))VUOT z2QDbRL;IA6;E8)5CRE(gzY=-W5tCv;iYsZKyzZOx-_E+9pM+s7ky2%$KH&)wAON_)zWuYf4BgA0OS5nT z>C5Q!4~f+|j1f`W@D*bTB{XBQI;dbS- z@cu+F(ujJinqZ3nKy@R%)fe{X|A7Z?o%H?x3^s$BJSL~w|Msv7k`%|;*yqoCt4n9|pKLC;{?>6G(ifiJbYj_~sy%L|uM zRxvyI0WtO?^$%-=;DTeVyWyX|Ivi93?%E5o8)T-w)h?0*uJoBGFwxuj&fqHqIenLU z>d8e+6Q6d9^FeVKA8Rwh@IbWqDD8VWaFx=X0PyBnaHpsj&_8f-c(Ap#y&KRtNmf&D zu?9^fuyGt-zt%VMpJ5=;ssj*fPbI4; zNVFE$Y%xmg@GUSPb&#C&`Wvx(kgdMgRWKMH{3-d?Pe^>B9CG0zpz9g32x*@M+3PBA z<|jRMBNWB~A}ZYhT5G>do?=lcCx@B6`#lzzrZ&!%p2ot0U;}vuYBOYb>X7;u=^_vw zpHfX==<~)i!4{OcPj{}4FS1fhGET3nPXbCsNt42($Zu*sG5gaO5Qp4m`i=gpIT9uX zdgr`!+uJ_oKCz`%Q>7-s6uHHTS!<3tU(FmRP7tL5ecB@KfE%k5k|J2rCq$^$=w42S z0Gvi&nYvLCi9UknX(WcJsrB2{XN)-rFmv`U)1LI2RV9*%8aWZ1GM+oN{r_$?UY8PQ zylaVkyI+vK(16ks$g@zm+<@7)hX4qEk-4-mXHy8ilYI zGtv8EAT^^CmM(Xx0ovk(roB7{NN5aqwRaiRRU3XPxr&;mSZ@R1qpXLsAmQv_?ePB|GA!o zjvRGj}po0oI!)h&-19e1DF^j4pMA+HYh|?L}XN-Bx~4X35}u$J9k)S9drr@g8>xL||zZ z5fh_Fuh48UBg$I5?t*hbMw*W@_Yr{s0rZZ`spPY+8+nZ@=Mg8r_%9DIm6$1}Ls<{? znf@pGa)?+GRpoD-`4r?>EHpBhgq(G2O*eX#KZTL>mWL>TmzyV(s;0vMWx$mdKUqs& z)jI8dd1xKs6RCgmrFrxK9n2enr;?M_Z#PtJD2MiVA|@1kzVMZB3~jn!1({AO3xYpN z1LcI)fGS7(M+>F?MYsrQ)I6td1TsJ5-;oq0#jJC0fRg|912t*R5r8;lt(JmGVSV)} zZ(;f(`SxNGy`4zT9{OYsDcx$xWfLfYazpa>3!ApRV< zxafnQ>FoB;0?0?bL}|!-QFkWwU}6!LMD2JFaA&loynAa>v7ev{cTqDF2o|(K`eu5` zQ9wCb^JXvH%~%5C8cvSMWf-*%qX*0e6>9UBD@ud}-pq%YbD2?isASkVZd@GJ@*Bx@ zOw%((0REr1EBi&>)%H6cjvU(SRTxtmtDrA9ahKnvl$riBjQZNYLV@)D2DZId@(~67$hnzq)kd_{)wubGmP}P%~Y9xMHH#ew@@6Hfo8|>P!Lb*x2u}~ zel%`q7}73A0~DXIQLQn$%l7RuPnRcXk+04&$j}a=Hik?JcI_%EM5af=!(4nf48_q<`%va*D;EEP_fK2r&ECF5l zTV2Y;IwNz0a-Ow@9r*t3Ds~)w0{zAMMc7~T+(zDTid7BNt7IywY7d~~?IK+75i4KO zD;#~KdKDS-mfnJIcvd0I7HBvuAp3LS>{n4h+%`{+HtGIDBYED&#`6;oxV`NW*fXg( zKz^Pj+zQ-pW%*t6eAni?yqxsgGnMiS$&XUuMT32n9@Tv{oC+Dc5mjWdih=(lkzsBs z$0TdDee2CD?T!be>C5jNM}mSqWg*J$d?aZdER*H8A>#1N_9F>MD0YJ8qQ)7V0*nd& zG5pGUl}i$DTjs4Yi;t?`1N#QB*)U1rW#T$Y2Cf2W+g}9T#hI0TtPP`a&vnR%JmH&) zvR>slPCX9x1m1f*AuTJZCpxbKuawgL%2Z^wT^K@Is**aT7Vx@$79=90M8iEx$TZ`c zg+MBTb3B&nRhaWIw{eH8Uqm;Tkj@E1m{>1{C~G>Wf+%*jqt^c&Fqu zJ%-aJn&3*lvv;s>8DEn0X)U$Ch<)B=t2OL$3>-@3t7Xr_4t5|1X;)F%OS3VhrnCXR zJYgxKLC^ z${paWc$Ge1{VWMf=KIK|@+`75z?&Zfn|IN*tNhXe{`t$Shtu)nH;vZE<vuB({wJlRQ5sS@O`;BB8+Vrs)eB%`4 z=8%6;MY$B6YuPvJ9`&09wjV#vQBN=WU1N_~Ma+B89z@|FC)DwWEV)epfVPQ&RVq+u zVjHPGiTBxjN_wU#-~>9)a!wLKJD|Oj^n~}mEg*f&z8wbYcSGBZ--L6u@y;sxKZcRL zHI^N)fS4)}EMS#uMKU7cioqG_OuOqMw2;t|2Ymf{v`1#6@~{KD zPwhyx49n4UN0-P)VCmr#?E1GWF@*}lyyqK5MHCj9B=glv zYdwUFL!WM0^JVU#?3EB{uK|Cp_pX|phQzGe8OMmZjVua!qmp&7+uY8^rQ6@q1+H^Oi}uuVfR4wJFY zGc`rF^iw>YmTZ%LQ`DtpRu9Xa>t|6>cm|Z)b;EAh2e2~*Ln2ML)eTOM0I3N5GGR0| zT;id~LHy$w+&)VHhPUOIVi2`wiw6!n0{%? zttK_&2&ECvtC()r<9e*Z_JZ@qLbxKs_NH_Y1JG~l_wrx>a1O}3qPK=6%VMz{0uESe z->!+=5MI6>LsY`#0tKc`jK~NpXjehjx?+?HPIIe~4Wp-#EN4JdZH%BzV^%F8sy`A5 zsg4+MAT#R$M12;dy+S+}2f3{B-CQbI-9aI}tQ<|9pjp@&=jh_aENkD3D}W(QhPKSE z`(A@W1uc$9rU*IY-hP-)vrZWY6iv3eCXpIoRPc1lF%qqG?KR5cjH;ZdGgX~fZduaZ zX*zm}aM84c?B|}=qfCRUsf6WWPNPG}3mAZB9=V;=KTF_KK#a^GnFo5Fz{2ZBQb%)M zegyUoiSH<1pQ{ql~Jlf06ctyVa;| zM&-^l;+7#2ESM#j#;3Gj+DH**+!&?H$WB%L6nmu$gfq|j1fV2|+{m^Ig(OqK>4L{Z zbXHqEFbUG3reY$q6cGiV$k?R%nV(Ag`_7T zJ8$c^OKao1zFF~wH1NJLe86h#6)Dd$^+0ArtJmq!D)Z&q_d@?cKH-L4XIf>C>nth4 z_@;fVSJ9;=+rvekw=3f5SSxir4Udp|m8&$_KYp1Fe#(~J(+&|81KLx&%9-?4)}eyU zMGdGm0RpI_c#Pj#y~;7bJ&TEDuRy}Y41iNO=Vrh`y-KE2rM_P@c8FH`!N!^z(q2;l zZieb%vA+V{R1;QACt~h=H9Lx z$Z#mtj^=E%9qoIe{NVBjgFD4B$|D37j@CsMz7m)eXBNEmaFdb)9JlBej198D>)|%c2(mey?gNLZAlP-* ze1kuRFm9Gh_O8Hpb&62qsT7q0?Jr^)VEEB7D)3o_eHW8s%kY}2>2bgx8;m8*d*29+ zKR#rbFL@TkW-x6^BkJEvT_3qGI2;3tlhygsIFa5r8ao8T{LA*eJdNMFbIo6ZC?kQ9 zgE(bUE@b>vzlvck@mb5DV;X3&TyT-3LbqyqoK%n>VEP*G^p7BW(n@+R^^6mM;6Qw~ zRn}hkpVzcOo+K|3lj$OqLc}zc6pz?!X{o)*9`$=6*c742ZSsw5WrdNv%EaY(!?&x* zSMc&chEq^uEmB&VY9nGWBd@eBm=^=;z|&U})HGfGt|4M@>G|^3l~cifmzI1Rb1R$v9L7xJzy3ValyR ztbichgw!OlrWBu;GU0F4Bdy)&cANnbbJf)DxQxy{Rm0#K_Kt9RKVn&FyGy)G^ zpa4!Hr+yVN1sJef{YEz;_O8|x(-hvd^(ywNsjTGwIY-!1I7)avJOj07+b=Ct8^2Cj zu&jJB$_z$GEJjsTezwmdYMbh9=L#+B;uP@ zaCy^KBTm)3sXJoeM%<*CtCw%2JUh88`Nje)aE{tvlxa{j@_y4ii{cO9OA5i~Lv3BJ z0)GUZh~AD6$~AV~OB-n`X_lqct1ws)vkgPav#@z`d~6wC*+`9gzwq)iI%~tmbaI9a z03(;*z(bRLw9g_9gyAU5Rt>9g70!)mh?n%Ke!E}>ZO$0+&OM!7n?aYV@-XDvXNkL~ zGCrOhc`pcdj||>|?(=PEky*tn*CEDExF*RNo{mI}?ZPCx)qQ))8nF&??-(b(;A;R* zPNYo`+gfU16|%LRie?$F=)Urph3T+i)X%BkOUh}&on`&3bFSw>6iYl26PI=sS4bdG zb@1E)8aDWKH|-?!+0PauL&?;;C5c*>BgFtk21g9NZiYYgJwn)Zy+A{Sw5>SZ!>0&24)MVQPcHWt6q~K|5HEf=jEZ3}(iMyYq{BZc# zxabV`r_nSJeo}EWn_P+x(069*r&nUN_U)3!lbSrhQsYDT%gcYbaThl!;}bwr90j^34^J{^(qP*B@BRh_KTG88zWw+ zR;BB>&GFcA0-$%WJ9L2X3TkDF#2X&4k1N@X^q`E1oKOG!z&x69hk z`9{Vr;uoo}c$un1+x>FD)Rw&`M8TTXYI0>CjVP9=sI7$60Q&zsdFfyt(p_X%cgaDV z5!BmfIRb-dcJQvUcY%(&=IS;zIb^o}M%2#K7h#-?9_mP|docAD-Ia!;e->5>IADYi ziFLSsAhR>l35tfQr2a*^l+vg7?0z0@Gu>Lwn7Rdz*H}}nZ zt8l;;Gys*@o51SnE2|`F4eDoMspbf2^Gx*C>GQVPOW`gO6xFMM@#n@LL@CT9 zIHnFADZfTky9)PEZop{BqwWH{i%}OaHe~8nYlUShx>mmRS1!ejMw0_aQ$Aut*U!Qf zn{Sb3&74L+1yCL<2r-7$O}$D?UotKCe^xT$H-kVZK7maCUf?f;nizTWEGD#prkrSl z)>z84&vI37vUb3-&92kS;_iXXi2Y}pMtvXYa_oBF-D)G(&x zhLe%G_(^N!Qht&^+UDL5zC0k9@W>`gW&6nS=mP=8^#HFJEvISaYMc{b6hcIfO8Y(M z*ZLbtM*+j`ki|RH@gZGS*xQHh|MnZf$#nxVCvj>LtsBnro{Oz6qmgWlw^1Yq++B0rxI8nn;CT3%ClkMT11G#E64zprMOOYiFF z4T+^EF$iH1|BjzG;WvQa6H-CmUkC1rUbzFMLTp8^6n!OjSa8WeieMJ z*M><--mc@IH*p4o$iY!O>s7Erq-5^4i459}vEeY?QbAge(Eu;I6yu8dWwWLNrc&3S zyT~Hi_rmXGFABtGFuRWFY;YJS92UrPq5MUlAkG82?%=lU7l0kSTivL4!#}HC1r#Rx zfX+=%I6xgK6z3JAZW!;^tAM23sdSt3jojKXRAtJ9?OY>mPX(W39eZUBs^U_Kzq>~{ zmBrVwj`;y65gkg=+w08;n#gs5fNA};yUxDQ1rG6cya=Ebu3DBHas4^h`XdSdnRXA} zvb;_%qvyaHR~?&9*1lcN8#v={R$1{=Q@%pazwRSCrcBw^ktQQxL3KO=RE2trA9B*VFPACcqgi`%bN<&BNCRr^yeH2VKy| zzA*wu4`R;)$IzpRQjvS!b+^-8!vJY3K3WZpm6MRN@)tchIGa)}N4p*jVinYGj&I#iD6+Bt5HR9SI9Q9h7ge^t3!ttS5~Z{@PrM>k5T11-K&I z-gS2Pr5$J+)i&%B+Aqzp_8Ihq_-<~seCaSENhH0UdKHDu)x#(5M*Bd}$9`WUcWb+} zb%0PkV;(Z)Hun*LNQ#onhV}N zqU}uxYG{3(1;r{9&m#sLz7Zw>>Ytg!n-@#b{sg#3MHI6w-{Gmk2JnDjek=Eeo^$Du z>Mhv1MYpWt!q3dxakR;V*;ghd$a$Im)j1|nfyZHnHgPu`*DHSMjx_N>PSJiNAm$9T zk!nr`FK<2SH^L0q)YQ8!x3c+eO0Bu4?U=N^`Q-4Zsg0723f1FrAFV;*azvV+msFKD zTywepManY&a|$!h5~~Lx0tj?wYRA!_UWHF`Mwl(kgZ+TMgj-G4Y)Vc2Ui2uRRPj>( zxf@{&uoSLa=;L&f?XzG(z?M0iIEzYa%0vW0o;zIiOg(N_8Pi_MM1-xJBPL=Q`KDk~ zebyKmIpjYuN{+$X6`;zge0JT7pO^cIVTy5zwTg+wpr~dLh_p9xSB;`;cuYx-169Xe zAU97+70BQ(Sjf~E^o@A4du`tK?fw(}w6lk(O|O(wlnfr{7M>dRmL7E-y_uom&B)^B z4hUB~ug9l0P_NdLh)=t;){(38b`iZL&N4b!n?6S!r3^N4qv_~Q^~sqg^Qrtj{4K?G z`F3BXZ=ATwvLcwhyMYpmekX*Ojq_BmqQjm!4=$5b6H?94^@we5ntbhk5&x6-tEty7 zBCx^0iX|f####|BSMUZTgf5e0%_QcJJqcS-c@=v5i=^ua*3!(Czoa*OqWEP-rWk0y zQ9>-07(^f&Pu&K1H@%j(wnC}4bH}$zR72z+PbW6T{u>PM#Zw)}uKh(UKti!Ly)@li zB#02(&W5_|?3zHLEKZg-n;#TW~Uoq6yvN9s{#*8{ONZ6&#xjq*-jC*?8U4cEnT-Yy7; z)`z=15_sksw7X7bO7ccnGb(J|8@hcw?M!`p*1RBC5*rTfxUcbx86zqzfJ12lYxM=9 z2tov8!n<^nXdE#M(yZeYC2ekR603yV3J_Yq$iQdiv=1fU+tg?%s|o*DMK6kJa!lCy zGox4Z3fZ63ksFu4+J=CL#qZS37-(z0w2uOlxsj0cIQdjNe_Dh@l z`@WVt)8Ea$v)Sjp$e3xbX_%Z*1yb7)BZWb|x51X;0qO=G1&IpA(O&MF$Y z-*Ln?7DyeTHUpZ+dCnW5Ukj&m@5|NqbY`QO0^$kghQ$O+0xvOA3e-$(L`9!@e*;IY zoWW5FPt=}a-BzC?vt7B3qlZpMEO!di(OBRawE3uSSYa(gsod>zjs#3o5RLD|#o=Ms zej|+uV32nz&dzC^LGDNz0Ee3GigHCBqgju^IA@wKsz!uC`kyq@tk8PDj#>n{5usMvl+$58^>ja&^Y`dDLYL&3IBKHp(iZ6wNb z->y07ENy~n%{d}hMz<4U;Kt-*{VL>g+G5h>LMx!2 zaC_#?IVz@*U|0~@%mQGq!p65sgFW76a{|6M^i!uCphTSD1SfjKP1tQ2L&PTBrP+QX zDe@-vDq?NUk$VKp0D9PXxu^Q=Dvjjuh_i3xm`4tP{_&FD3?LP=C1gY$#}Tt?BXz$h ztB56F)#d3#J8hPF)VU`ow2j_Y*&1^TUVDcvVig=~LyoD7^Nq0dbi?G(T8H5L^6grM z#U^Tn+H=0qm5Tp_daFMn0st8m=M!Y5ex{;r!~0{lDQD2|)t3$l8yZ@U&z0!z4u zIQYeBE$;;g=<;VjA!V#Js8(^?GazH}nwvzB`36TRtFXc(a`+lCrTOVQ>A}-<-&*D^ z16EnBvJVI|dl$8ytQ8+KOtQ8<$|@jCe1!MD^gdz&DZ>~3A|s;Z%Vc=;r3vyGLxNl)cLV?d!Hwir!_7k*MES!9sK2yACP?TPA5%2}wFu1` zuixF)z88s{WKeB2l`wC5n{LnQ2gFLS)vm(z+(Zagl&jlf3&Y@o`Cc@R>raotc$YpbVOgM`R%H#Sj9dWQZsU^8PQLCHi7Q zY+HC?s{2d84i}3AzGO#xme|lgfQ71?U_mJW4em0A{7L8A?iWL|d=8C`HK&SRn6fv} zp~AZVMLBiqGH-M;RhK`XaWMgdgbiH%EG*S@8?k5RZallTk@11XXf>@f6iSdIJ+KBLduliYTfnVa-GVg^CKrHP92pD|J^@9|WZ=f? z7(B2d8In1l%yH^f^hnUM4fmPTsIV|l11ngplTy{I zPyx6}tTD<&ta0=B$T(oEzFxbE2K{Nn5r1*os0#!>FJ!Bh#89hOi4yi|cf3^xFg1*e zDYA-tI+Xmq**Y)-5u9eReik(iGPBQ|FRfw1LM*;IIJ1Q#6Q3U3Ui5?{ou)vG(1K(TB2yL7!f>YfAle_i@y@OA`uWYOTkhRrnvM zWEH+EYlc*q?~WyuDW3J2eo_=-&`&L)AThE2znYJ;9IWp>W0|io0IGi<1%*s{o&>_$x3sh@=r0V@4g!1s&Hi_P3Cg_Zyg znXgxI(@S^VNrQR7UtBACmS$Z_iRx8k-FI#Z%O(8wE#`{%0u7_GNmdzdDCGGL!^Sd2 zJZaVGRzZS`I9^$kbHvY&0D|Gw4nWZQOU)|ED$#fNFJg;y44*y34a(*Ez2M~UGplIz zvbefChFprthR{9QRSdP41+l#w1d`G+W8K}_cn#{5dX*bi5Wb)y#R) z;M!Hp`l1ulNm%_xl^WTnku3}(yzhFIpbW{r-pQI7sR;}(H~TzG#LM-w z&|QcGfjn{_0XqU7qA020T8-E-lfFE~r^G#RSF&l0u5WK8akP#v#4rqFgd`h~c23e7 z+gtD(o_>AXGt)`lj3cY5>&8~-WF#2(QD|+e5j$=TAu*Iq-M5f@9K<*UneD10ylFGl zEhU$+=Qhd886@8FXvFvs5nGlXEn&tcsrfQP)d5e(hjE)Mld|gG<}a~Y!~)8ho>dMw z&CJJ%_xa?v-qFc8I8G3euWBN;=aP73wL_)5)$TfTUNUF)_6}dlv!n$fWDYMsud%N3Y020Q;Gq@@yFzvVQ%Y zqxc`smxDF=(g#Mj3jm&;44wL-=2& zx z7*SI1UFVP!iHv1b29hv!06sk=$gitcQ8?qK0tyF#)Erp4^`VZ~V#d(`VYy~E3&^bs z+xe0H9JEBfd}a|tJ(1bK>Q5A|`dMsIc{kW5wS7h%yKafP`xIB?xhBHPV`Pb%P{ui>S6x2~ z@W-z}M4nieNmojHZYLUuHNNYHN53IP2f8@Z1d~pYIzlpHN=co0*dBarP635;!=j;? zEa^;do~pGvzKl=MM$dI&WSlZH-DU%oF?p-5)jYvnF~g1_(HnVJ?6muBJoj#Wj-JX0 zNU9FNM5$1nkP!eUps9WRi=J*0vx{`pvg@=c*y~7(cF368knNYwwDcz%zva)Mh5%Oc z^T3XPKG$d3wPB176VufX@QE-?EkS9(kG*~tdSe)YRAJ5$8&loA%m9s+^)FUoTEN`( z3sI6NB1m)6h1fZl?X$#G;X#Khu6Vohmk>PN(ByNDQoRaRhDzR7natyCt}qIvE)t1Y z%iq;n$2_>(x$or++FzN=X5h=*(}X%$@iaWfXs}_ge-U`=0vATt$~~<~sHoSmPmWe2 zkkEF;vll8SluIE1^9Gj#IS&q4`;8b$aTnpSvJ`kmC9_Ci)cIhJ=6WlC(a!a*m+P`$ zQ!D6V%mbre+mWW$_YtlmUOzvErI68jO3{Vsd{*1ny@?$s1AbPJ5fFnpZ6blu*J2=G{)GJ)vNpi zKM&-Gz$mjqtyAu*jB6tVLpwlxz;xFcC8(NIEzULZ0YV z|Dq$ly1U0jhSke5`%a-|f+9ZgrM;)4)~C+py)_)A$VfbjWHr8it)mSQiy}>m>MYGU za-nIhk%*s;PcUS=>u9M~yZtL`R!VHg*iYs7YVkT6%fuGuK;xw+s>l@#!iYvdHBdhb zAc|`9=7!Ce{+0_KM?W~-kuk*59}%*~vh56dh@7MC@p%jP+&mN{YuDvNBPoOI@L=o6 zU|_%mI{Z{IlR*_ed;kJzJ$$o$FWjv-j47(6boJ`hATd`vSS;^Ff#$m-_#o3F zHG0kyA`YK$n~C0;SeSN}E{7l2YPt0{jQCNJ(+8}6BQtqUE@6^8+x4y^;KQX?K&&i? zb#2TrbluM?!G0BCij7}tb8i<0N`DHjP^|fKb$q$&kQlu59#b3AA>om}KCHHF_&Ny46#dAGsFC)-2|-KFWj9 z4%-VbgP>k>tR;iqhU`gq4zpR_fdd(X2V{2R;LG=dpThUtLwq?3ix6xQAlTSAo7TGs zZYpmUrhMM{M#OkL6^KE%fQOp7VwYhDGTu;=B!97w*+3eI2eFn=)xQYNcGRLnDa|UZ zMc8AaM6hHe8mL!sFQ@sX$CqBYqKGI}tMCrid9;}-G9Kpn;q?Od`O-?Ol%jiBmuOda z#2{Im@?&K-ahJ_2QONVEp2U)?5o@cU>hgUiaB+@Yk{DR~h-3w-cCMv9yFMp&tmfLp zx-;6k%7O_I47+AhA`z)0XhGi56zci#hE>Gtpw2n+!T8eXOc>fgF3^5ytEj&jiLDzp z<{7B;>1?U*+ir{TpdcS!Kek)$00)X02ZakW8I@N3ENVPSTne_tI+0Vh2oVJ~YsS~B z04m5W-_tk39enNJAWH-SL8BLiuFQK~DF@+1j~nCU!X9|A%T zI@I-hIS6)WZ48YE3zFbrM*Hl_=|{~Ann6qyYRIbdr4OWD0B3N%S;e&~Wsfu&>lXZ( z+>N?5FwjTDDoG>i_>xtGhPPKCeKO%>Gc&40Ow|?t6zHrE*46>Ig31T4_ASgq7a`g1 zE=qrI1{LzaOdSlb=<@g5{c^PZwGZr(>HKJ~ePXro;!-;H`$a$chL6cEeeM8r4?V`+ z-gD`0TKpyB6)`%n_@@%KN$|%|7(oU~i#kdHtj|u8qJGX1ioXus=5T_7kc7AI1(6h* z3uB&GcT>!Ma=bs1K$yQ(=M1`7I977p)j|E{eFT)#4se}*v1qKvi;sgYic(z(OPJ_S zU;^&8-1cxow*BVRVpK9%Xx|IX{+TvKc{Fi1%0>`bEbU;Cf3ZsDM8xnjQA+bDN5~Rr zSZ?q7SsWqWn*Pao7RZYu!O4S3xHr{SS*~N5N4%6~zv!qj*Oa-iM%C!3cO4t=o$Qph zW}YRCHl=|)3I+C3M}|v0bMcy)qxnVvV_}%Kac444?P|vORN|sREmsK-9?G`Y%5{?* zBB-w4t_|-X?kNIRMy9}_@H&U1$?&ZGMsXy3MfmsD-H7~?5s-0u$lld)cj1Sq=kBc; z$$J!Wf#6LBd*0y#5QJDd_$~`}!d#`7zTIDBs_}gGZT*JSpZboNPOg5GJH)U$V*V4I z4H5;%UgDT99Ftp0a48+p(~-|X`=t$gR69`WPri$8ik2pLUX7PR(y3Q5jqQXi{@#9x zN0(MI^87@p2%xxUk>tUap7pbkY8o_WEYCvy@PY0zPmv0-ov7=h5RZw?2=FEg$~M7i z56@5PTfbc_=8R}dWJ}h}muQP)T`*X=-$epCV!zh2$2RbFW9vXvF>8P7D>2X&tx91O6@0HG_{(f zv3?d@Z+*DT{8GcJNZbN?)u?VP1nP+CN$4YDG2u+l&=%VtSq@G6SaS$CB*$u(M0Y6@ zqcV_anpwe%=vF_A<_7Z48LcVb2x6vchj{2;%EqHMlNyNFCMV$9y6b?5qmImOi zzMj@G<#8ficT0OOY#UuqxU1^Yo_o#uaCF4w;9eI6Kku+xEW4d>*dK+}LH z8+K1&HJ0ZHYhK==&*zJ0*HKODG{?3XnWfGd4vZvWpIn-oe=&nms;Grz zMgvM)n;m+Q%-!PYFj&wH!GVg&4HpJi-BnQ9`vZWow{nJ%1>c@Tb0qNO3p0g8;J%h#1Y!K$&5*v^T7B6#)W814AwtnG2EkZd#VK?lr&8 zG}egYq28mLAe=*m;e?%;z<8o)M zFFu9Bgh@Gd#V7O9pm6}vck&$Svro;rJ3cPgp86Y^XQL9zShIN+Jpk=#yP4Mme}(!N zWpX;#3SYDKUjM1cB^)gOJLow zN+sB}+z|81z~Xupyy&=|f8C7;3B!WayhMj@vqN)#wVl{4Y8Tpds%sOd5g4U3d7}1N zGN=wi2~aJsdyur8{YFM>%oG{$)~oDgUxEE5$Gp1BKGAAo#D4ENCwNksLu{W;l!Aaj zt1+>3#DeeC&ytn``sDHg&OMY0r-4|nk|D-G60-Yb&91~xBr=L$+_;)Uphx%* zoLj5{$JL`j4Rxkv?&|z#K*0}2BDB9q_I5QAHExljN~yTh)4C;*|Uz`c=He&qyv|j_d*F`DyHi@lYHArS43(2grC45 zso4m*+G}8{P+q3a^>`gydIqPNwnu+mc< zar2lcb#Y@$A}&6?2^jSa3y>oFV?g#+zH53TQwITa^`~*j$ZoJQ(K@B9?JrVm(ooSt zP35TlO0KUh5f>r%e!q%31~8%X<4a$|v$!}~uu-J#`ZR_qC7GjT%_=uIxapK^IrIng zs_SQAS)MU^_tmpWw}u%FPg6Rtc3KdvsofhNO*X%Y(L8rFJ(v2PHl;;?!p&YxO6HB3DMq!XRnpF% z_Fl{o(Jst*%bcT_o>0bU+Mj%=IwNC8hPxJONLE2R+?f=ZeAh65W4(9Xg>EFXWk;8F z#RU*vRIk~E{V($PGzHLdPl6X6BUPLaC5e$5fAK6@K7ta1tV9NJ1yPQ3w35{0)zyUV z7XhHLq0>L&I+sDbD8PHtgVs|!Gix+S%qG|W^qX=ODA$~Ctyw>`+;#fdFA4vfDke!G z=SO3VrGt5vJ+dn*jyhe3@6h7jupd(^!XUuk@pd`9VHQKe8Qe(k+Fyj^twg%frcCrU zRL$%wUe@H6tQ+c8WZ0-zQnGNjWDYqB=IHTP+SNP{olm9{{;-{*-@*nScA`LGiiCFE z-XzimzMNWfZ{;rx=!F!%TZjya-iPQM6>kBuWsU87k$D+_!vtq?sp$1-C+?Zd3Vv(z zI>A-Cz@q2NWit>3TqiknzJ2{H@i>V}W^P!-wog0&HnGJ2+@0E0e9tg{;qVis_&MT{ zc@8Ew^<>xB7O)(OUfTYLzJF^{r>1(wd2`!})xTXw{Ev$Xb#S@Kf!kjcGm=A&^x!Yf z5MMPCCi$}pzm2=hYJt1Z0BO`bOU6Np+e9{!y!!3ZA2EMnMzHt{goJWmg?f%>&4X8C zWgtAC{N)2lZ{s9#ZgaaFYHcoi3e^Z1HqwBMm1$ArAh0Tc_-5Z`&77B%B!pO=X`0P{*JlguRmZ61hH|uEHZ*bqZPsK%1MkoaCp?;O&mD&eif7S4F-uCXKTx z#$6qE?R-2+abUd{Gv+Up(CQ`7U(M8(*JdsiW?PDk5N1u2VxnQq$pCZS@9d#<`XU;3M@amhZ6mzyf) zdNNf_38NbJOiDBeYTVl@CxE%W;8L2=@V{7ma}7mjtow~taY1`43#}lTHdj)M&)Ljq zg7&tjm2=m}6=7-;oDm8Gw*TM?^;*3OO$`5a+?&Y`dBy<-ly0KV_Aj1=7)r{bC6RMP zFu`(`e-PVa#cchH41WT|vLo>`oN3AW{{HofGzNr-(AP9Rkpi00AMt4I%Z5)4$Bh^g#! z3~}OApZoqMc?narPXhLwfQ_$AnW8SgXCz1YEX)~r+kUcjSZsPjo3S}Fg(a|Li=1G< z+a+->UC+WO&}d*eBB6;=rG6Gz5}(^pisqjFmihvsCOt^rp6n2Eu0x_1z$iRZAlvNF zDh@AH?5$c2cqHiGpVW+VrnSQ!+7dVcbVD^phSz7SD1K$l!QkEU$PIk8RYy>-_U)!K zhk6jTQ0{5Y-rVQ(g)^t8=8<7a5rZLJomSjclk1Hk=?A2(D;o%T#^5N-sM7tSi+Qo& zM4=&+%=#N~C$WGA<6?Cpbn4<~=(!GG-Tgo9&fe?`Rd)E8>JgUtaO`x=dz}rh3A0ID z9VxE7-Ao(Qh@w%^)~e^WoS5Aj3&?$ADZ=6Ccv!ioa}TufMe-vDqfU!qm$)l?$mp!- zw8We`G9dJ94XTRCccS-^L9Cey$czB=dWHyKc_9g5#6VafLahH)Jm&8Xa1U3@sJR zVm6xQeVzru!y(Me;a$|9BW&?7G~8qJjZ%!V6ehj^OxBnx)=l_=ciSX4NdO0}5-qh0 zLT)`-6nsYOk1M-;*zwno82K~d=HVW1zceA? zj`4&lH2Xyl9)bdcVU4HaYS9z5*(VbLJszleg6N@Cb6IRVDH0%-M*WYjtg?X$%B z(H)R;lpBA~Gnbst5k*U`aaAPFX!fUrWfgHNlTLsI(WlpZV)KR!t1xyw?yy#I9&Tq@ zFnzWu>~++9Tp73HkMTOpjqmr#!HpI%*hb!3zZcyf?awKyy%&}xcAl7%=v(tcLEm_K zXke0%+>d?-;nR+lZuC|sK#JUVS30j z6%kn_JY4NuZf%l1bb|61g-;)|HvRkAbzDHNV!{?H2S2Di(~hpOD0T^}*km7jJ0*j- zL#~_ zf~$Fz`}!M^g(JrS1Y!+u?2EM5;0e+eC;HW|BGcfV2j$IvQD3X}8GIbVWUM>7jGhh7 zQ$c>Avqn_1G|hUOu(;YU%>*QKYy>;M$hUc9V4|#C%g(frb`|r~3=9wshVwltcV5;= z5n#x=&qqN^86OV%Qeb=!g|rIhiF$4MQszd>@WZ1)xGIab8s;K~_(qBX=qPKY7LRNDE$alnSy-Xz!?R|R( zXe|Q9U|NcCQR=33iq@}%9@pi%CxDQYAK@G=y`@WtSG`Y$+zbG3cO5#CLMy*y?#6&` z3Bx=BxrNuU4yFs9fK?CHV66R7>U}acOJB7{&_Ny<*Qv+85H4*7m0zf{28eFzUqszN zMa52Rv{`(>z}6ZcgiRt~o00LRr$NzmS3%@fqa0$jX@C|MVvpu);4(!%!d)g}YVPU= z<0+-Jj1=E~qgaHJ*3vD_u9I!Zb5FS}g`N7naH^oHvSAaYsC|KCk~$6zxtKt zzvPXsUP(qR@X{du+`nwQ_7|mw29~_%8KfB<6DL7x;mxuan3=3&OWSm+qm;LJI?Ej1 z!r>tcwu-8C%@X^(crPZ#5meA9)`}fY24G7WSZvGfIu2E`sB>nGKX9o7h$>T!N*pWR0go# z?icD&@)`~cqjS&CB3=LnQVGBo`&FK>Wl7NTB;#+d$dXaP%69!dtyQ1Ij`nCyqsFJ~ z15a9X+14&=XeSJ)bw6Pq`O=@LtBPSa0Ar(L+n>m&=J)mgRzd5_c=EXekb4gIgo@`8 zDWRUpM>oMGi`rd!n%tW@%EiR#igt)!Z2OI5wKzGSSIyYqFY+_tQY=5)i?zzvO=t)X zlF63>L;0(VME6F-;Bne#af8W_Gt_ME##m12eEVhma%y(JY=>Qh+wsd!PprDwK5P&D zz1mF-!HA-T#GVhYH)C*@+(D8?D7*)Rx4#HLhM5QT8%BMwe9xe*#x@QDSFe)B6UU!5 zy9M~-hShUKN^l@6mYV_lipiSEcOXiTc&!1v zn0l39usS_6%6AmU=$JSTq^SPguEHqdWjYmt(c~{)i|X1~f!O!d9=tY}nh#IIOUOCO z^deePlLs{mY6o>z+@9pCGNEeDd5JJXc7`daR&za+X$hgh=y&!2A1I2}G-2s_lO61~d zkwMpIT6+avqXHSWw#!~BACf;>E^o>9S#;ak;gAcho{igC>I&4+GgO<`tMFGr6GwNN z?9do#Ei(C47=YKd;>$1vO*Hg{)fKxN^CNsB0mn$CelNh#xZ3E_OniywH%B`(aObk_ za4_(Y@5Uo)*a(>pPRGfe!Mq*)lJ>ojeHclC1UZN`90_VIzhYzye`zsQTUNJ)iX3Uz zRdPw!ULKnLlQAizLiapsJR}$jUWnto$2Rkx#U8?C!fecI|3*87EbjDM&|6+}x_)ouq1YW<%6$+2U^b8R)aTxM!m4M(JLVTbKP2>?MjJKlsP-EP`61L%*yio3 zu(12}Tt0oL-c^{zC+?we)mjEZ2){ z2bR*-0hHs^^Hg;p}G3C$%Y~IB$ zJdxphd}3P+I6+pZ-Qz1sXSfS;k5)|@N!Ol6dTSH{wi9Ys&w>vIE8y2j_sRIOjk_!! zpt}$x{Kt6~8rfLsDT&kjY4hoYc|yHg%QFlB*0+&qr9?U~-xQXuPppT>dT}MnW#@LFJ5lr)qg7yk6Hu2UEtM`j`jliU{ zFpenzgU_deHaZMbUi($B19{lxhRm+}UiGPY#k^)i)i}QhaUD~ZR~_nU(2z!y4p4ooNj%~l19F^S^u0L`Gii?0Mgwc^#+wptuc+0Zh|xj2>x^BD zY>xv*zO+uTo*ISB3q#0!-+C3D4C6SAm7QnV=y>>#0RzpVZu`^hbnX$5s>ZWQOrbDL z^$7h)qmk-oQGaNlngp4*OC|}f;{%NYqf1stDYLGC3~JQ#JbcAEiZ5wcJu-ClC%mum`P+LNcAdLRyZ~ZfqA|(&(GTivPJzb z!K(UtJ+>Sv*o6q&R~7FwZ#ka9^e%WN=2uc#MfH4Ni9Z;V{%=T8Z3M)T}B}d7;UG#(d8TEslO4U^FIvJ1N zuQFiJtt;^4b9oNR#I;{|F{&FQYUL@ckiod}P74F&1sT_CmLH7|LCA>wS$=y=( z4w=fz1$`XXp;b&Ug%5DwYR`#56 z>pW~GzIaPA5a}fq2jN(qd8j`$0Jf}#a*nPfeAJgFczM7}?NUOqVXGiF8RM6@t2ykV zraCi4hNiULFG^L$@?5Ug-bLoo^HjWXH{(#*uHq&5=WEbShXd-zcWsB*p8})i;}Wp8b?z-x9_8?vQIaTS;-{~T&2FlP|4aRg_V*xKY#G+BQ`kRK zbm64`MSPKZ-Hkhh#QH(vuIxE1PdPK6k^UDcWL!b|GgH}sap?ExV=|4dW?jWf9>k!{ zvmBW?Tgxpe`Gy(UB1(p2$$Vr8($eJKh~9b|hjb@cPu1BWdI|JWp0WHoS#{C|>LMvo zoP+ioy>!PjCtMlsSJ2i>an!YG4vv)(VN3-74Sr8^&{BRJ1 zvR|}}5ZcF0(uk>=6=8C8M0`NULAM+O;58pFN#ouGqw>AnHc;}JQa)WvY&6A1{Fi}4 z`i1o>YF~yahKbEDQZA_-so;`JKif?8CRaf81C%X)G^Df}XjJP{c2qMF}kX4`+I1YB$s}4yT)T*KrusR#7d!b*tT^3=&@0 z;Zi&xd>~878ps2B6}I8_y!|rEX}A>%PFt5lPt0W=b@yL8BMnAjb|KdKCNnORjewiC z%{=m1_4%pXXYLTjIFFA|D1P>mU2{L@y&#(4%%Xib05aG% z)+s(^QshE&2V9XTnF?z;K1H57gV(X&YY1fYuBHfCIYsnJlujnCGWd&T1KrWA3SoJ2Wd&Bu)YSb!hZ?_@!|yb!KV6brbJb=J(H z$2OBOhjgAy6~zNQtJnhi)fkx!2)W3H!|hBB3q}IKXHcb%UG1#k!FL#K)QPLMHw^)f zlFdtLS?9ab^ciJLC^MM{POzbINHkDiNnX3_AOr~n$Se6p+TG4`#vo;UTy8`{qInt3J;WtG9ZY@Wwe-Xq*y>{YW5bfOIDIeq7 z;)+!`)$v7h(FzZNAkP8~6&!Xbhxohdr1n{^D4n|#X2c&#`US5cH< zFvwT)cJ&&en%WYg10b`lCe-yBufVx=j?C7HrycU^R`K=O_Kzq(=pDrW*W8Vi&u-gW z7@3&2b?zNKuN+QGdk|}3SY_jHWcwTZ+P)WHT_)q;6Oa49O?NZZ31A1`ulZ7>m8T<( zG7(_Tk&98wT~|Qxg|^nuBH?|aj=iVaS2m}Nw`rGCI5G^a3up+-2bH#cFRobWlVZzm zG2}BG@*rhqtbW?Sf3eCvM-M;H3-wpJITBx!zR_Uno5aKb!BGaj_%B{iRDfGkjF3_4 z$N&#uG;~DSomdxr3Sy;eNl{w+;`j*|kF2X1jpw#k6dPTE)0~^`v(66HQd9*$6uBPXL}RSus2MaRu?3QKi+A3ML-3^?uRi zNg3di%n6ve^lDmHHPUw-r2?gJf%_$M zz?^b6>s7!34z)hxPg)B2%9CVr&ZbpSIcqho;V@bjjJYQ5%`OI zGcvH2Zk9WPX;JpB0o3jUHh5}Jtb+C%9nfbo;&VBLr>h)f-^CqHSBv_oc{9~Me8D^m z0wQ6QL>1)6J-J^+W+_>vq0Qb6PupxXn!@x{>t2>tKevD#xy0h)gw7!6PA5pET|bM& z!z~NR_2>EVZlenUxp*%l{T7;=|NitPI4^pXfs84{c!l)BsJrM?)Br{|h z3xQMR)Vq!$h?vVlTP^SHYVZ*{oDVFej|{5Y{bKeW$}ha-oj$D5FBFZSoQ(NQ9iZ#N zz33uQC7`dLMVH&N9I-=Z*J);{kkGL7XJsJmFG3jPY9(SXbr-ft=AtskF=C|VdrNG0 zm?B7=i~pj+rwh1(_sP_2-z~gQ@bWFg5pn`PwJgI*;F5s7+TTYPHW6?v3blDJ-{UpM z?GPC!&e3yEgB@fZ3ctJCx}NAkBnRQkXarq^+_1a_N$^mLaisrZ6|o;x^}UIQS}U0& z56PNeWKeBv+cfX#273P&FkwnN84EFYo{Gbopa}+71lD?cpGM{2YBupj#5DU#Iu@x) zQ21+orpbMzw`eDe1No@{Acb~6eTEL!o`6gDCPLc=akeJnR`%Mv1$aZQ+oe_$#Oc z?)7b-%6aU*78c|rm@VmQ12+KB+h?)W4^&k*(mT=4IUvUq{`@T$RLhE>v3T0Pw#}R) z4MN_dU`dy^Z{4pFd1u(eb05W~oAa{F@a%8as#+DWk>E1843ZJO!_{CLeheKL>#uz; zEEFhV^cKG6r3ktZg4m-mjq6w8TFQ}$gIy2;d}}kFBFwbaq!wb?^Bb$_Z$jA)Wu1^5(7hHb#V79K|D;Z9V${-WRJgmPo ziCcJE%v|j{|9sp<#64P8B}R=_uss(5bh_06xu=y71Y_oTygt!!TKq-3@`h4c-ttT96Pj-p2 zGK=@)Qwl}QL&{Xne+XxRuJeylsLi@MtM5&(9lm`#Ne}?-E^gY@{Vk)x3#eCdb`g@n zb~!Jc));cjtV|0sV5!Y9eLFrQ2s~{~-ZcF2zC)LmAKvyg^VTYAO-f~ksyVwnqIf!< zH0wlx`n&)<1a^#yg;r?nVl%Uj(6SVi+I#n1_03l{EzrDa6XoSWgi%BCsb@TZu)Js- z#(V(yyL3JpKY}y}MP1vzBSF#qevj$@-8~qX`y$NMLN`-d&i>&f4GU|iPsY406a_rBIPMOl;mn%(tX$N7LMiDh7HiE3$6%b*EUP_64Yt=%qw`EVB2EDHhe zZV&kI4o&@w9C`nF7t?U8RoB?jW(v!IY*w3N$^_rcEXW+YoEPY&t1^-dj_T_4c6ar& z&B)Chu-RR?i`-Ra$WxU)LAy!HOUB3OxiD2#-0s?Z*GctFhY#wsr~{%{oMCO6hm z?UsTXp3XS+|7bWQm~wF=`XuCtSoL=#c5N_RV-1lEUNOQ?ow!APB-FL%#h_5GHavM; zCvGYHx`zhE8)+djWqo`9%0#Dk+%@5lhvP!e`IoDwmD6a9cpL36(q1QqGQ)1T=kZI# zal+Pf{knYXRZ_C*#(mF)((h(gm~NN^vDOFNbx^$`wd+!kLIz^aN5uw#ubqCZ!gr3> z3*g1g3%`y>pMP=;5|zqdWEiHyfoh9LV=>L7ov}LnKzI{dx?Y9NGboD!VwY72H`ZI(&OD2a^@igzZmJ|PUi*tUrvsJ` z`g*B_Gi1TIIN=&#LCjRI!jR2lK)+{Sn5S?~Hyug~=~TPO#8KWXOwiiuH)7}`CD6`O zyUc^v>-lO;f~i@1?}rn@^&iNNIdFH!85ML_6n&t(w~$drLz| zZr}bQW;Q%To^+f*xk=yk*;P`FV{GA<BE^3Pl8gG5?B5Ro{!oP9uU7sXNdBGOEg)-XK0TFOe zk1D9QWX**^lS+}5u1Z&=d4DrQ1pgu$05wl9X zfDz7zF~})S%0R@Yo$Gm8EQrP^X@VkakP~Ld;&%9*qPq|;F28Q6%;#pJrH`-1 zuKUxF-BTuUgWi*=;yz-*#}FY6ss6502OlyO=ee&jwHkr4E=`b=H)1hw9I-;}CM9Xl zF5e<%0UAEb?QLfojK&xL2HZ+?cX@IEV#^w|vvF`NvjFcYV&TVTm`=XO}2dRn5HR4$IKk)G)oC zd;u316&w%+23e%e;Hl69^C8a9w!m?pOMG)Tb=(~Jd~`-K^ZHk(#ALyrrp zbGt9#FoLl7$WOj&*ooG(Xv;@tQ~MG}Oa;sr+LuQ%P&XgM4o@jwyzR3{>+rwgWt{Uu z@um@Evy5`d*oJx)4PlK~R$FTol9B_JnEs_Iu8nFBGC*dH5P_-fxz?)3HPr|}r7vwR z<$7_#DBG7uGH?~+6jQ@7y2`@aU*v4uxp%2&<~y=Y;x=#qB*~q-UWMC>CI^W_;t_?V zj-~FJvw~jM=28+SywnU7bneAzoQN5iWhgvYs;vVA=!`H^u&tTT5N76NTFv~$Aa3n1 zGE9e5&CtVfw1HG>E$7?xEhydURrbIrC;=r_PMry@Xx6B5f(q_zy^3Z80|e91CVzQE z7A2dxhcjMtx6BWLt#MgQ#p!;5MxuJ?ou_kH`{WZ0?ey5kY9;wDuatDUFZ7KH!TNrQ zU4~xV+5GpcVyyq||fI;&iNOhwQ2V-U=rF-!Aa>ynryFIBJn^q>YpA&H+M> zcGcDUVp^hW$q8Aj7|WyB4=9fsS@-x*=Rs2*KpHQXA{WE-U?9zOoVK>DkNA{Q)WGrA zoI)meM_>g!(=RgYsoocwQ}Zt9jdSV(=mbl=X}F-y);9x!H3eaS*nCGiTcq9MzzLjV zj%ocYuuw-8faJW0M=oRJT%0V(&5DUmh9F{}s1PRsmu8LO)O$7^YbH7AoY~*aP z9A+-{J3_jA=go~joOmQZ#jV(hi~%g_IzTX!R8nIdd^es2hM5*28kjHRQfD5kF`+BC zm`-X)2Ezz)roXv2+uen51C@~&;<>`yJ0wAjNKEk+ubFx zkc2%se;P)Dt;Gri>nryQEMK!Z(_!gIU+enFye&V7o%`h8a#YyG%`IoNw}snZgiY#Z zLuXhHNP0=y%qk`Vj=mB`QH5^tsB&5-^Wb}72DT9idXDwPIN*Sm*c}|@JjK+}YdLYrT75})M%p)^ zP1kb03aO*yFt9aAyIO7y1X6u{l6_d;m^Tf%&U&UoBi-xhK zZoA2hxJqYYF}88pk%|gc3dJ4&nc1IK30TbTn01^LY5Mj&Q|OvvwR7$FCENyvAQ_dJ zui-uN5PQQx1?pAr3wGO?W|@k5&`3pPs6Mg~&S3vxl_NrrFtmEI8NvIXozxXGM6E1O z{P$;H;;oP|QzE!SR7QTQxMV1Ng^+pE2I`Jutadf=ZCRgWl`}V0AkbtXFfK0aI8UUP zcM6eqcgZ(SA#QzRn)VbH1MiJYwe8^(5jr3IuA*r2j$i~PZNvT`lybB(Q?$yN0f!#5 zK&wBDr@@nh%{Pvwa8qIqS%q(qu{zR*sVro#SMvqZdvUDWeW9;K&ZC5iJDR>0iyfFn zsPVmnqGzECw-v@=%(I}`32w4QjUhN*`z#0MW)R4zAACokNCtnDk0!Qe>UO;f_X?ug zryN4$KCv&Qz00sG-!z^ngb9Q&jHCKZJNhR^WNeLRca6M4Jv45Ib*uZk{Y6KPSp=zp z0CRi)s8&LE;Uu7wdO*_5o2DrQ3t^!nGS$vZ8Er+>cQ$Kkq549%1d(Q3*;Mz~tfG`K zs@Cb4`vtEaNtE1#mf_ykCy^cV6xp+gn6t}^#$U#;7~jp-anmXa$P8axx+tIXi6O^1 z_;+L-?K_ghz^?%pOVz4Zs6f^;HkgLtaKDO5oV0cMj{7I0RiWtN{Nt$AtC((bk54BK znX`+Lqa4&7z|UbQP_H5wv1xO~&3Ume)Tpt}LP%-(kVth`B0AsD^0cN>G&@!g@U~-b z-G9?;?}+a)z$U6iQ>xpYl{9u*mrKtQfSBJKMvO0jyBUC1@(~YwtgLolD53Tbl=C&y z9jK`PnJMvmZXa#k7U$i&LXVx-@?nI|a%feHa?Py$k~OuYFXRH`E%S@e2z(1fs^qbX z>-HC6ztfVyJ(j06GB4(lhLk2aJNNm`wyI`iP6 zYYp(lQp<#{4Ykvc5%nMS*Qg0VMJ>cG4+}n<@q#l0OSal-v`*}awJC5Pzded|hT{W3 z+$X(jd-zsCv{DBP)RWi6fmBq1=`inXm0nrJy8#)0GmRuKs$gCkN3#Jhy1NK+r zw1G)q>wOUd_HP2bx-qvm5nVWh?mj4MUz3jTBF7B3Lpgl zi8JJKtWv9?ld-tT&83l3J`39n{Zlo`ax3vb6oLf6ay=eNZGGf>_V@MQ7i-&9gYJ~U zha$nT<*dflgJrU`>8aeCCmNBK0W^}Z)Fj|Gg`}1cd{LFr?u$3HdzIWW&J9bBH#}B6 zKLK_awTGy?Xh+b(Kn%mqvnbEq3n*Ef{ybd$j($TO9vjxP4_hU>Fb}*=!cA5}G@O8; zc3<2Ieu-w5|6^ZR6XPQ?JmFnSwNkI*;#NKDOw8?l05R}fFvl(Gk~TZs8vLv)z!h@& zMkL?ODAO<;E^T*=;ux7t+L8I%lY2uik!3&HNaEl=lvseWg;@W{2LRdQWJQ`a6qSyGi zc`tfNKsQqlJrG$lK}36Y9eB8!yWyEQ%?k~!0`_fEgMGQms|0A=2Hjrz>iSt2x-xz7 zqb7d|#L9lfXaKz2)~|=e9<_&?8FPg>yMSk`RUNZXQrg+VnIP%Bf^Zg-k?XS$(FMpb zJ{s%x7ZDcFO(^N7J7y5*)q6VQm52LRpE^xXGKzQBZBu1Q7ha8gOJp;gtbP_r-9@w7 zKXdOg*-NWtgCw6yw(NLEakewLHUP)0qKwR(8%P^$s{cir+|ute+n#wxPyyZ^>Jqs( z8|8L)A>}(Bkna46jWk-BZ-bJMnR0Edwgn;aI%HhCv?Xi+(4J}fkJ<{mI>JJJFe=i` znA>}gt}g@dDV$VHZIzXtvO|yHHi`rGb9xM!-oxh?m!;j8JIEbSvZXf5*Jx+e)1>o4 zFNRFJN(N1(wp#v_vFpSXif1NA-y6_IMqebY{junManDTa3W zd;yS1s2^*95Vu>mdv&LZ&*{0SLU;t8m({4_a0>wDiZ<&c(KZ`c74R$xo?xIqrBaoq2JKFhr z6=>yaP~C~sE^U1upf%FZ5eczfCDp{0+#XJy?2u%En*g#98$uOay^0GCp-tj5_X`vs zh!}Y-JKjSZ8*xOApPS3e-+zDpyd3`>{=8iN{@K24{(iVdzc&9i+rRbm=(gbXkYZc`@8iPikcK)jT6229px zMgWP~3cO)5A%hd?eNzxK9c<^7#D7B{0D}6h8zwO%hd^z_mV-Ul`+_|q4U_UtOp1<9 z5y}{eNzAs5COl{ijff$@I=`0?hM==vm_bqXzL0vspiajS61-`{70hWxTlQ}XxAqt9 zpe}oFbu>V7J6!@uBsUavzWz-EJu;43H8cA{0E~eu=AtDED($oERjvG`)DY{AG2Vmw zvI9rsdT(oLKq%;M&*Eco(E;E7U|5fj+y`Dii{WOtQ+m_M;&m;ZHrbx&ctSgFSHXp3 z>%@0!Wr)EtkIVx14x{>}UIhVi#`Jv0BnYu48}lq&iFU#^a+@3K`fy7wR*x1cgo|+m zzO;?5pT#$$Al7%BHyxic!re&o)WmgUQy&RQX!=o_#cfA4QS+HwDfrfR?{B!N+ZVJZ zx*yPEeo^=X3TlK4G;kQ#51F`WV`OE z+Aq_ypcOOEjhjo(i>rns?(O|Zz<92^sM?+}z>C~$GH0yfOy9W}j^`$>vky=O^e7D8 zFljjIzNV*|t^f&8eb?btveDp>z1a21eM!wdirIt5`a7a0v<`lr$r=(7q&8G=R5@@Y zX>@ybDW7vzowdp0iICoO2&AuQlKt70%rT$lQL;Ew7!JN9R??_)9k@I< zrXrY?sfGip5v^1Ermq=mkAJlvomPw+RDkjhjcQm~y^8Ys(T0ik3}8ggD_GPE}$KXH(*OaCl!ofDiHo;bU_0ujr7)V?B~ne{5T>r!iV$TDWcx=37anWr3vxgG$Jq)7A~~mu+)f!B3#!-Xx1;!FG5lxEMkojdzpJ3 zr(e%JLnG8(Tva`CuZX>Hs2cq(b3ES_W;#__r5^vFd6#`$Woh&oYLZhYW6B{?GCO@kEMNyq;nbXP- zdIGC9e$X9b`YR24y-KW74CVg6j|HYD6cG7D2eIad;`+t*R;jhLE;661+lHw#!dpAz zOxMP|Amy_fb}Byji+=1~RRR<0>qf;qf~vDS6E$?(!3A!G$e`Vw?Y=xPnR#_n*-Rwa zdeZ<598K9&-HBrVGQ)&*X}oB69Y-zxJKP~TK-8!bFGs8%Odj*@MH1f-YCnX5lU2H+ zzWj{yjo2*- zGx_Ix4jt*35&%+h;4NAA%MmzXS?C=q;GkRR$qID#Fd-P%xzwK73Yg>!p3N#+Sa2=X zn*r<2Ut96TfQ3K3{?$Uad{r5Jh;u~z-nu9vMJVe{Ta#f<^$86{tn_%;w+grRnE^OPG^}E(BdmKn?oLU@=DZ-VoAZrm z?Gi)_Xn#>8Sd0#t9p;sl)*T>F&>2mHCTcnhbggPV;JS?-*|#41LJtA=$?(#UkoAxdF+xM5}!kVHLs*ESw2tFb~xM zg99^H#hE&X$(%FgBio(19T;w+1(3d}GK~JNpG6#@YCPB%$By^w<{lu^paD^;K6T;4 zn5ZO_hsA0K~(9T7hml?)pJ6TF-{ zNf9e(2+_=vYpY>QAOU2nTpTS+yQ)J+;Xz=rk<@LqkuuivhYoLYavc*2j9aKy)G zvQ=s-rW77S?f^>cf03$Op%)5eZf|vj`#-W5aCps!=e=*p_=B2ob?8XWShGkwaT3vt z%6*~0AoW4w0&6AvU=MZ&cJc7$Fm`TlDI^GqrukdPK?&&3-dRI);E$6<>rH^eynh90 z4Y?!t?pd1{6tp*}TN2yebq7*=*&%n4bza`FY2Gw(RHEWh8v}GcbCY0da0`W^^+f}&8kcu%&nQvMKuN0-_c+I4yP5T9qEs;g0 zSGoGaC#TOuY5`Nzq@8t%8^Vx-2_p;Jm3b&Y*)JR6iS}9dkYKQ&JGp`K)o6!_i)5zyZCwTS6C8hd0Q#5}}^gE%lavAK#@QlTXo=y8YwD z6#(Q~e@j{t?rj=@)#;GST#bYFbxVh8em+JiZzMElO%^|ib8(tVdw(#|rFB!(VDZ15 z&IZM$JH|&SDlx%is;JY^cB8auWY4b7Zw5KSKSy$#&3lc;wLQN^c)J)Y$-grr#+^x|s$i)-EcC&6 zJgCN3pV|OW9%|U9x-aBw^&R7@+1(^nll?fgwpaV_-2^sv2mS7%tBUvRcAnbZ%tUZb z<9uabex{)y$8t2th>R7^c|r9=lV%wyQ0a%Z??``H$TtCK`i^g;sVoV6(C9GG0 z=*z%$0rHEIEMU_ZHEDFRpwO-YzlVsj0a!gyIcpTQ;x&)c)|c0~KuQVr2DHcXEQquw zOoy?|Z{fAR8O&8>&PpS;`XyxH#7#=a%v7v3=1dHbHH@Eg?*?0S>a}c)RG-P+&Csd58dpT^_nsvliuHp`85DrQp74x2PmlOgS-Pb+~Sj{^!dSyk~n?{h! z!ELOISu5aTGVGRxaZClOyk`C9E$gW|%55D>dBj!HDdoQ9uj#e9w~Z1F&|t7`{foQ_ zq)gKJtdd@)1||bz{ej+T$0tNDZ+?rWkqjJ!bAHp=MRktJWPQIxs2*QFEk311?kwjJ z7NbplsH;A1kPuB18PQxv6(ZalUwn}5DP-%Yrnu)Ob7OvF6<3SVrfk1cgI?hW?e3a- zd&VrC8S{1*5k-?r6NR~v{&2kt?l13TP-?#EtNc0tl9~quSD)SFVe+Yc2BX?tmAc_{ zdmRdib03fRw{00P%ADr*_H|3~i1D$WT*>V(0_2G6fc-&FUL6;zGi)-~C?vgJg+kus z!SC8Jvul5n^Kw37*6<`2&#v2f+rM1CKK{OJz7CfcUQ>sczdp(H*Vp;u^U{6=5H{Ec zKN#qH^2~d@J)9Rcl4P~L9gb-eDn-z}=k5)gEDQ?_@^`f0a)%B4RD!_8)=lN@WX!=C z$IPJ7x>wB&%sr`8d@9d`EAZ1J90Sxk$#}fN0sxy+j?%Bi%8)zAU3|;9yuJd%+zh~S zU*O7dCT;U6_%v*Zqau?&5A$Y{C|bJ=FLp*XCWL@PNdo-l_3bT5bIk(Prj^(ruGYV3 zPvUzw`R@x0L{khekRw3RjHuX zrbDv8Wi;ZtewNTxWbyoIyz6A&kv!tpq~lTVE`pGpP+~ZF=4)I>u+U$(n)1DO#PN9e z{Mi3_`PiI3UrwKg>&qt@5@*Kk=jrgzH}I$a3P>g?yd;DZmmETU_n2I#Z+&m0+Ytpv zE~bPWhL5N(zyS%!F<9Z(tAI_mWKE{OO*V8E-^7Dcy0hTp_C1~W;y{29jHar9%-$e? zGBe$>I`3tj!t0P85Meu>+x{$H#MjWN&S;t8flyJ+5sz8At{xqUlF3!e713hM*+OR*ln8t0iMKG)muw?f?Y|dB5G405I`_ zbWE%=j16=`;|H}Fw)L~{Fwb}pILhQPrn!*_DxF?k$GiSnL=D1=G?P-xVmTvdjzyVr zyI;kWW4?(brOu1aAL?v8u4&241Z`_sSwfhvFq}ax-p&XGibrqPCOrs z*LS15@&)i_!l8vvfur&3+kMgB$haNsx~!r#W|7wzX$na-Kl2FdCMiM3e+CmW1kO12 z6mH+oLXyfXQX-^sYA2k=x}23X&+X?jA#MUUcQ+<*ayyrt?%xU4%k&k&rrq6}`@~0p z+LJdekZ_Zbr%LA|qpw%V&{xJ;5<;~s4y}^f*CW7r-3kO*w3@4ASZQ=F%n&L$w2LbM_@&XAq2>%t)Ua{~nqUFP3D` zxp!mT#;aH+jCOjiYb4!e4j62vmeLj_2d4pMjI_jVq23q0Y1ytwn>^D^=Lhk`xGH3g z@oQH}A2hXtIwG+#QJbF69ZFfzPE0^=5$wPh%CnlB5G{s5HHCvFm5yI1lpkOP=v=BOKoT-F>`# zosSLTqfQS$lHBa*R9$)nBg1 zj!&A9u?f!PrhXNyV0Tk&(1Yg0b@CAp5~HK)&P!}>MSLU8G1TlXputo_$dH~q!@l-e zPL43d(APKkDh3DZd$#7#5HY4+1r(*?dmuu3)1+cNM_A?2UV(kv`|iZkN$UsWX<^_3 ziBKspApy#g+Gk;fM>B?ZHKz^*7jhlXdby3>bG?edarF30XBfr=afpz4F`ToVGb3TP z3a`~~m!?c{y}q$~!etWL+T6|@H%29IR3*!$>4qIirIK+=h~aJCAmhae#f!5eP95oT zpea)bSq2_zt_6n#gI$hb^Qk~3yw0qHn8|rgal5-0=y|4lX%0B@SMcL2TJRA!@y(>? zb`_mH4kZ~box7L2fucrRK=uhTuD`}BbuP*XUF^hxjHJ~_6`77~-1=wXtB~3A-gSBd z=o)?z`UQ{xm!tkgu+Sp>VyqnVjtFP~wv?_| zYcaNMpG6Eqp>n~E0$D@X8>S42K^GvVUL}TqK#vviy&_;z?2;hHyLP6QZsGW@AiXZ! z!{9R=j~n8?GN+!2!9`4aT3(8^mk7&&2j~%p1J0SXr!?3E*Hl%tm?OSQPTS-N@~ph_ zc3<9PP?`%IxRQU%;)&OHq>AviO@B)PmotEksCr@}-7&ksO-8gUk?R}NK~3QZM4x9d zk;td81JmLO-RkcMn6ERkVR<#X>(-><;o~orKJ}|e7NS4}<#?1XcGZsl+lz4; z+8mt0uhDm?D{~e%h}u%PNn1F9BBN*gC7d7ey8e!0uY>qv==W4w1bP|fLL4LkxwiN> z1qDf6K;5~e!oJpxLhRb}i>ejtR*BsNGU7sKdE9s=7#=|>K6!g~J&Negz-?CHYv8^W zl>|CslNOtzP+=kJ^9=~^3&@}j)7;Eufy4EA9i63_E*ePTHf+KvH&TEPi+JLys((>D z?wL(~M>PPMK9t1QfOYOu^(ti9rc|3eKi^S4aHZc)mA#`jtXJV6pt6ZuUv4R^XN9a^ zrPLOi`c<$Gv@20p679`AiCT+;l(5jpBa@ zq)p+61#D{f1>06vS{$5SA7jW&q9^S`qV1U@e!N>sSDE!zs!z5u;B!nP-n`6f>SrM| zWJ)H}Og*iO8IcRkjT^L|fOW?651KFIo$m;lmvM-JC^1;7eV%a7xBpO*&u1g$4o73| zE}OsfboTu44+L@j_|yKXokVqeHjHuh=9TFO(kDr>3e*d%SK(F3O^ZSAR1_N@1WSp` z?YnGij$264yq~EJzESjW?Kb#>NU)b$GhjTy5dj#`73LFaC$?I84dXELUVjA#U3-8r zW=`IdyG3Obk`ST=f@Qleu1N9=SBmf1Dr}L0Y#x;7w^LmsaY?4kI?)y`P9#|$9ow1w zk{esyVHT0z@V4-g=hl=7?M)M+3MIe+2(`b+1mp`he}eAyrUCJ~`eK_;y=IQUcyab- zYT?8Id9(^NQ<@C6uloY$A@6FxKc)QT+d`TBsspqTeX1?ra|V6z{(fsCzEyy;41nZS z!Qu^f;o^)oLi(uCX?NE+0R4$4S)Sst7i)}wK#=>+s|N1Ju2-5?cRKJp2;SVdndCCn z4cOOk3T%s0Kf#TfM0fnGp~cF@Do7*{3nW6FS)L2+zPzHnn0gsWth^x}$Xwxw(P&R_ zVCz+k5df7bTj$h42K4RlRyAX6dA&*yAj%|)IQNTGF%&-W0IV;yZ&yKIXBWW=)MP6#J%Gcbw{96gIKk{rLS&L#lY0-{Z@S+*Ri=6q0%ax*DSl@fWcwL(YYW_x*cw zKRLd|{dpprxh0(N5z73llBJIL7!~HmKbzYH?uLG1`OMe&vwH2U0s3ZCZ<4yH?;#j+ zG!#7ir<#jS1&0(#vko!$HDX3^)?=rI<9osGYR?O9ah5QEDyz`B#AQ;XlfiN?X;-1$ z7Z5=v!@!Cyh125<8xINot5>0G2^aUdeE}F^!WerstPvtoGZOqjUcEFC{j|V=kDh_v95h<50#Z6;2F57Q-gKgzHg*=SJABP@6$rJ8Nw0QIvVS%sAevh$nFv~_0idsyb+ zIk$0|I1snhWJHJA=hP9Ys8keRwL9shpEJTE6 zO@|A!)===>bd8vMDG#$RuNjr3OQ-`QKA!9RMdD637nSVX4B%9~Sgo7XJGHy7G#B?9 zU*$U<1y$97@)*kdeT$p~5eSPKrFS6hn{Nl->g@5Zacn0&3j~;0*NuZu_mcc|& z>|vE66ooUj;rg9yS7nTlK(C0Q27tlr{ox&%?3}`-L9yL{B>^Pl#^}e2Q!o%FzFFWe&VzW7@;yV z8lAe@4MPgH$G`CjOg)|E8VE;HxojI$XKuJ9xdFUpKXXzE$YfpzexIZyKowVwW}r z4-yj%7K~O|`-?&!-m5(YRPpFd_Z=$5Ff~JtYPF;(U{+zx^yDfyZL&i@ zYHlgu4Srof(a~15zbGOZEp|?JS%uJ$;yh-3Xy1IX+EtwMI8f+x=N<9PWCY-3Wrzht5@JcXglCG>qu*lpN`LZXnLsFDTUwp2&Ctxzo(VFbYV--UtXLK+smzzv#w= z}WSen@e58C{orq@QDHFJbEVX z?cJ!~>f3u(!CrrE6_gBH!vJx8jcEA}a2$m2!s<#`C4uxP`FN@(u?oj5Ir4J5loKMN zD|1lP!d_}`2G=apDuzh*)|*ZO1i^FTsT|Ms{o>%}z9tFJDjce#fHqV>YSv?9x~=Ye z1Xt0_fx$SzJqh$j|BUL>{vt3y>}EI5?XD;t_gw|Zd;!t*DVPlB)pM^MvQz6Jh`?nR zpMmNOfPt`zOYmCHTe$wpv>d0!>{_3WJ)U=@=dV3>5HdYq{idPH&;{J4>Hf>$cc5@W zQUkSQ!R@1fc=&At7(~MTW`JJ<@=|nvr*nf<}Vb>+{wQ3mj7pJIbf*OU_FS z#Fdg-Ye($1`s}J3r5RLOk+y&a5S(LOSifloD_Uq?^s2HjnvH8n%D_Xv=A3|% zP>X_kKwn1X!XR6@2Yy3@sh{QR-=EX*-^-tWAIBHZw0*f;KEM2{YsW2f`uc3&lOz|j zDMjN%6C3R2#b)Q408nXbBy9MTot1ygnPF?L999!64;04jd$P(cKD=nJlf$GD%5jsk zi?MX~wpU`Zc9_|uo`dl!^2Ir*sG5Xaxc!!_A{a()@XX{)dMxJDGD0F~cZ^Zs63-KG z>cD~U(B5}e!RO&Vfz;+JaKpI4kCG2|F6f8l7pdU{D5G>RSvVOYbX3C<*nsi*xYTc2 z)9Ma{jM06bCF&G*GH6$_wPXE`_8I8DRhP^=((&OAiEjt?<)BsX%YJK52n^>0v(=#e z*?DP(Z((twcXSw=}cMCo6;G0A}HA5J)z*ZPmxD)2Dk$3xA@CR=KjtXit8p_qw-+#*;zp z=uK*2`$EOWYlKTYZa!qR{f^{c(z-Pn)i-UjyT&DRBc(0UU%Lw76LSw0&2n+UO^{Gg zTG8z&jq6qTSW9k=Axt!hqJy^?a~O#kdzgBau&fwk%YYIJ6co`v>lRz=R^OOpfzDkz z1K$;ek6Afua0%eH|3we-Fm?1(5g&I^vlBs^vdhj~U`!bU4xvrZuivy)n6vQ@$2YNx zq&05cpkD&58u!q-CrzLea3ds#VaY4*pGZ=f!PV$2S%FX3OaQHtoZZdY=vH}iM5X^B zHsT~HhKws*wE*t7V$vvZ1l)LfnF^6{_5~J1#z8+}8A_u17ct(z`*PYRPGc5dwRZ(vNbg%6Nn9dW`TUS3 z=e-=orT0)Y47<7C>n}iaSvO~(C&Q4I*Nu&`N|J1`*0;nf4x8qj{5_RcusdO!#AM_0tale(N-$x~FlZZa z-|S@7#Lagk*=+a4&8Did56|@Z%;7MOT}K%0e7;6CihNPptd&$xA=jCp&Sf{miqR^j z5*R6DXYpuQ>(x1fraMuJL};)EDtz7Q%lSlUve87W_k{6B>kF+Bp9@K5s~at$oBgZFW$g*WJ?$#m)LvoY1c-I9dBDBVfDKQ?8VSbX#_|Q z{B84P)O@v043JA_fC;x5)}RyuQ%{2c@zjLh`hHP?<90{rlYPOG;Awsb9l9SdSliuI zHX!r>N@hxM*qM=0@SaM6UPm?92_+$zYPFrznzfOM!4S0=%7m63Cdq&Vi3$cCL9Kk3yJae&nULXF|jC74Ud1L#ID4z8wjeuc5 z;5%|#;^<|NrsMn|897|7YQjZB*d_X-cN+Lt zKTG^W5!P}07G|d>yh5D4snHXeA!!0~9A_Hw2reLx()`}(mtbJG`;z<;qn;bg+}>Ls zrJgw(PNQ#XhEcNAV29L0c^1I~gMfDf*Bpgci=3eDf=GM@-&5;R$n>BxL)@U8T^mV= zP_|(y3HEbKX?MV;glnI+DyiKUL|Oh0PtGjK8^TKF;xSAbrJ{~Y_^T3V^1}LAG>ky* zGR=8M6k41TIP&8Y3l8-vXmzQpKrcBjqPzlF%+`o^1nO1jyP|LbGN;Oli(D)&8F;c8 z>3`7!cCY2Gqx>39+QAO!h8W($(Z9f0V-RRnzoui29nBc0&>iGaY-P1bLyEXDsAp< z6^6I&YP;$siK}NMCk3CtO+wV3U88~we~TPEUjW3NA94el80xd9PA>vsfJHu1!$l&Q)Ui}+4%E_V0tR5)lbWOX^!r+hKIJ| z3yfvv6bFK-j~F`PHR#M5@`3Hy;xFnt-CMVSGnQ!YOW*-g)cx|FP0@&wdaH!popMD)L~It>MEy0Q*dnh`p)!nf zUhqUY<#@K#Dm4$1dD!`tmyVsBvy0X&%~W7X#)X1*Ux<%TWJjf$FMuEqyJxd_F1It02e2J5G9uu+97%<2c!RhoIq;8VSo>sP<{RTt1V*^A+}OgQRHAHi`W8Dp+u8fs9>Ac1Vh(+!F0|l)(A*DjXf${O*)FyFWv5 zTxtfsfHGH(>7w&I*xL_Iq+A->XJJ)jj>3KG6HZj)z!G-R`%ycW(6wJh4a;GExg2BR z@G=J)-dKIZ8tPSeiy+P@h38ElWN0Rj=))TNv}w@_y}j{{VJMS##3jVoaZam{6HSUX zBeROR=hSAf4#z~=?a~CThVCrMtbftP;6)4NNeOrGS7FotT`Rf#VLUpC1SGYJZV5+rYTf<0;jHtB604$ywuCtKG=( z6}JLXfv8z~`(a{gi4fi`OcnOR_?Fdzpq8|}{zdaTOwyQW4_$?+;z_*mbHNX;SJ5iX z)H&nXbMF!!u?*yvkCKep)~@1z8P1~nzj6kML5Lp&B{HFU2A!^}>VDs(=a&$=+Y+*lSR5SQn$s(+_z%A90mm-T}#uxW1E=5&A^2ES+F9U ze-yUmr9^{tW#h%bh^V?oaZrK`6=9psE!?rE9MvEId_1^DDEZrWf4!3$3UYk92Z5QB%h70Q2{8w)sM~&%!WB=aO6U(yY;BVIp8fWE9-Fz8Qk! zN>j&c&2_*gBnY}fSP9qHB%mz{LMP;@sK(!i_E~K;Hzv$Qyxrrj#KF0q-i&i2g300t zm?xK_88A{e<65ITt9REhGi`P$;WKeMg{C`dkTs_+nK))bW{R4tSI0)DLVn2qBKHeq z)xBU~a=eCJ$RlmZ5Tz++gMT{~p#cLg|UkGHV2=BbB5XkH46@a$!`N`mnd;x&N zcPN?MmFG{b*wOxSMD2jaPa=s^JV-;XZ!*009X-rsqM?nu+I)>aavsVh%hSN%`^7!y zeisJ(j_{XAtKMCKl;0aW_HhOQcer!;S}KOclYSMZ!g#m(MYAu+U%Gto0`JL>E%)VJ z>P=I{IVpG@IwU>3T=JM=>UGTO>gA<1uhzhp=SfkB!`$#->@ znL^1@Ilj@r)vG9*58=Z-HSZp5?{>sw*1>XKpe9B|IYGV()a&+Ukn8iPU`mw{nO4ax zBFwlmCIS?ren%Qdu1i@n3Z>WxD@Mf8Y7rpGT-!HI)9!);FF$kdYT9BUvpmFV2>wFZ zqC5elob;6TZB0T^z#9nMnA9o1DE&s70eC(~(Rvjw#JD1~chjGyqtg9Et<-%92eI83 zOm+GIYAi9$v(Q@NonS$dp@CHDRj{R?|7!D`T_qP-R>OQVRxtHt0O+`W(=ZY?u`zR>-R0e;tU1MB0f8%_Lr72qRLmS%3=(d+)I zq~|81HeqR9pE}YZG(jWYMw@%ZSK$Yl4wQL4oBBISbAxgjp(2rlkkpr`pJjU)F4w0H ziVAWhhZ)U}AytT~Sle%A&;g3;eff=P?EI#kf3uRcGZO7@#H6}=sKpcmb;n(Qn-vt} zU71VXQ3##Tj*Ssq+Bo%_j^GpoYkMY=WH2i83Uj(mW~!OmQYW-?V;+!Y6YU`l{9nLB zGw!5qOB|Egh#3L5G$_f-ER3}HE{u&JfRtu3ze!Kt2ixgqRt^f+^Q)j*j6ze8= zo_9pI5T{L-ALVoHqXC?_Vd;UGS3Qm9K`j$;@13Bven((F_$eOpWX+^lV0^N7@0{UN z%ZhL@DTh!XO=3)k19SHsd_iBb{V%yU#FD1Kb+Y^--t@8b*1R9m?AkNPmSXQlalic0 zxC*OZ6I=9M&MiiUVlHW>efmEZ1WV_EVQS!<sUvCfQOH1HXr zC>fbgnFk)_C3xsuGgp}O`*5@&h!mVU-_W};Eaw|r3@ymE4!A4Ag%aYLLH$hS&~3r< z)73%(Zold1mB=(>7?4}a|GUS6q>!a1I@O3$S~a2eoAjN1;o4({lI+76rT8Vcrw-`< zFl#Z2&16B0)8j33RlzCG+X!oxf>MuNn^QO6ba>iwLvi|HLVNoxaC30;H2d=`#%XKZ z$fwY2G-vx&j+65|)hkb5oT3aaHE&v_L?eu#1g`S#`+bRMc_R^=o{emS8+K4|Z7HZ% z{fpe%(oAsvydxT0T?H=)AZngWy^30jus#DElh@Jg%f9bEN&xSvMJo_!1Zi4NlfY8L zvj3uZH00RNqG)QLht1_vLo3mHfLWD0n%+bnd2!2{D)`Jn=?y^dNi1aaXY!_xC&^hZt7d=S8xU? zWhO9b36By)uA51JVs&`=^`vB$kF>d%leSU}FpW}e@9F|Kz-H@xNl#lSj6+G{ky$hk z++8YuQ$%<5d13!Afw#oC6<%rP9{P>aB20w3%Ftz^18rWL(J9Hqf8lpg5#^&Yf=To9>D7t=(PZ<&$hT%ETbEQ9PLb z9RFRO0QHT@w=~TWNqgQ=*cqN>{|8Vc7j){Zx zw2no8@o`*1eOkF|aHoXa7k9wM&jlM3wt2#SW(oj&DB(i3xQ!uf!7V#0S znP|1|NPk+PCZSyXU44>QIGq>u#w(f+GUufq32aiv9*nnVjLbBr7wyzko6NihBem;2n0zQiZ}UGXkC>kyO} zl{LRes$hn?{P&=yuInQdf#BjtN}XrH&cwgUL>m^K zH5Z4*j23F7=#w2%{3Mwn%L3=uy$Njqhl@8X$ixLh=wdD=*?uGt(Eauok+7P{^u9X{ z&qH~xg`-Wb6^r;<*Y+-IE#yo<&$DRSt8;{w0INC!^|P22%5+XgI=d@RlzMF0D7hb~ zFzZ#Isib^t3FpSVt0C32XB)Lc94uE+O&!RMwEstGCIMn53Qj$80bndpucCgD81nI( z{DpK4wxy-OII+(eAn>j>5W!Pi9IbJN-qh)j!Qib$OJ{5J>a}anu99r}*|Anm)~w9pJaksrFdVOa*fr^s zQ=(Oj@>#wquamf%45qkgk$kfl+}+UX*8K;x9GJzgG@9hkWds4Wm=-bCI1)>{ zFM^u6;1n_IW&kr}XiH`sV6(K*{$bn~R*=aRGmi0sKzgd2>;B8GtMHnn)erhMECp6+Rpw!&BV5RP^*h_=_G09{wMGk#QMd9MJ6|ffsHeWz+DeVP3ZGAai62m>}eUYhb@YlhrxxHC?vrCM=B(t{b zZ(1U^2_1tjO@-F#guad@3~)ornQv4 z-9&b>?a7+iSq2J)6MOY^conLl;zy7`) zc3-ELPdCfU-~GSC=4*TYxA|K>&sim*aD{TM$=c!o5*Bn6>69&czluy*ya#s7t$7A& zDhQB^h;X*$?ciDLr!FO~?YhD7w`_{8-Nopgeih>lIer1}^Ie+?LYactPQ@ghD!*$- z)s#7;$Mn)Hlb-=+MaeXJi+Zwq+gXL^0Wq1qeQv5~1)$CBA@fVio}*RB6MU6ErM0{4 zsOeh(7+4o=*F7Jf$+DnWAu;tm2M)?Jx@Y7qI0v>4S*!scTBbwO2%o_&titEu`B!l(Q!QVL=)L_3p-lOtfYnnc5K(-mF%}@F&Vo z&KT{!h(65Cq&=h9abv0gbUwD&WqM2XDmdRFp=w~xF6EhuLN*0#La%RE5rd36QACfU z0T;bv_9+APz{h1imD`>L6NWT@C-fKSszqq3RrzL|)#oK+ZVv!DIZWy`EHas6?Oa^Oc3;l&ZN}P68)ub(QhMbW0SMTwr>bXRNyUhMPmq{> z0l$RXqiQo@shxA5RSbJJf{#AY*)@9eA(9YUVMih`)xU_N3418O`C) zH1TMu6FI+$XT<4(iy^;d4=Jmd;3c*_Q^y8n;M5|Nd^27hJzkKz)Y%5w)op;prJa7CTFW zP_r-K^UT~boI?+_&w`jid8=OU^pH5K#VhdrOel-nP=Ae*Wx-IBZdO4c4>b;VP})d^ z)b0yW3>5aNVKU#51WNEH*mU!;*r`|1y5h}E>o(ssi90|B<<+oz*hRg{!xt#5h9>6= zP;EVukg)-H)Cvq9=gKnE=HNRbJK~4mv2mUKi+xi#1QnKKak;Nn)f$AcOGBztCjOsVdSYK}Fgjj=W zo}Nm>JsKV}G;Z}TBLClNsBw3gc=RJw=^WD;Gtp$*lViHKO>EI{K?s&0)=`a{-oxjM zoj+$+11IT_df%Aq)&=Rj`SW@CdpN%E;5fbTfc|>9Za@FNod0}$ew@x9m*dx;@;!0Y zfs*0RKf|4MUy|y}K1>Rq9oFV{f3tJ+8TcUTXNjE@f#g%~iMTRTv4PI(jxlo(YGI&K z3d+|1+%Lk;*Nu%_GPlEzytT6m1K&7b4Wb{T2;2`NM_hS2iS52H*rBr|gauZ(HR(xc zZeRu?m8Yv$VFx1VNb@v^g}#k;DAZSOBMqrn`Gx7BpaG7ZX?Q-BH&}%SudCsk1z_N@ zfP17`xVXdW-6fXO1?A(hcvA-jb|4{`-HxAgyDvP!(+ei_%{$`6WDGmwK|Pa<+pJe% zIL_Ni`*lv;k7lz1aZI(>vB!zeDtv!%is{0|HzJ@G50W%%`l~_E^%C)eMgnC_!2o=< z(`G#jEjmn9Yi#`@C=7ic;wX2oRx769{e@XF*aq`dIyRr^2%yV8Eo+Z)H7fAe;3iJ%KBU;maXVA2*za!!n4GlqU z`0%C*csuX;B9LiYk2KGsIj$^+>APyw)SN?wZWtm+rS&^;*MovwD4R9i4;h}VnOW>o z5;4Ec8%R;3(jg64oMLKj=9|WNk?89Gw5N{rY33Dv&&?9x6r?&_2>Yb!^(yAM>S8_R zM9tMC%p?)WSnR~3Ow$V#xQFs1x7W{-xh729zw3MKGOA<4!3;`9sjXK*Tx3Wi^UbMK z7-7>;Pmo~h^!EFrfZ(l-KRfp>V+DO5^vVaL;$6QAEr<6(Wk2^zTwqk79MOsQ>n_JO ziZgm)o$|@ZewOnp#Gm(p!2k%Q$Z-WbCV$c1m2jNU0maVJqG0v+JBc zJ#F^vS>*0mu4|^GNwW@I*!g&w2zd3r+{37&B3k*&80s3d!)PtTZrW9XuVoaTv9&?| zxE_N2XtOb{X(-!OI09ZYHLw=vJBmvntX059@UL-IY<%DX3jFu96Z!@9s|5l>wq9T` z>c|wt0oQkaQM{e>`i!ze(rKLteq_O1{qsdY9gVyU+ zurdTx?EJ)e4YduE%qR8&}={;9Xm|YF)cGwpC>XjsgD+ar5Gjw+?*5F=Y z!4$^!%!e}I-r*sJGY8KpuD>JSU96Hh+03bPOUjp_Rpg1av#`ho)Iv23?NwAGgyR*< zoB*=J5v;y3RhqLHFQO+k+cHD#NN!p`NWa4vV#G%r*Qo=fdF%jotXSS$>Ghj-T!3xQ;tX1q?uD!2 zN!eXYB}5OBNhK2&cfGrq6zVHb=s$J zi1LZkJAdXY=~WABbq4R6^Fv&1aocxG5fY8ptfT9hT7&?$44PGu_))2+v1p?@6QpCN z-o9yaW0x*FJX+dhs)$^#IGHjJgyq&_gv2d)0P6r3e|9(HY>+=RRdr%p2Ch{IU==gU zkoiUAZxRj+av~{TRQXLuZpSv)#w^~+#wd#bqRIpRsNXcqL`NdlJn3g?OK5ZJKyu4B z&$NCP^0^KB4P-Fe5^hi!tQ;-Szt3-NE|r){Ub?U_lxln$;R~1#qN8(3g7ZbScTYpM~tHUS%;T}m!iLojbvCCuSKtOISJ61 z&;e1(8ez`Azx_qrEOB16eU`5W3xCQ7pn(7*=KqIPjFXC0P_kwm8Y*>9f!)twxXn~4 zEi_S85bRjfiGtyq^@FdiwI;EtpG7-Ou8!X{Z<<$xF1)$TMs^?w2Ye) zSwyGoMiR~MwSE@eWrmdLIwtpqi=z1%8e#aHe`!~N@Lv9DJ$-FHU$)!7e_t;Dj(=ZN z>Zd=S`;WgL{oXM3*m42LfT{RvKlY9@@|30r!dktO9m*E$ufN6yMjqp9V2NktdT$8KTv1ww^DId`+{G+%NGaR-W*MwZ|3>!=jB>|Z z8AR%Ts|dJ0oUi?R`VAz<5mA9e8#uqn04#zRu&Rh{Ol6(JfCI2H_WGcceV8W}9UF$E zF*Pl-p7$yJlV%Oq=j<+%c;7T4Nrr?m<8R*)n$(Va>2dK7V|0_w6fGO?oLk#N+HrQx z3=iViiH}%^_G1fzj?HTwWeow4^&=B3<<1@b#arfWfXn`9Ip`e4a>h_ySFFw$Mdo-O zk;tiafW~2yWbj93O+2R#6=9s#0Q0fIZ+Dk*7oQ*%#Ka_NON@MhFt7q!Rj(q&O%CSk zGb!^Gkp_H-0*g`!{Hj+Wgwh_70L|TNmJFL7T5Rbm&S$%d_CKr*9d2+B#A~@Gim58g zWnSkn%HRj9w{&cBb~D9Ay+(3F1X)+0*;ZK``q)(F6iwz6$gUphHdR;qi{8DYgm-%@ zD^uzy41^McEx3)LG6(rP7sY z$J$?{qOu8b=*#Y!j-ck_C$N(u_H3G+5U(pny|g%7On>0`FnDf(J*yrmle8vevL_Ui zlqoK$EtenVxqW#9D&e$Y+2b(YT6Gmx519aBw66KoYf-uC67tG)T56Uw5tSN`As$Iy z-gG9<8d2}2;&YqzY22yNuW?o}!rE^-(_8^#qWkKi>J?^~9UTQ= zwblvjgXJRws|m8Z7zD~kM(hmcQAXM?fErOAmib|G>ReE`K{%BdX$ZLOjhWI>u51q3 z)YPslyc!-)*!rSvy)R}@#41RQG?kWepGHv*q4%zVS$;?RgI+!3WjEX8FF&i1_C&c@ z{jhsUi;N6H1&1;7@+9@_&n`DH=IM^uVlke5(&BA=8O;xDVwrs=Pr#VW>PgQx~SL`DAz z^NKdiO%UIfICaZ0(Si*TMchc8Tz>(^rjVoPO2i`v<^e|3R4~?^wyLhQ_Tu6+*YF8E zjBC>`Ls#DM%El;c&#wGpmpR>bN7fwqoRNRDV(xP@A=_0V2+?3y6=h$vDtw37hhQ@( zcw0^A2w(+e_}f!AW}pcnmWTPcQD@#fnyIgfn7+n6L|08LndMWl(JJJOvSiu?)fy(T zhoDwxouWdo?>Zf%6cF;2ylHR_`y%dB`T`2U`c3;UD(2|`7itZJ2@0d1e?<$f-?U+$ zp#y=U=G3vN(N*H9%j;fOpgk`cd8jP_U0c6MuF4sSb@M)UBlRj0Txf~xY0hp+PTW;; zF=h_v8ew9w{Gwoom}KV7y31wG?d~EXWYlNeQ1dK|zj@(N z#OluOZ*7i=8p7|MH?XNaxiJCqK0*Z>?<`}*+Gjyg0?zK^ARYWL7B$A!^KW3dP~)nu zSGkLkC+dK_>9_Z@F=G;Wb1{U+`dMUk3ZmGK2A!2~*d=DJ07-+eomM}1#O7Jr4XF)T^JNS;%Kg2Q7*WxJ8pK^I{ zU8R|3Ck7CONw&2b5C^t}52roZr48ub^*3XR9M|)mavmK#)dI@vCkap?ll7{<2u`=sbT>r1v>u^l%OGv@SrkH79 zB2qhB*e}BBks#At~Tn;S3smm{mw7ReXd)#MQhn>o=`g!|msd zg~7aO#~(~)0_i=@<8`#pxSv#wWL@47<(VJi%5-yaQ>k~CLC}Uq0V3-<Oe<>xCki z!Y%3^AFhB9`}B8&srvM^9s|99!@)%(*GUo9p5pKx41Ccr!aHBQS=rpHL3kX9ph1`V zmP*@xY;n>Pdt_)V*(4%6^*tqLdv?`kunGiK_$-7#w#c~x%1MW)1Woc37>`LV6@NY+>Fiyr? zx4#IB0+zKulVK!hVCSMvs1s+NcCtcStVeo;oq#|2%7v)+Epl^j%LRY<7IcP%CLGuNLwU(i0bd{~shf*e~+25>W;{jEmNN1MnvLpRHt zhAe2}zbl9Lzz+amy)UjhuSdHj&+>Z0;B^TDT1h8rUK?*%)7j?!o_F*!)bD`Dne;X^ zocHXr~O5g!J+_`EV`aw6mk(pJ_K38R6OY#1HFe(|lcug=^(dWM)!M4n`2P#`y27~qZmarPA~7(z_o?25 zM&2)YuULgG^4OJ3zN;gQbgg1S#lhRCe^D5IXN;+ZzaU(zCG@D16}6Me_^xk|Xk2TM zg~R{|tGnL^p*PIlt9=$_IKQ9maZQ3T0)uV2k$>v9=-29180g{tetSC!iJHv904*QG z)jF>W!xeq}|FcRmwf>@}aE+eNb>~O@K|}3+7%QWZUazfYO>uvoVfE3$kYE;Y;4REF3!aZk1p0Bfz?e|2nGRL^j<%DKzPW?ulH! z&79*QjE;aeHMIa@C)$=PobCo?w5|GpVWz1rSttNN>@t2g{#8c#9RKt5OAF5Hg7;MRmc(uhi~n6(8t20%#1%7OpSfR z3$+0_HQ;|G=QR{n%9tXD)c0I}*JnV~Ri7T9lvPj|*>I^%6kNI{?Y?mC1+*D0N$Hq4 zpe@S*2ux~rZ9BJ+fQkaiFac`R$-mV#_8ARafZ5k9Q(JpE1&nfDEJJ@RTt|u*GojkM z`DiW&+4PPv+N=VS2fX2yfgG^n+kIi3g)wtX|49WJco#qfh&=K)t379dN}3!YA}`m% zpJ^_2dJwZQv@@-{{Lm`GJr$qIXnl=4E(i2gI5C1tdtUVa zl}KTFXO$mvJrI%xSk8YvUx0f0t`pCBHcFHFt_#FLCZKbZXJLK<%E$L``|gGQ_7{=$ z2D&ukBhMluV>-d23ABm<(61t406nHa%PK!(r0FiI#rcW2W`j4!WthO6ya_!2sBdp@ zP@0U0Gg$@sTh=QA$m+qO^^JK$Qt~AN3s%k$)dPty|3X^Q`n=34r)O93Q!W{@ye1B! zT!oDjMIepquFc|I)?h93R>1d(Y7}dp3r|VXDj>AyC6jy21x9L^cf>^{-lmz~VNwWAoZDC5GDIQ!H$ zt%pkGfW$j7AYLvk0i@*ogpBEJcUOyMkIbgg9&I6J88ja+E(AGLmU zr+?dzkL|zh_T#f$iLokii;vo5Q{T1HaZkeUWyh5N+TIS@$P7v}QqeQue`I5hGYt=u zQ&&uTJBX;Ek}0iLEo-I+xWRB})G(c#_7{P?CGC1Fi`k<&2MrhTPa3oBbYOrry-#Lu z`k3sCFUVw$gPt1>uK!8>EX?nYk~_)=sHn*ZSX53Sxi~HK0Z^Z!+FC;!A*2U`DR}V28vWAAUYJ7D7T5n)U)(>u-`dQ40&|war zCeg$#91{AwSyqIh?cM86B1DuZQ-|m5a#>Tunka;rY$!|pEPPafm`}~ROjAL31cI_= z-YeW9kildOf>v|5^n~$@xOXw^&%P-7^pUi#ZzmJ$>#uRo@B{}v`s?IVCWFw(__Mu2 zAaD0Yz7ujOL!7zqF8HdFApS#;qHX<-_BSWPSL4fe_YwmlnDN~X6U>Ck_E~<#SC2Ia z_N>+;+EdO;23p8nNk4t#HJ{8XPMO)hPxaT-AzH8*o4fjJ2B5h3&nV6PHsUH#yWRbBIjwAwaJ8<&bC3_d7QO`X8wc zdI7)H)2?5I&v=|NAB&fXrJ7ievajWEt)rU8#$8kEo84(P0u2&|Kj?yFp}t>iYmDeJ z{%3AXj0;DI-wpep+C>)&{~ZE~E;y_aG!*6~_%N!ZD^g**yVNPt1mn8D{hhp>`!SL) z*?rBkQ-eU6pPXN-%wi{I7SmI+QLSQ((t&ovU6-#>7A1|=jP(zxc)KsexyaVsODC$i z^;|AHIj1cCQO`Co(li+m%eJ{0n6opt1RI}j28YyIF{@BR#p~x=TWG}7J8iZLL-kaj zU0$Cu9wv|ro8s$;sRzpQ)4&JqzBunv(%6V4uQUFE&qwCW@b^MBu2%tlQYpYs=9?xt z<{oiJ1P)YMe@EU4sLZgm!1@@StdTNU61h$KP(MrTWzhy0I!!ffJPtQgr$1n3AJvqa z;Q)}A%r7EWl(@r9aI!!b?Y>|N661+%3(28wx#>DaKgrj(U*$KZp2&7}l89-|P)Zhr zS|%jmdnmRT!_>bhU}4mw^NVoUX&!8=p`KoLeS61unp%iiZQgVSD5@wha1FTW^%E+x z;KEoebMHdT228(eDmjX6P0gB3{}u@VbHITy5A83?^a0MQ!BvAz zx#IYVVZv}1K>-apb&`voQ&WHia>?yoU(xfuJV#g;(Z?hB2+^RLMJ1=}Ph!p#`EBYSxNZtJ*xI@~aux0C%&VqFi0JJEy zQ*X65{OMCukMC8Wpdf$$UOt4Bm#@v~^Ak051IjD+#<Lc3~9qpKE zt6l{eOmY9*6bqROo(TX4+uz>kwz(^aC}=7)iThuaA&4^5{i;h~v@EvytM4>mHfn^ zA|$H_jSxI)X6j9EzkSm-<3cp&@8%tuj=(8fbt6mTh}dR`=U1hcsk}5phc3)tA?tJ+7plv22q2DsszF&=iZKrb7^K0VN79((MygU*s!OM_rg%NI&qCI{!Cus?nHy8(Ml5bD zFTd5dT6G3rj{B|Qk@c?&-X+&@YMfEqWZ+XTEr5??9bmh5E zR)kRinewyRcVvdUNnFhJmd^e5BO zJ)33aW2jf5z2-k8g~=BX>n&9++dy(mv7ugtw1&N~YIAm%`?vULfSPoZV_&@r#86`Z z2s05D2rlpSTdolu^!p+`<@2g@I`<3pfzBMVve{KE*6U}<^mJUbrA5MRLv6<}@|EMB z)ce9|oGFLF&(R`bkT^MTAmw>Jh5A|OH&`zE2%o8`5i%pu!Kj!C&MK^{@SKpuO{1Pe zCsE-O#mFNBUimi|ge9=aMl?9?!FG2AQzn~a=?k;lt7PG1CZ2#U`mYfvmhp#@spQ_Q z-Fl8UN{(^#*@+i)v`sq$;6zW_G1Na%d6SMQ!7 z%`IcZGx|g)wB6lzpdaZHSFpSzIP*^<DufcR^tKW+0+TD#4*%7@H6(LT? zX077rHzEHZ`kTL5-wYX|Cp+LYpJzdZ zfo{Dr&VmP;<<`CgBi##D+ns%a$LK`;*<))O1;sBR0|kwM$Hx+efs(?TG~d#Z;- z4MH&|V}FWMtO#IaN7{&5moMNB+`Qpm^CZRMYEPZ~f=mJq|J3cx?7?r5NF6*0-+Yo6 z_G@fgH^?V-_Xh_EpNFVHi{ID^rgohK0G@`mZ-#R@)5zd zeMd&hgqxpvuf73bBq9}+RzUW}?m}X?plGgf6|H~K>7+YhZUh2?WdiJ{UzoktdTjF- z)<=<&0H~)gOk-jRq1qgA>1rF*E`n?1EH_atyX)Zd$BRoUzFr-t!S`k(U=6Te&UYk5 z#d6!}{D_eCv`nkut(&CuR85k3_n09v_sKkn)P2t=@;WF+;??iSG*a1untpBu;5+5L zHPI;nDE02@(Su6nnzS!Ekmc zU)OUz+nwDOhZ6OfqA_2AW{?V!TSquhwO<2F)wYPI%X=J|M{)d+8J#3%waWIwPgq2R z>4kY>va|o~-Za|1{k|~6fNFs#=I*t( zuvw5BAjYVsc3*TNBE@)aj-rX1n{@pT4zZm<=QYcdOBgRZe*X0@N?T9LvUf$OOYn=h zjL}JDl#xL`^)G@onx1Qt-BdU7AM?_}E{H0k?YK;Tk@!f;n^hnKZX7*2f)3wCi{xlZ z!%NPvB!VQXD79iF!Fk_ns@Yf0rw{t(suD%SBz6t#2VLtlq;#M+}aVYkvEP@}?H1GB59lA=y3) z+HO2#+?CmvAG*I?B3%wGXH|W85xTKl6k$TF*<0>OAPQ=G5W#nU!lVOiAp`nk4gGnc zgw?1~ijN}X^0RqJIE%tN)9=^uNZ`Z8g_IayV+jOa=e%6J9N%M#`QRRU19#3wUNbkN z8f`O^9z=l%xiA>%I0Z5!lOmNjQJps!@T0%3l9{O|7?HBycMYXD$==$I3mGf2EVpAs zjbvp?0jehEV&N6{@5nvyE_J?}QlGDJ?_IfA!15@;eN>Yini*>J9Mc|WSGP_RGJ^^p zVe7YFfOtyikW_x&kyhPRga#;rtLnModgaKEs%knSm6nN{oa|h_<{QAz>bp+t!83A~ zEVPXziTGFoY?2#3d;N=2QHeg!<-F`20J6wRb2I$VvqwMo$b~2@_<7Smn_@wYqWn~Y z=e_!le&%v!6?F+a1RlxBR1uPm?gl;3>Gqr)?W}`p4fkrfRw<@oW=c3TMC#V^9g(QR z8}UH_F2WjSQB>=CeY$-;W(Th`ypXBF(zs;Yg6vmjm;v6$_Po%k$?0NjIh^9yJ4St= z&f;XUX{#Ho5H=6+AOcz6z#CeHdM$LqJ6ONHFmT8EvLJ^~^CU`1n*6!~l`DA9X`wo~oKpzHjV3cE z(EZ)}lc|kJB{UqjEJ^LlQ7%7XY6u8(jrJF5#7Z&XbQ2q?=agITXjG9v)DEDo#|Ry_ zBt-M3_Y^J!PHb_F!l>Q6#6ft_1#mZa9fJ{NBf^Kz39#7an9Nmw!NnyTE2;tAmx>gE z&B`=}aO{Zco=HE6>)lmi$uXe$tF{*q1Z`)>5SpL?0|$KQHDkng=d(kd zazK)KY`6$rQ2u;ZJLPfxENDQAsu&Pt6<(K_?(xdR9+Fqz-r6=W1-!JlA>qzsY=jXm z*hQKGZRTN=un+*NkcTBZBod3$R##B}um2H~?Kyn#DYP#<-8F zH|&22eLzq3H(o}yWKv6}^15-aJDmgp&_!)P=JW*U@-)gJ*c5v3wt5wkDCal;tzU#9 zl#3vfxgF4@5x>f@$9iULU@-+3qV!{mi!we2$g*68x8!wD(Lg&-970hCS3i z3lK_YE{-RY@5)azog@Ch#H95d5LgWL!2LY;5w!`{ zoe5ouHQGIsOm$Gb8i|^UuZ}NlY#{pPSbu^wL-A$GQbKx?b0qPh2`yy2Q*giT7%%C0BWOqvB=A^gCgL5uK%!9dt3GqC8@|yeVGvw@uY)l+<0urTsaiYtNTiw;Q zT9l_QvCk${0!(O8($Y)MCgmeLF_$7oQo8Q;z0fCwVuyk@XF3B-5trDpYv=Q5D!(-Q zjg*~n{Z7PGoJ$$VYBlOqN$pJn_vCP9-q1&wYRHs=15>5xAMx0UA7ng!ZRu_OEQu`U zl~6l+yNav~Hi)c>)Ej}ReJ@!3APQ3|zxRvt12(4eO^IDUi!2rIkwxLG5@&dQk_|Jx{kW5*3(!BW6?49aW%s)JH zuvm&6d=m`D3|)`{L804K?AmG5gXnUrT~&J~TN}>!jAEu<1#?RS0Ms@SQwpum_Aop1 z72D%_m4}>k6Fc>(kF>jA2Y3hlFwdSkN=2e5an{jWcYqw6gc>NHK4$-mXzg&{hyCSN z16Mx{ZvedjAnX2gJPY3vIBk}^UBDZ`;~wfq>Zp*d-%GAA>hOZtbHz|D02eb z@Luf^eJkj5ecLnhm3+hVq40hYi0XlPN`t1~P*09vF!ca~-9i6Q56=B{{-# z;t2vl!6G07H6G8^O1a~)>YIeMpuXUT(+{BvLE!JiX7gU?;K;PXc0#4S))Di@QSibd z%4f27S>=dMNJ2(rIOg@4mKORLFUWhoG>($3uO7y0=a<>P7dW9V>}P%_^mg%aWF@dV zKe7%Qp5rUIBDrCE0`N(5y+aEp){#eY*QSw-0;BdF4^F63e4BBQb9CVo4uO%1XlAhw zte=IErBDJ6ovtNbu;wFmla8)w3H2(bC#ln7LX=vKMvPAzTBotY+HLhJZ_OSKc%pv# zM={1>5DBlPY3j3PwW^5|%qE5}b44HraRF)p$`{z$?NWY+1>yw@`ypmaH?)f`Gr0sb?@0hqC=f zETm%rsrx$n<-(oDCOmU>r)aJ3fHxNp6&}fdPQVY{L7X7HL5dxwG;+Eh^6RGUq|vQ2 zGEoX2)3k3slhY$>--~NQPeFt7BL-NmQ;3p&%TzW&Q(x)jrtV{Gy2S%JCH_mNHp4TugUF{`%=#7FV4f9Uz> zFxvQn=cqlH)=D~sYDHn#d>h>t->&u|APVqD@*w1iTz0Tuq~p|lq1fNs-1`obh^Yq+ z$>dVJ+%;1TLn2;2)K2OE4$Um3VoaiZBUfZ*+3G_HSG6N58I`dwSCYAfZjnJFxoUAR z5pcNLy(>CWI0{vx;{aA@&LL^QBbEF0dx@I|2PGkI^1AquO72WjH~nN&$6a5DBI*EH zNc7Iopfm(@&ol10?b(2^T&_6PjK9L&GIf@+P(J`eh~T_^FB!q4gw+?zH_~fF2%_)e zQIAm5Wh` zsrb#?wfpR2db+XJs5NU$qgi_!#WjQP<6LgG2+hn9*%_YFzFo$C4xX++dV1dO>85c` zyZ}{a9nr4B!d>|Q%o;2Rc6X*WQ)npyRXg=689(4WE~hm*En;K&IGQ#zv8_qW4e&Lz zY~J}s%wc0m>SpsF-+<@(S-5kC>GJKnLhr7zz}8FXBX)0BF=$Ads^A<43<$wq!l(rg zXflPUUM1dJjN{gXZGLThBPiIU&AD9qRdm5fBbSeclvTFL+tFB;u$0FI9hO8;(OhWNNwnKvEFt_tH)dbTyAmH|#6|U@A^71@&XKeb5&ZzkA-H ztmm}dW0}%hB)+gXHl>3RMoQt@<@l~LL#xm=`kybt!AKcRKdpDXg7)pE_3J44`x9Sa zWp4aa=E-2Gg&lm+-W3TwDmzY6wOpp#EfKe7pY%oEMs z_^RGngix5_ZW$Wu>Mx(=fh;TQAd*!MgRRZeCpr5vG9uRX~)W;u&u`tCdDYV;!!jq3MeI_~Kw z*mT2w@{N#kka@$;gl5+DbeakbX+G?eWEF+HM0@ezaWIJqQI;q{&=KnQA{FzA#NN3B zkep*4%_mdZ*`Ff`{~3DD9X@wJIwXW@XjifZw2Ssx(vJ)Gc(FyUcsao$jjVLt)g3Wm z4sjAn7JnYmo5DB!=?oS{Dy#R)AJN+bh#|8)pAT!oww5^x;)~yo81t@o9qznUusx=- zp)GW)A@yS(NBM~Anv3J&@hHA)q{2DV_P%nIH388=t(#z2$3dG9&bKOM zP7t{HloGZ^w}2+Nr5Xzwj5z^dZ{`=O0U3khrhPB!XUs!8Wc5DHThKk13+ey&N;51c z9Bsm(b*ssrPk0hu43eojFj9fu|z3lQhHMF&D;r`XtYJNTbNlK-0D>#lEkQ3 z9LP%!;VyG94tNFkI==ASr{&grT7CPUO;aK+)=UNnJQfBIB=!%d+N=}UX8nsu2u*0f zf0?`SXKWF}qB9^?jGal}dRQ7_nFMKom$=nFOL$`jY@@#iuY-l|z}+aG2Zm?0k10gV zAxIgrm@9E{$!r05Iyj}yf`EQT3ZfHz^j>@%VL+-7X1{lgFDM0y9~kGjx;}dOL6Qy! zX-)vOz=bv}2g0GMZxZBTqzH|{#hEqjmG%yrKQ?>yenFOjHBYb&Mkc{yYpoLmw!lno zzcd2SUHxEYdZPE$e0M}uj&V@lTYr=2QJ!9E`{n+xAqKKmn5ffois2!U)qu4cj?mASl~j@ zzFokno(%#gE^+Q@g3SvjQP49Fm%3|7Ku-2|H$-4%hs=}STKJ}HE4S)yi&eDN1p+O- z)Qy0AjG7}`GmOkvdjg)uA3zEt<_fPlPnEI)Q^I+wz1pk-{E_j0G@+Q4j&wmWB+3OL zK*jM|)P0Oe*?gBL;7OMwbD_8Qd%PEw9-c^S`t%8E4?9g|-E~dsZyvmOOGn}^@|_V+ z+GpXhHVwTseM=?|q|nqo<2*T2^(t8O@c{VWdTc^6NCJ>`j z;(a(}iC8yi?$YuwpD5lIp);|=7!a2X-21zY2zA8OnioMgL6c0Y2@)#X9q^j4T> zcrQvm3>0pin%?|%>MyN9s7DDWT>cD*InWA>lTc=B1)l4S5|^{nWA16=(fGDxe002G z>$*|8EAFj3$60(7l;()oq?(c;B1YlK9gr4zJtV) zOOYoq_S@|Y9FLB5}h*3^R>?+ZNjWDxMC2aGOL`PCQDQjsnvDB9cO~B~{Y=qWHTiPlBYoB>QLKYWA{@?nrukH*Dr;__*ts z>`{ACa{mZu0uNh$WZB6Xmh;5)Gr76_MG1}{&j@@zsiZZLVY4-(G*CVcvL`|Bf2*U-6T?~J9Z}Dpd*TMF0fd*2ZdkP% z@m-4ZoB&LVpoZMZVk^^U@Zp!DpdG%QpRqMEM#=rJJ6Ahfj+v7hz<`~3yHr|uEI4+q z{ys|iCCU#5D`I{!cyW*8+8KiYgt2XRT~;CHh1x8?AQ%^yVFu7+i(mfc?3B#`aMXEbZ>Dal8m>CY7|7sbRDYweR@?$0p{W}gu89;(3geu7=vTq5+VVy-)H+`p^O2)GQEeEE zoBq83Im~d>-^e$L+c%%V90DYxQ;P+W?dg;&6+;)XUpRo_O1bHUu4nDl$pi1j(? zc^0vT^NZ>LuXkI!Y!X`h0d=~ID1un8b2*ey7LZ+H0>louR*&ii*sDCgQBHCn8FeLV zB@Hlef)uFTyQdhBaq#+xrz)8YgXw=AgMOxMCQ+B*Xg)tuqDvX z|Hs>@{zWvn8hX=-$b0z_+ZF3TYI`ufVAZgCbqebY-LZ*wE#?t3eDjG_XVVcw9}lev zxiq}Hnsb8BhGG)6=VIRCYp1#sP33 zx;~HhVn!95LT2=kJ=gt4eqC~A4zEV0=&VsK7-NlKZ=zjn>f2|DlY80`7+|@Ns3wr) zGEEviu8-c_XJE>Np2L|Prju4E<&X^c)OK6=zPz#Eqddy95Zz&>>2C#23!6 zN;ST#!M?>sK-C&VNfW>?q<|xO%lyywy+AEZ^ZO9>!#+a`2|aXmp$=U4T?2$-`tUVR z)pkdxhgN8G2O-c_GhYWy-}^!gtA9~=8Qg#~$jg3-r|;IhG^O#;oSJ$S&~SQ=m<-7= z^I^^=w4K?KlBtfvIlj_{R5KB4w@;+~IA=>ZP8a z&isRz%k1h*&-Gs1{oXEGrN*uaF712K;L!Hb#$7lj#7=|>N+nV2GqT{I7cDdhZDL)F zQ^;HZ$MiNeF6CbIO_;Ib&SaH~`RSA{m>*n_YL4|wpnGJ1G{d*3FVttbTHLanL24!f z8fZp?E6)}(8=Pw^iRZKgV7ti9@Kn;&Hs{}p<1tQkE#yx-DeC*Ttl=PfW` z<3k}=UWZ^x9~RD@X>!;07qM5th;WiO!{}k>=yv5LBbDYG-qvbX(NPE@u=*sduhM}M zWbmc-?F~yJ2`HDY48F^y8{aC^i=bV$HTCKso~nWXRfM5atIUqX$@uaIIZnWafy{9@t3jd*L)qtRw#x zyWQ5AJx4T?5g%J^rG6E3m#u-Aw9DeI8wKpadd~ZT+O?~A5F8H)ZxmGsEdH!A0r?{OIR?}P4yf+{7VgyJZu-%{_fH*M=GcZ;MG&jeE%Hp;3y_B0PV`phNe$g0dugJpw|*ABd4%Og^31dRj4kpew>MLjHS;Jz zR9P_tlSjZpgwFO^PHrNpI>>G^c+UH>-;Fenl}pWObJ-KuXM)DmY6^+4jX3!uU)^d4 zYW_DMlUNbYd%4JzJ%R>BAjw-DcexhHQ$@|iXFyhBJf{w3HV+MN--{v>En+%0!8`(m zvYapkCZ_E5m$q#)b4WFuJK&@dO27{7x=KfT#N;htL&ZFjcQ& zdYNVx!NPoLD4m+oZO&%P={M?OnQ5-*C zpd=V;C@u9WOduu8l9rq!XG*!GAm@{LB!B2vA>pH(z?ltRhgl5PMJGXuKi+q;#>f<^}VXTDl{+VYSO-(Fg-gISoyD?7*yTU*Zbym$7vSRc1SaW6>5O5FBGj%GR z09;wj1O&o>RhNDJr9nwtI@tzyCcB5@jufQ*MJBc*4A}OgK~*cMZ8q4&rvtBt z_CES+bNJ`4&0k;FzYf>0?e?F|*DnOmFJ>dZiE0fa_@`XStvZuuyqoW87>IZ0gop1W zgqC01Du2M8+bVF>baOF;oNMl*$VF;ej>V!zd9!5|DL9PULODx3%`}%)I4*sBg6=z6 z1(+XQY*hBnHC0H&_E>68LaW5KiY_(KE`!rOOAw2U9ETxFrXS^=k&>P?5yDhi(Lv7y z{Ua^&n8VcHD47ReDOJh5-3;eeP@u<|9ooN_ki|0>L{g|m;yljTY37B?p4$$cU&Q9w z{VMgCw~Oe>;1cDCU9ARW`;D;jOhP4B9##(!KRP~Re$d@+r!vN1sbF}^5F+jkQp~$T z+=|NqDC1G)4bVB6H^)+D;ob`aCBAr}185N#6<$9}T4}^OET88af#bE8HH2jIn>Oe5 zEF2;z&UAy5!*~ea+PF>|PaRjEfVAlSNi4s~?S7;|3YZildBdY;I$CTupQ!8$ls^s$Gf~j$aUESTh4gyh0 ztNrwgBt2U9D7V>mFlL=t$)Ryf#MNcy?DT>8G&TsLvR|&=uBoj4ytk#T)c&HALFG>y zU%N8TVz=O}ngb&Q%UJ7GXc})QBksqnqKk$1p&O*$(U0#}K|hw6c`qt9{H=IFGDLl6 zUR(WMLXbkL*96XKlq#}a!%t(^E#%a3R}mwvG*N!o2+(}0CTJNMHUO|bM;y!9OriWO ze#Hg|=vp!mCOy&m8=Yg_#pc^AZEu(DZIV3=iZN#|F!2n;HQqgnVtnCr6=VZ zgxg!M5+nMUG%P0YQH0SrPT<~hM5 zV!qLj=B30T){g$we}P89doOi{X}9?%}az*J+92*I|sf(G)B7nHFB% z_&W|e`9&Nlfs)whA(GV$Bfm%z_juy*E`~I7Cf6BbG90_Qw`P?P+Cnv4>^LgpV(f?98&Y1?n z&mb)5Y1t<=`K&8sG}5BmQQ3- z;zt>oQdqypZ8|lHuBA>Pq90%3%;Bwnk(Ta`Ez^AH=vx>`ZsW9he_`0PtK3neFp9*J z?3Z}Kppqd>aY@5HsaFXNf)B_iXnux$NrF;<4g(-$4Hq>^?pt@Nb^Wx8=k||}P{^#p zj>b@AVLz4d+hE}Er)I8Ge>ZaXX2GWuFnvA+5>)C$|DSNz_9y76w6ZcNd3oa`yJN?w zeUEiVp4xt+_%SH@K%qXg9+Gs~1${s2Hr!hmB+v5jGB7;We4W&s4;mBaQSKm%DPsLW* z%I9EIZ||bxyj3?DgUDT`M*UuRJSp(jnI2A?+m`6sjwJ6YMH_xGUV#h*q!a$` zc$&ySYLGb`FlgP1)+5uCI{+>d-ZS&1(ImhfiRcbj>#$=LEn&i;%XOY55Csy}8{`E& zY_(Zd0R$N1x7U;vXxz8*mzWW0F<`ru??tbOSab zh2-2$ceM(fMV0{j$lH~N@B{`iv1r9?YrixE^R7d|U*3oIl65CE`S1w!3r&Y_--~X> zL1#=-I5{R#Ga#K6i*_t;)pnJ=AAk(6ioNv1#rs(`0OeQK2{isLct*Dzcnb9@hy&z0fuV9whYVoP z3004y=4!o)DS%`J`akn_p}lx^3B#tsv^p^=cl~uKVZ32;j-pajJR-7V@ZH*c*L8fl zFz$6b=2={ds%S;^3oi%Tr~O3?S18*3is^9BfzT_s1(N95O7$wDwBeSzKdFRy14$VZLC z{Ky$3In#@Jo6E!pUTs#<=80dI)><-E!vl0#^t8M!$!GmujIvIbG4PF5Tq-EQTutLM zQdgg8wvvx%gAMzZemXsCrb;eGphx>GHb3IK!g2NP0T(pXW;C$G&|j`s@kW&7LjK@V zbPCYW7f%6Uw{@Mc|5@Il%Kp!H1@5BJqP^_qJss*>jjBxjy2shd+l9tN$1KxyGg92N zzewLRaSa(_@E7xA07-igj(FV8HS>$&MyAC_<(r5pc?siHZ6yHu31`-WA@9!jAP& zlA*2pbVyYBhHo zp3fl(%-w(4K8y46%2z@oaFFa*UO!srIAA7Y*AerD_#!YN8O=EYK?1PTUDJ23>qa#5 zR5dIE7WYt>Q7Bgc8v0th#Dd9L21(yd?oDKXQga!W|8ND^5pcHe1!x}_b)|J~d(^#+ za>8^|+q&JmL`+~C9W4X(dCvf>@sci0F{{k?of@ zgoA4qYWBA>g~T0`jAU1-f|OIfmvBRKF@rtkOrsZR>=F!QE@^!qQSITe(`PP(AnE|_ z*4pIMsmEKp>xk_ff&&9D2&Q~js*I4yR$c2)o4Wl)yU=bK4aEk-H^LXRSIqLDmsf4o zt1v#*E#fm+HtH>~!fccU;?T`NS}RWudtnZv_5%C1v~ z*n!O5)1zoT;ekM+D^IG8yd^iR&z<3t$7}wtj^5yQb|>bp01L%Bf*&NICoVhM2EJ1J zi$pqHI=aY(R@f(AuZzvg;zL@m68bp^lKD_>5(FwwLfxuFg3Q#b`~lU&1;`-#lEtm5 zPQs^J773E5NHSfY#*-8b&=7bxcK{m;{VZnPrW3gM+g}uh(pGlsAOt%!vFhRDXuu%I z*WFxB3|yU1RX*xvnbix%f;_H?WXkg>)OBD86-^qce-Vrt=C>m)@RQ^pNIBqqKa=}g z{iV+#w87h4W>b^M&e94>gZEZfHaj3L^WWel6TLB$o~Xq#1{ZaWd6>OOLXEG@KO-4D zD?5G!;OiYXjeQ-ZGLTBb;?K{1F{+znjEvg1Lu_o{E(;GejCRR%P_Nj790F05fW^9p z?J9r5T_M_Bc{2hh_$4PGCLBjDs|t*lE`0qg@nNTY_^87{?VwPLThTB~%}5}Q;wn6Y z9{SS=A^3QLo#f(_c^;~~g($h~UtBVcbdep^c-@YBbtH+VMZ1A8z;qK#G%)Zppiq4p zhq-%Ze!aTf2!4zUp}fjIvby#gaW}~fI|9&QMSyz^D8cJD97(Cvt`cn*!Y}v4?3b&a zRyMDaBC6{8S=3djM6P~7cHN8RF`p2L2$s^jMXb48oOI(pn}HOkbJmMEJS$3tr>ZI; zk%bXZG_~)AI*l63c(w#g97u^b3JMCZ#&zpx;8~(DK1ZuI5i@=fzPVNl3Sc{X&MNFI zF~u`CJ#p9m6E8_y71K(j_7`atsf92Q7T;SJNK+0sUOx06?ndYfMq7g9#9dwWAuy*3nyOCUwET9d0NOb|N^eJ>Z)pt^Y;Qw~#eb`*<&sj?DXHmV%GQ zt)%_ZGE5`Lp!v)1ih0IWaf}*$IZ7DoRrI1AUiDedG(?Fc@DZCqRm!P8)AUbxxVWg^j0)VYqM)MR+izAiF;I{mtdOJnZ0CaL zS{>M5Bdg=(dokEF$)eKca7Wd<4l6|dqlxrU9iSc;b>ql1zD`;ux0ob^KB6JjX3fTB z>4=H{3i5`gHBvbxq&I-MHH1OOqs~F{>qd-5=_{{oaX@!}wK;|H8P1 z3pLg)-NCW-g5=wR=A!Fk(B|9$X9%m18}~)c|Na*-_~BGR<1lAhQI2-&USq0?3Rb@t zjCCqC4gb6s9z=}MR1^R*TCMhOG}ahquexzP`bHSRcQlsVE|Foj3{!qKOayKe8_Vk? zlTl-O6=uTY)MkfSCCq_z$lU=bWWnMUfW|s8N^ReZqE)MB>x!IT#KF<)rcyNMp`KI4 zzL99!WEA{`dAkQ+-qjWz-=1Az`z%;w8S^~o3swZc0VCcx4Ca)zo*U}F!#GH%#}`t) zLY=vr`O+Hb3ikS0R;`n-XVF)o_GH5}-{^?NWqdl6fTaIk zpMXQ`>s)1Okz~z0DZ!BvBSBB!ul_~sLNTk!>}M58kUrm)s8&O4)7AlcDxgd*DW(fL zN5~n1xr&6^%)MK`T>@<05D>dTLvd#9U)+o!k`872ixi$mARWnCei6Q&sSh?C5HtC6 zy$Ze;4J^uHR)ILbl?0rG;_-2)&orbBci7OEQL;iUIJk&48Q@&&b6FB&%aGat3f7s% zV%NzR7qm(0?2vWv=RO*j{R!m579@`OIRW?{P<cD!xq}PN~7oB^uW+Fv38eRm*%X00r=$1n6 zH6qr1^s|l_;6*1RhBy?PQC~o0QOMsJwW)8@K8wuzaFqOfgdH-D$pK({G^ z|H?tyDaz~pqMeOnjc2=9G}0H$8Yl?s3HtQ*8%YsT&Y;lGnYNXIH!8_=oNN8GP8L$f zp11O7mhmz&-kb7R;4Lba5Y++*zw00Du?|v2RFCGoPP2TQaW@h4u zq2(Zmn$^ko%WsfNebhh7)O74E%Kg;Sj*v`I4?aW6GH$K?MMiqRA}KM8!!H64Py*V@ zh=<^u`X+f1KHIh!>$w||nYm5H4%peo-fo|ToJwNJM}Fm)hSEUDf&;kR$!?cx9M zjkuvP`~TMQ0q&I3Y@c;3GPJ&Z7V;Qos9M4cnYH6G*$FEi&$Gth5wo$o!I%=}L`*ab zBuKe)Y~bonp@&B(4H&f0b6N$j8gCY$ul}rm5zN~^;{KmqN3m}h6RHH-+d|@K{t^+n)0h6xm^V;Vd^IgXjObM z!+!3R{?wS9~1U{B7Z-?EV2WS#v{0nQV?a<|2Nk5Sw&;dg=AVAYOua)i+SjK z8EDMEOTywD-Ptf**w>l$cjETbuR<2d=$72Z-H78CuVwP~Jt#yL(7u-=?=ZOvKeWji zepcB4`^-vYc5$BEn=lc_$skDTX`SmjNC)j{j@1TO4LMYJ)z9)yRd$X%GP$?d8OemV#D1%tM8NBX0twaSj%S@SojDQW z45;G738Rh-S%owHr>kht13Vn$IRR;M8wQCkvSZfj)8F196SUBmhW77cvG^6xRQR4{^x3)Jys1V@Ur0j_jcctdJ}o_D1fO|$L84VcImwz|sTgd(ka{^35U}cc1M4?jqoS2ryrby0Sl69GdIxtsMG1v(_O7>rb^_Zv zrHxeuwV{-FhHrQ34i=xLGCk|Nngsl4nV~1^F=6pH|_(&stsrANkL{z1dLm z@@Y@W60CAfAD@bu%RQs|y34_%W#%#9cqE@9v6VGDM6u|0CfYqC-G=)dGYc=VR}8i3 zs3s9%B=hwuW-rQczY%ntcnB$ZHy1>f!2Nq6YY!kQH`Jrk_5{?DPhUA0;oh~+f(=9i zYa-g@gmOW2d!4iKU`^8N!h?7+T zgK8Ibst@HS(B`C$^^KGx44cmy)jC|tllEDBgh@*i8RkV)aAZBGa5ReGHSHOdg8C*1tYSOhb7k;xaG3 zA2ue%FC7v|l0BzLz z1U&c-xP_jv#@BU^hWbraqQPrGUYj9;n;D`?8{`SeGg%j@*9;P3Wv;4h-wP?1ouV%` zzANZV5LvczFqzY%81V<->R=PP&t;~Ab)wgrbA)Q zZg(f7VmCwmEKd%q8A&r01s>$v#A6yOMSneO6NvzFPrZ%6wW2qe3cSU|R8PO=hqAmw zA=Y$?F`8IMP)fPaAjDSIk8OWZ4EX@wD)e=xg%%%Q&2&QJu6Nzr&lehDptDN)EoyaQ z8@!R)(?eSUWKBgPNlbi+cUKx*`cv%8>*x*pQG!yTtQtv+1d({J_;Y!m>NEZ8ml;T# zuiuBiE+&lp{m<9spWViUkBDVZ<3 zrdOCmqf5;6;i)Si0GD4|AAsRM^pD^m&*CKFzvxJ5j6G{SQ;Tme6MP=cicOt_X6kD* z*D!|>rLuh%mbCyw7CnQ*gzJ2B2VjPU-`w5Jc@kq@;ekctsKxG{JmnEDcs`vKneH-VN<6A9V*MX@PC+csi`3s76HnY+S+ z&UJ_!JyFU4&(IP!yC}%&Z^Vhu$O@k6D@vg_C}J5q(ky6>wckkQ;XG5{kCP*p9#WM| zKk?de8|qbP)D-fcv7}`PU~0wLw^y>h!jsS-z5v06+Goi`2SAtMi*t^cWTV-Ka*f1V zE5jvI8L^DUGv7#i4goQcx&ztQj^=L!0^-I8W=?zo%+n8}Lq^co){eT-7>v@&ZGLUDY%+xNoY1jx${a&aMPsxCY_=tu>e+EtSCm#-0+VlpAzHnSYzk@9D=f9l9! zpGmhdE!N$b=CTU_)(R}E>k>YeP!8qLHuHR`-b|j0BMnUxqp7y)qq6@4e)*VWMy5+u zl=aCOoNf4${sf5^R$=>%;7~CJM(@ljH_B&q5(y>E4Tf5~%7gHM?S*Ea_repHHCc+(1)=k}G*Mclx z5m4{-J^j>u&-5h(pC_*Rq9P2Y4O@w z_mM3NZty>Q*J)G-kT+rP!IjKpuj4NJUm(!dR-Ij!Vc{edtUD86`c;gYg(-38nHyGi z=0XUyKp?F<3)Cz|hXMMw(Urs)!AXwoh_SD3hV~m78pF{Yb6{>Y`ZNB8-b=ExW3A^q z{d4`b-CVz4}z;{sx1uxg|bX?e?|_%P5iX1;vGR`~;d>_m-# zB;P!q$-Ye-86$MW1Bri1{VWeO7MvhhjJi*eqTS|n;}&xqZeuS;H7OKyYIWaZLY^^R zI;lEJmlmasa zk}!jehRv=?M=ieNwday~*1mdY9SXH0Uy-HU*|-$7(#c9hySn3Tl|SG~z{tta3$B=| zliZJ)swaV!WBK0wdqI25ND*{~$zhlRQwc~SblTtq?XELE@ex5uY#!VLUae*p9tc3? zQTyMXITit2B=JG?dF){(-xTGMhUgx)&qCGca;LEj88;Qh4Na5h8j!2cd2MzngFm#U z!)vw(GiXpJjZkCl>Ss|mu+}p&E^k-GwCA`fm63jfnCex`lmx_!ZaD!_#u61FIcG>% zt(I}yqst}}n(368;%F$ZNekp0Q2O>+n7}Y+VDUFKH3X9NeF&9ua75aA6{Qf($>;$13C(ItF{W@u0C zFY;G!**-WvlR3v5DRqH*-yqz!0>y+lk(1lOtLviSXbu*R+u;&Ovwjw)+?p(=&rQU1 zqJPl6JY(A$^7c4OD|5p}#gl>eejz4T{Vc`^OYdTwm?#yxKg%l<05)XN+xqRsc^rit z;Fe$X(=Q!281P{}_(!W4iEY!dLJvBtg@k@?fEH+`XW`l=w7J5ZvdA*vRTq*X2ZoXn zAMKYmCOHgv4A@V;G+Q1?uP8-$<`;1Ua3Iaml?+GmNE0sS>4|NJ5)K$PKF8ajQo zhlQ$@{1dX9&O~mK2n}dcaOWJ%wvG)w8@9YWQDs4{#!T2rRh#6#{YA1JBg80vrze14 z=S~6^Sb`9!&OB@u)dN!7^d~~ZLe;<=rBB+{m6k0>j>70?sNZ2~yxwnj{R5B1rQiM{ ztZm2#oNsju;X!7XFjSToQ?EIh<0!*@?XsX?;VvZrHef}ct0NLov4h!HebPG{oZOC5g$z-;_4Te1M zk&BB=XQyqG2GX1Wu<=9f35qnkv+kKwvxy2e}xn@5a<*}w10rOo@hKGU? zWx@4*B=Le#U$l(oR!h|LlQP7Djr-w4+aZ+oIMj9G=Oi^OfOPGhtX63Fpv z=3tw96O|igjVZfkIbvC3ev9V%hZt_{J?&;E074trjYt-RYKn*;fU-h)*Hg#!=G>*Q z*pKw?fNw%n)0oiMg$7YFEhVgS&4r$Cjg-k*Odsl_ZlU%q^pZD&jzr!Ir~q`~P|#b+ z)7t%lSgNcCd5>=d5yL|rkPolq>-VmFUnPvPIEa!ii&F_S1GhPq^$EZ`fi!4dev)G< zpS98yc~^Q4onUC9`v6~vW7Yj$@7)kR0`duUK}4NpxuSTXOAXO%-|pe^>)-3YU#Gv1 zhc8`#&DSr4#;^15?Y}56o9$nlzw4DW>y6Z=OPUjDzhM?Q3LDOY*EaV0K&TYBkN9c! z%-stKqj+NimCLPOg@*5Q$F+=LqM~pw=Q|;x5I{V*FzQG-?RD&R58@z@@r^=Uz_kO@ zwh(*eG40z`H^|5I+dtujI;m77l!{XOeVXkhJ*O|6f}W**aZ>U$zIvTnv)8VxshL3GAGIG;|1n%-{ zDkN8n8SiMv(IU0IVKQtL1kT}%`3ozJ-8^>y$~>BkIx^@(ndbyC*^d%h?fAUIDongN zIoj>pbuoe)V@f=6mycH-3?CRzzK?aLk8TW6jDBtIMuis<(T0&5Ze#x}5?rcUrg0N7 z&6sqx$l?t(Mf9wHQ39hhPF#|G+!2+bIKDIJSIe+oh4=VQNBSd2N9mxHQe~c@e5r0A zk{k}CubdTY)tOo~j9Z$CIgRY8!L^2nqF-?`sech<0^uoM9`kl7tA!d)AyC!ZsXj-> z57Fx8*7&Y&ZdiXF!+-&_n)dBJu)GPEGv+Las0aE14_z^>5@193;VN3)Br3Gi>lf)g z#(iISLAa|U1BVDcIY4;7C$nU3=0}I33dLI*)<8i%;%S#a+GsgTPK6FM}N7QHfa?RAp zBvKS@n`5}MF*?@D=ZTc#RCinuWf2dY-ZdeC6$_FN?@l?$z=LrZUnBE6j?wTCIg2n7k za3C^R@4*88L1NeFTdOddlGnv*57EKVtbfrn{$}^|sJ-7X0p9uo=~~(}?Fmpz84$vB z>ZAGy%uMd72ka#~0hqWFI)#l%W9Z6le1Uoxlj32%PXKl_Y~LG(dG#~S6d?%Kpeg$O zIY+wHv|}zg`=wT4WJo!}o;L6|e)yv~bY_g$yqHC1>r9lwwT{Q7fP(;0m4D?`>#SosThG`F0L=ExYPy-Dx~Lf7L?uzInm3B(;_x|lg? z{&w%q*@el%V3K)Uhbct%V6Zzpr(H#!&2EBW`7q?jCn7AB(0I3yvw9UxcC3u49>v`Q z^G=?=Hlq1)=Q_Te*?Ayogo&9uz{T=5>BF(gB5md&1ki6vw7=(-m~O+c=V>~PM$)TA z2#f%uuTd#}&*x*#s=fgHGCWr2x9*=>Jf8*33>!%$oOwUmHs-Hk+t+W`96AHfkDxvQlc)pTmF8RqLi|&+ z^-cj6a|c}G z4wB(JP+Pt?^|L4w;}QQ|3DeAI9_F=9KwAMd z&m;?PSv`#dxiMHt93?rqmt0 z4qq161Kg#tCTP~HVBCUlp1|(hBzSdrZCb0L>fP%*Ag(Fmw+`5x>5SInz@~FO2JP*$ zaO+t%(2INcGsdoo*E`bALB zSnp==v;Cs7;=pE@r|~;F*Y&gL+lPd9%rxIbOsJ}AnwrBUd#g`?`3}zG3+_EtmO~Xj zv41%p-BRtBR)ctYe454V6or*~wAe8~tete>%F+(}if>JneqTJEBxTyoHIv3FU{9@1 zL!GXNY1Ao}-bcr_TNb8Iv0V-%xQ)8>m-N?@_Ue z2=gpEi|}rRvO+RzUoe6pVfRR2%bnPFf`7Q(b_fYd+GGEVIC#abIWg0FVORw~Jj(%m zsM={>7x|$PpdB^Y>h%u7ku-y?DYfd!v+Q7)r^~oyy{SNfy9)U- zD10`*h;WT>zEaKaQashGXfOlb^?mYQ=qBLcrcfNPsid&&DiVJkN~p;?OB}qsCnRor zhp9`wilBQo@K9qf-^eBM-W^cncS_qD;nMW+M)e#`yUN?uy+P{XC4ikQ(6rBj?jeci z=sp!_P%_a0#soTf*IuI19pd{f=w?)BIuo3P48kyo2sT-NX^O_33DSbw+|^`WNJmMA zkQ?ghAdo;0L;6}7;@F-A3(R#_BNn8w@FNtQk31|i)+me(UNne3Z`Wuee#|VwZqoXC z5|`0_xlrhi5P)+haS~9o*?5S-wcZ9uZ4MppqQz-2x>jCg2g7&xFVqn;t(7}swb$vc z7HQD`>_T>Mx|nUHrJeQUd~`)S%rCM}urwY(Y|Tq98SQEGKc%5U+x}?3oOI&sT#f3f z1%O@nQrJSMZBX9&S^k8ZfLq6GW6V<1L=)@8C`4di$2b%jb^R=uWOpufV5EE_!=BhN z9uAog367~(0gEL+O*7ZC$kdB#2iy;Nv{H^A_U_`U`4ji!Wkj& zfm|)WD25As#2skJuPVJ=h0PDQ@%Svvt}`ciE_=Rudgk?)&H&J4av!1AS~et?KI%tx z39ccZqjPYya%WxHeQ(|EPJV2AO+wd;T#hB50Sk-y;r)OP@7Zmis~X(ngD z+`~H6(1OpyvfFP&%A{T;DO}yD-M;IwIiFKxc7KPqucM zsYCeLNuNc#iv~<&)kJ}~4YeyC&Wu^sbVOJpo(1hnu0Yz&z%as__PrnsaQ8-`4Ic-8 z*ZHP+A&DB)u3m-9j{@)88C9P#&6fDI(-ziq!|Ayb@$cVJ%2Q~EM*1!??CV)kRw1`h zc8>ixv@R|U=9a`4^*_`k@yGU0&LDH9)mWi_QL-sZ`u!3&jZ=`wrCY-cW)2mTD6hNr zV$7&clogDe#lVHEW`?f4tj?}$$8dMFfYW50bEHkoG1+m@Xx`Toc{PmaV$8w&MvC9D zg@gpE%+(lmzANF_=_K&1ES}%p)==yZ=QQ@9PMI#ndY-ytI>f7EG zNbb&e&P8C?84Rr3#=nA*j~c1{MIhL8#N^Err5Jg77NjX2itGaGRTxRS8u=FGhGkVn zORYi6E;xqs^(vZKE@$ZFWU8h<#YftDP}?5G!5c>X+WKL0rWs(cdq?$w;~57~Ka0dL zhEP!%$UH!q(n2j>^``?>uAeNfwNA)W1B3w#ecHRq3HZz%w zd7@~p<1TCA*!QY6!C8KheAj#fIRy9-DWQHA)n@3o7_P~8QF&z1$B^2OoM-D*lvCV+ zksoK*v3XFg<%mLG>W;1!5}*075oW*q(371kTvMB`M+Wz}k2G-*2OTO7!{^#V)J`!O zlN!aOgnViJ!Y4tUGwF`1J1(}Z&Znlr6L24V$9JSkno*F%)(aVxB2gxr|bxFhJukfn&ZnTOe z6eb_ljdvbF9M=He^DL+hTr^A@VUvm^R6mO#g&pOEuDa3pMsLtrT%(e!b^wB(D}Mo%m8 zg_oWf0aP{JTK3ugB2*RQcaNFdlN?hDE$GGmJEo%bu7e#aLjbc=Wm$y>^o{Z1i(yDT zwMPdG`$f5yo6+q|z=k1;q`&ttwR-4IAgm17`twuU2N<&NI3G&NclCSW4FVz~$Q?g0 zN;4KhFJ*y$Q}nfOm!yOzfxQ#1Zmm#uB;IMjVO2M+p97xU& zZ7zjJbLCN(mU8yX57o8AcK)n(vg|Z**JPtWCWO?Wm>R9H$`1H%O6Byje(0OeiJcv{)vMLB(OBo*fRm$grW44ZaN09SS9 zG)f*^XPVqhoY{A`zeo{Ibq|A|(-?jyh!^S>YyWz>2cf=_{7qaiTr%prko4uy_^z(I z_F3dB8*Dbhz;)ZB8$oc)dDL#H*>QKS278y9fBWuDsD+=nZHnsmt3F4J&QXCx-|+IE zc-|nxT)8?X#=f?{h|h#;Sw*!XX6~g-%HyvM_^4NT>BKR02eBnnWrY_9IzE@UtLS^} zvtS6irNQTuGZ@6Iq)jG7k&55nt}+fZC@^c+DG1_QtGa+!*?ILUq5@nP8+z`eq~WYd zS-q=u>i#qf=__C@E^nzOAkQ}3i(&X4D}B?xU9?GaFwoc~VR^eMk_g9)tkNp3ow1Ek zWS2-JztsD%%M58ZGCAY&YQ>IKASPh3l{H^75+JHrN0O4WeY^Omxk|Jqmfy+tb>Q5h ztkHHfG@<-P8Q#o+i0opihprT;oF?^sxKY%#n!%86b$Bf$;1Zc56qc2m&`^d_9QJyM)u11 z6C_V+`Pe?xzvxdm%sVmAf4~o9AzkhagWD_ab%GwS`Sw}d(b6wcInY#2BMVQX#^Qx& z&UU@)TpB*9!PZOnBmOghfTK{3p+MEoqIos0n6b#=n2)g}p+mfaZ$0YBU|^9}3$a}E zP$0yRk&&j+M<}xUXVHhy0!U{=K4i{_vB2&TKT4;gMR78kUSdgDHfLJRW+n#v65|eD zzFhlW2(Hmp&eFl`x*t}2+5z_NJww+PigP-nuw#M0B@H!e&nr|#Dj_mx_gnp0n*L`mcICVXUqyE3`_$B-Ck+JFvr^?Ny= zLYhS-T8vjjV3m@o)@kI|4wu@>Z%RBw1iBq3;0?J(&tpCX->n@m__es%#h8(x${u8O zF=yCi{zJ{aW&aV&#SbSHYj9%`DAsnvQ35C#^#SWj8^2dFVVI&b7^|QrN!*nJDWqlI zkwn!RB$VAC6-Y)aVv5}H{3PR$u=degt;ulWL!V4-5k3>zJRGia+xymP8ae^d4r<+= zfK2A*E$A+syD@_iGN(xfj)>l`qF@X|@FTnqkq&;&a*jEyDl7R5_fTn`x#0lP_7{Qs z029#0<*%(*&&k4s$&75+*Qb$02z7UFcHz|1KV$c!7n%o|fV6si=sga%;VY6|yu0=n z{Sloz;QwVh;Bh0TvR_=(-Y8l%~A2r&Jm**1q= z7i3l@^8>#K{UWBoe!-gZhm6cwL%yI)F*mmVMK7**NIc*3j-gZ>l`zX3^h@oA$9wb@ zK0W2e#Fw`}&zuGUkQ}x4J>;qhR8nc71ZBUt-3*XZOB=ARI&SxiTHYiCH^*YTlHSl$ z5tbj0Jay|>N43Fr?nPZVvuj;NSWjYRLh!!+((HnS0;4`10$&>CDVA^SWi$yMb&mN* zW(lb2k(7LqNaj3C{51GUQ<1W}sd+&Rb=-=yDA0Vlx6V)KQ_@$!st!{5jbsay1uq52 zAOx7aELGo}_s#hO&eyB>6NWK5N_tr7vTMpobO~Z_#){ReSVKpIz&76qF-gx4bsK!h zZmQicA@%PGmyzd#5{tP|P+p+yt#Nu6x?u)>|^xXMsJtBb}LEO zy6xe1KJm^GCw#=DY2QoSyy4vJzXl6}$cwus66h1?di1Lh2f&)KFumOjp+KyQa1x88 z_G&|?qu@Xcf(<9f+(Pl$VUr~BOzZCe(-X~O-zkOjix62vbEAjc^kzr2`OEW+?e#Qe zUgO3pRG;B4;vJrS>rMTQ@FDOb5HeQ97yh^q^Q08!qtZW1zN`_$-bMDy$q|>JDGXpL zb-t^Xz=y+&s7_PaoTZ+@&Ok$oX*TTlBwiAQ3>EOYc)-%v3MCqe>7hirSF^l=CbWK5z{&K2HkSXChXukGH4|8 zp;kGB0|_zXJ&Vo7sap@G&w{{vc&dhztX~wi2yLKDO8Qarz1evS{tAkZdNxj=fR~&qrxX3S4=~! zW|)$XF#1WqeY)J43QXnivHrls5jkddNGHzRgd0_Z!;u;L5 z?Lo`jRyO*s-s$nGO*z$Pbec&OAr{C%ZDe@SAU@uDP78k-#T8$y@(kXjw6U;HnerXpP<5DPfh^wU6nGWDh9=A82Zl==C!|l<(ky z2WkC_;JQE$pJTBi+(ViD1I|}V)>sgr<83COffXw|1Q_#m^=^%QJ=e2`)Txqg*2=5* zY5X1R@tp!zq^TK$FX_6rtq(GKHLwu-Af8Nyx=ZI<`~`34sU!#FyGO)+nU(Fv*GYZB z%&R>C>D#OMq)*wqc%eqXFwCOs5GvZr=CvFJH4{F;nzfOy`0AM)5R5ENOc<(18a}eM zK1%KR{vIThI)(W~2eI24S`4^2HG1wUiq$jR8$V7h%}B`*cH|GQ$$Z`V?Z!G6Jnb!u zHH0N5CTHFuNMHD_S9xKa;5FlFi{A3GGy)i(#Cqb@Vuv^@2Kw={{OlX?u(Q_~eNGlc zy_PynBbA}Fc1!z^BRbEDDo7nIx!x}^Q6Rq1>K+!2IBxgNs8_n``t6ci zJ2LS_n0)tV6ZM!{AtiBzXU8Yn0k^>T#;RxLc0b{jnT@MD@*T(jX26KJ#Lc&k zyLQ)JyOfG>zO*V0OuXN++X>O5{YD(NwyxB>!GPH>zBrGx%zeYbtzD2@V!|Asi;tMM zrlxDJpY9--oFm~WBS(;eH3-&^WxY$BCQ=b5`eSF!&PNkRk@=!+t3BXbtz(xOy zGL~CMK?);!(^I)>MFtb2=&|dJ%(S6s3=Bk_TMe@a7%GY1M@-k^yJUQf09^oTKD#b( ztZadkojD(1rS==)9SDzJOL8gN7%~zB5>*P2tj|1LhRlq^!JNC1TLog}oh9(773*j5 zli)w>T;~_z3sOyb!Dnx{?)*ShqX%b+@X>wrKm(NuGM7)3qE|EUO1mN^X-r1iUxZ?- zu?=lr%0wt4*56I`BHOGzGy+$1MLxS>lO1w?F^%k@8H!7kWAOB1SQw}`A8+n!O^q4P((jb8AvmrsF{L2&QO2?8Uv{eV;j4uu1Sbb-GLwK zgc(DaawuUjl_%fmXUZX2hk*#}0Kv1l8?oy$j0@B(C99{B@xU?C#IzG~-0WQG(*c>ZDiGJJFt-fDaQWg~WV-~U$kNbI&4qduABgfAT%J1s{Sbk` zaLCKmGu4;}@*}nVPMJ4VxeE@K|CU8a5EZ8FvoNv72Ss36_4L!Q6i-fVx7&5nHlwO$y!?ejt! z=eM)fpsK&oL664huwVo^0s8*ZcP8vHFskug&Z9<7^XxJQ)hc8y3Q^4H3rd2yEA20W zU}_3#Vy%87`oZgh1Lk*`MBd&c3RXG`r1y^^Cdvu5v|fg^MH+ND%cXdpKzQT3T>m2c z>b%%=PJQXSQjMdB`K%W<_4Q4XxjM!_1Gv6V0AeYlLe4U1()Ik@H`_bN8eabN8}(tq z;9BlRC1g%h`;9`x(Q$MoCOed;s%`K!;F@>C;pgW= z!T*LvKebwH)c_5^Ajk#0tbG;;tiO}J%CHyJS8v2nB$(J&)H4D#I^)6rTTf2hr=#ociuX~;-%{UDa z9tEfcR@6Nko>r{bq3z#2KK%fqU$iNN>32O9UbA(_^*Lh_=NIuJGjIeclIRyjsC_S1 z!S>^CI5i2>B+#2?Xvmbcj}kjd71c(se7HCoyP8mDYO7C@-PO;+C|3u;9I?bY(Fwf8 z3&3YHeXd{St)vEKetUp<&37ClP1v}M)ORCvk2KNrrRB)?(iGO>)?Q{)Qu{zMhXY}% z5@EwKvJ3-Iz_RB~aZqC(!sAw}{3JAF6(R@PZha~2I37ZE&hWqla)qf$)@|=3n1pxc zDEg^J-3>+Mo4>(sB5~~B7xfJC(TxQ zGGCD8MZ=IRNtyt0N^hb5MZlK0VSj{UN-~f^nQ<&94tG35Gx$Il7sSx*v*05$``5pk zD0MmWy<%&sONK{QcM1i^crlO>4wBCn_9xmotLPV<8THQzunO>65}#pQ>b3e8(br!o zYd_LjGOLrQi}&AJC=_iqG9MW>q%Uh?a+~k|I-Gy~_4o1XxaD&H>#xK0>(}qoKVQFoU4Q*n zQ9?8SF2B=1=f8RE@4mKwZU6q-ZvX!Mb@{#DehH$#uE$@e?O%Vl@%P`~`ODAz_Ake; zzpsa1U$LqB$|$>kf1m&P_i*~vJrjtTy*6Px;>TpI`cSgii2OK9wpFoJs5xXsAH|y3 zuHb!<6sA#_JKI+mN5Ri(h1OY;!8ikIfBG9=^|em-2?QiV6T7SdBh+Q~aH@mTqMH$P;CD z#$iFlXDT08>#2&ZsS?!kV1cEyZ1;;_f97gUOghg(?ymcB7R88&`?q^wss@k5D412w z%+12hm(&v;m#09BoredPG!WNdRH|CiP40Ha4xU@j{P@cvQi)?iiLWY7_yWtLK4Qsbl~ERI%}xzz ze8tU&*R}uvwya94uool{Fe`lRI=|)wi#8RHDN7w0I ze!JrBOEnEh50Z|P&j)?)H<4YotV+MgC%rhttT^6Wn+3o*+gG7yMdJ$+{{i3XUZkPbjTX*KJwk39fr7xp^tkJ5@;uY@5D8qd29MC9HKtcM1;U7`KFyK=wswy8fyVvk+56m zTF*jd&*X__F5iesmT;4055rk>u=)gm1T125#&^yjH$xHKgj6Z{XulC{!3FLD)Q__P z8zVjqZZwa?;H6(hd<2`V?$G@0Vo}t1_qJBDikQSX!`_%(_ai-OR>2#|aN|S>E+`@lnc{jD*_=oR!gJZa+IbHG3%w0+>jVMueyyevnf!HVpY=^5 zRzuvdIu|z+f!n5o_L8BYfVbxe^+b8TLugCH4D|Njy{7yka5oCPkCf;g;V?|dmqJ!h zxYf@>mniopQ6JtP6%pCjcBk5Ui=g!?!kST8A5H5C?19}GqvPq{7?sQqTHbK7?VhK4 zzc4+D^(U3pdb`1MA_Btk=eE@TqNjk3-^p$UKOvW_yEL@LaU)=B{(clSqBg59E5-Y44RQK;?4rltNzk7 zif(5dgy}HEse~V%TpIb$ETHzixWd5B5eQC{lKs$eAXF;P_4Vsj)YIk`=@SZdGF-gx zT}F)2$g-d+SMfzdzXIaSY1Am=c$kS*;`!m!M$9dBnLkA(Ihq@lXq=3EH1uuyv-(+R zf8Z6FBC0;JSAM|#zM}WJWQX=KC&0K$wuk9+fxPOtD@!#8iI8Y%1p+D&tuPXJX^*wt z)Kq8+Gn-H5A?`{x_wHHLX!ncy8~Wmgj~$Iw5bgB3Ar|sI;||)lD>cP?2|AZm zXxN+y3`CrVi0A87pzks%yz_axKjJuhFH!u9OJps%r!@wooIKo&&LQgPpT!2*p3udo zSB+Vd@xbBFnh92-w4TK%>9nD|i#$sjCE^ne4M|UnJ6i?K1D53_=k5N?mBT8;eDKs5 z9s5d|YpNflP$!pCShVkjD2BPZNvOQM~%* zNz7vWhGpQK*T_lCK0kJR@QVnRQQ0WVz^(r{U%1mxk zxk+f(+|%kVu1}KhI(lcy4h$CgaZUitOv_Kl1kDok*FK9&2QWYbwEW|Uvm%~B!cye7 zK1QbQQo2)y;8jd*&mowD8!Ah1(N*&a_VPM$0XB6_0O%AxuKG1sfc@bQ}11~tzHI(x?1Nxf?yLsOCacfx7)U| z*&@Q|fo5`H_KWOJ3;mTI0q#UyH=5*ejhlcRaefh!PTn-XkH{+8`pDII0#~@DzxyOs zK|nOdli_yDS&bD=QV!ICH78JcbN9#71?TKvM=7PNIX@ab^LFFkj~76L!TArLyZzFc zwDPH5%$wD2H|3RFeRkb;OPq2t%x-ULXN{?bX=+aMXKs$3ML!S_8%LScN4l71L>AYveMqIaeMP}}%Q=-@te`;9VG3PM2!mtQ2&)bSxu z%uruO9rY@Xksi|Jf7JvYS4g~kMkK2Bt~=jB6)wY1CX;zDjB4Y#%qcMWuDNRuv(;m{ z%DTS3)zEGAvh;G}bj+?ZlmdKs5U~QKt;*f0kOhXU-`%;h>O!ko5O%w@sx!B%s~y`< z{g5anxacXI!G7q;nyKwKlEkU%QG(|t`I%Y<>Z9c4Xo|5k_)DxPj3ia3?3~HEn$Vc0 z(%rq5PFDd8dOY5EBpJf|YAa!_aa|i(g5)w^+8`xS&tL=~fq>V(7a%$Gkz&Fcwm)8^ z#u}!vNd+Ldb`=T`c0(krGgmU?1~9lYDvavT)~lpZ4hj0MK10~%k^?5VYC6`r6lG(^ zj-S@sb+AP%k%|mQdRO0#UM(wD_2)+wAKe4{QZZ_Jd|r=Iz(5zn1qgBKD1|aE<#8eh zIf3inh&zs$(nm+EjxP+hWpvE!7Vqyze#tTg1ScPao@DL-698~MU6f+ye|Wq8gd1b0 zb(?cU;?8x2WnKcI_q&|%qdH4>DG$(+H$=w7`4LjY) z!1h_lh_tf!V2e+=)!>;N8;*2RX7klpP!LFLqTTB8`Nrlzx^A_Pn0fZA*km9`hMjp9 z2ONnY_=l6uZ?FDE;x3e$z+hH!MPguSd*+Ou+K5RPm^4+9x6q1Mkl)<-8PP6}FQ0`2 zACdY+e{lFOHosObE&?|?Opms1r2mxn@YehYJG2U(l~Hfte>W1Z9^y%&RNYXl;QALi z%OZ?e=S~w}cmSv!v4O!jeI3BfMv%*F)fE|b@tlBDF~z$a4lUMf6-Yq()2luLfoni& zAG&tQ8QO1z1reDV7rDebLwqrdGEXKn)*1~}klFj^&%7ESCA`20@r;C=i1{PdHt!d% zrLRm;UEheygRzp2jrBrgoS*;J};U z8IxdC2`2OHHzGjA&rZUSRX8e@G2mz=t3=J;`yB&URt`Z!(%?@>@ zt&(FizbH#a0Y?E0{A;Hpcou1fyZQS|qZ!Fnji$!*a7gRO5TQ&)J1{EDY1FiI;R9sw zOzX)W8W1D~oBC`^oaaa@0Wvp3J%L~ z!DK-pkh3%0BjgI0ZQVHCII7(L_sUd}{O1Yi$<&=iuA62=Bs-+ivVEkO%(0;l?U#lz zU@$+Cyz_RIG-rX*EudXOiqo!gG>I5O>~+h8;p+7&{H|Q5OnCE+IQN+I zfvC!kkv~WMi|{eyTNgi$`O)^@tKN|Wc7YE=R?U)oYXU?L#ovA*z55)AyJ z$Npf*2vMt(1kbGBi!A8VDMo&g*)xwIqPZGV5+Mw}(Z3u8qS^LYzJx((%oZy8fk=O z3Oc5r)Ub*)GXe2Kcu@F7kODnaxCbA@^Q~2#c`u*}Xf7#uR*46%m#U2)SC&Wpja;v9 zGz2Gk&e2vTf*FAuA@#270AeP+M#|Pt+)7kI#@u5@C5y?I{#j3W#{ihAfm&_43Y38= zM`RH(3caSz4*AxaJb^;|(X(6x7~ESXJ@a;dh8=nz@sH#D1}?N;u6K$KS``?)VO({@ zj6V+K{xcrD8EaA?cSoRIQ3|_L@n+r?qJ-Xedm2R)`W9LLN9PE$Y6;jNIyH!7PG^0vv;Ss4Vah;eMvHQbpBYntviD zsU5TO7qXa(`zg%;_e-5Mv#vFCmgIT*0mg@>a~k(gl;U=xk_HKC1}uQ!%rD|TIYgVgdT@RBF9@k8Zk|v zr%D*j*?jj)z3W~^lSujTspm|G66#ROynU=%JLl2>btA~4!G%R@n}#_eu^<;TvK8T+E$;&!oDQmK$xX?fXkBl!~@8|sB;Fw0Ll>-KhCtYSzJ)1 z5j_ZX1dr|8rDA-foRVke?Gm+K{5CBlCO+tcY$Ne+^)g(>1( z(5%&x20pc48Xt+Q@Wc9O5B1~dct7YSOy(g)ljq4ql#Vq^PnJQfNplbV&MIjH6H{mR z>;Bhg+Jz?0VNFffGP*1^iop$XW-Oidz2G#ZjUYXp6M$IH$0*GTYt_|fl-vqOmJid1 zRdZ1(oK(`vCFxZCEZnldEzFHa#l#Pqu5cUHtn#3(8w1R;-9;W4H1t9Rh~7pxsUxa1 zub<@($Jg2>DG(ceHjN#B4PBf@2$NYz1VPudWxk@NUUD0xAiv^f$e-SSPjc(f4H4iWI zIb18;df1cQ>Km56nMwVJjAU5{`Z?JL7nwmTjP!W1{Zp@L{M6s*PdEj}!6@(#_kc(SGSTRF5i!#?WVTW0eue@Ziq1UWTD{6FhDz;vL@ za*8`_@;VOPTBvS-GfJ=KLi>v}w812}XUh{oHh1S1s16()yj?}XODGzrsLAW}_;}V+ za!ciTeATO&j-!V-tJK2kFh^{VsW@NN=w1^DU_gZs+S?bOe5lX6G|T_5sYSTi?W zYNR)I9KXnR70Q-mc9{-4_jH`teJ>a((4c-V^u4Y^CHSfXD3`#+|8cU1{Ebzpdc-v1 z{35;ZaNOV1AY>qp#DWRsm3_}!(kUWmxvXFlbrVS zmg~2x{>CtjqHAsvTEGlBpiFg3)%wOTL!4fm{Pm?JAPi@*wjLSf*pET4s0&=9_M3sJ%& zyT%!0=D=`cu2+G%NVZKxnlpV*MWAcRj^M3@+O9$zqaSViuJ{7Hl#J(!RZiBrPtHJT z+X9QHK60--II>IZ`0Y`xx6d*KiJm}|nlca6it!pD%W@FftQi`nlgp?Zl`?k#^SO+B zkZQ^^>+XN1Bx2ekLS)lrwmYu{*AcP8j+chu9&%(G~Tnfz-5m2XW4QbP>hn3$i!5rR zm^#2Z@}+rg;uYaWhY42u1sy1Cux4RMYwvoB)bx^Ptl}Cy_Yyg@DN4R4LQ=|eTVd~k z8VQtX_lpxP=Gv;mIpIvh|3bILyxF*)w5ve(T!`MN3J0^F04Qz%$Z@9^F>Afb*;{n< zK0>#&)FkbKev+YNxS*gY@~GZ~-S!UP=9F!VeKSfBr<)P3_bXY1h17eO73<~=H{lYO z%!84ENg7a1V``W?weQ9706k>8Y;<}<1=zkHzBP||dYx69g2(=jZO2^!Y zy#5zGKxEpB-i9M^(t@8(I){i{Uez#E+#jc z%;Z4cYu}5?^ArY-TFp7S0~izrZp&-farJ4$IKY=BPZ&-|wBPSI$5ihC{%03d;`Pv|a`MGSgsk8~H_0S&~G`Gde!-TfK_roB?u2 z7Kb@UX7Fa7B7KP_^Qq3@16kS{6!uvq?i)X-Vcm-K1iCByQSvMr(+uz+7`8EAvGy0u zBs*2sQc2qQ@dZ5Tp5y-22m$|8rkpPT^?W0}X&F3*wI6ACN*ys}rDEHM&X&Ma>Rjb; zenHMOfQjiXkN|qzI)*cr&}?KoP0ToFn*5aF_$234S@%^I5{>B&s)rBe)_N9*3B$O| z>+zEWrbq>dS@DgS^0r@^yHyUFnJaB= z-6xUlXONR?a56Hab7?rw3M^%fnEEtYk5@ND0U5=PGK%`O$wRnR08!;vP!Kh(K5vjF5&p&`m=IigmKse``H%GJNNbuWvo7h!vjuS*edX>44K=4sNK&e2PwetD!`}FsDfBm}r{nuY# z2dT{0Z#wy}e@_3PZs8I9`|GdvYyb0?G~xX9*JbxtJpBLu`t{F0zrVJBZ~pzY{r%TP z@l&qE2IdB}R+>-Vi~o(HWXv5AG8RC)`>aAJV+!2ON6V=pQ};6Vf9n^4pWf7%zzy<$#V^9rKR-fCXEn>tG*T*LVOx92lGl z&25&L-sLI&`ox}gpA^%GORXP8h1PT1b>Z5NsN^oYtjPJKRnb=1a)1cku6?^OM3o3# z*de#R@Qsh)5HJVxTH4zUsuhW*`^X|#j3@uq+o>I`Y+F|!_v3!+)J&X#rC+t&lO9;&076#9K(=1xD3jOsWEvqd#LY`Hm1GOR!_2E*jnI1N!%NXu%1_KnT z3d$HxncAHz8)7K*ScaJ1{+0`0GV&qwR^}!FdC1~5^sOWc*Q+3jnCuX#a(Wc9 zRgGaoF!ZQywTF?qifWGZ?KQhD$ce@y+6HGAMSlBRs2(ygg}G$%m+SWwM0{g3C5X%9 z4EeN*0Wk}LD1~(r>ffT8i1PX)#hK0^_6eN;FR(;!g7r9dDw@^u0N)BGH zl5Q?0+DDb2^j6Vo-+t-&9#R)%#DjX!Hm=``J?{?DFIlJYdpbu$T{FKx`VMc1(>?zR zRbcEk0Xp>wcyJSr1>Q`z;Q_EYX`xe4$13>NuVUb_DnLIVUpl2^>i8NKNT0cVbNj_KZUNgJa$3L;szR6K~4 zra8h}yX&xC_BSUHqUsyjJSP>3`h*=uKO01M;%(lm%W*|ab6(R)J)=kp;%$!t^Ong~ z?DNzT0@U$_@5C8IyBg`OK1Ze$qJ0S^Gp9r&%byPRt*UTiw(lh~d|hV45LJ`7jo3Qf zGbsL8PjC*N?;;drFs>%nZLv@QWtq#=GY9qbAW?8B2%xf19 zQRFRbHQFB;bWDukh;2=Rm+FGml`tN`eZ+l~)3y>;p8!j^J&keIOeKRtHgT6&1*8OB zV(xgV-SFHTniB3s49L{>D1hungbP=i9IJjW0hahOt;mp>6Ov30W6-Z&x28=^7%3IQ zS9J;_bLY_)h?9X^%_R`$_+DrxEk#IjM6(PAa*oWUeIl75>8f_XXch=B+$R8; zB>-BC@om~axV-fV;P``9#1w5JgW=&PvxC26BsA-Ke9v>+ zzYqSeCS%Jzd7YM+X|@QNc)bwy`b)bN(HJgzBa8YJbbY_Ch#M zk(juvx~86Ci;?+eb$w*WLni5d*aMXr>>q}py4F@+hpFl?;kyyb*7_`VTM{4sR;uz; zSs*vn=jrTyhZS7EmuLymN-XgA(vAHO$7#l}o@&BKz7uNbp2|frP-pPqnjdhJVO^RAfXa8V zMz8_Uu{MTo%U5eYnb!h9M`MXl&1uZNs-(WYd}^*V?b|gS9FtM;fXd+Q^36i(MEwTL z^mEoSIh0Hwp>3j+oW(#$PMHX&`1bX0Ic0E#Cf4$%G--kG82-#@$CK8poV8jse7+Q| zXc6v7cba@$Wm~WE6TB&2Z90#{cV9CC2_Xfz$^m%$rmq( zWwlCO(t*fH!9hutn?$2owkml>{qJXk=(VK7fl-iJO@SiOePbmq2M)gsKeE60T?Y8f4609CKGym2(t!(VoU7FIm&2eWIM5i+%tnj?`*IHe52L zy-3E8>~@vdcj(#c#wH88Qgd@yFrW2=ty!xu&V;r8$z~ah{uATRz;Yc&tI|ic5z}>~ zXG7FNuomW^|0oLUOCZ}l>uLh*&u;f3`xz7ma;}o#W@?C$MOwax>&O9+E`(@mu%DM? zk`mKqjGz7ln8$=g@Ip6TTx+_N)UW7EM;y@>Q93K7Y+g=jvX_h?_*Opv<<+j=8|Snl zCXI=7^DJdWYp=c7&#Zm;%PIyIgT-9>i!2&R4*$DWky2brD)l_UFgXF*CYo8ipL3w< z-1|)8#fk>`eVjidV~yZOcUF1yYBNR1U#3m$$p3$k|9`C85z!K zJS=gJ5{|3_aG+%phT&}F)NNM*cxr$XjqcYR>X+C=7$vtlag=FeT_9Mf#D_U1B@6r$ zP`$h~Y!UrNI5Ub)=+^Cfaekm%P&EeM-V6UXLRJ`;tKm>%huj?uACuYfyiKhZ_0btc z;vB@S#>glQF#a$g;hEw5$$+4vOgX$Oz3=*oOr?jP8!eJA&5@n@CKEOAG_|_hRgl0o zzc;^rUw&_Y9YW-~?El&Nx9wkl|MSmZfBvp{C+K8&^_sDaMe>FzC#eo35qqOCY8Ea| z<`s&RVV!ddw6-32)}~S85!UKW?ip9KTqru9_M? z8uK;GFjTJo4ZGh};(QW(Z8p3y?{PK4c&Wo%w9S^0(h0!puFe=OqrT+~u{*BWrm~&0 z@?PU;`6GOkw~b5+;hNcEh#l8$!1^fysR+e>*TSTXU>i8SLIuZ^1oP{wI! zpNLo@oxabUNZn!{$Sa6lGIRj1^FfR^UTJ#Z?QgN$^gdbMFBX_SYVbtzDBiC%50VE5 zZX8b1*KMNUi$BPDa|>sw{zeaH2g@%EO8Lh(Co0ACQ-fR^b@V^9%f`#Aj}*w!$F}bU z|4dBK*`7=Ym0VH;O&q`MSA9RS)l1+%%6t>0&aukoOa?@O6x1gGuS2U}K=`Cz4rf3` zfK4QcakJ5y84F_aj~TCzTE8qQ%>bHH+))K!rEv_R-q8Kf>)Yyv^ALfUw2+%)&Jntx z4EPWgr*gQ(5942Sq38QT^U>O)?nD02EPU2pQ|1%?fLDVVg>cmf!sor*P%*LmV>=5c zsQuWja>x9Z&;d;nUqZtrHGs-+iLc*_YiF1C>qqme>w)w>Cjb{m=+zRHN4Xc;8p$X;#zE+}Uz!^^p3&T3 zvvh@PO`qG8e+!qv%)IqmkO;-7SiHtYxy^SaK!mXo_b%4pL*Inl04G@)TUVecU-NA; zV>4Nh2~8L48dQQcS9catBB7kXc^BI$!*P&nO#CtFtai6SNw&}67F-i^H)bw2Y=^C> z_)>dVpty#V1om5A4LXf4NDcu*fUbJK9DrFN#jVKTCK5t{Ae>2s@HPu#a7IVHvCYyG z;QvfjrN_sN`mJM8pGKX}m}?`!%znunMA;$2-rm%!dhZ@mY<@Zk2ImTg-FP3D5tbbd z5XV{x4TBoIlQwG(3yzxB{FP5KG6q$$FwSp_F+y&T&FhW8V)k{f#BSFT6KoYp>7t^< z$wi*5j5r(A9XiGtBIKtNEJV4}Ux(kn&VT=J_luRq{?~64Yk#R45C5FD|NQg6KW*(O zuhU;712K`;S-Qn}-)5E^>W0>c1>!DJ5fC%V0PhC3?#%>+xiIYZR-YwgP!1To>qoUC zppW>NPZhK)w+R4F_M*bj7;>ew_ki98k3m=3!W#IUaTSP>I{dHJb`!f{)M*_l(A;gr zL>s$D;KA4As#X6Mgo@1p&O7ed8P$q?!rBN23NqfVLdpkzKeKom3?{!vs~QIcve`#) zVbT?(b@SDwi(#cy6LhCnSH~C!^7BamF+K6i`M}I?0USd>eD&mM{gh&}Z77Z7a5LYC zG$3%yTj0r@?iNEtUgQR^?99MSyN*|IARQzLN{&mt>tYwAMS&iay?a3l(#%oKqE))a z+b>NM_M}Due@u15h4#fbnM)a?kZYZPoAf4OcdA!pu$*bzu~$`m)eJcjW8_Zg?BW#b zBXKe0rgB75U^Cx7QCgp_CH`VlQ;T!BC$2ZA@maI4R1-uc|L?RQ&y+>*M9kovcmIuK z@D~mZx?}0m0V*<}L&4=0Q`famgh+vGN{={-vrzQqG0bYXjzE9wRnlg>pb*a-7fq#T zLAHkF>_hV@SJ7fIc2R%iu`(fr1V1p%DE`*Rng=8CF>w|nZaeXXFj2*1B~l=QjP}M? z=7Bzqy|wv*h+@|nCBUaFRI1wX9xF98h$}tb;6a(W2@z$PMrK%hCcEN6IkMG{vX8t5 zL{mQ}9p=>b%;DqQ?5Yzy+ixVcxu`)d%P;egfqif?_Bnuy`t8bh3D#lV!}+_rKcKxb zEC&g#vi>cxY@2jBQ7XiI{YE2)Wt#nD;PAEdg;{J)Ex->3+QFSM#C%{^`&-O>v)zq& z7)E6ZH%%PueEfK{wEwUQS$9TC`bOq;(xjNqgfqm8u;vmZZ{g;(2X!P$A+qS-o4W}? zah*Du~$7W zlt7Io_)~1*T%1|x^s7i!HgLMd0*HNyB!qNAr=gxWNWAPcl0Nt<$?NzGzGFp4v%&_b zj&;T^##ko3!r)}c7M4`xs}7Ka+9y(oL$xT6=QR2y_&BOzi5@ao{dOhH3L_2o>2^y` zA45<(qMx6hD){ybOU>p13H@ z%Bhh**#&V}#CxL?NLQEpvZu;@U3>UjMQ?7xs#X!A z?iOlt5*hQ;V*q5o5UXcsYrJ+aMQhwcT@=q{!z%`zz0)ZKws^*6m33vi>#&m?-b^9N zZO?DScsw%isH?X%3dz+EhMu}+a;eN}jnB0m%>nVzR-bgJSW;xl4FB?tbUiRNep> z|B!ip5guHB{dL(gg!$);#RzIT|EVLD!AGJbR&mfjojzT6np;|YB)6LNWQ+k`&H=ua zN{e07S)Y&b8bc!!Uh3Nffs3VrIQdD3nK9lE_@zax4@BJ3{m-35v4Z=JPZ%M8AMdCM zwYJq1YkCBM6wQ~3b`KRrJ+}(M-@I@5AJ?|jj;4Rxd7wz=VN=f*V-H9~1;NotN^XZ) zbKl5-6_g?3wmVOU!jLldyTdl6`}8neWq6jsQ`&A+l>4~n8S*ht1m@)-9vIJ4)=p>c zMKi;Z^w-qnt1DK`_sbozV=CyEUIF^c9_9(|y_8X;ZaN#J20G*^yCe^mDP1xnLs*HAg?C&KpEI zSv;oQ@VH=PIQE*5mM{yk?cb{&h-+DItr^3}s|Luzl*}oMLtgttKG4H-KQx4VBZ4Be zTU69$I%4zHtGqJ^0A4*<<~JQCHJ61u&6_X2N5*HO3vr)HXa1x5xgs zVDxadi*u~|`mVqL;JH~8a{5g56M@D&&u89O{TXJx#1YUz7{6Wo%D@{uM?K z%>m(k>VZs^Bg;FQ$%_!!=9(G-g#T=LMXJ=YsuG5&+I8|QS6lmDGGdQPSOCx4H3pQ| zgCF5S2*JHxB~4ueX4}_ReBAN8k#NRg;K!-ic>3^Zlj4q_Nt@J9s&1 zl&4r6TCzg(Ug2h@7-}lj-$)Y|BS@J)zHRZ>cpY5&01<4k`WrEEi4Q53+nj4udn*1X zFhmTjGgeI(!GNj>Xq^4x7BN>Y!%IjZ-faY@C1moN;%dIM35}2-Tzk`eHY~8(FMUw1 zNfeCxSrPnO8fJ+dfH+2J>rC%W`F$I!<(6@0*I$}(xCS|&lf}S-tI`X&?eu@Z;O!Hk zC#$Vw%&Q&%5^!5ZyrXK~)?On9^WmMlogsiSXIlJl%2oZem;F5ugAnuEqGFrV=ukcl zdIA=Zht}@l3#5oM%_zj>Gva}A$FS0)K4SY`VwId3AFkP;qC^WfBn6g`drr)C^wvl- zjLy5z&$VT@9pd6p=-5*htaxtHB z4ZbyBTK5GYnwiCErq`zt^PFc}hIl2uSPGLyUF?hJ6}NBKOc19J=;11`N`_j;SzXo) zim$&>1O~vu&s?k6{M?N@lq%6eYmdm{Z4o z6^$nZ1l{3$qnK{Wyb&+73<d>-udDXc$V8Lu-O5LS`yDP{I%%*u~ z{M5%6*}6Udq5AlS`%S*4W*hX6Kn1J>@zAS)>eul_$!h=0Viq&)d-H!nLf4XrmNolD zWg}re1J4YS_37Gg1WX0@p>eIuL+KbtMC?v2{Mx5jeoT4>O(oAw?wy7zA33>)mP0+M z(j6a)=q8Rxi7%P{#@owsJY#G01Q}jT5(^Nf5*gk&Q$jffbB<}f>mc_o5?!c;IRk+( zaB-!znfpGq-|_=&cC%dp`Y7#4GzqwdYQgfQz$g|{`}Rw})x6}EtQ_-=FpLop**=^Y z4nn@_Rm>#-7PBqSDx8;R*!5U5IvwRIv>bf&m{5GAXhN37#6N+Trw+L57b1mSiIaGk z)DaU@68~LtDB9+j1fcS-(-RYM&NL?=2<;sWfKa=3 z+p$^Q>r}F8%|r&H05CPRT(Gj-4ei^Nbnr>h?jG!05+p?E2eCs^NY>v7;V`HwU~GO1 z78b9LP{|oP*N75on@`Ji4mk<1Ab7edd7p$E!)>X3A{;B&1i)qCWI8T%iWGjj9kdAb zD#C&vfNU~3gLub{UBokS<5sh_**&|yPDT=}8+J<;&L%MDg57s}lSJ%8+8Dqk&y-nZ zyhm`bq$5}@^%EHq&y5aOI^W3TKglLnM5v@$vTgL%0%mw_X!rU?89eAt)Bh82D8Ad@ zqQ}9w1u1QOt;5+v?Ubf@O^k8o9AO_XS{ZzO4cD_}L~Z1B3XR*Ar?Zw_3lUGaE`zIEt6 z^!L!-`vG@s<(0^dR&1bX{JuE{(&5>Dl2wE5+Hb@$l!`>(aovqCH<6<23RCB0Rj)$Q zg!f0bOqJy)ka)?%H!LKm#cD+ptk6_E>4xd&i445g;`!r_W|L8SkL!z@YrwO@e#w1g zb`}zpvM-FRx`wric7}KJ(fotC%Dj@ebKc;tR@#T1TaIib$)z?fD~PJTY=# zz63A54uF^R>SSVZeII2eut5u%nUk7C`kqe&_K3G>eNSuFVA{dZKj}opoX=6#DH*;8 zm7w~9H{Ux*eq9G3@{{T)XjlYN%b4&5xubNI6zQYacL3`<{RkeflLeuk+?drw|Ks+q zJx%XIgEoo1J4`T26-*Du34IXIR=-^lU-Q){$MtqKPeCZLr^J}3rz;_A69t+D$^tIu z$Shu=T(yLE)b|{@eG<}wVdG0???Ofe8$1N*Gmd{7rQ|#mTFf@5FHH7`ytI`<#8zfg zM=2e5jR_v%vTeTw5GfHiq>=s-Qq}$z<2y61Lj62(my#6|%%{go-q#N1*hEGHLdZT+ zZ>kneX~XD;xaTwi4ATgu*phqp?*%)AdyF>uOeJ8vroVu8YQ7%IP>TiKY43nrCj72C z!11OKm()=4+luYm<-Ut>6(&KR$efROM}Wdr`W*D@Rb;xV55?!a7o_nk8K&K@XsV}i zX*CL$pv`L2H|1ulKRUf*AxYgc`vSeZ#R^uO`6>LKf zN<22y%VV4ThMt6dAW3&(4(9>7eQ*VMJp0>q0T(s`XhJ z=!btJ>sfaIfC<`VR5wi7lMBo{^m)F5!89R%H>$<1`s9 zJb4}e^f(Y1;J_{uC8y1T9AG7Ymto`iMlv8B&%kYuw|lC^UvyzzX%3-WJJEaRGRr_D zghtjO^{s}0F5L5*9o7||5ibG$JzJevRO$8vxHWY5@F&MNLYrCU5iK9VA%1! zycf^<+It-Oq^g;bQ`x&Q2Jwawo(`z&H3JL{?gW_nu$vnW*%9kR`jq{G1_p3opb3<5 zE7doNX1^pz$R8dV(`BPZka~|we!cGY8-e`b=NV-&XZm}p9p?{O5P$8njLcqnvRX6T zZxkURW&k@PQGH2c+9&dnX*Uk%7#sM~@7#?z(gx9L(bgxx>>^3F8gzM@+9^P01YC_9 zEus3i*e)8T5o51AKy^+Q%SZx~@jt90Bg0Gj>O!fry64b$cAQva4X6=Q3w_$WYy zPm`D>i#o-In%29HW)9t(A=vQia)!`O{E{bne$C%iB@!HGGA8^H8mimzjp>Jc_SLE; zd{E4YFWA!h!w3HRE(2|@`n~8KX~?l_&S}IyH}cYdAP>h4s=txUod^Sgb7CD<+*#vC zX(S(c*EptK!Q%~2P=e^UP`hYT#0Ln%tN+(N5p*jCQTsfC_X03BUq%k>W>LV^t8hEc zq=}Vz$fYRIpbcI%d&vI10NGBtN)}q-7lFNvELJy}=~(|30>C|<(?TF+RB3zi|I7f- z{)y;Y4i}w4n%3OYClmtuBg6$>rUF(!f2sZ4x9a6+LWH3-0UKG!EegfehV|1-M#aCX&y`tP`+ z;r6$0*ELP`puAhrI~G^~Rz86ghxJrQHoTlaV~d7ToG*=pXy}gs^Ukf*{uXh~L?}@z zy)5HJfcjq21J270roN|*comSCgbZ5*-;_LCm)y&B^VYF0tJt~E#k!JT!vEqZN&&18 zET0HEodcYaWHa*tuUatY?~YIgJgZkxMsQC=>YNj>8GUg@rkd8KX;N2sXov z*RyEf3+R92V}J@1F~Qdm_y`Rx?VY!)1ZPlL8EH0gSBL}Fvg4rTlmOJLWB}fH!q0wT zv}Qt|dCmYYa|ruYSfGcGvz%@8*i18bwP|QcN$OQ-K1?NGL=zkn{ea(tj(H}U>l)Up zNHlO&HhNKcyM`EHFKQp|G1F>wm%N)&!N7)pW1TNX3oWb1$E>@SB);68-Vn&C?Ij&1 zqXP5!y*gR-+clKc)bS{~=SwpmLezr=>DnW}wC_d1m|6F!_`F?klCA`R0MN8!q+G9J ziVS29H9x<_G$qn~_p7UAhXB&9BGU1##UdDVOW;>x~S z03y0RzHN1U$#bo=Xjj}wbKT$JYk)4)5rj+}s&*CU-|OUkvA8&DE_+vW zK+|?C>QzK;6qwH(#iZLm;1?mK6j~69KZ^`85mrLuSJ*Ew9mTcbuMn-7Bk9oWU%oC zp#!;fbz680x^JnT(IhzS)vHiL#>eg>*9p4?jguk;cIdq@!_y!j_<@F_6}NR`=-32r zAI_6`xd`prb6m)RoM`z2lVp23cEsH6d*O%4_nhQ^+%_Qc?bOVE#$7SIh*R>MBOENP4X@j^#%itoEzWbs z4AR(-&c^iEM}QsbGj(6TN_sy*`If>r*4%y?dhwZ~Qk!Fjjv88q?~x}`Ss|&SlEpt! zR#QLGPfS02Wo8B*kL!NEQJw_D1BC!}w(cL%392W|73=%La7I@gEhxf z53PsZ>_6N`Czt|c0vCSp7i__}RGHSGA$IM5%fZBm6SdBol7{vLfOJV`s!Z)sp9yq& zX(-;y`BQsC5)G#~Cj{CZb4=NS$_RD9R!Q{6p^?k*X=4ki1={`=MH<7Dw;2|*ccG3CCxEggp6GS-KI4;` z9`~95i_;=xSgWA7;S*5W z!mew_38-+qeoUDk#-MVXOI1XZg#X7&+q3Z<-Xf!khl@w{pw(0`O621jQJ-m4Qp8SX zVvD~k^@u%vMvb{%>bI+s$0JHwI;YXu5npyxNYt#SI_~0I;bpT8TXmxjs5*8RuPgqw zb7~yRWiz_}C;8CM^B*+l8-^P*I?1-0E}ms$SexU0At$rFR(nB;56W+;=|(a6pIx7@H40YM+J#?=s}L7~Ws z)^;x!FpmG{!77Ys1;olvIa{$8d%_}DSuuO~)mjJq>rr@*M3X-Xs}e-L7z zncdu;00$6qL?$#&)R!4NPJrt9xY*U_NGZY}5O}n(ptv$+_#pYv0Z+gDE$9rm-R2F^ zLU|%%6_k$Z8gx-e#Wz*;g0tj3zP6NFf?7AY?E5q2IQmm^w?nVB`t0BDZmEw#-j{Q$0R zAc7ssN0I=)C0su>xg=A|yx%Y4lFOdJcQKMp5WqNnr!8!lTYZk~5Y1$Ejq^k@pDkgF z6N<)#2;6?@3wL7Z3IFJMyPWv0ud9ne-YZLMSCJOF29+`(E%&sV9;+CPX>qiMdKGz~ zxt}B)b5GxqasY3dhf1Yu{Y0R5j3RzlQ)St5a9)!Y&gcYaOYLvLi3?rU&slr-0#ib# zG-%D=s!sp~iIj3D@XDo-RMC@y8d4owrvB3YxmP7C?uu1(yfdIlo+*ib;c&H2WbAJ2 zJrB!8MuO>LAq_ldgjLmAyz6>*y`dr9|H& zo@Bq^jo8KLrg&h+V$|O#Jinx<0MO(wJ}=AyJLl(+1IZmuFs;(sTI?!eV#DzUY5=hyiQhBaaYV#ng|GF{X(@kmM&8&?5(Ito#OuG;kwKG>U|N|sya+xinM=yg&Rh?k z?Cld}QcJJ}x6+_Elu_oCCD}bm>g!cR6hu|SvW6AG*b;Zq4^kgX9@brNG{zfh5a?3AM!skpDBH;EiiKl$MFNzmEUzmRViciMCHZ^>0cSOYonmEz~* z;^#ybt!3@9`4-w#Qy(BYuU;pgPld+i$% z*Y7|3{V#Kt_J92k0{-`*{OU|;(BI=7{fT!_&N4E++(DOGE~1?)x3`;uA)}RdPh}Md z?F|SR1l_+Q1ekHg@`_crTf1Hbi_-lX-`U(MFqvqVktFx(_WHL(-le8hXXP|t<38e; zl1Xlo$1+OrFC{Z`e6TI@M2Jhi8}E8}8B5agOj*T!s0W+T7jDXUu@Fd|{T}?Z_RgmL zk>^s!&{WO&=DQOU7*}3wM9Uk_DpU&@M*78{&85lw0k)Kx*X7NhRcOi+_NG%u+p6=2 zEv+^Qrr3VzpKufKTZDbMsE*WRttzA|5;~tJ)-J6Vj8!7WGl5S2kYt3oiRquY^}aem za{WXPR4|2v8CdoU`XVMFf(_LQ``3Ecv4Dq~993>#xvxyZR7ja(+$G!J!U{pzX-41b z_xVe9e@^AuvTapNOPDL#Va!|x?}fl|{FQLfQQYfY$5kyRG%kdR3>y>KGl&_@GPza# zL@&ZdeFaVgz7b{*r$H{=`XvB>de_NXpf|cw6Qyo^Ss9pMlo`vSCExxQvWGVpc)9LG z2I&NGhI>}ifaa@Sg>mnJ=L7sB*_j?ShrF<9sK&RYoq;x1tndun(gI_b@fc&0cye-&%=}D*zg zgGibpgwAcRNY=;Cq%-W3P5)cM=+Ui-lWC0QbqCZ)8iqPStwJTgC01Vg5-aX`6yx=VH#BOL^E>#fQT7?t<4LMQC{S zDtyW_jR4@Bt|25lbV64X*sPs?7(uHYZ$=1Sk%*}~JAQb|FZWW*Ke38LP7w>F{i?W> z{8v+Cr3}~p907#V^0|h=?lE+^0r7951(e$Uo)%!knbl-S&LDk2ZO`m2fXuG-OTMx9 zlZ#2&#pj?O3Sto=ref;b?3=33~t7-N8*zrW9ZVFoD!36Dzu#t~?Li!8%R z@j;!p`z^-a4W`Ae0$B-ayRc3^;dar<(A&t6N@caO|B0$JI<#u&n=fTisd>Dk-%UPMA$RP(63A|F)J$tb(2eoKNH zAn236xm76SVG6+Ab*52*ch?i7SEhEX?*Nk#^rTI(o)f@xLio1|E&%ax{a#c;ED0zb z7D{UXsiD+2)Le12of~e6jNZ*i)x}rZ#R!hwnj-+tD^XhdH}=ZH$@?pVkI*r5n9&`0 zoz>q64}$wBR%o0Jj9PV**m9YfO>$D=@zLTD0Qw(|lbitOkjs>p6Nj8r9qSY%4uI@# z+_OOXZh0q5_wYac7O9honO_rd-O(9ShWm=6S^EuoA}^Ak-vNOvC&2BIaV&dn&2v51 zK$4BWaz`=xC}PS}#Z1L4m?#Z0BHj zBE3OVM{zO}cVm4hj+6B%8~1f~sJVbx2igTmS%r&w`fJ`ZpJ5qv8Kta3ua9}V^zL+= zW?r#GXV%1Atj$yvco>wizL<(nvZ2et&XnMUbiQ5%MyNUF6ijXZJCl8kK7D_)$-{LxF;Ot&52{#2%ww#mpmmvDna9NB0lk350po{7??JtL!~JV`9EK ziyv$^(QL1PnA#hN3w>(j_(hLGdY`{7k zq>Y^0rV9ZT<-V5wCK*kA0$``;FBmlAW5hcPdGO3pRHNB> zuipy{bCb4!EXHwgIX(AU@z2P2-u2!+h-v6!@!j;LF^*u5Sg&MgNHQ({0tzz@FSC*d zv9>^5F#@GORpxb+f-S$`V_=0;d~lffMhKjSwvu?X?%0@$R)d!MT1)q(ozs)iEXwzW?ELq&CnSn(|f8CAD?_HD+IEVIjn_xw@9A|&XGOPo1@+V@V z=uq$*d}$Yhm+Ig0Mn7OMi~B0>g56{?GI%X5xOIIRk$8Eu9bV`fSp{2etjmv-rJ4in zZ_$WGFXeK!rbg&h8$gIU6-Sl2;*%@9qf^((J5W6?TtG?~uq_GB*7)#?O5*Y}QJj#XL4o+5E3Bv(^vsbJ|w?&YGURLFZ#h-9`k+`;k^s`48pJC14; zvorBU8V-RpFybEjlXimWjr1OF!?iG8S60CU=92C0cqU0&{aemQK8Kt(*WF0ZK`u+` z?La^_>s3(BV}|`vmzyxw^S`yfhV=w>hNvPFvMq52+WSbc=f7_L?o1}r#!@#*AZ);U zMw+)zq$HBb-MCWEm;N3ax|5M|)X=*c)x4YDO=3 z2*KGH7MmyNMMiQi&AiXh5OC;y) zC7WvRMwA=OP?nS#YV8CZh5k5a#(?eJa^hVU+LY*zQuu}BGfc~{9_NvGtc?sio^@;p zQrS2NF(QDSsBa9O0(#Y_kz+pGgS7mU-ULmFz)SOhmhUSGdssO>5oj`{aQlsj)MI9f zD?OEPrfeFI22Ww>-%gQ^qm*PvC;1a6uV~#&_&cX@nbSxW!uIMKd@HZL?TCrirtqn! z5luupA~qy+SQV3*%tmeB3*gk-&1lz^9nzxGJ%*PC!>HqnO_u@aXi_`30g!(~oY`EPO-a$C*dTjmJ`3UcrwP4_^p0K3uDSydiClsZ2mVi|tCz8@| zD4l^D_2?BviD}ASJz2*(ayRWGWpJ4Fg1EB{3S}`OEvj=VH@m&=9x?wp89W?cmwTst zrD?127u%ml8e-B?ZvvB4u7TSy^=-&@zhH|{|2WtX4!?yn&f9;oeI71?I@Y;FXhuJ* z_;z4sUo7Tk7K3RYd>FUhOug%35ru2`k&+aL2=yJpfoC!&fNPw@Fm6axGq3)) zU?aT`?01J-p>j11APz2iFs{7z8^!E?XOEa;q?*TI*V{<1@J<0-cjuUrfw%O98Ik7g z3RwDTR3(}E)4ES&;Iw=tdXzQ$6V)|OmrMc^tllqp9{Adr(qXPVv0)giK868{h*IB2 zV*SNzGbY6ocUdZ3A7}kWtgzZ|5YW8G>I8P%Vq%>P$k0NuGI2rEqWwlcF$V)(aOXNS z;+4fu;x6l1?cpufp^Cb7b+?Lb;e~>C6JIWVtwef7+YU{?N9742Sgb3Z7F7fX z6MZ(Krg|0gp~!|rtEsYpAFQ)(*(~Q*JENO=0$a*v18Yq#buyB12RAo9OMOu1nDi3} z1PIbA3leG|yIeW!U$MM>BAsOww8t79-5m#)$$^&@2}M6{|4R6Z^nG@65ky^koH1u=#{ci!p%Ghy#^QDzrvNCNl^Cvdw5ReNvTdjGPx8RA!HH68ihGnwf-$X(TCl0k=7G4 z(Q@u1I$d3@%)HWCmR_~Lg?XJgDe?aD0njBOQhddBL?5zUg&2&O1*kN)z0VTUdaYOi zwDwDeZ8K?e1a_Bo!-|}SAu6wlCcWSKx2R(9zoeA&jmY0Kg3(oi98u@HP!^d7?k)Rr zyH`HrRLZ6}A>nV;kpZm_|AD$@xaY7kMVqHI=gbAyB9Jlz{af@tqv+g?yzdQEa=qeR zyWr}G83Pv_Oru7ITM^eCi5`5G-n;dARRcv6n}7T~kWo@5SOq=@c-c@ABlsXHQrOh$yL_k}W723x1^H?KgVFSJmV$XkS!JNyKoG zCBPK?t&5A_a>OP^$(#+TX$%gf!DVxX@7V39VCe z02HV|s8>;gn~4LonYRnrMd~3y=I>Zf;L^RtJxk{OiL01Z%!W{Kj>I^3fPeW~=>)0z z>ift$0sJG95qeq$)*yJgw%LDsU-f&D0qKyd&*mH*RBm`&8}?VS&HA3UGZc?4-iUBG=4W|xo(QI@G-laGLCv9~-gU7|%wTx! zueEoj%#0?}gSpmPZZl!gqZm@JS+Uxu+<2of;i=VgPOM_zDScxY=qo>Eyl#ags+i67 zO%i)p)?G55c_O))1wxSyq~EWCJYY`wY4OOwf9O&k1vglx)*@}`hoO7}x8^=l*6e8V zF3JLBb&WtqmT+>fJB+hm?wKmaAL?%SxUNfi0#rfCyfuvU5$qREA+kf>KQ@5>)ULAi zMX(Mvvj!srQQcn|K!}F&s(lD(q+uI~V=7xoU zyB83Jz*MT+b`?~FW5hyh{xjwDHbf)fPSA$b6>Cp`?3i-_LRyq5nKDmDqD^dW7J#dc-hdJ>#*E}oYS?IX zaCRStd#{QQui2HxMMz()j|_Tn##IR7(^X1j`vS(6atOn)g=kzfG$Io?Zy$N&Kcsxt&?jS<=l--f{eKjMQ@W4gzXdER3HZJXtv}V z>DU8|iK`As!1#;xD%=b($L!h3UmQXrUwIH`8!X0pm5gmsPw3R7SI$FBE6XfTeren% z+EpaAx#&ID>^kmWtci6WrD^zb^(wL#r3~&(!v&sN1;)**Qm;!F6O1 zOAwhE`i|?e@Xz1fX|Vf@{;OAc^2|{9QmE&>^~6a@_Z9o0S0mLV3=JsE#kN4x?5O`4=BEKLT4MGz1pw^{#snBi(fWJw$%*B~@1FyAl8|%Y?rE4nR8q2gRgh@;Y>D!W1*4?{vRCaw1A|UW(FY z?f_?6xQx#ekgKmg&2I4!a@&RaAtoh!rcS|AYv1nCwS(kD9l3I;I1usC(}k3RoZA`} zTB-Sy*&;KOLq@g5&XIDSdF5={n*=q-!72dfD9ala7mnF%b@ps4%P3EUq~umHeH z5;DgwnmK10d)%ZOU2DA-rEvXrwbH0rGa5MDt>n*AIusuY-8v()*{RE@WOA#z8!5(U z&ooMmI5l>@{w;7_1msLB&l7zQY4ZxWaJ(4(%$bIm>sN0?VkWpabM0?YHgdrZ6KA5g zD*?pIhz5lOZ=+ttZedR=U7h!0@Q@T*Ma+xPO7B6&`iOqgoFk*+6M z3KVCtUC&&0bj%s}8YNJ>Ja7Z#n&i`db{|RHqrjF;&3obDVYG~!MUsUk-9C|Pjca}; z|E%}|cDd>hcqp^d>N~(}s-Yu&#B|bp(zNHur!N>Z)O>l)&j{>D@KVk8iJ09n{NIPy zEK1SM2i1HgT)bVF?JC&E%Asg|=EB4D>h%^rLUE`V^*Ao^(#e-L z69x$lnBs4e)3sf0{-Bv<%6MZOKczB0G#({A1}Rc~8bJX875JVGO3W8Fmn+{(#S*s(K~R1i_Ob&M{#Iqcb!=TR{>iYn=gHL%L%vtapJ5ey2~h? zn#E^O83|hv9T400E;85)Y@T69Y<=|Y?`$HV43cjL$w=q+iS+Y0ddRb<4p3vU2S*?? zG>tN;U&V_I+YzzJdr{9ryrs}7LA8bJ-y%m~DB|4YOOxC9ILYy}%W=5sRWyK&fDS?( z+&kmBWvTSK@}U|#MDu=QFTg`5e~AL>YNG@;pv|s#odlDdcXQP?jr3Zj&uw4Q;W7|8 z+b8m0H7O0ZY2q%jMkbOeMTvZMZ~9d@;%NMQGH1s-h2-uK510gbCLdWxgnZ)RC?BoM{aY ztZ2iXjENG*>)(R#g$}33o>lzi-fhOXO82nWtA*Jr>xMRDzvy}Hk@o0ibf&@@Y=4Wg z4!4gn%4DiBihT<(QZ$FLMhK3`7=i&w%!+lU*u60jC{><5eqB$CEwD_+(^25Ln`s?< z{F5B~%4n*5BFTYULz`!L)4N(B%|NL*$6afbSb`nXFjw=}myX6#{ELCJi?{tP$`>u& zOmO!^Y_2eYm3k-tW=FUA3%fWhe&|GS9Ovj{lpewqk_QW|+UFz!)`Op}r#-9S?_TcA zG9xwCR;r(frWWxgvsCk2zQ-8EAfO$geFj>{;N#OdJ|PEArn+?PZy`>@jFR8!v!U%F%dm5>GSr-soELVA)2<|$RjSr0^lVsX& zM5w{BH23n<(=5RtzHwh9O{{tF1n~^OHnbmePb&j-D>yXdR*}NCzXkn8(J1*@U2cYJ zD8Rr&Lp=zX`&B|dmr#A81Tj!SO9cKC{irMmd(4ys1u4it4ch(|S9_+}ea%EQnNpWT zr&*7T|6IQckc_qKznLl-E5aSRD@qKWbp2aQ7{@e05lzl+YXaDf`Y7{C#H%)EfYp#U+Vu*XAo<=9a^@T50>stMm1K!LMsujQ>l^8CfK?;6 z&v=|RXHfX!VzS{#G2sp%`g}n_q^+9Vk9yaEg&ETl2zVa8#B^S)w2kW{@H(_}ygZQ` zZ45D2XPHGOwrhNlEu?xCULq_>&caD@DH>rh>%|>dB(4#HQ{+BI7hpHdm$ri;78nlH zqbQZ_Z?Ot%!Y4XHo=8c~K^^r(@TI1xcOCW)lTVe*+^{UL?Gnv@@B=TcwhkaaBAcKH z{F>c`DQ(s&N(2fa!}|J(RNyKS{vCq_>Hc4Y;>fh{jw*`!8)1vkkMFR9=05tKdl#>20Tw@1mpjoLJHoF)7bHmH zBh$WJYK6Tf#2GEyG8kYE_XrGl4d3f0B5Q&EL*N(p96v%Lh0&4pm3u$1`x)I2g#?gX+nFn0CIZ9YYc-n5F17^r=_Ff#UPY)r!; z07s$P5reQ00v_(`h^eGeOGG@Ew`&z9L{tX+0Jx>pyG}8rSW`g{6G0_n_E)5Q5MK@! z?GtgJSB|&>@^M; z47v)1Kuycxy+sI2H*_EKQX+ znNtg=k)xI~M0)iD_=#N1m11gV57)U= z?2#4sdcn(I%0)}p5-lCYaDArZ(UP=OJ~%fCW-~3}+u%BB^Q-0WBJY@25udnVhr}pR zMWv7wX?hN%^XzJmVVBe66ML=XKWRh}iPgCjgEd()xxD_TZ;i1+Wove_paoFxpNOd@ zSPWv4CxVg5;F;nf0G>B>#ixz2R}yKrtQ%H$;KgK0kHgT|OB?H~f=90#k>ev`s>X3M z!-3hekZ3Dm9v6{s#0Y23wB2(-NoE^shG&gHN?f>B*sWiFss|60!trG}tjhKT?TZx8JOm9F z+#*ct`nRAJ(M~gh%5TxT0l;6i`CRxmPQ40K1zy;uN=;i8j9UN2y25h~>yCKdiH61D7;8d0+U0 z-mZyrTErTSN8)s|uG(*;4KbfiE}wkey!pTXewY418RDAEkBuM0jLmOUDc~a{`bOVqdO($mwHWzg-l9dpr)sU9sWn#tp`c?c~<4 zv1U_#1f-`>Jxm1r89WbMf8;-WhPL8kp@6Cmq5cRx=OIrN23`YZ&8}k%xM5e<`rlQ7VZzF>u zar5H-LNh&2#1vTf-wlfvU@k_v>+rNlB13l?);M=qGeyuo*bXW&+V~>T_<4i;tS_|mvjJoh1yssS;peJ|vvkXR0DpPW=gIm+JTXEK>I6Z@onqMgc!DVd6K@|W-7-T-*S zKt0{hR?!a>Q83~bw*u)rPF|6X@$_iVwDd(D<(I5{m(fU!n_xal4&7vwRG>BHRN=r#Yxw2V?mDDYk^{{veDB0M1U>Zc6xQdQ z?)r&D6J>yGW$s1<#0QuRkck;tBl#YIc{*s0nTX%QPej87#Rne^jMLU?!3r5=4qMDe0VpymNh5DHn%&hnHL7=8Vf;Hp%Ya<5uHM&E^1F?@2V!K#C+r{ z3&)!O0zj3(xqVJEam5T&45ufml#$QSl=io%u<-90GK~Jn7(U@8Ii|!2EYz-|mkb|^ z=pp$o)44qsn43Ux%+0@EC0;)WM!r=L0ssieELe(r?Ny&?zUl62+@RHO6h3_;2rIu7 zroi=YNt4rebqWPL38oy}NLPX%EwO%;*ohq6?TbsyrQ91PYXz=~VD)eD-`C!Q2FwZg zW?pxHA$goU&zg{I?D#{L2W&R|`A|nGsE-Dg9sf~|sVK+l%edP_OlB>VZ|LhA>5x#` zz89fLElgN2T?N;o7i$(JT#2r#-gOVN)0q)`=7vptci>Xa<9_u6V7dW9ZC;Zv?)`63 z2^%JCpQW0yLI!^F_WpcPXy|Szy~-xd7Ur)iXk821V_5M;*-}# z-T0a64HgU_Bi`fpmM4lNg^`%lPSAUa;$94jr zgWAg9Vn}U#s+bRq>J5+r_$Iyq`2nxny-OlQ_8*s?<^SR(q5TO9jG)!j?QcO`5t8r) zhg)Inp*n(P%9#!6rtVF68U`u!Fqv{L*3lk^xyW3{v(~fT>^9XaD};~k0Qi%zFD{rm zk$c*;h=p?xn?8fv+V_HVDI28LpF2P|D(>Uf)`MZ5(yxL^iLL#Srtqo_t%e2jp^`aA zY;=L3I4~K@SI^@k%+)|Mi)8!N&DE&DtBJvyXmI;r%YfAOy`b`If6@z2J*_1hjX3y_x)7PHUIq6- zwB>^|aaUR>M}yj-O-q6MRpiZ%G^Z_@D$5JbbF#6A)``>JuHyWdYZk8ToB-LF_k!n2 zvTQzDy~CEqTXiwm0d@b$gs^sCuzKAt>dn8;>`d@$Q-0isf6TVG4|YG-ukx~ zD2NH|<*rN>k4&>%Qg4FGu8vaFg!Cli#u2rSl1l{Vy%q9SJsZ#^Mp*vojPQsIWO1nY zOFNhLtDhF5L5<@2y-21YYUVr-bLHk%(N_**8aj2azmZ4sK6Qnc&k0b|$VJJF0Sj=C z_8Xy6oMA2SxyfJHJz#Z8>#0iU`Px-7=#A(oe&fl4^wa=3*iPIlG(PH8kY&(JKdXcl ziN?;*f~*`9{+*zmsXyBPwNn0S^ze~rdb4Ku>WGDS7{fO#>)Le)-|_A28CtgxCAp7u z-UOJlH@>OA5zt#xZF46nNmn5@7BiEQG1|GF1dNZWOQZ5#{1<_NQ;>@d08b6tB5gRg z%=9t@a(S3ChBv)AH5N(8z0Tl6qHza3n1iQ=g%{FgQ5&F58xY&>7n@C}#XXpckD=+6 zvYhTL9o?Gm4gMs!M*xfefVZo}7kZBpLrtZ+e-s&(GR8+z{HC7HOorGWN>) zvSmj7e6?#vIN=_+IHux5;)-9tV5xso>ue-)A;o1j!`d%HdpVFlXM$I|chTnwjllmH zrVbKZpVfYJwSg__T}KhD1j$gRaUWHrsR_(ZiE9<{TKT2pWXYmIQU>&}>w=>|-h4LW z8S36dh8u%_nB%O>BiA-AGQtzf!&TWJpXIxyz5)Ny+!Oq&Cfd_zuqA40h93-@ zo}&$`Lgu9!eHk0qz87ur7cMQzKbGI>sO`7QipM1`aL(23~1MeH^`aaYf(8`-VMHf7$CQNtkX-*SKHS|X=TU(KWv z{U;YS$6MmD_MXld5u?LC#5}Bm!Egqz>1ul~F(}3%@B_IT)Q%H8MSg(qjY#AK=esU1 z;Dle)<^wQX^lEQdp~xT_uo7NARQ2XXgH=t!ARr|PX}?j%g?`M`R(6`^f#dO!gCiN> z4`}}(pC&8w7bl+xN*riZL4r%4VY>C1&RuVI5i5kLCMYeRPlS33Z(}&>x2t4iUS~?; z;NEB~61pv$HAxKKUHgsB8Q_OF{!#zvrb(Z|$QsJ5_U*cWaDE~85Xih^(c7SA^(Ym`vyPY-#hP(~(86RMDkDS&+8w=VGlSaN z9-)KuKdhOr&N9&u4|HPJj!m@CZeq*Cq>-wakzzn9mMWE!V_`Q(Ec zZny(5KUi};6U1+UdT@wE@Ah8QH28whHipfyV{d;85XUfKy}en5LI!UIp2aOe^$>~jCCL0=UN};^raO~qtT#EKkk~QZC5{c6m zaR9P4aI$`)L1u-R;aFedy(m*9F@b>W>b=JH?H$j^bK~55gW8Q8^WTG9Hc`BP4_m;VPuX>B~a(UA0O!z@e z`bcx@egI~v5?WMqsFO1YS@xj+%!B|*sogJ*9^}T5iTOsEae`1oI~@nxx@TjW+9p#W zSb7ZKJ8E*hT!%@1xUX|>bu(nyKAS2FGf(oOTh4Tco~e$z0`~<8RGyrBTFyY7EBI2# z9_i`Y_o8(m$!26dokDd0cmM$yg*O8FdKFiRo>Rt{<+o%inb&O>;_=qJpiI;d;mHH8IgpuXg5GY}~x<6LEk_wl0JZLh!v=*a8%7P28}@ z>xy!Sa!r3gz)`B#Uz&vt7z&^}PKEI>0uRAp3<>wa>nDO6?t-DtnMSwMiQT7T5i8UB zOTT!OOFedIos++qEP})?8cTzY^*7QL(ayMj&2bm`cyDEdSHOna#g|zMK*1T5wbb-To^W;d3$_-4?Z3-z0|J?GtGtX!eu2uZRgCLq11}I0LNe`9}}| zbRJCRHS^hr(q@V6K5P}lU;maT6JrS!no4dpX$bO@cVkdEZ~1x^BM0I$%a~_Qqf&&E zurz2Y<9Zd@7;ADOAKS%!lEzkQolH-8wpp{Vg#N`f$tbDGJW}Jk@eQI&!rT59o|d{r z83Hw#hwv|ZF~0YRty=SUjm~fw#WmgBBy^f=@aD(^-%M)yC(1}xhPNqXeIvqWQI8oP zuLyS1?GwpWaOcUv7Kb3G%3o?7p0z~ly{mlTYYA6gtg921qL=3bCrODSW+JBhh~5{DPZbM3Zr=-Ml+1}nL(YC7dX6<26^L>N zklwCxbgQ5J+hQc6Pw^JPYL1?SnOwh$Nn$2*!)7xk>ygpG%pq+blJ$NS*Rh=J0ZA3H zNhDQBLoo`mtbZaJ76&Hkzd1)DCWQ%CFzvefK9Ws_)rO!n@g;g#b9S~yJxD#zZN-<8 zgqxl%yZGMt$#4^WSzU9&+WPIHSH*e}p;&xzPgAv~NI?abP}i#%wdl$>`D>z7lII7r z71)bo+CLGRQ@%9+T+75I2ng=ogiTrN8=2Clqd;bp%N1sbo9xMyu_p|RI(j1#qhdGaLMV6yxs-0VyHS1`31f1~8&J)?I<9icdeseo^C-ni0t}IAEnz zdw}7K$uW0qM5YqfXB2zdBm7;sm)3=yTMpY%B+nB*d?ow_Yn7F+G4Uo+`A&RfIr=NX}rV{w*2( zj;JWs$vp6T!qYSV0wu?7P_F`cq>HrgCzo=qa>UcKK0KKOw&=OD7bhBN=Bmn}qrSb{ zQ9sE0X@AR)OvmKD%6Ey(2AY{_!r)#M6hImEJWr+aw@6Z?{P++5x?zV7qptvvpf8Pnc#`*vO|*UsjTsvn`dIFe3~B0B3;_W`MlqVVtF=Y*Mwrbz-)QZ2 zl^^jTp!tU~Xglc{B}!!!7*d=d!$GCaR3Ar-b&|WN5oPe=_pTR6V*tNum?p;7dX zUr=f_-A6ohr2(LTuU-3IRO9iu$3>V4V7wSZyanVV+FjcGMS#t?j2PHWMy9dxh{j!h zsX5!PqIt#LkR~8sT0Nr}AB+rX^wCD|2hoH)m9k)N`)?|TtYXkrlDXyLdye|vHK`U3 zrMP~(_6c<*m*(sj^#F7XJ=AaoE`x0iDK6R_r5+G~wS7p%tmW(#!_(&E% zZ})p0RKh0)UStJ}F{p9sNTk$KcVX_;zr|EQ{i8EhL^60~fM{oc5;U`))QJ@YQ9{`@ zp(mIJgjsjY^b94RBijBJiK)(nBxd?*Vea0vrMQHEeQOQ@oLN}InL)M6mnPAAOQzy7 zPjOSf7o9L4=fl~6U_-dM`yL737FLrWmHA-4KS_B1TjX#&`j<7mSQm3|t`lZOA;PwK z9aj^Y4=tLd971I@WJmbMUDdp=_ig}Gq7UFi-fq0YVSwbmnK#i#29oPTG+`gr0dSw| zk@G2H>U?SVF5*`hYR_1#wY!cUi}yQ9{;H?HH`|y_LBkQ~@=?zQZodIZr2@|rnGl{~ ztg%|oB-A=P)PM?;e!m&C0*jJ+BZN%O9MM4gUNrL1@yxp#eWST^Z`MJ6iiwV@m3oyE z>`*HZw2Pya5C$xPr#ERp4?xVG;jBt^$|e=%!57Kirzdzq~j=! zu1PRt`(D7zsw{$qxO%&f_!@{(hK8~OsQFUzbR#U$dcO7x3j9+~%8@WDt!9A9FX^&O zVERa%4iBJ}-jgb1Zh*g%h)6%kphU0!Oj8-3mGdQ(zi&Rl?@ z^QDd2kMj?o1`tMLn=@cQx`EP&`0BVDiI$YpiBKN5v5s~Y;GU7HQ%w+z!dLM*#d8+P zEkh%N*HNXo<9HIGY8T*+Gw@DA2H9AbJW_JA+nj_Cd`{@dR`_)gxBHCR-nG(ECu6V!zL<>4Jj{bF5d1c|4v|6ohu2(w@Aa(2|+48KyO5*HySf|ESfYDl7%L%-LY7+yPuTL~yE^ z@JnkC_9svx#q%4MpXg08tXzznu9oPdzK>2gz|wXy?73l65{MI83z^^5ufo9cX}~9| ziktw2lB5}!WPG%~ZhMZ-IH7Edz{Ha?SS%J^z)@1x8V%KP%>?R+o8IpD-D@(3TND%0 z`nO=6VKd_>iI^@$=KW9;M+@typ0B1S2rvwBY@KNygX-DnqGAzPM=62;9$-xPR=!Io za1H1HhUAV~=PwsGH40D0KKn*mekyFdB9*NozrGtKQ8>xRm+0;7vWE!4hy^Hu5%akA z?P_LF&!z62--7jYbrdy%%p<60G0CxkQUqS%a{4XVv4%USh2} zF|)(e!}hFEKdW#L;1c~&O=1;K1Vds4nBFIGz#R%71Aa4=>RgHz(EeB4QN|>`C>-7U z*qJB&iaOTmfk~Z^PG*V{x2z20MgogLL+!i8N(y#JvW7||N_jlKu1bUO0q_Xh{Xz;w zvq}}dIQd#n7P{ghKrw5k6Kumy(I-KGPn2>i^5nyahz6;iPm%%dCo_<&kyQjv(Z;YS z#CY+mWjY~2HpPojnGaUq{ zdUX}_h@*Pb^1x`Ry9&~59ap0}nDmI4CW7c{UDVTBK_;EF-zY9NY%N_vSw&|$tTqf1 z;Df3Ia7;BYo0P}x z5KySEY|^>ay60Um-zfIl^ihOd6nlA1aa}&#RM1ta( zOnUJ96L+I^a5FjDc;j{VU%vE!w@})w$biU`sas9~)VapJVatgDUhj$w@}D=z*b_y$ z+}#i&3mv&Bj z8yQTx%x9ZSx6K)>g4~Kt!3Ae_T?_=YU$$aQAH7+aY31=4G9bktH344A3rsicPmiNT z2n^@R)FOj7K0&Or$_Y372|>&Wu#u$^nW02oUaJ9P0EV8;t?&$Aa1~(Ax^xp70Q2>J zu?kL-i(?#+SR25wW#85^X}ir-O_hM5!e5m0^F(k*zD0Tya>PgdrIBuQfu-;31OVjY zyMnTpF?em}0i{4s5^d#}ev3I`+|=LH_uO;Mhip%P`EtN=;;!ZP#zqy>e`|=A0MkcI z<1lZKHR#mr-6K;;Y+T(aqc&@fQe4j^l#!+6iN1S|jD~Q50XTp4euQ4VK2gCmDS_NW5`8H9C;!Uk5ZUa*^?%Ho8<3GDPSjo(njwlLx zu91Zs)PHH`|B*yYXM{2lTIXlX+aER@#h7TQEvDt`8o!IgN2c(BjDSEYywK z=?9})wBxU=4eRyNkz8?2PHZ>=tJXJ(1i>UdL*}Md6QyvScDQ7!8{*dbi3AjzUvGFK z=J)uR;+b^vEyWxxh&2OcERzQ2qb!i>SO=}nB&f{e9vstTvMv8CU>mA({f(H}@FdZT z7!D+TRj3JsXE^$%6}RsNN0Eb_8gcF;NfonN(0NP^IAYYRP;DroO=y^Nl$62TE6h%= zTXi?r>?AB;)lu|N_RCmP>d?hRre}3ZTu^t-a9pm>Qbd0iOXz(>P3Uh}LCkYD-dLDN zCfB05O3^YTv)(V@`p>;0GTQKSuL!LC|@B$lA$)oBw|WpN2DJl|GS8FINE?9dA57R%TTl#I4g-U{Ycbo zp9q>Iv4nX{7Gz?@4sToff?8mLP`%3OMRjLR+~RKO{Fp~3)XAHn4ect2Q#!yqLfqVq zv4pbQwg^h{%sNwjn=NSM(B2---H1G+24HUNEV?1v`bdZsO^{{;PB%$0f8+@-O$tKUng45+tUpb}qz4yH3ef$;r7 zJN0QiG1$_p{PNW1{-R-RPOFsBL)LE>fky91NikSZurad$0_`|XwG)SX9i-+)zAq&! zP+zRHfyY3i{zk56@I-LGsnv{d*V(1#zQKs@Es{@~xrt+zX8qLD&|PQAiwbS(RL5Ni znd#mvq$PykcB{n~036B`z8ojw`V5*iPEyiXqoI6$T&)#Zkz^nDC&7x$};A= zxJ`?{tCQdp8Osf6)6H)yVYrrQ3|xHx=g=URQ&?muf6TjVzWTlV!~_j$O;8&}>_=G8 zJBEiQQfi7#^xi1$!ELcll!w$&3U47IRpTd(g`X<(8 z5`v6#XWocOMD?!2&~Sn@o`x^Q_UgqPHufowLG6jal#uB382aSgBpMy4ixPkriDT^t z56(4#or}Ony)05|RTe~P-Hl>|`~~3cV#N2Z^E&wj%J|v5>3O?|rl^<@1F~3h!*DaHL5~9IUgyvQw$0Aooi_djbyUK%MRljJ03Y+9ooJd(B zXnDBgUGM;`a4fKqO>q40Dne+ zk=9dSp0_1(64#}@xyt%!EAG1CBrqB$A(KDKU1t>>Fyz>OXUg-+B#Y$-+&+5&n0~+(nZb=d#}1~Ny3q&^ohSrI9Y_JN%o(f#Cg(?H-q+Ny^5=}pq~zODGL?Cq zRUS+bwo;y@51FHctfB)2Ki65F`p6_~_^#^(%D`N^eJ||EiNZ)C zSBK-trqI~)SW@2=ll>|@tC0_pR}$+0#lDfMAo91?4cimx@7+NHpJX0Z3Cy+wnD`~W z4<50mMEDtIskYuCRzYS^Q)x)&1W4yyX3wN~@o=f%3#`#h62ncVo2z4P0~zXz`k`xA z?_CZpl4XF!;#N?lXp%Te=!eXJ+i#?!AgiPBia#b*Nf#4${S)B!^@MG4kz zbD~Q81t@U|EQY4HIQa;)>@=j879mxspGcG@i|6q@H!O;hzrk#Q)!+M6=5=yPZgJpT zRKIzmZ?TK4A_KyYk_%4U#d$#=Q}h9N{a^b;++$?8nEWfR_7A*sWe$(yI&$U9kWr}Bw@qgLTQ~2=?U;@nt(e6@KmTD2Cy>FudCmS!AnolJ-UzCyJ6M^!*|i@V*ZC!KA&n5QIp~8l0l2aik z)K4V5kOL6#<%#I*De$!F2wY4YukS{t3UH{aiM83g&|zrMxMA>^>a)Y_3*Lat9OjtMKMm+$i|wi8Rz4 za1=090-$sKTQVJ7|MZiN7{e{!2SkkSl;47(p(uGU^zwR%y35}}w5owBXAdXBH)4|y z0;jgrvqN60SHYL$;e=M5d{=&{*XOk=uOaFEDzSpsDEa8U;2YR+;j2vUtrzBI)6i1e z0FV3M@@7e?!-5R@ZLe|D9`#i0I2(9wd$%^8P-bKDd~WgGyCY-XCyPyhzSGD}67n9S zdoY!+*M1{f>nlr!c%%77H2)7bUAh|&CU7kRX*@+7`FI8_1s)$rloLL_^jZ{f?Qii; zLR2~N>P!}NbH3qH&eZ{;(jslPF0Y~}{|Cjvaq>jEKHj;l*Pcc{Bw|Fs(&(qvNt%rt zN)l40ck924EI<(kaRf+AcI?tPM}a!EmC zFpi9clQY1)m%JK2>Z z2`vojLipO;FYeNin1WbW)M=t*gSI~T3z3dtPK0od=oXOEz89G~l8F<%Je^L- zSl=>Ed}1Ts>s59Xk;emt&O8wjzv$ z3yd7AmF{WP0lN(3wvq4jX547nRcx_{jntg;r8Tn1e)tGvqQSP!cPV>K1$jG3^NqM( zdCNLT)KI=ueF895kdF^3aqK#RY~F{ikPPrd2dkgxNbSI94(lYVs4e8)qzWRSK6Skc zk_zbiu%^G5%WZ0>fdV{sv{n06-e4&hnf7|}7hOI?2HXD#-fZ1!wST4TgxAucm66FF zL_QXq-0SLo03Sg2tN5LfE$*Yk##9EwCel8|mT2D#L1Frya^<{Tv&>vW%-wU;_ccna zen1mJdPl7m8?b0@+5p)+x!LO9!s0^zz@e56`YnVLG9ih4c;x+l(OBV}=jcoZe|4w% z^cR|CzazBnZ_*=XSv3$xJ$M+ zPMN0s0o&S2IA+E=0o!~lVr3)RBXeG-$_kGcxq)XgjxybT`(94WNv=xQi~9pYK=d=K002?qw1YC|q}9X5=E}`{d=sY3DlEk!1VN_{xv0Jav@?_= zHx~6-MJi>mJ7w-ZW2oDC<(?(lDViA1B4@yt!mo=LlPk(EYv0S2vPH{?Z$O?!1uL6@ zJ8)7;AG2QN%z8kFTwg8K1b-^%xh}p*U}jU+t0;&b7v*f3;sFI6yi$Y&iH{t3>2x~?SSs;oJYEJ$^2V2^I7lg_rV{Y83kMtvDpk(xxA zFUNGuW$)~*YtD&bq4q6rGjS@pw~-?0zv#57%3Bv1>;Ywi@5})tY>}JUN!auc`UiMd z>rHPJab@OFO^4$qzkBko%XlUUUwuz!E>>Jv*VNGa0n^Bcr)Xxvb!*?QI3j#9(~E&*n<8x&QZUZ~gNxuIDl?(zuwqCF9t!{+;33U^+v8XEoJbyBk@ zVl$KpFk0g;(RG0uXeWLs&i7=>tG7gF-gB(|0)A?&Fqx|64nRty{lA%DrxjKA8-ws^ zF*3cNGq86_`poX6>3H*qt(kGiv7}}+u#wDpyZGNOX`99=5PI7E5+4Gul6ML^(y~h_Jv#-5+r>xl4`z@%v(L1@(9ar z-|}BnX*z{z*v#I|^a|cZnV@*Q;&ZjXNUDB>`w^1NmrnW0WLa5@ozN=f6%Y8EXCa?X zEO!8&tB=gBmUEn$5%seG%b!o^$#|~Fy74NwP&2fNX+yn=&^GwL*zH*mP}p+E3i|Bo zt#bxD4q%D*xbj_J)n+}AJHQB3JsXXnVCtICT4 z?3bOCh~t{!f^1H;)}hDQV~Bg$RT8>eY^V^GHb6+rYcXAZUWQsn#I6=6>=&?iC>Xt zaiztfDzmR(Idyy?&6H>>p}8UqUdL(Kt2JZ+3TL9491}Wf zSYgye66Y3YIEE$;vgB(uC&0sy*@TPh9(cD|^O4Dx*bDdwqQo`bp#nXop=&fw{fiVb zmxL(>5%R;oxq?J$j7o~kN%xt!8*A5~n$A(|!rL$XFMJ62`p|wO0GZ-Al?@t0h-m^2 zuh>3%YpZ}9ZIbEc;x+hSN^89z-L^Wu#I4$J3D$(`H2y^=3`1qe8iT>*;K*K$MIn&j zMOJ;e*1OJg%P)1thg-ocXa#$Xi#zoPz?#Zs(n_S^|V8)=m)^=nHS^)aHzD}4IG1& z(|6oKjmVfh&1eZz!vZOk>5{wiIc{g|H}Ya{##CtN&V580rWLveJ(#)D`Zde`;h*tE z+xDedWvM6Jtivu+iy(b~<5d|Dl{Vk?8r<(0F1u;hc@auswdS}E-M-=hCosZTcKfdu z-I5rZL!ubxxof|8BFbm7RB+IP%B1~9tj2MjOdngB>i59G+FYoRQ23A5t9XPU3y`F+ z7r)xD>=)5OrQWr2$n7OM^5+z1vUm9gywJHQQYifDeq%xlP1UwZdg@hvYH9g13GysY znYSSz0jiP|Uibajq zb$d^r_N)(34wN7(*3r0YBAHAHL9e^q0B)$gIu<2VrW!^Y2Cvhg%jJSAPe3T+Jlmyq z%VCW`QtA!O#{q;|*Q;QvpqbMjO?OV}?!PtGGUU5PPMB#PaXLw%<|fHGdeTi?J`dAG zYh4!L9A=NhX*hHCOXil#;TcK_U;Q^C_duH$V=|fE6X+nBDF%b_p3ZHKNt(+`%61np za~g$m06YVLuL(kRZIAcD;+94Nr%jkLmIjMK*H4@i|5{`=oPLNs|Ix)ewB3Ld;2`&Q z?ZN(}V9DP1TGkW-+5nR+B_Q&SYwNUZ6(Kj?*90!%DA7{OokJsYx=(d{G0sLsq5K`x zkNp-^I^N+$JBpgW-MgI8@F3YouQ?oKHjvsRhu(0lVp0St1XM+|_g zeiq4&HW)N@_AdQ(XmL`JIAHa^$ZnN)*dKGN*)C&eM+ukt5$&_kOKZEEDLk%2F-d`g z0$Oh}iFbR$nxZFc$LVDG5JYQ9pzFTJiKvwzTzh$Zf`;u_`8Pi#EH@Xo0k){{_1nGr zw<%_(FEeYxdC)RNnAs;1Gw`e&lWMoTT z5kIdZYFPU$gwJsmN2kjj0E$u+Bz2}6G8Um;1-_wGN^>{wMZYADDJJ#sOR3ctiF6sz z3^5;sfDVKEm7iyJ;iZq5^d3h}cz#meu1`f~d=KEEr+Tk%*y!|QV!Avu)M*)SBTw6z zl~b!EPxn*YYKL8y=P21=xniChWBdV z*XQVomhE#GYc`dzI4Of?3!++c)Z4vF`N4n^V6(cprvBiy**sKV9;;o2S+$`9JBsi* z0SPyT1@ciMLvE*TJx@YYJ~C(6xu<;`oJ{@7%tfe~2)u$W>U;i?tE;dhrET}9**ycCN~ z_*6R|mi*S9mv3*=*-(M#7KusDQtkj{h4&p-GW_UA9i={;7JcWJ(X^>PHEZzEBt{Ok z;=bLxAL+Wb6`S0Nn1DMR4HO>-NdW6t$q_z#j5z@`ps{p123h6sTd%@x6q2jAkUIeA zj0}Lq;u>JwP~S(!)_^+<=ppp9N@%al72MJ{_;DSjjKg8F!YONY6?AoR{g6;35$d(} z7vXMRsCfZ>v+L+E>{_so%Xjn-M!w9?92&BOWB7^UI95nP! zm*~?VmVwUc49jQn3XQ%X_<;&|8pzUJ=Bzu1nQ2OPy^39{S4s;qu`W(QF$DPfzYb=* zid2rb8}jeE1Hht*yk>2hTv6k7AfSKXBqpEK-k_{qPKA$D#wTyw^z{G0Q8HOe#i}Bg zxj59!%n)cJZs7pKv#otE2oMes!ux5c4u$NDs@nD@6y@eKpnXBPk{wDrD4|vL=-PzT?X#RU(XMHY zOl9Mb`qcdQ^{HXb^?nf;?Dp+qOo}Z`hZZhHH%D~9+2BeCQsbDoKjz76X#IRcA$5>D744ZpcRS?-2?z2B z@QAs*XcyF&)j0DA^{~D``->>;IL2-C(#!0!pww7w>r8WwFi}{in5{uwWdZ$+_%w-r z%e)Eo-p)k=zTYy%+A0}DqIs{5PTV~peAvlMSI~m$ju`R)u_b}yLeHtpU{sn&0tA_4 zeF9iirB81APORezqC_89o-uVDFJp)57CytmX5^(aaqx-47XrNIBUC7`T_xwp0z#?4hn}LQa zyM2}@N2&j$gZa|f)&?f4j1iL+0xfdF=fxkU$MssAM%W>-7^=6X5+-o{EbKh+5U?XA zN(HTh$Ph4T#6D_IO1m~=!-!+r5Lk7R<4|A-;1wtF=7#AeNI5U#zk#jWQNhS zlU?<&z&C+ZIr6!uamYgb=32q+tj}Kn=Wcrs|MMe52j=s7O1D`y)z*y}a-!?B2WZI- zQ$y;88ULnLCs?%a<$}v#!n0Sg^15qC{UIc)gKPKn=phmG*bE|AQ#8rP|4xAF0~Fikj+MpmlUm? zZOp+8$JV#q=1{^ULaxpoDlLk9Y0r|$%LH0)IdFLzF@WUFYVqZ%tvZpzyACvv^k(Z5 zVEQ)iQT4}CK65_AnZ@aOFsG?mQ=^nH>%(ER&%9s%rG%U@?^iDH=DffEuGkKobPR|cJT-3dBZkbIi?Puz70yV*IjF& zE@yv&l-6JKi{kfya+?80F!X&}@m=f{MEIl3bna-_vLnL#rnYS92N)HZ9XyV?B3tlZNGfchX#%zDl z6&FbYuWz4K9BlSkcnD-;aeSy(K^XwuXZm@1!XSs&f1Y&pyeOxnK;Q3q;h63Zx)9E; zwx5K&eU?$!m|n-{JijP*P&4Y=TQbRdWy$Ty08%8;w zJ3y%i!Es%)m{dBo*x^NGa|WNFU{3V@crs~_NqFoz`pCd`fE!aH!#oSa|M6CMD6IXX z`WFFP5Gx#}iBc*7BvZO!%nyDc{VJepejLkz+D7|JANHa+WTZocvIPw_w!?&IV;wfG zLgb#)Cw=mzbu2Uf*`$S#!s=?`=b){Rye9O7TcIz-|A#jFSjRf}QB)fg8;RbSoN+|T z&}V5~?MFtN04g*d(FFPFlMuUP8VxsezRC3opiqthUvl2zZb=klAt!%rDMq9+~@05uY$+yDtRwnGZMgw!vphLjbZz_T_rR>Rx7y(R5lECAUbRm(JKfP z`&9-yWXktbvMOngJ98O8fe`-sSu!s}vW?lP4v^)-V4!5ioJDfkuW|(pXCBS0@^Lj~ zP8+P4Ip!nkRcvOaXy*cvsMH07i1<( z%BuQIJ&h?9|2OOpX=mNz(^81O-hBEk`AY^u5ryk~PUnYCz+5QRF!NazX?>Z!`fG z6%j}Kr5zl1&(^rhx{-d?U}i%1R9Om1Em-3|v0V@K3DC2Nhd@BBtP5L^ae%nqK8r&`JS`21o0B;|vheE_{LCEe&`v#%F z?PZ4B0I~JY>tDoP3i}qewip@`D+~nJ^wo`Ut#=({Ax2ktGl^1UQAl$9v1t``Q(F}0 zN*D~{kUWh;>>csXtYfzk-ni}CzFieG+B>nr)QwucALIYTsVdtt0oZ{xLn~_*gu(P zcEQhY-!2o>G~HD*c`q;u&^wuo_6v`u`b#@}&@IZ`LGpR+#BqX&sQg7%Q$Gu*X$PB} zalVm7fl6XH6M&v$tq>yF<~6i9v#eI=t571tlIGx9K8qN4!s8cv=UGgSV}1x`jiVEK zLc59>8zsv1u=ef|CD^&byQ*b$D5m4C z8VMI&15%T_omGn_@Qk&Nn_l{q~5j)zPADK=4i_RuV z(lYv=>^eMGu3-A!2TcK(X#Fg9nc-NvYV(calP~US378~P`?NVfXSZt@?9**A6Hqpj zfm6P9-Jf=ZL%}q-df3rkDe=;mbOFB-X}bMI7y84UpTJwtna1lOf#ApvGe}ggSBX>l z!@NkO5c zsD00&pPX?#ygoqoOML7My|R>Bzs|_45-NtnH+|T<3s-%jl?Aeefw%8Pji#H$GHGd+ z`F6oy@M;*A*hu{ezPw>zP@%sHD zNRhEhc^B5~diKY8{D=?)9_=r}+kryH%s3TaGLN`RQt_!NYPJZOkSU=vietJ8&a({I zm<3&>XRRkez40zTn&WF0c91b_!TcasTmOp)9B^c}dFg3I5D;Q%P+iDWA;ajijB4Xq zF5b0omnc^O$}VVD8QC!gm;-LuYdymkOej-6O2XD8J)2g#%e>1pF~orSS$L;^PzHa$ z=&E(9(x+$DoaiHi-$I~y(7m17o{1?K6emC?t;NFK-Y4v$I@X295H?YKEUm)j)A-ZupF7%7|17|O8yhj;R#uV8 zbH9FK-RYZe$y_U3cw2{LmXkBjb-Y>s(cA2Cfch(L|Y+u(ITAy;L3-r`j4?@jZ; za90O_++VEos&$aCGUf4Fhjr%RD)dp4W@Z(WB0#e=Khk*DQT=x1x7quqz0C~^Z!;@} zVHzFKv1VNn$VY?9zi#2X7niizymIf5Xu?MR>bzql){((rt2p>> zb9sPz^BLDQvODNLHKlQ_Z9&aB4)JYOjzn>d?N)C4;C1{N5Ru&muT-{m{$c>1cw|WE z|2ayMD^{Br+@O#CSsvOgnGHUt(KW|hNSEu zmkQ@R_t6V7O4ek^D!-6={t;|9>Rd#~xk(T-E*wb1MFX|I>KisFxxsGReA;fNBO@UL ziI<*48|cBBUUh6@L_MvUw~9f;8M-w}5Ea3j=3NG0Bg#1IZ^RRY41_Vn+(!m>!N4Oh zkTuqvHve)tgIpVf%QrGC*_FikLZ>;~ zgyMP?xwp+!aIzh7F3}1*G5dd1(}LeNbL2EFgm%V0UGW`U|=w|&tggd_){hq z#M-5JCEx)1At)ILP`?*U1ZCsn;jQLOyM>75&vM>;^7b@3iLx&@^Wttju9^VEcmO77 zc&(7pD}9l0Kp^M60GIUJU5!d}N34DpKo(hoJdmShgN}PTb-xTDrjdevL4>ZAZ(!89S1U}5sQe=n>x&B61zO?#k%+2QQsx9bc zG=fNw%-Cz+3#uR+1Q*B3>m-FY+-O6fGvvFDyF4E;g2E0R{Dn>(eb&n8In-k9vrrtN zWn+0veBqOiwTq;u=dIb&)<^DE8eeVYO`5_yK2iTw;g_Lhf0BRC+Z~)YWr{JP zQr`L(Vd2Y@O~jlVb{8)%t#3L34FCGJm!f8Rk>>w=Bg4t~LNTcVPnmMlK1-%e8zDkI zHO~Smh!-`?Ld2+h6G;V4t}s$(&XK8~WKqoQ^fEK`p?ww|?k_naN4-3YOy)`h?W#9C z+`Fn*F$K@vd}AcyY2d@7H$bZhw%R{SRuNM+u5v`O7L$}jt~H=BwZ+F;a%=F+=??##{lXic(QF2e>-^NLh3>d*_P#l|{XjGN-VoD0UDECVy@fiz5(K09ChS@;BDcBiZN26SElh4(@7re75gJlSFH!5bC#*ud0zYMJERhD(ZHb-II1lPK~x76t| z$)|C|dt2`aSvvg(75fvPXIPnhdwVSs-N5BcPeJIIrLs^xp za13V9Idt#V=P0+C9iP5Wa?IQ+^vA-5bg%A{_(Loiq;gu!f}Pe=+?G$S1)7W+^RQJl zZfSD;VNnY57%~KGAURqcF)R$;l?Z__H4pYA&mE5cS+SmTvM4L*gi&y1X={6pM%4MFaqI2+-T+AMqrCmtOt$akX2+nKt9$1h(JxaVS%tX< znp?e!D@6AbFK_S{9eje4@CEak`c>FXApK%r&NtFBq3P53L9%l%w9mo-?*kxH-%s3? zyb$qIk788z4vu!l2)SRYvN1(icTRs!+~SB`-vMsJ*rQR`&)el)ooUU~`}9P$Moh0? zUl~CODC<1pAJ9d47_=#b@3tn7=mB^4RBh^dS)#z3`i?u6Q=eY@Q10J;(%*^9Cd zWX^sOO$o1_h@oG_wCOnBr4LKLCz~=A_`w-L5>mfi=`xT^oLxF$%63|en{KmyZ0*&F zO()G|fSu7G-YyS+Dg&=}j%5EVT;+w9GhSyLvnZf%F{;{qRQa{zgiOqw0L76`w`T#q zlc-oGIF2;DeY;%5Uf5p(UZRu~LK-fu$8=Vix0Udcaw(seY9Dth@zNcjO?T*bo$)pB ze*o9x?OWp|ppS4y0goUz)7~LKu9D7?xvU|6Y6~SvHHf zm8r(r8-Xw!#@^o>%#1XH;r-Jppo-tWPrt>rulw14X{7|osRe|Aigu-O%tq;YmS@+tc{mnP8)|e`bWd zy{nBY*ENWM$)r|C`z$uDUgy{3$9yBSQn}CGEr;-DXkfhx8wKT=C9(<+I(jv<0$h(w zsjOF_{LF}l*!0_V%;W4rP&!2QQ}=}Fq`|piyBf{r7r6sC=hFyqsiMQHpXH6r?>hR` zjRa5_aRideN6vxuD*ECqdeon(%3ZS&7dQksEImeMdy$*wj-J}ybSbXBF&;(pk$|_) zayVa4*(Hm;h!BTiEn|@DA#2yWE_61^c3U^`1y2@YXl0Jl=JvF?lt4>DlA*$*Z^WYX zeYpG`@Cdk!)xXFE54TiP{S_U*zNL{ge1((7=8&@+mJtyD;+ALQPQ&N~SvZ5iCB` z1YN#3DYmtm*vgKC0q~l|#N1w8L)~J_?dYM}XTcM}7u1!TE|kfxko?ik$LYI&7K3O$ zZZd6=Ff@b%5pLZflb`afnXV{ zs5Yt7-G zat70>@H*LV#g44j+XHNfb#$b$JJLb@+ax{PR+<7L-ZT@$D%AC`tT09dH;vGoMAbxy zv~{d|>rIeaNO>n>YVF!=Dt$2uqS)>iz&}_)Dz*4^6b~HAID_EOn6OZENFKQSo@3g zUn8{K=vZzQ$sq4Bk`Orqsw;Ou7lL+q2H2M0D04_OOLe-3k(~MTZ*ZT`qUx%@bf&iK zPVRTGK%NCjG>v73YZ|FF?rneAsjfAuuw+4G<@hhbQEtqQ+cQnB%=;Su_UDZTcU1I2 zh+|CrZnL2H*o#Yk#G0bSQ!G4bp&}S-8yOfcaoROw1>+S)#%}8!qbhy|>=+Mi?){3r z-~%;i6VF2zAu~br*@vSP*$sr4>|KCC>umRn(a0J`23d~Q@-9;PJ3T2_Gg3pnictZ= zEUm#{WExu=$`z8dD%iue$CBSj7vzp6S98F$M9<6MVBz ztI)1#e~~T%f4A$A4SY@j6|}j}FH16hd)MzpJ#~S0gJEZt6TO<%kTZCIKI{E*p_9g? zz=r=Jvy3Lf%|N!^)v7o29UTC+4Dgq{7hQ8$C<4Kq-)FyH{>hXR0XN39mt#b3A_L(D zxdibV#|VRm+HZ7)P1B~wq0ldq-(7HjctX_SUnkyNjmHiG8XFqdzZPUt`9-D zHhf6&%K! znnYfRR)i3sIeT@y`e#8iKhiF_NPKDFg642wKtlz3W*joIo6%*cTb~o4w}44T#D`jm z?^ORHs0}(YO_kTe$m8xBz#}jPSNEjeFE;-f#oBc}QA(SUFhv;VAtX&}pT&mvBb=r| zamdB|XEePy4IgVKcegwPJZkpPDx4!KO#*yVW#oroi}qQZI#MB2=G74cI*4`H-qeXw z`+Al1XpDIKI8Mf+$-2oM%m>bu{c5W$K2X?!@b2|?aXZCM1wRsvU)EwC=5t<8#xUr3 zPJGG82R>(R%#(f7uVRyC_%ueEw~JDtfsgqTBShWU_Pr?7%$6Wb8I^%(;C_lfu#DV# z^(t|_ji`2YTX?NOZ!~=f=OC^1DjL8p)a$~%^H};FPPtCWw|0|^Mwn5Xl65gx;#~yS zC)!8PseRA6c8N&j0TerqqZx0i*;r)qT6^}@1U`f@W~__Wm-YZ}eyX221L(vLGEFc!l|;vT$+e+c+YKx7l^*gLuu@Q}!LTe0z?Z7{c$2b{&N; zS4hre3>|eoR5<;!AX!C}WkO0$fIqLkLhMO6uJ0pSf5Xr?cibm`N!>WWl8o_5&D6dZ zWt|QOhlOwu;4J0=0FEWmDyvH`>FK<*jd>L-m%eMlr0)a~C z7N)pAx6h(o!!1MFycmPA6jP@gc+1bX=2j$G&J;YY`h26X=_Q-+y8sQB`UJqAa2H=WPlB^cI}tWS3c{X5`X5l*X$y)tfRwVS~>HR=trmXfJP=JaO>0v>H-=R^f@>xTeIKTC?%J=g->yqIg|^lniUM zcW1_{0Xt{~rp^-H*Q?-CPy*iW^Iq^DDWPI5l9*m|L-j*4Oh+4b;tS5~+28R~MMII7 zx6i@}@Pi@sbNb<|iQq%+<%&d3Xps}`2!)JJ7;b1-dLVoXfn(e_WJmQ02!ZSh%Op$5 z2>@8r5iwlzofM(%FQNvZl#`dO{3V8}5(q}yQnT78pTDf|O(b)QN)i}JH<5`-mSDS5 z-}W#}WFieMHvmqkynEVxVVO!j+F!(q3cU`KVhbNrMXv=RKB7P-Vsi6(WQ??EWeP@% z`jM2I(WcFgsqI=L#^X23DBlcTrm^)oq8Ty{1Z!;e3poiLiRPTFD%-DpF9JR*dr{w> zi&LS=i`Q5LI^yp9dKK1VP>8Tszm_{XMC_`mtwq{mHLt^oWb&0 z)JC!0iie+PF^+>RE5io1^ddxk+o!^cwk4Y7)B&cfnDvI5BLTl$+lcu=&!A*fDNfEn z{ed%%hed^P#6OYYkG@;77Zx6}kHvJ7 zhuCyinks0ZEU$eQhQHJ?1imZQndvt}x+U^Psj?Fx9>WGc9wi z{g)+Ec_QC#%3mmTT#lT9QqQDr#ONW91m^1**7%DwkUSkma$LxX*=B|zsOv$^oRQkM z3s#W&>nP_0_@n+ePO4_5VJ+4B#rtpK5n z14zp+diW_<8%38nqlaq83B)2!^ccG;w!9Yzq6ROSFLakMseQYgj*w31sD{%!JHe?L$<%r(G0w#{j z-{d+9t@;;%&eQ!Dvh#~@r*xLdCNUxueDyanoFbA7DaXVYM_Ofom@_P;{#jfe@GWGK zWX(c^!X8-^03X1seJ=(Z;{d_o=RU$Z*U<&dk{f8?w;5Rm=UFgX5-UlP8zB0{oCd*3bJ&MVCBnQhvePIwi*~l zk<k!J4fyUf=1jZQ zjO@9Sb=Um54~G?bB@?@aoHz$W9kdQ%r`6nZj3fi9!dF~#mf?}=K6in9ymu6~3jVN) zdU+So*y#9}q&~<}-C0JzBxP4OEH6DXxL)`K#x(#jNX*-}3s10hac>vrB=^dPtp>D0 z6RM6uqm9?*shLW5Q=Jp6d6-!5RnMq$1&N*lft z*3q3K2FXP0_8a8`U$m3?C#6qhK#yUtxiv8k4}iJ;B(vqTg2&HSb87o6=>e?dQ#$aObY!mm4XqB$C#$6dpQ zVAH%F`{h}?VaJ34heEgW=fCToH;>hn2A6WOU(cip}Yk-r4qzxVlAdL~nijZHYbyb-+J{=K{nB&OD3 z#cJPic@TG_d4Ny3?b^5dPp0Bf&l;MuCqfdI^C?qU0+%*WwtAoIt9ocxWy>jq@= zbI~53Gp$$7LGf}$yXHL9$6XdSs2GQszvo%}tUq9fU&$L5!Sq{1JN6#Do#OS)*W+Eg zrRbCY0~Rn;BHr|Bs(HKK5kacCkg_tMXnm$Zg{&&vK&!*S!3*@5EHP5UGOr_K{Retj zt4v4OU&c?>gh9S$WE~54E30y=P&%u5Gkhkoj*pSM9^{?Dx$RUxtB?b5!ZVXBCqSBb z){3Gs_#ESQ(w(EQq{K=o9R6Xl<`dbz>sEJzS@EvS4z0r1=bL#!8~mEBVrGHf^geA3 z?NJVw^-FJe=HA0pV!SK$DbF`t4C=ki-S8<4MOoO4lAAH&JlIYrJPB-vw& z$P(*kL7Jp-{PFAfUgfrDC4+n-mv2|0ny_1l!d7P)_l1|3xhELY(&>7YXbcYD5W(`L z5t311kQp@vXw~agK#p2`o4l@=h4Ft;f^$-u=*{Kq7F#G?cbdm~*YPeoacx(g1!vF$ zV4h*%ka686KbKh$Sve0GY*Ib~bB-uRqkTpKc15-R3|4W`djv3Q-fny=Tuynz22r$_ zhgHlW5V55_a|iHw)Ao+e#w5{i|BKZ1J}Oq20M%;JrqTgLMW zHQxv;NZqA@L-ga)Y`+oXQ3haGZKp_vh%gK!Q_p6Kz^9#Dk!_(vFQ!KXn8?a`ChbD#K}SO!7pgil%oc5F%NFtI9c>0@?c3#;W&EB| z%S%tfhg5R{pFy_`;!v;h5B#Mv$>hNQ9iwRV?NeXB+-S%-I+^ves7Ul~QIf}Z%S`~K zWjqHAWtdjq0j$fwE$ZLt+dEZH3=cvOc4_aHyOqIp+OXiG)#Y}+&ph+NW~Nq%dhOe_ zFX&kLb*}7i+-P*77<%2$EklDv4+bXa&pV#|f{&)tt<}b*ftg16ELMRMqci{JtA+Rd za;@=-(%fn@vM{a0+Pe^w$ndwhP_EUzQ)huuz|Nx|R=) zd@sUuV+20tOSY@fLsHIV!du?U&BUU}=`d+nq@LPygh3V`DeTadW2U-}a)M%A6R2Kg zyaQYsif5bmZbk^braFt!wwtN_MUZAgNuKPm^NpM-ygkZEjvNSG?LCdR66yjm$)LpU zMZtzt%P<)kQT?T_yC>@+$m4puksQEa1g=9^+wCv9>PK+wLLHCRGA4MM8_G0B_v)Q` z6(E_U8Q(9FK@!6cNrla!&o$R(K~gVm&$NHMTlp%2oBj*GPxCM&tnIUmG6ublYA%t1 zg+CNBQl0bN?Om^e%FH0^c>ucP=U^wL)yx6x9jK_*?2AA3VKvH`4*8eUv*b%_i7}>6;iVcd%CfSi)S%lC_cWV+sVk{NyCUN^F7SHZ!^=W zvp3?jsqi#Yu!eoC*r4d^hK~#NAc-+=UsL?=7k!jmGGIM}Se^Tc;ji#z;6EhQa=_7{KzeuK? zkvt(R+AoMxUnB%rK9XAN_U1%8HEwEdXt@JmLeLA`zqrBp$K|smA7%QizS_RJ0))feqN@FqmvtL3n}g zj#4u>Y@pG*SqqWj!@TNMm}$#js9|( z2=IM`WEzZyqXvy^e-VKJgJ*rgbsBf^H72UX_wd&??&8?e$|Eby2rFqTR{F*+%TnC=Y39Lpd!~jhM!weP!?5;*<%)sMpI$P}>kn$r1=apBS zy(>!vF=V`EdhRVZRKE#w#2iNfvGy(nw-MWCr!sbL?R(K}QP-=e*KKdIgYF!mxiQPE z+Uiwa#`l>d=9lHR*E58I(-TGuTK5BV1Q9r6?I!o;u9Jc8`qgSJGXh(lD&3Pn^`v1U z_K$;rN*YJwB&R>~8*eLN@r*uQ<@jSHpWSZyH}SCu{i%H~^r!3?xH2sM3(g{X!Wy_vMmHr|IZC4>|(Xo;Fs0HR6B_$%FaNzQ&O)Naj7y5~7B@%75lYSNk1$YQrAcx{Ycg3I)iPo~%Ozt!<|rW)<7l6()*10nCyK z9ueE*624tqPaCFbG>{gbNqWhpaILxi=*ea@WIIL4vj`2ER#MYMsZgbeFZqgz7G75S zc4MJxB3rbQSw*SDK)_G)e8#l3t3*5EUZo63{=)4(U;c7ow8jv-j&*YNV8W`9WQSDG zvIaI+E*G+|`ZN+^>4~5XPGv(F$V5Y$3GoX@x&1|i&WIu)pt+CSu%w&B7wTGctUA89 z6}1t7hp81a2ty0iVMayCIQRBh60Y%&U5Jw%%BmRCKw%I1KSA2PETlV{NimWN1X-oDX)xQ`SPuP5?505x?$Ox)8%qEvBjwm7Ck zbmhqqw-;}hA%Quh>4XyD+jspc6os(})uj*r1->AdGj`JZXQEPmBSwvkYbbmNJEWr0 zICmz&h=v#K`&9^hg3E%ld?Q+4>d|XP8yFZ^Bl+AAG;VEQ>I<(IWh*38;OJGeuVvFy z!RUP6-1lf-In&_YSB$-52}7^jz8CFIk;(oTB?z-{c+!Cq1lg15v0Vl1LkGYUc6#Od z?D775%f6k(Rt=~Iz6ot~Ud8g;?1ZZeOEBUunB0k2GY+L}Zz$P+>61uy@-hNT^)1cceGdK#gK5D;8} zeT8vU{~}5(;oAP46A-H(jy<3@R@M;X_Pqd>&4z6%5@DZ=Q6*5^nC&RLL; z!kX6n@s_n81uP?E>Woa%qy%vQHzC#>w7H-9vIs1HR+_!c`HCu0ha$>EDo}sbb=1h! zI&9~wv1mKIp20%B3FQD2vMWq8vlnf>R^OOa_>nl$F8G`PJ#)sJ`ZedY3hQt5FZ^HJ zJwR_m6kG%IEO;WWHAYdGwEm~vb?-~UiG~doQtn1>`_HElIj(8xYP||}G*%yO_1v%^ zM3Diz`6}CM-I)BM9G#6SCaY)_#)eN&3Fg5N33ZXJuacitU;T>|j>?)TqP-W!qrP++ z9?;qv_s%>gd>%fO%abzBBG4NhM_7J;rWLH`F#xguQ`vAYm3?Q%nMhve3^5ooQWm{G zH!Kb!cA5d^7!4}zdhb%S+jK^~%rBxZ5N`NMUpT0+_GsTO!wJ3$1a8x}|C_o?PRn)! zwOQvTzsT)M&VghttRcgvKO}Dlmpbu<$J-4yEjv^6{%>*c0B+mju zG0K3f3FQdywf;p;oyv~TU`=UL8S(ORBovQirR{ss;*Q=}>OC1e$N_^a6A(2bYYoSV z=SJR4FtVH@U9hkZ1>I+GkNR1lCc2;7I0PC2+)}Xc6=nrTH*1?TOu9cNyi z5gbreW`p%AAV*&X9WL1+_aB^Y;o%Ma`vxB zNFo%Tw<|iJu@EaD!EmBzf6>2~5f1msxJILww2piu?xUu6eKHg5z?8Q>M|@5YIvwkY zyUE1IH$wLX^Qt}pJ`KPEHnliPcA-fV&QX*TwGu>%fzpwCesxgwZiG+x9p$h2h3(sA ze|JGJ{NkVmQA(PpDXT4}t57Q*csWEWL~F6?qx~hoX1sGVOQ}T&7}s6o2iMH?%Ly>? zR)5c)VcmvO-2Ngg2;5;41XfMrEm3s?g7i;>u6C7w;nj&@E-MxAgGA*QnZl@QWKo54 z=Zw|Qq94sY&(OnBF}dR4%_v7MH%WQBin#?)vTbfDPR&_?$Gu~5W}&hYkDVU_dzJvy z&w>D~Ib%da-b?02FdTelr~*1=oijwG!wO11Ik`7t9m8|SWOP9#=f~kx*;6nbAMgAWF&py{JHtZi#AK)%FX*ReUSbZIMg2nW{edoxih8c`%PZ za?f$tG|F!oXfP2IyG`fPSBh_Dzw6LcB-{EE@)f^`fd6i;b>7QM8>jt74ztFJZfD9f zeh4VDVujFc^hM3}^Epr%93|R6aTCW=a55ImnK)lsPs;4msCvDfiBdPkqvA;9LpeIM z(=i!R8jACd?ryTf6cV_%M8DuIR;KNHA=cX)V+uccTt`ycCC*M=uCqZ=_W&O79|Jl$nT)3M?YQ8kj6`omgm$04TFy(&1=s0s$ z;5;{H+V!D}71D=G-&v?vkw;M>y4q6*2;+tnGx_73h;!FgSx97fD>M>|H6HR8rX6jo zb5XmRy{rOrkvu^zv+D%zwB@v>C1$m%7X9m`qPhYY<{TmYu@4|7Lgwn-FU~eSvlr>) z4<%;n=jR-9z5wX$+dbgYJHW}pd}$S*rU?!tmJw%+mb+zAV}{N^3dC-;31e>vWX8<0 z?W}cKq>To%ripMKx<}#tIBG#Lrf8&-q!&ix{fKRD!@PNOsYY;O`iDKdUd z66Is+BguHhM@9rgzoB+wYj%djwZXt@FIKHbrysR&L*uPRB!hS=X4BjGwqjaBJK%B zj3kYT25XRZ6;hgymO{c_As9Q zo|c1~T>Xvsrs{NNh<4r!hLV|5L8(rBX8Y)E<4Y0Ar&mTs`pnRYFa*uiSorq6K-iG1 z2{h+S>-@-=G57Rh8S2(&I+K+T^2u$d(bottbwFx!2B0RMB#nEyk#fELMM__Ai>~(S z9~or#fV#OZO|Y$%tZcDNS$3VASA5~mO+L!y0ngNFsGr53klu22$bKO`g)T%ZY!-kN zzFp;?XbLqU%wE!o)+^6_B*Z~AIkKA3;KHk)B~(|xV-wqz%ZVnVZN?)oks)R!4?YRV zp?W6$v;2ekjofw(UL>E5AAH^m;vXCz^$E03hTOgvxE~94<@n%I($kBtM%s$J_dVC= z2(uNcd}LveDCPQ~O(ZT?9%1~o3^1b)j79<2X|1J(jaLs+oID1sUaL|vUXcYQ{&~8= zXkeU;Jqo4bjmLMrcd16rZHfO(eo@q225*r>N$;HV_U*yPPVt-|J#q2udXcU@wl#!Iy&QK-|AR!aQM=I|dX`Snmg-C0(PK}1bI=HL(Je#`z zWD{pT7Y6Pw$IrbkGmf7)ywi4X?*IZ+K7Mb>-1rd4UjkBbJ(0=FLdv&`Do5mWw;=#4)D2FoS79p110!_)WI<$66jfL2x?o%1b57WyOX&&hnK^%G&Q|#dFGx?M3ClQmZJ4TQy71QzR{Sv8NWb(@iRS}7` z3-rCJ)|74SevztQuwR&^%nfVID=b_e3OzzP)UKk`M3mjAl-Cc}dNu7TF2YWLkcoHb z9LmXwOzLL|BjTZ_5PTPgi2m}5Le}?JYSgQ!;B{{qv*o=oPuIdRF%*KGfxPu9H;x{@ z%E~eMr1035W6H|}hWc4J!K&>IqM2``F|93)+V4an_q33}Lx|D+ zQ|Z|LB9|auUXsDtFQBm~2E1=!yk_?EO%)(*UF}6t>W_RWFA_bPrHv+7@?EO^&^lfA z=6Chc8<998Ab;~=!$i2L0eBb6soH5|>HB-1CJq3J#Y{eJNM+n14W|#$p?$j&C;Uyf z{J85xcZ!&!y_<5h_6^y+NnXuQ-;_$q6w9!@Po_^>(hF2+- zF;~7_#m>dOy+|26jay#ibUmTa$~~_2dx_1P{lck#GLOHZ6^I#zlV=pjaIDov84*Gu zdBjER_X`RUb)r7uDDaq5p3tr3bu*G*V5YXR zZ!vGd1-V-ML#MlDMbLe4mN?rnH`35 z`eKNHj=^w@#neTyP$irawBC&naF3{2{3R@I(FXI zi1o!4!gbE6UW`G&%L59kF@cFtcUu5H8enm?nYW9EmT6Ov?++WTef^~k6V9w6hk5pk zPi5!jDpBy9+gK+#rb{56+r%TYiX@8sl{(VhsC^HtgBBRm{Xr!wPXNq6d96_#<1q-+ z!HGl)i}bB_{zrj^{_jIO93i28AMSa$etJJNIQ6sKE-ZSqbmwk#uh=mrqoHlk8Mc|K zsRisr?i*FLvx=R&tve_7Bhqu5cCO_ND6VwJ%4yy*pve|%W?EpLy`e*L%-qu%<8JO8 z{VA}lR=u$`Hsa#3v9dAR_#fzx_=w;Q5P%yzB-UxkYQDre6m1Isy4^3>)Uoi`ZORU> zl64Ik7Gsj)B?QT@Kas14L1a&#N6Zf6#Gi}c+BFMYeJx%JC(e6lTnZRDZmw<$H6C(D8yD|BNnFFA<`9^>ANR~38 z`(n+|@g;vD$D^b3>-2)0_4e(G`lx=Y*2z5FZGIj%Z1pSi+4>vF4mtg33C!EoWr>4D zrmJe5)Hr6y1J*ztUrb8w$o#VWOu{~``1TjM!+=P#_{lNBOQxQm^LE_zwL1M820oNQ zFE(fTL7R*C#g!Oy4|T7877kDbYKKcB?#87pL}_-A@o{W(2F@gOAWsd()!_igLc%|S zxQ|}5I<1mWqFNip1H8^m;IpZ5Ozv^G+F!)05Z4L7HK*|=U?DB$ewEX=^X>KL)eYe} zVe%(>^93}l#Ni)apSnm>sXB(c|o{e}$g-%xh-wH}>98%mh^(Q>jr9MY6 zDcI3QcR;;{Z2BlO(U9n$~_3%TTXhV;EwsOBn zHCPAJl&J5LGpKXS{4r)BRFvAI2e=GRF!*}q-fA@}I(;CH5&pNW)nZ7jX$AXV`bIiJ zjfLEntU_w9PBlG%DKVg}Gcp!KoI**LRwXRirG{ea5v46cTKkKRc!#Y2)tmW6?0L-o zByH7nHxs7K>mX8C5gD$$g=4MF`6eA9Cs~XhJOrSFy4aVZgsXqi6j*ZHiBj0ex(WmW z+5&FP_72ebSK3o?Xn^L1bv?r%@vWQyIZXX5@Jfv*L1r>|5yoLot6bNzW*6Nu3JqQk z?4D=Q2-4-CcQ7FJ*~b@MC@!wtiUv_akOKj};ojs>`+5QxYX*T)XDx<>;w}vQX2LMG zlf#_=IgCDZu3u7I2P8{U{#XT-%5DnI&W|ndAIgMOK1SbvDJWG8yhRoq4?Jz9n zw%1TlX)!L5Px*)Km)4&4qd;@>i|`nDP%8vzfAj*t55axH?9#k>wLvvw%ah&cKxG^h*T)#Afa4p4j!>8X7d zdX$VnrD>m=J!w*@9+{yxe!=SE;3gKSck;EkP~bv zbml!^+NenN^R;@h=hoIp#+HxsIOe4bg5S+~Bhys|J6tpx z6JXeM@H*C!fxrF1|Nqui6qyi$D8i#ZGP1%fF%|6r zW3ZkuDA}g%5_chPs#uxSm2aq1Z7244oo#{D0pMM+j%OWi1(~EII5X|qx9jJqk^H39 z%@q*BmNKjG^B+8Vl#8;33nPW)p`joAmWXhT#RRYWjdqrBa&i^UZU4aY5cdo;{E^5~`11{sI`9;p@}8 zZ@-blNS4TXg;>t6cR4eY9Xd|aO3KW@XRTEbXOAF`orpiH5aq`7P?L;_%B_x=jOY#aafWBVKr3j? z;)s+kR6Svk*Dk>hSa;p9HlZ$1LMUw$kxctuBz0hN>C~D4MqsF;%NRii=5wm^I`}Eo zK36IVExt6|)r{}b^QNbG-RnExpD0;xnSBwP6Y0jFei>vykHS6|=vVJL*-La!VoT1n zUu236eN50G)R^||n)RklsLQc(DZP4=#*=i$9IeH@b^6trGPq6CJZ@NHvAU48M<M(Bxe56-y3dfo9GHG z^@W69oYNv8<+k(MhuJ*wW5*)l-qs{GIwfCHpH*eqxhe{eXZD-z z*uIxTIM#$rKc(5joLGkdvPof5PxFv-`~yE#Vaa=iWdbLXW8x>1%7ah9W@@{1?I@ar+LK7#{pxS%q=6>b=&4uEE`Mxo*eiKgClh+n4SaA+Q-Jnf!M!|ckAb3E(!VgZQV z#+u}A<~6Ph8|uj!_-^6&g+qo`BXelqi*z>|jdy#_Q6_hZdm&h0#=YuuB=4eyK@wlP zPB%%uj6=ZELp!&97K$(z2RqD_*BMq~q=tet-0Qk-WOm0f3~wFg>=z;VgX5(z4h4hY zwtob?0Yjy+JczZROV*0a0@*Ygug!w+&Xo;108Vz!5g%c_=H$TX^|kjji%s~cESYt? zm1Mdz&@}2m7PR#*B0Vv6Na3(pdYYK7XcYMP5!CMK-U#bduhIvJ8Vg&+rAuaxt@^3w zTHfQHXBe{7KWEwvOLQQ?lF?%$vhVXTKfu0K1##U_MhSF<-RKETWcbX)xz@Lu zDGHp;qT8Dj@HgKrNu|TH%P8!@4p|p6YEFv`DWLX>022NKUb9u8EzSX8R%nQ##n38V z#aEr~+UZB0A$<~jTipSqa3y1I*ufJB+G9mCLkQE;@EyyHEZyRM=dCnKC zJ&hS;>7^h*ELJBod3gx)T(G(wQ0_X-=fYiEdX{(UdUe?r zwyW*|Rid^%GFqZHr-*njW22*9)mgKv!;J*xmM7#KX-3_#El^j*hkbj)W|apbkP-0n zrDMq#>>Fro2xH5Ed>{^k)C{)Vk_BaE3$W$rHcWhxjycs42m*xAP}(nzf&(P+nFoXS z>v9NLXvNOGcH|Q-aa3=}E30RNh)X=mU^4Q9cfIRaiAgiq5M;&*v_kU{E6m7q$;n_bC)sJ z--z@{xkt@C>}d9ND2xpEBTr!PlODpJHfu6fkoCNxpuQ$d)~iIC<^q5q(*F*#hpPTw9?zbKWN0VZiFIl^aSyYk@|KinGgN=ba+ySVB>yS9aNsO%+@~aEw5UFJychT|9Kj24#3n9L6cw*=){K6oe(e~}CNzOnR zpzvg>{?2e=Hn;?jLRG!W3r?uFsD56#xAA@q2Pu#ZtZ$KgZ@|+?Gx<&1yFQmXfI=7c z@|It<&*CITffW{HZu?8zbpWD3DORBMIl{>Y04XMhVG5UpC;=|m%4n3ewHk+h7mud$iPG?IG2QOdQvz5^_O-T8i14OfK#hs+|sFVte}y4 z_BX6qJnj)B`q7ivWRo~o4tT-HIm6lK5JAR4> zL{-L*EsfZXB>~%?Ofbh{tUXtJUmanL28B(wFyk)`YtAy1@8{ZE1g@-nCQj7t%sC?X zgm@b_760AZ#TP?dyNH>!ZIdcXkDL}Nyc+t+dWw?E=gsHJK3TkGft#`XH;z*bqv~Bp z-lGP|D24TlY!y_|SUo5L>-+_C(Sczd_Tzcj$lyLY&SNgBcE8}@AbJ?cH+mBDv|+u+ z$1BSUdF3h@Hj37K+tcTWFZ3u%8qg*XKEojERWLZ2mKr8D`(?T<+%oMtw#4-+|3rli zl~sOV+42br8fr!xmu-~*xK2gU{vxJUy25Jb@h*z26JG%eF&aP4}7UR{_RBX zJvRY{6-sOsQ_UrYZs;Q@9XCzrL8l8Lm3`Mb0T}%-RWTe*TeqZrFNhe--V#veG(w}8 z0JsuFd{M#ryzSpOpB6#)rQH7?&m zf*B8JINtW@B5|&tpB+@arOim5hTV-D;k({?gbSx#Uf|fbfc)y7;mX z@q!alyI#uuL*lH zI@g2zdgU}7Cy|bh6Dy*Q-rr2|yQ*bY|43-!1%Q=IgU^z;{6!LN0z{T6ONIS#^TXtk zd2kCZHCpl7MbAhSv#GD<5~2ABU2Am}j1bewSJtB3^-e!8z86$?BHr+V+}dC&(DzX` z4t;Ci%Mt$SR=qA(Cld_AhLo`$(1&XGi>};B%5yYkD3!2zUBDRQQqn_}!Pd{hMM~ko z@GZA}q!({Ukp8khK|N1c+8x`*gqU^1avvbGRo(D7uKk*syqLm4(FkJ;)*SSM|0kuH z?5gfhTjiCf+2#x-II{QQjiXmG+yH1S5XH<0U&@uZno$st! z>IaCsPzxrt#*a%y5KQYTOT3NQqPV*p))06(ejbx!%D&s)1iUfT5LFkz#W&I@N8DCq z8M+4dYR?f$GU>K>KRE;LIU5(HtQ(EpYkMEjvLsvZ6HL9xO`?~D&O=KRI=zK=@dit&Y2~QhdZPRV~S`vi?O(nGd?iSp2hh`5Nfhyv$~hj@RyhFCJ))j6p-o z4LjCv#>G+G;9PxMgn$*Y(W?Xni>WP?LyS55nvP};Z~b0Cv*uIa=t-M(7$kIzx-(l% z?5^kWz3|s;4~^8tE@IS89{|g-g-pR~zY!6)*uc4eA+v@6aJh=Byb)#fY#m%hR_@s` z%SFbGg44zqI|)JdEGXVWmrnU1*)9=#;bA-%QOA(f3k#s?|xMY3j7j|_)(DXL{ZXNs~{(09R5t*l`!iB z9a!+!t8k)0b)lY{)2P&^UPyHTGN@U=it@}Dbe9Dqd*~^kCB%GL&Hw;upXFdiCu$sl z%bb9}`AZ>?`6-@dQ#HZYbvqU^=t zR8*~QOB7A);y(Vbrcj$TBO>hFVE)ZuVUgixTvgmh!A$2{tuoLcaYxJEH&qk**@h_L zWHJ;Pbd1F)_f2hRb19N6Ek2Vl*F*$DHRY(JMoM<{V%qn@_S_(Del#od z*dY_^@6jAXSs!iIj9|-EA>kn%R70i^D!7_a$wG)eb;R@*Aq{$bQ`xxqW7|TLh~zKe z)xYRpxEq6kk{xnjT}WG`_e5E=A-b703z!X5RL&^TTksb$LiHV|A6#1*yb1zvqR)oX ziG@-}De~eBnBcLMT}RNRZwU~h1wyuHvqRq%7L-XK!=gcnk54U}R$~J6(0(Ih7EP~1 z>X=nxs`m#ry=e%CIP{BnlS>JBcMR~G7%W`0S+l;}<$KYnUuqqGNKQ466P;8OU+ee+ z!Ql>(az4+ZoTe?jnCd8Ede8NH3E72tud#mv}hIbbvJ!4L`s4rZr z0-asICPm;2`j1X?948P!+F!(y2hmnLVo+k=haibd4*vODC$e4zrzgYouw3(Y^?Y6t zwRfpD)G1Z zGwguVMCYmpr6&@&>*2z6dc4ncD3!Z3@|H}L{>6Yxd-8=g#My& z-`>-z8t8!NyEN_)O>H$|OTt{fe(l|878TSxrk|r6@;5@iRvpcntg*#0HSM*VC}@`( z6Hy4@jkP;|^-;`d-wU#U=7h3jRpsc}PntwXK2*NWnmLqb7`S&kDuc16l8r~Lpc-x? z1GQ*4f|CC&h_zL)5DXsTE)x7j0!23D_nCRvt4E_s6sKT);~?O{kOdKF&nzU+UE8voas|V}~_M7g(?IFhW6x{kd`m%p8!J z9A+Pv;kKIixJ>muRWb9W-P78;i`Cn2S$aMFI#SVtDwMB z1pudHnNSo|KbH|kvb&`IMQET3K250A;n00@TS`1LH>jQq1*oPdFzO1IIJLc^fMURl z&ak#VVv@W`5M4nFYo@Xn#;;+h9hhsk--wn9Dx2{yxf_x5-P1;z5>&nM_Uct2nQnkz z2bI}ve6@kK>a0(Hjs%3bM=~{-XQ2&Ds6h7CGp`k!oUl{uZJa3&rO=r(J%H6ej7++q zLFgtxOSS{*$Y9Q>@>5h9Bp)5Z0Y{7$KG~4h(OdP2*JS$p^d|H>h)1pH3&F12Tnb?w zB_o3p7cQkLb|uJ!^plQ#+>P-P|7%m8^NldJyz{>)f~Rg=$nzy3wJ;lgQPbrR9wV{m>0oFR|v} z#8F3Y8c|8ETO{}NUnc>pJg~O7R^Sk%ZiEoy%^E6?nF)-q--}r!rt*xxy_`YJle3x@ zbysNB^Cr|WRtXah%JKJAYz{>c-pTX>9!T+VEZ5_Rg04ORFEs7bizIvtUZ;sn4~+kS z)!^-V3|)Vtr3~IO=%bDd^o_P$`qOi!Q4;>ZX`{VDs@8M=bqYZgvL8NIA!eTHXVGVo zn(|^;6P>_xJn+aKNW>`L+x>zt%wbM(w0@BgVCRe@DKD z;KMGEHmQCVA8Bv6Tf`Qk6cYZLyYWaro!MPl|0E1`e8CF( zs(Ce$a+Ca#UG#~+ggYZ-(CoS!ApdmY9&qOuRnHTSo{Shgu9|bJ>0#1XLc<*;R+Z&@ zVR|7s*gA6vH&BmLO|@>dP@Y~_N|Ml>WijouXpw|WA7egWTBx-K$rKgWB{6snv;F+qcWN262oqXY}^w0t&YR*WUOogo}0+SP*|6c6z}M!AN4c z#*dQ(ldP3yUz?rCh7sOy+CV@cW5B+I%pVE=GJt%T!kroG}q`T-2yD*}E`! z!O6v_nG4Wqe~}L?%*hVd6eWBsqz!n5VxL=Qy$U|V_oRvHkK4P7eB2zm=ghpXXKc#% zPh=^I-eE-`2}bwn6k#43=+Qn4?hAG{KzQ_O($!douAVSA|9Ta}*E#4#;^rIWI?*K-}PEhnCTOm+DHTwSNxghu5p1qtOZrZc_&UR8hhnJ`fV*t6nAMi@e8j zEr~D&v0}35ohWIQUUl5nN4xt_G~t7hX_RMZmHZ<{>h%dwH!AJSnVnk=eC?&+OUJqp zUe&%AaEH6mIPkUWc$q>`0E)hqrc%2~h($ohC>FdIDWc$yUX9$0=~2HIPFo{g@juc$)SA~%-AQJPd{Pet~#0*f!;)7SDo)>DwIYGC&-0vQSeh;K=a+R%;@T8 zp*f9Dmkna?-iFGiykYC-Vd}gNWh^dWczSueq-!8R=1}-tLPmX#-Y1>%u+O$As#MN& zkr`dFIFR;BxCn0iXtC?8If_vYdi1*aMJU8L4g5ZXSkwq43MHnx&It8IFnEJj%=eIu z;Ag_b+ixWMF%H?oulSM{u6Zp0bj;+sp4J)1+yO%(&?onH@zZR2;fYeUM~~z0Un@i4 zRV065VicFov&4gML!ZCIKSOfxQ%Ra~2uUTJ4?g8c*6&4iuQ@@?GO;ehHBIV-Nu?iJ zXNNXA1rv|J)rHbyF?4sQ?M-M_yJ3^Vym1Z{#OoWm{T#!L4^rQsv&{okIYo9h4@yi&5!*NZbk@QLqF*JxUB)lco zObSVut1q%?0+?0U6bWk5vUx8~Pni9Pkot7(#Feaq9Rj~!Gs4}|Cq1A$PE2$IW#(ZO z$|VhR{qo5%l{7$n)W)Sbx0xXJaixZu?whV8C?qkJe< ze43w{HZ8Zpv#?1t=0dcd{6zsA(?T2o2}xV=S>=m@jHR*kjjm=OFJLMLgW^tirVYwM z##6__k0$dl_b7c99FP2iGGbcgjqN%vPWeX9_{>ra0IG;7+9{A$(c{2$iD=q4a=S7# z^YdbM2|BBPk*H6d#%g(12|-(9!q^Al^HYCm^Xz#hVw*383~sXhCXF#j4$H9Kdc)C7jU#8UB*_miBb}ULs~E8#-*6$H%M@eb`i! zA6q1lA4C$jjZy}8s(lt_!Zxd`V}6mAi8;DNEdnVWei?T?i_1QKnEX8QUQE}-S-D}^ z@#t&s={NR+CTfH~!wns)6~RF&f&$t4%vwdYCot(!XV;-|xuG2`NrarSj^1aoTum`~ zO!kXVnI5;Q-0*V~oZGjHo1xrfG4U{ZONamg@fT*@c~{ufC*aJRN4g>;qPB6zYqkGb1p}Y7EbZ9rI;`l7T4v2HOqF#&N>yN=X!l&~#hYKG zH+?m-Sy5W{Y^-t($VLD%K1wL@HVO)YNcwbBwQm`g=nHb#(0O{Dr(BluL<$Tnv0;(S26 z4tznRM}{l4&w?&U_lG3-<0vJvV15vY@zUs5i6fc50-Vn4P_;$z2JX%6-`4hwo9tWg z35$~KUERy!TycI#QdU-cR?%^KpFc-`&6(DhPJJRF=dIE5F@agEJa8I_C+3D#N~_C3 zkePSxH&GFazbp4Ll{jw~ zhR(={gB|*};=DeMzK020nE^JZQ9h$4fm#zWKiYmHx1%HcDfs#7i2aF+V-=+AGs@I& z*QrrJV;RA#!f4eORzU%?{jmtJ%St@8!*t24xTNNwrhgjm!WUjT?iPIgZ2v zkz68NQx6-f(CSINP$5zW%`mlz-t6KYGG{|zAo1;7sI0=C;-TtWxYP+Fk}|;8LZ_@F zL$1TruopClsMGcJG9NSLPW%koFP#hCuh}g{6*fDh+C&dC1r*tBJcMR$In&wp{8V`$ zW$pgWyh>Z12A=;*dd zy>IoIHZ}CHbBitabiE@o3hYwYLplWQvxLYX8)SQ!ZVL?Of~;{w7xFl#dhgzG`aT&v zHo6H}_#ftzm?MIQ?+*%0lO3x4?g~)pheWOQ&@dcsk9&X)>hog4N1A&_{CkFV%6h1M zFSbAY6mj7HmGFzhv1^xp4yszOa(9HW4ds=|$Vh!c-KMBwHP}ut^^2Y|QqwVi+2P+R z;c)qF7AIiwrIZzjPMHjeps}y-Y1`gT-LYK{cMC2A-HKf&ofT)Z_Pw|Q)n;(Absv2* zwafQMqy)dz@dYp)@eo1S+AroM$B{K?9h0&8SunRQ26t@XdC(f`hA^z#}>Y|OUy?Fu89QPh^pdr|$FzsaCjh5()KJ5u5A~e6F~F`T`0tp4w;8!2g=wClHqY6Q9y#Yc}{Iy?N zbriQwJ2eP_SQBR){RxI8>;*t)7g(r3#d}P5msiy>}g&O*d?;QZ{?uiUP7Xl`{|O$;fcz#0q(MCZk>2 zijSoNzJS{q6Crf~-)6mg84ce|7hU^abWpkUvpZQG4hv{_XY3Z|`<8deJN+N%%B@2C zry;OO@nDm~`}CVA)MpMVCj{bh!`fhh>e%+ZScTgmrKJ`};tLq?#1@BdZm#`$l}u^z zWypkthD>9}m(8Uh_`d4XXg(tUJeG^&?dp$9p}8A8-QJo5^|Ru4}yk#Z<_?fkK{dV;UBStj4We`X+UKOuTR0R2E>(?w@R`3QT zFk8n704L$HnX-wx$V8>h>kjPjeWKYkz7atxo^-spRBm#K_Pt=wyiGCNq-g!IN!L<*QQvu2BEqUSD^JEnQMlR;)ZHgt%D z8qc;li2|i6w;cBC>le=mM>uJD3OOwkfu5GE9omBWE)Q_jIJFq=SV9kS?si^OeaIv? zW}oTg0J0}UornyKiog!@MTrQ|&_2sklTk&z@rANp;4lcvdiyyoSQ^x$q)3QD55Ken ze4`zqy0d!>#rjdAu9xY3Su}L*%5n(#0Cmx3{Vd|!crPKW+XGTGn>oNC@K^xbjzY4J zq5)f2QFAbJbSptB#eBbZ#iR}x*~4TuT;2#LLXT6nmzvklV$T8Dl8hwdg4EgLu^i-L z-S**-H#li^8|V9&J3vk@3m^`lIEztu`z&txBi?Md=DxI!ZG2?#+T!DUZhb2}3#Tp? zcyS+1ysL9v8nZqa8mJ|;IjkFz6Qtt*7Dc!kk2)MPG{9`;<(`VAVE1}gKXt>k^TLmk z#|a~}K?u~fBz=f+#Lq(c`nIQ6qGvpOzWKBS#aWK~Ct0y<>SuAETI`3f;=zUrQ$!r^ z6zp%<7&0i5(3<5-yFM&pv{h`oH@-yuENFV{YSl~EdihN^kF+A;r57GpY*y0cUf~Gk z@3zOi?N5doMWdm`4K*7wH?cT210US_d||BfjD`vcC`Riy zS}PKMM;w_J>PNJ%3#3PLv!PkkZ^V#6oiY|v*^Ll$r#SmM#$@D^^&9yl8uaW`%=3+$ z+ytnQAt@5mxOVM=U&OU4EX!$`_DER^YtMjIaeFd^qIiWSNm#Q3+>6k^h&PkS@E?;_-$jhcWMoRzD3)4U(mILCOe5VLqW| zsif-Wb$Hg#B5P(3A+DP|VCU5inCNc~Due?4C=zh6`xfW9xbK0&;E=IVx2J!HHERd^ z((47w?#lpk0bG1H|7D$DpD&Ii-7X-_qY>lch4LY)6I}_(>a}}$r#X+Xl&`#1#{`e! zfHXiZtmRHSyYwRo-pPJ~1ySfgSQ&;Qk#Mf+NBIk!fjuI>N4bCkQofOH3{#j}2v2mK+OEH0*Bybj4vUZT4P zgZXw|g33b4#L9ES!rVBw_{6e{e2SL|r|H&RIEJtJBeX20ePA|M75Vh;&H{VeE2@Ma~W+()1a9&dbyTu|B- z{=+CJ8sI}0p?SIcR)U4Iia91>zZ;naxk~c2=UI?bW$4ObnoMC2wr`|HlEtQL%WWvE$on7?uB*E;A-%3R+8?m$o@NNZ--9PzWGvq8cV7qwUr zg!m<#Qni`LLk}^@37c74QCrA*H)4sW^R-MiyHPwwNFoD3vG->6s?#^-lg7*u1=<0` z=~~dK#6qZG5A8Sl3w63$v}z+q*mya?y-^u3P^9@6%`i|J+Gi2F^VgDwtopQcT)iF* zQI7;$^jlQ0Vmxz-Jv6P1Q7JVRx&8AV!*g6N;TqJHE3y!a{tA@_Ce#@}@f^(^Q} zn72-ZoZi3l$25wf70Xk-Q;h;GMrhwjKK<`M>;S?5wP>e(z#y}$J-07!mJvWSl5W=v ztr1JIOGL)G)m}Z9xvi<`a*6;S~tE8K6>H%c~@ z0_x(Pqdz(vu;i4F0F!O}q6^xdEuqD`_%ALsdWusC%VIznN(8IOHQUI{?=k#w#Di0%wiaK8wW0 zu?y)QmrW(3y-NktI?;2DZqdSka?#OP3T9sD<0Wlm26!Wog8Es~UP`OlZ;x=U0Wdq! zB?^oVtMw?fyy|?T^mo2Ui^XQ@l?u(yt$GxW5GZ?P6KLf-AQoj^X06M)ILo@2lZ3;yed|}nSCe+d;3Pr)bySs z+aETX2a;e#E%O5%s&zIeF1dI_Fj3_=cOwe92F{8&0#(3Q{VeQmWA)|^$Za3>Ju1SE z^q9O7<)o1K-?qS}~qKx-YiRqQJp? zH(qsflkf(NF*gGl*u%YEFDemEB!%{c9Xi7Qy^q+B;O&589UuD1vVwdQ*x*e8?b@z5 zHXg>8vYKw#xk)I~pMonmqS72Mfp%WVit(#h&qQTly%MFTIXJE;r`7sPQ?e+zq7X+K z37{}ZXH&%_dAB>%rg-9yB(FY>YU_5K5IvcS7%;uJK3qz38QRqU@rGGhIS$!smb6B4g)MMxEp^R zES5Hc_w2wucSg*_?CCpjR9?(=3XkyF?xV;h@Ng`&uG!g*)cOzyIwFigvf6eOv39zmMOK)71m-d|XLdodzMr<=I z>KvHcGYAo>-Q4)jUq`0(BE1p!wkIYsGFhz$4Cg zt|D-TaN`wATCYx+iM3_nqXuPmbqJx+q36(F5`0*HBQ3&Ni^S-BPVZlN0ecn^i{-IR zm!*SP&@gO<;dy8|otgwPfXmIsY**bW4RBuUIHuEh?nURg;?YB5+xlb1z*Uzzf%le< z2u3*s7Irt%R3!?64}(KFAW3j){WO9~g5`}2FsX!P3)SV>;#pKHxpdYIQoH5x7La@xATkA&iMR1!>3StGCY*(`y%rJ1p^wq6X(& zt{h@#H&YvXyN;zJ{N4DfCQ?1ZQ?=>gyUBy1^{J8;%~8bM63W2`c4FDJxfg+jmak^pj3HiU8^xx-~;b z{hPFWOEZD`8$nwl!ge>$sypD$pk{(ou&irOgfrqioCBz}rB)7~Cg-{XGZ*U$D_*3> zW|d0`;z>KZ01{RnZlz5prg}Zj@c+y>^cQ|$y0^fdBMWbz#SnCIJJQ^_VTFmNI$udV zRVx$IP7~B_Iv4JoSVzLNHU@{p}DZ47_+B#l#jCZlZl-})0F~5 zSHbtuB`0#>eiWR3bqQx=_O#@h*f@$L#BT^*{Vc4;!DHA9b4qa}26U;ph#1v)>rt>O zeB1kV@yHOg?QyO{3OSJPa+J%TXizB?EYg^IEH~^QL7r+2#4Yh|n`Ig04d8M*to!IH zuH(V3W9LD)hjw-^JIY49r0MQyHwtE62M^(5it$xFFOdAZzAN}-iQu24bY^uw~sdG?)k; z?#ymWl^X2|=GBkFhQXZ(x5&H*@#50QIF7L6ALhmHe4?vlH`)ky17LuK*-w7a-bWYN zD>}5;W9=h{R@7@adfEwp>Q!e|kYAuAM^B>Gh+K?!g2pRqtg}zBVN4*sk?*V+Am3tc z$>|k#tnS#(u8r&JdGE|=)(Z?o&mV{qj=os49p%8Q)BTY=cH&*WI52qvPxELmDKuo48KtMxP&~Q;I5y zKs~#$il7tK)G zB0>OI#W)Di_fm80xwmlNl_J;kB72p`szWV*sRN;+*i7d_lU^gU0x^jdFF$9b-H3tZ zGocXfJqkijJ-gT?O3Rpni4JMHuvYD87i0Kj^(dA+r)Z!@&KLYyM8WjGWkY~h-;ToQ z%QoVmJq}3J4nT)1!w8X@=&l|m)fOI(n~+)YHP}Awil&+?k`iGOZ02J8)Ls#?Z>O{~ z%IeLDsZ?a*`zYiX)USO~L0r@~L8>d#LXtt1K*v@VD$EoT8^rtFjKVpRUQl;EjiLpOavtbHf*J1VQ;`Vtk znUhVZ_`yMuWnGeb(e!TwfgyTtvSthi3goA3_@!ENEHn2NceIhd_i0!HF%V7|5#2z2XE11Rl^L>X<EEa;xe77+XEIBB7zwv+L5qVb`H&-bey@b!i_Z zH)#@I-$%rmY*XlzjIfzwI}Ik30rH9bWU3=*A~|@nk(XW$L?; zrNWC1syj8$f&$<^laV0V$?n^V82&Q!6xS+C#t>SCDu+3F?aF)IDMGrKjzfnC3)X$a zjV~(?WPxK}&kNaJmiuC^@H4fCG&WXYMg(rrQ12oWg4`@+VqBpJe)j1ljSX4vX%R+j zx>V%mlu{0k|D6z6nW61?n>IS}67f|gw`ar4Oh7v({YNPr>o@YtU8U(sGJ86T&G031PCj_(Cg)33Wo{!LIg60auU0RT<|c#L3)h zWVtanM(aoDsr9g&-qdfQZU09ef*}YXR}W&BXZ3tT=Htdn4NfXg`$+d0lqy=$Tr?GJS2yeWK>E9;hp5aigE zhay^I)z^9wxGWDFGH}Vf^}@Uv;s=1?m*Q4w&s}+$jGiuGRW03&vMZpbk|iZxy^mb( zgsjY&R}UHe5QO3vag6b5W#Uzb3pfc9@9O^I;CpMR%_<6%|7hbEy`R(|($sPx`5^;A zEM#vy1?n6&JRrm|vhpqUMkwe}3}+|JC;);hrv;J+QuCjh2cJ>Ehx|QNc}c>g0lhZ52CXr?-9=q#Nq^oH+jFjW}w<@r6=z+s9Sjt?N+d z7+AX-)As1AfO#v24Fl|~5Og6m9^;m_SFIM@Z>cbagDRaj(vO}a4AQB_w?c>dtdoBW zR%yI8?EslQQcy&9bHmaz0hdw{)?nmXKMR;JnjhO{zVz=ho2xP|8UlYQaIr6qgQ#yV zI-}6;S~FMJK%VqnE7jUWL0Cr4J8iA~>vzqL#z^8*s43K@9uG#D&VYCX z`O-X{_#6uK(r8{_RKJlr)|JPyUc@Ml4(FM?prQMOpoiIA7?tsd9pe_14X| z9fc#5YN>;ADP*pk-q^ZJbJDq`Uc0e8jiZS>F|jv&x%~dA*a9o-cjG6mG!e;Q&B^We zL}o`OPk5eSrWR3R{z1jEKU*Jj!xFGM{UdW{W^icFIx=UhP_BK91tmL$*K zs^{fTT;X@r&>Ynvk-9|@sZPk-Iq=e_(#ee zDr3qD^{OKq5o+Vit}1uf^*rSGI-2tO+|`v$lR27pN(XyeU-;z(*JSYPE{fOBSKVdD?c|3_FarcM5v~hIE?y@-Iag! zk)^b61Y}NAlWox<^>GG%X`X8pt)G(;8)nHR#A zBXync)cXiSZT6Y2bF^{}ym9YBk`q*gED9S!bExOV|CuV@ z{xvNVGq`fu!&=RjQ9X)&B=G5NOeYp6upg+&VgVBuia5>)Ec-|n>o*ETkd5^=?9f#j zaidN}2$|-^v*8c0e-nCwHrsg#>kR9Fi}swm3WuBs)K7Kek_*(Mgh#ejwSR-SyP3(# z25Y7*q-tb*^1~f!AInCu|>P99IRN$!YJ+50bxp{VePpNKuBRO7%u% zt5U7C0sXvnRF5LWlue+-Wxa&$`U_`E7qiPmyHfE>Zu^kyM0TnrAfo=1!r3~ptW6{C zoR~Hz@&I=OS-u)U`$i!T@K_Osc)!qEcXl13 zMR;~T9S^F9wa*EElH~ASWcD=XjAc9_n#88YJS4t9vId;e6$NoIa6hFBsOov$WtI!3 zq>)SXwpdEnBu5<-(y4DB-QUQs3g4_n6kzH*;N!fF*z4%_{MB%NT+xNf&;0PE1FgmV8`wzSpRS_@{8jw`A>jl|`JrIWL4F`Nrt$N#i<0FBN~9)KjWyj{_pV?Ke@gI!tcr=#>?oo+jBsVdx&KI>m z0(Fu8F;EFwP=4ta>u@Bfwu6Zm4-- z{sp~=nT2M5?I>)|^>6x^V>>F;ItU0AA6Q0lwqCpR0d4_E&g!l6Av|?zVI+VW>WWx8 z@mTcgmW!hl_h%$TFfVyljaE=6M>e;y#z$tkJ0!1P?xR|Trc$T(GBT}yThA^XOql#c z9N{w{0w}%+FrzZ5BM;6#^z1lST&fb0y`lhp9)iOI(d%;;*-!kg06LZBXW9|yLBz#f zd*ZrBxRcRQsTzl%F?)LP60l$ByJ}AaC2ipW&`)(GH!PYEI|PL`yd_oMc6P6nc4(zX z>~8fr{x3Vnm1|CX%HoC z@IWW^H_~3t1YrDS=|&*0uY$!c(=-+-g!cSr&a@(9L(7s|A$O(A)l7icRJNxa*=k zt^Ewsej_yP6ZFR!o>k{kjnXDvdeVQoUUe$BlnHECR>!yl@z5)Y3U542_WD^!HXt|w zmfUMd<2VFN%pDc%aO+iv9LpU1s>?%W*IOv%vXI#!lRI+SXL+m69prdlHv>=y2wb`r z3&y%Ppjx)TFp$>N1C#*3#4Py;Hnn+Zb689|bOx&fnQY$3c8I@mL>wBr)Nh2?K? zpaU59i&!=b%<5(?UbAT6=1{!H{gZ_Ah4tFMBaXrK3{93TI2+m{woj1lehH6BZ7X z?K}qYF~n=q23$=cGoGooD>V@U6rebwdxELPb19M3Ac*^MrzQ`+jq%zzzHyBkH4 zQej4OB8Th%29Asg@Ef#_fY-KfbO4!fnbJ>l@LdHm8dg}4$Q9&Jk8+F=o*!IUx%za( z$8I)J(XJmwXBB!m8q3U!5ATEkN6JXa)%sB!QT&dq+F847XEndTD-g>c>vI=V2J#}p z#jy}g0S_6hVqtxRReDIY^TOGOQlI7F%nQKH$GWmNcGFsl^(gV}(zsLzpVONI2WryA zWn_oeYGZdPko+!WUMD6bpKe&FXcgi3x6kq?{tWidANVsEC8wjiYl#TekHG*# z1k8jtTp00d+Epi_GdFA@76O@)tlpznnSkWDje^BVuAVOq8MvQsCo&MvRCjAOwI>cO$f3jY(Ay_W zLGB7D{t({!S!fF5-XcG8lPm?d{FDEQ9nj`S(}Z5rJRE@0EV~mwzA`l_QbXN~Nd|5n z5mP}N0oYJFU6*M>amx~H-$&&*a6f_G#w(L z7cmp#p!Qjm)TBhTUAaO~0Q3o$lDp6#&6j$1r@Bb3BLxi_YT1V@%i~*#uI}-`*(!w} zvG;iNzy^rZB?G30HCc<|JkpPib^-@z>h_MBC$v~NTtDqx57ZOSI>yPM|p zsu~kx=5&yc19iBT)aZHKU|mPFo-1$kTq$~}#%h9Fd&WIzoH<0O(SJ2!7|CfufB1XI#V|twcnYy-DD~{7?I~*o9;wqpI}mBl|&eg&35+cAt7)5G!Qg0Jp{J)T~F#%~x!4M4R8)d38PJZiGAoHWgIUs#!YFzLB4Tm&a2+Z)Dj!D1B=&jJT@B>zG^7l2D4t`@*jq zT`c*%98jKB$1jQyN$$Ad&Fub8JqnXUD2)hqyvCpMV77I%ebjV6m-fV@@z=rT97W5@ zkC@*{a`vP@2+8dmJ^w_tuZb8NRIok3&FqGQo-Uh!9ejq`ae{$0Eb2uUkQZ`x%TaK@ z-$}9sdF6T$yz8T*;Ih1n9;BC`UGNY_Jp&d3LEcm-YCHg2PG-2vPftIQAPVMYE zUBmxkVK(!UJvcr6xMp7KY76D47>I$3yD@JR`|0!hz$}ofYJa|<3TBDP`RpV9IDyD; zdStPe-o0zubn*I$$D!Sb;KU3V_iBtccl9YH7WB)h%B*~69k^FoyTfDm8EgQfS}O(2kP6i9JjRY0&3Kr#D)Si1!j)tJcPj)UaW zqO5%*2>_|3nHt^kGH8cdpY1yPJpv{Ce8dY2u+Cfi(;;1QOXOQop*YwI~Y?t^%Q1UHjg&%IoYCa74 z?y=pe-^exso!~Gg-qlT2QB4COToHzy^{PvMASWH(P0l)JEetY&5MB>soc39W31lIZ z6KfxV$UY!VnGQ8a?bAl#E*eX3tN5O)YsE1ak%g8o#fAD=0QuUh+;L_T*I9y27uMX` ztkT=mqr~axil{Yu*a!9rfeQ^Yw-IyPjuJz{v*?M{poJ&8!?D)iNh4?zRo`kjWI%?E ztWME^gf+;7UF0TVtTxO_{o-(1>MtF7-8E6doV(H^VURe4i5K#AeM$+zoNa88zqRsT zbqm5TcYTm-fXH&Ip?E|%%%lOWvqp(=qIilcLg{4?G&D_ubn9V|ZSB_Xqms<0qtRj= z+*{tLDIRIAKb*hqZnVnj5`;WIgDBlx^r;Jv`#%nOx$1mhc`sfP(A>P-5;UOl9E}Z5 zY}c;ugP^2RvkApPq5&UCia07jAeC_F;O?L|RHdF9`r0Rb4MSwsOS+P=7K|B<0gvt4 z%_t6DY1S58Drv8a8oax*av?(`AjqrQ{nhS(Mp3ccJ2t0NXBgwoK8>qTzBT!%zjRc4 zY7_gpNvJdd@=7m;briR`JsKLRMAqHRF5^QNxBE!VJ&q6UvmBn0q=?v8beOKA`8q%^ zX4`GXhis)z6fBn~M{?NMlL44+nxo0~>t~TZ0HNgab5E!J$|r`Tobeb<)}s)MQawbs z@5DqO^kgWs;bEbTw4(%;AbZ=^)lWk=wMB92^6J#}DxHo6z-$6tQuVW_7>P_{L27n6 zID!r%r~^Za%GyyVm{9A0u@mp+$1NeXHK4ozydDLPiN~q(G^h9P`iLbObHLFU4DPK2 zB%l}TX+RC*s=pCWw-mC3>+>uEGz>yS34J+mzuPxDLmE`dzg=-;ZNLG*kfke4ub&0i zcW>#EbFHhd|cI7H2OWTpCmgd3Or#7ygHcqh*z%W z!(*u?)+GM#_Yp%6H#6S*tX0O@|G2O zz+)8%l|Gr$P;a*LVwIBkn#skYiQMtu`w43=BouroJ}qxFb`y%i;tvq5X|JCpHZK~) zC5lS?a%0EJS;>l)ueE4}L>j?x7tkhaSNtxSxb12CI5gC{i5F^rtO#64GYYLSnYlz5 ziIC@2{YK<^t_%go`O*=OtzB6-b5vvyHWP@Np+O4Ksa zHa`+Gsp_fQZ{jE^smH|>?7TR(olrG6nr0Lq+PqI_MceeO9h+^ zPI5>R<+4+xCFj{PKC2QwJIgm%_xIWJktO5vmwnxthqV==9*M2rFLAQ2kx`>EH zPxCeP2LqUT6h~bO!3*884Qv2`v<8=Pi>*ib3%xyKD|sUbhSf!~ED@gjNNXBycq$9+ zvsk477O&7kk8$b7>SRs=`U0&~Le7XpZH8CCZJj_L> z9>iC@P-V4zquB4^GBd%LYHm7cU?|bwYiVY{dK7BFq{93NoS0And=JBF5<;QXKMUtN z&co+3#IX+R(rw;p2)i5FU zkz)#Q(2fE%0hu!_TGbYIcDesW(HF61{VYf495B?Hn;RC@PJ0_-a7ncUw0)L8=}hlB zb0}<8ghxV)6#+zA=$6#x5sX1veFf;$Z{)0&Bl;uv(UWc(ofGaS@;ugTksmxKDUl-D zu&zWi){agFyq53Kvi4bGZAgEF0ycN!F8&PhUsS2?9c^qN?$?SuZW3>#59-0%clN5G zB4f4BGFO^oPIQ`lS_O!LNfN8QJLidd6bv}AEunl?9gz1o>}Z$0ppLta(qQVajs=wQ zn@CmZr+*_RdcXzg=e&_i`xK#$>H=iu(B7~=sRN`J>+)PlPgWPcK8InA)S6{veCb{; zkkNf|MbpTg#Nez_43}wVSEhG$HhPBPSX;5YnQr1KHMW{f@0+SYr3AIkU4aY*p6eBX z03KdH3;#Q{ILflz_P=DiqGqH+tdPeT@NWeu#a)(JkUxBY_F3?Dv}t2xZRK)%6TNts zJF>QJfBX7A8aA|MFHl~uM3;qLM02m&h6CBgF9@AdRqPUct=ww(1VF!NQ{t~ve`&u` ztgR-n>PIS;Zhqh{qh#vVc3#A9cYwm>>oe<{D`bX6#R;aa+hf;qKwym`YEJA;#p?K! zlt|4L^y_Egp@+ijdY?Ugr-c<3qPRK0Z~Z8+dwKw3?wMVHByFG~tf3TK+GkjbA>nfi8fG$v#x=&rR z`GLNhQ9SF3;I$EuaK&E_ISvHVzR?e{H4=~-Sl$SAi$$ipjY|_B>w49_rDS1FLW#W- z&vbDIRWJCYv; zKP$$h2}xQjyd>zW_q5;=1BSYBY3J~s08%@_Gw=dwwVoF|(m0xEOeH2$zPdr?)0I&z+K z+bh)>M(;)?X4Rki8$m)3q-E0B*#QR~I6R!w4(wcaJ$KWKUpTsc^+ypv98f=q`G8FA z-3T9nubqN@X9rN%+M0qQk+ZgQEsp85S8D-EF-&p3i0MGAL{`q1D;i3>8>K>+z#DtY zQ?Ux9#0cM>iSl}HB3|a{Ma0=Y3;MEqP4>A(Crp`~3Xf$v`^e^@nb<`mX(!b6Mx*3o zTrNI#GMf;Und(^8{0 z0W3m#TUTRWs;m|{`^rfSg=yr4tY>j&`z#8jkp#%8XYKw@3#Gjrb-H@_^6C`1dm1;l zF8BIQ)q6VqTbVaGdNVJae(Wh(y5bh5M}5}$%8)3h?L_c*X7FKM!9?FGe=WKdwk`-J zci13pNJ3nEPu4&FR;^5=GD5o*Y-{$Ds5$nJP8OlGu8B1+6&HlGyv5#{Z{&c%E&{+f zcKIZ4eX6BBx`caVx2j>J{HqaH+Xvf9P(8=;=V%U!&tI}mr zZ7=u>$5~8OB^)V<$gv&;d0skX2hHp%gsEkziN!&;Mv2|%xRdyFu+&t3;)E?%3hC}b zAy7X{920$1HYbUK?Cv1=fHuXsnnlBQEMYc}o>f8pfMQf{o*JXEyQ;sD`-kWbeEGd$ zdFk1TVqNRyP_LIrJ{2Yi7Uq=Fz8CDl;Xs(CRMO6i8|=yW9XEgW(FdhSUp=t5YHrOv zR}5g%L&yYybiUmsj_>F!2{@Q0w@4c&5fFz2RJ|u(ntO))l{702-|8A4_S+vQ<&8oK z1ttF0?RCncA-Xd2&~nam0hemYRw?3q>(d`Y^imSx~pDPLr$j z`wB#n8(ONmXS+CX|mrRIi)(c+|nHLX88{pJp&02rR4^_0k9BWJql#jS> z9f=j&FAW{xg+_}DBZG!A8NvLfV?vU!qT4J>H89AhLw}H2G945ec?7f##k0*mjpDLL z0&+1X`&1v!w$#jv4!Op6QC)S}Lh!Z$av$M?#WkED5TUGgsUj`5p%JYU9A?!i|7)$| z>_X3}HHDnR=xjK<%1g43Z0@%b)B#&UpOQ9Gbv8;Mw6@f(Gbg5`fb>2+*95Bd9YEQr z0SMCWa#~j0=I93qzmUCAtF&uZvgtBJwp|!J=T3)>)#EY(=J%th(4&UfHr|Nj^BqkEyHli5& zqa09cmQ&2e3*DuUm=jCLs<#NoPdSoy^Yyb}Q*g=BMl8%*&czI@5L=DW^@`x zwWFlGtx_X)pHnJvkP8}^vn;R5JBaNS#@gG+^fnBL*y{) zu)$uz@2TGiMO?s<&6wSohGu$*0sQz~wR?KLC@w~dP;(z$7@()3N`uciw>)<<3X~5* z!0alq6q^R@H2%Vv$hsrrc8mcPA=TPoA4Z2ticHvjpVPItUnrDh0eo#xbKnnVos4 zeokSY?(G{zIi*C&jv+fhcsbppJs}n9uFTau3&w$k=1!h(q~8i8$V`L$INQ|Ef*7d8 zvq>rMSuiH$0FK)1BeWGH%JlOSR&j}{pT$WKgC4+TMsbvraI&3+VcU@HDC*N-ZdP^c z8$kg91JXY0hq*vK3a+kN35;XDG~ooCmM;R3jGcQs3a=RYLCmvxBUzTr-UW@l;M`Y$GzGfU5aTSnac3G;ztb4>J=5wf$j@B9)+L!57Hg$c~%2M{KGfD1fPU?cO!f z)09LBbk1E_w7no6d%H1P$1DV}lkJyWe4)h7Jv1`jW~wEOC+cT$8^X?G#gSDPEfPQy z2FYHkb>i?WH{2b^wK}(Xks47jVY?FCICSbS%>{u>2zhcMGN+ubbxOLtkW%Yt-zc^w zY^jjV^DIsYB5n@2jKMS)t50wA0j>e~n6v6|D}+IB+9>cFDO~+5?^qI3#cW`h;v71s zW3vTR${Qtg)u#~3n!C1+y{YwF8rr>$&IX3Uj~jHNO5ozI&lhX{XnC+3npg@T<+8`r zJ}Dr*>!|rDX;ri5!8H2_yHjv@)GbaggFg0_OPt~s%2B}`;IK9wPD(17P95S1_otdGwq%g-W(LooqmEyK zOdBiw#k?2S3ROOqJC1U=LHkC|#s{IYInBuc!2zMz%sh;gVat4)GxAa4CvIkVuE}il zxrC@{OYOy4t))@eBYOC+`ofls>OE3AGu>(}jdEjTpkfM3g`9BIyGv|ztWbgy*VOY8 zKjDKmqZ@L2&*FFMYsFYC_cSrNpc!HoQUtkK`z(?VK|)T*ypfaUL~0E7Py-AoJ;n3zz|~djQC`v`==2s|P#Px2gcU)X z|E_0|OaG)LP7Hz(2is>k*?Vq$ypx=}I+42V(r`Ig2d3s zl=zG7vj}W8G@+{+))o03FJPw@5uX^ojqB`Nufx}JX;9VIAQ$OyhRnrrxqcQ*3T1nq zuoJ-xhSGkBn}vA1_3U?sg#4h)rx=~QG0=sihJPtQvt?))C6=W^C_)3L3=L=;V3%!#66b`Au5X+&gf&2idM805N3q-x7K z7n9i05+=Inqg7PBX?w9VnB2dH>!*n2w&vrTlk3nbsxpe@&ZUY%CbybsgGzMlHnkFG$E z6Jk9|2v<1KLhg)$mk_c=ltA#h7Ma!Qf-?9Two{@*=YndziVemIWTswq$!1u9Nvkso zQ)210GgRuSD9~c?q=3q$RGR5vms^eNv-%N1k}bKb?*RH9$3fuT+_1VzxrICp(l~-y zeXC^@r_|O_Yyj;Uq#(1WF)QM&gF~ibeQv)I;V6qDl=ZKM;}nNt#ViqcukeM@sjftf zxN#JY?F86J09kdn(Ancsf*&WjZ@&?Y5Cy`5U5Jv51}cTs0Ob9L81sNcfu{#_Uu=<> zLdnxV4EAV+>)92R0+pwmM^@bq7gEqIU&{JxcYyFfQxs(+*(KK1+yb#PTweiBy02rM1OUrBD01 z;0!uwIP{1hq!Oumw9lfftrm^QGq{ux5g@N=91nJqmo|cj*L(kHB&MSiM-YZ)(n!7N zM80iA#vb3CU{kJG%39+_9JaO%2B)px$U?`Fg8Nvz+`(1ttzC)`H28h}jU4?LKpYZR z-F`TsU=a8>z_-2C!vC?{86-}mDhfj@0?ksl+`;JW8#w^Hlm6aIPXddQj;4X4*tL$m zkMNsdDIF;A5uuY(EOWMnc9gq| z*%nZ|ojnaB(3K!gQL!Lzvk9gSe5%w*R)2dQJw)afFVKr%t3JJ>%3-zT?4EdcZ>A&G z!RPS{>QU$|QgYI(ZQcm4GJR7d#FF(o%ThZsD@biy+_1^YWooMShipD;m)xBy9d|_e z)GM{$2=@guh!^%S`&C^)hn!M~Oh5-MN^Gt0MSL=|sFW7G!<0QjJt- zc+CP3Xdie8I_sXQ*9#<Nr+y=wF#J{+ z?_ltp^gNI-&vD}hZ|CJN)E9{KfEE@`;Lq7d3e)Z)bphcaXTSDYz>QZMN#~f!Y+e9j zbY6ts^ulXL;ZX(ZMhszm9@Z7moWGgpLDA7>s(coQk`pqniE|$TBaskTw+Ij64ejiP z|0Q4ZRc1G;oI<9Us@kMVChZPjg{Bb{y6qO%MCxzWFRC_s>})##Qisf*ZLNNKsMjuB z!P=DutopPdN{d$X+b|_+$1K_IO-z~Y5EIv_2Y|p~>Et9@7`1n!W~FCwQv`Fl1*{SN zrJf>w@O1}v&!YIHi&Lz9tQYz$@@bSqpDkkdcD-m~y#xJ=5wZhJOPmP8iU7;BdNm0C zA1Gvug7|_(V}^4#!WsCynbw12#wA<7k@6MK4045xVg(D931kcsbFg}p7vNs;>+2Qa zR&(Pk7rIiAw(C*2QmSjj04Y(BHxf3d;T1Z4&1Ya$BvO8G=^5-$rH*PJ^$#-?D%3{J zZe*QlBY9Y!{R(pgDV(1TzU$YEpBESs8q7C}fG)kG_4vk`Zk1+lTra1|iIc{lTiz$I zsv4|Wx%B%;HQhx-}34{ngj)S~KmBK|WVK+qS>tBb0Mh2@jLxAJ{J|e`0@W~se zJ`Dul>9^(hO-sBwx5uKOa!|Xx3`_5k#lut{_X85sy0Uts7*10@V~!_pr05F@NauTz z9n`x~9K|3@6=}2zI0)FO(N27j`;YZLQsL0wmK(#WWjS2b90^C^OybOTy)1+{0Q1r$9ONxc2i#{Fr5$vIdJ79?o}PeADZ9^SNVFinT=7* zBkmPDu=WIal9dcAVhCV~aAGBB$2PwME*t49%cNBk#^c1}ITiD+auK)yO=T|ZJS(snVz z#5wC!{6vQ=4)|$fU)3=t(k=3f>ooB$o@yEwy765mu%&u-A1aoFBdGyrUicLI^w?99 zI82{*UR;1NCHZzaNoQA#9)(O{yy|B?3Y?EECE#YxIzk;*L8H~e#_dOmA(hKehjL#@ z!7~;}mWretf2nwo_{5SpKZj)p+6QP_KHFn;VuI3h-{lkkF<1*G0Oqd=(94pC;lbu}!Jv{{B6pVa>9Q6PL;SDaQJU^nqr<))1StVrFi zy3=01%Lzo61&&++Ik9z7-CQ8C-3kD#vE6CpjG;Y)TX9v+QmpxuNXE=(%$3 zAv$j7FHmP-;99*k{_N%y1|6NABT zJ-}{yYnnK=HUQ)LS-?;>FDsF`VSm++kKPSntz{!Ck<2cExxSKGpSyB-pR}=*j0zZ> zOK4TxUDv`(2PbW<*>2y6J2J`%SDUFHsgXea=yl*_x8uA1(uj0C`TR9IKuajGNV+h6 zLVBwAG$$z_WLmY&xocwh$1$@oE{LmsBhn9QkYF8&>#{QyP@S7sL)E7g^8Ag&8R;c4 z14Jne?vH$Pxs1H}*$s0i?G9(XJZX$!4O|@oGfu$zjpQDDl^wEkz65%7cG^es>6%}s z=Nvu*m$p^6HzU93KP`{IS7+qMn>(1QB!}`$a!m|!^R3%ALV&-aA-`#Ug3O*IXsWw+ zvm#At<2pHwMnQ2O7-W`*QqX+miReDB{j=y^-~wZ2Eb?$v9bA+GPMW54606?`3628E z1vGUvCE^b)DQ)%xBdcC@gcl4Z4ikBsmpk-NhUHFxrtIrG04>{l#C>B<@4&s#Ev+W- zky}T;w~DrArHF^iSpiB6AhVfOm1qR&J$(_sqejbY%&y>4>myZshaSdW9ebHWy`7DIghqg=GXOSeTLx{o_FUV0NXnmo@ zQ~I_ZgV3Z{=Gl6>S7%;krV(OH7XyiU2c#Pgo46gU#3*r)!9>$TX|JzSpOe^l#G+?q zmYh-nX;~eApbpNPw%;eD=Ei~d9Q9uAMu&^-L$Jf0o{x3?M#_wERGl5hS>d5SA-E4) zHoDpx-{p477lI@J=Okwx44eTqI0%P@V5j}kw7n{V(9boyx=3r&8J-1Xs?UT`Vg5}u6+e6<{4cU&=vntWvznaRHO~}b#fYtU(yVCAZ0ScYWi@FBY<&iGLWz_SU&lFE-*J!XgU$TSv zfx%yPSiSAqJ*QZtvMlPJ9gue;bYa138`QoyA&{MTB=5L7S#^p6&(YIi_x zqXU|T+-znSl1X|jw~jG)?W~~wi%8}|wQrIixyxt-Wc*sNsJyqcE8&cxT73C(AH`P+ z{e{=KBU|WnF3sSbP1Xz8g=YyU zlvyh>O&h-iucSBn_|aJ}gsqBduq~y&o;8l3VGe{(fD_O1OYb7=R?R`LO0jdpI%hcM z({-m>(yMC42&fAR5xO(@Mi}{kT2cdWg^;9;Ja~ksPpKg}9JhwVB;ryd`n;I2?z%RF49XdZH1m_3}g?5YB;h z^n~f}X<(T8f9zma%tFk$9(!!Z@Rejb$L4oa< zijz%*%A@PE75BN{dv`#JC0%yWiI7!-OQC!SzMWkFBE|ykyx_Cp69;s+jVv|vL&`2N zRmu$Y8>LE)jm8}}U{6rB8c%TA$?SQv|uQ`SuqVA|`m4k?fS3(D_Q zp}Y(VBygX;mj_1urR93^i05-*s?vHq`WTCtDQbiEjgVT;SUduaSua<&8g7yobJ_J# zP|_ppEja$fm}Fk$n=vit4YjXV9Xji4WLG_nMizpFn;#g^^y&MD_ z!oTs-OJ74F3}yM7}z1SL!SzF98^Rm_Jlo)=NyT}s!D)NB|l zTYZLsDDmYcSLeyjt+QUc;NYDqN8HR3V|uNB?_TFwqCYy}k1d~B0TDS0=ANFPdR4Xa z@^REleMt@SEU}bHi!13``W@FNrgEhOJPqn+UW7lgEGH=DN8P9Jjgdqv;fQ>U^7+nR z&CN#c6`gyn!q!_tWqE%fUY#sU8cfC^8j%e!>MQ4kCXwle&VW?4IT>=h>J;I6GBq`# zq?$lPh4ju7IkSsyhzbwHJcMM??j!A1$a%@am#^OwO*;0y0BhH7t-w=g!J5IHQGd-o z$`Y155K;uoSfl33Lj_kh`IzY&t( zQEryr%H9ZD5LIgDC1r1Q$CY@>V*N@TR!;I5qi<#FXRB?xazez=pk>cf zo#PU;hY#bM0$Js<^}I05I3sLPUu0gGYqH2h$Jbp%gS38>k1kMHG*h4cUDtE7D}|Rz z9KV$xeKRyOkawcWq4L(xf-DdSl|CT5(N5%csH7BIjT$*|MkCmPsaK?GH%fFAC)7Y4 z3~g?26y#y$3~N{RDON;dklvgeIW#-%8xeTIZm!V7IWbj&hlwt};ziUVkPZU$*2L@I zZv1 zqsD?n3w{bo1i#KGPB~IMrE>QPeq24fM)4NHC`Yyg3u6z_DV1RzZu<42z@Z_fbbjJp zI^8rqfdo0y(f!&loentABOq}i4{$YgK|V5*1@;g1C|Ki;eMQ`f8B{{ScXX&ae)cFa zO0$5HE|J?+A`gTW0+ST!Fe+;%rN!dXxT$PRPJ-#mA@h7?sebn~ZOjnKQ1IZx;*o(( zSfT-PfUHjR`kszgOn|lJLm;4AXR!Pc3$~5mv6^x69a3~hxu=tH`a(LYVAyOY>Sxhs3#7KqYh3ByjQFmr zPGZ4g-2xvv?z1rTbCBBvs{J=PrgG*=W2lkN|3jSf1RvkKu=^I68SL z!g*+XPEi0RbWat#dKB!h zi3ZpHkp*KR|)9W*6ju%8+Ir zzIg4s#RrNA-MWuMvpID>DW0nj@Whtp*Yg7M)|DzG$hk>amZ)-I-J)>SnJ_ly(>$I( z=c)XlTXA)FEJRkKS5*BhM2*A>`jE}D{7#*I!D%LY<1#zmi+2I5>kJH@elX|yw&!>F zQqIshac+{|G5dK-K-@_lP#_ZpIX(fhl%p)QL3i!Epdz8jYV5F>{l9a}5;@`YPz1Z} zhjXH6sprXF4bw`h*Ngkz4d9kteq>HKQL5q`R> zto-hHGC5&JI*{v=!A*!&s-Q7hd0c|xz!l_J$)f(!K$D+6rpl_$X-ESB(kT%28Uk70 zjc{rC+Re(J9RMnm0=jZ{lB7OrR$P>S@6g7Q*)T_tN<{L@F->^Zu3be!sI0UGnIImb z{^UnyAKaz~ZT=OQy#>D~-3{C}zT&j6XUAIq12jH?~XbUon&j#g?maML!X&1`q z;fP)8Y6R(qLLXvm&%8Q|oVJ6ctMx2I!$vO6Ns|T#emP zmN1Um-3SOpjFx`D4&5ZUQ#xK<4jf(DH`1cYnF}#r z(IIZVI0_?Ef(-qxM?qhR)xHcQK5cLq)pjG&U?@=3qcBIi3U9HQ&5MW`l&DvCD4D0a z$EM(&L-R!jI<>4cpaVHzdTL6|O00bri&ocjtuGc^L@^;T5r9j7?79OOm=O5m)YTj! zxmuh{(K(eMak^@ife23H7QE`kUc_Zr+jX<;p`)^`_KgC~I$cs`^en1i&@KI@SQWA8X0`Dc@_ge zX-VE_ICK%J-{=QQ2C!Kb_XvH|EH$|?xaMN*C}K-}tR+ZOR0Q4l?)@nGrrN^{qvwqzZoC#4*1nbE``NXF!Vh5smQkWti!nBR$x%XC z?*R8JEtEYlOl=#}*)*DaxlQc~B4dR#+sESDJPY82gN(lE@H(QMc6RwN*wmz!tA6w# z(}DpKROiBOky$ab1NP`keJf%y<=_LYjKhknMbG6PCrh5v-!1JXp~5EQaQY$dF|VlK zNR9rG-mX*20=q%+U2)EEU#mVDh)45TZN$uOeEHy`jye?^7iIe_w0|PrnDEXw%Bq#~ z$@Rx3yB-C9T^_HCLQaNQ!{bEa6krtl+Vv>NCDe8dmS>cB3ln=Wc%bI4yH+IX7HB^( zHRi;`jC;Y9aJS#`o%$OIz6kl$q?fKd7e5obIJ~0!*Lzyaq}b#Odm;Je1yrmPDs)r! zRo7wDTn=+)qsyk+?Kyx4N<*+9QF~ml`JBMtTyNz!lFUc0!4`RVLAYC_3a&J=N1L== zyXnuS%Qzf$sk^u%tF1+Op%d<@jmTJsc^nj8F;#XW+Y3CQWM1B|_VdtV{0};4I3n*b zNak3RlQ^@)L700-7fH_m!vS^RQvIy{_DDtU58O19qftY9N^!{jgKi!me82?VX6E+S zo=!$#_Md*L%M$_JR%!z_B;ir|Xjh%`fhM_=l!ti>8p3o|qrkQ9d1Uk&AKX4z$LJe5 zbA#C2(<*#Eq?=dSDsJ4z;!bl4~k%ut%03sJ) zC~`HpSi3D5HIIgRUXrRQAGyT_-O{s7HtI}A1m?5dK8te5g;1E`TSg%u(o-++fOHMd zq8^2F4IGNY^4zd&^~6Q;wX-J9wQs2C0+AT1%Y-=hG|FFqZ%bEMp+<3J-Xc1W?{4%S zkw6n0OZ(3GP;CUChD(w>5zE|-5@KtXr$QVY#jx$XuzSX-v#Y=AE(TAOH<&9>-gkXU zF;PmtN6d)1r+-(4@+26h=X~dkauafrfT-ifXST-RjiNfCRmDO>E#fobg;pFWLKIHz zy!?s#1sf3$BW)DQR0Yjv?&+6Xi|Kgha_xBjrHAVZODSpNI>%}^h3HN zq#cLFT=U2@e8v^wf4#gHEBp8YtG@74RphulWptH?S#k zsb$q!^@z?ybD#8yt-0sKooGPdfcQXJb@CZfFG~(aL`vFzBOa!H2v)f2)6*7KElWV3 zuHXMKN(?9?IJN4~aCs$?J4W@UwLm?JhfgVMdAl0ytQ-c)A^hzfVj)oJrKjMuGQQuj zB5u^Md^#za%q{+lYLu{rxL4Gxw9vj0DL~9gG&El43u+wkP$pcFuReDZKrsZg9S2bY z6oBM`c!-S9+V)xE^yVX>Fb=wf<_{p#PmjX=TH`P2H6$65g?zPh2+I5o)a)=uYp)2` z@s8Z*e(?Btjj*rI$R;N#28XHojSPT}rskj7^%xEo0RTg5)ztd7mrJE-sXTV(ML*M9 z`UR=Zy7TL^PRn%_C-u0&R3H2tL)eHWNg1Y&Uwoj@aDHOrlsA$So0&-G!GZO&fFI8< zRl!wP19gF=7-Z|C1^Dhq@nh)pDfjfH+1SJ#JQWIuPFrokWz#9biYLTQP9lhYsWaenX|h(kNoEuxNrnt7mVyge zCcu0xcF;B2-3T{9(o!@U1oD@@e*A|1pff#-Aw*_#x!gyc-WoztERd_I9kwTfvxGhe zFJx1U$tVt~5;fm7|C#<_48md45?G3F3_*0bwYHyN<=b*qhx zl|%fE?V;|o^|RPW;%>3w+yN0J#$i?*Lc3qD-IJ!u&^qVaj6xS5*sli-oQV zo9nT@?Wu#n?+yYLEMJ;8zKAt-5>~C|yZuJEBCNyqxtNn>rM=%yFr(<6XH+652t3DG48_)NST!xc4~B*QUsZ?jKqIy`!zGLNC$jSR!(ow5t!ePqveUgCR= zc`FOaKBDb4Bi`$TjKCMH9R)EKkgGTW2+h3Y+SVidgNx8(WO$UoE$ju+p=WWuIu8im z)hdkER$E*cTx^_3yTxF4KUrPlxF3IKjJ_IxGnX zB=Smwip2%6XrBf4qFq*aJ@YIn;gaV%IRSW=`b*<6cn&wod}(Y!HR3T33YW6pjc$3x z5zMhwh0=~yVS{yTx=qy#Qx&~G@F9r0XDZxolAOETae$I6J;cAHDedfrubza@p3Y6; zv>_3v$WqVOA-*5w&A#rUs4&$Qb`=7;cp~xhs+ICFJ`mDrQ#3hA=*+Ay2#vAS6fMeU zQTJkx$s@&~?TuX7R9R|2%xA^q?HjpHq3;(k)U3K#0AR(rqjczVhS$%6x5Hip+jcTO zUVhGBJ~;<_y;dd)O&{1m_OkcELU27PkO6g+N!)n#vt*RdAB+M#^{r0l{^tm}0ii!0~-X&N;kW)X${g0E;>{ z;dS74Bx^FaO}QF^EI(Mbg7#!$hKM9Jn6-K$*J>kpvr45*nZVn@im_N;`k=}vKz_Y? zl=R{a6^6qj0(lmYgZouY47-_URQrtr1%L`^i}Ob4hj3?gdjP3-Y;h^=9b)c%r@@-L z5sv=Qu?p5eV^H&VA4fi@q7E$$=48OD##oV0KzAgi^&1geI&j(Gh?-UR6teKp+$IQ~ zbv2hVIjtrbeJ1v{hcwbfUDVR=se)3UQpAi-1RBZJ@z&$$bb=TyIl{88-$(#$ka7DgLT0V7IhlUh zi#Wuh@eh#+0Y-fXhytZB>~*BTZhKCh>I1mNOe2_Swa@Y=T;hkk5vQ6b_(C8NzyMX^ zhqNfG5hbTc8YIWk!0{4?kSlRy`i2I7sAC3n5%n*2MN_lU`4(M-L~<%fwS%KbCsu%J zBhgX`@`OPao%Xp1P_-&0VqhL=knf1bt`b!iuB)Mttiu6~SRavqt?af662Wt?{m~Oop$#*$?$+$?A<6;QxnYA41Yf;kGP)aSCt5@)S{>c6VX8>= z`9|V9W7$p|Cu*KY1U8D}>6|nfA9E+#BZp4vpf#q-R1ml0h)6T}v|cCb3qZ&;!P7~x z{nBusCo@Tjl`m}z2{CU@8&XtxV?8fGX4weZ)lxj@7dmb`ir<_*TKt8S0NM!lFsaT= zvRG6WgsCL>{B!F!62JTPbSSf4Oond{r_#KR!Aw6&qy^zN=Nno553~|1PZpbqSGU zT5cf%)T3CUWY=5*SEOoF#(RrN6D41pl>^04T@;qLoeZz1$vpAdaxTQOS+_W-Tg*er z)#`8L6D2z2+nekYv)Zmi`1WY-wfa6vEGBm0r899IYCQ}F=@dfhqHAY2-c5=uqL+!_ zg$qOnR^Y>S>|+KJ5W)-W(8ZZWD+LTNMg@=&W4F&T>?G6!W)(s5CHXp1;*l$4F&V5! z(Qyl@M=C#OowhbO8xKkwAFqEF^&))7P*3tKq3-^I1uU1~#StO+;%>=0L&X$Yv5Ts) zL%E_>hinvn7Kgyn;d0M%$N_w=-QJ9XK(D&CDG$J1W)yvf*{w{NMWON>4+^Q;uCA5K zzbPC7F2qWK6h%IP-;?qQ)6Vt|ph9F+f$bs#@R8tAd}L^2BR%n<&D-QsF!(WtN00h^XrKh12IQYikaz#PrIX5;=%z;F`y^nM# z0xRfP_pQ#6+k-Fo*C{KwW7;pRake{I7_)9zHXPLIIsvFpaHMHRxzLrtUQ9;55dwh- zQ^mvW#*weR)t=}Ns%ePHgB?DP5twkhO(R9%NBbu3gVZ3oFK#ZbK*g^45^V>Qn&3mCtXep+gQW8uZ>QFv_O-!Ok(*~FEqm7do0YH-jZvub)s zG-?X2rQk1IW__L1$mo!2=B@aNbufnMCI=)S1x64J$*O%$E7gOPMvGPDpY}_0bO2UJ z^cbZ1(ionkx++Llb$p$E+S%2oE45F`l);*hF+^};T6G|geiXtoMPz7h_L0np+ZG_7 z!4zg&d&9oSaK-)`dpxG*IDFP+AK3_P$So&lRqj>nGHyQ%4 zeZ*r&I^<-S{$_H&U3@C-$M%gbCIFh1e(A}wB!97>K=vTBs#)VY68=HwXq~>8?eB4k zXT6|nK|$F>G426a)U!)GD=@@aUl`f%)H<(lLN92h%aPAi3tS<*1ncNzZOrhxi31Uw z^g!6Mk6a|s!+2@Wmk#6rQnE!k_3Yc*9=ff(Zovai67NEmEMjFJy`jJr?RsHX%5O1k zhB68OWUTlS0-&L^5xnr?Lp)+fa{S6E#oUBRr67&beXaY9I)HZp;pd=!d@xAu5g6|} zY(f#+H%bE>y4t(kEc=MT4^|JR9`u}5Ydy*V37$p(|2Ah`od3CW+Ki&Q8m$0ui{Sat ztlpzhQ{5@cH4BOav;IbmM8rYo)NZ|zqaOq)AvY_;dHuWqCXP|EtX^-Z0Ga?e{ft8{ zSe{D{XyE}-=r1gYqMVPCC`el{a@O*Veo!W%o}i$0tGOFvS%Lo~ zg04FZ5?f|VHpJk6mj~Q}+FB^qiUVJBn<~fxHvGph%s1a{< zIh;rpa*c^#j@UsXaQCC&4yU2o`qFq)HYofKiAqtc9_7NgV-NLM5gDs21QLTfcN8(} zQEn=od_OmJJ;%RPp3tT3>*+)oo2U3WGG&+Mw9ld*P5cckAEXU0D8*2eMw)P?wR#j0 zDX;QU=SwR|xh->Oyv>Z7&lPn3jZ-xy~PV+?Fx7%oqGwYfY|lylAxk2 zZsVQ{ZgrN5K7BG_9;k6Mm3BeDr8n)ffIL#d-fqv+=Yc4YnwnT?sG zUZ1>jfFCZ+dS29`)5dx^P_rq==?Pob4J)o`M~T2!YL&Y^H5=cHz9cF$mK=38R~_z< zpjk~iyHTl+>6Y4g)QzwHORFZ}u0i1!Mix~U3mB)1ddsa|FAALx>m5Fj=ny_8H-=$r zpl*BDw>>0EW_M6mGcRiYtaq;nkyx1*28QkIiUm(na`Q8YlE58)tql94MBU#cF;vDE zgpv(nZT~2o#=iWA6?DC)Rl+m|#Ic%~;UNYwJz*|E9_s#$7KZ=$N%w5>01y!M4k(d2 z@wl(o?w_b?eO@NUI4Ub@cAdy{e4@bCa^&_KDSaA%WM?{!3l!37M3p*4i@ItF!Y828 z9|Cmkc65}J{=?2eTncsd+O?PcfL{ahrE?HiH#3lUf%J6&kO2{>6{ z#M3}5QFn?6_!tcSmkJq$ekvA#z|vZB`q8eFv(zxQ>;AA2Ic)E!%~%Q!CF@+( zT$@o^kmmF#nLUbQ6qu|_$o%9c5n-wU>B27d<^$J$BTgB9H4g6-%1#n53S9>zZQ{7&YiEpmv;FBZ$us5I&to<=*X?RB~BApiB+ZpAvr}q`QbB$O7 zw@4>sdm5vdU5Sk>?JVq2J7-Z=&Mr9$j0^_?aV6QOl9u?HVnLm-zZ>Nu2UdwP*ZD@j zbY%tirK!AqGZ=G#oi>rG{s^dB>`DCNqvlH~u831qG&n8#(u7n{Q9Z5{OqiOr+zOany4B?_n^D~T zw!#7QN3B@ru$a+lp@dPf^wZh`G5|yKjA*Q`po;j(EQub(Wj+!{94c<=3D^jqV_Tn2 z-hcpf)&e14TD{|~gFC~lboQ;)UDgDMTB^1QXV97A2yN$(wayo)b^4qL8P(p8Ez%Yt zFETUuf9gjxO+vKG^@MebkJ#RgjNFm^oNkO-vZvi=9s+wJmhv#yZ5xU{8a{?k6opQr&Td-i8G2w1bj^WgSI+b#=Wxz=mBHT$GvjA-fG zVK7!{=^kU@>JL@Fkx5W<*WEB{*Gv-#sGLlTs5*kzyy*#Xhf!}qiD5QK@GO~f_InnY z2#Gn@6}PpvNbMUbA&a}!ismM<_)Y|@`hDNk3F@p|CnyggqegM^EWC(0M?_9mj{9BLl&USI2CtkD5MU^j8K_Ucl#`Evpve<>3i0pr!qu( zJ8^c1cl{^~EI(Y6?kggbD~gEFJ&<}Xbw{UooU6CKdE8EJ|E2`Dh4}GVICZs!3o9on z21D`yM}rFha{!tG2~`uScL3mo&L&-xW|XIzFeK>Uy=aQs*jqA{CWCi%<+({tKr)a# z+6I2cPd^G9F?euTyjgV`h~2dkuz1;H*P3O46V<0UUXj`;LSJW%Yg;6wmQ}CaH%AAB z9>;eO0`T|Q%A*<5XB!;at~!l7=w5|A3z;=J$_yF>VWDv0Z%3K#&Nqbfb;I7s%=QOl z*R<|B)%P^Dp86?_cR2{e=MWzajc{QsU-QC+6dkd>8v$%Du!pc|>8C|=tQf&o4G~< z;?+4=)Rb?;_16)w3qX;3+Ekok-%0YQS#w=kwoDxc$|B=76ecB~{j>vtXzq6{TH$7; z!^Q1Zx}Qp+WH#+!B4FtI=IV|p_XWYk=*0OeDSzTru%k(Dg7(Bz!%|;KCx$s0SdHK! zyGm3ofuU_(P1AxjG!vXIWun)B%8FX0>by|fZ)D-y&)jM!_SVghj%ha#8phbP%>zD;DB*D&!Ht5uJ5>b} zqpC`V)IN*oo$-bBGFqr8H=u3@Nb^J8v3?e23?k-3Xb?GfmHhCfLPt-s-k!U@=pXdH zz%ErqM(9yW%_+q*g0w_)g){wp?aJy4V^f56IJZ3-K4FR8DIy164fU#XGoC{K6{4CK zx>I5?{@83D=-lghv4MRIguFor#&i7jBX&mX{fF7rdnSMq`p(P?kXZ{cT6vX6qUCnI z;LIM7#C_s9UzD*_RMDl)*ZtMrM`>hC%feZ9MeykP1YYn_AM0NGGca^O#)wLJ-HklK zSSI7k5oYU@*}f6G+Jn{w1c`HctM&;y1cv|vg{68F1>xjsa(g(j;-DHar)43tl%hUg z{-l4S1pW~cKMVG}Q9OtEt~hIaB6mssMk-*;Iq_XHj6#iY2Kg3OTM*xWX_PBf(=>>4 zA9*qll3Ey|5W|u7S+Hm9MRCR!zBeZ(i&oi^>2qpN?po26$ViRsRlDFx0@xW_a$I9_ z)}ceD1xH|=bk1tu$iX;7Z5eRpMJD0=CcluUc*1%VqIlMi(EN-di^Q~$)2iAdE7j)< z3&5!D9e8;ov{yK>Ymw{QQ<<)Q76=3M|1QbPC>U7LuBpQwm1FBzid-i#m?UIQOtF;e zzq=n(+f~;-%j?M*f*Fa~wRRsj?8OKksn+7c-;R=kAO;Xt(tINhxQejU_Aml$?RFHF zup~lu_KG}2snqIXO-)KH#d;JRTb9wF{FzxEQW*H=;yRt!tHQ%IfV%xBOb4QmXH2y zqB(#|-pGloiyjgIPMfyWbrhsjfAe!7x>+xb%F~wvT6|7n3y>`COg_7a)vw>w7qve*^m=NxZI|lmKavvEbCZY1awWpu4hed}WY;tC{ z)wzs z!!AOP&~fDl2gT&HOeZ%hS_oW#B4AGMU+F#>=3@U)8n8p1+Jr)YYV`}B1@6##Xha+1 zbi8llhGrB;o5I>sNty~)jt*VTFuZITGZ+O?1PA}+{>eA8i=6)$HDO-2tSh6SLSyLp zE;GBraL#kgQ{Gtc$1*FoQg&cVqAGf<+$1DW80{cCH;T$|yQleWL=DAvCg-jLPj2$B zoP5v1K0~d@2cKu*eyS}A1l@9!RM*eK#fdrKc%*oieQHOTxH28J=K3391*yb=6lMoN z%OpC0H{v0L#`2!_MlfrnWVXGg1=EPD7z++WSJ}X!#15Hnlf^5LvxFb+7EUOy{bYeV zr$zlnLKT8L9Dog;E1pFiR`8*FSH2NSC=vln$%MSF{Pr8c2vrZBdQQ)tw(d2(!aDr{ zO?~Rq8|baB;>;g*v_REPVvDeU)BLuoTFaJVA4|y@lQ)`VJQesd%g<(1(oPYJIbGfI9&WXk$9BbMKK1}JKqL=iezU^I& zQBPCM%{Mw3R1&X^cYuy9EE>{g!W)Hb`sT)@Igh}IF-`j{N~dU? z1mL45;s1HWP>nq@m2BGqOtn%JX!GGU%-y)BdSgUtLBk1JcVnZ_2b>%P;eaK6LF01T zVG3bWp6WdfX^}NT+vc`s;j2Z0Dp~ry^7yOgMW*RGh23O!u~sx@a{M#cQ~R#>^k3*3 zbxguN&?9t=3e~1%j5OTSQQfrECxgsWCZj5#H0a#LH+}O0Kyx}PIQFBUuGr8*=6q=e zQCv3B^qI{IjOx=Ht6%s+y)@aUQkGO0T0pX^Vp4zU>}Q#c3gw(HR0`aI5mC@a&MlkX z>~f%1&O0JBB=XQWnuoRaXn0Gt>$7z#YfjJSZE>B%0f#`%Xk~or=XUL8 z6fGTqxhs|u!V^D}Pz&t)yfNKL;>AQ(W?o!wi~`fHf#m{@UHvRt%4-(D1u5sQEJA_I zA*HCrcBiamQQ=0Ye`0Vyr<5BK!phag$(0XQK8w1qP|_3-O9q+6)K0+$%No15<@$LR zSG43#!@Idj?4CG6B3|iuRp%r#ilB1qDAOD>ne2ub6Hx$qq`UFAw=vS5y1fE1w2HfF zJG+1i?V3?sb7HCt?}eCpNkX=mg_L+*;F=WMLvdPn00&2yn@d}`0QG zfq5(1z?ESN1fVyJ`^Y<_nI2@OM=f99?{UdWW@WKY;1tR3u5NaEIXrwg!#^0s_D~E( zOBwHUM$-mOy+X`bjhc1WaW7)Uy5KQk*{zU^3)NE7vAQn6GQ6VWDws$$7V`|zumQ1R zb!f|@xGA5~qXo~P1enDQZI0e$wKA)G3DFh{4_bJ6186g7or^jx4lV!cTqF+Bg}M?k zGK|)%P*GPvK~fo}{H0wY9{b3*kGd4>inB#`94J}*P@M~NAQo;-4hI4PYy;n#O;Oj7ZVly^iH|L0~~3@gS-v5ztU9#+i_#Ot36fte@(L$keqY zW*Il8Ao{MR8etK_vBg@mQ517&Gpo6ew=rx$VmtKF6yN6ROR^Oj>t}>gnA1o^Ql7S1oVS+RjN=60po+a^UNPP($C%7O+>M%OOT2s0z87w)HG@}_ySX4IAY?Ld zSe4W2$UPb!mm0a7$v?8!rZWIysm-s_!sz>h$U1jZQ2r%kS8!P`XsUTz>-fP zlt5Gcoo0vtp25j@Fo#6*P?Z;?M2IP!o9fK~)d7j-wqB5ND5DUX?%)f)LKR5~skK#l z0h?KviME~`R`Q0Kh%`{mKI8u(I$&f0%HSkX ztS{G8#XV4CfHW|W?mC*lt~v*sn<~B6^1aJkE}SeHsyRo*9YX1V(!M`+*UE9-T}joC zQIH+Kh$^J5qr0clK#HaMrJ?kYpV8%)GY#kug>z86Q2j3F0TiL=;0YnB7xk z)0WbnF2|V92f8(+I9Zd_Jp2`Ln#dyQ>Xx(e9kU>M7yjmhs{pSWXC}%DcsB0!;<~5| z^!Z2eNpZo#fx)R-7Z?96lDQ5Oh2*M!odAxoC&|~lhZhlOAoD0Abzlc~>Btieub*%b`nTunnL5={OFa4S>4sxS2=TH-f81E4}lQur! ztXdgzO7%B9N8+DroOcC_1V`$l$Q+fK-Bjak42lJ3j)*{V zoa(D4c2eh1{qN|%JdFY~33Vf8Pb>wrr9cMyB)~+eD6dOIGxjJl;|)-~@v4Nt4AxHV zvN{SFv#=R7wUal>_BLb{D2^|??m0`k5I!R*44GM-3!E#Z(StyK>=!Qysc#YoE-#Ko z^-DBDj}EcS?}H(Z)L+&2o$%h~DykK}bOO*S1_# zs?=~;X+vo;wsC)!e-X16WZK>p^u6xz;j*Nv= zr8<{6s%m6#zE6M{94eoh9yKym-|{FxstzPogpu*VNqMIYApL|LERRBP$fnm6%P4gC zXc%Dr_((CWs*VB_wAH1L{!+UCeuwhmmVT`Sc`C22%Ug@bjWlu+u8n$QI?JdFsD<@W zbRuSamUsZ010hC5UhpU7E-7637wN`{5he*iA~NVCqz-qVM2Vkdc@$Ze(r zqdv;t#<8f568xit8hbz41hRp~5xaY@Km_Q@qo6CP3a~QEm$oc7zYiBQ{I`1Kp*$z2 zQpj9R0PG9akVtx;8gw<@B}u5|B)LJNO>Xahf`zw-NXJzjGyvxx5zIjA754f?5p&06 z62@5$++NDJ*Cz5$>E|JFNvSEo~=U#2fGX6D}>SfA~7=_DKW9@_UO*2&V|sAPJr-#slfxI z$<-cOmdBW?mq)oUO%gVIXXVT)z#BkUypP_7@+clOZIV&lbxTPcDTFJvrrfYCpQHF7 zgPE)4W?f$MVnS_Eol_z>Qs;4F!n3(0pyiwZX=(XABKZ|AqoXtSE*4bauVhyuB~xBq z+yIW%*}6+yM@J9R*#=UNsq$gdCY6Q&Lb#MvW~C?Tw8Qy%307o$(lj-~;k}sCsKUUL zT_v4?3^+^mOVcSjxU#7$k9&8Aq9F7Tl(~-UtGhIA|3bS)k8G23E{Z5u2y)#6np4dh z`Lv>tALK%(u<8F%{nGG;L1fCR7aUo-|9~g7gh%?5L)JZ5#tbSr@i8L8u` zlT}yOQzT&oKo@)4yYhK_!o-F;v(oJ1H?qCZvcxU{(L`TL^Ay@dQp0ek>J6x6k6tX^ z@eE}YX`=#&%9J04+ft1@j6xCw$l9HfyN)>Q2O` z(~Wn$m-h=)Ule0J1>;o%&LEXVJ%#Rx{Ifh4I|Zc*N_@O(;ICLMlX9>6b5(oMy6Bl+ zc3`R_e#wRF94RTm%mG1_=K|bH;1if=+`F1}k0bw}V6~|pS4Y84fG)z#?R25ianf@~ zh+O4#|?0rd(~xw4k$;y@q31r|*N1U$%ysQB775YOdN6qKlLeJhC}hRdxUs8On! zs(95=AjgO^%b>q=SnwBBTAkT_dd1aIB#jhH)ohl|4|?GhE!V{r3U&ER^PY?Y2)4n9 zg8U*%UhHmtaZSfcVSo^IrkQmHB5E?_QAnKdFNp1muD@gkxW^N~pbyle z{7zG2;B&4-uvCfpNmqnZATto3OmPE(j=|Lmb$_v(c4?X@J8baO}I4cO6w_O)HSGQLT_gD!xPYgEw27 z@|gyrP&brox-VUwNV&cj5Sib{0I~Xu678OeOz2blgV5iCGH<1lg;1@$cQy4??1?ik z9S#aE^cj#ZWhv9PK1wu0)fkjKRB?!9XjB)RW!r@(H*42&bVyCu32+J)cDh&|K3QJC!IX1badnws zQ{I4+T~t{i{H4;uJ5->sqspVW1kecyY%bX+_zUAh2MZ3es$b`#qfElHMV~#R#2Qly zD`}+1NYSV|mn{t(^H-rBbJ0(Dl3#Ionn{@p6{t*~^+p4ejEL>A=nw$GyRFC_Di7dP zRdGRpp|Ejqr3>C0A=}qM>_UQwjBj;ao+DW^VtzZ)F*>;S?;*gEixqyu660)!ytXh+Z{)^|0M%7%#slvL*6WyB23yXMc zO%U)v8U$F?n*oXfmfHIsv*)ZXIi@7G{Dm>!t9KnM6RD#3$$A8=ua3FLA$c$81_dv+ipOD*+Uv%?MB5P8kp?Fg6{%b+GQKUng;R5M2 z5<{{y;aI^fmFGfieF8lD?pjW#nJ$_@Tzv?KzC6m^lWa}o)A>eJHZ`Oah}Gfsd8?yL z@-&)iNOL)cAq_-jg*mB3nZuyo}O?>_QdEgz77gy<(q-HMBJy-oA7?fxKIHF z_33eV9IL-bxdUlK5q{h+ikVIk2nvU6t$}LP%t=HkD6Wa4UMFS{_|h%}rwl{4JQp#$ z>3p*!FV_=DCLB3!5hQ`~H$n(tZ!23{`bYY>aAdmh1S81CR_6k1t2?eVL9oTHyBvX& zLTk}JcaN7xq1Jz#PNX-+-UY!@-zEMgYeW?pS#DEv2cvE?QY` z6dG^Q$(Pxji4f>bfDk~hl=ll9{~co!=OQ=eYg*$tbAcRifA5VVcu^mK8yvh(JI;d1$wPBZ`YrK9;k z;R6%M&nhF>#Rm4Rcy8fxYvFR_8r}pq%_Zy%%Xp*{Rbg zAPg~p=ZlbR!eNkq5~>so*)r92VNazT#HYsz2#N)3S`dBn9C_@jU)lH1@N}tF*3`p!}Q`-;jNShix{hS9s9<<&a46!Af`7c0Q&qQeYq(7 z0BeJERbASi`u>Eg@#ftAi5UcQ2x8V1^Yd9%H#Q0-18EGs++=(PQ ziV`H+tU)oV=b|(4Xq)H2d=!?w`i;^+4S7^gJ9nK7OI88DF~tgQa%4CVy9n8U`-Oq)`7a43{Wqm4}eSXO&l18I;Nj0Pa#}z{-wRp;B#xWXfmy6bS`T?WGokJ*uYaiPGXDD_O0y z;USL5{*D1GA6cMXp9q5czqh?ne z^p-8Z^aG-_mW)fc!iO$L&GdwAIg<2pr16r_^AH_+5ZIk;>#O@zOtMRFgR|_SK{2ph zd}hy7HTIsw8K}7my12DoHJW<7og^xJLSU7uXBwl?yG}N1IRVlf{oNbseEooOZ$e@} z@iI{P8Teg&M_o%jZ_k{LX!#|9SG*&Jh2!p?63-z`i0MR(B9i(qa>4qps83_Rq*^RP z!C&)C&*i(0o)0axh8&rhGgd3FBQ#o%Wl(h#Cw^2v!5Mf`)$*$povWd`C{YID{ zc5D7@=3?)PJXBS;nn&;i)ln!fovs=a3#QF?(Qi?0nBj}dt`%@+sAZ_1{3mn2Aj<%r z(>CVh5~bPlT>cGxsi7po<`xiP>=!9$J(CX+@+c4>G!;7*+g6EbstKI1G6Vtgfil(e&M+ah%U;?eMtKfWi`nG#sN)ZztD4 zd<*!t>`DwkrVa#0fxb6xhAR-dD;Sgouj5|5Uyk-0`2&yP()mdP$uh~;0C1~n`=U|2 z4~R5VR(KmT0#y*c zKkiFaF=gLvc z5eZa(5qD5;V}!2qjb7xdfvyKJ0~j|VkF%7Hl|uP9DXqwKq5>R84x zmx2M@RH7ht4oz4JH}-Vd0n8{VO#95R&DPhhlcI=1gqaup(CWGQ@j)q7f05`G zmcsM1s7dbKav%g6C*qEBrw}6rKa4Ep!rG5Sx6n?V7W&GSRi4YFn5%v-HOgtk0MW(a z$_>53?x8*kxC_`VI}h2X>VWoZK+drA>WAe~QYyzlf~N6}lo$YlG}qwn$aR;0k&mHE zW6z9=_2}%LvF2pw@{95>LV3$aiSCxUxD22fP$cmQ)d0(HBTW&IDfi^4R=8=#zSTOJ z1-(`DBCr_pYyyU*S1wY#B9y`hodx3M+naA)OnG`tv!hZd!rnFFI^HC?k@KB|)Qis* zyZWWWDi@ByGLQZd@*aMPs8e1699kX)fyrLShZ^;|*R<*JS5FRrZ8lgbu3%Nor^=94 zl=gXfE(G{wNQkRBM~d&k6^lhMZCK+}M}c{y(#8>RVc_9bF{X)g3+bu3yz6*efgIv^ zQ8+XgeF~D%EQy6^Ql{!$z*?bBGF$J?$fV0I>W-jT#As0dKcww12l5W13 z8h79_T7-EFI6VaCQag-Zv$&8F0LY(`czG^RQL20_J;vVUL}`I(9%}Durq)ME4M_oU ziO96b(#DctvDhj1gl9WmNzIkLphZGydcsC4+hwV$b8%|}dZ3k!nyQWxXsL-EM#4tbbc3K&Kji$tANpv-!k zy~ir$?2tz+C9czNcUjobV()6Tg7O8BH$aBIwq1v$BI@|RX;rq*R`mrPiE z`j7z!$rY>d>Nf&B5WsV%T@a=^m=Qyow6nBT%QpiNv@K9jJiZe%P_c>5ELVA;m@+O1 z{7aKlUt#fWfq;+1GOUnJ1L^PTFPcK4)dBdfwAuRsC-amMT-Co3(kR^)_pIN83FwZ( z_>|!zr)Wr3=b|^q*O)aY2CL{0*U@P-kHhmY9jdt+K}yXUPbE^SNuy?0~k zS;3yWuaBu#Fk697@-(`S1;W)Ba|ZLu+up zwy05_W=b51p7NKDJ_-plUA+-AXunE5K?q27viPX(I-(g)vz&ZUK!VH>&IM=6lBQfC zpfe{;q&v{!PtX4fBYYO|6Ip?FSt8ZfGCt11h#<-Y7%g}yG6^V}@Fq}p6r8K8%bZ0v z1-v*M*rkvMXz^J`mu6JezY%Of`BCOTD|FnL4@noAAzYc_W|=u8f%R_0NonM;=rV$D z$OQih8N~8_xuSQ8d1&_z9GORw=N39rD!pYzK2*8f-*od9bwF<=o)#9I11W&0u5QHb zpO|mo$_fN<{d+JR=ApcxtD`^%(xQjfU2^-_d&5f+>!!R_R^ph0F=XC^Dl~F?{j>x# z&|7eaWmE*CMGz0tVLYqzHpYAlr%Ay9@Z(Zm7s;l5293F3^5x}cISp#I0%=*9d%n?l z1~0XHbH8|L;lKG)5q}}jQQj|@{$4P#&w`9&@u$YL)3AtkPx-EcYf?V){EXTmoj~J& zSL2UT(<*0KlqD(YjKg8l)(B-$_Vcjv4+Hjyq)?7(tX2osRq>1=g5n+?7Ho2$Z8{lCadXak-YR zrRtyAVgGOC_GPDtSnpDTMBZLrwb+&1WWg~zR!ym%Y2_!@7itY-*E!N)h#T?&z8mgx zaTIGH_#g{HOvJj-|D^0ribh7EJ6!!nS;;$Y8Q5eZ4@bx^1J%}^B_&i{-4vNYLxdX( zGA>Vo#3GIpDy`LX6mXP62SLH57Btal8x~@CW`fo7x_Dr35oqvxqBx;xqh#%KbJ#5N zvgA^}G6dwpkWu6{HK7&7V^?Q2meNxrx}0~8OL`=2TnW}zi z_6~ZM0CG!Cf|1R!harf(Q9NEAMZf)+Tyywk3Bqu7^#fw;DhjBMVjakY>(LCpJv;g+ z5^HyesbFu*qky|IvZVSl?ia8GJf=7vhRRXCy`$5G45&CYR`fX2Do(hSs-a1}6g z2tCjbQhR{CtNx<6ogPIB+H2_tMEouOl=3yQ0@X-0(o2Cg1M%d3xuB`hpFqG?Y497X za{(`sgELBAD%R$Ol;S0VqqR`wQ6kjhZytv%bAgM)m4~1KL(u-KkD`5mM%cmyX@=2x zK#>#+y1mgbT$n@^P%@$;SDlLjj)?!}hRo_hW{B+~8LkII#k4$%#x`VxcVkp>T;^c7 zq2#&7%br8v)%FT?hL#I~QG^TfH5MLWUj&}XwF{n6#$V>E0fH)7;$tnEaY{jH-AhJk zpUZm6>!QFgbMN|Qvg+(vSBkaiPnQwNO1uAp&$1j#=!9YYqj}=; zv|7Y)HFm3`a7czdivwbWi(oZa9%ZZW7vZ7r*n6L;k{z}Tbhth2 zjB$qY9B&6V%a!>Ti3fnc@?7BHfkC6y>E4Y7frlT)2n$*LtUQVyA1Se(w~lt0hW17y zYPcP0nMVbK8eRUXjMP?44V*&hWJJxnm#}ukJwzS|#P!vM=uuU5#f|qUK6)2=dTOBr zQ|jyTz$!+SBmt5hU-ZN1Bm;#-k*vITaV*I1W zMBfh{Gn6C{jq)g}sL@UQZ&foG2_^;vISB2P-A$ze|H0h= zRZxzaslVuD#jIt#)1K|?taY#cB5SKw+D?oy?KrBXOC{gk^n#Z`S_;wiA-Oy5T@QdR z2Zs-0ka$+rZzSr6ThJ9=7Om$awX9=_kJCXE1#rzk8rR$Q%~ z02r06odQ|0WS=-34!N4ILK)fq;<~`xNWdfNv~>U3X{gq1$R2u;%9UB^o-D-LsBYz! zVlsjQp%bM=QTMe3WS-b;s^^ZIf%%IdGXO4lKk&%vFYH|uo|dCC^Ebx%UB%3zrn&aUC$8; z@PT!tTXCIHp2|m3>fxK~@OY23S#Y8#J(br5(GKrFD4ub@fEvjzVDu*N*<-a@L1b5- zQ{oH35bQbBt4l8`ys1T2@7+lCURd5m5Xv_a;W<_SG{__}{A%Q36g>nW{H2Z=?;+1V z%qg1Kt(<+P;lzRx7JA$-s)(fE)tYq`0D0?kp42c=qe6^45TZYm9rLPW&R+)h0q;eh`KyOKQ z9d{nBcMWU4%UsyYx3`yFa)uGPM5>qqRu}L|jmbW)ek1$*;ctsOl-L{10ju_WgyzBH6jo@%Tg z9Czr-@+hRT=n_+l7&j(Mk&rc`E5g67yt>dgx~R|;%WJQiq}LdJ~m(V-|op%3Ko z`vkBA#B7a_V)C`>FG9rC7$g-Z>dq~d(=5$m&IG_!ej6cZlvI(77ygk50>E02L`b%7 z6v1|6d$YPi-5t0o1g~_Gv}5@fxt&y$E<}cMrqN@Vh{hRP_h&A@BvA^DP=zSdIU;Rx zf)Zf?CO3fuFV97Qp}oR*D8ER$#RUB}EN7!xTOCEaRgn(-W~j;&oDH3vGp5R$_DOjZ zjY1IMOYg=cI04#f!>Yts7dp}u%h|XSb+Tj1b78c|qym$5tS(lf1EFs0KgPhRj&k1- zlqXH4yEo3X0s&R+4M8Vh+G>r=CFQ0*YIb+{jc4d04KZRI!$aoevb+o*bj?OdZ21?R z6^NBz=qP3HYRX~N!j7nKLABLK0gZywTI$}i8ud$w-)!gctgnxP=WgdOx3`Ziar2Qm z0J!bS=Ln^SrccUq`O$c%3qWpDj^KmsK)0tzl665?K0!r*C@Eh&%a}IROWO2_ zb(eRVU=IsyEML@+x_e#hTcyHLXc)ifHS{8pTf!ZH+NADt?-J2C!2;7H&hae2BzQvb zy2WCfMF@@*1dAsCE#SgHDGqC6bup`MuwSw2 zmg85ykx+*N6xq<-^1^N(TvNcSv6!M%Qk@HKJD6WkU*iOb5ut(sdc^NsRLY|yV%A|? z@}mnjEySJ9Fy~Q8NqH0^AW(vv?>;PvX+6V52(Wd7+E=F9MxN%K~fZT zsp_kC;fbO<-K_da%zzFQVK6tHMs!r%Nb++uofMhM`$eNh)Igqp)-9=iX|~36Q2_pE zS6df&NL?HrgE2WPD;4JF@G=uW+SrcfR)vlF3JFcenkCF2UXA`5mxM00L{8+a63fa0jL5+ z#Ok_8KIG6W?8I|MfwBN!U+a(@`Ze~+NvU~^5*J1i;rKh)jb&aIu`dN~?RKIfBB2YB zR`^V{DvSr^>*_C}dL4)RZw(E~L4j6E_huRoWo1hh^1Ch?K}m38x3{2`kUAE%UZLl< zIv1No!~&X+EeFr0isOGtfU^0aMNuDx5*W?aEFY!2pS)tXm-j(u&nuTa~y{=s{+QQh+=(Je-V!pdrrd?OwWGd z0ZE(+Bm5Zs#BxNYBfZh6_k$9@#Jh_g4Q2~qC|rGcE*f8F!L}wxqM$f?_;vhJNa&VX z*k0FvK^25<9#+ArsYT;qJ;JRcw~YIR0}R1GP3 zXlKgu^--9Aq~JdG%ZrK=>bknYlnWNMeZ^r|S=U?~t7!X`=b}K7Cjek1zbJc6Z;ob4 z3aj;Bq@qNI!)j&}lnV|lJmWNN(vYgog^0BU4N)SaT*(|l{srU#0)8mRQW~EUA>#Oh zYpJ^@Wh7j2jKf3O7fQb>B4F~P(ai;A_rPgs>HCllFTW%=xh8TW$n5wNy}ponCExLI(SS`cL&{?*FwBp1AN)z#H~0&3Qr8!>}#BL=?+e`%=jg)ff+Nu;j_ z;hnjdi8UXlo@*D7oJ1oT*9gbuZY!*Cc)B=+xm3!rAHJ(J!=2jikQ}2Jbq=1*b zO9~r*PJaMzLcg!NE>ED&KzKY#ev!0TZ3>xH(G1+RdV61UlkiL72R~l>#Lhty0A9_? zC&jrS5b`TUp8DqT(TLLYpZKey{FJ*;LVk)vDN!%DAkP!xoZXKlizr^6i)Qc@Am8Jh zGkpg)A-e@|0uoSu?Mc`WncaX(d5z$muzKBCo?I|0iA8xX(q?>K*~D^7!KjKowrmIW zd8=nySu5CG&dSS~cC`eitsiT%1Ud;7T9crCnk{GCp`3uEMv#XrvlLM< zZK`u&MGrTC(d%gEg{3LB^%~vOceO0aqY%iAfT?`bjtO8%L8)7Y>QuB-Q4uQr?Nw5ve8ep=QtD6KQV_6qM``K}F6RBkR zmV%oHf<{&T-Y;OU-r9UP&6ct%NZhE%i71FhtshU>^@Ih;l0eX0uH=IzDdu`PsHFHv z9F%mWVe;d3?A5G(qc{@Z$-hg6#!Iq?&hYVLZa}`XJPMB%t@|EZM{yvRW)q2k&b23v zBK(kBIY%hVl5ru7S8^`9!E4ZnRPezUMH?zpnBZ9dqxM}tM+A70N7SvyjhT*w{73~8 zXbD-Ny1FV!s(VM8RQb|8f#WW_0cGJdwc-~+)>)AM>K{e#7Arjnd#_S`F3yaISC~BB zBTXnp5DjVyX|_`N7X=}RS)dwfN+Qg&qNL)0gr5*Wc@!N%q?Tl`V} zMNteuM1(LJkq1nLHw}~qg59-Kor_k0D6^@S68M=%d3$K7nx&&G=r|pv54jl}Dz^0U zr9l14J>ituuvQgRN3R?u<%qj*zypy3mf07aZqIfoMrw&5dOltGwI8Es zBs51+KLRGYs+A{}@*L4?209FortIu$zuis;ny@xnBGni`%X2~_rB6^k0ilXQ^<%l` z8xc;)wiWJ5`Vf<HNQ|i{DW~Jflp_x^Q26#YJ@(u$AwXcWx~a64EO>QY zB(K6<`R0NEOVXxMC~i<`s>d%@1#6R;LZ{Zu1!_Q};F!ma30R6Uu=CtwFih3nry3Sg zFf^sK(Yl23gVdscB6_JSmU{qz1;qUeepfX#YDQXp@z|-~-rUxi@liJ%yX+F8rg{tr zE#H${`QGJ~f!UyMIj~z4w*-eik2GBzT#n$?Bxs+K->@q3acw$h8hi?{`LJq~BiuNd zXQSvatN5uhkQCr3UB7oh=}iDwe0kN*!{S}F6pdQK$GQHCHSF9zFFT^EU&6;UZ1ul)tH z@fPJmv6){~MLOx@{tJ2@>gEa6!A^!AnJRh7r>hPw2v8;aK(FG{jV8KwS2Z$>*I`Lm~G`1}|T#tZYfjesK_`Jp;zRo&pQd+wO>D0HHqqIbDTRu`j6 zPMb|UzP7xcKv0q{}NHo^i3~S4$k<1AMko03gB4CTDyV=6S=)U}m;9Y2B zrX=PB0Mb8%W8rg9UQr;bt_!mZbzFR?W$!u<6rpf7;k8{E^-Wk)9Bfu zkV&+3VUHdVZgxoGQNnfSRlm`N?m8a10Ck+BfSIpnSYU)wA{y0E)Np*>9s8E?PCrrR z;BXYq#bxDwfbOr2x)-=F8te~OHoicrAW8-07gm>$R-LeaX!L~Bbw+2XpCm=yYY=Ys=DQbLwD?)NYs=^0Xnb>V2{c8 za#g*c!~q`8rV!$5c2gRKR|*;|nmm+|21<1x9|DyR!@f{qcJ5t-~^D;TMd;yDTo zZqd|s(|9CR+w47J)aA&7xEA0e!^Y05#%+R3Cze{PgX+i7e$Vy2xXkKQIOaM)2QZ0U zH9EX+?J_ZY@12&XsXdY)R&Gpms2n3+hR7j)QqM_3eMNF+(zBq(IZfz;Qr7{9muMIF z3nSybD-z9qRFnc*1;8R#uJS<&wLHq=Wy9lp+;v2)6V^rDRqR}!3!YFQ4f>6_8SJ#1 zHrA{=#|o*MPvegR^?OX=;6be^;9>Tgt{#TU87xE4eUq*|hAfR9=$xFNo*3U;^AKW3GR?ye# zx=5#nToL!`d?O7zW~p;M;2e(d;bWb^nULnpDwA)QEDk z*)IU__?zMIqqq~Ct*&mmr?{_}?ioe5Qn0DDfTJ7n!ty9I;+TD^pEllUcG^1k*wgrp zz7c0+FE`0^oNf_c`4`;~TZB*H9WA>Kke!4hN+E`KdGBgRQ{n(>`Y$%1jK*^U{%zH( zQFD4Mz?We>WL@MZ`D!;{8ZPeJY7``E0DeJB6aZ!KBHqzI!U_je78_N+5qOCXdw3uD z(l!tIA&d#HLGs!1C=&7mRzUE6sSr>iK%TI`^n}aE{&Y0lY`}CwD?U!wO9|2f!Yu3Uq{vu6W z1g1d&AE%MT8%bg;EBc4%pXE{5D%<~{w<9ap!J*T6Bgq>-fNEw#mQaNwyJR`jC_tJM zI>eY-HePiuP&nj`6}eS+y#et!#`y9AYybzV)e1gLAP{lR9VbBT;-nLGRGHNyIF(09 zS(!oL;~O2Vko1UHgi`!NyP^7vxWlCbe01yQOe=v(l(b6NTzN3dqqwkh+=pwtQ;Sa|-qHQ8I;Kauh=kY9`BVSbcT{b=XjnSCp zAw%~6jzUqcOTjbA8{L^QHg_H5in?f=i3Kfss)$LzIr0GYfZ+(-Y^!+21MnFYTz5J=|b0jQsN267!vE^f9+H&I{3{&2` z|4IYtG0Cyyu@t;U7{qs4xG7pxwa^x>9)UpBxB7*7j=&;3@)#H!Of9YaGDt~-#sE0& z%R?=GBE3)Efc7HPQ+Y1hJTvLYw2TsDssqK_I7Sv>OFYgIa2h2p>fB;^D39$drBqMbxBWQh?)%9p@5{$(?J@GdjRB69z_S%T}_7|Bvd>HJ5~r!N<$s7 z{7~x?0aMaXT7J=MmXv`lh;G$OmR|(pbYa3SayaYel;@%is~SZSc%(LB4oYHfKXDpp zX8Gb3Xy4Hi>)z@DqT6(_6~KU>{y4?Ey7tVEyWs zK1&|3>vJY^zj(95EY~HFGo8w-tLiW6ppG(1Cy;V3Vd^4EWwMoO0p<~*E7bt8L+;&h zMme>~*m#tYXsZ6A3vwlHg8VrlZ|DZ9htdHBThCH?6!1lUCa8(yehGfYQzFj861bPY zG(akZ$z0tKUebs-K%R7zuS~Hb^Zx%+5d=y7EAiPKW?jJ-*RvMn8cL z&r6@rCyHUZN|La_DtqzEkw@f8@!N=@jaLmGLi7;;z+`_7-Jc@8z-30z{#F*R%D2C>V3h%3$*-$l$ z$>s(6J>Q6q_N-mU9~qP!c&R!U==u1x>G)?Z4zi2SyX4|kSSqgz&udSIXLd9kX{HdZ z^57Cuf@i3HY0s%797iBt(TTmE%9;?g$_Dba>iuFAbR`h32)gG?yZCi6UE)}^=jzQM z2l*GsmR#K7qNL6qg3LwUO2bs+Ur`>VulkLU)0L3Khoe0Q!UY&a_3+ADTasNJg-#Js zzouO?6{SsxSgyF7X}<`7ERGK@b)?O{QcukUJU9^q@biOI^&M~DdkCF)L0pa~! zt_TL#HYOQ}*IoY7slM1=sb%^_boSvFy($V13W3!MLDT^WDaCthyhmQE*#b{$7B zeIqnH7;r_L^4?X;QXk_{F*4zc5JJTOQ-vP}^i%m4DMC>k=TYL`y(W^n#guhcDJFN`n`^$lbjwi*+J>=#7iUmNGH8 zsoOJ5pg>H^WbV)*cbXBDHFJ(g*NJ6_n;k@V+j8t3(AHsAK3N1035rmh;%J$?=D4lq z0sh7y9TS7Vkxc+uLyRj9Dd$7dlt&Tk;@JC6qahG1gWF#_3j&unQuRxRJ>^N-(o#q! zoE%b8tPB*2OMMhT6+K{^HKU~8BX#5zk;lJmB7>WDpfkscd%!v)D=(9Dfy$8Raa4a% zTtR|g+j*T6zl52-58}kLR+f3-n)lS00LfWkdRjQd$MroVJLrzpxo8pM0xAf(FJ;0? z7b)bx7VEZ@g}11n(wxzVZGn_LuYx#6iA((j4&MEuAw~_DbbmDyj;CLwHvOo)0m>%q z+x;LmEJ~5(Z$#Tz5`w)tfI-04?iN`w&VpuJH4~2hF!cdwh7qY=v~X`npcv&uk4t&) z4z4sjhIX)Txxu3DDE^fN@2~XG+isDt>FOuE>5FjedWo%m= zYFO{M7nX?==90?pZnH@L%OJ$O(C1v#HDv3*=uGlaThG0l_=Wi69cES%ONyx6LiHFc zscEiw4|Bh0g)#C7u@EV$49d4j^)hrb#yLV^hOXXEtUkF4Z>RF!B}448kIsL7l33o- zvQYwz2-T$ejp71DNQ72l>I?ud5)@Z2I+0Aa3SWc+vcWXJT4Lj%!*+^L2&6JqKlN4Y zjfseySh_6XNdL=mCX|J4ly&i`;fh5I06M~k>be90K>~?%!I(?H>!H>LpeCU%k78Ho zTzZnmJ1rIE;f{Nt2k)7!j`C36RmB7+&E94CK(NHk;{H}mDMzYdc*178y|XUY93hQE z>#fRFh5@@w!Yd?Wy;S{B9bkYpE8sn73eqD_WbtFEcET?=i&7B21IJ`Z@hL zyicEB#nbtI+I+o#Se@;U-RGO?-}~E->F4L0qSO5G!Rhj=O2B;o@%6d;_iB<7U22gXEEmc zn0|QLejeWD`N!t%G1hcTk((M@k3)^_a>D6c>D4P-&o)L z@K*qVpXbfj*XFA@(&yLwbNc!7?Q?$L=hvOB)6b1xxA}3N-hXVrzN&NjVz~G7{PS)1 z@%jGtzBzooy-#-5=f`gIvHilFJCsNIJpG){7W;Ge^Ua_8VHa3?y?M9(&;5sfd+pbK zZZ>B1?z7MK(_#PqFwv< zX?g!}$$XuT@4L22Em{Cb0;{IH+C_HX;m`<9XD;r+){+y$TSoAc-A(YK%N?CsZKdIN9Rzv;Pue0(14 z*>iQpKhEbbn6x(s@ceds&z%Vb@b+>3I)0eY`{&`awoYH?Py2eaac;k|pU&qu$iMB| z$Jg=evlh?Y*N?;ev9Ys%9&Gf(*J<pe!fj#S?vAp{Py)OZ{Hj~cJDunx602Sp2v4L<#zsIPIIn-AD`3P#v3~Q z*ikm#70;bBX7~A{??3jRStq;w(;NJ`-`h+Q-k;mz9{>67vHh`e4a^@uEc;=8dsj<% z+i!pFgcvqNf$0DL{XhTj|M~fUfBs)Ce~k-XO#t)c55m7zc5wykmTJ)b=k)oPfs`x> zSF7m>mS~88E*L_-2{BbL#Qb$2#kkD`%#)B1d{?t@BH4wjEY454*stmXoU@&YT*35`MGwfGXs*)+OCnjQn@&bd1*Scb$7}=>M`e@^;#ZPydSSm&# zslWjG>!+a&!3v^sj2>}%)Tp*#EIZDS1v1@V19|*y?f=@4_`*?m#8d=d^-EX$G#Upa z^zA=&Gv-E-;F;9&2gK?m#}j z3{0U_TA|%FD+a9jY1&E%^mm0<1F@Z?s3jphfi-C(tQcso4&gTZKK*o=HCKF7CZ0^coF_UniPPTYi1NVW!3iOr{(eoTG26lTJZCKE-(Btql-$r_nE4X zeU#M!W&jpZV6$FpW~8nK)2AFeb~cz(z!?~+p4tM_@~;_5`FthF)^TW^lVKQyHi4X7 z5Z?M_ATr6Gp3CA_OGQANMUgdLM3({x?AL+38)s3-vX7!@df!GPEf?H>jw62==&Iqv zl}wL2Pqtr1PhdxQMXjn(jQ?ezyv_Q1i%ArRB_0-6`d&&_3brf08tn{MHeH18hKG%$ z0;t{vDOxD^{xTy_mK<4Xnc@+Z=UBoZjH^3gTCbQ9&2uj;;MMR0upzO%Cns;_5Kw>- z{xu`KWA|z*(Bon=h$}?*13iw9)S4N&LJ0iPf*H|BK0kRcbxE}C0te@p89|HyeMCVk z&ylSS&}W;=!`Qj4nGuF9sYv^K%t)N9*vKMJA(kM?ih)k%fg2s}K`u4{yQ;XVD+kz9 zL0ImupZ52GxLtr-UiIo%eg3}>q?dwy4Z(?(@cK{Ny8NS>4s!s_v*u#^ZANjl1>=8E z76C(E^FaPSkP^A|cJ!IK7vMYpxY&~e2F<*I=f^B*e10^cP@y8Vf@J@n3!VQsBk|EC z9Q7-$aRMK&f3*w*;jFlP)3aZ5)&92F2GSs>C_{>!olO#QH})TAlx!_h=vpwc)5ckI zXNRnHWVH>Xz9#hhZ69SI^$0X(;zFGpGOtL`DI24qD80UqL}@X}uu@O#&^6i7Z$B*q zA#DSD#e=eO`tMhiAV`CA#6-@GeT3(HgQw$wERF9h_CpN-OgN?og678Qr(M9f*FL)E z9$8al`E9Wcq`sj82aw1J9V-;icx3t^A4 zmS>#N8VJUeU>#`cvtVWUzpar*u=63=hT463MhV!%IhGtTyj@k&_@9eC27-A-yHJ@d zv|Ik^r;QYX`W<``)JEg;XP^Mn;7+Ce$JcMjF%XNLRH7!OpVndn>GMedwwBhm211pU zYb*VLNwfxfLN9qqB$fq`&_8~)SgR^$BFsp2R;8l9?IQyLv+NMxG2jbcy8k#M)C`45 zg&OQUH}30e1f~gtM;i`^ltt0&1Er)PREG_739Kry{OU|Z-^Pt+CRT3>&TghYGrv*?oZ+$&(Q|LLcJ+t6@8kA`%Ka^A~d4a!$V zD@w?StQDb`f1D9qA9chu#pn!eUJoKJKxB$6hEti+P*E|`XY^isCtZ2slcDc+UtjwYYI6i$_hyC3Q4c85nVLWJR~Ayqw%AAd9evapcljk zPr6MZYRy2L7L~>rw2j)xhJpKz3AO|EBb8!u zTjVoFk!8I7%55CCBc8Tuu>m0|I&R>sM>`{7`bJq=*9A~+%^JlCUeoV;Mh;jE=TU7{ zl~y&Os2S*{qQNaaNVmRU=25e|aR*k+NFiN|XED-J85KTUr_k^pPdeUfqLCoKsfqz5 zrs{`V5)7;xlCDLCXY$v5gu@f9GlDRqE%s!^7!M#&Xew-LW~AsCRo(B;&vu(pFz;Zx z!=(1se13IozCWtRV;=!os@fB0#0AhFU-S9p)Ce9Cl^8!wMNE6td;LHJ*sZybZjc#Z z>fil-nmHF*cYdiZJ%sIw&rcxI&E0pt@#_>|lCFAp}J}IWT95R={=5RqKpXd7fy(jtwbGlNqA{Vt{LqtXQK5 zYf`7-y9=Q!s=o$^FMz}qTeC(~vteAdMW{CFkEWKvsEv-W|5?>tf5x)WpTUnw>(J!< zFNNC=6 zG6t2N?}3yw6zc5nNFo#{9RGcdNUK!&U@5)_;)Lqfg-53{Xh*J@5he#9`*+8Wl$WFr z)zCV{5Pi)+PfM*=sOg&?q=pY^Vf9{ivlZdPzkXUQ2x#Kj%mWjlv7$e(;^S6BdRZ}} zEiNh%|ES1#*FwplYCzkC$f|35%|P48ALW6VK`l(@~f*knhpSv!jgppxc_pGNqW_LMI^!WuV|&KR+58Xc_9 zR$L>bT2-Fh&n}NVkO};)&}OSu&o^epjP`I0XdVBxvmFt}jIM3SM0!4J22v{!ReuvH zMGx9*A{- z(fFaBxMoJq794A|De@eVKS-y}Z5gv;m*;(*LfdyR| zxrwCunt|Xmi2Mj4v$MUjgroP@p=)EgRt=PAmJ!l2kOwlK9jlvo(0jt{uAxgN26ge`@e{sT@zYRP{}tc>Z%M2yrEoeL zx!CZ3@w<_{dEAsal<#}|Jqj=K! zYV@RXS<5NU;@j3wgZw!>b=hI8ngc2O3%IWb$kEn}3<01mLlWz>2Ey!x(pJy}x9<%E zR;j{)a$X=m|8=qb{qx^cM!;D~#;)np0#p4CtqP*n%dZ`=?=AMt6~|&D?jyY;A~#VS zk+N$cwHEtMn@`TC^0Nki^oKRN12TB9b=cQ*A^tEBF0edw60of)Y5Z{@%zS;(1EZPN z8a*`W?xbBvVfKy)YYI1i{9vEG`v^i?-47qdMr!@E7`{+)bJ?ybX#Qcb#a9sMLey29 znm-LhY+aQr0&8oc+P@!K?x(r^17zxbe$j{yn|gwnw71w1`X}WyQz^5g9W>KY4`2Teve2nd2>FZg?#olGkTMcpp4hRV>`7&T}NG z5eCv2p*em#ttqnnw%8d+(Vf-i{)lDO_-Pr4cndYWE!0hv;O zN*k>iksEf;#-Vpr+2`+zO@Le(+CAw-YRw3$CS`h_Zk-s?=f6rvG=0>jkBuXeffSRY z45RYaxcoB^$S?;#jer6J{T~A@12JAw1*UtWpVeAyZDUOdE?ERcdIQm0l(3P{S<_wr z{WOm`gNOXvPqQ0AqOP%&Rc&efGzLgF z3W+pRxNkM`wHQt-0YNaMRICB%{QlD{G+}M@RlGl*V6Xo)o+1=>^lsE$>BTh$LefMY zC0@Fh)i&;`TAnZ(rCv)!g~N1s5AyrU9k}_N7XuIyVnQOA$LRKGwo&n1xen2ylO$% zsN!k2DF4$NZp?^Dh>9!AR*O}T`uOJ=p`ASS{`Do<>@{vkX`?6-6B@~bNBQeNjomNS zvhFh>&Q{*9LwjfVq}NMIq!S+N{z0{#uKlvQ3e7WAUvReUoc1cUw@in?G-l*Lc6iE zGb6Qi)#F4HjX2vtu?|DaR{QBZkQqp%uG_kabysV#(fc3|XARd*cIZ4u z29k$tH!Q5E^EPsk3?w3Y@N7Rtf#d~XXrO=_LsZq9XL?fAz_F)W!XN2L_=Vzoz!I5yT2dOzwFr>i9 zUXc-$JEgAn#r^aG4 z|E8qHsYc_cwX^S_BSAMoAoLzc!ajhku&~TSdNTsg;$uZPxOw@LW$?z*KI53zn-PZq zV1JVQt3ZRlW!d>^$~9?c0FpM!&<2u-puoCGXezaSnuZ7iP&xX0a{hpwV_@2p9U`K7@lHa8@KIL9;)bXiSnMyg`mz@WaBHG2c;Kd|k2 zp8RWXAkNY%Y(XlYN0O%l8#?g@+MU>B#e2BZT@UPR zb5esMf#_*_eX%nTM$HrRPf4>mP;|miG}K6G^=8C-lGX?$>85dK`)OzX65+<+oi*a4 z3?wX8^Sj5Ovh~wQ!|FmZi6GP09O%qm?Z}{}6V~LX$%+YA&XDcBuSSgvgB1_)(Lo=Y zk%b1^o%KaKz3dFcId?k6vhdzpY#_h0CJnM~=Q%PX-XIuFQd;g{tt=>Qf z!Ki99pSVWRH$P1;bA#%^ZLIOqW}wJU3v4$)qrIQzLcOX2W}n;|{w?IXl7mSlTcVVm9>=^W9nAUv|)^e%q_Q8pz4!z%T&Kdceo zK}r#n?^?}Fi~T^>0vUm1S)*3{rx}4BBQ$MEbNB9}c#}ScJzobll%J;A127o5@LuSL znvF}(j7{gSb+M_jDnhZeA@tiA2p=yzeTXOlQll?&!hPlv#@X{0G49uAMBalC6Cy0S z(0Pp}%kTRL2ilqS*wU*!b@G134kR$r8Hr+XpS;M{ z=tKU#Mi~gV?-ULptHRg6S_Yz~4Lri!u#+7bNGoeU-C3WWJFUYEq?tW*I$GFc1F6*^ zdTxma6&!&7@$Jt*XI{b)jX@)9E%pWDKn+1cIyGX*%!ssyNkiRC|QaRE=1pS@(yX9RicCF@RkM!)``?+flWSn$8+Q_dm>tm^ZFA^f9UF*5_v# zE?bwZEB>|y;`UBF0&>J-+Z>22I8mm%f9egi!}x||y5%>obbv8KDs`_J&SO;~Ie)xZ{ZGi6;SQ zY)BM+%ISI{nm%fpum7|R#5g_597OOMYqSjXJVIzhwzM@P<|~vrSbttu$vga(ikgwq zh!;D|tnQ3%0Hb6kNliD-T4uzNfxh(Jd)vs43zWr95@9vx)7O> z_z_=FRlDGQ{*P~e1|l^zUFmsiXt(wehDU5r@ZdUewi(4U10dqQA<5mF(O~9yuRXQB zfwT;HiDR*KvLio@Iut}Ku~E)ftr@BJDnTpwE86r1I`4T7Bl*}+t%1C-EUL7$C{gqV znmuc<1MbP*S+fu69x5Q|`t@dX17Ssm+u`}P24Yn}xCl}F(II%-M<{;SYlk~u&c*|2 zpeF`v$ZH4MzOA43OwgxhM<2ekMtHf@Z>bg2KWm*e>_-aR(XHE49BlkF%w_m2AU5Kl zownG`Y^3YT{kbPQYxHDPGE=>G-006Ve%g~-6&AD-i4ESkA@8xMj9a}$=fm~-j3~mQ zV{?^57QxeL41@&(R}o212<=Awh(a8j$vG0!bkI6$WFXFBikd{sZjERpGZM|xm~>LM zjTkZmao+=lJmh}sE%rsBPT>!Iz4_BPjMz(Io-__^ep=iiuRF$B9T4*v2=WYY#Hni} z#|FZG_VUZxsKvDwn_Se586#=c4tG5>3N1@kb9Ux>GlHw26cHJ{#*=ME=*Aay`V;g} z@2pW8))_k(Mt#?GOgochAlv5Rn z)*6xGkz$J?Hl4nRH3G~gGzEa%f>mcA7*;}a+eilYej3L#G#Ci9P7l(I5^G_?MlrCr zA#YnMAw;ybeH(FhX2k0P=TKd|gNVvNl$ozrEf(e4)?&xKmlvz<=(hLv-*;3GF9i7| z+PxX=2}H@*nHD#H8louGVtZhfKICsj7K_a`?Ln$Gwm`kN|9&FLbq1>ERMK0c0GKUM zM1p$*T}6N7YIiNciL8*fuw4ThEFsDdTSJqx*f<+tU+39q*R|Ai+I)C zi2VIDBGWLe;59;t-i)S$A`}foHX6NwsEpsJ4fWa?`DxtAj}v~*I%)8~pEc%->MV!- zt%VygBO3gvL8-H^5>Wp8j3VX_qrt^_-@75PD)9R@Krx+8O@5kEguXaPOXof!rR+7L zGo*@iTO|(s+ZwUH5NT~E$Qs4p#^tZ`a3@@`htS)4OkUsFnripsHHj^V<{As0-y1AX zlw~@|oZvTfVjG7x4g(tk(TCF!`>=6mXCOc6D8~keZ*0g6WKO&#fTB8Wu?(aI2@ypv zrV}1#AZ6&YgysfY+4%ehQp==*ugJ2-R`ze7-#`HkfW_tTU#_c{^O4;yvJ%!p5b#sPPrT_ZfsK$srn1`p7_&7UUrllL>HUt@Rm zhqDGR%why2itR;fv5_gLvT&K=r_>v0yLV~RE`rqT4K#=0OWSFk=>2amt*@q1e`f~2 zQTy+meyEy=dFN*9UA2&2TRMuU`JEnQei}rCSZf35-8&*|%7Pl>n%&VoHlr);dX`Rb zEFCS@G0;qH>VfKW=w1GTKOa8j@s6-tW(0e1BI|@#+q-H5hTSrk@%}dlx>LQ~9~J65 z4VL`06vnVcG}s#jO#|Jw3fW-(@!)Ko{+nBE&$=$1|K30cZ$A=Tk9U-xMvmif*#tA( zJN;nin>W@G^3ko)69+rPE5BQfnx^VzPA=0Rq}#@QW70_6WTH=U78}>4yl69AfW)6AAGiW`{l33ofw%C1)dUj^lKUe9e7t>n`0#nO`eiC42Nf9jmAKC zy1?GqTSJR={4~a*`cLrUjTB-T=yIWdbW#xWd2%^$YqsX<&q4E!3%`1y_z!+xg9a^5NQ5s_9)M(S^rx8+k7;K_f`g-I) z1`-)Pxn6jdUI$k!13{j$gwsFh-H-xoml5JASX66g8|VN#!bh`Fsvkd%i_eAl5u2Lc z=lAkQM$>!S@D>|0!pkS12+!0|92f&V_mp(-DG5%s7Ml+*QFy=+sL0+xSlOZGs33O- zV&y>Bkp)lhs-+L0qXAWqG}8NNGg(-MP#&b-5xH7wCc3&=4LQDiek!aR6rIBzR;%~Z z?ySYn$LC{uHWwQtR%Cl2#`!wjWBfGD=SlGYysR-N|E(~dfs`Q*F|34)dA%|^2BO7= zQOQQN0f`v{!5wOeFgt5#jE{lLhaDgf=LUCu4D^hjhct^^NNXRd933253ULj2hs;R1 zM=OiT_`bQb?^F+2_#T+K_AYUkM0MWCAh-O7n=j|l}4w79BlB{#$wNB z1b=p{n})3880d7-8bR-+%h20LNg!q++o8c=88f0TZH|^tr)ROBVN;)ukuK;JqEw-|imPaC zn@=`|heFhy;%I{gJAT?x7JAkj>)^A;Kxv3W!}0{`6%axd6dzr%Dtc#)i7VX#0zVy% zsPWT?aXk~)AB#>0JKR2&5fN6x_Wu;ko<`bog3UN zaU+=#ZA{u%a5{~vHUk~->8=oeyIte*&p-n8<5lSgYvA>roq_0PpY;!=*^LL%K(+u- z^+6x1AvKr9KC45W2#)Mph4BnT%@a(UsY|ECnt_hHjgl4vrUpWD{4|2sI`v}hhEv7& zK>BO!{BV3*pI^{F6Fue*@@%}cS)*HwGoQ+u4Xyg|)3Dd@GHI7Iq*OAH8vS@ zF8>Tf17*9T4NkVWwb&U*?l+U0?47lX$XE^u5YxbDjWwD)M-f7RW$FF2<9vY8d2Tw^ zDPujugoPdCZl_10Q!l>Ez?92ZHR zMhiMK5T!f+g(n0HcGrF?^X1=yp9&Zgq9E@I}Y;E54 zzFG_liH&T}K3i`_+p9F29^btoSemm23m=mKI@1mK*%*jM;4$>9P4n_sfr9cz@wEqf zYjgsy;Y%;nYV<|2Mhqr)irRdWn)?V1jw?Va?5`7;#$xMbMTwhtMkhS>(;h<5D)eoEdh_eJZB*fp`>5JG$_zOg4_Yiv9 zUJyZIazBe{q0o8{8F80s2|~ZbhPTT zMwr4!4d~0fJNI5%qGzfQGqPaA&11|+4T5{~yxTO8zGEN_U-#`k&Nr>kPi1sJ@s|OqJZ#?~0iJ($%Mr46$;K;Twy+ivv;M2NEh!!`0+GJ}3X_8gw?W5;J8|?a&(rlY+ zq~L#pVtimi_7*z|+?zvm0-9?C60-rW=plVo=mPSl3rsz`(-qxOsK@VAW#doV@E1An z?(*W}1ptMEcf)?~j0DG1{4o(xr!?G%j|_A_#emDLM2`RU&mTC9;9*kIrhVUtYE209 zVB!d98+D-PZbrxxlK!Y?L<3&`X$CrP3?%p`6xRqMGSF^97Ex&3HYg1GVaombeR4HA zAB~GG1KqJR_D=w-PU2@E(jH{SHv9^vMh`LrT_^;A=xpa*Z?Sdys3|aFv71_-KN@j1 zIN|Gt`(nNtcd?^t#&gCk%THqj8#$Hu%QaF_;m1R>t zIYl6XfB}W4M&wTwl6A)Q1`(N%?ez^wjODhQbR3PWYknLZAUf#)048>p>fq_pqVZ8hRXE0bJjA@*)9UoVtLYt zvonxKn+Ap|baO^>njL~S*g)s)H=`?8xd?HRuW6)NW1zhk#Pz?sHV2Byp`tczjz*0w zGXkmd%P=z=0)g3(*W=lQRFAkrwT_5>zhIjMO&$&9#V-Y))ey*DyQ15q0ydAk?5 zcgj8)=y;f*VPH@@keCbvR1fV**t65|Gtiw-@pL6zx9<)_0fAxWZqF6C_4$()Kb?=Q z)?aTR4M-J)-R{uPKg!NlK5&ifwdy*}OasxYJHf*3ylb5&+dx2Lo0In+9k#Vb#IxN1 z?0{L!wFXiE34~!YJC0-B-G-W%;>zssmVZ5n%E&RqI!36;BN5gHhY@b1IipMnDCRtMxT2ZSMZl&E`Dh^!GSE$1Twg@Q)`+t+ zkecQoL-3Ys?IQvx%7@fOJN7bpX=!L;=ur1#QQn);!^uCz$Frkal^H#4q{r#uF6rIb zcjmjo$5~6WkwKb~IP2u6A+mJxwG1S9vmxMC+PdJg)x_@&UDzTej4lnbQN{K792JM z(S^M;%)ZR0-n&L05`L9sDx79xvDG1u0&T#N>)i0EIqUW7_e!z0#MnDkzZmZ!W$Qxg z_jW`%ME$q8ibp~D+|baZ3dl6$=pE5x;WF_0VlxvqpEL5Q26P8ogHNN+9|)`daR)U< zhwrI+491A**HIe+7gQ9p%$lnm2k$dsU^Xrcb7>cxJ5-pfQ-)M$sju_1)9?je8nD_4 zLYpk#>!061&}SU)u=B8vUmxhU2hO9S2Q|dYvr&jjY;+JC^G-;K{q-5$w@iglV0G9Z zSf{;#a*1u}Q!%b)+^@p$k~B7uP@+$gbL zsQKNdiKr(>P&q(jMrYO4;dt_ZLwNnkzHsowq}3NEqJKNS9z%jK&KJZSKt?U``Sojr zugry@_YHYTSG-Xf)psOS3-NJ#?r(>NZ5pK!@B{jg9;F$$>h-V2aP>jgiBXwD*Kigz zqre!CEYCo_AFpSS7cNIYtkZK+B2kZS{ItvSv{9%>JYX~Ndb)l&@Rm8>-TVr60O+sJ z2=)ZD%5CHt(b0Z=APhl6Os%JVW5V+K8X3q{jV_=S)iEi{jPACMl4^5hQ6ANz|JKKz&pk9ZY;uy_= z){LGk93^aw3Z~b?nyitGc1QP44$&wd8VJ2>zR(#aH`y?{h0G2~3}5KXf~mo&xriK3 znvbdnn$XA2S39#z6sbRfqJe8(|7z}Qto*z7+Hpg=vN6yeVSpUl0o02?aAP1cjJS)$ z>i6!G#tkX6)>YqK=ml7)*Mm`IeyBq<4;5BA+Kru^fzCVEPTTPMb9n)oiZtUT%`!Ph-IYIrcysXpl}bBc(MD5isn%k<*TW+-mo| zd)qN->}<}fnsnQV#gsU?H;~rhMA+%J={%6uNNTj1(CM$61{^kP1S}knQpn?mCQAl- z9wFJzXMt9uQ8xyHJ;v<@A2>InT7!UmB(RNpO5@39DssaWxZZgR<1)Pd`OmCV$e+Q( zpAU1R#&$U$X|WvP{osZloea`IXW;`~4&m*waYJUH$H5_?$+2rd^zzfL51sXcJ?S24 zEVjlG8iZ17e3+U8@ykMB#T9Mb~%|H(inu;G~=!V*m8J+c?51zG) zL(&K$;w>OHW>Pmw_OE}nOTt%=HG}$v@+Ie%e*4MjW1t_o49|Wkz6LqAcnT4c<|H8v4R{b7s5?h1mLO z;&hA=$f2qE`8BhZ+3%aJH?lV)X|@P5Xz1QR$b!tSPMifBstj3dT@1H2fE^NZ>!&@a zdfgxfb8+_uf~qo%T(rR#$xj15U@N|VZgvf9%`(uF0TU$rb=zDcerG=Z!%phmM^Vv` zu883>i?q^UJ=PHYb3A^{dZ z)8TF$krYIZ+I9Bzd~7%iX0am_K+;vXzHcNo272rv&s`##NR8(x1A(zdDqy-bOo4)5 zh8f}vb4y#Kan;hP1JTl`C+o;+;Ppd`mv@S^2OWg%u>n5ibmZgnD3qUDU5zKTU~shgq}Z!O{8r`Uc!-(Z%@hHK;I` zhqQkRxaQzqYM>9*e286>tJLq^Fivl*k)xrLdDLaUUmF_ZxTY4!?I`;@Xhyw0BlO2$ z>R~HDemdpD=V88sp2GX-Aa|OX5h}NhM3DrCZk?Y7qIIyf-Pez)p@2gA1UQqdXL=(H zOB#!9pcD`E*6DmS;v+L6H?n1Vu)k8%Y0U`CN73gtoUU5~Dc1RDR|#MPp?Tfx)kH|v zJ=kvV8UcIqzS|xoc7qLr3HkC*lg*y)4^U{VI@QtFpCf%013>2-0V8zB8#7WnAe?_z zXG3LZ%!uGIYl%r%yR)NSe?_DpN9y9*tL|H#fUp0wF^+1Mk57^L^;hJo+kYc}z=3Dx zSn&E;W8uMfi>vf=&+V>37s@~?e|SffI6MBdV<6rlwCf0sHsnDw5Q_pRt$27gu8|C+ zN23T0$<$%gWuPYvQp~)>B%RN1py@#0N7~on)0$E4|0(j&1Rh?${FMwzxf%Cs{F3zCE3E#~bkctAQxqr{E8se|RLVh0rlgyeh8Uw8M5@BrT-IV!LQ5RR+Y2R`F~O1n3Q3dGwYvE;chFT#`zi zs&AtSbp@+^DvwPv_C0rq*H8bn#TABP)rAcF`1OH~ECp%j(|5_~?Fy?RAbC9ls0|I}mP=D(nq!`V53?%6`$iEm3-XXRBfnJ$_ILf~{&O zpzzD0pRb$67lH#*XGXKyp}x36bO>yXpJo6hD6LwMzs_?cTfZK5Q0%l~=1!m`SqFmN z<5H4zy)MxIz@eMB>1gZR5`N+4(}y^_}?wH2So_u>5Wg9$HPUYXhWn zg{EXupjro{Nw56%H4X!km9>%;{5-VgLh>>77Oo-YR4%977A!(L#titT}703y>8b8`m&10vqBAa{-6N zKV9?H^mTQ3;7zyrX%tUkjwLplQLLBO%t!-cV!Go}%s%qO%CISO5G+=)Uvt%ZS1-tX zv49+3jjwU0J!VGkkj;ev zg4^xs=dKB~Zr(xGO)x@Zji@J`cYZ93vMuG(6&q5QP`2>61(oabheeA^oA4hYV$DGJ zJ&P=oU}2dXh;F*#!EJw5`kPm=#U6*5GXd58-8lVRl0Dbc6$?)6zGjWcWj*D2sb4!H zD5B(nXnS#&0kQjD&|mVq0sZd$J+mCUJ7Oo# zx<(f=yf(&)m)1Ad{q*WDYb4O}gFO5@%?uEf6+g{k05qF+(7o13>DUEJM-LocR=eWP z-my2hB||@qm-ZA9cE0NrR0(RWDb_(fYN+Lv)^@NVl_33vG%}ufYbv8Vnjk2_lcxN* zA>|(;ep_i)^(HiWZ|wML=)vHyBAT7H_!{yuvD^)sAtS-@Kzj7WT#%m1N4sfFpVl^#EADvq zE-@r;b5*~s+%HC4tA5%|0rV;U-2T_Qrh6RO0(Iy$#FHIw3w&o418t1FYbSUp;zxIz zeO^O_iH#g+_hGh~^R9_$cwC2+PqT1MSVJgvj>!R#XucZsf*Qj0>T2;9YgDT!WmCOi zBJM;8wxOyX!Hguz0g7C+Ays&9cC_a<1JO`ZVg;*%8QK7%thh#wKG*?j{rjuQMS#8F zkBB>6*YL7;I_V^rnF=gN#O3eA%qJxTN^>isk(~SoOA6f3aYV%1v@}Q`#_e>CXcnGC1J^cc;hW?N{@a*Q^oaWZpr;m0GfkDfwD7UC{C(TX0rwS+Uqu!14M7RbxX! z)NEn>?iv~~s#p;p?Pl-e#nJyhv{XV=X)&q}y8df;*>J{p)DTbFEc_7F`d2z^^8vj2 zzJ{H#lNAGYr7@Q^f)bDOs-~aOJe6zKNb{O2MS7}PY;V(D(HHMXPH|lG_KRReF#o+F z3Ct3!lt8GAx=B{d==XtC=zaPbBF0s_=Ft8=&?$1>`^!TW()-((k%11^#|-n$`nF*U`Q zK@tn-&FBn)|k{@}vAsN;PDF107 zC34a=WK>VRtM&nNk`8VUT}|7*(7e;SA~xauEuhI8*eQY^z6iLmFU zcV|-x5Y`f963e%CwwkCEN#-sI>FG|dc`uU8~(mo>hkzYjEOY!ETZ^mINNYm|W`6&uDEdPrG2{u=651x299`hn{4v?x+BdoEHE=Nj1BFOW04Keo*KMk;gwIG{HcT(%8MT%Y4y?LJ2AX)x2BQmTY zI)DRf9K8QD(4-ILy_T~7|E%5Jx|~L?2H;!jZlHlfXyE=YX}_YElN}ZZqmnb@#PJi$ zMNw3#r0*xu@4pL#c49AC-bW>?_0~R&lg1!ur4+qyMg*R(Odp-V3~KBy5N0nmtzHAU zaQ4Tep)hFps!dh05rMWRJ!UJre-*b{n#XV7|M=1^E3ItO;x0&wCTCX+q%uxNMX}~l zJC3BZ1dBHJhzzOX=Jg+RPu;OeO{WT)zxQkm77gv=P`@pteqO&W20uWEL8ZU;w}x>Z zF0fF=H>yJRgu9wIUaLfP)?nV@VI1Mh2 z9)*=1jXHXad{3B*rTS}^Z!H3iI!UXpn@V(Pjuz@b2uzOb4Ak>xj^H95P%OZVYa#RZ zXbVAS%6<#6@j@~hfq;nUOp#OD3s(q%hy{E`D;u7y_Gr2r%TwZqGEzwWjOYXD6_*ix zuEHr2f%Y&?q@$MW)cjtMdWMf)3+n9}QCg6?^k}DV=!j1(kRB2j_B!7%^V3t|K|CjHd;vijA-+=SVPR_US@LyO8>MG$Nx@|D;+v z&xNfv0zoo$C__7*SLxBndWGx3+Xh)Uj*N(ANzYoAM|Fn0eDnH2>Il~iL>Z34?Z}7% z4$U%icqwd^=4dw_eHy~>8N-{KM>`&zrNC=^w}oWXqXoqac3=q=&BCKi=oH(El1xX>GWslz=iy#5Fzn^j~Z?O7>AMWBy6 z#KBq6`QQH51PTBdb;#J+3X^>X;^m_yjyF^s(GYYx$3JL&?a=~&IzW!RDoB=iH2g(J zT39F7UjIUmfi6?{XB0jWBVsVc&TR~cbZxTPl-MB2pTVS-CY#!zLaov}f)N4vIgU5`M3)rlU%9!$DNMPTtZSfAO-s1 z=djIE)yyb+-HZq;7suA&&t#%B*?em7O>sTCj27$Nh#-cd0qsUo`$V?D`l=m4`xP=a zlO5tGa${isN}?5k^h52mFryh$>6FH7J9zjLk>Yl zwG@aOOtk!fJuBUHkG4Xw(yV$C<|ur$0y$+laDX$dm6aWVFopO@<3bkah$#qE{Vo}; zfKP)7i#9q=E~AQL?QcyAsz?`>VCq^K!HMfOf|ns%^X-!@Oqr8k0|5)bFNJGPtjEI2 zmOe;})FKEwJ}Ykx!Fxg#vjylwR0Amp%mG^AS2M)(;B8U>Hb#>L>3nR2%@0^Krx~P|5%j;=|9DUx^(;^5O9TV zjXLC1NRI{5pCd9$m`A0pG)F9R?QW+LLm~4wA~3HPw_IY}l^RS`leWskI&oh60B_&Fj9 z`~bsm@-ejqshmNcg)L-P;IGAqK2N+{Xa)$|+DD6bu#6;#o<5S&>t`prg2i~Wx%T?W zG>|c%?m{=LG$LZoJYi;h_Kc0=%}1+}VKF|GA`5J>cx(Ge?p$*f*t0!{j6iBo2o>BD zj;{9B$OMGEJkiPmg+YxjL}4iyxM(q&X@6@Z-2%h*B=185p*{5rsX2-00W}CTSm*Vyh0<kPWj_*#`o1*@SF2&${?_PVvfyKN<-tA$ z0@F;M2du_}0r`Ilotg*~YJ4;qKAiIkAFV*2Sy4neLL;h>Lki^6AD~9?GYTx9FuQ;n zi{coaxQxmD^%Ie)(J&+ILudFXz&%2&l2VL*1}!rkr1o_r(4tcR;+z!#)KVb#nNA}@ z3Q$n4h(}`y!E!zH0t-OzGmv{)_oiY7fmnJp{XSOk^dT$cQksQ3}UpnLsV9g+pzn%Rz~DXLFTyQot23)4+yT3Q2u z5xff8CwqTxoX+0l*rugq9sgU0q{#^A^Q002Uq_><`O#>F4H&R5 z4W9??>-JkVG6ezd`5;^uHLdn06sIfBQa&_bwq+)780JF5D)}Eef9-QL2Jl=$io_kY9A5oTAcnqS*}n87PQ;U<`lwQopHs+_I8F#v0a}O>ey>&u9ZMItFLE| zxT-K-;2fi4BOH(jootjIuYIxwf;oPzVZYnI+e;eA{Y+&xHQ!LbDrjjeZnI?B!F-u< z@ZfHLG=b<#j;=Mdlqz3;1meVjE*SbAg^yMs9oD^vJ)R(k+8<5su+!lKXozxMd$mRq zGEMu_gZckhKt%cU?X!=b;R!f&WsV#~C!(IT2S3mD&0n4NfYa!u$o;Gf)jZjhN@dtw z!2mvVeky@lOMgh#qvxrRqAO(9lu#c`j@! zUeESyBrK&-YS7>z*((+H6(gH;=JP%D4uEGnB&OXE@H$7q?Z91e2q3Uz%z&?f7`cII zk(kvKce82#L@2r1KBj%Aqs#8TJy5f~%xl64ekp`dI}4RzjtQ=heCjB?r<`-pIUQpR zMb^`V!(C)`L3(mf0B6eGMI45+d*>-v9J;mis^9vd+xmFq5K&Z<$U*&4h7W2UH3hdU zYWk^LwzkFa)Rm1kkG`6Fh-W;=4TP{?W@A$)R(5)+UPd4i;ry1>R;3X@`k9hOq#u;m zS$Cas#Rz$eN@Pg-K0xde>xg={8$JNsDd?`0p#(WH^6?H_+7p2mP8n`gfn6kfJwpsC ziafMvi85u}sb5eu8sXjlQ$449DD!{J3zxFYh^W$X+a#Gyvw}Jl_hx-8sm(@rAd^Id zos5UlmW#=z=O0C1a!e$2f$K6Oa-eR2#yO12%tla zgpz`eO=cafPY)xnQZF=1p!8n9y{#iz>fla18YnL77NY52FCUM@1o(LJ1)&j{*&#m; zANB?mp+bpSY2^q!47Zu5Z!MFsQ*U&64c(k`j$HPX4giP1bFr5bkGAo=U{mx*W8B6D zc>V&;AIXGdPFf;|?-27w4~e%HPN|%f94^-Sk=gv6(1E7fp5NE+NSjpY=&3&u88S6C zv`6MNC%W5+2vjoyB|L6Lc>S5T2DOA+`~;>t^|J%S{3e@EAeIYH=Fx2Rte>g)tuaSV z4?H1~$MA>h+L@Kjxr^%wkKA*I4CU0l? ziFLHE2wem??1*uS09E4(J2nr^qZIm3>B=Gop+6@Z&JQj(o@{1ynW~K(UDOIF6n!`U zi9OZycFyUEo2A5~Nnc$U2@L(CRevb=pwlw=Nx?mc)5GNbkxxH6e(tks{xl0yA1#$b zr}Kj}K*;dVGtV^CEWJZ-FvAxiPX{qJ+6v>${86U8jY*&liX z{juqe#nzkH*nCoqq(2yx=fp_vkA zf2Ue3-($9P?nll?g^1?^F>hdMnpV)B{QR0JMllv(1n5%Hpmvh@lW3@{yo&HNkpL@<5grvB%g+VF^52*7v zVs|o1bmZC_cd1N8t7CN71*&g3y$)56XjX6*>}>@ka1tYWYZbcG{P>H6Er_RMOa5{i zO^LLI5KtJ*{5i4%?B!cyGN4+k?4KEt7w_`;a~$!`lc>>~&_HsJ%Phz@f65@Nd2O-P zlH=K)_U+Ib*$c->_PMZXY#W|p#OIK2%m*o9e=TfPh5s~)ZGM{ zrI53%jmBGTM4pL^4mYjT+5dY)>TFDWVTS2@l}6-j`zWqc2+!yr-OQ144ZES}jik>0 zn@4knQ!ROW#6%8xHzN5pcs}GvhADm%2uaL6LXFJXR+?-YlTbQGl>IZG$nQBK4CuZL zTDN7ORd&?ZaXpa(W$oSEjq_0gydt3{bEU{! zTG?${^>>ff50v1{_&cVxC zVdK`?>)%JvOlHZv3TxZQp&=&8k|by3)30x>TRm5Ij7kbNxWZ(2DC;xxbOpPVXLV>*Pj?tj|gyOc5BZj@}%Wf2Nyt9g(UZ)S*m-VyHt^`JtVT5B_4M5kc$4QleOzp$px-H3>V>gm(7I%S=YyMo zDLaQ>BO=8Mc!Ced(4}%0F(QKQ+e2l8y=dWp6o}as57+g;IWMg22*fN=GlQ2~MkeHD zj<|xj8|!8wA+)b-BSM1by-bO_)I1P~TPpH0P&Lp;X++0>#-N+{(UGhLqUQSMnbvI? zrucQTnH|B82A5WItg;_z)9W5@`p57(8RE&W5eWnpM25?#@}PHtXw04!vNa>4b`yvo16^=PnWean*b+}JYu$rpVQI1zkQDp~ zX^d;(z6J+lRpScM;Fm?Tj|kOphlo;y3MPCZ^`lugg*mBR(o!mnC<1}i5s6YC&DdOD zUw;JJ4+S<{ac{1DjsyZmMPO26NpX&EMnnK*AbrK9Hbbho38b6Fq3+oaeLpH9W2{0 z^tH+UjN_AJ4TeJ-z}W>U=ah2qPJ_ zp21vcL;=uqY-6>IwFQZTz~dC;myB|4L@aK1HE8^d_Jlp=i1G~>a|q#NOgL_~5f@rS zuVo^CSy@LIY8;L-#7mkV_ONuhJYT)Y)j=vMJ!z z0@16aG)h8qZO{Bq9%MHX7{?u@uuvKi--P|37C^wJkg=I;C=KxCu$C*dpifE_J8AM) zXr~#Ul+AxzE>^KU|~xj4g}U(AiP|{ zj-Xx{+3V|MqxOEtUyx$6DW$lg|Ah^O6ff)c)vvxydLfArNKWI_ej>*gighs}F?3g> z%JL{=Yy;IJqHaObwxJYmN5p}(u;-npFqTJQV-tufg3>`;vv73 zev>V5(c)1X67hxOh)6AH1@{F0lohx~FzD%441A!E$lcn%H9TX5!wDYhAQM`7G?LD5 zwXEp(AV!x)1k8fNEXh_Ps|6xi`F2^yr!MS}=1AV}dZc8dkWd;CyEHO$3%FN`mwnlf zVniSaD6j-*GDh<)~TNzq*^v*q+rFZ$xcE+}D*Ifgna`pwJGO3mcn2CW-28z?j#H*t^2U z7J<+po|=cSnzfY;RfV}2Qf39RAk}Lw4-UU?A~xRa`^7Tg`o#z+rA?5!9XfOiNn58!&nH)=x z2Ej%qg1H3hdZFm+656YzFr(*j`k5PBZ{z% z8$_Q3Vd3@TW+3-qce3G8L~b9Es=(|eG zXO@g=90s5VewWoe-SS})YQ3z8Se^vq!c-!|knek3x zqrHBFB1()43u3{|m31|5Y^Zd;)qP_zL0LB?>-gUq+e*_3St#J5Lx`xhj|c%4EqBEi zAgx(w(@Xina-Ht+GpwQ77bL(TswgC!)d)3Icr@<}SR5Q4QCQQreU2CdIMXN~z>N&W zKvX?7`?z?IbNl8`x4c^xz=1xJCZ5hjDjY*=qEKISH1AbBk6oj_5)8PBMYEdM=BXFUKhXvT3IHfkW9vE9VWTMyG~}9nyn9O^@z%&(vAiHG zd5V>TQ)>9KiXd0-S5krK9Ae}A(W{LH-75;3GY`)c+9%XbK2q4v5eqUf5gK(cKfRXt zl)2QZtyDr% zJLK*Tqkcs*`FynH6L!GsYv10XUXqw2&OJ=6VQ~qAMG~P5rQEMT>gOp91efU}gjby$ zwg7tyTS>hdTlYh804>j*=LeOvTb!ucu%JwN<4hicCE>klav3B*HYK|VWih3F}-%<*B+ zUozSB3J56#en{ycLb6cN3E9MmBJ__QYO$obvn*^4(G}a^)t8; z27^0>ZzA;zFOes`RD`9NY%O(&fsTt89;9MRVnk%gdAR*C;1Wo+Pp6)&x9uer2z|zm zJq_n%&l3X#5Eio!G@dEdbG3T0sA9ZznkRUFb`xJPR;4;?X0mDb&U8RE`r@tG^A8S8 z54)tfKN2h39?zA|Rp#I0NXiC$Mvt|h68C<+kDld$FWx4CY5;n;1H}+ggsjYD{t-w% zN;8|k$abt?*}Rffp;udHhL+#IdV4BUvY$t@)!MS>k^cz>TjtTYaM%x-6@8s5$R~wy z(%^2RG?F;idWPNhS8KpaW1WH{G_z2`&v71Qn&Om>=9Piy&!ZuokWiw=G4@(V8AKE> z2?#i<`~QBlG+2=r4&c)aeUW#Mq@PU+J2{WW03HeIDXW=|uue;SwAu}}Rz_lHGO8Tr z9N-D%kYdY}`DmqlK3j0C?|u}z$0Tr=uRh%SGq0a4DaSp6P+yxO7fME+>gs_RqIw^ACZ5PS4Mll-c|_x3SF%H>W@O(dm~Bfnwq^8yh?Z z<+X5aJ@cb3j4#(G|D>o(In;cGEhf{Y#+Ev1uOp&Z_3{oM1TfxPqU>`sA^=3K8iF%2 zro?35jEJ`v-RsG#tBptv2;SoXHk`Sx-#i*PY=fE0O(33yOjs1_R5eR;^l>X0!^E@8 zT#oNXB&|5hP$~S;T_8fG);fREF0&u~e*H`VbTicvKt4-zM6gtkmh~k`_fjDFTNKD_ zm>E-`n>pI0#W1?OlTtb4?>PeUlxi8FlSc2@$xeYH+UF<&ee^Lg{Na5w z2ju0^1fnhNjOAU%t*|sAF3y0^FXB$cM+?k|B+{2#S=k;<)0gHzSc7C#t8U(!8XLu0 zZt2dF(i~xBA^ETdz^g3<(&!5iGr`G6Ve>afALwI}uDmxh+CDdP^Z|vIXuSzxB}!vA zfi|*N6g{<~i|Yv4ST5pT0rOp&Y|e+Il!lKwdo7TA|AH+VeqNbd_V17Oki&myJGqb6 zUcW63zG^l{8Ti@FTO%^_O}*yoIpcjXHkhMOm?8D zb^Mj=z%??0?$<}tAW?>TFNl?so>Kdxxzr%8@XcllXiKUE8r|E}6&`GFtAWsbxo?wG zs0DJva#hzAt7Ic_@q44>Dzd0U7Zzj$8dZ>VMfj#?iY%9p_PmNRzQ(9gttsS30+Ff5 zfmPlBhb~R_3NXUVX&qk~XTe`9+srUdKskOq9>ozI{9E7T21mvE(xcHC8?azj0E=Rv zoj@dd7QO1iWXor{f%AjHtztCY{%8?Mht$0rgt?NjMIhR4oFO(AbG1i9s7CP%PDEw% zHzNJH4wOK=5E;ATV&DqqXKj&guP z>Ssjyq=XN{fH$Kud@~~JCoZBNuI05k0;+n9EL_1Di-Ab8=-BlxNrhz893ARDh{CiT zUxft;d;(aDZ|E}0)}?(NDYsAiu&Ii>Nme#CTJ=*@fV&6wNro;9B^IO0g~iA$T&p zqY;?uuU+zNfe`XPUK!!43=!^TvfC^#?gD`^4q=zAHdb0kg#1A&J5AQgo^6g)MhDss zFZo}gq7{LHQv+q`E}F+h78B=X0icmw8?F^uz+P9GiL`VTd4jCH2uJmZLG+P7eZ7H>v#?BGB8*xiU^enXL&p?PD1fED_s*MPSiT7@R zQ8PjTmmTsP(GGr$eHO-Gr3FcE0@{~5fONDL2$5QUm5AC<`_{-Y$d8#7IB{zuf{d1G z>q8bmIx*P?xHplo5mLYXfSh0O2Yk*HBP@c9j@I?{hcvi#O-B(>BjW^r7YM*VZfhW) zg^eww!K0q>p@0EB)c)2YP-vC{L#wv7C!-;IP0Ks*Q0h@Bod181>@yJD(1utMrkABh z+icfRQ88r@>MLgP$OAnj754=-L zBiiZs({%y1-`lHx@%k0AFjw_iUVULd5{NGJY%@}>D_kK?wdy9>>+9E#E2?cYhM+rv zhr&7%2()@3@P>?5=&uEPbt78n5E=1f3dfN^;p3-kjC_!xcwXm-#F(1MfGVysUg*?> zR#}^Z?#+nERq;56`05I%u^5q0Bz7ZWN`-FLJaQ&BL(mM+jE}-L!Y*CMc#@9-+OLIg zO*tIp*9ihSL`|=K8xd#)LZ6XOosWfcEdrUL=&s;t)B=6zd(2Vuuk>j{)7O=j^bMBB zBgOK$9FP$R00}$l;jUFkBF;d)^+<4*(q!qaIf)Q6$kmfBD+HnrsmDfb5~OJ>EXaWQ zBM{-R@Te*rkReh$MfQM;LLRz(&*tE${&cEOPzx$x{Z2JTdez-0B+D`$zL$+{0m=7) zpbR7ImXUS5&QT~05-X)vO^J1Bzd^=` zP+=t6hx+>3-l>T|6p)lxZI3wP?Q`_$o`kqzM!`LC*b0IAhh`=T9OPj_L4`mNLkp8a zqHem8?R)k@X^_G@M_gD}z@D0HD@+63z-f;JibqszBOAdtTZiJk=wS|PeHB2sMNP|*3> zS%o5tBxIxNalExy*1l{1*3cJ1$RMa0!C@#onq77|9Qw5D+-utF+3TB}FG(ztOt#uW zB_b5!^bK6J6xx{6x4$)HTFlyMKY1Pn%&5eH>=f;QH`Jg$efx+!5@i=gXCHmYj2h#0 zWk;J2LT6ZTy(x&ak4SrNbwtv7`KYqCpCYi!ox+itIK`1IV=H@oG)g?gd2o)$I7d>K z8ht`ul<%(~R}?hK=Cj^nm)YR7c%RW)ZvKxVSlz;Oh25aC6P>9K?^KZ@2-XpvV4E6YGb3WRg}RK>7msF33o8efU_M!8|3n~4 zKnE!}S?oC?hc$5*2&4}W_f#`;4dUED1?7|o^U_Sthi1@7ULl3iG8?od-5X9eeI%g} zwUR7ZJ2B~kRPm% zDUi!W4Z@_MrQr~Ph4LPC{NJgspQ;xjH#Jq-P`&Q_lZZtoQ=bWE9JSe zDLv>K(jQsW{!^)+cl=Pfe0|?qyNaIN?C;2^@c<%!v~z3^0Sj_7dpsuHQ*?Ti+RPjU zVx4KTntHr7X_jKdDo~-tsf~o0boYAN6cjZQa|HQ5Z5?KZ?cbvvL?T|+)|=dv0ze`V z6=?F^vD?OoLQ>HQ>B6>v)n>Hn10o0`@JEy*x)9qy7Ze;)Z6mXd=*D|t?jmTLG z5+jp*;uN2E*bNFmC^r;wa(W<+5D194E5 zn;AObry${d*U{W}SnIZ3;$xc7naO6>N}z&=mvk`F?Am?4j`MIMQBA zoc-jW^uaXue@0}Qw{Vp1+yoGZ5|cf=VINm>eQy47gEU8AEY3M_?@Se(G5OR zh#E#L>ROY z&YAA|&4{G!8-|C%Z=Xom?*cXHAKe6^>=Hc)HY}Oe;jcho11st(yeD{eW@Edoqp$|h zfe0NnFx1R`bP4o&^dBZnF2|$Fc40&^ehlw0#{#Af3AKV0%6?7_IAM3lxG)kA zO`xc+O8s!f_smuF^7;jGWk(dESr#7bVR<8~eFey(^k~9JD5WE>jQ!rtqoKdU=10>e z0~-7lh{vI(7y;vjO=ac^ab4ML0QDghaNYbXo4=M%=yJrWCSzOp`XdlSAoXqX$r)|v z>l{TBDx5{NYiNyTZbz3n5=eKIXWGK9BxAmLGa`;7(d?U0PYVmuh*W)-F1+B`IkvBC zVk{6EI+Ah-7284}0s*|l`3k?)T?&~$*w{k;hIf)nQ^tAuI@to*Y9F1;=>u=D{m~Xp zpYP3!(qM)#a2=6LdYhKUT_7+9g}0~vQQ_-1BFYt$7YB)dRFVtdS_FzpEdV+RjKYF+o6*T6qscN4 zP^*1qW7ALinLJ8H1~G+;pFm6;1I7+CoWZeO-&zO-fE_;GoWOa2U89UIMN28XHb|4lER9ItSZ8XXG@K#9U+2h(q}gZ(>IisVwGnL} zd}Dy|T$}#CiB`-}T-bnNmB$O|aRl1?Jz%ZTa&5o&M<6o8BR4km%nZ`^I@x;J08+F@ zf}1}UMihZ!ju5oq2Wx@m9Tv{87*nW)LnZ9jz91uz zK5K0KgxzW*(lp)zI2uTz(uiCk7}g=e!VuH~sflX1Gjq+jFx)Iirhs6GN5^ZrHXsi4AS13_8yh0<7z2=JT21K8-E zQTDpNet|R}hJHe0bk>$0jS{;Q8@L5drxa-CeW|$4V6^zwsOVu;KJl|NI-@spBt}PR zmZ|ikkZ74~3ULdz25;)h>nF;w9^t+G8OVedHh+OWBqA8X$|DLFzZ2)rH^;f{?HBI- z5ojk14cPn!hcDzup*LayaZX}Vb`;*4K!7Lo0j)?h@Aj3=SjZh~P}O=*Q^pVSx*!o( z;YJwDxY|4mO{h?=fcjhcW*z(>3y&6os3>Z%Y9T%fU%x!jN@gGQwE&)sBb? z_OpHu_M$SBVnq8Ku_@ldAeM_KJbe3zbRb|y0k#iz1#3nC=Q7!gQcrj%xb#PvrF}nQ zZW@O2>NG?U_5%8FIc2KR#N9?d^s1XDJIIWO#Gh}P)HdTPe4Qh9*Bk3@f(%b`BZapX zfyhKCjIq2J+H=V0hf^ESI6~IkruGAJ0jk0r1RZnlUkdOuoh+K*D)r##bUxbev}Yi` zoAS}kh}!p~2*j8kL>@L`E;Q-|p3!8vuA@0(j-L~?2H-By30BWKpkl~ zASNC>R#Wrqk3jk%`i9Jxo!#w$G{ljP-Z<8@VaN78JNym(z^i>w8vYal(St|I);`>L z!&KfHV3v9x+80b5i<$O0lBBzbP#RT=I5N&T*Vj*z1%RE;wG9%wwtYmdGek9BAE+p} zvBEm?wbBR!7`GdZg_^%Qt!Cylz7g$$h}!;W;0rFtBMK(Is+vjmXhZ=~ z;_R}E7E4M$nK{ON~XjLL=%lG%*T`9eUKY~^F(G>_Q`nE zF}4B`!C7Dh;`NhJSXAoix*!i)1Bp2zZ^|m8KPb$^9KDW1HG{Mh?OP6WnLwKhI+I;{ zYy@&Lnr~bPCRLyai9n&qqq`e#ULf?|FqKn=L>5jd4G#8Zm#Y3p-rVC)gAt*d*IN@9l1#duzpGv5dN0Bhi_FVNCA3o z@o3gGMHci$M=pDz#2kHmrjO?synX~hDFn3vtSl)l@0`q$t=PDu26#;h5GW^zC(=>M zmr~nQWi;441Y-WYej6hY14*3sTUwG?*?WlIut^$dRhT1!&V-B5DLOdz6lx5P4$OS^ zsd?qW>@hQ(?jUr+sVXtqyVRTl$GUvwX69W%l;#7#=v%Qq6Ucw=y+c%;-`aavcJCd_ z-~6YxTIF3pDw*dQ2pVc*2J7ZW+Gk8rs)9J%KiodGu1)qj@B`_2W~#L2NEHVm*lswi z!3gA$D4z4Xa|3|+$gJ#R(Ap!(vm%=Jms z4Y-~VO5&{n&^YX|l}|w~M}Z}@fFEr1Z&G0RgSw3EkUssXfe>vKxybYN#$QiCJ-LWd zKbV&vT7I-wu{>>f3l}MjzM6HLUB$4{PfoB0b7*hQsfV0~i z^~K33WvYJfr%0r|_;;P32(v6|EQ(qj)9t>AIr4INE`>A2nbs(Y?V&RG@Y#JbPVfXc z0N}vr*)GJ_&%ceFHwhfY5!+j4M9vI&3TfmyA{ObsS8a$8nSUhEK0XbOWF&=UvZ2Ic z?^YSb&Z0SIuS<;RrCM+vN3>i#8fcZXEz0$K_sDdPslNkJJA8g#KMeb1Qz3|>qn%0E zV5~IO5v|Y5>_Gm2^N_gAh6{T23{n>dZRQ*bPM<#o~DV zG-?M*FF?#28{dqkug6$MoF|Cvb3_pSxRgimA(#UsuItp{3}cv{Xe+TGNhnf2rRp}3 zQyMcLZFFT+ui3!Fh_rk>8V&=wDVtO-5O0&HseTnuDC#MS_-?dprVKOFb^86LefIoW zN3LsjCnZ+816_tJDD9X)%z@S{r&!tSZayoGX#yV@5s6QPJSABfpV|3nD#oNwU!=wu zIIH_)0+9mhSsH((RA#zYfjpLsS_G-B*6043V^yCE68AC4Ig0GIx7;>D_iCY|^5@Zl z*cUQWZ_*VqfyAQ?LBt$|`tI2@hHTh)2e7BwS&2Y@OSgvPBB8N(L1%uX67dR~OMJlr z5h`)^ze5~sMppiJK?Zwuwjx~pQh@^4VQPN@p`DRZvuWx>64=Yk(d_Qpv&lNoen%yl zKh1-Y#Lp+=nkRFW

gADv%6ptr73G-?0`GCSn^crXHZ4qpXbkO<`7ZlxRq@;fB1 zSw0Oi1=u0~PPT82gc&sjCqiP5MptS&hkveFajw0v^H?5eYGod6Bq_{6c>W4al0I|i zpEs}3mXt9~gu(u$?c>7ke)1u&m3jR)fe`66R|CqH`DlL!;=L%Jm0a!_MemzO0~)Z1 zh*wP+D$GrwRhQ;T+M!o2OT7Nyk0uMygybvrvbuV0{9qh?o5BxIQ=*4;eX=~K73 zGWTOK(7{w3s}3xp@U3~YHjSv8N5fk0QK3%GXlWfuv^t&0Pt15NkQy?NQX6fi;d}FF ztE$_enXO)%x%dBGM<0zFx|1M!8EDnbh$!CDh3#!^kJ=}qYv79f;o+HKu-uL4pv2F6 zQ$;J2vHhMS_xC9Jsf%Yy^*1Bhs2@L+BVB3};EJ0-XX}vE7$2tE4taDIQK0mIv`Q-sWnU@_qYpRwM(3FIm(_n$w*oGNKt*3l^u z_6fTq8o#Ma%}pRDzXG0mL|1tIF(N%ljvipB8LsHv9385nlE|mpMEg22B6`~3kie(! z4CVZ0M2fwt_ik({sOL?fZ&zbbdwXXJ2*2N2;50%j2pg^#NY#&=LKwnj?)|?*1Be|E|6<6Q0UeZWK^^*T#k)M zy$<{g0#(Jn{Sy&LFLP2D(@Gu+-&zFPXsGwAO82YwXdw}xoe-aHA@yS`>p}}vqsQvq zwa*bq%cRbVl*Q&q!b1JsMj$oWoF@sI4O) z8J-Z}EYGR-ts#m<|48e;QqSIAz?yT&mG+t}g_AbA>p&3`+&E3X!Y3jSJf!qrBjR02 zYXs70WpVGbWmMR{jv^4$25bvu$BeV!bsY)RCN*~x2sj&e5kOx`T6#41eOFP&B`Hbg zn-Rf!W9Cr^($Xr82$`C`^Z^$;7ruUzeavCL`p`|xI4@rxP3{1P!s!lbh&N07qXnP} zREORGvR}r??Pf$MXS>EEs(3~t>L$>#_Lw>ziqJL1u!l8tz4)Jj?4aL(p4RT~jr)y%8R4We*ej}alCz>L@+GX(FO$%fH7 zjlkWH3dK4j(rXVM6n)SXaNv^qMIh>DbAXRDqM9drj(#!jlG9D;x6nJ%Tw$B?#uc`Q zFuiCWk$yj3CV)ivOJs1hm$w#xIPDc6B1~~miPDG&Uxg`L=oZ!jtsGo2Vqjd3_Om}8 zZDn{PJAOdwwlByC6s~FTl|v|Vl;+3|@=(!)CCjKX+`P2|zYpG@5JrY|co(QiYVKDc zvbntJRK`g}XQ(jOK(B$M6YTH9e!CQ)3?ViZ5IvYd_pHLj?+j$F=ixI9p8}F40=0?X z{hA|z0($uN?zci=JVpeY4HHG-g;-Gg$`)uP=`1_uQ&Q-Q#E9Tejir~fXGA$}<_L&o z))eWe1=Jo5M)!Dgm~jqN41YKa z7Y@h}mzPlpn}(e@Dqg2|Fz^u<=Bfl{Ej zJt(hXLS`&@ZXQi)#93retS_|1PSZq75!NSELJDt9M&no`%K^x?yb4JKMW#sx$$Ob{ zNs2J=-}Lwto5HA~SjIAWDSWg>geS(tYxIa2_UiSm31k`BBI!du3a!I_{m}$EFc?wCQJ69k7{5l;s_k

M|Ah+ZcQ+O?R9zDr;s5GOzoUxcx~r~1$yh*lM? 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⁡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


a973wlL#Ff81tF??N{FOpTRl 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 G&wl~T9#pUZ literal 0 HcmV?d00001 diff --git a/res/edc/images/music_ico_playback.png b/res/edc/images/music_ico_playback.png new file mode 100644 index 0000000000000000000000000000000000000000..7674d67dfa7edf1ad5df4b5d23b4e815d4cdf3a4 GIT binary patch literal 18423 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 LYr`@F_e1{$k!Oy& literal 0 HcmV?d00001 diff --git a/res/edc/images/music_ico_song.png b/res/edc/images/music_ico_song.png new file mode 100644 index 0000000000000000000000000000000000000000..3b919a1b74ac5278af2895f9a9f547e9ba725ec9 GIT binary patch literal 18007 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/music_ico_time.png b/res/edc/images/music_ico_time.png new file mode 100644 index 0000000000000000000000000000000000000000..b7016051841c1bb3fbcdf73dbd0f02fbd1de7b08 GIT binary patch literal 18055 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 H-(CL(+i6#C literal 0 HcmV?d00001 diff --git a/res/edc/images/music_progressbar_handle_dim.png b/res/edc/images/music_progressbar_handle_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..135638525fd4292f3d528dbb5908689a06918d99 GIT binary patch literal 18926 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/music_progressbar_handle_foc.png b/res/edc/images/music_progressbar_handle_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..2314ddd8af3ccbc6ac1710bba6a720569e89a65b GIT binary patch literal 18764 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/music_progressbar_handle_nor.png b/res/edc/images/music_progressbar_handle_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..bf58c31cfc6be5d4db0db0deff1bc8822b42d1ab GIT binary patch literal 18926 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 N002ovPDHLkV1l7xx}N|5 literal 0 HcmV?d00001 diff --git a/res/edc/images/popover_arrow_up.png b/res/edc/images/popover_arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..a491ae82bcc370d9e2a317d82d68b60822a31b31 GIT binary patch literal 17778 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 NING|}6j^WC{cko;bMpWI literal 0 HcmV?d00001 diff --git a/res/edc/images/progress_balloon.png b/res/edc/images/progress_balloon.png new file mode 100644 index 0000000000000000000000000000000000000000..893ce863b6d2a96e2977de2d70d01ebd6ba00e69 GIT binary patch literal 675 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/round_rectangle_4X4_bottom.png b/res/edc/images/round_rectangle_4X4_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..8037cb805363d16151f034fb8867d1ac82c62062 GIT binary patch literal 17711 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/round_rectangle_4X4_top.png b/res/edc/images/round_rectangle_4X4_top.png new file mode 100644 index 0000000000000000000000000000000000000000..de8b5caa07c8a4112478e6ba80cda060a446dc4a GIT binary patch literal 17710 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 W&L8y;+&qpZ1Tq6d>GyVyAN&jTX>hIp literal 0 HcmV?d00001 diff --git a/res/edc/music-player-theme.edc b/res/edc/music-player-theme.edc new file mode 100644 index 0000000..f697419 --- /dev/null +++ b/res/edc/music-player-theme.edc @@ -0,0 +1,10 @@ +#include "../../include/define.h" + +collections { + #include "widgets/button.edc" + #include "widgets/ctxpopup.edc" + #include "widgets/genlist.edc" + #include "widgets/slider.edc" + #include "widgets/gengrid.edc" + #include "widgets/progressbar.edc" +} diff --git a/res/edc/music-player.edc b/res/edc/music-player.edc new file mode 100644 index 0000000..04301c6 --- /dev/null +++ b/res/edc/music-player.edc @@ -0,0 +1,19 @@ +#include "../../include/define.h" +collections { + #include "views/common.edc" + #include "views/playback-view.edc" + #include "views/base-view.edc" + #include "views/context-view.edc" + #include "views/settings-layout.edc" + #include "views/song-layout.edc" + #include "views/album-layout.edc" + #include "views/album-songs-layout.edc" + #include "views/category-layout.edc" + #include "views/cat-albums-layout.edc" + #include "views/cat-songs-layout.edc" + #include "views/cat-selectlist-layout.edc" + #include "views/folder-layout.edc" + #include "views/volume-layout.edc" + #include "views/message-layout.edc" + #include "views/entrypopup-layout.edc" +} diff --git a/res/edc/views/album-layout.edc b/res/edc/views/album-layout.edc new file mode 100644 index 0000000..6c76a7d --- /dev/null +++ b/res/edc/views/album-layout.edc @@ -0,0 +1,19 @@ +group { + name: MUSIC_ALBUM_LAYOUT; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + } + PART_RECT_PADDING(padding_albumgrid, 0 0, bg) + PART_SWALLOW_BASIC(MUSIC_PART_ALBUM_GRID, 1395+20 848, + padding_albumgrid, 0 0) + } +} + + diff --git a/res/edc/views/album-songs-layout.edc b/res/edc/views/album-songs-layout.edc new file mode 100644 index 0000000..1f09ff6 --- /dev/null +++ b/res/edc/views/album-songs-layout.edc @@ -0,0 +1,70 @@ +group { + name: MUSIC_ALBUM_SONGS_LAYOUT; + images { + image: MUSIC_IMAGE_SONG_COUNT COMP; + image: MUSIC_IMAGE_ALBUM_TIME COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + } + PART_RECT_PADDING(padding_thumb, 0 52, bg) + PART_RECT_COLOR(thumb_bg, 174 174, + padding_thumb, 0 0, 0 0 0 76) + part { + name: MUSIC_PART_ALBUM_THUMB; + scale: 1; + type: SWALLOW; + description { + state: "default" 0.0; + rel1.to: "thumb_bg"; + rel2.to: "thumb_bg"; + align: 0.5 0.5; + fixed: 1 1; + aspect: 1.0 1.0; + } + } + + PART_RECT_PADDING(padding_name, 174+31 52, bg) + PART_TEXT_FONT(MUSIC_PART_ALBUM_NAME, 1190 56, padding_name, 0 0, FONT_STYLE_BOLD, 50, 0 0.5) + + PART_RECT_PADDING(padding_artist, 174+31 52+56, bg) + PART_TEXT_FONT(MUSIC_PART_ALBUM_ARTIST, 1190 36, padding_artist, 0 0, FONT_STYLE_REGULAR, 30, 0 0.5) + + PART_RECT_PADDING(padding_countimage, 174+38 108+36+50, bg) + PART_IMAGE_BASIC(MUSIC_PART_COUNT_IMAGE, 32 32, padding_countimage, 0 0, MUSIC_IMAGE_SONG_COUNT) + + PART_RECT_PADDING(padding_songcount, 212+32+14 194, bg) + PART_TEXT_FONT(MUSIC_PART_ALBUM_SONGCOUNT, 50 32, padding_songcount, 0 0, FONT_STYLE_REGULAR, 28, 0 0.5) + + PART_RECT_PADDING(padding_timeimage, 258+50+14 194, bg) + PART_IMAGE_BASIC(MUSIC_PART_TIME_IMAGE, 32 32, padding_timeimage, 0 0, MUSIC_IMAGE_ALBUM_TIME) + + PART_RECT_PADDING(padding_time, 322+32+14 194, bg) + PART_TEXT_FONT(MUSIC_PART_ALBUM_TIME, 100 32, padding_time, 0 0, FONT_STYLE_REGULAR, 28, 0 0.5) + + PART_RECT_PADDING(padding_playbtn, 1395-214*3-14*2 144+22, bg) + PART_SWALLOW_BASIC(MUSIC_PART_ALBUM_PLAYBTN, 214 62, + padding_playbtn, 0 0) + + PART_RECT_PADDING(padding_nextbtn, 1395-214*2-14 144+22, bg) + PART_SWALLOW_BASIC(MUSIC_PART_ALBUM_NEXTBTN, 214 62, + padding_nextbtn, 0 0) + + PART_RECT_PADDING(padding_lastbtn, 1395-214 144+22, bg) + PART_SWALLOW_BASIC(MUSIC_PART_ALBUM_LASTBTN, 214 62, + padding_lastbtn, 0 0) + + PART_RECT_PADDING(padding_songlist, 0 87*3, bg) + PART_SWALLOW_BASIC(MUSIC_PART_SONGLIST, 1395 848-87*3, + padding_songlist, 0 0) + } +} + + diff --git a/res/edc/views/base-view.edc b/res/edc/views/base-view.edc new file mode 100644 index 0000000..e36783b --- /dev/null +++ b/res/edc/views/base-view.edc @@ -0,0 +1,88 @@ +group { + name: MUSIC_BASE_VIEW; + images { + image: MUSIC_IMAGE_ICON COMP; + image: MUSIC_IMAGE_PLAY_ICON COMP; + } + parts { + part { + name: "black_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: RGBA_BLACK_BG; + } + } + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: RGBA_COLOR_BG; + } + } + + PART_RECT_PADDING(padding_icon, 63 78, bg) + PART_IMAGE_BASIC(MUSIC_PART_MUSIC_ICON, 84 84, padding_icon, + 0 0, MUSIC_IMAGE_ICON) + + PART_RECT_PADDING(padding_titletxt, 63+84+22 78, bg) + PART_TEXT_FONT(MUSIC_PART_TITLE, 261 84, padding_titletxt, 0 0, + FONT_STYLE_BOLD, 70, 0 0.5) + + PART_RECT_PADDING(padding_playicon, 169+261+12+36 82+28, bg) + PART_IMAGE_COLOR(MUSIC_PART_PLAY_ICON, 26 26, padding_playicon, + 0 0, MUSIC_IMAGE_PLAY_ICON, 255 255 255 128) + + PART_RECT_PADDING(padding_playsonglbl, 478+26+12 82+20, bg) + PART_SWALLOW_BASIC(MUSIC_PART_PLAYSONG_LBL, 571 42, + padding_playsonglbl, 0 0) + + PART_RECT_PADDING(padding_playbackbtn, 516+571+20 82, bg) + PART_SWALLOW_BASIC(MUSIC_PART_PLAYBACK_BTN, 72 72, + padding_playbackbtn, 0 0) + + PART_RECT_PADDING(padding_sortlist, 1107+72+20 82, bg) + PART_SWALLOW_BASIC(MUSIC_PART_SORT_HOVERSEL, 290 72, + padding_sortlist, 0 0) + + PART_RECT_PADDING(padding_sourcelist, 1199+290+20 82, bg) + PART_SWALLOW_BASIC(MUSIC_PART_SOURCE_HOVERSEL, 290 72, + padding_sourcelist, 0 0) + + PART_RECT_PADDING(padding_grpbtn, 0 232, bg) + PART_SWALLOW_BASIC(MUSIC_PART_GROUPBTN_BOX, 406 87*1, + padding_grpbtn, 0 0) + + PART_RECT_PADDING(padding_nocontent, 1000 450, bg) + PART_TEXT_FONT(MUSIC_PART_NO_CONTENT, 800 50, padding_nocontent, 0.5 0.5, + FONT_STYLE_BOLD, 35, 0.5 0.5) + + PART_RECT_PADDING(padding_nocontent_sub, 1000 450+40, bg) + PART_TEXT_FONT_COLOR(MUSIC_PART_NO_CONTENT_SUB, 800 30, padding_nocontent_sub, 0.5 0.5, + FONT_STYLE_BOLD, 24, 0.5 0.5, 255 255 255 102) + + PART_RECT_PADDING(padding_content, 406 232, bg) + PART_SWALLOW_BASIC(MUSIC_PART_CONTENT, 1395+20 848, + padding_content, 0 0) + + PART_RECT_PADDING(padding_sortpopup, 1199 155, bg) + PART_SWALLOW_BASIC(MUSIC_PART_SORT_POPUP, 290 720, + padding_sortpopup, 0 0) + + PART_RECT_PADDING(padding_sourcepopup, 1509 155, bg) + PART_SWALLOW_BASIC(MUSIC_PART_SOURCE_POPUP, 290 720, + padding_sourcepopup, 0 0) + + part { + name: MUSIC_PART_VOLUME_LAYOUT; + scale: 1; + type: SWALLOW; + description { + state: "default" 0.0; + } + } + } +} diff --git a/res/edc/views/cat-albums-layout.edc b/res/edc/views/cat-albums-layout.edc new file mode 100644 index 0000000..543ff10 --- /dev/null +++ b/res/edc/views/cat-albums-layout.edc @@ -0,0 +1,55 @@ +group { + name: MUSIC_CATEGORY_ALBUM_LAYOUT; + images { + image: MUSIC_IMAGE_BACK COMP; + image: MUSIC_IMAGE_SONG_COUNT COMP; + image: MUSIC_IMAGE_ALBUM_COUNT COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + } + + PART_RECT_PADDING(padding_back, 0 14, bg) + PART_IMAGE_BASIC(MUSIC_PART_BACK_IMAGE, 14 14, padding_back, 0 0, MUSIC_IMAGE_BACK) + + PART_RECT_PADDING(padding_artname, 14+8 2, bg) + PART_TEXT_FONT(MUSIC_PART_CATEGORY_NAME, 700 36, padding_artname, 0 0, FONT_STYLE_MEDIUM, 30, 0 0.5) + + PART_RECT_PADDING(padding_albimage, 0 48, bg) + PART_IMAGE_BASIC(MUSIC_PART_ALBUM_IMAGE, 32 32, padding_albimage, 0 0, MUSIC_IMAGE_ALBUM_COUNT) + + PART_RECT_PADDING(padding_albcount, 32+14 48, bg) + PART_TEXT_FONT(MUSIC_PART_CATEGORY_ALBUMCOUNT, 50 32, padding_albcount, 0 0, FONT_STYLE_REGULAR, 28, 0 0.5) + + PART_RECT_PADDING(padding_songimage, 46+50+14 48, bg) + PART_IMAGE_BASIC(MUSIC_PART_SONG_IMAGE, 32 32, padding_songimage, 0 0, MUSIC_IMAGE_SONG_COUNT) + + PART_RECT_PADDING(padding_songcount, 110+32+14 48, bg) + PART_TEXT_FONT(MUSIC_PART_CATEGORY_SONGCOUNT, 100 32, padding_songcount, 0 0, FONT_STYLE_REGULAR, 28, 0 0.5) + + PART_RECT_PADDING(padding_playbtn, 1395-214*3-14*2 19, bg) + PART_SWALLOW_BASIC(MUSIC_PART_CATEGORY_PLAYBTN, 214 62, + padding_playbtn, 0 0) + + PART_RECT_PADDING(padding_nextbtn, 1395-214*2-14 19, bg) + PART_SWALLOW_BASIC(MUSIC_PART_CATEGORY_NEXTBTN, 214 62, + padding_nextbtn, 0 0) + + PART_RECT_PADDING(padding_lastbtn, 1395-214 19, bg) + PART_SWALLOW_BASIC(MUSIC_PART_CATEGORY_LASTBTN, 214 62, + padding_lastbtn, 0 0) + + PART_RECT_PADDING(padding_artalbgrid, 0 116, bg) + PART_SWALLOW_BASIC(MUSIC_PART_CATEGORY_ALBUM_GRID, 1395+20 732, + padding_artalbgrid, 0 0) + } +} + + diff --git a/res/edc/views/cat-selectlist-layout.edc b/res/edc/views/cat-selectlist-layout.edc new file mode 100644 index 0000000..1e76b1d --- /dev/null +++ b/res/edc/views/cat-selectlist-layout.edc @@ -0,0 +1,35 @@ +group { + name: MUSIC_CATEGORY_SELECTLIST_LAYOUT; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + } + + PART_RECT_PADDING(padding_msg, 10 33, bg) + PART_TEXT_FONT_COLOR(MUSIC_PART_LIST_MSG, 700 62, padding_msg, 0 0, FONT_STYLE_REGULAR, 30, 0 1, 255 255 255 153) + + PART_RECT_PADDING(padding_selectall, 1395-214*3-14*2 33, bg) + PART_SWALLOW_BASIC(MUSIC_PART_LIST_SELECT_ALL, 214 62, + padding_selectall, 0 0) + + PART_RECT_PADDING(padding_addbtn, 1395-214*2-14 33, bg) + PART_SWALLOW_BASIC(MUSIC_PART_LIST_DONE_BTN, 214 62, + padding_addbtn, 0 0) + + PART_RECT_PADDING(padding_cancelbtn, 1395-214 33, bg) + PART_SWALLOW_BASIC(MUSIC_PART_LIST_CANCEL_BTN, 214 62, + padding_cancelbtn, 0 0) + + PART_RECT_PADDING(padding_songlist, 0 66+62, bg) + PART_SWALLOW_BASIC(MUSIC_PART_SONGLIST, 1395 848-128, + padding_songlist, 0 0) + } +} + + diff --git a/res/edc/views/cat-songs-layout.edc b/res/edc/views/cat-songs-layout.edc new file mode 100644 index 0000000..f49819e --- /dev/null +++ b/res/edc/views/cat-songs-layout.edc @@ -0,0 +1,77 @@ +group { + name: MUSIC_CATEGORY_SONGS_LAYOUT; + images { + image: MUSIC_IMAGE_SONG_COUNT COMP; + image: MUSIC_IMAGE_ALBUM_TIME COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + } + + PART_RECT_PADDING(padding_back, 0 14, bg) + PART_IMAGE_BASIC(MUSIC_PART_BACK_IMAGE, 14 14, padding_back, 0 0, MUSIC_IMAGE_BACK) + + PART_RECT_PADDING(padding_artname, 14+8 2, bg) + PART_TEXT_FONT(MUSIC_PART_CATEGORY_NAME, 700 36, padding_artname, 0 0, FONT_STYLE_MEDIUM, 30, 0 0.5) + + PART_RECT_PADDING(padding_thumb, 0 52, bg) + PART_RECT_COLOR(thumb_bg, 174 174, + padding_thumb, 0 0, 0 0 0 76) + part { + name: MUSIC_PART_ALBUM_THUMB; + scale: 1; + type: SWALLOW; + description { + state: "default" 0.0; + rel1.to: "thumb_bg"; + rel2.to: "thumb_bg"; + align: 0.5 0.5; + fixed: 1 1; + aspect: 1.0 1.0; + } + } + + PART_RECT_PADDING(padding_name, 174+31 52, bg) + PART_TEXT_FONT(MUSIC_PART_ALBUM_NAME, 1190 56, padding_name, 0 0, FONT_STYLE_BOLD, 50, 0 0.5) + + PART_RECT_PADDING(padding_artist, 174+31 52+56, bg) + PART_TEXT_FONT(MUSIC_PART_ALBUM_CATEGORY, 1190 36, padding_artist, 0 0, FONT_STYLE_REGULAR, 30, 0 0.5) + + PART_RECT_PADDING(padding_countimage, 174+38 108+36+50, bg) + PART_IMAGE_BASIC(MUSIC_PART_COUNT_IMAGE, 32 32, padding_countimage, 0 0, MUSIC_IMAGE_SONG_COUNT) + + PART_RECT_PADDING(padding_songcount, 212+32+14 194, bg) + PART_TEXT_FONT(MUSIC_PART_ALBUM_SONGCOUNT, 50 32, padding_songcount, 0 0, FONT_STYLE_REGULAR, 28, 0 0.5) + + PART_RECT_PADDING(padding_timeimage, 258+50+14 194, bg) + PART_IMAGE_BASIC(MUSIC_PART_TIME_IMAGE, 32 32, padding_timeimage, 0 0, MUSIC_IMAGE_ALBUM_TIME) + + PART_RECT_PADDING(padding_time, 322+32+14 194, bg) + PART_TEXT_FONT(MUSIC_PART_ALBUM_TIME, 100 32, padding_time, 0 0, FONT_STYLE_REGULAR, 28, 0 0.5) + + PART_RECT_PADDING(padding_playbtn, 1395-214*3-14*2 144+22, bg) + PART_SWALLOW_BASIC(MUSIC_PART_CATEGORY_PLAYBTN, 214 62, + padding_playbtn, 0 0) + + PART_RECT_PADDING(padding_nextbtn, 1395-214*2-14 144+22, bg) + PART_SWALLOW_BASIC(MUSIC_PART_CATEGORY_NEXTBTN, 214 62, + padding_nextbtn, 0 0) + + PART_RECT_PADDING(padding_lastbtn, 1395-214 144+22, bg) + PART_SWALLOW_BASIC(MUSIC_PART_CATEGORY_LASTBTN, 214 62, + padding_lastbtn, 0 0) + + PART_RECT_PADDING(padding_songlist, 0 87*3, bg) + PART_SWALLOW_BASIC(MUSIC_PART_SONGLIST, 1395 848-87*3, + padding_songlist, 0 0) + } +} + + diff --git a/res/edc/views/category-layout.edc b/res/edc/views/category-layout.edc new file mode 100644 index 0000000..0416b13 --- /dev/null +++ b/res/edc/views/category-layout.edc @@ -0,0 +1,20 @@ +group { + name: MUSIC_CATEGORY_LAYOUT; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + } + + PART_RECT_PADDING(padding_artgrid, 0 0, bg) + PART_SWALLOW_BASIC(MUSIC_PART_CATEGORY_GRID, 1395+20 848, + padding_artgrid, 0 0) + } +} + + diff --git a/res/edc/views/common.edc b/res/edc/views/common.edc new file mode 100644 index 0000000..31d1aeb --- /dev/null +++ b/res/edc/views/common.edc @@ -0,0 +1,219 @@ +#define PART_RECT_COLOR(part_name, min_size, relative_name, align_info, clr) \ + part { \ + name: part_name; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: min_size; \ + rel1 { \ + to: relative_name; \ + relative: 1.0 1.0; \ + } \ + rel2 { \ + to: relative_name; \ + } \ + fixed: 1 1; \ + align: align_info; \ + color: clr; \ + } \ + } + +#define PART_RECT_PADDING(part_name, min_size, rltv_name) \ + part { \ + name: part_name; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: min_size; \ + rel1 { \ + to: rltv_name; \ + } \ + rel2 { \ + to: rltv_name; \ + relative: 0.0 0.0; \ + } \ + fixed: 1 1; \ + visible: 0; \ + align: 0.0 0.0; \ + } \ + } + +#define PART_RECT_RELATIVE_PADDING(part_name, min_size, rltv_name, rltv_x, rltv_y) \ + part { \ + name: part_name; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: min_size; \ + rel1 { \ + to: rltv_name; \ + relative: rltv_x rltv_y; \ + } \ + rel2 { \ + to: rltv_name; \ + relative: rltv_x rltv_y; \ + } \ + fixed: 1 1; \ + visible: 0; \ + align: 0.0 0.0; \ + } \ + } + +#define PART_SWALLOW_BASIC(part_name, min_size, relative_name, align_info) \ + part { \ + name: part_name; \ + type: SWALLOW; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: min_size; \ + rel1 { \ + to: relative_name; \ + relative: 1.0 1.0; \ + } \ + rel2 { \ + to: relative_name; \ + } \ + fixed: 1 1; \ + align: align_info; \ + } \ + } + +#define PART_SWALLOW_SHOWHIDE(part_name, min_size, relative_name, align_info) \ + part { \ + name: part_name; \ + type: SWALLOW; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: min_size; \ + rel1 { \ + to: relative_name; \ + relative: 1.0 1.0; \ + } \ + rel2 { \ + to: relative_name; \ + } \ + fixed: 1 1; \ + align: align_info; \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: "0"; \ + }\ + } + +#define PART_IMAGE_BASIC(part_name, min_size, rltv_name, align_info, img_path) \ + part { \ + name: part_name; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: min_size; \ + rel1 { \ + to: rltv_name; \ + relative: 1.0 1.0; \ + } \ + rel2 { \ + to: rltv_name; \ + } \ + image { \ + normal: img_path; \ + } \ + fixed: 1 1; \ + align: align_info; \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: "0"; \ + }\ + } + +#define PART_IMAGE_COLOR(part_name, min_size, rltv_name, align_info, img_path, color_code) \ + part { \ + name: part_name; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: min_size; \ + rel1 { \ + to: rltv_name; \ + relative: 1.0 1.0; \ + } \ + rel2 { \ + to: rltv_name; \ + } \ + image { \ + normal: img_path; \ + } \ + fixed: 1 1; \ + align: align_info; \ + color: color_code; \ + } \ + } + +#define PART_TEXT_FONT(pname, min_size, rltv_name, palign, fstyle, \ + fsize, falign) \ + part { \ + name: pname; \ + type: TEXT; \ + scale: 1; \ + mouse_events: 0; \ + description { \ + state: "default" 0.0; \ + min: min_size; \ + max: min_size; \ + color: 255 255 255 255; \ + text { \ + font: fstyle; \ + size: fsize; \ + align: falign; \ + } \ + rel1 { \ + to: rltv_name; \ + relative: 1.0 1.0; \ + } \ + rel2 { \ + to: rltv_name; \ + } \ + fixed: 1 1; \ + align: palign; \ + } \ + description { \ + state: "hide" 0.0; \ + inherit: "default" 0.0; \ + visible: "0"; \ + }\ + } +#define PART_TEXT_FONT_COLOR(pname, min_size, rltv_name, palign, fstyle, \ + fsize, falign, clr) \ + part { \ + name: pname; \ + type: TEXT; \ + scale: 1; \ + mouse_events: 0; \ + description { \ + state: "default" 0.0; \ + min: min_size; \ + color: clr; \ + text { \ + font: fstyle; \ + size: fsize; \ + align: falign; \ + } \ + rel1 { \ + to: rltv_name; \ + relative: 1.0 1.0; \ + } \ + rel2 { \ + to: rltv_name; \ + } \ + fixed: 1 1; \ + align: palign; \ + } \ + } diff --git a/res/edc/views/context-view.edc b/res/edc/views/context-view.edc new file mode 100644 index 0000000..054628b --- /dev/null +++ b/res/edc/views/context-view.edc @@ -0,0 +1,728 @@ +group { + name: MUSIC_CONTEXT_VIEW; + images { + image: MUSIC_IMAGE_CTXT_BG COMP; + image: MUSIC_IMAGE_CTXT_ITEM_BG COMP; + } + parts { + part { + name: "bg"; + scale: 1; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 204; + } + } + part { + name: "bg_img"; + scale: 1; + description { + state: "default" 0.0; + image.normal: MUSIC_IMAGE_CTXT_BG; + } + } + + PART_RECT_PADDING("pad_icon", 432 305, "bg") + PART_IMAGE_COLOR("icon_bg_img", 470 470, "pad_icon", 0 0, MUSIC_IMAGE_CTXT_ITEM_BG, 229 72 133 255) + PART_RECT_COLOR("icon_bg", 470 470, "pad_icon", 0 0, 28 36 49 204) + part { + name: MUSIC_PART_CTXT_ICON; + scale: 1; + type: SWALLOW; + description { + state: "default" 0.0; + rel1.to: "icon_bg"; + rel2.to: "icon_bg"; + align: 0.5 0.5; + } + } + + PART_RECT_PADDING("pad_title", 432 305+470+20, "bg") + PART_TEXT_FONT(MUSIC_PART_CTXT_TITLE, 470 43, "pad_title", 0 0, FONT_STYLE_BOLD, 36, 0 0.5) + + PART_RECT_PADDING("pad_subtitle", 432 305+470+20+43, "bg") + PART_TEXT_FONT(MUSIC_PART_CTXT_SUBTITLE, 470 31, "pad_subtitle", 0 0, FONT_STYLE_REGULAR, 24, 0 0.5) + + PART_RECT_PADDING("pad_subtitle2", 432 305+470+20+43+31, "bg") + PART_TEXT_FONT(MUSIC_PART_CTXT_SUBTITLE2, 470 31, "pad_subtitle2", 0 0, FONT_STYLE_REGULAR, 24, 0 0.5) + + PART_RECT_PADDING("pad_btnarea", 1334 75, "bg") + PART_SWALLOW_BASIC(MUSIC_PART_CTXT_BTNAREA, 0 115, "pad_btnarea", 0 0) + + PART_RECT_RELATIVE_PADDING("pad_separator", 0 20, MUSIC_PART_CTXT_BTNAREA, 0, 1) + PART_RECT_COLOR("part_separator", 490 2, "pad_separator", 0 0, 255 255 255 51) + + part { + name: "pad_info"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 37; + rel1 { + to: "part_separator"; + relative: 0.0 1.0; + } + rel2 { + to: "part_separator"; + relative: 0.0 1.0; + } + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + } + } + part { + name: MUSIC_PART_CTXT_INFO; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 490 106; + rel1 { + relative: 1.0 1.0; + to: "pad_info"; + } + rel2 { + to: "pad_info"; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + min: 490 0; + visible: 0; + } + } + + PART_RECT_RELATIVE_PADDING("pad_relctnttext", 16 30, MUSIC_PART_CTXT_INFO, 0, 1) + PART_TEXT_FONT(MUSIC_PART_CTXT_RELCTNTTEXT, 458 38, "pad_relctnttext", 0 0, FONT_STYLE_MEDIUM, 27, 0 0) + + PART_RECT_RELATIVE_PADDING("pad_relctntarea", 0 8, MUSIC_PART_CTXT_RELCTNTTEXT, 0.5, 1) + PART_SWALLOW_BASIC(MUSIC_PART_CTXT_RELCTNTAREA, 490 785, "pad_relctntarea", 0.5 0) + + PART_RECT_PADDING("pad_plpopup", 1465 210, "bg") + PART_SWALLOW_BASIC(MUSIC_PART_PLIST_POPUP, 360 810, "pad_plpopup", 0 0) + } + programs { + program { + name: "show_moreinfo"; + signal: MUSIC_SIGNAL_SHOW; + source: MUSIC_CONTEXT_VIEW; + action: STATE_SET "default" 0.0; + target: MUSIC_PART_CTXT_INFO; + target: "pad_info"; + } + program { + name: "hide_moreinfo"; + signal: MUSIC_SIGNAL_HIDE; + source: MUSIC_CONTEXT_VIEW; + action: STATE_SET "hide" 0.0; + target: MUSIC_PART_CTXT_INFO; + target: "pad_info"; + } + } +} + +group { + name: MUSIC_CONTEXT_BTN; + images { + image: MUSIC_IMAGE_CTXT_BTNBG_NOR COMP; + image: MUSIC_IMAGE_CTXT_BTNBG_FOC COMP; + } + parts { + part { + name: "ctxt_menubtn_area"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 103 115; + visible: 0; + } + } + part { + name: MUSIC_PART_CTXT_BTNBG; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 64 64; + rel1.relative: 0.5 0.0; + rel2.relative: 0.5 0.0; + image.normal: MUSIC_IMAGE_CTXT_BTNBG_NOR; + color: 100 109 124 255; + align: 0.5 0.0; + fixed: 1 1; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + image.normal: MUSIC_IMAGE_CTXT_BTNBG_FOC; + color: 229 72 113 255; + } + } + part { + name: MUSIC_PART_CTXT_BTNICON; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 64 64; + rel1.relative: 0.5 0.0; + rel2.relative: 0.5 0.0; + align: 0.5 0.0; + fixed: 1 1; + } + } + part { + name: "padding_btn_txt"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 72; + rel2.relative: 0.0 0.0; + align: 0.5 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: MUSIC_PART_CTXT_BTNTEXT; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 103 43; + rel1 { + relative: 0.0 1.0; + to: "padding_btn_txt"; + } + rel2 { + relative: 0.0 1.0; + to: "padding_btn_txt"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + } + programs { + program { + name: "focused"; + signal: MUSIC_SIGNAL_FOCUSED; + source: MUSIC_CONTEXT_VIEW; + action: STATE_SET "focused" 0.0; + target: MUSIC_PART_CTXT_BTNBG; + } + program { + name: "unfocused"; + signal: MUSIC_SIGNAL_UNFOCUSED; + source: MUSIC_CONTEXT_VIEW; + action: STATE_SET "default" 0.0; + target: MUSIC_PART_CTXT_BTNBG; + } + } +} + +group { + name: MUSIC_CONTEXT_REL_CONTENT; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 238 291; + visible: 0; + } + } + part { + name: "map"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + perspective { + zplane: 0; + focal: 1000; + } + visible: 0; + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + perspective.zplane: -100; + } + } + part { + name: "icon_bg"; + scale: 1; + type: RECT; + description { + state: "default" 0.0; + min: 238 238; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + color: 28 36 49 255; + fixed: 1 1; + aspect: 1.0 1.0; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + part { + name: MUSIC_PART_CTXT_RELCTNT_ICON; + scale: 1; + type: SWALLOW; + description { + state: "default" 0.0; + rel1.to: "icon_bg"; + rel2.to: "icon_bg"; + align: 0.5 0.5; + fixed: 1 1; + aspect: 1.0 1.0; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + part { name: "left_over"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 8 238; + rel1.to:"icon_bg"; + rel2.to:"icon_bg"; + rel2.relative: 0.0 0.0; + color: 229 72 113 0; + fixed: 1 1; + align: 0.0 0.0; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + map.on: 1; + } + } + part { name: "right_over"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 8 238; + rel1.to:"icon_bg"; + rel1.relative: 1.0 0.0; + rel2.to:"icon_bg"; + rel2.relative: 1.0 0.0; + color: 229 72 113 0; + fixed: 1 1; + align: 1.0 0.0; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + map.on: 1; + } + } + part { name: "top_over"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 238-16 8; + rel1.to: "left_over"; + rel1.relative: 1.0 0.0; + rel2.to: "right_over"; + rel2.relative: 0.0 0.0; + color: 229 72 113 0; + fixed: 1 1; + align: 0.0 0.0; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + map.on: 1; + } + } + part { name: "bottom_bg"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 238 53; + rel1.to:"icon_bg"; + rel1.relative: 0.0 1.0; + rel2.to:"icon_bg"; + rel2.relative: 0.0 1.0; + fixed: 1 1; + align: 0.0 0.0; + color: 42 50 64 255; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + part { name: "bottom_over"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 238 53; + rel1.to:"icon_bg"; + rel1.relative: 0.0 1.0; + rel2.to:"icon_bg"; + rel2.relative: 0.0 1.0; + fixed: 1 1; + align: 0.0 0.0; + color: 229 72 113 0; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + map.on: 1; + } + } + part { + name: "padding_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 16 15; + rel1 { + to: "icon_bg"; + relative: 0.0 1.0; + } + rel2 { + to: "icon_bg"; + relative: 0.0 1.0; + } + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: MUSIC_PART_CTXT_RELCTNT_NAME; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 206 23; + max: 206 23; + text { + font: FONT_STYLE_REGULAR; + size: 24; + } + rel1 { + to: "padding_text"; + relative: 1 1; + } + rel2 { + to: "padding_text"; + } + fixed: 1 1; + align: 0.0 0.0; + color: 211 211 211 255; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + map.on: 1; + } + } + } + programs { + program { + name: "go_active"; + signal: MUSIC_SIGNAL_FOCUSED; + source: MUSIC_CONTEXT_VIEW; + action: STATE_SET "selected" 0.0; + target: MUSIC_PART_CTXT_RELCTNT_ICON; + target: MUSIC_PART_CTXT_RELCTNT_NAME; + target: "bottom_over"; + target: "left_over"; + target: "top_over"; + target: "right_over"; + target: "icon_bg"; + target: "bottom_bg"; + transition: LINEAR 0.3; + } + program { + name: "go_passive"; + signal: MUSIC_SIGNAL_UNFOCUSED; + source: MUSIC_CONTEXT_VIEW; + action: STATE_SET "default" 0.0; + target: MUSIC_PART_CTXT_RELCTNT_ICON; + target: MUSIC_PART_CTXT_RELCTNT_NAME; + target: "bottom_over"; + target: "left_over"; + target: "top_over"; + target: "right_over"; + target: "icon_bg"; + target: "bottom_bg"; + transition: LINEAR 0.3; + } + program { + name: "animaion_start"; + signal: MUSIC_SIGNAL_CONTENT_CLICKED; + source: MUSIC_CONTEXT_VIEW; + action: STATE_SET "clicked" 0.0; + target: "map"; + transition: DECELERATE 0.2; + after: "animation_stop"; + } + program { + name: "animation_stop"; + action: STATE_SET "default" 0.0; + target: "map"; + transition: DECELERATE 0.2; + after: "item_clicked"; + } + program { + name: "item_clicked"; + action: SIGNAL_EMIT MUSIC_SIGNAL_BTN_CLICKED MUSIC_CONTEXT_VIEW; + } + } +} + +group { + name: MUSIC_CONTEXT_INFO; + images { + image: MUSIC_IMAGE_CTXT_ARROW COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 490 106; + fixed: 1 1; + align: 0 0; + color: 42 50 64 255; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + } + part { + name: "icon_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 106 106; + rel2.relative: 0.0 0.0; + align: 0 0; + fixed: 1 1; + color: 28 36 49 255; + } + } + part { + name: MUSIC_PART_CTXT_INFOICON; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 106 106; + rel2.relative: 0.0 0.0; + align: 0 0; + fixed: 1 1; + } + } + part { + name: "pad_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 20 0; + fixed: 1 1; + align: 0 0; + visible: 0; + rel1.to: MUSIC_PART_CTXT_INFOICON; + rel1.relative: 1 0; + rel2.to: MUSIC_PART_CTXT_INFOICON; + rel2.relative: 1 0; + } + } + part { + name: MUSIC_PART_CTXT_INFOTEXT; + type: TEXT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + min: 309 106; + fixed: 1 1; + align: 0 0; + color: 211 211 211 255; + rel1 { + to: "pad_text"; + relative: 1.0 1.0; + } + rel2 { + to: "pad_text"; + } + text { + font: FONT_STYLE_REGULAR; + size: 27; + align: 0 0.5; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "pad_arrow"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 20 45; + fixed: 1 1; + align: 0 0; + visible: 0; + rel1.to: MUSIC_PART_CTXT_INFOTEXT; + rel1.relative: 1 0; + rel2.to: MUSIC_PART_CTXT_INFOTEXT; + rel2.relative: 1 0; + } + } + part { + name: "arrow"; + scale: 1; + description { + state: "default" 0.0; + min: 20 20; + fixed: 1 1; + align: 0 0; + aspect: 1 1; + color: 211 211 211 255; + rel1 { + to: "pad_arrow"; + relative: 1.0 1.0; + } + rel2 { + to: "pad_arrow"; + } + image.normal: MUSIC_IMAGE_CTXT_ARROW; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + } + programs { + program { + name: "go_active"; + signal: MUSIC_SIGNAL_FOCUSED; + source: MUSIC_CONTEXT_VIEW; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "arrow"; + target: MUSIC_PART_CTXT_INFOTEXT; + } + program { + name: "go_passive"; + signal: MUSIC_SIGNAL_UNFOCUSED; + source: MUSIC_CONTEXT_VIEW; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "arrow"; + target: MUSIC_PART_CTXT_INFOTEXT; + } + } +} diff --git a/res/edc/views/entrypopup-layout.edc b/res/edc/views/entrypopup-layout.edc new file mode 100644 index 0000000..525d2dc --- /dev/null +++ b/res/edc/views/entrypopup-layout.edc @@ -0,0 +1,74 @@ +group { + name: MUSIC_ENTRY_POPUP_LAYOUT; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 204; + } + } + part { + name: "entrybg_pad"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 376; + fixed: 1 1; + align: 0 0; + visible: 0; + rel1.to: "bg"; + rel2.to: "bg"; + rel2.relative: 0.0 0.0; + } + } + part { + name: "entrybg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1920 1080-376; + fixed: 1 1; + align: 0 0; + rel1.to: "entrybg_pad"; + rel1.relative: 1.0 1.0; + rel2.to: "bg"; + color: 42 50 64 255; + } + } + part { + name: "entry_pad"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 160 90; + fixed: 1 1; + align: 0 0; + visible: 0; + rel1.to: "entrybg"; + rel2.to: "entrybg"; + rel2.relative: 0.0 0.0; + } + } + part { + name: MUSIC_PART_ENTRY; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 1600 100; + fixed: 1 1; + align: 0 0; + rel1.to: "entry_pad"; + rel1.relative: 1.0 1.0; + rel2.to: "entry_pad"; + } + } + } +} + diff --git a/res/edc/views/folder-layout.edc b/res/edc/views/folder-layout.edc new file mode 100644 index 0000000..539889c --- /dev/null +++ b/res/edc/views/folder-layout.edc @@ -0,0 +1,55 @@ +group { + name: MUSIC_FOLDER_LAYOUT; + images { + image: MUSIC_IMAGE_BACK COMP; + image: MUSIC_IMAGE_SONG_COUNT COMP; + image: MUSIC_IMAGE_ALBUM_TIME COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + } + + PART_RECT_PADDING(padding_back, 0 14, bg) + PART_IMAGE_BASIC(MUSIC_PART_BACK_IMAGE, 14 14, padding_back, 0 0, MUSIC_IMAGE_BACK) + + PART_RECT_PADDING(padding_folder, 14+8 2, bg) + PART_TEXT_FONT(MUSIC_PART_FOLDER_NAME, 700 36, padding_folder, 0 0, FONT_STYLE_MEDIUM, 30, 0 0.5) + + PART_RECT_PADDING(padding_countimage, 0 48, bg) + PART_IMAGE_BASIC(MUSIC_PART_COUNT_IMAGE, 32 32, padding_countimage, 0 0, MUSIC_IMAGE_SONG_COUNT) + + PART_RECT_PADDING(padding_songcount, 32+14 48, bg) + PART_TEXT_FONT(MUSIC_PART_FOLDER_SONGCOUNT, 50 32, padding_songcount, 0 0, FONT_STYLE_REGULAR, 28, 0 0.5) + + PART_RECT_PADDING(padding_timeimage, 46+50+14 48, bg) + PART_IMAGE_BASIC(MUSIC_PART_TIME_IMAGE, 32 32, padding_timeimage, 0 0, MUSIC_IMAGE_ALBUM_TIME) + + PART_RECT_PADDING(padding_time, 110+32+14 48, bg) + PART_TEXT_FONT(MUSIC_PART_FOLDER_TIME, 100 32, padding_time, 0 0, FONT_STYLE_REGULAR, 28, 0 0.5) + + PART_RECT_PADDING(padding_playbtn, 1395-214*3-14*2 19, bg) + PART_SWALLOW_BASIC(MUSIC_PART_FOLDER_PLAYBTN, 214 62, + padding_playbtn, 0 0) + + PART_RECT_PADDING(padding_nextbtn, 1395-214*2-14 19, bg) + PART_SWALLOW_BASIC(MUSIC_PART_FOLDER_NEXTBTN, 214 62, + padding_nextbtn, 0 0) + + PART_RECT_PADDING(padding_lastbtn, 1395-214 19, bg) + PART_SWALLOW_BASIC(MUSIC_PART_FOLDER_LASTBTN, 214 62, + padding_lastbtn, 0 0) + + PART_RECT_PADDING(padding_foldergrid, 0 116, bg) + PART_SWALLOW_BASIC(MUSIC_PART_FOLDER_GRID, 1395+20 732, + padding_foldergrid, 0 0) + } +} + + diff --git a/res/edc/views/message-layout.edc b/res/edc/views/message-layout.edc new file mode 100644 index 0000000..b6e4603 --- /dev/null +++ b/res/edc/views/message-layout.edc @@ -0,0 +1,85 @@ +group { + name: MUSIC_MESSAGE_LAYOUT; + images { + image: "round_rectangle_9X9.png" COMP; + } + parts { + part { + name: "pad_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel2.relative: 0.0 0.0; + min: 960 1080-127; + align: 0 0; + visible: 0; + } + } + part { + name: "part_bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "pad_bg"; + relative: 1.0 1.0; + } + rel2 { + to: "pad_bg"; + relative: 1.0 1.0; + } + min: 727 154; + align: 0.5 0.5; + fixed: 1 1; + image { + normal: "round_rectangle_9X9.png"; + border: 9 9 9 9; + } + color: 18 5 8 255; + } + } + part { + name: "pad_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "part_bg"; + rel2.to: "part_bg"; + rel2.relative: 0.0 0.0; + min: 20 0; + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: MUSIC_PART_MESSAGE; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 687 154; + max: 687 154 ; + text { + font: FONT_STYLE_REGULAR; + size: 24; + align: 0.5 0.5; + } + rel1 { + to: "pad_text"; + relative: 1 1; + } + rel2 { + to: "pad_text"; + } + fixed: 1 1; + align: 0.0 0.0; + color: 255 255 255 255; + } + } + } +} + diff --git a/res/edc/views/playback-view.edc b/res/edc/views/playback-view.edc new file mode 100644 index 0000000..bd7e624 --- /dev/null +++ b/res/edc/views/playback-view.edc @@ -0,0 +1,104 @@ +group { + name: MUSIC_PLAYBACK_VIEW; + images { + image: MUSIC_IMAGE_PLAYBACK_SHADOW COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 229 72 113 255; + } + } + part { + name: "bg1"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 229 72 113 38; + } + } + part { + name: "bg2"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 204; + } + } + + PART_RECT_PADDING(padding_song_title, 91 82, bg) + PART_TEXT_FONT(MUSIC_PART_SONG_TITLE, 1710 56, padding_song_title, 0 0, FONT_STYLE_BOLD, 50, 0 0.5) + + PART_RECT_PADDING(padding_artist_album, 91 144, bg) + PART_TEXT_FONT(MUSIC_PART_ARTIST_ALBUM, 1710 36, padding_artist_album, 0 0, FONT_STYLE_BOLD, 30, 0 0.5) + + PART_RECT_PADDING(padding_albumcover, 86 214, bg) + PART_RECT_COLOR(album_bg, 630 630, padding_albumcover, 0 0, 0 0 0 115) + PART_SWALLOW_BASIC(MUSIC_PART_ALBUMCOVER, 630 630, padding_albumcover, 0 0) + + PART_RECT_PADDING(padding_shadow, 86 744, bg) + PART_IMAGE_BASIC(MUSIC_PART_PLAYBACK_SHADOW, 630 100, padding_shadow, 0 0, MUSIC_IMAGE_PLAYBACK_SHADOW) + + PART_RECT_PADDING(padding_progresstime, 86+20 214+630-45, bg) + PART_TEXT_FONT(MUSIC_PART_PROGRESSTIME, 100 30, padding_progresstime, 0 0, FONT_STYLE_REGULAR, 25, 0 0.5) + + PART_RECT_PADDING(padding_fulltime, 86+630-120 214+630-45, bg) + PART_TEXT_FONT(MUSIC_PART_FULLTIME, 100 30, padding_fulltime, 0 0, FONT_STYLE_REGULAR, 25, 1 0.5) + + PART_RECT_PADDING(padding_controlbg, 86 844+8, bg) + PART_RECT_COLOR(controls_part_bg, 630 142, padding_controlbg, 0 0, 32 9 21 217) + + PART_RECT_PADDING(padding_editbtns, 86+20 844-4, bg) + PART_SWALLOW_SHOWHIDE(MUSIC_PART_EDITBTNS, 590 154, padding_editbtns, 0 0) + + PART_RECT_PADDING(padding_controlbtns, 86+34 844+8, bg) + PART_SWALLOW_SHOWHIDE(MUSIC_PART_CONTROLBTNS, 562 142, padding_controlbtns, 0 0) + + PART_RECT_PADDING(padding_playlist, 756 214, bg) + PART_SWALLOW_BASIC(MUSIC_PART_PLAYLIST, 1045 866, padding_playlist, 0 0) + + PART_RECT_PADDING(padding_progressbar, 86 844+4, bg) + PART_SWALLOW_BASIC(MUSIC_PART_PROGRESSBAR, 630 40, padding_progressbar, 0 0.5) + + PART_RECT_PADDING(padding_setpopup, 85 696, bg) + PART_SWALLOW_BASIC(MUSIC_PART_SETTINGS_POPUP, 252 172, padding_setpopup, 0 0) + + part { + name: MUSIC_PART_VOLUME_LAYOUT; + scale: 1; + type: SWALLOW; + description { + state: "default" 0.0; + } + } + } + + programs { + program { + name: "edit-mode"; + signal: MUSIC_SIGNAL_EDIT_MODE; + source: MUSIC_PLAYBACK_VIEW; + script { + set_state(PART:MUSIC_PART_CONTROLBTNS, "hide", 0.0); + set_state(PART:MUSIC_PART_EDITBTNS, "default", 0.0); + } + transition: LINEAR 1.0; + } + program { + name: "playback-mode"; + signal: MUSIC_SIGNAL_PLAYBACK_MODE; + source: MUSIC_PLAYBACK_VIEW; + script { + set_state(PART:MUSIC_PART_CONTROLBTNS, "default", 0.0); + set_state(PART:MUSIC_PART_EDITBTNS, "hide", 0.0); + } + transition: LINEAR 1.0; + } + } +} diff --git a/res/edc/views/settings-layout.edc b/res/edc/views/settings-layout.edc new file mode 100644 index 0000000..31c4d15 --- /dev/null +++ b/res/edc/views/settings-layout.edc @@ -0,0 +1,18 @@ +group { + name: MUSIC_SETTINGS_LAYOUT; + parts { + part{ + name: bg; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + } + + PART_RECT_PADDING(padding_settings_btnbox, 150 780, bg) + PART_SWALLOW_BASIC(MUSIC_PART_SETTINGS_BTNBOX, 300 250, padding_settings_btnbox, 0 0) + } +} + diff --git a/res/edc/views/song-layout.edc b/res/edc/views/song-layout.edc new file mode 100644 index 0000000..34e4cb1 --- /dev/null +++ b/res/edc/views/song-layout.edc @@ -0,0 +1,19 @@ +group { + name: MUSIC_SONG_LAYOUT; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + } + } + PART_RECT_PADDING(padding_songlist, 0 0, bg) + PART_SWALLOW_BASIC(MUSIC_PART_SONGLIST, 1395 848, + padding_songlist, 0 0) + } +} + + diff --git a/res/edc/views/volume-layout.edc b/res/edc/views/volume-layout.edc new file mode 100644 index 0000000..152833c --- /dev/null +++ b/res/edc/views/volume-layout.edc @@ -0,0 +1,195 @@ +group { + name: MUSIC_VOLUME_LAYOUT; + images { + image: "ico_vol.png" COMP; + image: "ico_mute.png" COMP; + image: "round_rectangle_9X9.png" COMP; + } + styles { + style { + name: "volume_style"; + base: "align=center font=TizenSans font_size=34 color=#E54871FF font_weight=Bold"; + } + } + parts { + part { + name: "padding.banner"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.relative: 0.5 1.0; + rel2.relative: 0.5 1.0; + min: 0 127; + align: 1.0 1.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: "banner.volume"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding.banner"; + relative: 0.0 0.0; + } + rel2 { + to: "padding.banner"; + relative: 0.0 0.0; + } + min: 527 154; + align: 0.5 0.5; + fixed: 1 1; + image { + normal: "round_rectangle_9X9.png"; + border: 9 9 9 9; + } + color: 0 0 0 153; + } + } + part { + name: "padding.icon"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "banner.volume"; + relative: 0.0 0.0; + } + rel2 { + to: "banner.volume"; + relative: 0.0 0.0; + } + min: 57 52; + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + + } + } + part { + name: "part.icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding.icon"; + relative: 1.0 1.0; + } + rel2 { + to: "padding.icon"; + relative: 1.0 1.0; + } + min: 50 50; + align: 0.0 0.0; + fixed: 1 1; + image.normal: "ico_vol.png"; + } + description { + state: "mute" 0.0; + inherit: "default" 0.0; + image.normal: "ico_mute.png"; + } + } + part { + name: "padding.progressbar"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "part.icon"; + relative: 1.0 0.0; + } + rel2 { + to: "part.icon"; + relative: 1.0 0.0; + } + min: 18 10; + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: MUSIC_PART_VOLUME_BAR; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding.progressbar"; + relative: 1.0 1.0; + } + rel2 { + to: "padding.progressbar"; + relative: 1.0 1.0; + } + min: 280 8; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "padding.volume"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "banner.volume"; + relative: 1.0 0.0; + } + rel2 { + to: "banner.volume"; + relative: 1.0 0.0; + } + min: 51 0; + align: 1.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: MUSIC_PART_VOLUME_VALUE; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding.volume"; + relative: 0.0 0.0; + } + rel2 { + to: "padding.volume"; + relative: 0.0 0.0; + } + min: 60 154; + align: 1.0 0.0; + fixed: 1 1; + text.style: "volume_style"; + } + } + } + programs { + program { + name: "show.mute"; + signal: MUSIC_SIGNAL_VOLUME_MUTE; + source: MUSIC_PLAYBACK_VIEW; + action: STATE_SET "mute" 0.0; + target: "part.icon"; + } + program { + name: "hide.mute"; + signal: MUSIC_SIGNAL_VOLUME_UNMUTE; + source: MUSIC_PLAYBACK_VIEW; + action: STATE_SET "default" 0.0; + target: "part.icon"; + } + } +} diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc new file mode 100644 index 0000000..108e7da --- /dev/null +++ b/res/edc/widgets/button.edc @@ -0,0 +1,2364 @@ +#define STATE_NORMAL 0 +#define STATE_HIGHLIGHT 1 + +group { + name: "elm/button/base/music_hover_entry"; + images { + image: MUSIC_IMAGE_TICK COMP; + } + script { + public cur_state; + public hide_line; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 290 72; + color: 255 255 255 255; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "division_line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 290 2; + color: 89 89 89 51; + rel1 { + to: "bg"; + relative: 1.0 1.0; + } + rel2 { + to: "bg"; + } + align: 1.0 1.0; + fixed: 1 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "padding_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 40 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 1.0; + } + fixed: 1 0; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 170 80; + rel1 { + to: "padding_text"; + relative: 1.0 0.0; + } + rel2 { + to: "padding_text"; + } + text { + font: FONT_STYLE_REGULAR; + size: 30; + align: 0.0 0.5; + } + color: 89 89 89 255; + fixed: 1 1; + align: 0.0 0.0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + /*text { + font: FONT_STYLE_MEDIUM; + }*/ + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + /*text { + font: FONT_STYLE_MEDIUM; + }*/ + color: 229 72 113 255; + } + } + part { + name: "padding_icon"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 20 30; + rel1 { + to: "elm.text"; + relative: 1.0 0.0; + } + rel2 { + to: "elm.text"; + relative: 1.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "image_part"; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 20 20; + rel1 { + to: "padding_icon"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_icon"; + } + image.normal: MUSIC_IMAGE_TICK; + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + visible: 1; + } + } + } + programs { + program { + name: "load"; + signal: "load"; + source: ""; + script { + set_int(cur_state, STATE_NORMAL); + set_int(hide_line, 0); + } + } + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_mouseup"; + signal: "mouse,up,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + script { + new state; + state = get_int(cur_state); + + if (state == STATE_HIGHLIGHT) + set_state(PART:"image_part", "selected", 0.0); + + set_state(PART:"bg", "selected", 0.0); + set_state(PART:"division_line", "selected", 0.0); + set_state(PART:"elm.text", "selected", 0.0); + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + new state; + new var; + new buf[100]; + state = get_int(cur_state); + + if (state == STATE_HIGHLIGHT) + snprintf(buf, sizeof(buf), "highlight"); + else + snprintf(buf, sizeof(buf), "default"); + + var = get_int(hide_line); + set_state(PART:"bg", buf, 0.0); + if (!var) + set_state(PART:"division_line", buf, 0.0); + set_state(PART:"elm.text", buf, 0.0); + set_state(PART:"image_part", buf, 0.0); + } + } + program { + name: "highlight"; + signal: "elm,action,highlight"; + source: "elm"; + script { + set_int(cur_state, STATE_HIGHLIGHT); + } + after: "highlight1"; + } + program { + name: "highlight1"; + action: STATE_SET "highlight" 0.0; + target: "bg"; + target: "elm.text"; + target: "image_part"; + target: "division_line"; + } + program { + name: "hide_line"; + signal: "elm,action,hideline"; + source: "elm"; + script { + set_int(hide_line, 1); + set_state(PART:"division_line", "selected", 0.0); + } + } + } +} + +group { + name: "elm/button/base/music_sourcebtn"; + images { + image: MUSIC_IMAGE_PULLDOWN_ARROW COMP; + image: MUSIC_IMAGE_PLAYBACK_ROUND_ICON COMP; + } + script { + public cur_state; + } + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + min: 290 72; + rel2.relative: 0.0 0.0; + image { + normal: MUSIC_IMAGE_PLAYBACK_ROUND_ICON; + border: 4 4 4 4; + border_scale: 1; + } + color: 255 255 255 12; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "selected_0" 0.0; + inherit: "selected" 0.0; + color: 229 72 113 0; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "padding_txt"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 32 0; + rel2.relative: 0.0 0.0; + align: 0.0 0.5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "elm.text"; + type: TEXT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + min: 0 72; + rel1 { + relative: 1.0 0.0; + to: "padding_txt"; + } + rel2 { + relative: 1.0 0.0; + to: "padding_txt"; + } + text { + font: FONT_STYLE_REGULAR; + size: 30; + align: 0.0 0.5; + min: 1 0; + } + align: 0.0 0.0; + color: 175 175 175 255; + fixed: 1 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 175 175 175 25; + } + } + part { + name: "padding_updown"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 10 0; + rel1 { + to: "elm.text"; + relative: 1.0 0.0; + } + rel2 { + to: "elm.text"; + } + align: 0.0 0.5; + fixed: 1 1; + visible: 0; + } + } + part { + name: MUSIC_PART_ELM_SWALLOWICON; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 24 24; + max: 24 24; + rel1 { + relative: 1.0 0.0; + to: "padding_updown"; + } + rel2 { + to: "padding_updown"; + } + align: 0.0 0.5; + fixed: 1 1; + color: 193 193 193 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "focused" 0.0; + } + description { + state: "mouse_over" 0.0; + inherit: "focused" 0.0; + } + } + part { + name: "padding_arrow"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 24 0; + rel1 { + relative: 1.0 0.0; + to: "bg"; + } + rel2 { + to: "bg"; + } + align: 1.0 0.5; + fixed: 1 1; + visible: 0; + } + } + part { + name: "arrow_img"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 24 24; + max: 24 24; + rel1 { + relative: 0.0 0.0; + to: "padding_arrow"; + } + rel2 { + relative: 0.0 1.0; + to: "padding_arrow"; + } + image.normal: MUSIC_IMAGE_PULLDOWN_ARROW; + align: 1.0 0.5; + fixed: 1 1; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 175 175 175 25; + } + } + } + programs { + program { + name: "load"; + signal: "load"; + source: ""; + script { + set_int(cur_state, STATE_NORMAL); + } + } + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_mouseup"; + signal: "mouse,up,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + script { + set_int(cur_state, STATE_NORMAL); + set_state(PART:"bg", "selected", 0.0); + set_state(PART:"elm.text", "selected", 0.0); + } + } + program { + name: "focus,anim"; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "elm.text"; + target: MUSIC_PART_ELM_SWALLOWICON; + transition: LINEAR 0.17; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + new state; + state = get_int(cur_state); + if (state == STATE_HIGHLIGHT) { + set_state(PART:"bg", "highlight_0", 0.0); + set_state(PART:"elm.text", "highlight", 0.0); + set_state(PART:MUSIC_PART_ELM_SWALLOWICON, "highlight", 0.0); + run_program(PROGRAM:"unfocus,high,anim"); + } else { + set_state(PART:"bg","default", 0.0); + set_state(PART:"elm.text","default", 0.0); + } + } + } + program { + name: "unfocus,high,anim"; + action: STATE_SET "highlight" 0.0; + target: "bg"; + transition: LINEAR 0.17; + } + program { + name: "unfocus,default,anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + target: MUSIC_PART_ELM_SWALLOWICON; + transition: LINEAR 0.17; + } + program { + name: "unfocus"; + signal: "unfocused"; + source: ""; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + target: MUSIC_PART_ELM_SWALLOWICON; + } + program { + name: "highlight"; + signal: "highlight"; + source: ""; + script { + set_int(cur_state, STATE_HIGHLIGHT); + set_state(PART:"bg", "highlight", 0.0); + set_state(PART:"elm.text", "highlight", 0.0); + set_state(PART:MUSIC_PART_ELM_SWALLOWICON, "highlight", 0.0); + } + } + program { + name: "unhighlight"; + signal: "unhighlight"; + source: ""; + script { + set_int(cur_state, STATE_NORMAL); + set_state(PART:"bg", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:MUSIC_PART_ELM_SWALLOWICON, "default", 0.0); + } + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + script { + set_state(PART:"bg", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"arrow_img", "default", 0.0); + } + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + script{ + set_state(PART:"elm.text", "disabled", 0.0); + set_state(PART:"arrow_img", "disabled", 0.0); + } + } + } +} + +group { + name: "elm/button/base/music_sortbtn"; + inherit: "elm/button/base/music_sourcebtn"; + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 76; + } + } + } +} + +group { + name: "elm/button/base/menubtn"; + images { + image: MUSIC_GROUPBTN_BG COMP; + } + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + min: 406 87; + image.normal: MUSIC_GROUPBTN_BG; + color: 0 0 0 0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 229 72 113 51; + } + } + part { + name: "padding_icon"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 85 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 1.0; + } + fixed: 1 0; + visible: 0; + align: 0.0 0.5; + } + } + part { + name: MUSIC_PART_ELM_SWALLOWICON; + type: SWALLOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 40 40; + rel1 { + to: "padding_icon"; + relative: 1.0 0.0; + } + rel2 { + to: "padding_icon"; + } + fixed: 1 0; + align: 0.0 0.5; + } + } + part { + name: "padding_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 37 0; + rel1 { + to: MUSIC_PART_ELM_SWALLOWICON; + relative: 1.0 0.0; + } + rel2 { + to: MUSIC_PART_ELM_SWALLOWICON; + relative: 1.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 219 87; + rel1 { + to_x: "padding_text"; + relative: 1.0 0.0; + } + rel2 { + to_x: "padding_text"; + relative: 1.0 1.0; + } + text { + font: FONT_STYLE_REGULAR; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 153; + fixed: 1 1; + align: 0.0 0.0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text { + font: FONT_STYLE_BOLD; + } + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + text { + font: FONT_STYLE_MEDIUM; + } + color: 255 255 255 255; + } + } + } + script { + public select_status = 0; + } + programs { + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_mouseup"; + signal: "mouse,up,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + script { + if (get_int(select_status) != 1) { + emit("elm,action,click", ""); + } + set_state(PART:"bg", "focused", 0.0); + set_state(PART:"elm.text", "focused", 0.0); + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + if (get_int(select_status) == 1) { + set_state(PART:"bg", "highlight", 0.0); + set_state(PART:"elm.text", "highlight", 0.0); + } else { + set_state(PART:"bg", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + } + } + } + program { + name: "select"; + signal: MUSIC_SIGNAL_GROUP_SELECTED; + source: MUSIC_BASE_VIEW; + script { + new st[31]; + new Float: vl; + set_int(select_status, 1); + get_state(PART:"bg", st, 30, vl); + if (strcmp(st, "focused")) { + set_state(PART:"bg", "highlight", 0.0); + set_state(PART:"elm.text", "highlight", 0.0); + } + } + } + program { + name: "unselect"; + signal: MUSIC_SIGNAL_GROUP_UNSELECTED; + source: MUSIC_BASE_VIEW; + script { + set_int(select_status, 0); + set_state(PART:"bg", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + } + } + } +} + +group { + name: "elm/button/base/playbackbtn"; + images { + image: MUSIC_IMAGE_PLAYBACK_ICON COMP; + image: MUSIC_IMAGE_PLAYBACK_ROUND_ICON COMP; + } + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + min: 72 72; + image { + normal: MUSIC_IMAGE_PLAYBACK_ROUND_ICON; + border: 4 4 4 4; + border_scale: 1; + } + color: 116 86 99 255; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + } + part { + name: "image"; + scale: 1; + description { + state: "default" 0.0; + min: 72 72; + rel1.to: bg; + rel2.to: bg; + rel2.relative: 0.0 0.0; + image.normal: MUSIC_IMAGE_PLAYBACK_ICON; + fixed: 1 1; + align: 0.0 0.0; + color: 255 255 255 255; + } + } + } + programs { + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "image"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_mouseup"; + signal: "mouse,up,1"; + source: "image"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "image"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "selected" 0.0; + target: "bg"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + } + } +} + +group { + name: "elm/button/base/music_btn_common"; + images { + image: MUSIC_IMAGE_BTN_NORMAL_BG COMP; + image: MUSIC_IMAGE_BTN_FOCUS_BG COMP; + } + parts { + part { + name: "map"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + perspective { + zplane: 0; + focal: 1000; + } + visible: 0; + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + perspective.zplane: -100; + } + } + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + min: 72 72; + image.normal: MUSIC_IMAGE_BTN_NORMAL_BG; + map { + on: 1; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + image.normal: MUSIC_IMAGE_BTN_FOCUS_BG; + color: 229 72 113 255; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 175 175 175 25; + } + description { + state: "highlight" 0.0; + inherit: "focused" 0.0; + color: 229 72 113 102; + } + } + part { + name: "image"; + scale: 1; + description { + state: "default" 0.0; + min: 72 72; + map { + on: 1; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 175 175 175 25; + } + } + } + programs { + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "image"; + script { + new st[31]; + new Float: vl; + get_state(PART:"image", st, 30, vl); + if (strcmp(st, "disabled")) { + emit("elm,action,press", ""); + } + } + } + program { + name: "button_mouseup"; + signal: "mouse,up,1"; + source: "image"; + script { + new st[31]; + new Float: vl; + get_state(PART:"image", st, 30, vl); + if (strcmp(st, "disabled")) { + emit("elm,action,unpress", ""); + } + } + } + program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "image"; + script { + new st[31]; + new Float: vl; + get_state(PART:"image", st, 30, vl); + if (strcmp(st, "disabled")) { + emit("elm,action,click", ""); + } + } + } + program { + name: "button_clicked_custom"; + signal: MUSIC_SIGNAL_BTN_CLICKED; + source: MUSIC_PLAYBACK_VIEW; + action: STATE_SET "clicked" 0.0; + target: "map"; + transition: DECELERATE 0.2; + after: "after_clicked"; + } + program { + name: "after_clicked"; + action: STATE_SET "default" 0.0; + target: "map"; + transition: DECELERATE 0.2; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "bg"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + new st[31]; + new Float: vl; + get_state(PART:"bg", st, 30, vl); + if (!strcmp(st, "focused")) { + set_state(PART:"bg","default", 0.0); + } + } + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + script { + set_state(PART:"bg","default", 0.0); + set_state(PART:"image","default", 0.0); + } + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + script { + set_state(PART:"bg","disabled", 0.0); + set_state(PART:"image","disabled", 0.0); + } + } + program { + name: "highlight"; + signal: MUSIC_SIGNAL_CONTROL_SELECTED; + source: MUSIC_PLAYBACK_VIEW; + action: STATE_SET "highlight" 0.0; + target: "bg"; + } + } +} + +group { + name: "elm/button/base/music_btn_settings"; + inherit: "elm/button/base/music_btn_common"; + images { + image: MUSIC_IMAGE_BTN_SETTINGS COMP; + } + parts { + part { + name: "image"; + scale: 1; + description { + state: "default" 0.0; + min: 72 72; + image.normal: MUSIC_IMAGE_BTN_SETTINGS; + } + } + } +} + +group { + name: "elm/button/base/music_btn_rewind"; + inherit: "elm/button/base/music_btn_common"; + images { + image: MUSIC_IMAGE_BTN_REWIND COMP; + } + parts { + part { + name: "image"; + scale: 1; + description { + state: "default" 0.0; + min: 72 72; + image.normal: MUSIC_IMAGE_BTN_REWIND; + } + } + } +} + +group { + name: "elm/button/base/music_btn_forward"; + inherit: "elm/button/base/music_btn_common"; + images { + image: MUSIC_IMAGE_BTN_FORWARD COMP; + } + parts { + part { + name: "image"; + scale: 1; + description { + state: "default" 0.0; + min: 72 72; + image.normal: MUSIC_IMAGE_BTN_FORWARD; + } + } + } +} + +group { + name: "elm/button/base/music_btn_shuffle"; + inherit: "elm/button/base/music_btn_common"; + images { + image: MUSIC_IMAGE_BTN_SHUFFLE_OFF COMP; + image: MUSIC_IMAGE_BTN_SHUFFLE_ON COMP; + } + parts { + part { + name: "image"; + scale: 1; + description { + state: "default" 0.0; + min: 72 72; + image.normal: MUSIC_IMAGE_BTN_SHUFFLE_OFF; + } + description { + state: "on" 0.0; + inherit: "default" 0.0; + image.normal: MUSIC_IMAGE_BTN_SHUFFLE_ON; + } + } + } + programs { + program { + name: "shuffle_off"; + signal: MUSIC_SIGNAL_SHUFFLE_OFF; + source: MUSIC_PLAYBACK_VIEW; + action: STATE_SET "default" 0.0; + target: "image"; + } + program { + name: "shuffle_on"; + signal: MUSIC_SIGNAL_SHUFFLE_ON; + source: MUSIC_PLAYBACK_VIEW; + action: STATE_SET "on" 0.0; + target: "image"; + } + } + +} + +group { + name: "elm/button/base/music_btn_repeat"; + inherit: "elm/button/base/music_btn_common"; + images { + image: MUSIC_IMAGE_BTN_REPEAT_OFF COMP; + image: MUSIC_IMAGE_BTN_REPEAT_ON COMP; + image: MUSIC_IMAGE_BTN_REPEAT_ONLY COMP; + } + parts { + part { + name: "image"; + scale: 1; + description { + state: "default" 0.0; + min: 72 72; + image.normal: MUSIC_IMAGE_BTN_REPEAT_OFF; + } + description { + state: "on" 0.0; + inherit: "default" 0.0; + image.normal: MUSIC_IMAGE_BTN_REPEAT_ON; + } + description { + state: "only" 0.0; + inherit: "default" 0.0; + image.normal: MUSIC_IMAGE_BTN_REPEAT_ONLY; + } + } + } + programs { + program { + name: "repeat_off"; + signal: MUSIC_SIGNAL_REPEAT_OFF; + source: MUSIC_PLAYBACK_VIEW; + action: STATE_SET "default" 0.0; + target: "image"; + } + program { + name: "repeat_on"; + signal: MUSIC_SIGNAL_REPEAT_ALL; + source: MUSIC_PLAYBACK_VIEW; + action: STATE_SET "on" 0.0; + target: "image"; + } + program { + name: "repeat_only"; + signal: MUSIC_SIGNAL_REPEAT_ONE; + source: MUSIC_PLAYBACK_VIEW; + action: STATE_SET "only" 0.0; + target: "image"; + } + } +} + +group { + name: "elm/button/base/music_btn_play"; + inherit: "elm/button/base/music_btn_common"; + images { + image: MUSIC_IMAGE_BTN_PLAY COMP; + image: MUSIC_IMAGE_BTN_PAUSE COMP; + } + parts { + part { + name: "image"; + scale: 1; + description { + state: "default" 0.0; + min: 72 72; + image.normal: MUSIC_IMAGE_BTN_PAUSE; + } + description { + state: "play" 0.0; + inherit: "default" 0.0; + image.normal: MUSIC_IMAGE_BTN_PLAY; + } + } + } + programs { + program { + name: "play"; + signal: MUSIC_SIGNAL_PLAY; + source: MUSIC_PLAYBACK_VIEW; + action: STATE_SET "default" 0.0; + target: "image"; + } + program { + name: "pause"; + signal: MUSIC_SIGNAL_PAUSE; + source: MUSIC_PLAYBACK_VIEW; + action: STATE_SET "play" 0.0; + target: "image"; + } + } +} + +group { + name: "elm/button/base/music_btn_settings_option_t"; + images { + image: MUSIC_IMAGE_PLAYBACK_ROUNDT_ICON COMP; + image: MUSIC_IMAGE_PLAYBACK_ROUNDB_ICON COMP; + } + + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + min: 252 84; + image { + normal: MUSIC_IMAGE_PLAYBACK_ROUNDT_ICON; + border: 4 4 4 4; + border_scale: 1; + } + color: 255 255 255 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "text_pad"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 32 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 220 84; + rel1.to: "text_pad"; + rel1.relative: 1 1; + rel2.to: "text_pad"; + text { + font: FONT_STYLE_REGULAR; + size: 30; + align: 0 0.5; + } + color: 89 89 89 255; + fixed: 1 1; + align: 0 0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text { + font: FONT_STYLE_BOLD; + } + color: 255 255 255 255; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 89 89 89 51; + } + } + part{ + name: "downarrow"; + description { + state: "default" 0.0; + min: 17 10; + visible: 0; + } + } + } + programs { + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "bg"; + script { + new st[31]; + new Float: vl; + get_state(PART:"bg", st, 30, vl); + if (strcmp(st, "disabled")) { + emit("elm,action,press", ""); + } + } + } + program { + name: "button_mouseup"; + signal: "mouse,up,1"; + source: "bg"; + script { + new st[31]; + new Float: vl; + get_state(PART:"bg", st, 30, vl); + if (strcmp(st, "disabled")) { + emit("elm,action,unpress", ""); + } + } + } + program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "bg"; + script { + new st[31]; + new Float: vl; + get_state(PART:"bg", st, 30, vl); + if (strcmp(st, "disabled")) { + emit("elm,action,click", ""); + } + } + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + script { + set_state(PART:"bg", "focused", 0.0); + set_state(PART:"elm.text", "focused", 0.0); + set_state(PART:"downarrow", "focused", 0.0); + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + set_state(PART:"bg", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"downarrow", "default", 0.0); + } + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + script { + set_state(PART:"bg", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"downarrow", "default", 0.0); + } + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + script{ + set_state(PART:"bg", "disabled", 0.0); + set_state(PART:"elm.text", "disabled", 0.0); + set_state(PART:"downarrow", "disabled", 0.0); + } + } + } +} + +group { + name: "elm/button/base/music_btn_settings_option_b"; + inherit: "elm/button/base/music_btn_settings_option_t"; + images { + image: MUSIC_IMAGE_POPUP_DOWN_ARROW COMP; + } + parts { + part { + name: "bg"; + description { + state: "default" 0.0; + min: 252 84; + image { + normal: MUSIC_IMAGE_PLAYBACK_ROUNDB_ICON; + border: 4 4 4 4; + border_scale: 1; + } + color: 255 255 255 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "padding_arrow"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 70 84; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 1.0; + } + fixed: 1 0; + visible: 0; + align: 0.0 0.0; + } + } + + part { + name: "downarrow"; + description { + state: "default" 0.0; + min: 17 10; + align: 0.5 0.0; + fixed: 1 1; + rel1.to: "padding_arrow"; + rel1.relative: 1.0 1.0; + rel2.to: "padding_arrow"; + image.normal: MUSIC_IMAGE_POPUP_DOWN_ARROW; + color: 255 255 255 255; + visible: 1; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + } +} + +group { + name: "elm/button/base/music_btn_edit"; + images { + image: MUSIC_IMAGE_PLAYBACK_ROUND_ICON COMP; + } + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + min: 190 70; + image { + normal: MUSIC_IMAGE_PLAYBACK_ROUND_ICON; + border: 4 4 4 4; + border_scale: 1; + } + color: 204 204 204 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 204 204 204 127; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 190 70; + rel1.to: "bg"; + rel2.to: "bg"; + text { + font: FONT_STYLE_REGULAR; + size: 28; + align: 0.5 0.5; + } + color: 89 89 89 255; + fixed: 1 1; + align: 0.5 0.5; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text { + font: FONT_STYLE_BOLD; + } + color: 255 255 255 255; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 89 89 89 127; + } + } + } + programs { + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "bg"; + script { + new st[31]; + new Float: vl; + get_state(PART:"bg", st, 30, vl); + if (strcmp(st, "disabled")) { + emit("elm,action,press", ""); + } + } + } + program { + name: "button_mouseup"; + signal: "mouse,up,1"; + source: "bg"; + script { + new st[31]; + new Float: vl; + get_state(PART:"bg", st, 30, vl); + if (strcmp(st, "disabled")) { + emit("elm,action,unpress", ""); + } + } + } + program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "bg"; + script { + new st[31]; + new Float: vl; + get_state(PART:"bg", st, 30, vl); + if (strcmp(st, "disabled")) { + emit("elm,action,click", ""); + } + } + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + script{ + set_state(PART:"bg", "focused", 0.0); + set_state(PART:"elm.text", "focused", 0.0); + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script{ + set_state(PART:"bg", "dedfault", 0.0); + set_state(PART:"elm.text", "default", 0.0); + } + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + script{ + set_state(PART:"bg", "dedfault", 0.0); + set_state(PART:"elm.text", "default", 0.0); + } + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + script{ + set_state(PART:"bg", "disabled", 0.0); + set_state(PART:"elm.text", "disabled", 0.0); + } + } + } +} + +group { + name: "elm/button/base/add_common_btn"; + images { + image: MUSIC_IMAGE_ADDBTN_BG_NORMAL COMP; + image: MUSIC_IMAGE_ADDBTN_BG_FOCUS COMP; + } + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + min: 214 62; + image { + normal: MUSIC_IMAGE_ADDBTN_BG_NORMAL; + border: 30 30 30 30; + border_scale: 1; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + image.normal: MUSIC_IMAGE_ADDBTN_BG_FOCUS; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 255 255 255 102; + } + } + part { + name: "var_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 62; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + fixed: 1 1; + align: 0 0; + } + } + part { + name: MUSIC_PART_ELM_SWALLOWICON; + type: SWALLOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 30 62; + rel1 { + to: "var_padding"; + relative: 1.0 0.0; + } + rel2 { + to: "var_padding"; + relative: 1.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + aspect: 1.0 1.0; + color: 255 255 255 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 255 255 255 102; + } + } + part { + name: "padding_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 5 62; + rel1 { + to: MUSIC_PART_ELM_SWALLOWICON; + relative: 1.0 0.0; + } + rel2 { + to: MUSIC_PART_ELM_SWALLOWICON; + relative: 1.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 115 62; + rel1 { + to: "padding_text"; + relative: 1.0 0.0; + } + rel2 { + to: "padding_text"; + relative: 1.0 0.0; + } + text { + font: FONT_STYLE_REGULAR; + size: 26; + align: 0.0 0.5; + } + color: 255 255 255 255; + fixed: 1 1; + align: 0.0 0.0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text { + font: FONT_STYLE_BOLD; + } + color: 255 255 255 255; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + text { + font: FONT_STYLE_REGULAR; + } + color: 255 255 255 102; + } + } + } + programs { + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_mouseup"; + signal: "mouse,up,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + script { + set_state(PART:"bg", "focused", 0.0); + set_state(PART:"elm.text", "focused", 0.0); + set_state(PART:MUSIC_PART_ELM_SWALLOWICON, "focused", 0.0); + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + set_state(PART:"bg", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:MUSIC_PART_ELM_SWALLOWICON, "default", 0.0); + } + } + program { + name: "enabled"; + signal: "elm,state,enabled"; + source: "elm"; + script { + set_state(PART:"bg","default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:MUSIC_PART_ELM_SWALLOWICON, "default", 0.0); + } + } + program { + name: "disablebg"; + signal: "elm,state,disabled"; + source: "elm"; + script { + set_state(PART:"bg","disabled", 0.0); + set_state(PART:"elm.text", "disabled", 0.0); + set_state(PART:MUSIC_PART_ELM_SWALLOWICON, "disabled", 0.0); + } + } + } +} + +group { + name: "elm/button/base/add_play_btn"; + inherit: "elm/button/base/add_common_btn"; + parts { + part { + name: "var_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 61 62; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + fixed: 1 1; + align: 0 0; + } + } + } +} + +group { + name: "elm/button/base/add_next_btn"; + inherit: "elm/button/base/add_common_btn"; + parts { + part { + name: "var_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 32 62; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + fixed: 1 1; + align: 0 0; + } + } + } +} + +group { + name: "elm/button/base/add_last_btn"; + inherit: "elm/button/base/add_common_btn"; + parts { + part { + name: "var_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 35 62; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + fixed: 1 1; + align: 0 0; + } + } + } +} + +group { + name: "elm/button/base/music_listbtn"; + images { + image: MUSIC_IMAGE_ADDBTN_BG_NORMAL COMP; + image: MUSIC_IMAGE_ADDBTN_BG_FOCUS COMP; + } + parts { + part { + name: "bg"; + scale: 1; + description { + state: "default" 0.0; + min: 214 62; + image { + normal: MUSIC_IMAGE_ADDBTN_BG_NORMAL; + border: 30 30 30 30; + border_scale: 1; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + image.normal: MUSIC_IMAGE_ADDBTN_BG_FOCUS; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 255 255 255 102; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 185 62; + rel1 { + to: "bg"; + relative: 0.5 0.0; + } + rel2 { + to: "bg"; + relative: 0.5 0.0; + } + text { + font: FONT_STYLE_REGULAR; + size: 26; + align: 0.5 0.5; + } + color: 255 255 255 255; + fixed: 1 1; + align: 0.5 0.0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text { + font: FONT_STYLE_BOLD; + } + color: 255 255 255 255; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + text { + font: FONT_STYLE_REGULAR; + } + color: 255 255 255 102; + } + } + } + programs { + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_mouseup"; + signal: "mouse,up,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + script { + set_state(PART:"bg", "focused", 0.0); + set_state(PART:"elm.text", "focused", 0.0); + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + set_state(PART:"bg", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + } + } + program { + name: "enabled"; + signal: "elm,state,enabled"; + source: "elm"; + script { + set_state(PART:"bg","default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + } + } + program { + name: "disablebg"; + signal: "elm,state,disabled"; + source: "elm"; + script { + set_state(PART:"bg","disabled", 0.0); + set_state(PART:"elm.text", "disabled", 0.0); + } + } + } +} + +group { + name: "elm/button/base/music_middletext_btn"; + script { + public bottom; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 360 80; + color: 255 255 255 255; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + } + part { + name: "division_line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 360 2; + color: 222 222 222 255; + rel1 { + to: "bg"; + relative: 1.0 1.0; + } + rel2 { + to: "bg"; + } + align: 1.0 1.0; + fixed: 1 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "padding_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 40 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 1.0; + } + fixed: 1 0; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 260 80; + rel1 { + to: "padding_text"; + relative: 1.0 0.0; + } + rel2 { + to: "padding_text"; + } + text { + font: FONT_STYLE_REGULAR; + size: 30; + align: 0.0 0.5; + } + color: 89 89 89 255; + fixed: 1 1; + align: 0.0 0.0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + text { + font: FONT_STYLE_MEDIUM; + } + color: 255 255 255 255; + } + } + part { + name: "uparrow"; + description { + state: "default" 0.0; + min: 17 10; + visible: 0; + } + } + } + programs { + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_mouseup"; + signal: "mouse,up,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "bg"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + script { + set_state(PART:"bg", "selected", 0.0); + set_state(PART:"division_line", "hide", 0.0); + set_state(PART:"elm.text", "selected", 0.0); + set_state(PART:"uparrow", "selected", 0.0); + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + set_state(PART:"bg", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"uparrow", "default", 0.0); + if (get_int(bottom) != 1) + set_state(PART:"division_line", "default", 0.0); + } + } + program { + name: "hide_line"; + signal: MUSIC_SIGNAL_HIDELINE; + source: MUSIC_CONTEXT_VIEW; + script { + set_int(bottom, 1); + set_state(PART:"division_line", "hide", 0.0); + } + } + } +} +group { + name: "elm/button/base/music_toptext_btn"; + inherit: "elm/button/base/music_middletext_btn"; + images { + image: MUSIC_IMAGE_PLAYBACK_ROUNDT_ICON COMP; + image: MUSIC_IMAGE_POPUP_UP_ARROW COMP; + } + parts { + part { + name: "total_area"; + scale: 1; + type: RECT; + description { + state: "default" 0.0; + min: 360 90; + color: 0 0 0 0; + } + } + part { + name: "padding_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 10; + align: 0.0 0.0; + fixed: 1 1; + rel1.to: "total_area"; + rel2 { + relative: 0.0 0.0; + to: "total_area"; + } + visible: 0; + } + } + part { + name: "bg"; + scale: 1; + type: IMAGE; + description { + state: "default" 0.0; + min: 360 80; + align: 0 0; + fixed: 1 1; + color: 255 255 255 255; + rel1.to: "padding_bg"; + rel1.relative: 1.0 1.0; + rel2.to: "padding_bg"; + image { + normal: MUSIC_IMAGE_PLAYBACK_ROUNDT_ICON; + border: 4 4 4 4; + border_scale: 1; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + } + part { + name: "padding.uparrow"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 300 0; + align: 0.0 1.0; + fixed: 1 1; + rel1.to: "bg"; + rel2 { + relative: 0.0 0.0; + to: "bg"; + } + visible: 0; + } + } + part { + name: "uparrow"; + scale: 1; + description { + state: "default" 0.0; + min: 17 10; + align: 0.0 1.0; + fixed: 1 1; + image.normal: MUSIC_IMAGE_POPUP_UP_ARROW; + rel1 { + relative: 1.0 0.0; + to: "padding.uparrow"; + } + rel2 { + relative: 1.0 0.0; + to: "padding.uparrow"; + } + visible: 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + } + } +} +group { + name: "elm/button/base/music_bottomtext_btn"; + inherit: "elm/button/base/music_middletext_btn"; + images { + image: MUSIC_IMAGE_PLAYBACK_ROUNDB_ICON COMP; + } + parts { + part { + name: "bg"; + scale: 1; + type: IMAGE; + description { + state: "default" 0.0; + min: 360 80; + color: 255 255 255 255; + image { + normal: MUSIC_IMAGE_PLAYBACK_ROUNDB_ICON; + border: 4 4 4 4; + border_scale: 1; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + } + } +} \ No newline at end of file diff --git a/res/edc/widgets/ctxpopup.edc b/res/edc/widgets/ctxpopup.edc new file mode 100755 index 0000000..f385bc0 --- /dev/null +++ b/res/edc/widgets/ctxpopup.edc @@ -0,0 +1,27 @@ +group { name: "elm/ctxpopup/base/music-common-popup"; + parts { + part { + name: "elm.swallow.content"; + type: SWALLOW; + description { + state: "default" 0.0; + } + } + } +} + +group { + name, "elm/ctxpopup/base/music_listpopup"; + parts { + part { + name: "elm.swallow.content"; + type: SWALLOW; + description { + state: "default" 0.0; + min: 360 810; + max: 360 810; + align: 0 0; + } + } + } +} diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc new file mode 100644 index 0000000..7e884b3 --- /dev/null +++ b/res/edc/widgets/gengrid.edc @@ -0,0 +1,441 @@ +group { + name: "elm/gengrid/item/music_albumgrid/default"; + data.item: "selectraise" "on"; + data.item: "texts" "elm.text elm.text1"; + data.item: "contents" "elm.swallow.icon"; + parts { + part { + name: "bg_with_border"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 263+20 359+20; + color: 0 0 0 0; + } + } + part { + name: "map"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + perspective { + zplane: 0; + focal: 1000; + } + visible: 0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + perspective.zplane: 50; + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + perspective.zplane: -100; + } + } + part { + name: "elm.bg"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 263 263; + rel1.to:"bg_with_border"; + rel2.to:"bg_with_border"; + rel2.relative: 0.0 0.0; + color: 0 0 0 76; + fixed: 1 1; + align: 0.0 0.0; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + part { + name: "icon_bg"; + scale: 1; + type: RECT; + description { + state: "default" 0.0; + min: 263 263; + rel1 { + to: "elm.bg"; + } + rel2 { + to: "elm.bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + color: 0 0 0 76; + fixed: 1 1; + aspect: 1.0 1.0; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + part { + name: "elm.swallow.icon"; + scale: 1; + type: SWALLOW; + description { + state: "default" 0.0; + rel1.to: "icon_bg"; + rel2.to: "icon_bg"; + align: 0.5 0.5; + fixed: 1 1; + aspect: 1.0 1.0; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + part { name: "left_over"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 8 263; + rel1.to:"icon_bg"; + rel2.to:"icon_bg"; + rel2.relative: 0.0 0.0; + color: 229 72 113 0; + fixed: 1 1; + align: 0.0 0.0; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + map.on: 1; + } + } + part { name: "right_over"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 8 263; + rel1.to:"icon_bg"; + rel1.relative: 1.0 0.0; + rel2.to:"icon_bg"; + rel2.relative: 1.0 0.0; + color: 229 72 113 0; + fixed: 1 1; + align: 1.0 0.0; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + map.on: 1; + } + } + part { name: "top_over"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 263-16 8; + rel1.to: "left_over"; + rel1.relative: 1.0 0.0; + rel2.to: "right_over"; + rel2.relative: 0.0 0.0; + color: 229 72 113 0; + fixed: 1 1; + align: 0.0 0.0; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + map.on: 1; + } + } + part { name: "bottom_bg"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 263 96; + rel1.to:"icon_bg"; + rel1.relative: 0.0 1.0; + rel2.to:"icon_bg"; + rel2.relative: 0.0 1.0; + fixed: 1 1; + align: 0.0 0.0; + color: 0 0 0 76; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + map.on: 1; + } + } + part { name: "bottom_over"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 263 96; + rel1.to:"icon_bg"; + rel1.relative: 0.0 1.0; + rel2.to:"icon_bg"; + rel2.relative: 0.0 1.0; + fixed: 1 1; + align: 0.0 0.0; + color: 229 72 113 0; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + map.on: 1; + } + } + part { + name: "padding_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 20 16; + rel1 { + to: "icon_bg"; + relative: 0.0 1.0; + } + rel2 { + to: "icon_bg"; + relative: 0.0 1.0; + } + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: "elm.text"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 223 40; + max: 223 40; + text { + font: FONT_STYLE_MEDIUM; + size: 30; + } + rel1 { + to: "padding_text"; + relative: 1 1; + } + rel2 { + to: "padding_text"; + } + fixed: 1 1; + align: 0.0 0.0; + color: 211 211 211 255; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + map.on: 1; + } + } + part { + name: "elm.padding.text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 40; + rel1 { + to: "elm.text"; + } + rel2 { + to: "elm.text"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: "elm.text1"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 223 25; + max: 223 25; + text { + font: FONT_STYLE_REGULAR; + size: 22; + } + rel1 { + to: "elm.padding.text"; + relative: 1 1; + } + rel2 { + to: "elm.padding.text"; + } + fixed: 1 1; + align: 0.0 0.0; + color: 128 128 128 255; + map { + on: 0; + perspective_on: 1; + alpha: 1; + perspective: "map"; + } + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + map.on: 1; + } + } + } + programs { + program { + name: "go_active"; + signal: "elm,state,focused"; + source: "elm"; + action: STATE_SET "selected" 0.0; + target: "elm.swallow.icon"; + target: "elm.text"; + target: "elm.text1"; + target: "bottom_over"; + target: "left_over"; + target: "top_over"; + target: "right_over"; + target: "elm.bg"; + target: "icon_bg"; + target: "bottom_bg"; + //target: "map"; + transition: LINEAR 0.3; + } + program { + name: "go_passive"; + signal: "elm,state,unfocused"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.icon"; + target: "elm.text"; + target: "elm.text1"; + target: "bottom_over"; + target: "left_over"; + target: "top_over"; + target: "right_over"; + target: "elm.bg"; + target: "icon_bg"; + target: "bottom_bg"; + //target: "map"; + transition: LINEAR 0.3; + } + program { + name: "button_activated"; + signal: "elm,state,activated"; + source: "elm"; + action: STATE_SET "clicked" 0.0; + target: "map"; + transition: DECELERATE 0.2; + after: "after_clicked"; + } + program { + name: "button_clicked"; + signal: "elm,state,selected"; + source: "elm"; + action: STATE_SET "clicked" 0.0; + target: "map"; + transition: DECELERATE 0.2; + after: "after_clicked"; + } + program { + name: "after_clicked"; + action: STATE_SET "default" 0.0; + target: "map"; + transition: DECELERATE 0.2; + after: "item_select"; + } + program { + name: "item_select"; + action: SIGNAL_EMIT MUSIC_SIGNAL_BTN_CLICKED MUSIC_BASE_VIEW; + } + } +} + diff --git a/res/edc/widgets/genlist.edc b/res/edc/widgets/genlist.edc new file mode 100644 index 0000000..b85b059 --- /dev/null +++ b/res/edc/widgets/genlist.edc @@ -0,0 +1,1528 @@ +group { + name: "elm/genlist/item/music_songlist/default"; + data.item: "selectraise" "on"; + data.item: "focusraise" "on"; + data.item: "texts" "elm.text elm.text1 elm.text2 elm.text3"; + data.item: "contents" "elm.swallow.icon"; + parts { + part { + name: "bg"; + type: RECT; + description { + state: "default" 0.0; + min: 1395 87; + color: 0 0 0 39; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "default_odd" 0.0; + min: 1395 87; + color: 0 0 0 77; + } + } + part { + name: "elm.swallow.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 4 4; + align: 0.0 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + } + } + part { + name: "icon_bg"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 79 79; + align: 0.0 0.0; + rel1 { + to: "elm.swallow.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.swallow.pad"; + } + color: 18 5 8 255; + } + } + part { + name: "elm.swallow.icon"; + type: SWALLOW; + description { + state: "default" 0.0; + fixed: 1 1; + min: 79 79; + align: 0.0 0.0; + aspect: 1.0 1.0; + rel1 { + to: "elm.swallow.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.swallow.pad"; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 201 66 102 204; + } + } + part { + name: "elm.text.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 108 0; + align: 0.0 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 557 87; + align: 0.0 0.0; + rel1 { + to: "elm.text.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text.pad"; + } + text { + font: FONT_STYLE_MEDIUM; + size: 30; + align: 0 0.5; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text.font: FONT_STYLE_BOLD; + color: 255 255 255 255; + } + } + part { + name: "elm.text1.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 700 0; + align: 0.0 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text1"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 275 87; + align: 0.0 0.0; + rel1 { + to: "elm.text1.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text1.pad"; + } + text { + font: FONT_STYLE_MEDIUM; + size: 30; + align: 0 0.5; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text.font: FONT_STYLE_BOLD; + color: 255 255 255 255; + } + } + part { + name: "elm.text2.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 1010 0; + align: 0.0 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text2"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 225 87; + align: 0.0 0.0; + rel1 { + to: "elm.text2.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text2.pad"; + } + text { + font: FONT_STYLE_MEDIUM; + size: 30; + align: 0 0.5; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text.font: FONT_STYLE_BOLD; + color: 255 255 255 255; + } + } + part { + name: "elm.text3.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 1270 0; + align: 0.0 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text3"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 90 87; + align: 0.0 0.0; + rel1 { + to: "elm.text3.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text3.pad"; + } + text { + font: FONT_STYLE_MEDIUM; + size: 30; + align: 1 0.5; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text.font: FONT_STYLE_BOLD; + color: 255 255 255 255; + } + } + } + script { + public evenodd_status = 0; + } + programs { + program { + name: "go_active"; + signal: "elm,state,focused"; + source: "elm"; + script { + set_state(PART:"bg", "focused", 0.0); + set_state(PART:"elm.swallow.icon", "focused", 0.0); + set_state(PART:"elm.text", "focused", 0.0); + set_state(PART:"elm.text1", "focused", 0.0); + set_state(PART:"elm.text2", "focused", 0.0); + set_state(PART:"elm.text3", "focused", 0.0); + } + } + program { + name: "go_passive"; + signal: "elm,state,unfocused"; + source: "elm"; + script { + if (get_int(evenodd_status) == 0) { + set_state(PART:"bg", "default", 0.0); + } else { + set_state(PART:"bg", "default_odd", 0.0); + } + set_state(PART:"elm.swallow.icon", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"elm.text1", "default", 0.0); + set_state(PART:"elm.text2", "default", 0.0); + set_state(PART:"elm.text3", "default", 0.0); + } + } + program { + name: "even_row"; + signal: MUSIC_SIGNAL_EVEN_ROW; + source: MUSIC_BASE_VIEW; + script { + set_int(evenodd_status, 0); + set_state(PART:"bg", "default", 0.0); + } + } + program { + name: "odd_row"; + signal: MUSIC_SIGNAL_ODD_ROW; + source: MUSIC_BASE_VIEW; + script { + set_int(evenodd_status, 1); + set_state(PART:"bg", "default_odd", 0.0); + } + } + } +} + +group { + name: "elm/genlist/item/music_album_songlist/default"; + data.item: "selectraise" "on"; + data.item: "focusraise" "on"; + data.item: "texts" "elm.text elm.text1 elm.text2 elm.text3"; + parts { + part { + name: "bg"; + type: RECT; + description { + state: "default" 0.0; + min: 1395 87; + color: 0 0 0 39; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "default_odd" 0.0; + min: 1395 87; + color: 0 0 0 77; + } + } + part { + name: "elm.text.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 25 0; + align: 0.0 0.0; + rel1.to: bg; + rel2 { + to: bg; + relative: 0.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 40 87; + align: 0.0 0.0; + rel1 { + to: "elm.text.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text.pad"; + } + text { + font: FONT_STYLE_REGULAR; + size: 22; + align: 0.5 0.5; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "elm.text1.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 20 0; + align: 0.0 0.0; + rel1 { + to: "elm.text"; + relative: 1.0 0.0; + } + rel2 { + to: "elm.text"; + relative: 1.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text1"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 840 87; + align: 0.0 0.0; + rel1 { + to: "elm.text1.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text1.pad"; + } + text { + font: FONT_STYLE_REGULAR; + size: 30; + align: 0.0 0.5; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "elm.text2.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 35 0; + rel1 { + to: "elm.text1"; + relative: 1.0 0.0; + } + rel2 { + to: "elm.text1"; + relative: 1.0 0.0; + } + align: 0.0 0.0; + visible: 0; + } + } + part { + name: "elm.text2"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 275 87; + align: 0.0 0.0; + rel1 { + to: "elm.text2.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text2.pad"; + } + text { + font: FONT_STYLE_REGULAR; + size: 30; + align: 0.0 0.5; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "elm.text3.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 35 0; + rel1 { + to: "elm.text2"; + relative: 1.0 0.0; + } + rel2 { + to: "elm.text2"; + relative: 1.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text3"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 90 87; + align: 0.0 0.0; + rel1 { + to: "elm.text3.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text3.pad"; + } + text { + font: FONT_STYLE_REGULAR; + size: 30; + align: 1.0 0.5; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + } + script { + public evenodd_status = 0; + } + programs { + program { + name: "go_active"; + signal: "elm,state,focused"; + source: "elm"; + script { + set_state(PART:"bg", "focused", 0.0); + set_state(PART:"elm.text", "focused", 0.0); + set_state(PART:"elm.text1", "focused", 0.0); + set_state(PART:"elm.text2", "focused", 0.0); + set_state(PART:"elm.text3", "focused", 0.0); + } + } + program { + name: "go_passive"; + signal: "elm,state,unfocused"; + source: "elm"; + script { + if (get_int(evenodd_status) == 0) { + set_state(PART:"bg", "default", 0.0); + } else { + set_state(PART:"bg", "default_odd", 0.0); + } + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"elm.text1", "default", 0.0); + set_state(PART:"elm.text2", "default", 0.0); + set_state(PART:"elm.text3", "default", 0.0); + } + } + program { + name: "even_row"; + signal: MUSIC_SIGNAL_EVEN_ROW; + source: MUSIC_BASE_VIEW; + script { + set_int(evenodd_status, 0); + set_state(PART:"bg", "default", 0.0); + } + } + program { + name: "odd_row"; + signal: MUSIC_SIGNAL_ODD_ROW; + source: MUSIC_BASE_VIEW; + script { + set_int(evenodd_status, 1); + set_state(PART:"bg", "default_odd", 0.0); + } + } + } +} + +group { + name: "elm/genlist/item/music_playlist/default"; + data.item: "selectraise" "on"; + data.item: "focusraise" "on"; + data.item: "texts" "elm.text0 elm.text1 elm.text2 elm.text3 elm.text4"; + data.item: "contents" "elm.swallow.icon"; + images { + image: MUSIC_IMAGE_PLAY_ICON COMP; + image: MUSIC_IMAGE_UNCHECK_NORMAL COMP; + image: MUSIC_IMAGE_UNCHECK_FOCUS COMP; + image: MUSIC_IMAGE_UNCHECK_DIM COMP; + image: MUSIC_IMAGE_CHECK_NORMAL COMP; + image: MUSIC_IMAGE_CHECK_FOCUS COMP; + image: MUSIC_IMAGE_CHECK_DIM COMP; + } + parts { + part { + name: "bg"; + type: RECT; + description { + state: "default" 0.0; + min: 1045 106; + color: 0 0 0 0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "default_odd" 0.0; + min: 1045 106; + color: 0 0 0 39; + } + } + part { + name: "check.image.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 0 0; + align: 0.0 0.0; + rel1.to: bg; + rel2 { + to: bg; + relative: 0.0 0.0; + } + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + min: 64 38; + } + } + part { + name: "check.image"; + description { + state: "default" 0.0; + fixed: 1 1; + min: 0 0; + align: 1.0 0.0; + aspect: 1.0 1.0; + rel1 { + to: "check.image.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "check.image.pad"; + } + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + min: 30 30; + image.normal: MUSIC_IMAGE_UNCHECK_NORMAL; + visible: 1; + } + description { + state: "focused" 0.0; + inherit: "visible" 0.0; + image.normal: MUSIC_IMAGE_UNCHECK_FOCUS; + } + description { + state: "disabled" 0.0; + inherit: "visible" 0.0; + image.normal: MUSIC_IMAGE_UNCHECK_DIM; + } + description { + state: "visible" 0.1; + inherit: "visible" 0.0; + image.normal: MUSIC_IMAGE_CHECK_NORMAL; + } + description { + state: "focused" 0.1; + inherit: "visible" 0.0; + image.normal: MUSIC_IMAGE_CHECK_FOCUS; + } + description { + state: "disabled" 0.1; + inherit: "visible" 0.0; + image.normal: MUSIC_IMAGE_CHECK_DIM; + } + } + part { + name: "elm.text0.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 18 0; + align: 0.0 0.0; + rel1 { + to: "check.image.pad"; + relative: 1.0 0.0; + } + rel2 { + to: "check.image.pad"; + relative: 1.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text0"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 40 106; + align: 0.0 0.0; + rel1 { + to: "elm.text0.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text0.pad"; + } + text { + font: FONT_STYLE_REGULAR; + size: 22; + align: 0.5 0.5; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text.font: FONT_STYLE_BOLD; + color: 255 255 255 255; + } + description { + state: "focused" 0.1; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "default" 0.1; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "elm.image.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 25 40; + align: 0.0 0.0; + rel1 { + to: "check.image.pad"; + relative: 1.0 0.0; + } + rel2 { + to: "check.image.pad"; + relative: 1.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.image"; + description { + state: "default" 0.0; + fixed: 1 1; + min: 26 26; + align: 0.0 0.0; + aspect: 1.0 1.0; + rel1 { + to: "elm.image.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.image.pad"; + } + image.normal: MUSIC_IMAGE_PLAY_ICON; + visible: 0; + } + description { state: "focused" 0.0; + inherit: "default" 0.0; + } + description { + state: "default" 0.1; + inherit: "default" 0.0; + color: 229 72 113 255; + visible: 1; + } + description { + state: "focused" 0.1; + inherit: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + } + part { + name: "elm.swallow.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 18 9; + align: 0.0 0.0; + rel1 { + to: "elm.text0"; + relative: 1.0 0.0; + } + rel2 { + to: "elm.text0"; + relative: 1.0 0.0; + } + visible: 0; + } + } + part { + name: "icon_bg"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 88 88; + align: 0.0 0.0; + rel1 { + to: "elm.swallow.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.swallow.pad"; + } + color: 18 5 8 255; + } + } + part { + name: "elm.swallow.icon"; + type: SWALLOW; + description { + state: "default" 0.0; + fixed: 1 1; + min: 88 88; + align: 0.0 0.0; + aspect: 1.0 1.0; + rel1 { + to: "elm.swallow.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.swallow.pad"; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 201 66 102 204; + } + } + part { + name: "elm.text3.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 1045-34-93 0; + align: 0.0 0.0; + rel1.to: bg; + rel2 { + to: bg; + relative: 0.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text3"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 93 106; + align: 0.0 0.0; + rel1 { + to: "elm.text3.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text3.pad"; + } + text { + font: FONT_STYLE_MEDIUM; + size: 30; + align: 0 0.5; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text.font: FONT_STYLE_BOLD; + color: 255 255 255 255; + } + description { + state: "default" 0.1; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "focused" 0.1; + inherit: "focused" 0.0; + } + } + part { + name: "elm.text1.leftpad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 26 16; + align: 0.0 0.0; + rel1 { + to: "elm.swallow.icon"; + relative: 1.0 0.0; + } + rel2 { + to: "elm.swallow.icon"; + relative: 1.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text1.rightpad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 25 25+35; + align: 1.0 0.0; + rel1 { + to: "elm.text3"; + } + rel2 { + to: "elm.text3"; + relative: 0.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text1"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + /*min: 639 34; + max: 703 34;*/ + align: 0.0 0.0; + rel1 { + to: "elm.text1.leftpad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text1.rightpad"; + relative: 0.0 1.0; + } + text { + font: FONT_STYLE_REGULAR; + size: 30; + align: 0 0; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text.font: FONT_STYLE_BOLD; + color: 255 255 255 255; + } + description { + state: "default" 0.1; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "focused" 0.1; + inherit: "focused" 0.0; + } + } + part { + name: "elm.text2"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + /*min: 639 26; + max: 703 26;*/ + min: 0 25; + align: 0.0 0.0; + rel1 { + to: "elm.text1"; + relative: 0.0 1.0; + } + rel2 { + to: "elm.text1"; + relative: 1.0 1.0; + } + text { + font: FONT_STYLE_MEDIUM; + size: 22; + align: 0 0; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text.font: FONT_STYLE_BOLD; + color: 255 255 255 255; + } + description { + state: "default" 0.1; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "focused" 0.1; + inherit: "focused" 0.0; + } + } + } + script { + public focus_status; + public select_status; + public edit_mode; + public check_status; + public evenodd_status; + } + programs { + program { + name: "go_focused"; + signal: "elm,state,focused"; + source: "elm"; + script { + set_int(focus_status, 1); + set_state(PART:"bg", "focused", 0.0); + set_state(PART:"elm.swallow.icon", "focused", 0.0); + if (get_int(select_status) == 1) { + set_state(PART:"elm.image", "focused", 0.1); + set_state(PART:"elm.text0", "focused", 0.1); + set_state(PART:"elm.text1", "focused", 0.1); + set_state(PART:"elm.text2", "focused", 0.1); + set_state(PART:"elm.text3", "focused", 0.1); + } else { + set_state(PART:"elm.image", "focused", 0.0); + set_state(PART:"elm.text0", "focused", 0.0); + set_state(PART:"elm.text1", "focused", 0.0); + set_state(PART:"elm.text2", "focused", 0.0); + set_state(PART:"elm.text3", "focused", 0.0); + } + if (get_int(edit_mode) == 1) { + if (get_int(check_status) == 1) { + set_state(PART:"check.image", "focused", 0.1); + } else { + set_state(PART:"check.image", "focused", 0.0); + } + } + } + } + program { + name: "go_unfocused"; + signal: "elm,state,unfocused"; + source: "elm"; + script { + set_int(focus_status, 0); + if (get_int(evenodd_status) == 0) { + set_state(PART:"bg", "default", 0.0); + } else { + set_state(PART:"bg", "default_odd", 0.0); + } + set_state(PART:"elm.swallow.icon", "default", 0.0); + if (get_int(select_status) == 1) { + set_state(PART:"elm.image", "default", 0.1); + set_state(PART:"elm.text0", "default", 0.1); + set_state(PART:"elm.text1", "default", 0.1); + set_state(PART:"elm.text2", "default", 0.1); + set_state(PART:"elm.text3", "default", 0.1); + } else { + set_state(PART:"elm.image", "default", 0.0); + set_state(PART:"elm.text0", "default", 0.0); + set_state(PART:"elm.text1", "default", 0.0); + set_state(PART:"elm.text2", "default", 0.0); + set_state(PART:"elm.text3", "default", 0.0); + } + if (get_int(edit_mode) == 1) { + if (get_int(check_status) == 1) { + set_state(PART:"check.image", "visible", 0.1); + } else { + set_state(PART:"check.image", "visible", 0.0); + } + } + } + } + program { + name: "go_selected"; + signal: MUSIC_SIGNAL_SELECT_ITEM; + source: MUSIC_PLAYBACK_VIEW; + script { + set_int(select_status, 1); + if (get_int(focus_status) == 1) { + set_state(PART:"elm.image", "focused", 0.1); + set_state(PART:"elm.text0", "focused", 0.1); + set_state(PART:"elm.text1", "focused", 0.1); + set_state(PART:"elm.text2", "focused", 0.1); + set_state(PART:"elm.text3", "focused", 0.1); + } else { + set_state(PART:"elm.image", "default", 0.1); + set_state(PART:"elm.text0", "default", 0.1); + set_state(PART:"elm.text1", "default", 0.1); + set_state(PART:"elm.text2", "default", 0.1); + set_state(PART:"elm.text3", "default", 0.1); + } + } + } + program { + name: "go_unselected"; + signal: MUSIC_SIGNAL_UNSELECT_ITEM; + source: MUSIC_PLAYBACK_VIEW; + script { + set_int(select_status, 0); + if (get_int(focus_status) == 1) { + set_state(PART:"elm.image", "focused", 0.0); + set_state(PART:"elm.text0", "focused", 0.0); + set_state(PART:"elm.text1", "focused", 0.0); + set_state(PART:"elm.text2", "focused", 0.0); + set_state(PART:"elm.text3", "focused", 0.0); + } else { + set_state(PART:"elm.image", "default", 0.0); + set_state(PART:"elm.text0", "default", 0.0); + set_state(PART:"elm.text1", "default", 0.0); + set_state(PART:"elm.text2", "default", 0.0); + set_state(PART:"elm.text3", "default", 0.0); + } + } + } + program { + name: "show_check_boxes"; + signal: MUSIC_SIGNAL_EDITMODE_ON; + source: MUSIC_PLAYBACK_VIEW; + script { + set_int(edit_mode, 1); + set_state(PART:"check.image.pad", "visible", 0.0); + set_state(PART:"check.image", "visible", 0.0); + } + } + program { + name: "hide_check_boxes"; + signal: MUSIC_SIGNAL_EDITMODE_OFF; + source: MUSIC_PLAYBACK_VIEW; + script { + set_int(edit_mode, 0); + set_state(PART:"check.image.pad", "default", 0.0); + set_state(PART:"check.image", "default", 0.0); + } + } + program { + name: "check_enable"; + signal: MUSIC_SIGNAL_CHECK_ON; + source: MUSIC_PLAYBACK_VIEW; + script { + set_int(check_status, 1); + if (get_int(focus_status) == 1) { + set_state(PART:"check.image", "focused", 0.1); + } else { + set_state(PART:"check.image", "visible", 0.1); + } + } + } + program { + name: "check_disable"; + signal: MUSIC_SIGNAL_CHECK_OFF; + source: MUSIC_PLAYBACK_VIEW; + script { + set_int(check_status, 0); + if (get_int(focus_status) == 1) { + set_state(PART:"check.image", "focused", 0.0); + } else { + set_state(PART:"check.image", "visible", 0.0); + } + } + } + program { + name: "even_row"; + signal: MUSIC_SIGNAL_EVEN_ROW; + source: MUSIC_PLAYBACK_VIEW; + script { + set_int(evenodd_status, 0); + set_state(PART:"bg", "default", 0.0); + } + } + program { + name: "odd_row"; + signal: MUSIC_SIGNAL_ODD_ROW; + source: MUSIC_PLAYBACK_VIEW; + script { + set_int(evenodd_status, 1); + set_state(PART:"bg", "default_odd", 0.0); + } + } + program { + name: "check_clicked"; + signal: "mouse,clicked,1"; + source: "check.image"; + action: SIGNAL_EMIT MUSIC_SIGNAL_CHECK_CLICKED MUSIC_PLAYBACK_VIEW; + source: MUSIC_PLAYBACK_VIEW; + } + } +} + +group { + name: "elm/genlist/item/music_selectlist/default"; + data.item: "selectraise" "on"; + data.item: "focusraise" "on"; + data.item: "texts" "elm.text elm.text1 elm.text2"; + data.item: "contents" "elm.swallow.icon"; + images { + image: MUSIC_IMAGE_UNCHECK_NORMAL COMP; + image: MUSIC_IMAGE_UNCHECK_FOCUS COMP; + image: MUSIC_IMAGE_CHECK_NORMAL COMP; + image: MUSIC_IMAGE_CHECK_FOCUS COMP; + } + parts { + part { + name: "bg"; + type: RECT; + description { + state: "default" 0.0; + min: 1395 87; + color: 0 0 0 39; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 229 72 113 255; + } + description { + state: "default_odd" 0.0; + min: 1395 87; + color: 0 0 0 77; + } + } + part { + name: "check.image.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 34 28; + align: 0.0 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + } + } + part { + name: "check.image"; + description { + state: "default" 0.0; + fixed: 1 1; + min: 30 30; + align: 0.0 0.0; + aspect: 1.0 1.0; + image.normal: MUSIC_IMAGE_UNCHECK_NORMAL; + rel1 { + to: "check.image.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "check.image.pad"; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + image.normal: MUSIC_IMAGE_UNCHECK_FOCUS; + } + description { + state: "default" 0.1; + inherit: "default" 0.0; + image.normal: MUSIC_IMAGE_CHECK_NORMAL; + } + description { + state: "focused" 0.1; + inherit: "default" 0.0; + image.normal: MUSIC_IMAGE_CHECK_FOCUS; + } + } + part { + name: "elm.text.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 98 0; + align: 0.0 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 567 87; + align: 0.0 0.0; + rel1 { + to: "elm.text.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text.pad"; + } + text { + font: FONT_STYLE_MEDIUM; + size: 30; + align: 0 0.5; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text.font: FONT_STYLE_BOLD; + color: 255 255 255 255; + } + } + part { + name: "elm.text1.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 700 0; + align: 0.0 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text1"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 275 87; + align: 0.0 0.0; + rel1 { + to: "elm.text1.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text1.pad"; + } + text { + font: FONT_STYLE_MEDIUM; + size: 30; + align: 0 0.5; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text.font: FONT_STYLE_BOLD; + color: 255 255 255 255; + } + } + part { + name: "elm.text2.pad"; + type: RECT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 1010 0; + align: 0.0 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + } + } + part { + name: "elm.text2"; + type: TEXT; + description { + state: "default" 0.0; + fixed: 1 1; + min: 350 87; + align: 0.0 0.0; + rel1 { + to: "elm.text2.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "elm.text2.pad"; + } + text { + font: FONT_STYLE_MEDIUM; + size: 30; + align: 0 0.5; + } + color: 211 211 211 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text.font: FONT_STYLE_BOLD; + color: 255 255 255 255; + } + } + } + script { + public evenodd_status = 0; + public focus_status = 0; + public check_status = 0; + } + programs { + program { + name: "go_active"; + signal: "elm,state,focused"; + source: "elm"; + script { + set_int(focus_status, 1); + set_state(PART:"bg", "focused", 0.0); + set_state(PART:"elm.text", "focused", 0.0); + set_state(PART:"elm.text1", "focused", 0.0); + set_state(PART:"elm.text2", "focused", 0.0); + if (get_int(check_status) == 1) { + set_state(PART:"check.image", "focused", 0.1); + } else { + set_state(PART:"check.image", "focused", 0.0); + } + } + } + program { + name: "go_passive"; + signal: "elm,state,unfocused"; + source: "elm"; + script { + set_int(focus_status, 0); + if (get_int(evenodd_status) == 0) { + set_state(PART:"bg", "default", 0.0); + } else { + set_state(PART:"bg", "default_odd", 0.0); + } + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"elm.text1", "default", 0.0); + set_state(PART:"elm.text2", "default", 0.0); + if (get_int(check_status) == 1) { + set_state(PART:"check.image", "default", 0.1); + } else { + set_state(PART:"check.image", "default", 0.0); + } + } + } + program { + name: "even_row"; + signal: MUSIC_SIGNAL_EVEN_ROW; + source: MUSIC_BASE_VIEW; + script { + set_int(evenodd_status, 0); + set_state(PART:"bg", "default", 0.0); + } + } + program { + name: "odd_row"; + signal: MUSIC_SIGNAL_ODD_ROW; + source: MUSIC_BASE_VIEW; + script { + set_int(evenodd_status, 1); + set_state(PART:"bg", "default_odd", 0.0); + } + } + program { + name: "check_enable"; + signal: MUSIC_SIGNAL_CHECK_ON; + source: MUSIC_BASE_VIEW; + script { + set_int(check_status, 1); + if (get_int(focus_status) == 1) { + set_state(PART:"check.image", "focused", 0.1); + } else { + set_state(PART:"check.image", "default", 0.1); + } + } + } + program { + name: "check_disable"; + signal: MUSIC_SIGNAL_CHECK_OFF; + source: MUSIC_BASE_VIEW; + script { + set_int(check_status, 0); + if (get_int(focus_status) == 1) { + set_state(PART:"check.image", "focused", 0.0); + } else { + set_state(PART:"check.image", "default", 0.0); + } + } + } + } +} + diff --git a/res/edc/widgets/progressbar.edc b/res/edc/widgets/progressbar.edc new file mode 100644 index 0000000..f0ee4cf --- /dev/null +++ b/res/edc/widgets/progressbar.edc @@ -0,0 +1,369 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +group { + name: "elm/progressbar/horizontal/music_volume_bar"; + parts { + part { + name: "elm.background.progressbar"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + } + } + part { + name: "elm.swallow.bar"; + type: SWALLOW; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 0 28; + max: 99999 28; + rel1 { + to_x: "elm.text"; + to_y: "elm.background.progressbar"; + relative: 1.0 0.0; + } + rel2 { + to: "elm.background.progressbar"; + } + } + } + part { + name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + align: 0.0 0.5; + rel1 { + to_y: "elm.background.progressbar"; + } + rel2 { + relative: 0.0 1.0; + to_y: "elm.background.progressbar"; + } + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + fixed: 1 1; + align: 0.0 0.5; + rel1.to_x: "elm.swallow.content"; + rel1.relative: 1.0 0.0; + rel2.to_x: "elm.swallow.content"; + rel2.relative: 1.0 1.0; + color: 0 0 0 255; + text { + font: "Sans,Edje-Vera"; + size: 10; + min: 0 0; + align: 0.0 0.5; + } + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + text.min: 1 1; + } + } + part { + name: "background"; + type: RECT; + mouse_events: 0; + clip_to: "elm.background.progressbar"; + scale: 1; + description { + state: "default" 0.0; + min: 0 14; + max: 9999 14; + rel1.to: "elm.swallow.bar"; + rel2.to: "elm.swallow.bar"; + color, 255 255 255 25; + } + } + part { + name: "elm.text.status"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + visible: 0; + rel1 { + to: "background"; + relative: 0.5 0.5; + } + rel2 { + to: "background"; + relative: 0.5 0.5; + } + text { + font: "Sans:style=Bold,Edje-Vera-Bold"; + size: 10; + min: 1 1; + align: 0.5 0.0; + } + color: 0 0 0 255; + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + text.min: 0 0; + } + } + part { + name: "elm.progress.progressbar"; + type, RECT; + mouse_events: 0; + scale: 1; + clip_to: "elm.background.progressbar"; + description { + state: "default" 0.0; + min: 0 14; + max: 9999 14; + fixed: 1 1; + rel1.to: "elm.swallow.bar"; + rel2 { + to_y: "elm.swallow.bar"; + to_x: "elm.cur.progressbar"; + } + color, 229 72 113 255; + } + description { + state: "invert" 0.0; + inherit: "default" 0.0; + rel1 { + to_y: "elm.swallow.bar"; + to_x: "elm.cur.progressbar"; + } + rel2.to: "elm.swallow.bar"; + } + description { + state: "state_begin" 0.0; + inherit: "default" 0.0; + rel1.to: "elm.swallow.bar"; + rel2 { + to: "elm.swallow.bar"; + relative: 0.1 1.0; + } + } + description { + state: "state_end" 0.0; + inherit: "default" 0.0; + rel1 { + to: "elm.swallow.bar"; + relative: 0.9 0.0; + } + rel2.to: "elm.swallow.bar"; + } + } + part { + name: "text-bar"; + type: TEXT; + mouse_events: 0; + clip_to: "progress-rect"; + effect: SOFT_SHADOW; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + rel1.to: "elm.text.status"; + rel2.to: "elm.text.status"; + text { + text_source: "elm.text.status"; + font: "Sans:style=Bold,Edje-Vera-Bold"; + size: 10; + min: 1 1; + align: 0.0 0.0; + } + color: 224 224 224 255; + color3: 0 0 0 64; + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + text.min: 0 0; + } + } + part { + name: "elm.cur.progressbar"; + mouse_events: 0; + scale: 1; + dragable { + confine: "background"; + x: 1 1 1; + y: 0 0 0; + } + description { + state: "default" 0.0; + min: 0 28; + fixed: 1 1; + visible: 0; + rel1 { + to: "background"; + relative: 0 0; + } + rel2.to: "background"; + } + } + part { + name: "progress-rect"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "elm.progress.progressbar"; + rel2.to: "elm.progress.progressbar"; + } + } + } + programs { + program { + name: "label_show"; + signal: "elm,state,text,visible"; + source: "elm"; + action: STATE_SET "visible" 0.0; + target: "elm.text"; + } + program { + name: "label_hide"; + signal: "elm,state,text,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + } + program { + name: "icon_show"; + signal: "elm,state,icon,visible"; + source: "elm"; + action: STATE_SET "visible" 0.0; + target: "elm.swallow.content"; + } + program { + name: "icon_hide"; + signal: "elm,state,icon,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.content"; + } + program { + name: "units_show"; + signal: "elm,state,units,visible"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "text-bar"; + target: "elm.text.status"; + } + program { + name: "units_hide"; + signal: "elm,state,units,hidden"; + source: "elm"; + action: STATE_SET "hidden" 0.0; + target: "text-bar"; + target: "elm.text.status"; + } + program { + name: "slide_to_end"; + action: STATE_SET "state_end" 0.0; + transition: LINEAR 0.5; + target: "elm.progress.progressbar"; + after: "slide_to_begin"; + } + program { + name: "slide_to_begin"; + signal: "elm,state,slide,begin"; + action: STATE_SET "state_begin" 0.0; + target: "elm.progress.progressbar"; + transition: LINEAR 0.5; + after: "slide_to_end"; + } + program { + name: "start_pulse"; + signal: "elm,state,pulse,start"; + source: "elm"; + after: "slide_to_end"; + } + program { + name: "stop_pulse"; + signal: "elm,state,pulse,stop"; + source: "elm"; + action: ACTION_STOP; + target: "slide_to_begin"; + target: "slide_to_end"; + target: "start_pulse"; + after: "state_pulse"; + } + program { + name: "state_pulse"; + signal: "elm,state,pulse"; source: "elm"; + action: STATE_SET "state_begin" 0.0; + target: "elm.progress.progressbar"; + after: "units_hide"; + } + program { + name: "state_fraction"; + signal: "elm,state,fraction"; + source: "elm"; + action: ACTION_STOP; + target: "slide_to_begin"; + target: "slide_to_end"; + target: "start_pulse"; + action: STATE_SET "default" 0.0; + target: "elm.progress.progressbar"; + } + program { + name: "set_invert_on"; + signal: "elm,state,inverted,on"; + source: "elm"; + action: STATE_SET "invert" 0.0; + target: "elm.progress.progressbar"; + } + program { + name: "set_invert_off"; + signal: "elm,state,inverted,off"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.progress.progressbar"; + } + } +} + diff --git a/res/edc/widgets/slider.edc b/res/edc/widgets/slider.edc new file mode 100644 index 0000000..71e5d1c --- /dev/null +++ b/res/edc/widgets/slider.edc @@ -0,0 +1,363 @@ +#define SLIDER_FONT_SIZE 36 + +group { + name: "elm/slider/horizontal/music_progress_slider"; + parts { + part { + name: "background"; type: RECT; + scale: 1; + description { + state: "default" 0.0; + max: 630 8; + color: 32 9 21 64; + } + } + part { + name: "bg"; type: RECT; + description { + state: "default" 0.0; + rel1 { + to: "pad.left"; + relative: 1 0.5; + } + rel2{ + to: "pad.right"; + relative: 0 0.5; + } + } + } + part { + name: "pad.left"; type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 0 0; + max: 0 0; + align: 0 0.5; + } + } + part { + name: "pad.right"; type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 0 0; + max: 0 0; + align: 1 0.5; + } + } + part { + name: "base"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "background"; + rel2.to: "background"; + min: 0 8; + max: 99999 8; + fixed: 0 1; + color: 32 9 21 64; + } + } + part { + name: "glow"; mouse_events: 0; + scale: 1; + type: RECT; + description { + state: "default" 0.0; + rel1.to: "base"; + rel2 { + relative: 0.5 1.0; + to_x: "button"; + to_y: "base"; + } + min: 0 8; + max: 99999 8; + fixed: 0 1; + align: 0.0 0.5; + color: 255 255 255 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 229 42 113 255; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + color: 32 9 21 64; + } + } + part { + name: "pad.align"; type: SPACER; mouse_events: 0; + description { + state: "default" 0.0; + fixed: 1 1; + rel1.to: "elm.dragable.slider"; + rel2.to: "elm.dragable.slider"; + align: 0.0 1.0; + min: 10 1; + max: 10 1; + } + } + part { + name: "clip"; type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 255 255 255 0; + min: 76 40; + max: 76 40; + fixed: 1 1; + rel1 { + to: "elm.dragable.slider"; + to_y: "bg"; + } + rel2{ + to: "elm.dragable.slider"; + to_y: "bg"; + } + } + } + part { + name: "button"; type: GROUP; mouse_events: 1; + source: "elm/slider/horizontal/music_indicator/default"; + description { + state: "default" 0.0; + fixed: 1 1; + rel1 { + to: "elm.dragable.slider"; + to_y: "bg"; + } + rel2{ + to: "elm.dragable.slider"; + to_y: "bg"; + } + align: 0.0 0.50; + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "elm.swallow.bar"; type: SWALLOW; + repeat_events: 1; + description { + state: "default" 0.0; + rel1.to_y: "bg"; + rel2.to_y: "bg"; + fixed: 1 1; + min: 30 30; + } + } + part { + name: "elm.dragable.slider"; type: RECT; mouse_events: 0; + scale: 1; + dragable.x: 1 1 0; + dragable.y: 0 0 0; + dragable.confine: "bg"; + description { + state: "default" 0.0; + min: 21 0; + max: 21 0; + rel1 { + to_x: "bg"; + relative: 0 0.5; + } + rel2 { + to_x: "bg"; + relative: 1 0.5; + } + color: 0 0 0 0; + fixed: 1 1; + } + } + part { + name: "elm.track.slider"; type: SWALLOW; mouse_events: 0; + description { + state: "default" 0.0; + max: 21 0; + rel1.to: "elm.dragable.slider"; + rel2.to: "elm.dragable.slider"; + } + } + part { + name: "event"; type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { + name: "startup"; + signal: "load"; + source: ""; + script { + emit("highlight,hide", "elm"); + } + } + program { + name: "focuse_in"; + signal: "elm,action,focus"; + source: "elm"; + script { + set_state(PART:"glow", "focused", 0.0); + emit("highlight,show", "elm"); + } + } + program { + name: "focuse_out"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + set_state(PART:"glow", "default", 0.0); + emit("highlight,hide", "elm"); + } + } + program { + name: "text_visible"; + signal: "elm,state,text,visible"; + source: "elm"; + action: STATE_SET "active" 0.0; + target: "bg"; + } + program { + name: "text_hidden"; + signal: "elm,state,text,hidden"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "event"; + target: "glow"; + target: "base"; + after: "disable_ind"; + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "event"; + target: "glow"; + target: "base"; + after: "enable_ind"; + } + program { + name: "enable_ind"; + action: SIGNAL_EMIT "highlight,hide" "elm"; + } + program { + name: "disable_ind"; + action: SIGNAL_EMIT "highlight,disabled" "elm"; + } + } +} +group { + name: "elm/slider/horizontal/music_indicator/default"; + alias: "elm/slider/horizontal/popup/default"; + images { + image: MUSIC_IMAGE_SLIDER_NOB_NORMAL COMP; + image: MUSIC_IMAGE_SLIDER_NOB_FOCUS COMP; + image: MUSIC_IMAGE_SLIDER_NOB_DIM COMP; + } + parts { + part { + name: "knob"; + repeat_events: 1; + scale: 1; + description { + state: "default" 0.0; + image.normal: MUSIC_IMAGE_SLIDER_NOB_NORMAL; + min: 33 35; + max: 33 35; + align:0.5 0.5; + fixed: 1 1; + visible: 0; + } + description { + state: "unfocused" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + min: 37 38; + max: 37 38; + image.normal: MUSIC_IMAGE_SLIDER_NOB_FOCUS; + visible: 1; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + image.normal: MUSIC_IMAGE_SLIDER_NOB_DIM; + visible: 0; + } + } + } + programs { + program { + name: "highlight_show"; + signal: "highlight,show"; + source: "elm"; + script { + set_state(PART:"knob", "focused", 0.0); + } + } + program { + name: "highlight_hide"; + signal: "highlight,hide"; + source: "elm"; + script { + set_state(PART:"knob", "unfocused", 0.0); + } + } + program { + name: "enable"; + signal: "highlight,enabled"; + source: "elm"; + script { + set_state(PART:"knob", "default", 0.0); + } + } + program { + name: "disable"; + signal: "highlight,disabled"; + source: "elm"; + script { + set_state(PART:"knob", "disabled", 0.0); + } + } + /* These events are coming from elementary if alias is popup, otherwise + default nob is popping up + program { + name: "popup_show"; + signal: "popup,show"; + source: "elm"; + } + program { + name: "popup_hide"; + signal: "popup,hide"; + source: "elm"; + }*/ + } +} + +#undef SLIDER_FONT_SIZE diff --git a/res/images/ico_add_nor.png b/res/images/ico_add_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..72adc959cce0fc0f49c605ddfaa73c672cd42c23 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKZdM)+Q{#CHLF(3fx;TbZ+S8!BZPlvv zs|p{zihlq6MPkPZlFGXEfq%WjwpreDAaYD^ i^c}u$cIE@w`sO~j@;$%L?4MMog1DZpelF{r5}E)c%4{eA literal 0 HcmV?d00001 diff --git a/res/images/ico_addlast_nor.png b/res/images/ico_addlast_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..ca26dc5e80e1c969020598c229cbb830ef0c7de6 GIT binary patch literal 17931 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 b9+n4&eHW`1OJ3K2Cg5bZ%r@6%-PZpB#xtS5 literal 0 HcmV?d00001 diff --git a/res/images/ico_addnext_nor.png b/res/images/ico_addnext_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..a7161375177688b986ef4eaa2504708610fe357d GIT binary patch literal 17934 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 literal 0 HcmV?d00001 diff --git a/res/images/ico_addto_nor.png b/res/images/ico_addto_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..91c08d99a3c0478a88484ddadf8f4a47bc94e9a5 GIT binary patch literal 1208 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 literal 0 HcmV?d00001 diff --git a/res/images/ico_default_music_180.png b/res/images/ico_default_music_180.png new file mode 100644 index 0000000000000000000000000000000000000000..e16c3ef56b6b01862aa3b9e9d006493feba86ad4 GIT binary patch literal 5262 zcmb7GWl)^ml70yU_u%gC8rpbiFzk-VVd`gTV^F1px7iA-N z0Kj;ZPS2fNUy$jQ;TxPk2)KG*_)_YzbWq^EmGByqEL zDXSJ4^hFJ0opQ7XTNv?j5cBBRv9e8z3&uPS=If0U&tKV4wnB8kt=@6cKQoBiVFQgrJWIT^70BPSi*+M{C5g`bg#-t16A_0~oHrCs~8&1HIIdE?V2!h_G`yl`(UuX#tauWcW zSGJMzfV~({KJoUG0$|7k5ZI~pi2y%20Ui|tJ7u7{3FsQf#i#{PF##U!$S_s_$q%sn zK~L`ud`t%j6fX?K&)F++_t~B+m0l~}%pjr=Y=X+^ieg~EMa43%Ld;GeWc9)-Lz=6{ zC!LfpSO8}OHVOc_353sRVUOP9*p=hsLUE1Q7Mw?&$Z$Gq>+PrAi82>y0NC^hn0n&i zt|JQ)Lk@C!`pS5UWN(g<`_E0ZT`i7u1CV>TWB_ydTN{PE&&`XAyE{8SRr_R3tcDFB zPoN%)E`!GpcLCxLH&+`STMWT`X2D8Gw;Mg9m+A!+6NzXatylKql^&Wf;185DbbTt; z&4z3Q+uHc9aq<~4Funr1DA`2Te#U9|yRCJOdql}~L7@7*B!XW8XR(_ayvyx?b2k4m|WK#-kEqALKH%QJB44cAExq5^zm+7h#v4RX!J!ek#6zhX?j^We>h zC(6y7bgL(mh!M)$pDeS-S&EmG8|3LaAVJ~p`@q9B&?{T>ngcD#W~7F$9J6eItom&^ zVr$fu%|wkC5`M5k7n%@~mn@AHm5j2Xx}oMz%VbV^2u@*(-3kMDRkFXu+PVWx?4*3r4g$X*;TH5v7t?m|!&hUFx(p}tLfn8+VG(H*q z{0yDd;ygV(!FXfYio8ahD(#5kR|5ZJh>V32si+lHd`+GqvnRH{ai}`*Xu(@erqWEE zG?*SaR60mKK)m$A#0n=29gGCAkYw{rYo!?aF#Qp|_!4tnNTs4azwUMk+H6Xhekt_Lu`anT zs6?zdq7+mN)|2`cVDuP;Y}BjXt0nhMJGaJSyKR65!-llZn}gO7t1SGVV8K47nz2QH zPqx;yN6OY{iPDlh5jlQUeuFw4*cUq~lThw#=X^vnjI@D1Q7UbYFK-ceMz;h)6?1 z^s17p)Ukj(uT|cw)4Aw0ExW@!C|ey|wC2;k|Azv?{iyfo^rz@b3DXd{4wC_S8FQRO zykF22EKbQixO}cHXVxn%S74QFmAd&cp?OL?e@-!05huoBz;v5o+iAdQAfE}DiIz!C z<4EH)Lr0^zkhM@uT}*v&Y;^4F*nGNRrUdT--+tzP=0fIrlclk@F-K!@<9Az?+8yIU zqtnJV=P+XtqXI*HW3xKN3TOr6d}~E(5nfTVW|C%E_B^P!`n++dv80K#diN*ta%H1a zBg6`1O$=)4uk1ZdYEOc+Kw=*yP_QBvvCAlpDFfW=-3UbAimqjhXPrtx`Y%%sxj}{# zxD!A5w;NxLu=Y7Xbu(v_K*XSC_fS}5bd*}i2v@2kS0?$u>W}svRgWuIvrXUWD`;k2 zX3t6Sa@DEOsl#c+O3tW24r{g%zx!nG54jEP-6<)IoMaxy_3{8MIjvw&!#+K?4R?Y; z#X@ycfmi8`)futmwWM3lw&b?B@EYHmk;SNRSJRKC5v^Wuwnf;wTp&IC9o!c_1r!A_ zB7hL1f@OkDUfkdM`qOsCNr^7oUe_+3$i(C}%Mi-Mhg5{@c305a|M>N}g7#)VZ9HMz z0XytXz`^_^iq)P~bZ-DAb67-}LAX?$OQa#$6mP1a*VKxf`?~xe`4suJOc1Y@NEN55 zAe&?<*L(3L;TC}wsR1rKqtQ7-sG-USH3|_fwn`!A4;||dC$NYu=oZGdA8{J@4>K2^ zyz!pPup*)oE_@Er6lwKH&DURk%iyvV6U8uIyz*j;chnPYF#${**Iiqtd)k zX4CLZ{FTrq=)=&@U%;{3{E@ljbDKJr`f8?VHc^HrjT4`QXghCcV!~%v*-~1Kq(;yY zXwS}bq}(>F_Nm`Fx`~@A8D+?^?sNG|BTn>2*}?-oW0nOrlva;Vq-zLngJ)J;a+?Bdy!gkSD$6{ZNiuA;ct=4#lL@QWOJI+ zDmyVqtqf>q^3`w*Ht!w|>25%9JjT#R-wlHtuPmIHX&G`Gtv6Wx35SwP5=MQhBv>X+ zB@Fz@vf{l<9swTiOkep@UsBfB{BFW-+U{^~jWgQ>JEb&rFBRJvYjLR_YyEBg$d1|&(2X!OX%su z&$AyZVGmMwJVDRAII)DV^kcIIw&-2teRd9S(AICLutb+UWBkfDQD&$;DM6In?`1PC zG88j)Gww~SOF1jLPeRAG8U4oin2GfAL}i5O@y6cWI7w_>^c zwb5_iW_90Uo_C)+RP?dhy-kqIP-rmBDv|j4DwJrz4Le@u#F2t-;o; z){M$#Q^)30-}VMSyPHGuY~k_M%XXi0BKZ7Vwur=PJIoh+(|>cdPP7`}#{4)w(z@uy zd|J__)n;)ieIm0cw;C}gW%9K0^K2#XeV11*Y-&a6201Kr;wj-O9!KtFe0uyyI9B*^ z_G?KIku52=$HRvrxruiZOxeUwU!O)QiHW!aZs(2{#;4Mz@=`BSlRBOJ3m%WUj!CPQ z2YLpmI)=RYdCf21-k)@Pt$0zM<*(yt?fBCKvcT={YOZuAi|&(1lak;_h-t6~8-C8^ zXTC{eqpYI=0KSX>5EKdkckpL@2mt@^0KkzY0Engm05LexqF?cunl`J*%jkJ8{aV%d zKyFJlc)tD`s|Gfo(((D_w5O3Fi+w_^nRbPI!`7QTRf>%+1T+R*7v#JiR@B$^sd`-q zY`C&{rmtyyrS)Xr8(-n#%HVRY3Skv!P)-X}*of6^r@MZL&yn!{I;ObnY+>yu{uIE# zPQw^0akqCKX!k41HUJ3FSq2da3s*pT5|9b~YyQhG^KAax|L?HB z{(pu2r~j{+TR2~hmSLXyO;cs{sX|vrahgSj{>RdTW$VMTF&th2KW`>|Ymej*^DD7_ z9R8i)+-cz+haqW5kX+cA!G6}(^uQR;8HHb$pn=5rBU41}> zDd~D==bMC(&|bjZZtC^#-!6x27F(RF93yp1S3_3-e}mZZ#(1>2txqo=1o?dl4G#EN*` zm9`R8S*hWBXb?vCTQeoOCJlY#7ZkJ&gg@R~gK{8yecR_3f_p2;Wn9mVSy-5yob0&%gK+fm+p&SO|)!Da-{gXZyKggcJ9u6ek0jeg3mC>!*>D9y?4!T=J$$aRJE@H~ z(Z75Ce;GAYRq+KvEbG3VjJ(|>r{p}l1lJ{M;t3oTC`?;0TvbkYHmOWYeVt;F$=_RI zkf3u|eNT-UDNlzKo6({%&85OC)E_(c7Ikl87tfmMpxWDT+E)lsCZe0N>^q|JWHGzi zwA=?|PjrK$&$FzoN9#*^BD#C3#(KM$#*#rd_gwIf(A>EbDgE_Br3d)W#6pJ0Qza^- zW#z=&Wk!jODre!APf|380V*?z14j?9t$(2kc}=EJ??^O#=eAU7G0~Yw;WW|t$6q{i zsKzJMIr(xyKh9D^fUG^=9H-cjV{L6|Ni{)(#6x|0y|)pj$CcXp<9uF$>^Jf61Rg51 zYK}5a=}yz|T*rJZ;hT%04LA*5LYKHniYjA#ZrK@?ii8!U^isTP6ylJbYr^;_GFq3j z?-Oi9Xp~oWW-fI!S?eUm1LE4>-=_?zJUx0CtUiNIjF0byxLE|;pEOa(7)(G*+pt(? znV6XNLS3Xj^;AFt=VTpnvwG;8J*!+avq)^=&ugXLn{9v=FsXrG7sI=k zA1|39<#+un*>^RfyStmF{fm&lOwr7tG-au~S<@0T#RYfg!^PQES^>9tTiQ~q7kG(8 zm*IeIXxA;6O!zrH{ZOF+@7~_tX1NG#sGy+#nimB#d?!gOJ9VeH`=!KzG_+>euCBqb zeI?c0m-TVgYh7c0i#J)7@hnz&?KKQGAte^uA&Me-ke;62Wy(84VuOr=LhSe(GMq@{ zd9w7+;cSWS%-n-{_P!4a4iyFbcQ1~Uibz-x;f}=8AeCSF$?f@eE9Xe<5yXOGaLCKU zg8~*>_JlJ~Yn`~%dAFB2_6+V$mjS=#?frS%pQAFH9RG_bc2=91^B!D}T!VvG%$nYd zAB1q-&G^zyKkL=42iU~0v%>pcX)#FNZiMnKH?GdDAoxF=4{H74<^IUH*M-74l$n*4 zh0{YR0{P>yG<$nEN@Aln+S!@NyZ`$G-rt;c>J&Luv#@54?5ehUopr1%EC~NOX!bkFt0iomU0?c>(l%YQA?5HMS*S{9|eJ>BD*qH$Gk#!ko z-CeiV1^2C?TlNdSOn zUNeW`&Xf|h8SH$J`ew~*9YSsb-oVeUJl<1MQmPWa|5e9-?%h^C92N1>^95Rqxwc7Z zmPE8lt*Dq-1tJP|`D(K}=;qJWasKgqMRY@BV`F_&lTzJcxl@cbUwXZ6iQdz}R6gv< z!Lr0{bUyhD=pEAm%}2`feCMP<<6B=G`&%X6i(e0T9-Ol6>D-Q2U_AZtEQN>6qG2O} ziB7_~F7QHCV>qRPQ5r7O1620E*Z%*1zx*XTALlwz02Mj$l$l7m$!Ed`s3>U4SISz3 F{0Gb|7=Zu) literal 0 HcmV?d00001 diff --git a/res/images/ico_default_music_450.png b/res/images/ico_default_music_450.png new file mode 100644 index 0000000000000000000000000000000000000000..c01b103fbbb7aa7ab1115998c48aee6aae00bb8a GIT binary patch literal 23245 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 literal 0 HcmV?d00001 diff --git a/res/images/ico_del_nor.png b/res/images/ico_del_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..419b9018e89ed7cf76930f2f502ab06cc350b451 GIT binary patch literal 17877 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 literal 0 HcmV?d00001 diff --git a/res/images/ico_folder.png b/res/images/ico_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..8c5f510b99fcc1c54350c6b412d5dec02232c0a8 GIT binary patch literal 19252 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 YV`@)%cx2Wr{qq4sT~nQ0ZHFWO22{@w6951J literal 0 HcmV?d00001 diff --git a/res/images/ico_music_album.png b/res/images/ico_music_album.png new file mode 100644 index 0000000000000000000000000000000000000000..c4fcea0664d125d5c66d841c6b79fc69ee978e9a GIT binary patch literal 18088 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 literal 0 HcmV?d00001 diff --git a/res/images/ico_music_folder.png b/res/images/ico_music_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..c53f0532aba340d7617e721afb28246d625f3157 GIT binary patch literal 17808 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 literal 0 HcmV?d00001 diff --git a/res/images/ico_music_genre.png b/res/images/ico_music_genre.png new file mode 100644 index 0000000000000000000000000000000000000000..6a2e061fd3f5ca5ffff5f921552724960cbb3cdc GIT binary patch literal 17758 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 literal 0 HcmV?d00001 diff --git a/res/images/ico_music_song.png b/res/images/ico_music_song.png new file mode 100644 index 0000000000000000000000000000000000000000..bd905c5545540d1bcc1b44420fef4560996dc4b8 GIT binary patch literal 17972 zcmeI3c{r5o|HmJPtl275(iuyV%w}z-F_y7r3nQa_%sj@#m|>;{l}MJ-NmAM3s804I zibQ3LN)eq_N?DRRI8jIE2)_pvJ=Ofq@A`dzfBdd%=DL{q+@JgNzVG{Wf9}uo%v{&A zf335vtn^}O003m|?X29Ocb&;UNpa}^!SPEh=uL`a=fwp8nfa4{B0%big#aM!!X%N_ zuJvW}*j!&W2VqYlAvi&7AErMD0Krev-5F%}K4sI9XYVW>V#AL*u-%j-5pI@o;R_P9 zb=9R5*2Joxe5~YJt!Qm6rg|eYR`k%J@PkUOdUFp*Ka%KHKXoYbbnJm!qc3)z_Ipq{ z^7793#fQY+g5mU%W{E1vxyS7cT#dr#=2|XQd>+|QSO20LWga1|#Q_u~OX%v{F-;NR zLl}XuQlm=ZDj*VkPeu}`a!RYhEQy(re{GqvQ6zkyNEI((m4jsX0>C`8)@EMz*;1*b@`r`_ki&94=FoEfDK30l|(WV0K|MS)(Y@l4HPu5J75h^ zFu(#IhdLba2nk^9J$>weqB5YWNkOIsI%0z)GEl!G zynlYRQ!7G$Q-rP9hvzl7-#MOH(tJc}pLhGqc-xO5CAq?X`#rsO3WH00l+FVLbu35^Z}R74bem(L5xnk`nbnz1mJ}UYr)(NNT`Ty;>+?Q0I?9)z?~{U!^CNNNYT=Q7|{ZesR&d0?~^7?`h5F z`C{`TtgEDq#rT#8>QW0kiX+AOkzEdAiI$<_6DboZ(S5Ep%QX^n94=^IR{Xnep|?IZ zhGM6u`CwlBe6+&OSW=yd*1Y{B{pIC{f3iRS8@Y8}t4(Wwn`WP0ZknOpV$H;xPw0Nd z61by!h?O^@y3@OByA8TkyVZv_NT++72mbcKy;H~S*0wc^dK7vLd&I$HeG8A%scuhm zPLdUk;@4ZAJz45@&NU`yzTx&%+?_~edxtY;PaV6r*jL4Ogn8~2@3P|4V@sWr?s~R1 z_SwEldL{afKUX$dDY7A!p|dD$p~OPQBL2d2$&Oiz?!_%?AY)9hZ<2dcrsRrhQCR7fsI1%gTF}C*v{f(MXQZ-R!=*(8j~Sy(?Gh_v857o{l+e>E>=CO{cVnp1iS zv@h;npXD`BS{V?v9_Mw2;<0{HiOt#cv&$Y-oUO=K%r19Mbk5Isz^E;HTY9rJw`@^S z&m-}+!ctc0ZYslDg;93Buy!EvO5*OzyMGxom5_~jESImgUM-A!A!q@99sXHr(}@AI z-Phk8??W>v%?izr47y6^H?F8-rn{%zvt_6-%DIulv2pty_BNuDh^REx`lmOpbg$vP z58U)3wDo;@T1i?>e@@%E0pkJYKur6uw+(+?k>O>)y<2;O^xUzw41N^UceC!{N z=}hmG>DsB1jJ~mn6LPYt=3P{_axQ9~9{#wwW32P4qkmc`=;kONTsAbHzwD57NR3(z zLj&Dn+!FhUv{84d^N^jcQ|OUD5-N>Cw5}VR(d#MSw>dBa_SBQOWzcK z1si!J;c%d3p1Mpawz zC}x13KG*K-zlA%VpRw{z|Lu}nZHG-x4E{RNKd)xqizB6Hq8&VuYLu5(3bx^j34tMP z(p^e(Rz|NAFCbhxP^!zi?~>o|nN%2dMLX2VFJg1`t-aM3Mf~2#cu4m|?S9k#uz!;a z1?|;wk@`<`x++m=|AE2 z@w}v$NpbgV?z7NMoS)0x} zvjY1YL|aA2BsAqpAC~`qU#-=Y>=yrEP#Xs3`aA&~_iF-fqP-Cc}w^^nRrP`#qr;cv$-f-FFHnHWw>t~@KZQFj9KVeAl z3RyEuzR7&jxA$HmW2pIH`myxgVW_{`x3--s-PucP>ewdF9=xo;d(mn=5!buAa&^;djyS?B;jtM*FMz?R>St z(;f0I-MbKbbS8ZNKL6hRZuV&6qQt}rG127Vk2C{h8vx+vGszSl#mNy*W3y0HI@=pW z1+zHNjVJ&R%z`;onjgqRc!LaPfT_k{#Wf8ClWwZvY2<`);*daJrd?^ zaC8kbqBJ2G4+*e99u*PH@(XhtS7h4bWH&S|5kRV)2G1c&stv(@TRW4Sga6(S7i4RyLo8 zgDg`GUmlNxN2B?CK8kOEVh1tMSR4+A#^|H<^^s5yBsV00M-4^>a5bkzKI>S4Tv`y5 z!(*}o5R??!TY z);pk?d|KIe2jr4NI3U^$)2CGeV#hl?M``R5V0ljF4Cy8M6wH#X+gK z5`)8IFtbFad%`rFptPq`dDMTS@>O5B4x7&O3HetlGd;i7aB{-i2XJ}R02*j-MTFLl zVlwG?AJ9nO+lNL+dK=R*NSe1H4M_zJF-Rk0thYW6L&vW2rcEvK>+o-+t=P2flR5NB znhr^u;0%3yKyMs!6%~s?;`9x%NN)oS4QWC*!LGuX7_S0B{m;^~!oQJr31UJ;i0VJ9 z&*bd?r$c;4=9{7Hm|Q4zLT05Dlvq<`#vKg&y7jZepE*@7IMg66IC%<9H9jB1FZJb1 z`IwBEI?Z@0ZL-i1X_L7M(h2CVT4$#9CGt}k^V<#lca*2~XNCWG48AWIASmIdrKWoQ zScJ>=;qj?KpalcUiT~ypP78h=0aqrVCu_1l^Z#HExYQm0yB+v^Z=d}IY@b5NldMm#^PoK-cx95*Qr{R6rK`bhd$YfC&Aes}vAfRU&XT~IaxeDP) zY=3r;6Ppea4G8G(HGek>`f+XT^lxiKuA8kT!rq!>jKvunBlS_(*)p^G&C;2?j^Uvi z1LZq)>TE+X-?YK|QzmPL|Msc=Ci)oY1>NvKuTP<~-SAK^!J)I=@X(n^j{qi*2o>R} ziNcy^MNM98r=hw-_k|!4S{l3w-g_-G81$!DF`;V$ce2tMLTj3efjhn%==Gz(S&mPE z)9Ezp?ro|>Ot(V!hR|&(`pbRkH`U`yef>{=T!GH)hg}4Osfq8|vU_b<$LR^CRz`R0SFd%|WAuhpuU|u0E7!bjx z5SL&+Fs~3742WP;h)XaZm{*7k21Kwa#3h&y%qzqN10vWI;u6dU<`v?C0TFBpaS7%F z^9pgnfCx4P;*y?u(i04T9`EEs&v81MWp_Z&fFfviZcYFYx(ooqBLU#=3Fy5K0JdWQ z;PqDM@zG=eP+=e0a@__1M9l52EXcu6{&?7k60=xP|8|SK>fRznKlOtSe_(btYp?6H zNG?+Ht8?DyZM?Y})GqLqS*Do6vd(T22(_KHi}N5zBUl8V8=*0_tMu3p5s_Sn9@J#h2V zT{U%k##a`_mKgW`shH;b4sXBy+U<^$(V>!j0|J{~z579|;aI+0Yty>HPSZ`fX$t7) zm89ft)egJ+wPXv*r0)5gdp`79>us@u2sEGDMe!m4E3tK#^5(2uh&y0!?QB(OxpnV< E0bNzkC;$Ke literal 0 HcmV?d00001 diff --git a/res/images/ico_newlist_music_126.png b/res/images/ico_newlist_music_126.png new file mode 100644 index 0000000000000000000000000000000000000000..5543de8dd970c1700e54f0c60eda9b24fa7358f3 GIT binary patch literal 1917 zcmaJ?c~H`c7yk;036@1_{uFi8G&56EQ`<~76O9b>E;N!d4~&$4w&E4&ZmrTmrfr&< zT6yeB-i725sF-a?wy1e4;TF*W9(X3O^!xv}^X9!b@AHm%GjHB}XaWAdo1jKe001_j zk9Y^EJ>|P@gs82^vNA{QG?IdRy@0yc2#Gp?ob~hd22|gryrVi_jcAjOV3Pm#RlI+){D)tc9uhY3l6GhjF6YIy9PjrA6!I3;H*Gjf-lS ztyYV@B@A++EIF|)IYxRNsbHN zz|o{|!!dyFq;fMF(I9Fvf#S@_tkd}Y4SFXvh~U|7d;xd+@#O7}aChxOSf2($SZ=PA zm~g}#xbOmg&l_=eClX#(KbwF@kgQ0SB%gs>U&i{=Hp|l^!S$d-kny_Xi1pkk)GVr1 z8gX;>Hb$V7rR`JkJ(Iv5TJp6s4Omh3iIoSO5MeT2>Bvi1wocJbft-|Ncb453+{Kyf zxC|v#6Fy=waNGSG{1ju(S*aY2(ix?p)tv0wiYgJoHk{2GNXnVLEYWzbVY*>zp&Q?3 zK~Ytf0U=pi+?nNW#3(EsQU}s41w0v4Fxa`=zZm zv|+!DZvt_l4U(F}YkF+SZY&AT8jYEVw3_?Hj}1xbayfN+8|%T#dY3z?2vVt-#r8(8 z*K&336!F4~Lhj~|W8*X>)bXvia?OTT;J02XaBvaqOlHZ$=6eBWk6xU<)x~@LNA zR!`EcXI#;eN8LgCRm|dDbA0#NHd9Xf5h#hhr!Kz*p)Vuc=y@r@gr09hV{yXMLWo~w zOCC~tM6zER8wg*1A6gFnZ$j?%taQ7AsrYAPT@reiWsr$s3%E_-AlQz0^3Rby>h>2PSSHxd zKvHYLhOu~0Xp38s&(0V`?rK~~o2+-faJD{$9e!W~tMrQnvYz#!+ zlBf1eGk;pl&ve!orsG8ZjWrCnvVFLR=*jZ@cAk-^MzgiZK~RzKMyd=Nwp7EGT)HRjDToSuC56fa2Iu5+5$}xNNqkVNs?KI3MOr#13ZoybfLYjP;jLCdPM0^Nf0;Ak0%wM?d``Ja9sZI3RtUX2vI zsiYljOU>-Tn&jk0bL*XP_u}|&95NPX$8#Vg=f#wkVqO!DLz$?E#Onq8zwHO?t+yQu z5{2q0UTzs5(LOfUElg*;Sb?|}{XV>-o@(3d!$My)DKmg!afA% zWXw-gil25&Ile8}J2~nk+=tX*s^JNz2p{x%oB9oa6O9KB9=e^1FQ%@}x2q0*q<3&t;Q`A(zx2t5Moy!*{VGpy{6pS9Ph`k@INcOOqFrr@CAC@1 zVxaRuH(CNHQMl(I=|Xq;PMMd!=*l%48g&UlHX+%QuAt_PKfi$ut~;)Z>WP}`^4!`Q>Rzx1GX$C)25a+y>H3G$1p{+FZAr>#x_(&g^*T$z!< z5^+?$%sgT_81GD|d9qbcl@pk0!a2-&L@|796MqJFx#-dzZiGiKCewlc12yCN-Y0Rq zr=xPxMN>69p&KJ}jk#?u5r zu!H?h{#9gD?)xF7J?~QnX3h0W1P7u%7&(3%+h~^H&oNF8(8Y;u7xe-94{JrbE@IU_psWG9# literal 0 HcmV?d00001 diff --git a/res/images/ico_pause_nor.png b/res/images/ico_pause_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..2c45708fe182e5ef8b06277ac3e5a4a1392feaeb GIT binary patch literal 17799 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 literal 0 HcmV?d00001 diff --git a/res/images/ico_play_nor.png b/res/images/ico_play_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..9edbedecba42f1aedc1e264519ad14cf0bda935b GIT binary patch literal 18072 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 X9@f|*H6l0lg0HQmqeYRq*Ped^%Kz;_ literal 0 HcmV?d00001 diff --git a/res/images/ico_remove_nor.png b/res/images/ico_remove_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..187111ca799c67c5171058e5e0c40cb943dbf96f GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKZdM*P-F<~3-aw&rPZ!6Kid%25 z9pr2=5OKZu{peC3cCk$1ytfzSV$LcBHw&aHJQw-EA?`E@s2T*6SIkRZyH)q(^M}Uu ztF!)JXGov)^&vxesP5il%Py{OU|`}f*tYZYy^qI?UwmhRXu0#1S^YEj%39&aU_(4z L{an^LB{Ts5Jhw|i literal 0 HcmV?d00001 diff --git a/res/images/ico_rename_nor.png b/res/images/ico_rename_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..def40d1d6456be333124577def730fdee7e81c06 GIT binary patch literal 920 zcmV;J184k+P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^+> z3o`&*(3}kb00S6FL_t(|+U=P=Xk=9whM)J$PkxjvDk2dDQQ3{9oA`riv=Lm5%W9*7 z%{C&tX#~llpdc7fNNHhZA&4jl5v;TkthR_EqGXpef`xHKBpbw;d%xG_Mu)H)&FswN z2G7%6xXgT<^Pcm*=Q~`;WHOmdCX>lzGMP*!llh;aK^BXMCU8Ph>l(_mY=4_l`hFAw zGzY4tWS~k!<{`ucju_8)r*AgP#{nTc+<`wZ}QHF;G>^*C@2cn$ct zwoS!O2-=>Hi2a11sy^aW6>^RU+y47$`(i{qZF``$9f<}0n|6NK_9v2}Cz}k&_PV5( zB$b11-kKxY88-tHdrbaT;PXnnz*n}PlynrhvDTg7&MB~a7nEgrM|EsnDFe!s z(sQJhQU0 za(;Pvd46JI0^qx%D4uAy+rLCaV;GYkN(kECR|wiZV*7&a4{U!J5t|Y5UZ>M(_gu0X zw&$zbjYDUFe`|e#2Jn-l&w#TjrAq?{)><_}M}Zrzk^u%5fELh_bf@jRfZrrt=ttDr zodRoXYowIytM|#*^$H@1h!}}&M`D55+1ZN+&|B215%MT=kheu|CbQlIZ z3{kTMvIVjQvIVjQhTI6XB0_Z?=P+AgOF9BPxbslzGMP*!lgVT<*T7$TYMU?tMF@}p0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D4c5|)H5kc3T!By15-L}XAz5S3}AqqU>d zTIks2w4K&zXSz65XPj!Mc4|AeI$9M)nfFrrkAt0-rTzbZ&hb0vIrrY=-tRuo`@P$j zU@(uzf3yG=zCrQdFpNMH#WWU&`v{95qgEb>+6sdpGskbPN3GEBFqo77uY}DIM+tg! z6gG%JU>llLWf#olI*`&Ojt?U;U1J~5uC(`K=i7SAG&UGi;Q!qUQLq?~(^hN3x~x$` zp-hZsy^E_1@5K6P8wBADSj|BCtemL{{dCAf|9Ni7s46qzegThA0GK z2-YKXVHA*$Lg>6mQi?DXp$QN?o$nh&6?g^Gc*}yQLT8@}5`J;3VV)42F7 zJ3LM99841~B~iJaK~#<(LgR%H8NxUKlgJYD$!v)npdz!R#pG0}IyhBY5X_e5keFgV zLKo2pbkX`Cs?!ifl0+5kI8}9M)|^yR}c8%HB6Va|x2nUxlag!P>lV z0*y~2GDXthw5+mlZeCNYxTr5lUiK72sXLagshvnIGE8J>>QAr>4bLRY%ll)5g^ghx zMGh%7n?h#G1IcOf6~we6r?t{*5W)T_M0i*^LxB3nWIG}h;j#d_&<9E32P1SomBf-{ zhh@m?;-u;UzSi`ze#gl9JtyD(YU0er$@ec`pE`f_&izZbr|Xu$sZ;wF)KXzbyU>(D_w!U1hQ&5u79Zwhf zA~b$9ks;=VWMu2&rNsl;^&P(h(pS%1y?O7(^z`(7zz>bHU;g8E<>vlpnMy-ef><4# zq^MoV*0eauE&Cv-f4tg(bq-yu6kS&8G3*q6^|7Aai4ds_uN#_IF>qaC!dBA1FZujK6pGle+G`miFCG3oQKy$>r_+OSMhU z+i7}FTQ5ExK}J}elw=>s&U8bV{3js0#6l*?*&r_J(O7nU_|dhSbGG_jAdBAouxtJ8 z*3{I_!@qfB)Aqe}I}ZFhbLhx;#FHmZ`t%N+a(p0QQ7s78nZvOmCd*uiNn9_4!4D^~ zM51UxL5Ie&`}D={AwLB~&wY98-r?V!zS(wg{O=_l0~a+N1Lw=O44&U|XyTKX&Rn?q z@}K^CrDybow`#WyZf)5$s_J|C7<=US$%xV869EHzk9z7mUVyr=m^gr3Po@j(@svz= z0-X~?g4`a?&8ZXWnqNEp#Z{E!BLlVWA3nP_Wj=8Hb6$n{R6=&yGf_g-KsYylTPP=Y z^LlP>TdY{UIXPF`ky>2Wlv8V|YUmlx?;d%UyZh;*NyCSqj~Lj0gt&d@NMM7df3-rf z;5eXQ(Vm8onCXJhglhxuxS_nIf9hREIh|E+bCCRlh8e>;f-{{ze;nC;fh7KNy`o*3D zVVm3gLrmr!!3_$D^AklOD*JtGUg>wsW@!2KboRYeg zt$hc*hYlVM*}40d(cRmJqRnl+(Tz=A(X|b2;k?{@=XnM*1%t!AWF0`ycOuh8s|YEA zaL772tOEV$$v=I1dp3DAIQw6C^D4N-7!)%jktvoUbU^|awYML9oKW!cD}3<+ZE7ehow~8p;#f%*shakZ5UPiY|?fewTa`N zx8Bw>;@i~HLu)X0(rOzl^y>OnroN_`N}P)U{v}DxOw{mrcW}&XyEF2s>ux9Q8a0+Y;Uulo_?4%Si zfyBz1&=X1h@l2UJUXtg4Hhm9>&-vX5 zf?ykrTf(aAT4lPLW_eY$Iloe8QdJs^(Q}>zZIvU_<@TgB@p1xPN+ze~NVsL@LvLTc zdG{&^K!K(q6wObL|20Zj+y$E#F?6D#1bVh-2rJjwHK7Zwq6;cQwXK~vu)4ZRZ!WFW zn{-;8(V*2Ec{m(yj`P7558VPH)I1M7LmnKOo-fO)+4|hO*QTc~0qIWwe*>JKn!c}S z=y@}YqpU_4G8%~v)@LY|2BsC*VJI`Mv7oVOli8!nV6Fi)R_e^nm3niFR%a@VrBH0= zG9heMMy-Omat9=-$OF&JC5NV~q!PoHqwidwo;m}>{|NXHD%LBXP2S;Y+m3~#D^&!V zJch)`UE@!ayLi{NLnpa#0e!oNmxATnfOxl7Z{7jtz2HXrs3^*u0(nM2C{N-LoT73k z(iDV{G!ez~+^< z?LK?HR0%PDpD1Hs+<_Jp490f!~SfObYp(>YvfG0?-A__y<*tBQj+~q@mxO(fU zx3AnDdHvIy1LJ3}$PC^4A~@;{d`d1MAUSWjA6K*}0cgR}R+*(h_!NkE4UQ;Y(i+UQ z0RaJXjw|e{G>Hw4R_=nQtGq~z!f;AfU7=<8#dr6<_~);7ji0;Ld+hx$yMFc7rIMz- zhc^hdTp}$GkEa(dU(3#Oe6Rv@e%ZrIVKlZn0O12#ebZ?;z7H<+9<0FI+A5QLKC6nw zL{Y7A>@3Fsnrb;hD+r9{>C;MDhM(Lv`o@LM(KkMA8+qm9=Ansm)mulOXXG}>L+EM( zlA`p$QB+Q@UKtD84x%-nZc|GP`1@ag^v59J0^l#Gkl0vC@O%Vd&|2UV$F=iK%3Xq| z7q2F#l}Bc3+I7ZV$6hn-KJh`ru4C`j?>O>S&6b15Wx8#;=!}XGBr$)*y7+QuFE8qX z1mr3;Zs0bDf$%lJ-vM8Mn9K0l*qSxCIr{&fHX%mpW zg#uRKYY=c9a0ODRavoDXd~1Z&6QLZtb@3WkBE4v3NP0DaQ)H2pwe0OJZyg@gG!6C@ zH}Dg93z{RH;gr z&uOAZZ=zsaUCXTlNG0}oYTnQA^it1QK`mKUu|-z!^PM%ynqL@ls<*3i44opm&XO!u zw*_%k#--uZMmr3m`N3AAprF7?EXnh(G?=#n`5Pc&`d=_lgMceWa|e5Y*u3F2Xek?SSZSk_zA53&6H3`FfkhvXTgYGV`Dbt&LBD_#i~kg ziU%?ifG-~SIO;O9g`ncV%}i%zT4lW{Rwx>Fcy#`Mf8V0Sp_9Xl<_Z_MHwK^vY(}jM zcnSdRv8fZF0VDxD0oHS!cToZs`Y;H$`ev09ZDAF$fH@bqg}(FgbB`_X*aD9&@Yn(i bvcNw9w981h1)`(D00000NkvXXu0mjfkM|LX literal 0 HcmV?d00001 diff --git a/res/images/music_def_126.png b/res/images/music_def_126.png new file mode 100644 index 0000000000000000000000000000000000000000..aae3f506485cf0f1b8c5b2722f521077d628219a GIT binary patch literal 1937 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 RHiQ5G002ovPDHLkV1jLWnUw$l literal 0 HcmV?d00001 diff --git a/res/images/music_ico_add_last.png b/res/images/music_ico_add_last.png new file mode 100644 index 0000000000000000000000000000000000000000..54b7884208cc972b50cf276f16817aa195cde980 GIT binary patch literal 17841 zcmeI3dpML^`^O(?JLXVPN!sI(By+@QrZEoVm@^|IoyMF@m>Dx8hsq|$(oRx2MXD_# zDoP23ijG8^4wPL;vgzFYJU*An4qyO4=;JI87TKeBf$7N8HO?y52{cgw^`m1JFg zOAJ*sX7b9T!;lYjBW%%kLVc!07@DP2=Asx1M$ ziy#nIYE?^L1|&l7%gX@OPMOuHCGq1*uPoEoOGL&uxOMnFGKxVMNoI0kU*)7TJse^ax_pjv84%}?z$ z@*g*2V=Q&9)mkcB%F!d2@HekGwbN2B?(P{4{msbV%{7dw-TdNGc#4Qx&x?wtJf-(k znd}<9$|%{{7B^((Q#BtaNciriXz!I-m>&C1v&L@ryhI(?%>)%UEr(=dJGA?5GR)IX zW6+d83m3oM=2G(N8vthK$GA#c^ns`nH`CweoF|p%n=Fp8IVOLPE<|S}Ey&5d$3M5& zbPx7u&%HuFrN>D`Qa!5rn z<0*Cq+O6}F<|CE2C6KO}=*-(i!YnV}H_QI)Z{+5A%{I*(ckNz-lbJ?#i?vg3KBoJZ zNaGF|z*gRf?aJ!9+GW_K-laL{BbViC9`xHgkLP;sx3;WN>sIbI>Xu@pVJtk4XShGf zKT4i!oV3oe=xCYyX}9?N`9{GRxVzB{>>YB8jvc(e*l(fV2>bL);ib7x4lZ?0z30_@ zyVv$*>PyKtA#)VsRHN$?SbA!ii=-E^)It`WPIEk=c0W*VVE_ySfwmu&W1g!kw!DetR}S6xWIx#gVQ)LB^vlc%Ybh8k%4D-^~BM;Tw!J$v`j z_O1FAX`>nyiKYc7kK#y%YYe?g-G>e^&7?cig5Dh#I?MLx<)scq?0%~9dd2e<>L-jG z%h8PW{so6p4^ay33f&5A`>L?T{drj@s;n!#KSU{7)UR2-ez`3xso|%r9*;*JPx9pQ z7C4#Whl>#f{<-Q$E387UaPkJyvM+Cp%y#7FJq@esdB0=_a+Ew8_&#sgb`C|VbdHWx z+nk0)gzLsZT!IF&zU?nJ(uS+%q+IGjYU;C?(+PbbOzQ1)*aWC z($&;;aC+r5km2rBeqzOm)sCwj>+jyVd+cs&x^bo{`T?dVvnTUGX2*ri>q6HVl;xLQ zWZ0Kf+zshcwoxGrS zru(5(TX9)n*$yhpcOmP-_2R1oDOD*uF75br)Kpp_{*hv##yX7%!8yJPel7lKM#JF& zvmMvp9O^}~D2>XE4-GrZ=HFg%jh*F@dEb_`kX0^-9!f~u<*@TMB9(~9RIht-qpE9- za5!kgv+(BOtjyBP+W!2u(*xK6_CS35kvm35R%Ck{3hrIKLHfh3yU9%c$U&5U$EgSx zl1mipe2+GghD`PI*k6+;+Lj&E6E- zLHb2|oIV~t-UQ@DE|XwM?uxRA@|pGFUHEp*D|^lGZH%`ikNPe4eS|sf(+Sy%G zr0I9#&wWLjBRy#i$qj79Sl5V`t@os;)NHVSyM^ zd=)x+fAYQ{%K}ZOlrq*U)(hs=+ou?@C1ck)i5HMd4@%$kFWqB|M#4m@SMC_8&?|%!+pv^u9avA#g*H zb6`+^y=1fGsI<0X*@N=mTQr(Y$?i$5EBkB}>wmsHmi0OWu7FkW{Pl3%b8VhgSXb|e zY{$q_1^nZ!d$yf=CVl_str{#1*BkBkpKzCM>+?hu<=Up)=~XxsL)(qSWl zci5UC@=f;R-ktYTSc8pwvJPhLh(P?^zPasK*|r{9L&p{+?(0j+!e`Caps6&c0l>;20I!mG}2V~+HyXPY!Uc~cek z*MjlZmTa8qld7R`?#T6#;f@7QBKXTk8*W!T3Ryl-ROwQ=>5X~6#Us*__!cvtvG#|r z+ke?o9g;KD)NVT>6&u|+mOPxKMEWTyJ?VCwLR??=Dk2W|+>Afk`!SEyNN?25UO0Aa z>~`_O1;~hZEqxCfn$nt%rVgg2TnXHsJNl}+PwjMDU2Wac%Qr&}(Hq~a{m@?%(jKDm z`gn(uOV@VTFM8vCf1e%pxR>`KMJ**|e70oT&_|jfybS>G^VwvIkmBTsr*Q)jR65s} zfd~!cfd^3lAee>ns5F0u5a!EZu{ow%uPd%-!Ps? z9{t@*;C=oE@ z<&(MG0OC}ZO@Ds^zdq@Cu{m^Zh+qW)3GF?-)YE|&R#YK_2&SSD9AykgVZhTB9&Ly> z#I8i)@F>)bAX7adF`U4(r&ER0e-h=ZzR);aI-42xkD^TX{5pn{6W*R95K=ibhP@RL zoI8TersJ__Lle3Qg9gXojOlQ?p^-0q)hebD+?a+nqGOD(XkTCSi!x&0K|IP-!?64NLtTdWQU)&@Oy7ScIqn zGx|(i{r`4|?}YhgC_A__YEWnSh+A$pP&DhcysTxBlN&;Gb=w|MnG_&Rv=x zmBV7tiOA1s`?=wtE!xyle!ZVQmw|8hAAwH8Gr9ags*uPIq_P-D9*0FhPB%`EN%(RX z!jrfGT)q>R&LA2Rkl$m>KhU1fP zDxGGW-X=@LR4aHk1dpZ2FXz&4s>hf5`k(wTJ){3*R7foGAP^v;O))Ofd>~#iE(j3O zrWluKJ`k@M7X*lCQ;bVAABb0s3j##6DaIw555z0R1py-36yp-j2jUguf&dY1igAhN z1M!M+L4b%h#kfTCfq2EZAV5T$VqBv6K)hmH5FnyWF)q=3AYL&p2oTYx7?)^15U&^) z1c+!;j7u~hh*yjY0z|Ya#wD5$#4E-H0V3KI;}XpW;uYh901<79af#*w@rrRlfQUB5 zxJ2`Tc*VFNKt!8jT%!3vykcAsAfin%F424-UNJ5R5YeU>muNl^uNW5uh-g!cOEe#d zSBwh+M6@Xqm)!J|o(vB7cxMRs9A{6Y>=N)9P#De5-3b7~mjOUzGywcP4!-vSKrjjb zUTp>+A58;*h1~s{uG@fptL&{T$f1w_Of{98g;t5VV&D@lXK|*ZA|W?{5~g2sE0Lm) z-TA=PpuR2^mKl6A$>L^pUy0-3+e}+uon(?~I(biG5T<2mM@(1a$F5yYQH8D=Ylc^O z6*gAap7rl2d9Pbu(6Y8UpOxjM)~9uEx)sd~ zR%HZit?p_jHR~=|Pm;c&nkG@N!YjvIkjzLsafH7;_1x~Pj^ZU({0FxL%}XEL|884n a4(*My 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 C3875@ literal 0 HcmV?d00001 diff --git a/src/data/album_info.cpp b/src/data/album_info.cpp new file mode 100644 index 0000000..bb0452b --- /dev/null +++ b/src/data/album_info.cpp @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "dbg.h" +#include "i18n.h" +#include "album_info.h" + +struct album_info *album_info_create() +{ + struct album_info *alinfo; + + alinfo = (album_info *)calloc(1, sizeof(*alinfo)); + if (!alinfo) + return NULL; + + return alinfo; +} + +void album_info_destroy(struct album_info *alinfo) +{ + if (!alinfo) + return; + + free(alinfo->name); + free(alinfo->artist); + free(alinfo->genre); + free(alinfo->thumbnail_path); + free(alinfo); +} + +int album_info_get_album_id(struct album_info *calinfo) +{ + return calinfo->album_id; +} + +char *album_info_get_name(struct album_info *calinfo) +{ + if (!calinfo) + return NULL; + + return calinfo->name; +} + +char *album_info_get_artist(struct album_info *calinfo) +{ + if (!calinfo) + return NULL; + + return calinfo->artist; +} + +char *album_info_get_genre(struct album_info *calinfo) +{ + if (!calinfo) + return NULL; + + return calinfo->genre; +} + +char *album_info_get_thumb(struct album_info *calinfo) +{ + if (!calinfo) + return NULL; + + return calinfo->thumbnail_path; +} + +struct album_info *album_info_duplicate(struct album_info *s_alinfo) +{ + struct album_info *d_alinfo; + + if (!s_alinfo) + return NULL; + + d_alinfo = (album_info *)calloc(1, sizeof(*d_alinfo)); + if (!d_alinfo) + return NULL; + + d_alinfo->album_id = s_alinfo->album_id; + + if (s_alinfo->name) + d_alinfo->name = strdup(s_alinfo->name); + + if (s_alinfo->artist) + d_alinfo->artist = strdup(s_alinfo->artist); + + if (s_alinfo->thumbnail_path) + d_alinfo->thumbnail_path = strdup(s_alinfo->thumbnail_path); + + return d_alinfo; +} + +int sortalbums_za(const void *d1, const void *d2) +{ + struct album_info *alinfo1 = (struct album_info *)d1; + struct album_info *alinfo2 = (struct album_info *)d2; + char *txt1; + char *txt2; + + txt1 = album_info_get_name(alinfo1); + txt2 = album_info_get_name(alinfo2); + + if (!txt2) + return 1; + if (!txt1) + return -1; + + return strcasecmp(txt2, txt1); +} + +int sortalbums_az(const void *d1, const void *d2) +{ + struct album_info *alinfo1 = (struct album_info *)d1; + struct album_info *alinfo2 = (struct album_info *)d2; + char *txt1; + char *txt2; + + txt1 = album_info_get_name(alinfo1); + txt2 = album_info_get_name(alinfo2); + + if (!txt1) + return 1; + if (!txt2) + return -1; + + return strcasecmp(txt1, txt2); +} diff --git a/src/data/bus.cpp b/src/data/bus.cpp new file mode 100644 index 0000000..06dd8ad --- /dev/null +++ b/src/data/bus.cpp @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#include +#include +#include + +#define BUS_NAME "org.tizen.tv.homescreen.music" +#define BUS_OBJECT_PATH "/org/tizen/tv/music" +#define BUS_INTERFACE "org.tizen.tv.homescreen.dynamicbox" +#define BUS_SIGNAL_UPDATE "Update" +#define BUS_TYPE G_BUS_TYPE_SYSTEM + +static void _proxy_cb(GObject *obj, GAsyncResult *res, gpointer data) +{ + GError *err; + GDBusProxy *proxy; + GDBusConnection *conn; + gboolean r; + + if (!obj) { + _ERR("Invalid data, returning"); + return; + } + + err = NULL; + proxy = g_dbus_proxy_new_for_bus_finish(res, &err); + if (!proxy) { + _ERR("bus proxy new failed: %s\n", + err ? err->message : ""); + g_error_free(err); + return; + } + conn = g_dbus_proxy_get_connection(proxy); + if (!conn) { + _ERR("proxy get conn failed "); + return; + } + + err = NULL; + r = g_dbus_connection_emit_signal(conn, BUS_NAME, + BUS_OBJECT_PATH, BUS_INTERFACE, BUS_SIGNAL_UPDATE, + NULL, &err); + if (r == FALSE) { + _ERR("emit %s signal failed: %s\n", + BUS_SIGNAL_UPDATE, + err ? err->message : NULL); + g_error_free(err); + return; + } + + g_object_unref(proxy); +} + +void bus_send_signal() +{ + g_dbus_proxy_new_for_bus(BUS_TYPE, G_DBUS_PROXY_FLAGS_NONE, + NULL, BUS_NAME, BUS_OBJECT_PATH, + BUS_INTERFACE, NULL, _proxy_cb, NULL); +} diff --git a/src/data/category_info.cpp b/src/data/category_info.cpp new file mode 100644 index 0000000..28a9bf7 --- /dev/null +++ b/src/data/category_info.cpp @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "dbg.h" +#include "i18n.h" +#include "category_info.h" + +struct category_info *category_info_create() +{ + struct category_info *catinfo; + + catinfo = (category_info *)calloc(1, sizeof(*catinfo)); + if (!catinfo) + return NULL; + + return catinfo; +} + +void category_info_destroy(struct category_info *catinfo) +{ + struct list_member *item; + void *obj; + + if (!catinfo) + return; + + free((void *)catinfo->name); + free(catinfo->thumb); + eina_list_free(catinfo->albumlist); + if (catinfo->memberlist) { + EINA_LIST_FREE(catinfo->memberlist, obj) { + item = (list_member*)obj; + free(item->media_id); + free(item); + } + } + free(catinfo); +} + +int category_info_get_category_id(struct category_info *ccatinfo) +{ + return ccatinfo->id; +} + +const char *category_info_get_name(struct category_info *ccatinfo) +{ + if (!ccatinfo) + return NULL; + + return ccatinfo->name; +} + +char *category_info_get_thumb(struct category_info *ccatinfo) +{ + if (!ccatinfo) + return NULL; + + return ccatinfo->thumb; +} + +int category_info_get_songcount(struct category_info *ccatinfo) +{ + return ccatinfo->song_count; +} + +int category_info_get_albumcount(struct category_info *ccatinfo) +{ + return ccatinfo->album_count; +} + +Eina_List *category_info_get_albumlist(struct category_info *ccatinfo) +{ + if (!ccatinfo) + return NULL; + + return ccatinfo->albumlist; +} + +Eina_List *category_info_get_memberlist(struct category_info *ccatinfo) +{ + if (!ccatinfo) + return NULL; + + return ccatinfo->memberlist; +} + +struct category_info *find_category(Eina_List *list, const char *name) +{ + Eina_List *l; + struct category_info *catinfo; + void *obj; + + if (!list || !name) + return NULL; + + EINA_LIST_FOREACH(list, l, obj) { + catinfo = (category_info*)obj; + if (!strcmp(catinfo->name, name)) + return catinfo; + } + + return NULL; +} + +static struct list_member *member_duplicate(struct list_member *sitem) +{ + struct list_member *item; + + if (!sitem) + return NULL; + + item = (list_member *)calloc(1, sizeof(*item)); + if (!item) + return NULL; + + item->member_id = sitem->member_id; + if (sitem->media_id) + item->media_id = strdup(sitem->media_id); + + return item; +} + +struct category_info *category_info_duplicate(struct category_info *s_catinfo) +{ + struct category_info *d_catinfo; + struct list_member *item, *it; + void *obj; + Eina_List *l; + + if (!s_catinfo) + return NULL; + + d_catinfo = (category_info *)calloc(1, sizeof(*d_catinfo)); + if (!d_catinfo) + return NULL; + + d_catinfo->id = s_catinfo->id; + d_catinfo->song_count = s_catinfo->song_count; + d_catinfo->album_count = s_catinfo->album_count; + d_catinfo->albumlist = eina_list_clone(s_catinfo->albumlist); + + EINA_LIST_FOREACH(s_catinfo->memberlist, l, obj) { + item = (list_member *)obj; + it = member_duplicate(item); + if (!it) { + category_info_destroy(d_catinfo); + return NULL; + } + d_catinfo->memberlist = eina_list_append(d_catinfo->memberlist, + it); + } + + if (s_catinfo->name) + d_catinfo->name = strdup(s_catinfo->name); + if (s_catinfo->thumb) + d_catinfo->thumb = strdup(s_catinfo->thumb); + + return d_catinfo; +} + +int sortcategorys_za(const void *d1, const void *d2) +{ + struct category_info *catinfo1 = (struct category_info *)d1; + struct category_info *catinfo2 = (struct category_info *)d2; + const char *txt1; + const char *txt2; + + txt1 = category_info_get_name(catinfo1); + txt2 = category_info_get_name(catinfo2); + + if (!txt2) + return 1; + if (!txt1) + return -1; + + return strcasecmp(txt2, txt1); +} + +int sortcategorys_az(const void *d1, const void *d2) +{ + struct category_info *catinfo1 = (struct category_info *)d1; + struct category_info *catinfo2 = (struct category_info *)d2; + const char *txt1; + const char *txt2; + + txt1 = category_info_get_name(catinfo1); + txt2 = category_info_get_name(catinfo2); + + if (!txt1) + return 1; + if (!txt2) + return -1; + + return strcasecmp(txt1, txt2); +} diff --git a/src/data/folder_info.cpp b/src/data/folder_info.cpp new file mode 100644 index 0000000..d25090e --- /dev/null +++ b/src/data/folder_info.cpp @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "dbg.h" +#include "i18n.h" +#include "folder_info.h" + +struct folder_info *folder_info_create() +{ + struct folder_info *finfo; + + finfo = (folder_info *)calloc(1, sizeof(*finfo)); + if (!finfo) + return NULL; + + return finfo; +} + +void folder_info_destroy(struct folder_info *finfo) +{ + if (!finfo) + return; + + free(finfo->name); + free(finfo->folder_id); + free(finfo); +} + +char *folder_info_get_folder_id(struct folder_info *cfinfo) +{ + if (!cfinfo) + return NULL; + + return cfinfo->folder_id; +} + +char *folder_info_get_name(struct folder_info *cfinfo) +{ + if (!cfinfo) + return NULL; + + return cfinfo->name; +} + +int folder_info_get_count(struct folder_info *cfinfo) +{ + return cfinfo->count; +} + +int folder_info_get_duration(struct folder_info *cfinfo) +{ + return cfinfo->duration; +} + +struct folder_info *folder_info_duplicate(struct folder_info *s_finfo) +{ + struct folder_info *d_finfo; + + if (!s_finfo) + return NULL; + + d_finfo = (folder_info *)calloc(1, sizeof(*d_finfo)); + if (!d_finfo) + return NULL; + + d_finfo->count = s_finfo->count; + d_finfo->duration = s_finfo->duration; + + if (s_finfo->name) + d_finfo->name = strdup(s_finfo->name); + + if (s_finfo->folder_id) + d_finfo->folder_id = strdup(s_finfo->folder_id); + + return d_finfo; +} + +int sortfolders_za(const void *d1, const void *d2) +{ + struct folder_info *finfo1 = (struct folder_info *)d1; + struct folder_info *finfo2 = (struct folder_info *)d2; + char *txt1; + char *txt2; + + txt1 = folder_info_get_name(finfo1); + txt2 = folder_info_get_name(finfo2); + + if (!txt2) + return 1; + if (!txt1) + return -1; + + return strcasecmp(txt2, txt1); +} + +int sortfolders_az(const void *d1, const void *d2) +{ + struct folder_info *finfo1 = (struct folder_info *)d1; + struct folder_info *finfo2 = (struct folder_info *)d2; + char *txt1; + char *txt2; + + txt1 = folder_info_get_name(finfo1); + txt2 = folder_info_get_name(finfo2); + + if (!txt1) + return 1; + if (!txt2) + return -1; + + return strcasecmp(txt1, txt2); +} diff --git a/src/data/mediadata.cpp b/src/data/mediadata.cpp new file mode 100644 index 0000000..fa7f38d --- /dev/null +++ b/src/data/mediadata.cpp @@ -0,0 +1,1322 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include "dbg.h" +#include "i18n.h" +#include "define.h" +#include "song_info.h" +#include "album_info.h" +#include "category_info.h" +#include "folder_info.h" +#include "mediadata.h" +#include "common.h" + +#define MEDIA_CONDITION_MUSIC "(MEDIA_TYPE=3)" +#define MEDIA_CONDITION_INTERNAL "(MEDIA_STORAGE_TYPE=0)" +#define MEDIA_CONDITION_EXTERNAL "(MEDIA_STORAGE_TYPE=1)" + +#define MUSIC_STR_UNKNOWN N_("Unknown") + +enum songlist_type { + E_ALL_SONGS, + E_ALBUM_SONGS, + E_FOLDER_SONGS, + E_PLAYLIST_SONGS, + E_SINGLE_SONG +}; + +struct SMediadata { + Eina_List *songlist; + Eina_List *folderlist; + Eina_List *folder_songlist; + Eina_List *albumlist; + Eina_List *album_songlist; + Eina_List *playlistslist; + Eina_List *playlist_songlist; + Eina_List *artistlist; + Eina_List *genrelist; + Eina_List *cblist; + struct SSongInfo *sinfo; + filter_h filter; + int source_type; + int slist_type; + int member_id; + SMediadata() { + memset(this, 0, sizeof(SMediadata)); + } +}; + +void CMediadata::sm_CbContentUpdate(media_content_error_e err, int pid, + media_content_db_update_item_type_e update_item, + media_content_db_update_type_e update_type, + media_content_type_e media_type, + char *uuid, char *path, char *mime_type, + void *dt) +{ + CMediadata *root = (CMediadata *)dt; + + if (!root) + return; + + root->m_HandleContentUpdate(err, pid, update_item, update_type, media_type, uuid, path, mime_type); +} + + +bool CMediadata::sm_CbTotalDuration(media_info_h md_h, void *dt) +{ + audio_meta_h audio_h; + int dur; + int *tdur = (int *)dt; + + if (!tdur) + return false; + + if (media_info_get_audio(md_h, &audio_h) != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media info get audio error"); + return false; + } + + dur = 0; + if (audio_meta_get_duration(audio_h, &dur) != MEDIA_CONTENT_ERROR_NONE) + _ERR("audio duration get error"); + + audio_meta_destroy(audio_h); + + *tdur = *tdur + dur; + + return true; +} + + +bool CMediadata::sm_CbEachMediaData(media_info_h md_h, void *dt) +{ + CMediadata *root = (CMediadata *)dt; + + if (!root) + return false; + + root->m_HandleEachMediaData(md_h); + + return true; +} + + +bool CMediadata::sm_CbEachFolderData(media_folder_h folder_h, void *dt) +{ + CMediadata *root = (CMediadata *)dt; + + if (!root) + return false; + + root->m_HandleEachFolderData(folder_h); + + return true; +} + + +bool CMediadata::sm_CbEachAlbumData(media_album_h album_h, void *dt) +{ + CMediadata *root = (CMediadata *)dt; + + if (!root) + return false; + + root->m_HandleEachAlbumData(album_h); + + return true; +} + + +bool CMediadata::sm_CbEachPlaylist(media_playlist_h ph, void *dt) +{ + CMediadata *root = (CMediadata *)dt; + + if (!root) + return false; + + root->m_HandleEachPlaylist(ph); + + return true; +} + + +bool CMediadata::sm_CbPlaylistMember(int memb_id, media_info_h mdh, void *dt) +{ + category_info *catinfo = (category_info *)dt; + list_member *member = NULL; + char *id = NULL; + + if (!mdh || !catinfo) + return false; + + if (media_info_get_media_id(mdh, &id) != MEDIA_CONTENT_ERROR_NONE) { + _ERR(" Failed to get media id "); + return false; + } + + if (!catinfo->thumb && + media_info_get_thumbnail_path(mdh, &(catinfo->thumb)) != + MEDIA_CONTENT_ERROR_NONE) + _ERR("Media thumbnail path Fetch error"); + + member = (list_member *)calloc(1, sizeof(*member)); + if (!member) { + free(id); + return false; + } + + member->member_id = memb_id; + member->media_id = id; + + catinfo->memberlist = eina_list_append(catinfo->memberlist, member); + + return true; +} + + +bool CMediadata::sm_CbPlaylist(media_playlist_h ph, void* dt) +{ + Eina_List **list = (Eina_List **)dt; + SCtxtPlaylistItem *item; + + if (!ph || !list) + return false; + + item = (SCtxtPlaylistItem *)calloc(1, sizeof(*item)); + if (!item) + return false; + + if (media_playlist_get_name(ph, (char **)&(item->name)) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR(" Failed to read playlist name "); + free(item); + return false; + } + + if (media_playlist_get_playlist_id(ph, &(item->id)) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR(" Failed to read playlist name "); + free(item->name); + free(item); + return false; + } + + *list = eina_list_append(*list, item); + + return true; +} + + +void CMediadata::m_HandleContentUpdate(media_content_error_e err, int pid, + media_content_db_update_item_type_e update_item, + media_content_db_update_type_e update_type, + media_content_type_e media_type, + char *uuid, char *path, char *mime_type) +{ + Eina_List *l = NULL; + SCbInfo *cbinfo = NULL; + void *obj = NULL; + + if (err != MEDIA_CONTENT_ERROR_NONE || !m) + return; + + m->source_type = SOURCE_TYPE_NONE; + EINA_LIST_FOREACH(m->cblist, l, obj) { + cbinfo = (SCbInfo *)obj; + if (cbinfo->type == E_CONTENT_UPDATE && cbinfo->cb) + cbinfo->cb(cbinfo->data); + } +} + + +bool CMediadata::m_HandleEachMediaData(media_info_h md_h) +{ + SSongInfo *sinfo = NULL; + audio_meta_h audio_h = NULL; + + sinfo = song_info_create(); + if (!sinfo) + return false; + + if (media_info_get_file_path(md_h, &(sinfo->filepath)) + != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media file path Fetch error"); + song_info_destroy(sinfo); + return false; + } + + if (media_info_get_thumbnail_path(md_h, &(sinfo->thumbnail_path)) != + MEDIA_CONTENT_ERROR_NONE) + _ERR("Media thumbnail path Fetch error"); + + if (media_info_get_media_type(md_h, + (media_content_type_e *)&(sinfo->type)) != + MEDIA_CONTENT_ERROR_NONE) + _ERR("Media type Fetch error"); + + if (media_info_get_audio(md_h, &audio_h) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media info get audio error"); + song_info_destroy(sinfo); + return false; + } + + if (audio_meta_get_media_id(audio_h, &(sinfo->media_id)) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media ID Fetch error"); + audio_meta_destroy(audio_h); + song_info_destroy(sinfo); + return false; + } + + if (audio_meta_get_title(audio_h, &(sinfo->title)) != + MEDIA_CONTENT_ERROR_NONE) + _ERR("audio title get error"); + + if (audio_meta_get_artist(audio_h, &(sinfo->artist)) != + MEDIA_CONTENT_ERROR_NONE) + _ERR("audio artist get error"); + + if (audio_meta_get_album(audio_h, &(sinfo->album)) != + MEDIA_CONTENT_ERROR_NONE) + _ERR("audio album get error"); + + if (audio_meta_get_genre(audio_h, &(sinfo->genre)) != + MEDIA_CONTENT_ERROR_NONE) + _ERR("audio genre get error"); + + if (audio_meta_get_composer(audio_h, &(sinfo->composer)) != + MEDIA_CONTENT_ERROR_NONE) + _ERR("audio composer get error"); + + if (audio_meta_get_duration(audio_h, &(sinfo->duration)) != + MEDIA_CONTENT_ERROR_NONE) + _ERR("audio duration get error"); + + audio_meta_destroy(audio_h); + + switch (m->slist_type) { + case E_FOLDER_SONGS: + m->folder_songlist = eina_list_append( + m->folder_songlist, sinfo); + break; + + case E_ALBUM_SONGS: + m->album_songlist = eina_list_append( + m->album_songlist, sinfo); + break; + + case E_PLAYLIST_SONGS: + sinfo->member_id = m->member_id; + m->playlist_songlist = eina_list_append( + m->playlist_songlist, sinfo); + break; + + case E_SINGLE_SONG: + m->sinfo = sinfo; + break; + + case E_ALL_SONGS: + default: + m->songlist = eina_list_append(m->songlist, sinfo); + break; + } + return true; +} + + +bool CMediadata::m_HandleEachFolderData(media_folder_h folder_h) +{ + folder_info *finfo = NULL; + + finfo = folder_info_create(); + if (!finfo) + return false; + + if (media_folder_get_folder_id(folder_h, &(finfo->folder_id)) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR("Folder ID Fetch error"); + folder_info_destroy(finfo); + return false; + } + + if (media_folder_get_media_count_from_db(finfo->folder_id, + m->filter, &(finfo->count)) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR("Folder media count Fetch error"); + folder_info_destroy(finfo); + return false; + } + + finfo->duration = 0; + if (media_folder_foreach_media_from_db(finfo->folder_id, m->filter, + sm_CbTotalDuration, &(finfo->duration)) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR("Folder media count Fetch error"); + folder_info_destroy(finfo); + return false; + } + + if (media_folder_get_name(folder_h, &(finfo->name)) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR("folder name Fetch error"); + folder_info_destroy(finfo); + return false; + } + + m->folderlist = eina_list_append(m->folderlist, finfo); + return true; +} + + +bool CMediadata::m_HandleEachAlbumData(media_album_h album_h) +{ + album_info *alinfo = NULL; + SSongInfo *sinfo = NULL; + void *obj = NULL; + char *genre = NULL; + char *tpath = NULL; + Eina_List *l = NULL; + + alinfo = album_info_create(); + if (!alinfo) + return false; + + if (media_album_get_album_id(album_h, &(alinfo->album_id)) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR("Album ID Fetch error"); + album_info_destroy(alinfo); + return false; + } + + if (media_album_get_name(album_h, &(alinfo->name)) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR("Album name Fetch error"); + album_info_destroy(alinfo); + return false; + } + + if (media_album_get_artist(album_h, &(alinfo->artist)) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR("Album artist Fetch error"); + album_info_destroy(alinfo); + return false; + } + + alinfo->song_count = 0; + if (media_album_get_media_count_from_db(alinfo->album_id, m->filter, &(alinfo->song_count))) + _ERR("Album artist Fetch error"); + + if (m->album_songlist) + m_DeleteAlbumSongList(); + + m_GetAlbumSongList(alinfo); + + EINA_LIST_FOREACH(m->album_songlist, l, obj) { + sinfo = (SSongInfo *)obj; + genre = song_info_get_genre(sinfo); + if (genre) { + alinfo->genre = strdup(genre); + break; + } + } + + EINA_LIST_FOREACH(m->album_songlist, l, obj) { + sinfo = (SSongInfo *)obj; + tpath = song_info_get_thumb(sinfo); + if (tpath) { + alinfo->thumbnail_path = strdup(tpath); + break; + } + } + + m->albumlist = eina_list_append(m->albumlist, alinfo); + return true; +} + + +bool CMediadata::m_HandleEachPlaylist(media_playlist_h ph) +{ + category_info *catinfo = NULL; + + if (!ph) + return false; + + catinfo = (category_info *)calloc(1, sizeof(*catinfo)); + if (!catinfo) + return false; + + if (media_playlist_get_name(ph, (char **)&(catinfo->name)) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR(" Failed to read playlist name "); + category_info_destroy(catinfo); + return false; + } + + if (media_playlist_get_playlist_id(ph, &(catinfo->id)) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR(" Failed to read playlist name "); + category_info_destroy(catinfo); + return false; + } + + if (media_playlist_get_media_count_from_db(catinfo->id, NULL, + &(catinfo->song_count)) != MEDIA_CONTENT_ERROR_NONE) { + _ERR(" Failed to read playlist name "); + category_info_destroy(catinfo); + return false; + } + + if (media_playlist_foreach_media_from_db(catinfo->id, NULL, + sm_CbPlaylistMember, (void *)catinfo) != + MEDIA_CONTENT_ERROR_NONE) { + _ERR(" Failed to read playlist members "); + category_info_destroy(catinfo); + return false; + } + + m->playlistslist = eina_list_append(m->playlistslist, catinfo); + + return true; +} + + +void CMediadata::m_DeleteSongList(void) +{ + SSongInfo *sinfo = NULL; + void *obj = NULL; + + EINA_LIST_FREE(m->songlist, obj) { + sinfo = (SSongInfo *)obj; + song_info_destroy(sinfo); + } + + m->songlist = NULL; +} + + +void CMediadata::m_DeleteFolderSongList(void) +{ + SSongInfo *sinfo = NULL; + void *obj = NULL; + + EINA_LIST_FREE(m->folder_songlist, obj) { + sinfo = (SSongInfo *)obj; + song_info_destroy(sinfo); + } + + m->folder_songlist = NULL; +} + + +void CMediadata::m_DeleteAlbumSongList(void) +{ + SSongInfo *sinfo = NULL; + void *obj = NULL; + + EINA_LIST_FREE(m->album_songlist, obj) { + sinfo = (SSongInfo *)obj; + song_info_destroy(sinfo); + } + + m->album_songlist = NULL; +} + + +void CMediadata::m_DeletePlaylistSongList(void) +{ + SSongInfo *sinfo = NULL; + void *obj = NULL; + + EINA_LIST_FREE(m->playlist_songlist, obj) { + sinfo = (SSongInfo *)obj; + song_info_destroy(sinfo); + } + + m->playlist_songlist = NULL; +} + + +void CMediadata::m_DeleteFolderList(void) +{ + folder_info *finfo = NULL; + void *obj = NULL; + + EINA_LIST_FREE(m->folderlist, obj) { + finfo = (folder_info *)obj; + folder_info_destroy(finfo); + } + + m->folderlist = NULL; +} + + +void CMediadata::m_DeleteAlbumList(void) +{ + album_info *alinfo = NULL; + void *obj = NULL; + + EINA_LIST_FREE(m->albumlist, obj) { + alinfo = (album_info *)obj; + album_info_destroy(alinfo); + } + + m->albumlist = NULL; +} + + +void CMediadata::m_DeleteCategoryList(ECategoryType type) +{ + category_info *catinfo = NULL; + void *obj = NULL; + + if (type == CAT_TYPE_ARTIST) { + EINA_LIST_FREE(m->artistlist, obj) { + catinfo = (category_info *)obj; + category_info_destroy(catinfo); + } + + m->artistlist = NULL; + } + else if (type == CAT_TYPE_GENRE) { + EINA_LIST_FREE(m->genrelist, obj) { + catinfo = (category_info *)obj; + category_info_destroy(catinfo); + } + + m->genrelist = NULL; + } + else if (type == CAT_TYPE_PLAYLISTS) { + EINA_LIST_FREE(m->playlistslist, obj) { + catinfo = (category_info *)obj; + category_info_destroy(catinfo); + } + + m->playlistslist = NULL; + } +} + + +bool CMediadata::m_CreateFilter(void) +{ + char buf[MAX_LENGTH]; + int ret; + + ret = media_filter_create(&(m->filter)); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media Filter Creation Failed"); + return false; + } + + switch (m->source_type) { + case SOURCE_TYPE_TV: + snprintf(buf, sizeof(buf), "%s AND %s", MEDIA_CONDITION_MUSIC, + MEDIA_CONDITION_INTERNAL); + break; + + case SOURCE_TYPE_USB: + snprintf(buf, sizeof(buf), "%s AND %s", MEDIA_CONDITION_MUSIC, + MEDIA_CONDITION_EXTERNAL); + break; + + case SOURCE_TYPE_ALL: + default: + snprintf(buf, sizeof(buf), "%s", MEDIA_CONDITION_MUSIC); + break; + } + + media_filter_set_condition(m->filter, buf, + MEDIA_CONTENT_COLLATE_DEFAULT); + + return true; +} + + +bool CMediadata::m_DestroyFilter(void) +{ + if (media_filter_destroy(m->filter) != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Filter destroy failed"); + m->filter = NULL; + return false; + } + m->filter = NULL; + + return true; +} + + +int CMediadata::m_GetPlaylistList(void) +{ + if (media_playlist_foreach_playlist_from_db(NULL, sm_CbEachPlaylist, this)) { + _ERR(" Get each playlist failed "); + return false; + } + + return true; +} + + +void CMediadata::m_GetCategoryList(ECategoryType type) +{ + album_info *alinfo = NULL; + category_info *catinfo = NULL; + void *obj = NULL; + Eina_List *l = NULL; + int count; + + if (!m->albumlist) + return; + + count = 0; + EINA_LIST_FOREACH(m->albumlist, l, obj) { + alinfo = (album_info *)obj; + if (type == CAT_TYPE_ARTIST) + catinfo = find_category(m->artistlist, + alinfo->artist); + else + catinfo = find_category(m->genrelist, + alinfo->genre); + + if (!catinfo) { + catinfo = category_info_create(); + if (!catinfo) + continue; + + catinfo->id = ++count; + catinfo->album_count = 1; + catinfo->song_count = alinfo->song_count; + if (type == CAT_TYPE_ARTIST) { + if (alinfo->artist) + catinfo->name = strdup(alinfo->artist); + else + catinfo->name = strdup( + _(MUSIC_STR_UNKNOWN)); + + m->artistlist = eina_list_append( + m->artistlist, catinfo); + } + else { + if (alinfo->artist) + catinfo->name = strdup(alinfo->genre); + else + catinfo->name = strdup( + _(MUSIC_STR_UNKNOWN)); + + m->genrelist = eina_list_append( + m->genrelist, catinfo); + } + } + else { + catinfo->album_count += 1; + catinfo->song_count += alinfo->song_count; + } + catinfo->albumlist = eina_list_append(catinfo->albumlist, + alinfo); + } +} + + +int CMediadata::m_GetPlaylistSongList(category_info *catinfo) +{ + media_info_h mdh; + Eina_List *l = NULL; + list_member *member = NULL; + void *obj = NULL; + int r; + + if (!catinfo || !catinfo->memberlist) { + _ERR(" Invalid argument "); + return false; + } + + m->slist_type = E_PLAYLIST_SONGS; + + EINA_LIST_FOREACH(catinfo->memberlist, l, obj) { + member = (list_member *)obj; + if (!member->media_id) + continue; + + r = media_info_get_media_from_db(member->media_id, &mdh); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("unable to get handle from id"); + continue; + } + + m->member_id = member->member_id; + if (!m_HandleEachMediaData(mdh)) + _ERR("unable to get media data"); + } + + return true; +} + + +int CMediadata::m_GetFolderSongList(folder_info *finfo) +{ + char *id = NULL; + int r; + + id = folder_info_get_folder_id(finfo); + + m->slist_type = E_FOLDER_SONGS; + r = media_folder_foreach_media_from_db(id, m->filter, + sm_CbEachMediaData, (void *)this); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media folder foreach folder from db failed"); + return false; + } + + return true; +} + + +int CMediadata::m_GetFolderList(void) +{ + int r; + + r = media_folder_foreach_folder_from_db(m->filter, + sm_CbEachFolderData, (void *)this); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media album foreach album from db failed"); + return false; + } + + return true; +} + + +int CMediadata::m_GetAlbumSongList(album_info *alinfo) +{ + int id; + int r; + + id = album_info_get_album_id(alinfo); + + m->slist_type = E_ALBUM_SONGS; + r = media_album_foreach_media_from_db(id, m->filter, + sm_CbEachMediaData, (void *)this); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media folder foreach folder from db failed"); + return false; + } + + return true; +} + + +int CMediadata::m_GetAlbumList(void) +{ + int r; + + r = media_album_foreach_album_from_db(m->filter, + sm_CbEachAlbumData, (void *)this); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media album foreach album from db failed"); + return false; + } + + return true; +} + + +int CMediadata::m_GetSongList(void) +{ + int r; + + m->slist_type = E_ALL_SONGS; + r = media_info_foreach_media_from_db(m->filter, + sm_CbEachMediaData, (void *)this); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media folder foreach folder from db failed"); + return false; + } + + return true; +} + + +void CMediadata::m_UpdateLists(void) +{ + bool r; + + r = m_CreateFilter(); + if (r == false) { + _ERR("Media Filter Creation Failed"); + return; + } + + if (m->songlist) + m_DeleteSongList(); + m_GetSongList(); + + if (m->albumlist) + m_DeleteAlbumList(); + m_GetAlbumList(); + + if (m->artistlist) + m_DeleteCategoryList(CAT_TYPE_ARTIST); + m_GetCategoryList(CAT_TYPE_ARTIST); + + if (m->genrelist) + m_DeleteCategoryList(CAT_TYPE_GENRE); + m_GetCategoryList(CAT_TYPE_GENRE); + + if (m->folderlist) + m_DeleteFolderList(); + m_GetFolderList(); + + r = m_DestroyFilter(); + if (r == false) + _ERR("Media Filter Creation Failed"); +} + + +bool CMediadata::Create(void) +{ + if (m) + return false; + + m = new SMediadata; + if (!m) { + _ERR("m calloc failed"); + return false; + } + + int r; + r = media_content_connect(); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media Content Connect Failed"); + delete m; + m = NULL; + return false; + } + + media_content_set_db_updated_cb(sm_CbContentUpdate, (void *)this); + + m->source_type = SOURCE_TYPE_NONE; + + return true; +} + + +void CMediadata::Destroy(void) +{ + if (!m) + return; + + int r; + struct SCbInfo *cbinfo; + void *obj; + + m_DeleteSongList(); + m_DeleteAlbumList(); + m_DeleteAlbumSongList(); + m_DeleteFolderList(); + m_DeleteFolderSongList(); + m_DeleteCategoryList(CAT_TYPE_ARTIST); + m_DeleteCategoryList(CAT_TYPE_GENRE); + m_DeleteCategoryList(CAT_TYPE_PLAYLISTS); + m_DeletePlaylistSongList(); + song_info_destroy(m->sinfo); + + EINA_LIST_FREE(m->cblist, obj) { + cbinfo = (SCbInfo *)obj; + free(cbinfo); + } + + free(m); + + media_content_unset_db_updated_cb(); + + r = media_content_disconnect(); + if (r != MEDIA_CONTENT_ERROR_NONE) + _ERR("Media Content Connect Failed"); + +} + + +struct SCbInfo *CMediadata::AddCallback(int type, + void (*cb)(void *), void *data) +{ + struct SCbInfo *cbinfo; + + if (!m || !cb) + return NULL; + + cbinfo = (SCbInfo *)calloc(1, sizeof(*cbinfo)); + if (!cbinfo) + return NULL; + + cbinfo->cb = cb; + cbinfo->data = data; + cbinfo->type = type; + + m->cblist = eina_list_append(m->cblist, cbinfo); + + return cbinfo; +} + + +bool CMediadata::RemoveCallback(struct SCbInfo *cbinfo) +{ + if (!m) + return false; + + if (!cbinfo) + return false; + + m->cblist = eina_list_remove(m->cblist, + cbinfo); + free(cbinfo); + + return true; +} + + + +Eina_List *CMediadata::Medialist(int source_type, int EListType, void *info) +{ + if (!m) + return NULL; + + if (source_type != m->source_type) { + m->source_type = source_type; + m_UpdateLists(); + } + + switch (EListType) { + case LIST_TYPE_SONG: + return m->songlist; + + case LIST_TYPE_ALBUM: + return m->albumlist; + + case LIST_TYPE_ALBUM_SONG: + if (m->album_songlist) + m_DeleteAlbumSongList(); + m_GetAlbumSongList((album_info *)info); + return m->album_songlist; + + case LIST_TYPE_FOLDER: + return m->folderlist; + + case LIST_TYPE_FOLDER_SONG: + if (m->folder_songlist) + m_DeleteFolderSongList(); + m_GetFolderSongList((folder_info *)info); + return m->folder_songlist; + + case LIST_TYPE_ARTIST: + return m->artistlist; + + case LIST_TYPE_GENRE: + return m->genrelist; + + case LIST_TYPE_PLAYLISTS: + if (m->playlistslist) + m_DeleteCategoryList(CAT_TYPE_PLAYLISTS); + m_GetPlaylistList(); + return m->playlistslist; + + case LIST_TYPE_PLAYLISTS_SONG: + if (m->playlist_songlist) + m_DeletePlaylistSongList(); + m_GetPlaylistSongList((category_info *)info); + return m->playlist_songlist; + + default: + _ERR(" Wrong list type "); + break; + } + + return NULL; +} + +struct SSongInfo *CMediadata::SongByUri(char *uri) +{ + if (!m) + return NULL; + + filter_h filter; + char buf[MAX_LENGTH]; + int r; + + if (!uri) + return NULL; + + if (m->sinfo) + song_info_destroy(m->sinfo); + + m->sinfo = NULL; + r = media_filter_create(&filter); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Media Filter Creation Failed"); + return NULL; + } + + snprintf(buf, sizeof(buf), "%s AND (MEDIA_PATH LIKE '%s%%')", + MEDIA_CONDITION_MUSIC, + uri); + + media_filter_set_condition(filter, buf, + MEDIA_CONTENT_COLLATE_DEFAULT); + + m->slist_type = E_SINGLE_SONG; + r = media_info_foreach_media_from_db(filter, sm_CbEachMediaData, + (void *)this); + if (r != MEDIA_CONTENT_ERROR_NONE) + _ERR("Failed to fetch media info"); + + if (media_filter_destroy(filter) != MEDIA_CONTENT_ERROR_NONE) + _ERR("Filter destroy failed"); + + return m->sinfo; +} + + +bool CMediadata::SetPlayedTime(char *media_id) +{ + if (!m) + return false; + + media_info_h mdh; + audio_meta_h adh; + time_t ptime; + int r; + + if (!media_id) { + _ERR("Invalid parameter"); + return false; + } + + r = media_info_get_media_from_db(media_id, &mdh); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Failed to get media from id"); + return false; + } + + r = media_info_get_audio(mdh, &adh); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Failed to get audio from media"); + media_info_destroy(mdh); + return false; + } + + ptime = time(NULL); + + r = audio_meta_set_played_time(adh, ptime); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Failed to set played time"); + audio_meta_destroy(adh); + media_info_destroy(mdh); + return false; + } + + r = audio_meta_update_to_db(adh); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("Failed to update to db"); + audio_meta_destroy(adh); + media_info_destroy(mdh); + return false; + } + + audio_meta_destroy(adh); + media_info_destroy(mdh); + + return true; +} + + +bool CMediadata::InsertPlaylist(const char *name, Eina_List *idlist) +{ + if (!m) + return false; + + media_playlist_h ph; + int r; + Eina_List *l; + char *id = NULL; + void *obj; + + if (!name) + return false; + + r = media_playlist_insert_to_db(name, &ph); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR(" Failed to insert "); + return false; + } + + EINA_LIST_FOREACH(idlist, l, obj) + id = (char *)obj; + media_playlist_add_media(ph, id); + + media_playlist_update_to_db(ph); + + return true; +} + + +bool CMediadata::ExistPlaylist(const char *name) +{ + if (!m) + return false; + + Eina_List *l; + struct category_info *catinfo; + void *obj; + + if (!name) + return false; + + if (!m->playlistslist) + return false; + + EINA_LIST_FOREACH(m->playlistslist, l, obj) { + catinfo = (category_info *)obj; + if (catinfo->name && !strcmp(catinfo->name, name)) + return true; + } + + return false; +} + + +bool CMediadata::DeletePlaylist(int id) +{ + if (!m) + return false; + + int r; + + r = media_playlist_delete_from_db(id); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR(" Failed to delete playlist"); + return false; + } + + return true; +} + + +bool CMediadata::RenamePlaylist(int id, const char *name) +{ + if (!m) + return false; + + int r; + media_playlist_h ph; + + r = media_playlist_get_playlist_from_db(id, &ph); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR(" Failed to get playlist"); + return false; + } + + r = media_playlist_set_name(ph, name); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR(" Failed to set playlist name"); + return false; + } + + media_playlist_update_to_db(ph); + + return true; +} + + +bool CMediadata::AddmediaPlaylist(int lid, Eina_List *idlist) +{ + if (!m) + return false; + + media_playlist_h ph; + int r; + Eina_List *l; + char *id; + void *obj; + + if (!idlist) + return false; + + r = media_playlist_get_playlist_from_db(lid, &ph); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR(" Failed to get playlist"); + return false; + } + + EINA_LIST_FOREACH(idlist, l, obj) { + id = (char *)obj; + media_playlist_add_media(ph, id); + } + + media_playlist_update_to_db(ph); + + return true; +} + + +bool CMediadata::RemovemediaPlaylist(int lid, Eina_List *idlist) +{ + if (!m) + return false; + + media_playlist_h ph; + int r; + Eina_List *l; + struct SSongInfo *sinfo; + void *obj; + int id; + + if (!idlist) { + _ERR(" Invalid argument "); + return false; + } + + r = media_playlist_get_playlist_from_db(lid, &ph); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR(" Failed to get playlist"); + return false; + } + + EINA_LIST_FOREACH(idlist, l, obj) { + sinfo = (SSongInfo *)obj; + id = song_info_get_member_id(sinfo); + if (id) + media_playlist_remove_media(ph, id); + } + + media_playlist_update_to_db(ph); + + return true; +} + + +Eina_List *CMediadata::PlaylistsForCtxt(void) +{ + Eina_List *list; + + list = NULL; + if (media_playlist_foreach_playlist_from_db(NULL, sm_CbPlaylist, &list)) + _ERR(" Get playlist failed "); + + return list; +} diff --git a/src/data/song_info.cpp b/src/data/song_info.cpp new file mode 100644 index 0000000..2bf9464 --- /dev/null +++ b/src/data/song_info.cpp @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "dbg.h" +#include "i18n.h" +#include "song_info.h" + +struct SSongInfo *song_info_create() +{ + struct SSongInfo *sinfo; + + sinfo = (SSongInfo *)calloc(1, sizeof(*sinfo)); + if (!sinfo) + return NULL; + + return sinfo; +} + +void song_info_destroy(struct SSongInfo *sinfo) +{ + if (!sinfo) + return; + + free(sinfo->media_id); + free(sinfo->title); + free(sinfo->artist); + free(sinfo->album); + free(sinfo->album_artist); + free(sinfo->genre); + free(sinfo->composer); + free(sinfo->thumbnail_path); + free(sinfo->filepath); + free(sinfo); +} + +char *song_info_get_media_id(struct SSongInfo *csinfo) +{ + if (!csinfo) + return NULL; + + return csinfo->media_id; +} + +int song_info_get_member_id(struct SSongInfo *csinfo) +{ + if (!csinfo) + return 0; + + return csinfo->member_id; +} + +char *song_info_get_title(struct SSongInfo *csinfo) +{ + if (!csinfo) + return NULL; + + return csinfo->title; +} + +char *song_info_get_artist(struct SSongInfo *csinfo) +{ + if (!csinfo) + return NULL; + + return csinfo->artist; +} + +char *song_info_get_genre(struct SSongInfo *csinfo) +{ + if (!csinfo) + return NULL; + + return csinfo->genre; +} + +char *song_info_get_album(struct SSongInfo *csinfo) +{ + if (!csinfo) + return NULL; + + return csinfo->album; +} + +char *song_info_get_filepath(struct SSongInfo *csinfo) +{ + if (!csinfo) + return NULL; + + return csinfo->filepath; +} + +char *song_info_get_thumb(struct SSongInfo *csinfo) +{ + if (!csinfo) + return NULL; + + return csinfo->thumbnail_path; +} + +bool song_info_get_duration(struct SSongInfo *csinfo, int *dur) +{ + if (!csinfo) + return false; + + *dur = csinfo->duration; + + return true; +} + +struct SSongInfo *song_info_duplicate(struct SSongInfo *s_sinfo) +{ + struct SSongInfo *d_sinfo; + + if (!s_sinfo) + return NULL; + + d_sinfo = (SSongInfo *)calloc(1, sizeof(*d_sinfo)); + if (!d_sinfo) + return NULL; + + if (s_sinfo->media_id) + d_sinfo->media_id = strdup(s_sinfo->media_id); + + if (s_sinfo->title) + d_sinfo->title = strdup(s_sinfo->title); + + if (s_sinfo->artist) + d_sinfo->artist = strdup(s_sinfo->artist); + + if (s_sinfo->album) + d_sinfo->album = strdup(s_sinfo->album); + + if (s_sinfo->album_artist) + d_sinfo->album_artist = strdup(s_sinfo->album_artist); + + if (s_sinfo->composer) + d_sinfo->composer = strdup(s_sinfo->composer); + + if (s_sinfo->genre) + d_sinfo->genre = strdup(s_sinfo->genre); + + if (s_sinfo->filepath) + d_sinfo->filepath = strdup(s_sinfo->filepath); + + if (s_sinfo->thumbnail_path) + d_sinfo->thumbnail_path = strdup(s_sinfo->thumbnail_path); + + d_sinfo->duration = s_sinfo->duration; + d_sinfo->type = s_sinfo->type; + d_sinfo->member_id = s_sinfo->member_id; + + return d_sinfo; +} + +int sortsongs_title_az(const void *d1, const void *d2) +{ + struct SSongInfo *sinfo1 = (struct SSongInfo *)d1; + struct SSongInfo *sinfo2 = (struct SSongInfo *)d2; + char *txt1; + char *txt2; + + txt1 = song_info_get_title(sinfo1); + txt2 = song_info_get_title(sinfo2); + + if (!txt1) + return 1; + if (!txt2) + return -1; + + return strcasecmp(txt1, txt2); +} + +int sortsongs_title_za(const void *d1, const void *d2) +{ + struct SSongInfo *sinfo1 = (struct SSongInfo *)d1; + struct SSongInfo *sinfo2 = (struct SSongInfo *)d2; + char *txt1; + char *txt2; + + txt1 = song_info_get_title(sinfo1); + txt2 = song_info_get_title(sinfo2); + + if (!txt2) + return 1; + if (!txt1) + return -1; + + return strcasecmp(txt2, txt1); +} + +int sortsongs_artist_az(const void *d1, const void *d2) +{ + struct SSongInfo *sinfo1 = (struct SSongInfo *)d1; + struct SSongInfo *sinfo2 = (struct SSongInfo *)d2; + char *txt1; + char *txt2; + + txt1 = song_info_get_artist(sinfo1); + txt2 = song_info_get_artist(sinfo2); + + if (!txt1) + return 1; + if (!txt2) + return -1; + + return strcasecmp(txt1, txt2); +} + +int sortsongs_artist_za(const void *d1, const void *d2) +{ + struct SSongInfo *sinfo1 = (struct SSongInfo *)d1; + struct SSongInfo *sinfo2 = (struct SSongInfo *)d2; + char *txt1; + char *txt2; + txt1 = song_info_get_artist(sinfo1); + txt2 = song_info_get_artist(sinfo2); + + if (!txt2) + return 1; + if (!txt1) + return -1; + + return strcasecmp(txt2, txt1); +} + +int sortsongs_album_az(const void *d1, const void *d2) +{ + struct SSongInfo *sinfo1 = (struct SSongInfo *)d1; + struct SSongInfo *sinfo2 = (struct SSongInfo *)d2; + char *txt1; + char *txt2; + + txt1 = song_info_get_album(sinfo1); + txt2 = song_info_get_album(sinfo2); + + if (!txt1) + return 1; + if (!txt2) + return -1; + + return strcasecmp(txt1, txt2); +} + +int sortsongs_album_za(const void *d1, const void *d2) +{ + struct SSongInfo *sinfo1 = (struct SSongInfo *)d1; + struct SSongInfo *sinfo2 = (struct SSongInfo *)d2; + char *txt1; + char *txt2; + + txt1 = song_info_get_album(sinfo1); + txt2 = song_info_get_album(sinfo2); + + if (!txt2) + return 1; + if (!txt1) + return -1; + + return strcasecmp(txt2, txt1); +} diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..ee893de --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "dbg.h" +#include +#include "music-controller.h" +#include "define.h" +#include "BaseApp.h" +#include "BaseView.h" +#include "BaseLayout.h" +#include "ViewMgr.h" +#include "base-view.h" +#include "playback-view.h" +#include "context-view.h" + +#define PARAM_ALBUM "album_id" +#define PARAM_URI "uri" +#define PARAM_SOURCE "source" +#define MUSIC_WIN_TITLE "Music Player" + + +class CApp : public CBaseApp { +private: + + struct _appdata { + Evas_Object *win; + struct _arg_list *arglist; + } ad; + + CMusicBaseView *m_cBaseView; + CPlaybackView *m_cPlaybackView; + CContextView *m_cContextView; + +private: + + static void sm_CbPushView(void* cookie, CBaseView *pHideView, CBaseView *pShowView) + { + const char *viewId = pShowView->ViewId(); + + if (strcmp(viewId, MUSIC_CONTEXT_VIEW) && pHideView) { + if (pHideView->FlagCreate()) + pHideView->Hide(); + } + } + + static void sm_CbPopView(void* cookie, const char *szDestroyViewId, CBaseView *pShowView) + { + } + +protected: + void t_RemoveArglist(void) + { + if (ad.arglist) { + free(ad.arglist->album_id); + free(ad.arglist->uri); + free(ad.arglist->source); + free(ad.arglist); + ad.arglist = NULL; + } + } + + Evas_Object *t_AddWin(const char *name) + { + Evas_Object *win; + + win = elm_win_add(NULL, name, ELM_WIN_BASIC); + if (!win) + return NULL; + + elm_win_title_set(win, MUSIC_WIN_TITLE); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_style_set(win, MUSIC_STYLE_WIN_FOCUS); + elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK); + evas_object_show(win); + + return win; + } + +public: + + virtual bool OnCreate(void) + { + elm_theme_overlay_add(NULL, THEMEFILE); + + ad.win = t_AddWin(PACKAGE); + if (!ad.win) + return false; + + return true; + } + virtual void OnTerminate(void) + { + CViewMgr::Finalize(); + CMusicController::Finalize(); + + delete m_cBaseView; + delete m_cPlaybackView; + delete m_cContextView; + + t_RemoveArglist(); + + if (ad.win) + evas_object_del(ad.win); + } + virtual void OnPause(void) + { + elm_exit(); + } + + virtual void OnService(service_h service) + { + _DBG(""); + CViewMgr* viewmgr = NULL; + int r; + char *album_id; + char *uri; + char *source; + + _DBG(""); + r = service_get_extra_data(service, PARAM_ALBUM, &album_id); + if (r != SERVICE_ERROR_NONE) + album_id = NULL; + + r = service_get_extra_data(service, PARAM_URI, &uri); + if (r != SERVICE_ERROR_NONE) + uri = NULL; + + r = service_get_extra_data(service, PARAM_SOURCE, &source); + if (r != SERVICE_ERROR_NONE) + source = NULL; + _DBG(""); + + elm_win_activate(ad.win); + t_RemoveArglist(); + ad.arglist = (_arg_list *)calloc(1, sizeof(struct _arg_list)); + if (!ad.arglist) + goto error; + _DBG(""); + + ad.arglist->album_id = album_id; + ad.arglist->uri = uri; + ad.arglist->source = source; + CViewMgr::Finalize(); + CMusicController::Finalize(); + _DBG(""); + + if (!CMusicController::Initialize()) { + _ERR(" music init failed "); + goto error; + } + _DBG(""); + + CViewMgr::Initialize(ad.win, (void*)"path"); + viewmgr = CViewMgr::GetInstance(); + if (!viewmgr) { + _ERR(" viewmgr init failed "); + CMusicController::Finalize(); + goto error; + } + _DBG(""); + + m_cBaseView = new CMusicBaseView(MUSIC_BASE_VIEW); + m_cPlaybackView = new CPlaybackView(MUSIC_PLAYBACK_VIEW); + m_cContextView = new CContextView(MUSIC_CONTEXT_VIEW); + _DBG(""); + + viewmgr->AddView(m_cBaseView); + viewmgr->AddView(m_cPlaybackView); + viewmgr->AddView(m_cContextView); + _DBG(""); + + + CViewMgr::SCallback cb; + memset(&cb, 0, sizeof(cb)); + cb.cookie = this; + cb.cbPushView = sm_CbPushView; + cb.cbPopView = sm_CbPopView; + viewmgr->AddCallback(&cb); + _DBG(""); + + if (!viewmgr->PushView(MUSIC_BASE_VIEW, ad.arglist)) { + _ERR(" view push failed "); + CViewMgr::Finalize(); + CMusicController::Finalize(); + goto error; + } + _DBG(""); + + return; + + error: + elm_exit(); + } + +public: + + virtual int Run(int argc, char **argv) { + memset(&ad, 0x00, sizeof(_appdata)); + //ad.name = PACKAGE; + + return CBaseApp::Run(argc, argv); + } +}; + + +int main(int argc, char **argv) +{ + CApp app; + app.Run(argc, argv); + + return 0; +} +#if 0 +static int depth = 0; +const char* szDepth[] = { + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", +}; + +void __cyg_profile_func_enter(void *this_fn, void *call_site) __attribute__((no_instrument_function)); +void __cyg_profile_func_enter(void *this_fn, void *call_site) +{ + if (depth <= 10) { + printf("%s", szDepth[depth]); + _DBG("%s>%p/%p", szDepth[depth], call_site, this_fn); + } + printf(">%p/%p\n", call_site, this_fn); + depth++; +} +/* __cyg_profile_func_enter */ +void __cyg_profile_func_exit(void *this_fn, void *call_site) __attribute__((no_instrument_function)); +void __cyg_profile_func_exit(void *this_fn, void *call_site) +{ + depth--; + if (depth <= 10) { + printf("%s", szDepth[depth]); + _DBG("%s<%p/%p", szDepth[depth], call_site, this_fn); + } + printf("<%p/%p\n", call_site, this_fn); +} /* __cyg_profile_func_enter */ +#endif diff --git a/src/playback/music-controller.cpp b/src/playback/music-controller.cpp new file mode 100644 index 0000000..57a339f --- /dev/null +++ b/src/playback/music-controller.cpp @@ -0,0 +1,997 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include +//#include +#include +#include +#include "dbg.h" +#include "i18n.h" +#include "music-controller.h" +#include "playlist-mgr.h" +#include "playback-mgr.h" +#include "mediadata.h" +#include "song_info.h" +#include "album_info.h" +#include "common.h" +#include "bus.h" + + +struct SMusicController { + CPlayback* pPlayback; + CPlaylist* pPlaylist; + CMediadata* pMediadata; + album_info *alinfo; + Eina_List *elListener; + int initial_index; + int playstate; + int shufflestate; + int repeatstate; + int source_type; + int sort_type; + struct SCbInfo *cbinfo; + + SMusicController() { + memset(this, 0, sizeof(SMusicController)); + pPlayback = new CPlayback; + pPlaylist = new CPlaylist; + pMediadata = new CMediadata; + } + ~SMusicController() { + delete pMediadata; + delete pPlaylist; + delete pPlayback; + } +}; + + +void IMusicControllerListener::sm_CbComplete(void *cookie) +{ + IMusicControllerListener *root = (IMusicControllerListener *)cookie; + if (root) + root->t_OnComplete(); +} + + +void IMusicControllerListener::sm_CbError(void *cookie) +{ + IMusicControllerListener *root = (IMusicControllerListener *)cookie; + if (root) + root->t_OnError(); +} + + +void IMusicControllerListener::sm_CbUsbConnected(void *cookie) +{ + IMusicControllerListener *root = (IMusicControllerListener *)cookie; + if (root) + root->t_OnUsbConnected(); +} + + +void IMusicControllerListener::sm_CbUpdateContent(void *cookie) +{ + IMusicControllerListener *root = (IMusicControllerListener *)cookie; + if (root) + root->t_OnUpdateContent(); +} + + +CMusicController *CMusicController::instance = NULL; +int CMusicController::refCnt = 0; + + +static void _run_callback(SMusicController *mhandle, int type) +{ + Eina_List *l; + struct SCbInfo *cbinfo; + void *obj; + + if (!mhandle) + return; + + EINA_LIST_FOREACH(mhandle->elListener, l, obj) { + cbinfo = (SCbInfo *)obj; + if (cbinfo->type == type && cbinfo->cb) + cbinfo->cb(cbinfo->data); + } +} + + +bool CMusicController::t_PlayNext(int direction, int playnext_type) +{ + bool r; + int index; + + if (!m->pPlaylist->FlagCreate()) + return false; + + Stop(); + + if (playnext_type == E_ON_COMPLETE && + m->repeatstate == REPEAT_STATUS_ONE) + goto finish; + + if (direction == DIR_NEXT) { + r = m->pPlaylist->LoadNextSong(m->shufflestate); + } else { + r = m->pPlaylist->LoadPreviousSong(m->shufflestate); + } + + if (r == false) { + _ERR(" playlist load next/previous failed "); + return false; + } + + if (playnext_type == E_ON_COMPLETE && + m->repeatstate == REPEAT_STATUS_NONE) { + r = m->pPlaylist->GetCurSongIndex(&index); + if (r == false) { + _ERR(" get cur song index failed "); + return false; + } + + if (index == m->initial_index) + return true; + } + +finish: + Start(); + + return true; +} + +void CMusicController::sm_CbPlaybackCompletion(void *dt) +{ + CMusicController* root = (CMusicController*)dt; + if (root) + root->m_OnPlaybackCompletion(); +} + + +void CMusicController::m_OnPlaybackCompletion(void) +{ + bool r; + Eina_List *l; + struct SCbInfo *cbinfo; + void *obj; + + r = t_PlayNext(DIR_NEXT, E_ON_COMPLETE); + if (r == false) + _ERR(" music play next song failed "); + + EINA_LIST_FOREACH(m->elListener, l, obj) { + cbinfo = (SCbInfo *)obj; + if (cbinfo->type == E_SONG_COMPLETE && cbinfo->cb) + cbinfo->cb(cbinfo->data); + } +} + +bool CMusicController::CheckUsb(void) +{ + /*if (!m) + return false; + + if (usb_get_connected_device_number(USB_MASS_STORAGE) <= 0) + return false; + + return true;*/ + return false; +} + +/*void CMusicController::sm_CbConnected(usb_device_h usb_device, char *action, void *dt) +{ + CMusicController *root = (CMusicController*)dt; + if (root) + root->m_OnConnected(usb_device, action); +} + + +void CMusicController::m_OnConnected(usb_device_h usb_device, char *action) +{ + Eina_List *l; + struct SCbInfo *cbinfo; + void *obj; + + if (SourceType() == SOURCE_TYPE_USB) { + if (!CheckUsb()) + SetSourceType(SOURCE_TYPE_ALL); + } + + EINA_LIST_FOREACH(m->elListener, l, obj) { + cbinfo = (SCbInfo *)obj; + if (cbinfo->type == E_USB_CONNECT && cbinfo->cb) + cbinfo->cb(cbinfo->data); + } +}*/ + +static void _content_update_cb(void *dt) +{ + SMusicController *mhandle; + Eina_List *l; + struct SCbInfo *cbinfo; + void *obj; + + if (!dt) + return; + + mhandle = (SMusicController *)dt; + + EINA_LIST_FOREACH(mhandle->elListener, l, obj) { + cbinfo = (SCbInfo *)obj; + if (cbinfo->type == E_CONTENT_UPDATE && cbinfo->cb) + cbinfo->cb(cbinfo->data); + } +} + +SMusicController *CMusicController::t_Create(void) +{ + SMusicController *mhandle; + + mhandle = new SMusicController; + if (!mhandle) { + _ERR(" music init failed "); + return NULL; + } + + mhandle->playstate = PLAY_STATUS_INITIAL; + mhandle->shufflestate = SHUFFLE_STATUS_OFF; + mhandle->repeatstate = REPEAT_STATUS_ALL; + mhandle->initial_index = 0; + mhandle->sort_type = E_SORT_TITLE_A_Z; + mhandle->source_type = SOURCE_TYPE_ALL; + mhandle->alinfo = NULL; + + if (!mhandle->pMediadata->Create()) { + _ERR(" mediadata create failed "); + delete mhandle; + return NULL; + } + + if (!mhandle->pPlayback->Create()) + _ERR(" playback create failed "); + + if (!mhandle->pPlayback->SetCallback(sm_CbPlaybackCompletion, this)) + _ERR(" playback add completion callback failed"); + + mhandle->cbinfo = mhandle->pMediadata->AddCallback(E_CONTENT_UPDATE, _content_update_cb, mhandle); + + //usb_device_init(); + //usb_set_connected_cb(sm_CbConnected, this); + + return mhandle; +} + + +bool CMusicController::Initialize(void) +{ + if (refCnt == 0) { + instance = new CMusicController; + instance->m = instance->t_Create(); + if (!instance->m) { + _ERR("music_init failed"); + delete instance; + instance = NULL; + return false; + } + } + + refCnt++; + + return true; +} + + +void CMusicController::t_Destroy(void) +{ + struct SCbInfo *cbinfo; + void *obj; + + if (m->pPlayback->FlagCreate()) { + if (!m->pPlayback->UnsetCallback()) + _ERR(" playback remove completion callback failed"); + + m->pPlayback->Destroy(); + } + + if (m->pPlaylist->FlagCreate()) { + m->pPlaylist->Destroy(); + } + + m->pMediadata->RemoveCallback(m->cbinfo); + m->pMediadata->Destroy(); + + if (m->alinfo) { + album_info_destroy(m->alinfo); + m->alinfo = NULL; + } + + EINA_LIST_FREE(m->elListener, obj) { + cbinfo = (SCbInfo *)obj; + free(cbinfo); + } + + //usb_unset_connected_cb(); + //usb_device_fini(); + + delete m; +} + + +void CMusicController::Finalize(void) +{ + if (refCnt > 0) { + refCnt--; + } + if (refCnt == 0) { + if (instance) { + instance->t_Destroy(); + delete instance; + instance = NULL; + } + } +} + +CMusicController* CMusicController::GetInstance(void) +{ + return instance; +} + + +bool CMusicController::UpdatePlaylist(Eina_List *slist, int addmode) +{ + if (!m) + return false; + + if (!slist) + return false; + + if (m->pPlaylist->FlagCreate()) + m->pPlaylist->Update(slist, addmode); + else { + if (!m->pPlaylist->Create(slist)) + _ERR(" playlist create failed "); + } + return true; +} + + +bool CMusicController::AddListener(IMusicControllerListener *listener) +{ + ASSERT(listener); + + if (!m) + return false; + + m->elListener = eina_list_append(m->elListener, listener); + + return true; +} + + +bool CMusicController::RemoveListener(IMusicControllerListener *listener) +{ + ASSERT(listener); + + if (!m) + return false; + + m->elListener = eina_list_remove(m->elListener, listener); + + return true; +} + + +bool CMusicController::Start(void) +{ + if (!m) + return false; + + const char *songpath; + int index; + CPlaylist *pPlaylist; + CPlayback *pPlayback; + struct SSongInfo *sinfo; + char *media_id; + + pPlaylist = m->pPlaylist; + pPlayback = m->pPlayback; + + if (!pPlaylist || !pPlayback) + goto error; + + if (!pPlaylist->GetCurSongIndex(&index)) { + _ERR(" playlist get current song index failed"); + goto error; + } + + songpath = pPlaylist->SongpathFromIndex(index); + if (!songpath) { + _ERR(" palylist get song path from index failed"); + goto error; + } + + if (!pPlayback->SetUri(songpath)) { + _ERR(" playback set uri failed"); + goto playback_error; + } + + if (!pPlayback->Prepare()) { + _ERR(" playback prepare failed"); + goto playback_error; + } + + if (!pPlayback->Start()) { + _ERR(" playback start failed"); + goto playback_error; + } + + m->playstate = PLAY_STATUS_PLAY; + + if (m->pPlaylist->GetSonginfoFromIndex(index, &sinfo)) { + media_id = song_info_get_media_id(sinfo); + if (media_id) { + if (m->pMediadata->SetPlayedTime(media_id)) + bus_send_signal(); + } else + _ERR("song info get media id failed"); + } else + _ERR("playback get songinfo failed"); + + return true; + +playback_error: + _run_callback(m, E_PLAYBACK_ERROR); +error: + Stop(); + + return false; +} + + +bool CMusicController::Stop(void) +{ + if (!m) + return false; + + if (!m->pPlayback->FlagCreate()) + return false; + + if (!m->pPlayback->Stop()) + _ERR(" playback stop failed "); + + m->playstate = PLAY_STATUS_STOP; + + if (!m->pPlayback->Unprepare()) + _ERR(" playback unprepare failed"); + + return true; +} + + +bool CMusicController::GetCurrentSongIndex(int *ind) +{ + if (!m) + return false; + + int index; + + if (!m || !m->pPlaylist->FlagCreate()) { + _ERR("NULL received"); + return false; + } + + if (!m->pPlaylist->GetCurSongIndex(&index)) { + _ERR(" playlist get current song index failed"); + return false; + } + + *ind = index; + + return true; +} + + +bool CMusicController::SetCurrentSongIndex(int index) +{ + if (!m) + return false; + + if (!m->pPlaylist->FlagCreate()) { + _ERR("NULL received"); + return false; + } + + if (!m->pPlaylist->SetCurSongIndex(index)) { + _ERR(" playlist get current song index failed"); + return false; + } + + m->initial_index = index; + + return true; +} + + +bool CMusicController::GetTotalSongs(int *ts) +{ + if (!m) + return false; + + int count; + + if (!m->pPlaylist->FlagCreate()) { + _ERR("NULL received"); + return false; + } + + if (!m->pPlaylist->GetTotalSongs(&count)) { + _ERR(" playlist get current song index failed"); + return false; + } + + *ts = count; + + return true; +} + + +bool CMusicController::GetSonginfoFromIndex(int index, struct SSongInfo **const csinfo) +{ + if (!m) + return false; + + if (!m->pPlaylist->FlagCreate() || !csinfo) { + _ERR("NULL received"); + return false; + } + + if (!m->pPlaylist->GetSonginfoFromIndex(index, csinfo)) { + _ERR(" playlist get current song info failed"); + return false; + } + + return true; +} + + +bool CMusicController::PlayNextSong(void) +{ + return t_PlayNext(DIR_NEXT, E_BUTTON_CLICK); +} + + +bool CMusicController::PlayPreviousSong(void) +{ + return t_PlayNext(DIR_PREVIOUS, E_BUTTON_CLICK); +} + + +bool CMusicController::PlayIndexSong(int index) +{ + if (!m) + return false; + + if (!m->pPlaylist->FlagCreate()) + return false; + + Stop(); + + if (!m->pPlaylist->SetCurSongIndex(index)) + return false; + + Start(); + + return true; +} + + +bool CMusicController::Resume(void) +{ + if (!m) + return false; + + if (!m->pPlayback->FlagCreate()) + return false; + + if (!m->pPlayback->Resume()) + return false; + + m->playstate = PLAY_STATUS_PLAY; + + return true; +} + + +bool CMusicController::Pause(void) +{ + if (!m) + return false; + + if (!m || !m->pPlayback->FlagCreate()) + return false; + + if (!m->pPlayback->Pause()) + return false; + + m->playstate = PLAY_STATUS_PAUSE; + + return true; +} + + +bool CMusicController::SetPosition(int milseconds) +{ + if (!m) + return false; + + if (!m->pPlayback->FlagCreate()) + return false; + + if (!m->pPlayback->SetPosition(milseconds)) + return false; + + return true; +} + + +bool CMusicController::GetPosition(int *const milseconds) +{ + if (!m) + return false; + + if (!m || !m->pPlayback->FlagCreate()) + return false; + + if (!m->pPlayback->GetPosition(milseconds)) + return false; + + return true; +} + + +bool CMusicController::RemoveSong(struct SSongInfo *sinfo, int index) +{ + if (!m) + return false; + + int ind; + + if (!m->pPlaylist->FlagCreate()) + return false; + + if (!GetCurrentSongIndex(&ind)) { + _ERR("unable to find current song index"); + return false; + } + + if (!m->pPlaylist->RemoveSong(sinfo, index, m->shufflestate)) { + _ERR("Song can not be deleted"); + return false; + } + + if (ind != 0 && ind == index) + Stop(); + + return true; +} + + +bool CMusicController::EmptyPlaylist(void) +{ + if (!m) + return false; + + if (!m->pPlaylist->FlagCreate()) + return false; + + m->pPlaylist->Destroy(); + + return true; +} + + +bool CMusicController::GetCurrentSong(struct SSongInfo **const sinfo) +{ + if (!m) + return false; + + int index; + + if (!m->pPlaylist->FlagCreate()) + return false; + + if (!m->pPlaylist->GetCurSongIndex(&index)) { + _ERR(" playlist get current song index failed"); + return false; + } + + if (!m->pPlaylist->GetSonginfoFromIndex(index, sinfo)) { + _ERR(" playlist get current song info failed"); + return false; + } + + return true; +} + + +struct SSongInfo *CMusicController::MediaSongByUri(char *uri) +{ + if (!m) + return false; + + struct SSongInfo *sinfo; + + sinfo = m->pMediadata->SongByUri(uri); + if (!sinfo) + return NULL; + + return sinfo; +} + + +bool CMusicController::MediaGetList(int EListType, void *info, Eina_List **list) +{ + if (!m) + return false; + + Eina_List *mlist; + + mlist = m->pMediadata->Medialist(m->source_type, EListType, info); + if (!mlist) + return false; + + *list = eina_list_clone(mlist); + + return true; +} + + +bool CMusicController::MediaInsertPlaylist(const char *name, Eina_List *idlist) +{ + if (!m) + return false; + + return m->pMediadata->InsertPlaylist(name, idlist); +} + + +bool CMusicController::MediaExistPlaylist(const char *name) +{ + if (!m) + return false; + + if (!name) + return false; + + return m->pMediadata->ExistPlaylist(name); +} + + +bool CMusicController::MediaDeletePlaylist(int id) +{ + if (!m) + return false; + + return m->pMediadata->DeletePlaylist(id); +} + + +bool CMusicController::MediaRenamePlaylist(int id, const char *name) +{ + if (!m) + return false; + + if (!name) + return false; + + return m->pMediadata->RenamePlaylist(id, name); +} + + +bool CMusicController::MediaAddmediaPlaylist(int id, Eina_List *idlist) +{ + if (!m) + return false; + + if (!idlist) + return false; + + return m->pMediadata->AddmediaPlaylist(id, idlist); +} + + +bool CMusicController::MediaRemovemediaPlaylist(int id, Eina_List *idlist) +{ + if (!m) + return false; + + if (!idlist) + return false; + + return m->pMediadata->RemovemediaPlaylist(id, idlist); +} + + +bool CMusicController::MediaAddsongsPlaylist(int lid, Eina_List *list) +{ + if (!m) + return false; + + Eina_List *idlist, *l; + struct SSongInfo *sinfo; + void *obj; + char *id; + + if (!list) + return false; + + idlist = NULL; + EINA_LIST_FOREACH(list, l, obj) { + sinfo = (SSongInfo *)obj; + id = song_info_get_media_id(sinfo); + if (id) + idlist = eina_list_append(idlist, id); + } + + if (!MediaAddmediaPlaylist(lid, idlist)) { + _ERR(" Failed to add songs to playlist "); + return false; + } + + return true; +} + + +bool CMusicController::SetCurrentSong(char *mediaid) +{ + if (!m) + return false; + + if (!m->pPlaylist->FlagCreate() || !mediaid) + return false; + + m->pPlaylist->SetCurrentSong(mediaid); + + return true; +} + + +struct album_info *CMusicController::CurrentAlbum(void) +{ + if (!m) + return NULL; + + return m->alinfo; +} + + +bool CMusicController::SetCurrentAlbum(struct album_info *alinfo) +{ + if (!m) + return false; + + if (m->alinfo) + album_info_destroy(m->alinfo); + + m->alinfo = NULL; + if (alinfo) + m->alinfo = album_info_duplicate(alinfo); + + return true; +} + + +int CMusicController::PlayState(void) +{ + if (!m) + return -1; + + return m->playstate; +} + + +int CMusicController::ShuffleState(void) +{ + if (!m) + return -1; + + return m->shufflestate; +} + + +int CMusicController::RepeatState(void) +{ + if (!m) + return -1; + + return m->repeatstate; +} + + +bool CMusicController::SetPlayState(int state) +{ + if (!m) + return false; + + m->playstate = state; + + return true; +} + + +bool CMusicController::SetShuffleState(int state) +{ + if (!m) + return false; + + m->shufflestate = state; + if (state && m->pPlaylist->FlagCreate()) + m->pPlaylist->UpdateShuffle(); + + return true; +} + + +bool CMusicController::SetRepeatState(int state) +{ + if (!m) + return false; + + m->repeatstate = state; + + return true; +} + + +int CMusicController::SourceType(void) +{ + if (!m) + return -1; + + return m->source_type; +} + + +int CMusicController::SortType(void) +{ + if (!m) + return -1; + + return m->sort_type; +} + + +bool CMusicController::SetSourceType(int type) +{ + if (!m) + return false; + + m->source_type = type; + + return true; +} + + +bool CMusicController::SetSortType(int type) +{ + if (!m) + return false; + + m->sort_type = type; + + return true; +} diff --git a/src/playback/playback-mgr.cpp b/src/playback/playback-mgr.cpp new file mode 100644 index 0000000..002c74a --- /dev/null +++ b/src/playback/playback-mgr.cpp @@ -0,0 +1,361 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "i18n.h" +#include "dbg.h" +#include "playback-mgr.h" + + +struct SPlayback { + player_h player; +}; + + +void _on_seek_completion(void *dt) +{ +} + + +bool CPlayback::Create(void) +{ + int r; + + if (m) + return false; + + m = new SPlayback; + if (!m) + return false; + + r = player_create(&m->player); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player creation failed"); + delete m; + m = NULL; + return false; + } + + return true; +} + + +void CPlayback::Destroy(void) +{ + if (!m) + return; + + int r; + player_state_e state; + + if (m->player) { + r = player_get_state(m->player, &state); + if (r == PLAYER_ERROR_NONE) { + if (state == PLAYER_STATE_PLAYING || + state == PLAYER_STATE_PAUSED) + player_stop(m->player); + if (state == PLAYER_STATE_READY) + player_unprepare(m->player); + } + + r = player_destroy(m->player); + if (r != PLAYER_ERROR_NONE) + _ERR("Player destroy failed"); + } + + delete m; + m = NULL; +} + + +bool CPlayback::Start(void) +{ + if (!m) + return false; + + int r; + + if (!m->player) + return false; + + r = player_start(m->player); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player start failed"); + return false; + } + + return true; +} + + +bool CPlayback::Stop(void) +{ + if (!m) + return false; + + int r; + + if (!m->player) + return false; + + r = player_stop(m->player); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player stop failed"); + return false; + } + + return true; +} + + +bool CPlayback::SetCallback(player_completed_cb on_playback_completion, void *data) +{ + if (!m) + return false; + + int r; + if (!m->player) + return false; + + r = player_set_completed_cb(m->player, on_playback_completion, data); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player set completed callaback failed"); + return false; + } + + return true; +} + + +bool CPlayback::UnsetCallback(void) +{ + if (!m) + return false; + + int r; + + if (!m->player) + return false; + + r = player_unset_completed_cb(m->player); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player unset completed cb failed"); + return false; + } + + return true; +} + + +bool CPlayback::SetMute(bool flag) +{ + if (!m) + return false; + + int r; + + if (!m->player) + return false; + + r = player_set_mute(m->player, flag); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player set mute failed"); + return false; + } + + return true; +} + + +bool CPlayback::SetLooping(bool flag) +{ + if (!m) + return false; + + int r; + + if (!m->player) + return false; + + r = player_set_looping(m->player, flag); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player set looping failed"); + return false; + } + + return true; +} + + +bool CPlayback::Resume(void) +{ + if (!m) + return false; + + int r; + + if (!m->player) + return false; + + r = player_start(m->player); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player start in playback resume failed"); + return false; + } + + return true; +} + + +bool CPlayback::Pause(void) +{ + if (!m) + return false; + + int r; + + if (!m->player) + return false; + + r = player_pause(m->player); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player pause failed"); + return false; + } + + return true; +} + + +bool CPlayback::SetNextUri(const char *path) +{ + // Not used + /*if (!m) + return false; + + int r; + + if (!m->player) + return false; + + r = player_set_next_uri(m->player, path); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player set next uri failed"); + return false; + }*/ + + return true; +} + + +bool CPlayback::SetUri(const char *path) +{ + if (!m) + return false; + + int r; + + if (!m->player) + return false; + + r = player_set_uri(m->player, path); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player set uri failed"); + return false; + } + + return true; +} + + +bool CPlayback::Prepare(void) +{ + if (!m) + return false; + + int r; + + if (!m->player) + return false; + + r = player_prepare(m->player); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player prepare failed"); + return false; + } + + return true; +} + + +bool CPlayback::Unprepare(void) +{ + if (!m) + return false; + + int r; + + if (!m->player) + return false; + + r = player_unprepare(m->player); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player unprepare failed"); + return false; + } + + return true; +} + + +bool CPlayback::SetPosition(int milsec) +{ + if (!m) + return false; + + int r; + + if (!m->player) + return false; + + r = player_set_position(m->player, milsec, _on_seek_completion, m); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player set position failed"); + return false; + } + + return true; +} + + +bool CPlayback::GetPosition(int *const milsec) +{ + if (!m) + return false; + + int r; + + if (!m->player) + return false; + + r = player_get_position(m->player, milsec); + if (r != PLAYER_ERROR_NONE) { + _ERR("Player set position failed"); + return false; + } + + return true; +} \ No newline at end of file diff --git a/src/playback/playlist-mgr.cpp b/src/playback/playlist-mgr.cpp new file mode 100644 index 0000000..687cb9f --- /dev/null +++ b/src/playback/playlist-mgr.cpp @@ -0,0 +1,483 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "dbg.h" +#include "i18n.h" +#include "song_info.h" +#include "playlist-mgr.h" +#include "time.h" +#include "common.h" + + +struct SPlaylist { + Eina_List *songlist; + int total_songs; + int cur_song_index; + int count; + int *shuffle_list; + SPlaylist() { + songlist = NULL; + total_songs = 0; + cur_song_index = 0; + count = 0; + shuffle_list = NULL; + } +}; + + +static void _swap(int *a, int *b) +{ + int temp = *a; + *a = *b; + *b = temp; +} + +static void _delete_element_shuffle(int *list, int size, int elmt) +{ + int i, j = 0; + + if (!list || size <= 0) + return; + + for (i = 0; i < size; i++) { + if (list[i] < elmt) { + list[j] = list[i]; + j++; + } else if (list[i] > elmt) { + list[j] = list[i] - 1; + j++; + } + } + list[j] = -1; +} + +static void _shuffle(int *list, int size) +{ + int i, j; + + if (!list || size <= 0) + return; + + srand(time(NULL)); + for (i = size - 1; i > 0; i--) { + j = rand() % (i+1); + _swap(&list[i], &list[j]); + } +} + +static int _get_previous(int *list, int size, int index) +{ + int i; + int sindex; + + for (i = 0; i < size; i++) { + if (list[i] == index) + break; + } + + if (i == 0) + sindex = list[size - 1]; + else + sindex = list[i - 1]; + + if (sindex == -1) + return index; + + return sindex; +} + +static int _get_next(int *list, int size, int index) +{ + int i; + int sindex; + + for (i = 0; i < size; i++) { + if (list[i] == index) + break; + } + + if (i == (size - 1)) + sindex = list[0]; + else + sindex = list[i + 1]; + + if (sindex == -1) + return index; + + return sindex; +} + + +bool CPlaylist::Create(Eina_List *songlist) +{ + if (m) + return false; + + struct SSongInfo *sinfo; + struct SSongInfo *d_sinfo; + void *obj; + Eina_List *l; + + if (!songlist || eina_list_count(songlist) == 0) { + _ERR(" No songlist "); + return false; + } + + m = new SPlaylist; + if (!m) { + _ERR(" Unable to allocate memory for playlist "); + return NULL; + } + m->cur_song_index = 0; + + EINA_LIST_FOREACH(songlist, l, obj) { + sinfo = (SSongInfo *)obj; + d_sinfo = song_info_duplicate(sinfo); + if (d_sinfo) { + m->songlist = eina_list_append(m->songlist, + d_sinfo); + } + } + + m->total_songs = eina_list_count(m->songlist); + + UpdateShuffle(); + + return true; +} + + +void CPlaylist::Destroy(void) +{ + if (!m) + return; + + struct SSongInfo *sinfo; + void *obj; + + m->total_songs = 0; + if (m->songlist) { + EINA_LIST_FREE(m->songlist, obj) { + sinfo = (SSongInfo *)obj; + song_info_destroy(sinfo); + } + } + if (m->shuffle_list) + free(m->shuffle_list); + + delete m; + m = NULL; +} + + +bool CPlaylist::Update(Eina_List *songlist, int addmode) +{ + if (!m) + return false; + + struct SSongInfo *sinfo; + struct SSongInfo *d_sinfo; + struct SSongInfo *relative; + void *obj; + Eina_List *l; + int rindex; + + if (!songlist) { + _ERR(" No m or songlist "); + return NULL; + } + + if (addmode == ADD_TYPE_FRESH || (m->total_songs == 0)) { + Destroy(); + return Create(songlist); + } + + if (!songlist) + return true; + + if (addmode == ADD_TYPE_END) + rindex = m->total_songs - 1; + else + rindex = m->cur_song_index; + + EINA_LIST_FOREACH(songlist, l, obj) { + sinfo = (SSongInfo *)obj; + d_sinfo = song_info_duplicate(sinfo); + if (d_sinfo) { + relative = (SSongInfo *)eina_list_nth(m->songlist, rindex); + m->songlist = eina_list_append_relative( + m->songlist, d_sinfo, relative); + rindex++; + } + } + + m->total_songs = eina_list_count(m->songlist); + + UpdateShuffle(); + + return true; +} + + +bool CPlaylist::SetCurrentSong(char *mediaid) +{ + if (!m) + return false; + + Eina_List *l; + struct SSongInfo *sinfo; + void *obj; + int i; + char *id; + + if (!m->songlist) + return false; + + i = eina_list_count(m->songlist) - 1; + EINA_LIST_REVERSE_FOREACH(m->songlist, l, obj) { + sinfo = (SSongInfo *)obj; + id = song_info_get_media_id(sinfo); + if (!strcmp(id, mediaid)) { + m->cur_song_index = i; + break; + } + i--; + } + return true; +} + + +bool CPlaylist::SetCurSongIndex(int index) +{ + if (!m) + return false; + + if (index < 0 || index >= m->total_songs) { + _ERR(" set index is out of range "); + return false; + } + + m->cur_song_index = index; + + return true; +} + + +bool CPlaylist::GetCurSongIndex(int *index) +{ + if (!m) { + _ERR(" No play list"); + return false; + } + + *index = m->cur_song_index; + + return true; +} + + +bool CPlaylist::GetTotalSongs(int *ts) +{ + if (!m) { + _ERR(" No play list"); + return false; + } + + *ts = m->total_songs; + + return true; +} + + +bool CPlaylist::LoadNextSong(int shufstate) +{ + int index, total_songs; + + if (!m) { + _ERR(" No play list"); + return false; + } + + total_songs = m->total_songs; + + index = m->cur_song_index; + if (index < 0 || index >= total_songs) { + _ERR(" index out of range "); + return false; + } + + if (shufstate && m->shuffle_list) + index = _get_next(m->shuffle_list, total_songs, index); + else { + index++; + if (index == total_songs) + index = 0; + } + + m->cur_song_index = index; + + return true; +} + + +bool CPlaylist::LoadPreviousSong(int shufstate) +{ + int index, total_songs; + + if (!m) { + _ERR(" No play list"); + return false; + } + + total_songs = m->total_songs; + + index = m->cur_song_index; + if (index < 0 || index >= total_songs) { + _ERR(" index out of range "); + return false; + } + + if (shufstate && m->shuffle_list) + index = _get_previous(m->shuffle_list, total_songs, index); + else { + if (index == 0) + index = total_songs - 1; + else + index--; + } + + m->cur_song_index = index; + + return true; +} + + +const char *CPlaylist::SongpathFromIndex(int index) +{ + if (!m) + return NULL; + + const char *path; + struct SSongInfo *sinfo; + + if (!m->songlist) { + _ERR(" No play list"); + return NULL; + } + + if (index < 0 || index >= m->total_songs) { + _ERR(" index out of range "); + return NULL; + } + + sinfo = (SSongInfo *)eina_list_nth(m->songlist, index); + if (!sinfo) { + _ERR(" Eina list nth failed "); + return NULL; + } + + path = song_info_get_filepath(sinfo); + if (!path) { + _ERR(" Get song path failed"); + return NULL; + } + + return path; +} + + +bool CPlaylist::GetSonginfoFromIndex(int index, struct SSongInfo **const csinfo) +{ + if (!m) + return false; + + struct SSongInfo *sinfo; + + if (!m->songlist) { + _ERR(" No play list"); + return false; + } + + if (index < 0 || index >= m->total_songs) { + _ERR(" index out of range "); + return false; + } + + sinfo = (SSongInfo *)eina_list_nth(m->songlist, index); + if (!sinfo) { + _ERR(" Eina list nth failed "); + return false; + } + + *csinfo = sinfo; + + return true; +} + + +bool CPlaylist::RemoveSong(struct SSongInfo *sinfo, int index, int shufstate) +{ + if (!m) + return false; + + if (!m->songlist) { + _ERR(" No play list"); + return false; + } + + m->songlist = eina_list_remove(m->songlist, sinfo); + song_info_destroy(sinfo); + + if (shufstate) { + _delete_element_shuffle(m->shuffle_list, m->total_songs, + index); + } + m->total_songs = m->total_songs - 1; + + if (index <= m->cur_song_index && m->cur_song_index != 0) + m->cur_song_index = m->cur_song_index - 1; + + return true; +} + + +bool CPlaylist::UpdateShuffle(void) +{ + if (!m) + return false; + + int i; + int *list; + + if (m->total_songs <= 0) + return false; + + if (m->shuffle_list) + free(m->shuffle_list); + + list = (int *)calloc(1, m->total_songs * sizeof(int)); + for (i = 0; i < m->total_songs; i++) + list[i] = i; + + _shuffle(list, m->total_songs); + + m->shuffle_list = list; + + return true; +} diff --git a/src/playback/volume-control.cpp b/src/playback/volume-control.cpp new file mode 100644 index 0000000..2f7da36 --- /dev/null +++ b/src/playback/volume-control.cpp @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include "dbg.h" + + +#define VOLUME_MUTE 1 +#define VOLUME_UNMUTE 0 + +static int currentVolume = 0; +static bool muteFlag = false; + +bool CVolumeController::Mute(void) +{ + int r; + + r = sound_manager_get_volume(SOUND_TYPE_MEDIA, ¤tVolume); + if (r != 0) { + _ERR("failed to get volume"); + return false; + } + + r = sound_manager_set_volume(SOUND_TYPE_MEDIA, 0); + if (r != 0) { + _ERR("failed to set volume"); + return false; + } + + muteFlag = true; + + return true; +} + +bool CVolumeController::Unmute(void) +{ + int r; + + r = sound_manager_set_volume(SOUND_TYPE_MEDIA, currentVolume); + if (r != 0) { + _ERR("failed to set volume"); + return false; + } + + muteFlag = false; + + return true; +} + +bool CVolumeController::Up(void) +{ + int r, vol; + + if (!CVolumeController::Unmute()) { + _ERR("failed to set volume unmute"); + return false; + } + + r = sound_manager_get_volume(SOUND_TYPE_MEDIA, &vol); + if (r != 0) { + _ERR("failed to get volume"); + return false; + } + + vol++; + + r = sound_manager_set_volume(SOUND_TYPE_MEDIA, vol); + if (r != 0) { + _ERR("failed to set volume"); + return false; + } + + return true; +} + +bool CVolumeController::Down(void) +{ + int r, vol; + + if (!CVolumeController::Unmute()) { + _ERR("failed to set volume unmute"); + return false; + } + + r = sound_manager_get_volume(SOUND_TYPE_MEDIA, &vol); + if (r != 0) { + _ERR("failed to get volume"); + return false; + } + vol--; + + r = sound_manager_set_volume(SOUND_TYPE_MEDIA, vol); + if (r != 0) { + _ERR("failed to set volume"); + return false; + } + + return true; +} + +bool CVolumeController::IsMute(void) +{ + /*int r; + bool mute; + + r = sound_manager_get_master_mute(&mute); + if (r != 0) { + _ERR("failed to get mute"); + return false; + } + + if (mute) + return true; + + return false;*/ + return muteFlag; +} + +bool CVolumeController::Get(int *vol) +{ + int r; + + r = sound_manager_get_volume(SOUND_TYPE_MEDIA, vol); + if (r != 0) { + _ERR("failed to get volume"); + return false; + } + + return true; +} + diff --git a/src/views/ExtBaseLayout.cpp b/src/views/ExtBaseLayout.cpp new file mode 100644 index 0000000..9a316e2 --- /dev/null +++ b/src/views/ExtBaseLayout.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "LayoutMgr.h" +#include "BaseView.h" +#include "BaseLayout.h" +#include "ExtBaseLayout.h" +#include "ViewMgr.h" + + +CExtBaseLayout::CExtBaseLayout(const char *pLayoutId) : CBaseLayout(pLayoutId) +{ + m_bEmptyStatus = false; +} + + +CExtBaseLayout::~CExtBaseLayout() +{ +} + + +void CExtBaseLayout::SetEmptyStatus(bool flag) +{ + m_bEmptyStatus = flag; +} + + +bool CExtBaseLayout::EmptyStatus(void) +{ + return m_bEmptyStatus; +} diff --git a/src/views/HandleVolume.cpp b/src/views/HandleVolume.cpp new file mode 100644 index 0000000..d6d275c --- /dev/null +++ b/src/views/HandleVolume.cpp @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "dbg.h" +#include "define.h" +#include +#include "common.h" +#include "common-ui.h" +#include "HandleVolume.h" +#include "volume-control.h" + + +#define VOLUME_TIMER_INTERVAL 5 /* seconds */ + + +struct SHandleVolume { + Evas_Object *eoVolBar; + Evas_Object *eoVolLayout; + Evas_Object *eoBase; + Ecore_Timer *etVol; + bool flagVolumeMode; +}; + + +enum volume_key_type { + SOUND_UP, + SOUND_DOWN, + SOUND_MUTE +}; + + +Eina_Bool CHandleVolume::sm_CbVolumeTimer(void *dt) +{ + SHandleVolume *m = (SHandleVolume *)dt; + + if (!m) + return ECORE_CALLBACK_CANCEL; + + m->etVol = NULL; + elm_object_part_content_unset(m->eoBase, MUSIC_PART_VOLUME_LAYOUT); + evas_object_hide(m->eoVolLayout); + m->flagVolumeMode = false; + + return ECORE_CALLBACK_CANCEL; +} + + +void CHandleVolume::m_HandleVolumeKey(int mode) +{ + if (!m->flagVolumeMode) { + RemoveTimer(); + m->etVol = ecore_timer_add(VOLUME_TIMER_INTERVAL, + sm_CbVolumeTimer, m); + m->flagVolumeMode = true; + evas_object_show(m->eoVolLayout); + elm_object_part_content_set(m->eoBase, MUSIC_PART_VOLUME_LAYOUT, + m->eoVolLayout); + evas_object_show(m->eoVolLayout); + } + else + ecore_timer_reset(m->etVol); + + m_HandleVolume(mode); + m_UpdateVolumeBar(); +} + + +void CHandleVolume::m_UpdateVolumeBar(void) +{ + double value; + int vol; + char buf[MAX_LENGTH]; + + if (!m->eoVolBar) { + _ERR("failed to get priv"); + return; + } + + if (!CVolumeController::Get(&vol)) { + _ERR(" music volume get failed "); + return; + } + + value = vol * 0.01; + elm_progressbar_value_set(m->eoVolBar, value); + snprintf(buf, sizeof(buf), "%d", vol); + elm_object_part_text_set(m->eoVolLayout, MUSIC_PART_VOLUME_VALUE, buf); + if (vol == 0 || CVolumeController::IsMute()) { + elm_object_signal_emit(m->eoVolLayout, + MUSIC_SIGNAL_VOLUME_MUTE, + MUSIC_PLAYBACK_VIEW); + } + else { + elm_object_signal_emit(m->eoVolLayout, + MUSIC_SIGNAL_VOLUME_UNMUTE, + MUSIC_PLAYBACK_VIEW); + } +} + + +void CHandleVolume::m_HandleVolume(int mode) +{ + volume_key_type keyType = (volume_key_type)mode; + + switch (keyType) { + case SOUND_UP: + CVolumeController::Up(); + break; + case SOUND_DOWN: + CVolumeController::Down(); + break; + case SOUND_MUTE: + if (CVolumeController::IsMute()) + CVolumeController::Unmute(); + else + CVolumeController::Mute(); + break; + } +} + + +bool CHandleVolume::Create(Evas_Object *eoBase) +{ + ASSERT(!m); + + _CREATE_BEGIN{ + _CHECK(m = new SHandleVolume) + _CHECK(m->eoVolLayout = _add_base(eoBase, MUSIC_VOLUME_LAYOUT)) + _COMMAND{ evas_object_hide(m->eoVolLayout); } + _CHECK(m->eoVolBar = elm_progressbar_add(m->eoVolLayout)) + + _WHEN_SUCCESS{} + + _CHECK_FAIL{ evas_object_del(m->eoVolBar); } + _CHECK_FAIL{ evas_object_del(m->eoVolLayout); } + _CHECK_FAIL{ delete m; m = NULL; } + } _CREATE_END_AND_CATCH{ return false; } + + + evas_object_size_hint_weight_set(m->eoVolBar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_horizontal_set(m->eoVolBar, EINA_TRUE); + elm_object_part_content_set(m->eoVolLayout, MUSIC_PART_VOLUME_BAR, m->eoVolBar); + elm_object_style_set(m->eoVolBar, MUSIC_STYLE_VOLUME_BAR); + evas_object_show(m->eoVolBar); + + m->eoBase = eoBase; + m->flagVolumeMode = false; + + return true; +} + + +void CHandleVolume::Destroy(void) +{ + ASSERT(m); + RemoveTimer(); + + evas_object_del(m->eoVolLayout); + + delete m; + m = NULL; +} + + +void CHandleVolume::Up(void) +{ + ASSERT(m); + + m_HandleVolumeKey(SOUND_UP); +} + + +void CHandleVolume::Down(void) +{ + ASSERT(m); + + m_HandleVolumeKey(SOUND_DOWN); +} + + +void CHandleVolume::Mute(void) +{ + ASSERT(m); + + m_HandleVolumeKey(SOUND_MUTE); +} + + +void CHandleVolume::RemoveTimer(void) +{ + ASSERT(m); + + if (m->etVol) { + ecore_timer_del(m->etVol); + m->etVol = NULL; + } +} diff --git a/src/views/HandleVolume.h b/src/views/HandleVolume.h new file mode 100644 index 0000000..f7cce74 --- /dev/null +++ b/src/views/HandleVolume.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __HANDLE_VOLUME_H__ +#define __HANDLE_VOLUME_H__ + + +class CHandleVolume { +private: + struct SHandleVolume *m; + +private: + static Eina_Bool sm_CbVolumeTimer(void *dt); + void m_HandleVolumeKey(int mode); + void m_HandleVolume(int mode); + void m_UpdateVolumeBar(void); + +public: + CHandleVolume() : m(0) {} + virtual ~CHandleVolume() {} + + bool Create(Evas_Object *eoBase); + virtual void Destroy(void); + + void Up(void); + void Down(void); + void Mute(void); + + void RemoveTimer(void); +}; + + +#endif /* __HANDLE_VOLUME_H__ */ \ No newline at end of file diff --git a/src/views/album-layout.cpp b/src/views/album-layout.cpp new file mode 100644 index 0000000..5b58afe --- /dev/null +++ b/src/views/album-layout.cpp @@ -0,0 +1,692 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#include +#include +#include +#include "AppCommon.h" +#include "InputHandler.h" +#include "dbg.h" +#include "i18n.h" +#include "define.h" +#include "album_info.h" +#include "song_info.h" +#include "music-controller.h" +#include "LayoutMgr.h" +#include "common.h" +#include "common-ui.h" +#include "BaseView.h" +#include "BaseLayout.h" +#include "ExtBaseLayout.h" +#include "ViewMgr.h" +#include "album-layout.h" +#include "album-songs-layout.h" +#include "base-view.h" + +#define GENGRID_ITEM_SIZE_W (263+20) +#define GENGRID_ITEM_SIZE_H (359+20) + + +enum EObjectType { + ALBUM_LAYOUT, + ALBUM_GENGRID, +}; + +struct SAlbumItemInfo { + album_info *alinfo; + Elm_Object_Item *item; +}; + +struct SCallback { + void(*cbHandleEmptyStatus)(void *cookie, bool emptyStatus); + void *cookie; +}; + +struct SAlbumLayout { + Evas_Object *win; + Evas_Object *base; + Evas_Object *grid; + Elm_Object_Item *focused_item; + Eina_List *alblist; + Eina_List *it_infolist; + Elm_Gengrid_Item_Class *item_class; + CMusicController *mhandle; + CLayoutMgr *lmgr; + CViewMgr *vmgr; + SContentInfo *ctxtinfo; + char *album_id; + CAlbumSongsLayout *layoutAlbumSongs; + SCallback callback; + CAlbumLayout* parent; + + SAlbumLayout() { + memset(this, 0, sizeof(SAlbumLayout)); + } + + ~SAlbumLayout() { + } +}; + + +char *CAlbumLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part) +{ + SAlbumItemInfo *itinfo = (SAlbumItemInfo *)data; + album_info *alinfo = NULL; + char *txt = NULL; + + if (!itinfo || !obj) + return NULL; + + alinfo = itinfo->alinfo; + txt = NULL; + + if (!strcmp(part, "elm.text")) + txt = album_info_get_name(alinfo); + else if (!strcmp(part, "elm.text1")) + txt = album_info_get_artist(alinfo); + + if (txt) + return strdup(txt); + + return NULL; +} + + +Evas_Object *CAlbumLayout::sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part) +{ + SAlbumItemInfo *itinfo = (SAlbumItemInfo *)data; + album_info *alinfo = NULL; + char *path = NULL; + Evas_Object *img = NULL; + char buf[MAX_LENGTH]; + + if (!itinfo || !obj) + return NULL; + + alinfo = itinfo->alinfo; + + if (!strcmp(part, "elm.swallow.icon")) { + img = elm_image_add(obj); + if (!img) + return NULL; + + path = album_info_get_thumb(alinfo); + if (!path) { + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_DEFAULT_THUMB_126); + elm_image_file_set(img, buf, "NULL"); + elm_image_no_scale_set(img, EINA_TRUE); + } + else { + elm_image_file_set(img, path, "NULL"); + elm_image_aspect_fixed_set(img, EINA_FALSE); + } + return img; + } + + return NULL; +} + + +void CAlbumLayout::sm_CbRemoveGridItem(void *data, Evas_Object *obj) +{ + free(data); +} + + +void CAlbumLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) +{ + CAlbumLayout *root = (CAlbumLayout*)dt; + + if (root) + root->m_OnCtxtUpdate(type, lid); +} + + +void CAlbumLayout::m_OnCtxtUpdate(EActionType type, int lid) +{ + Eina_List *list = NULL; + SSongInfo *sinfo = NULL; + EAddType mode; + + if (!m->ctxtinfo || !m->ctxtinfo->context) + return; + + if (type == ACTION_TYPE_ADDNEXT) + mode = ADD_TYPE_NEXT; + else + mode = ADD_TYPE_END; + + m->mhandle->MediaGetList(LIST_TYPE_ALBUM_SONG, + m->ctxtinfo->context, &list); + if (type == ACTION_TYPE_ADDTO) { + if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) + _ERR(" Adding songs to playlist failed "); + else + _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); + + return; + } + + m->mhandle->UpdatePlaylist(list, mode); + sinfo = (SSongInfo *)eina_list_data_get(list); + eina_list_free(list); + + if (type == ACTION_TYPE_PLAY) { + m->mhandle->Stop(); + m->mhandle->SetCurrentSong(sinfo->media_id); + } + + _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); +} + + +void CAlbumLayout::sm_CbCtxtClose(void *dt) +{ + CAlbumLayout *root = (CAlbumLayout*)dt; + + if (root) + root->m_OnCtxtClose(); +} + + +void CAlbumLayout::m_OnCtxtClose(void) +{ + m->vmgr->PopView(); + m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); + elm_object_item_focus_set(m->focused_item, EINA_TRUE); +} + + +void CAlbumLayout::sm_CbItemSelect(void *data, Elm_Object_Item *it, const char *emission, const char *source) { + CAlbumLayout *root = (CAlbumLayout*)data; + + if (root) + root->m_OnItemSelect(it, emission, source); +} + + +void CAlbumLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source) { + SAlbumItemInfo *itinfo; + + itinfo = m_FindItemInfo(m->it_infolist, it); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + m->mhandle->SetCurrentAlbum(itinfo->alinfo); + + m_ShowAlbumSongs(); +} + + +SAlbumItemInfo *CAlbumLayout::m_FindItemInfo(Eina_List *list, Elm_Object_Item *item) +{ + Eina_List *l = NULL; + SAlbumItemInfo *itinfo = NULL; + void *obj = NULL; + + if (!list || !item) + return NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SAlbumItemInfo *)obj; + if (itinfo->item == item) + return itinfo; + } + + return NULL; +} + + +SAlbumItemInfo *CAlbumLayout::m_FindItemInfoById(Eina_List *list, int alid) +{ + Eina_List *l = NULL; + SAlbumItemInfo *itinfo = NULL; + void *obj = NULL; + int id; + + if (!list) + return NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SAlbumItemInfo *)obj; + if (!itinfo->alinfo) + continue; + id = album_info_get_album_id(itinfo->alinfo); + if (alid == id) { + return itinfo; + } + } + + return NULL; +} + + +void CAlbumLayout::m_ShowAlbumSongs(void) +{ + elm_object_part_content_unset(m->base, MUSIC_PART_CONTENT); + + bool emptyStatus = m->layoutAlbumSongs->EmptyStatus(); + + if (emptyStatus == false) { + elm_object_part_content_set(m->base, MUSIC_PART_CONTENT, m->layoutAlbumSongs->Layout()); + m->lmgr->Show(MUSIC_ALBUM_SONGS_LAYOUT); + } + + if (m->callback.cbHandleEmptyStatus != NULL) { + m->callback.cbHandleEmptyStatus(m->callback.cookie, emptyStatus); + } +} + + +void CAlbumLayout::m_RemoveAlbumList(Eina_List *list) +{ + eina_list_free(list); +} + + +void CAlbumLayout::m_CreateAlbumGrid(void) +{ + Evas_Object *grid; + Elm_Gengrid_Item_Class *grid_item; + + grid = elm_gengrid_add(Layout()); + if (!grid) + return; + + evas_object_size_hint_weight_set(grid, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_gengrid_align_set(grid, 0, 0); + elm_object_part_content_set(Layout(), MUSIC_PART_ALBUM_GRID, grid); + Connect(grid, ALBUM_GENGRID, TYPE_MOUSE_MOVE | TYPE_KEY_DOWN | TYPE_REALIZED | TYPE_UNREALIZED); + elm_gengrid_item_size_set(grid, + elm_config_scale_get() * GENGRID_ITEM_SIZE_W, + elm_config_scale_get() * GENGRID_ITEM_SIZE_H); + + m->grid = grid; + + grid_item = elm_gengrid_item_class_new(); + if (!grid_item) { + evas_object_del(grid); + _ERR(" elm_genlist_item_class_new failed "); + return; + } + + grid_item->item_style = MUSIC_STYLE_ALBUM_GRID; + grid_item->func.text_get = sm_CbGetGridItemText; + grid_item->func.content_get = sm_CbGetGridItemContent; + grid_item->func.state_get = NULL; + grid_item->func.del = sm_CbRemoveGridItem; + m->item_class = grid_item; + + m_UpdateAlbumGrid(false); +} + + +void CAlbumLayout::m_EmptyAlbumGrid(bool sort_flag) +{ + if (m->grid) + elm_gengrid_clear(m->grid); + + if (!sort_flag) { + m_RemoveAlbumList(m->alblist); + m->alblist = NULL; + } + + eina_list_free(m->it_infolist); + m->it_infolist = NULL; +} + + +void CAlbumLayout::m_SortAlbumGrid(void) +{ + int(*_sort_fn[])(const void *d1, const void *d2) = { + sortalbums_az, + sortalbums_za + }; + int sort_type; + + sort_type = m->mhandle->SortType(); + + m->alblist = eina_list_sort(m->alblist, 0, _sort_fn[sort_type]); +} + + +void CAlbumLayout::m_UpdateAlbumGrid(bool sort_flag) +{ + bool r; + album_info *alinfo; + void *obj; + Eina_List *l; + SAlbumItemInfo *itinfo; + Elm_Object_Item *item; + + /* Remove existing albumgrid and prepare afresh */ + m_EmptyAlbumGrid(sort_flag); + + if (!sort_flag) { + r = m->mhandle->MediaGetList(LIST_TYPE_ALBUM, NULL, &(m->alblist)); + if (r == false || + eina_list_count(m->alblist) == 0) { + _ERR(" Fetching album list from media failed "); + m->parent->SetEmptyStatus(true); + return; + } + } + + m_SortAlbumGrid(); + + EINA_LIST_FOREACH(m->alblist, l, obj) { + alinfo = (album_info *)obj; + itinfo = (SAlbumItemInfo *)calloc(1, sizeof(*itinfo)); + if (!itinfo) + return; + + itinfo->alinfo = alinfo; + item = elm_gengrid_item_append(m->grid, m->item_class, itinfo, NULL, NULL); + itinfo->item = item; + m->it_infolist = eina_list_append(m->it_infolist, itinfo); + } +} + + +bool CAlbumLayout::Create(CLayoutMgr *mgr, const char *albumId) +{ + ASSERT(!m); + + Evas_Object *base = NULL; + Evas_Object *win = NULL; + Evas_Object *layout = NULL; + CMusicController *mhandle = NULL; + CViewMgr *vmgr = NULL; + + m = new SAlbumLayout; + if (!m) { + _ERR(" albumlayout data allocation failed "); + return false; + } + + vmgr = CViewMgr::GetInstance(); + if (!vmgr) { + _ERR(" get viewmgr failed "); + delete m; + m = NULL; + return false; + } + + base = mgr->Base(); + if (!base) { + _ERR(" get base failed "); + delete m; + m = NULL; + return false; + } + + win = vmgr->Window(); + if (!win) { + _ERR(" vimewmgr get win failed "); + delete m; + m = NULL; + return false; + } + + mhandle = CMusicController::GetInstance(); + if (!mhandle) { + _ERR(" music controller get music instance failed "); + delete m; + m = NULL; + return false; + } + + layout = _add_base(base, MUSIC_ALBUM_LAYOUT); + if (!layout) { + _ERR(" get layout failed "); + delete m; + m = NULL; + return false; + } + + bool r = CExtBaseLayout::Create(layout); + if (!r) { + _ERR(" CBaseLayout creation failed "); + evas_object_del(layout); + delete m; + m = NULL; + return false; + } + + if (albumId) { + m->album_id = new char[strlen(albumId) + 1]; + strcpy(m->album_id, albumId); + } + else { + m->album_id = NULL; + } + + m->win = win; + m->base = base; + m->vmgr = vmgr; + m->mhandle = mhandle; + m->lmgr = mgr; + m->callback.cbHandleEmptyStatus = NULL; + m->callback.cookie = NULL; + m->parent = this; + + m->layoutAlbumSongs = new CAlbumSongsLayout(MUSIC_ALBUM_SONGS_LAYOUT); + m->layoutAlbumSongs->Create(m->lmgr); + m->lmgr->AddLayout(m->layoutAlbumSongs); + + m_CreateAlbumGrid(); + + Connect(layout, ALBUM_LAYOUT, TYPE_KEY_DOWN); + + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_LAYOUT_UPDATE; + parcel.layoutId = MUSIC_ALBUM_LAYOUT; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + + return true; +} + +void CAlbumLayout::Destroy(void) +{ + ASSERT(m); + + m->lmgr->RemoveLayout(m->layoutAlbumSongs); + m->layoutAlbumSongs->Destroy(); + delete m->layoutAlbumSongs; + + m_EmptyAlbumGrid(false); + CExtBaseLayout::Destroy(); + evas_object_del(Layout()); + + free(m->ctxtinfo); + delete[] m->album_id; + delete m; + m = NULL; +} + + +void CAlbumLayout::t_OnShow(void) +{ + ASSERT(m); + + SAlbumItemInfo *itinfo = NULL; + + m_UpdateAlbumGrid(false); + + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_LAYOUT_UPDATE; + parcel.layoutId = MUSIC_ALBUM_LAYOUT; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + + evas_object_show(Layout()); + + if (m->album_id) { + itinfo = m_FindItemInfoById(m->it_infolist, + atoi(m->album_id)); + if (itinfo) { + m->mhandle->SetCurrentAlbum(itinfo->alinfo); + m_ShowAlbumSongs(); + return; + } + delete[] m->album_id; + m->album_id = NULL; + } +} + + +void CAlbumLayout::Update(bool focusFlag) +{ + ASSERT(m); + + album_info *alinfo = NULL; + SAlbumItemInfo *itinfo = NULL; + int id; + + if (!focusFlag) { + m_UpdateAlbumGrid(true); + return; + } + + alinfo = m->mhandle->CurrentAlbum(); + if (alinfo) { + id = album_info_get_album_id(alinfo); + itinfo = m_FindItemInfoById(m->it_infolist, id); + if (itinfo) { + m->mhandle->SetCurrentAlbum(NULL); + elm_gengrid_item_show(itinfo->item, + ELM_GENGRID_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(itinfo->item, EINA_TRUE); + return; + } + } + + elm_object_focus_set(m->grid, EINA_TRUE); +} + + +void CAlbumLayout::SetEmptyStatusHandleCallback(void(*handleEmptyStatusCb)(void *cookie, bool emptyStatus), void *cookie) +{ + ASSERT(m); + + m->callback.cbHandleEmptyStatus = handleEmptyStatusCb; + m->callback.cookie = cookie; +} + + +void CAlbumLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) +{ + switch (id) { + case ALBUM_LAYOUT: + if (!strcmp(ev->keyname, KEY_BACK)) { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_FOCUS_UPDATE; + parcel.layoutId = NULL; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + break; + + case ALBUM_GENGRID: + { + Elm_Object_Item *it = NULL; + SContentInfo *ctxtinfo = NULL; + SAlbumItemInfo *itinfo = NULL; + + if (strcmp(ev->keyname, KEY_MENU)) + return; + + it = elm_object_focused_item_get(obj); + if (!it) { + _ERR(" unable to get focused item "); + return; + } + m->focused_item = it; + + if (m->ctxtinfo) { + free(m->ctxtinfo); + m->ctxtinfo = NULL; + } + + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; + + itinfo = m_FindItemInfo(m->it_infolist, it); + if (!itinfo) { + free(ctxtinfo); + return; + } + + ctxtinfo->type = CONTEXT_TYPE_ALBUM; + ctxtinfo->context = itinfo->alinfo; + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + + m->ctxtinfo = ctxtinfo; + + SParcel parcel; + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); + } + break; + + default: + _ERR("Invalid Object"); + ASSERT(0); + break; + } +} + + +void CAlbumLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) +{ + Elm_Object_Item *item; + + item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL, NULL); + if (!item) + return; + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); +} + + +void CAlbumLayout::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + elm_object_item_signal_callback_add(item, + MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, + sm_CbItemSelect, this); +} + + +void CAlbumLayout::OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + elm_object_item_signal_callback_del(item, + MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, + sm_CbItemSelect); +} diff --git a/src/views/album-songs-layout.cpp b/src/views/album-songs-layout.cpp new file mode 100644 index 0000000..1364485 --- /dev/null +++ b/src/views/album-songs-layout.cpp @@ -0,0 +1,758 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "AppCommon.h" +#include "dbg.h" +#include "i18n.h" +#include "define.h" +#include "song_info.h" +#include "album_info.h" +#include "music-controller.h" +#include "LayoutMgr.h" +#include "common.h" +#include "common-ui.h" +#include "BaseView.h" +#include "ExtBaseLayout.h" +#include "ViewMgr.h" +#include "InputHandler.h" +#include "album-songs-layout.h" +#include "base-view.h" + +#define TOTAL_ADD_BTNS 3 + + +enum EBtnType { + ABTN_PLAY, + ABTN_NEXT, + ABTN_LAST +}; + +struct SAlbumSongsItemInfo { + SSongInfo *sinfo; + Elm_Object_Item *item; +}; + +struct SAlbumSongsLayout { + Evas_Object *win; + Evas_Object *base; + Evas_Object *songlist; + Elm_Object_Item *focused_item; + + CMusicController* mhandle; + CLayoutMgr *mgr; + CViewMgr *vmgr; + SContentInfo *ctxtinfo; + Eina_List *slist; + Eina_List *it_infolist; + Elm_Genlist_Item_Class *item_class; + int total_duration; + CAlbumSongsLayout *parent; + + class CHandlerButton : public CListenerMgr, public IMouseMoveListener, public IMouseClickedListener { + public: + struct SCallback { + void(*gotoPlayBackView)(void* cookie, int mode, char *mediaId); + void* cookie; + }; + + private: + SAlbumSongsLayout *m; + + protected: + SCallback m_callback; + + public: + CHandlerButton(SAlbumSongsLayout *ins) : + IMouseMoveListener(this), + IMouseClickedListener(this) { + m = ins; + } + + void SetCallback(const SCallback* cb) { + m_callback = *cb; + } + + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) + { + if (!obj) + return; + + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); + } + + virtual void OnMouseClicked(int id, Evas_Object *obj) { + EBtnType type = (EBtnType)id; + + switch (type) + { + case ABTN_PLAY: + if (m_callback.gotoPlayBackView) + m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_FRESH, NULL); + break; + + case ABTN_NEXT: + if (m_callback.gotoPlayBackView) + m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_NEXT, NULL); + break; + + case ABTN_LAST: + if (m_callback.gotoPlayBackView) + m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_END, NULL); + break; + + default: + _ERR("Invalid Button Type"); + ASSERT(0); + break; + } + } + } *pHandlerButton; + + class CHandlerGenlist : public CListenerMgr, public IMouseMoveListener, public IKeyDownListener { + public: + struct SCallback { + void(*gotoPlaybackView)(void* cookie, int mode, char *mediaId); + void* cookie; + }; + + private: + SAlbumSongsLayout *m; + SCallback m_callback; + + private: + SAlbumSongsItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item) + { + Eina_List *l = NULL; + SAlbumSongsItemInfo *itinfo = NULL; + void *obj = NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SAlbumSongsItemInfo *)obj; + if (itinfo->item == item) + return itinfo; + } + + return NULL; + } + + static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) + { + CHandlerGenlist *root = (CHandlerGenlist*)dt; + + if (root) + root->m_OnCtxtUpdate(type, lid); + } + + void m_OnCtxtUpdate(EActionType type, int lid) + { + Eina_List *list = NULL; + EAddType mode; + + if (!m->ctxtinfo || !m->ctxtinfo->context) + return; + + if (type == ACTION_TYPE_ADDNEXT) + mode = ADD_TYPE_NEXT; + else + mode = ADD_TYPE_END; + + list = eina_list_append(list, m->ctxtinfo->context); + if (type == ACTION_TYPE_ADDTO) { + if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) + _ERR(" Adding songs to playlist failed "); + else + _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); + + return; + } + + m->mhandle->UpdatePlaylist(list, mode); + eina_list_free(list); + + if (type == ACTION_TYPE_PLAY) { + m->mhandle->Stop(); + m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context)); + } + + _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); + } + + static void sm_CbCtxtClose(void *dt) + { + CHandlerGenlist *root = (CHandlerGenlist*)dt; + + if (root) + root->m_OnCtxtClose(); + } + + void m_OnCtxtClose(void) + { + m->vmgr->PopView(); + m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); + elm_object_item_focus_set(m->focused_item, EINA_TRUE); + } + + static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info) + { + CHandlerGenlist *root = (CHandlerGenlist*)data; + + if (root) + root->m_OnItemSelect(obj, event_info); + } + + void m_OnItemSelect(Evas_Object *obj, void *event_info) + { + SAlbumSongsItemInfo *itinfo = NULL; + char *mediaId = NULL; + + itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + mediaId = song_info_get_media_id(itinfo->sinfo); + + if (m_callback.gotoPlaybackView) { + m_callback.gotoPlaybackView(m_callback.cookie, ADD_TYPE_FRESH, mediaId); + } + } + + public: + CHandlerGenlist(SAlbumSongsLayout *ins) : + IMouseMoveListener(this), + IKeyDownListener(this) { + m = ins; + } + + virtual ~CHandlerGenlist() { + EmptySongList(); + } + + void SetCallback(const SCallback* cb) { + m_callback = *cb; + } + + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { + Elm_Object_Item *item; + + item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL); + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); + } + + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { + Elm_Object_Item *it = NULL; + SContentInfo *ctxtinfo = NULL; + SAlbumSongsItemInfo *itinfo = NULL; + + if (strcmp(ev->keyname, KEY_MENU)) + return; + + it = elm_object_focused_item_get(obj); + if (!it) { + _ERR(" unable to get focused item "); + return; + } + m->focused_item = it; + + if (m->ctxtinfo) { + free(m->ctxtinfo); + m->ctxtinfo = NULL; + } + + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; + + itinfo = m_FindItemInfoFromItem(m->it_infolist, it); + if (!itinfo) { + free(ctxtinfo); + return; + } + + ctxtinfo->type = CONTEXT_TYPE_SONG; + ctxtinfo->context = itinfo->sinfo; + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + + m->ctxtinfo = ctxtinfo; + + SParcel parcel; + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); + } + + void UpdateSongList(void) + { + SSongInfo *sinfo = NULL; + void *obj = NULL; + Eina_List *l = NULL; + SAlbumSongsItemInfo *itinfo = NULL; + Elm_Object_Item *item = NULL; + int dur = 0; + album_info *alinfo = NULL; + + if (!m->songlist || !m->item_class) + return; + + /* Remove existing songlist and prepare afresh */ + EmptySongList(); + + alinfo = m->mhandle->CurrentAlbum(); + if (!m->mhandle->MediaGetList(LIST_TYPE_ALBUM_SONG, alinfo, &(m->slist))) { + _ERR(" Fetching song list from media failed "); + return; + } + + EINA_LIST_FOREACH(m->slist, l, obj) { + sinfo = (SSongInfo *)obj; + itinfo = (SAlbumSongsItemInfo *)calloc(1, sizeof(*itinfo)); + if (!itinfo) + return; + + itinfo->sinfo = sinfo; + item = elm_genlist_item_append(m->songlist, m->item_class, + itinfo, NULL, ELM_GENLIST_ITEM_NONE, sm_CbItemSelect, this); + itinfo->item = item; + m->it_infolist = eina_list_append(m->it_infolist, itinfo); + song_info_get_duration(sinfo, &dur); + m->total_duration = m->total_duration + dur; + } + } + + void EmptySongList(void) + { + if (m->songlist) + elm_genlist_clear(m->songlist); + + if (m->slist) { + eina_list_free(m->slist); + m->slist = NULL; + } + + if (m->it_infolist) { + eina_list_free(m->it_infolist); + m->it_infolist = NULL; + } + + m->total_duration = 0; + } + } *pHandlerGenlist; + + SAlbumSongsLayout() { + memset(this, 0, sizeof(SAlbumSongsLayout)); + pHandlerGenlist = new CHandlerGenlist(this); + pHandlerButton = new CHandlerButton(this); + } + + ~SAlbumSongsLayout() { + delete pHandlerGenlist; + delete pHandlerButton; + } +}; + + +struct SBtnInfo { + const char *name; + const char *part; + const char *style; + const char *icon; +}; + + +char *CAlbumSongsLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part) +{ + SAlbumSongsItemInfo *itinfo = (SAlbumSongsItemInfo *)data; + SSongInfo *sinfo = NULL; + char buf[MAX_LENGTH]; + char *timestr = NULL; + int duration; + int index; + + if (!itinfo || !obj) + return NULL; + + sinfo = itinfo->sinfo; + + snprintf(buf, sizeof(buf), "%s", MUSIC_STR_EMPTY); + + if (!strcmp(part, "elm.text")) { + index = elm_genlist_item_index_get(itinfo->item); + if ((index & 1) == 1) { + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_EVEN_ROW, MUSIC_BASE_VIEW); + } + else { + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_ODD_ROW, MUSIC_BASE_VIEW); + } + snprintf(buf, sizeof(buf), "%d", index + 1); + } + else if (!strcmp(part, "elm.text1")) + snprintf(buf, sizeof(buf), "%s", song_info_get_title(sinfo)); + else if (!strcmp(part, "elm.text2")) + snprintf(buf, sizeof(buf), "%s", song_info_get_artist(sinfo)); + else if (!strcmp(part, "elm.text3")) { + if (song_info_get_duration(sinfo, &duration)) { + timestr = _get_timestr_from_milseconds(duration); + if (timestr) { + snprintf(buf, sizeof(buf), "%s", timestr); + free(timestr); + } + } + } + + if (strcmp(buf, MUSIC_STR_EMPTY)) + return strdup(buf); + + return NULL; +} + + +void CAlbumSongsLayout::sm_CbRemoveListItem(void *data, Evas_Object *obj) +{ + free(data); +} + + +void CAlbumSongsLayout::sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId) +{ + CAlbumSongsLayout *root = (CAlbumSongsLayout *)cookie; + if (root) + root->m_GotoPlayback(mode, mediaId); +} + + +int CAlbumSongsLayout::m_ConvertToMin(int milsec) +{ + int min; + min = milsec / 60000; /*milli seconds per minute*/ + + return min; +} + + +void CAlbumSongsLayout::m_GotoPlayback(int mode, char *id) +{ + Eina_List *list = NULL; + Eina_List *l = NULL; + SAlbumSongsItemInfo *itinfo = NULL; + void *obj = NULL; + + if (!m->it_infolist || eina_list_count(m->it_infolist) == 0) { + _ERR(" No songs for playback "); + return; + } + + EINA_LIST_FOREACH(m->it_infolist, l, obj) { + itinfo = (SAlbumSongsItemInfo *)obj; + list = eina_list_append(list, itinfo->sinfo); + } + + m->mhandle->UpdatePlaylist(list, mode); + eina_list_free(list); + + if (mode == ADD_TYPE_FRESH) { + m->mhandle->Stop(); + if (id) /* If want to play selected song */ + m->mhandle->SetCurrentSong(id); + } + + _update_playback_view((EAddType)mode, Layout(), NULL); +} + + +Evas_Object *CAlbumSongsLayout::m_AddAlbumCover(void) +{ + Evas_Object *album_cover = NULL; + + album_cover = elm_image_add(Layout()); + if (!album_cover) + return NULL; + + evas_object_size_hint_weight_set(album_cover, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + return album_cover; +} + + +void CAlbumSongsLayout::m_CreateTopSection(void) +{ + Evas_Object *thumb = NULL; + int i; + Evas_Object *btn[TOTAL_ADD_BTNS]; + Evas_Object *img = NULL; + char *path = NULL; + char buf[MAX_LENGTH]; + album_info *alinfo = NULL; + SBtnInfo btninfo[TOTAL_ADD_BTNS]; + Evas_Object *layout = Layout(); + + btninfo[ABTN_PLAY].name = MUSIC_STR_PLAY; + btninfo[ABTN_PLAY].part = MUSIC_PART_ALBUM_PLAYBTN; + btninfo[ABTN_PLAY].style = MUSIC_STYLE_ADD_PLAY_BTN; + btninfo[ABTN_PLAY].icon = MUSIC_IMAGE_ADD_PLAY; + + btninfo[ABTN_NEXT].name = MUSIC_STR_ADDNEXT; + btninfo[ABTN_NEXT].part = MUSIC_PART_ALBUM_NEXTBTN; + btninfo[ABTN_NEXT].style = MUSIC_STYLE_ADD_NEXT_BTN; + btninfo[ABTN_NEXT].icon = MUSIC_IMAGE_ADD_NEXT; + + btninfo[ABTN_LAST].name = MUSIC_STR_ADDLAST; + btninfo[ABTN_LAST].part = MUSIC_PART_ALBUM_LASTBTN; + btninfo[ABTN_LAST].style = MUSIC_STYLE_ADD_LAST_BTN; + btninfo[ABTN_LAST].icon = MUSIC_IMAGE_ADD_LAST; + + thumb = m_AddAlbumCover(); + if (!thumb) + return; + + for (i = 0; i < TOTAL_ADD_BTNS; i++) { + btn[i] = elm_button_add(layout); + if (!btn[i]) + continue; + + evas_object_size_hint_weight_set(btn[i], + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(btn[i], _(btninfo[i].name)); + elm_object_style_set(btn[i], btninfo[i].style); + + m->pHandlerButton->Connect(btn[i], i); + + img = elm_image_add(btn[i]); + if (img) { + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + btninfo[i].icon); + elm_image_file_set(img, buf, NULL); + elm_object_part_content_set(btn[i], + MUSIC_PART_ELM_SWALLOWICON, img); + } + + elm_object_part_content_set(layout, btninfo[i].part, + btn[i]); + } + + elm_object_focus_set(btn[0], EINA_TRUE); + alinfo = m->mhandle->CurrentAlbum(); + if (!alinfo) + return; + + path = album_info_get_thumb(alinfo); + if (path) { + elm_image_file_set(thumb, path, NULL); + elm_image_aspect_fixed_set(thumb, EINA_FALSE); + } + else { + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_DEFAULT_THUMB_126); + elm_image_file_set(thumb, buf, NULL); + elm_image_no_scale_set(thumb, EINA_TRUE); + } + + elm_object_part_content_set(layout, MUSIC_PART_ALBUM_THUMB, + thumb); + elm_object_part_text_set(layout, MUSIC_PART_ALBUM_NAME, + album_info_get_name(alinfo)); + elm_object_part_text_set(layout, MUSIC_PART_ALBUM_ARTIST, + album_info_get_artist(alinfo)); + + snprintf(buf, sizeof(buf), "%d", eina_list_count(m->slist)); + elm_object_part_text_set(layout, MUSIC_PART_ALBUM_SONGCOUNT, buf); + snprintf(buf, sizeof(buf), "%d %s", m_ConvertToMin(m->total_duration), _(MUSIC_TEXT_MIN)); + + elm_object_part_text_set(layout, MUSIC_PART_ALBUM_TIME, buf); +} + + +void CAlbumSongsLayout::m_CreateSongList(void) +{ + Evas_Object *genlist = NULL; + Elm_Genlist_Item_Class *list_item = NULL; + Evas_Object *layout = Layout(); + + genlist = elm_genlist_add(layout); + if (!genlist) + return; + + elm_genlist_homogeneous_set(genlist, EINA_TRUE); + evas_object_size_hint_weight_set(genlist, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(layout, MUSIC_PART_SONGLIST, genlist); + m->pHandlerGenlist->Connect(genlist); + m->songlist = genlist; + + list_item = elm_genlist_item_class_new(); + if (!list_item) { + evas_object_del(genlist); + _ERR(" elm_genlist_item_class_new failed "); + return; + } + list_item->item_style = MUSIC_STYLE_ALBUM_SONGLIST; + list_item->func.text_get = sm_CbGetListItemText; + list_item->func.content_get = NULL; + list_item->func.state_get = NULL; + list_item->func.del = sm_CbRemoveListItem; + m->item_class = list_item; + + m->pHandlerGenlist->UpdateSongList(); +} + + +bool CAlbumSongsLayout::Create(CLayoutMgr *mgr) +{ + ASSERT(!m); + + Evas_Object *base = NULL; + Evas_Object *win = NULL; + Evas_Object *layout = NULL; + CMusicController *mhandle; + CViewMgr *vmgr; + + if (!mgr) + return false; + + m = new SAlbumSongsLayout; + if (!m) { + _ERR(" calloc failed "); + return false; + } + + vmgr = CViewMgr::GetInstance(); + if (!vmgr) { + _ERR(" get view mgr failed "); + delete m; + m = NULL; + return false; + } + + base = mgr->Base(); + if (!base) { + _ERR(" get base failed "); + delete m; + m = NULL; + return false; + } + + win = vmgr->Window(); + if (!win) { + _ERR(" vimewmgr get win failed "); + delete m; + m = NULL; + return false; + } + + mhandle = CMusicController::GetInstance(); + if (!mhandle) { + _ERR(" music controller get music instance failed "); + delete m; + m = NULL; + return false; + } + + layout = _add_base(base, MUSIC_ALBUM_SONGS_LAYOUT); + if (!layout) { + _ERR(" get layout failed "); + delete m; + m = NULL; + return false; + } + + bool r = CExtBaseLayout::Create(layout); + if (!r) { + _ERR(" CBaseLayout creation failed "); + evas_object_del(layout); + delete m; + m = NULL; + return false; + } + + m->win = win; + m->base = base; + m->vmgr = vmgr; + m->mhandle = mhandle; + m->mgr = mgr; + m->parent = this; + + Connect(layout); + + SAlbumSongsLayout::CHandlerGenlist::SCallback listCb; + listCb.gotoPlaybackView = &sm_CbGoToPlaybackView; + listCb.cookie = this; + m->pHandlerGenlist->SetCallback(&listCb); + + SAlbumSongsLayout::CHandlerButton::SCallback btnCb; + btnCb.gotoPlayBackView = &sm_CbGoToPlaybackView; + btnCb.cookie = this; + m->pHandlerButton->SetCallback(&btnCb); + + return true; +} + +void CAlbumSongsLayout::Destroy(void) +{ + ASSERT(m); + + m->pHandlerGenlist->EmptySongList(); + CExtBaseLayout::Destroy(); + evas_object_del(Layout()); + + free(m->ctxtinfo); + delete m; + m = NULL; +} + + +void CAlbumSongsLayout::t_OnShow(void) +{ + ASSERT(m); + + m->pHandlerGenlist->EmptySongList(); + + m_CreateSongList(); + m_CreateTopSection(); + + CBaseLayout::t_OnShow(); + + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_LAYOUT_UPDATE; + parcel.layoutId = MUSIC_ALBUM_SONGS_LAYOUT; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); +} + + +void CAlbumSongsLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) +{ + if (!strcmp(ev->keyname, KEY_BACK)) { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_DEPTH_UPDATE; + parcel.layoutId = MUSIC_ALBUM_SONGS_LAYOUT; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } +} \ No newline at end of file diff --git a/src/views/artist-layout.cpp b/src/views/artist-layout.cpp new file mode 100644 index 0000000..71ba47c --- /dev/null +++ b/src/views/artist-layout.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "AppCommon.h" +#include "dbg.h" +#include "i18n.h" +#include "define.h" + +#include +#include "category_info.h" +#include "album_info.h" +#include "song_info.h" +#include "music-controller.h" +#include "LayoutMgr.h" +#include "entry-popup.h" +#include "common.h" +#include "common-ui.h" +#include "BaseView.h" +#include "ExtBaseLayout.h" +#include "ViewMgr.h" +#include "category-layout.h" +#include "base-view.h" +#include "artist-layout.h" + + +struct SArtistLayout { +}; + + +void CArtistLayout::t_HandleItemSelect(SCatItemInfo *itinfo) +{ + int count; + album_info *alinfo = NULL; + Eina_List *alist = NULL; + + if (!itinfo) + return; + + t.c_catinfo = category_info_duplicate(itinfo->catinfo); + count = 0; + + alist = category_info_get_albumlist(t.c_catinfo); + if (alist) + count = eina_list_count(alist); + + if (count <= 0) + return; + + t.depth = E_DEPTH_ALBUM; + if (count == 1) { + t.depth = E_DEPTH_SONG; + if (t.c_alinfo) { + album_info_destroy(t.c_alinfo); + t.c_alinfo = NULL; + } + alinfo = (album_info *)eina_list_nth(t.c_catinfo->albumlist, 0); + t.c_alinfo = album_info_duplicate(alinfo); + } +} + + +bool CArtistLayout::t_GetMediaList(Eina_List **list) +{ + return CMusicController::GetInstance()->MediaGetList(LIST_TYPE_ARTIST, NULL, list); +} diff --git a/src/views/base-view.cpp b/src/views/base-view.cpp new file mode 100644 index 0000000..07749fe --- /dev/null +++ b/src/views/base-view.cpp @@ -0,0 +1,1266 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "AppCommon.h" +#include "i18n.h" +#include "define.h" +#include "dbg.h" + +#include "AppCommon.h" +#include "song_info.h" +#include "category_info.h" +#include "music-controller.h" +#include "LayoutMgr.h" +#include "common.h" +#include "InputHandler.h" +#include "BaseView.h" +#include "BaseLayout.h" +#include "ExtBaseLayout.h" +#include "ViewMgr.h" +#include "base-view.h" +#include "common-ui.h" +#include "volume-control.h" +#include "song-layout.h" +#include "album-layout.h" +#include "category-layout.h" +#include "folder-layout.h" +#include "album-songs-layout.h" +#include "playback-view.h" +#include "artist-layout.h" +#include "genre-layout.h" +#include "playlist-layout.h" +#include "HandleVolume.h" + +#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) +#define PLAYSONG_FONT_SIZE 30 +#define TOTAL_GROUP_BTNS 6 +#define TOTAL_TOP_BTNS 3 +#define VOLUME_TIMER_INTERVAL 5 /* seconds */ +#define MAX_SHOW_TIME 10 +#define MUSIC_SLIDE_DURATION 15 +#define MUSIC_WRAP_WIDTH 400 + + +const char *g_sourceText[] = { + N_("All Source"), // SOURCE_TYPE_ALL + N_("TV"), // SOURCE_TYPE_TV + N_("USB") // SOURCE_TYPE_USB +}; + +const char *g_sortText[] = { + N_("Title A-Z"), // E_SORT_TITLE_A_Z + N_("Title Z-A"), // E_SORT_TITLE_Z_A + N_("Artist A-Z"), // E_SORT_ARTIST_A_Z + N_("Artist Z-A"), // E_SORT_ARTIST_Z_A + N_("Album A-Z"), // E_SORT_ALBUM_A_Z + N_("Album Z-A") // E_SORT_ALBUM_Z_A +}; + +const char *g_sortTextAlbum[] = { + N_("Album A-Z"), + N_("Album Z-A") +}; + +const char *g_sortTextArtist[] = { + N_("Artist A-Z"), + N_("Artist Z-A") +}; + +const char *g_sortTextGenre[] = { + N_("Genre A-Z"), + N_("Genre Z-A") +}; + +const char *g_sortTextFolder[] = { + N_("Title A-Z"), + N_("Title Z-A") +}; + +const char *g_sortTextPlaylists[] = { + N_("Playlist A-Z"), + N_("Playlist Z-A") +}; + +const char *g_sourceArg[] = { + "all", // SOURCE_TYPE_ALL + "tv", // SOURCE_TYPE_TV + "usb" // SOURCE_TYPE_USB +}; + + +Evas_Object *s_AddButton(Evas_Object *box) +{ + Evas_Object *button; + + if (!box) + return NULL; + + button = elm_button_add(box); + if (!button) + return NULL; + + evas_object_size_hint_weight_set(button, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(button); + + return button; +} + + +struct SMusicBaseView { + Evas_Object *win; + Evas_Object *base; + Evas_Object *content; + Evas_Object *plbackbtn; + Evas_Object *plsonglbl; + Evas_Object *group_btn[TOTAL_GROUP_BTNS]; + Evas_Object *srcbtn; + Evas_Object *sortbtn; + Evas_Object *ctxpopup; + Evas_Object *popup; + Elm_Transit *transit; + Evas_Object *c_grpbtn; + CMusicController *mhandle; + CLayoutMgr *lmgr; + struct _arg_list *arglist; + int btntype; + bool fresh_view; + + CSongLayout *layoutSong; + CAlbumLayout *layoutAlbum; + + CArtistLayout *layoutArtist; + CGenreLayout *layoutGenre; + CPlaylistLayout *layoutPlaylists; + + CFolderLayout *layoutFolder; + + CMusicBaseView *parent; + CHandleVolume *pHandleVolume; + + class CHandlerBtn : public CListenerMgr, public IKeyDownListener, public IMouseMoveListener, public IMouseClickedListener { + public: + SMusicBaseView *m; + void(*m_cbClicked)(void* cookie, Evas_Object *obj); + void *m_cookie; + + public: + CHandlerBtn(SMusicBaseView *ins) : IKeyDownListener(this), IMouseMoveListener(this), IMouseClickedListener(this) { m = ins; } + + void SetCallback(void(*clicked)(void* cookie, Evas_Object *obj), void* cookie) { + m_cbClicked = clicked; + m_cookie = cookie; + } + + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); + } + }; + + class CHandlerBtnGroup : public CHandlerBtn { + public: + CHandlerBtnGroup(SMusicBaseView *ins) : CHandlerBtn(ins) {} + + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { + if (!strcmp(ev->keyname, KEY_BACK)) { + m->mhandle->Stop(); + elm_exit(); + } + } + + virtual void OnMouseClicked(int id, Evas_Object *obj) { + if (m->c_grpbtn == obj) + return; + + elm_object_signal_emit(m->c_grpbtn, + MUSIC_SIGNAL_GROUP_UNSELECTED, MUSIC_BASE_VIEW); + m->c_grpbtn = obj; + elm_object_signal_emit(m->c_grpbtn, + MUSIC_SIGNAL_GROUP_SELECTED, MUSIC_BASE_VIEW); + + if (obj == m->group_btn[GRP_FOLDER]) + elm_object_text_set(m->sortbtn, _(g_sortTextFolder[0])); + else if (obj == m->group_btn[GRP_PLAYLISTS]) + elm_object_text_set(m->sortbtn, _(g_sortTextPlaylists[0])); + else if (obj == m->group_btn[GRP_ALBUM]) + elm_object_text_set(m->sortbtn, _(g_sortTextAlbum[0])); + else if (obj == m->group_btn[GRP_ARTIST]) + elm_object_text_set(m->sortbtn, _(g_sortTextArtist[0])); + else if (obj == m->group_btn[GRP_GENRE]) + elm_object_text_set(m->sortbtn, _(g_sortTextGenre[0])); + else + elm_object_text_set(m->sortbtn, _(g_sortText[0])); + + m->mhandle->SetSortType(0); + + if (m_cbClicked) + m_cbClicked(m_cookie, obj); + } + } *pHandlerBtnGroup[TOTAL_GROUP_BTNS]; + + class CHandlerBtnPlayback : public CHandlerBtn { + private: + void m_GotoPlayback(void) + { + if (!CViewMgr::GetInstance()->PushView(MUSIC_PLAYBACK_VIEW, NULL)) + _ERR(" viewmgr push view MUSIC_PLAYBACK_VIEW failed "); + } + + public: + CHandlerBtnPlayback(SMusicBaseView *ins) : CHandlerBtn(ins) {} + + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { + if (!strcmp(ev->keyname, KEY_BACK)) + elm_object_focus_set(m->c_grpbtn, EINA_TRUE); + } + + virtual void OnMouseClicked(int id, Evas_Object *obj) { + Eina_List *list = NULL; + bool r; + int state; + + state = m->mhandle->PlayState(); + + if (state != PLAY_STATUS_INITIAL) { + if (!CViewMgr::GetInstance()->PushView(MUSIC_PLAYBACK_VIEW, NULL)) + _ERR(" viewmgr push view failed "); + + return; + } + + r = m->mhandle->MediaGetList(LIST_TYPE_SONG, NULL, &list); + if (r == false || eina_list_count(list) == 0) { + _ERR(" No songs "); + return; + } + + m->mhandle->Stop(); + m->mhandle->UpdatePlaylist(list, ADD_TYPE_FRESH); + eina_list_free(list); + + m_GotoPlayback(); + } + } *pHandlerBtnPlayback; + + class CHandlerBtnCtxpopup : public CHandlerBtn { + private: + ETopBtnType m_type; + + public: + CHandlerBtnCtxpopup(SMusicBaseView *ins, ETopBtnType type) : CHandlerBtn(ins) { m_type = type; } + + private: + static void sm_CbCtxPopupBtnClicked(void *dt, Evas_Object *obj, void *ev) + { + CHandlerBtnCtxpopup *root = (CHandlerBtnCtxpopup*)dt; + if (root) + root->m_CbCtxPopupBtnClicked(obj, ev); + } + + void m_CbCtxPopupBtnClicked(Evas_Object *obj, void *ev) + { + const char *text = NULL; + const char *layout_id = NULL; + int size = 0; + int type = 0; + + text = elm_object_text_get(obj); + + if (m->btntype == TOP_BTN_TYPE_SOURCE) { + size = ARRAY_SIZE(g_sourceText); + st_FindIndex(g_sourceText, size, text, &type); + DestroyCtxPopup(); + if (type == m->mhandle->SourceType()) + return; + + m->mhandle->SetSourceType(type); + elm_object_text_set(m->srcbtn, _(text)); + } + else { + layout_id = m->lmgr->Layout()->LayoutId(); + if (!strcmp(layout_id, MUSIC_FOLDER_LAYOUT)) { + size = ARRAY_SIZE(g_sortTextFolder); + st_FindIndex(g_sortTextFolder, size, text, &type); + } + else if (!strcmp(layout_id, MUSIC_ALBUM_LAYOUT)) { + size = ARRAY_SIZE(g_sortTextAlbum); + st_FindIndex(g_sortTextAlbum, size, text, &type); + } + else if (!strcmp(layout_id, MUSIC_CATEGORY_PLAYLISTS_LAYOUT)) { + size = ARRAY_SIZE(g_sortTextPlaylists); + st_FindIndex(g_sortTextPlaylists, size, text, &type); + } + else if (!strcmp(layout_id, MUSIC_CATEGORY_ARTIST_LAYOUT)) { + size = ARRAY_SIZE(g_sortTextArtist); + st_FindIndex(g_sortTextArtist, size, text, &type); + } + else if (!strcmp(layout_id, MUSIC_CATEGORY_GENRE_LAYOUT)) { + size = ARRAY_SIZE(g_sortTextGenre); + st_FindIndex(g_sortTextGenre, size, text, &type); + } + else { + size = ARRAY_SIZE(g_sortText); + st_FindIndex(g_sortText, size, text, &type); + } + DestroyCtxPopup(); + if (type == m->mhandle->SortType()) + return; + + m->mhandle->SetSortType(type); + elm_object_text_set(m->sortbtn, _(text)); + } + + if (m_cbClicked) + m_cbClicked(m_cookie, obj); + } + + static void sm_CbCtxPopupBtnKeyPressed(void *dt, Evas *e, Evas_Object *obj, void *ei) + { + CHandlerBtnCtxpopup *root = (CHandlerBtnCtxpopup*)dt; + if (root) + root->m_OnCtxPopupBtnKeyPressed(e, obj, (Evas_Event_Key_Down*)ei); + } + + void m_OnCtxPopupBtnKeyPressed(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) + { + if (strcmp(ev->keyname, KEY_BACK) == 0) + DestroyCtxPopup(); + } + + protected: + static bool st_FindIndex(const char **arr, int arrsize, const char *text, int *index) + { + int i; + + if (!arr || !arrsize || !text) + return false; + + for (i = 0; i < arrsize; i++) { + if (arr[i] && !strcmp(arr[i], text)) { + *index = i; + return true; + } + } + + return false; + } + + void t_CreateCtxPopup(int btnType) + { + Evas_Object *ctxpopup = NULL, *box = NULL, *btn = NULL; + Evas_Object *firstbtn = NULL; + int i, size, selected_index; + const char **arr; + const char *layout_id = NULL; + const char *part = NULL; + + if (!m->base) + return; + + ctxpopup = elm_ctxpopup_add(m->base); + if (!ctxpopup) + return; + + box = elm_box_add(ctxpopup); + if (!box) { + evas_object_del(ctxpopup); + return; + } + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0); + + if (btnType == TOP_BTN_TYPE_SOURCE) { + arr = g_sourceText; + size = ARRAY_SIZE(g_sourceText); + selected_index = m->mhandle->SourceType(); + m->btntype = btnType; + part = MUSIC_PART_SOURCE_POPUP; + } + else if (btnType == TOP_BTN_TYPE_SORT) { + arr = g_sortText; + size = ARRAY_SIZE(g_sortText); + layout_id = m->lmgr->Layout()->LayoutId(); + if (layout_id) { + if (!strcmp(layout_id, MUSIC_ALBUM_LAYOUT)) { + arr = g_sortTextAlbum; + size = ARRAY_SIZE(g_sortTextAlbum); + } + else if (!strcmp(layout_id, MUSIC_FOLDER_LAYOUT)) { + arr = g_sortTextFolder; + size = ARRAY_SIZE(g_sortTextFolder); + } + else if (!strcmp(layout_id, MUSIC_CATEGORY_PLAYLISTS_LAYOUT)) { + arr = g_sortTextPlaylists; + size = ARRAY_SIZE(g_sortTextPlaylists); + } + else if (!strcmp(layout_id, MUSIC_CATEGORY_ARTIST_LAYOUT)) { + arr = g_sortTextArtist; + size = ARRAY_SIZE(g_sortTextArtist); + } + else if (!strcmp(layout_id, MUSIC_CATEGORY_GENRE_LAYOUT)) { + arr = g_sortTextGenre; + size = ARRAY_SIZE(g_sortTextGenre); + } + } + part = MUSIC_PART_SORT_POPUP; + selected_index = m->mhandle->SortType(); + m->btntype = btnType; + } + else { + evas_object_del(ctxpopup); + return; + } + + for (i = 0; i < size; i++) { + if (btnType == TOP_BTN_TYPE_SOURCE && i == SOURCE_TYPE_USB && + !m->mhandle->CheckUsb()) + continue; + + btn = s_AddButton(box); + if (!btn) { + evas_object_del(ctxpopup); + return; + } + elm_object_style_set(btn, MUSIC_STYLE_HOVER_ENTRY); + elm_object_text_set(btn, _(arr[i])); + elm_box_pack_end(box, btn); + + if (i == 0) + firstbtn = btn; /* to set focus later */ + + if (i == selected_index) + elm_object_signal_emit(btn, + "elm,action,highlight", "elm"); + + if (i == size - 1) { + elm_object_signal_emit(btn, + "elm,action,hideline", "elm"); + _ERR("hiding last line"); + } + + evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, sm_CbCtxPopupBtnClicked, this); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m); + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, sm_CbCtxPopupBtnKeyPressed, this); + } + + elm_object_content_set(ctxpopup, box); + elm_object_style_set(ctxpopup, MUSIC_STYLE_HOVER_CTXPOPUP); + elm_ctxpopup_direction_priority_set(ctxpopup, + ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN); + elm_object_part_content_set(m->base, part, ctxpopup); + + m->ctxpopup = ctxpopup; + + if (firstbtn && btn) { + elm_object_focus_set(firstbtn, EINA_TRUE); + elm_object_focus_next_object_set(firstbtn, + btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn, + firstbtn, ELM_FOCUS_DOWN); + } + } + public: + void DestroyCtxPopup(void) + { + if (!m->ctxpopup) + return; + + evas_object_hide(m->ctxpopup); + evas_object_del(m->ctxpopup); + m->ctxpopup = NULL; + } + + public: + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { + if (!strcmp(ev->keyname, KEY_BACK)) + elm_object_focus_set(m->c_grpbtn, EINA_TRUE); + } + + virtual void OnMouseClicked(int id, Evas_Object *obj) { + t_CreateCtxPopup(m_type); + } + } *pHandlerBtnSource, *pHandlerBtnSort; + + + SMusicBaseView() { + memset(this, 0, sizeof(SMusicBaseView)); + for (int a = 0; a < TOTAL_GROUP_BTNS; a++) + pHandlerBtnGroup[a] = new CHandlerBtnGroup(this); + + pHandlerBtnPlayback = new CHandlerBtnPlayback(this); + pHandlerBtnSource = new CHandlerBtnCtxpopup(this, TOP_BTN_TYPE_SOURCE); + pHandlerBtnSort = new CHandlerBtnCtxpopup(this, TOP_BTN_TYPE_SORT); + pHandleVolume = new CHandleVolume; + } + ~SMusicBaseView() { + delete pHandleVolume; + delete pHandlerBtnSort; + delete pHandlerBtnSource; + delete pHandlerBtnPlayback; + + for (int a = 0; a < TOTAL_GROUP_BTNS; a++) + delete pHandlerBtnGroup[a]; + } +}; + +struct SBtnInfo { + const char *txt; + const char *part; + const char *style; + const char *icon_path; + + SMusicBaseView::CHandlerBtn *handler; + //Evas_Smart_Cb cb; +}; + + +void CMusicBaseView::sm_CbHandleEmptyStatus(void *cookie, bool emptyStatus) +{ + CMusicBaseView *root = (CMusicBaseView*)cookie; + if (root) + root->m_OnHandleEmptyStatus(emptyStatus); +} + + +void CMusicBaseView::m_OnHandleEmptyStatus(bool emptyStatus) +{ + if (emptyStatus) + m_UpdateEmptyFocusSequence(); + else + m_UpdateFocusSequence(); +} + + +void CMusicBaseView::m_UpdateFocusSequence(void) +{ + int i; + + for (i = 0; i < TOTAL_GROUP_BTNS; i++) + elm_object_focus_next_object_set(m->group_btn[i], + m->content, ELM_FOCUS_RIGHT); + + elm_object_focus_next_object_set(m->group_btn[GRP_SONG], m->plbackbtn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(m->plbackbtn, m->group_btn[GRP_SONG], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(m->plbackbtn, m->content, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(m->srcbtn, m->content, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(m->sortbtn, m->content, ELM_FOCUS_DOWN); + + elm_object_part_text_set(m->base, MUSIC_PART_NO_CONTENT, MUSIC_STR_EMPTY); + elm_object_part_text_set(m->base, MUSIC_PART_NO_CONTENT_SUB, MUSIC_STR_EMPTY); +} + + +void CMusicBaseView::m_UpdateEmptyFocusSequence(void) +{ + int i; + + for (i = 0; i < TOTAL_GROUP_BTNS; i++) + elm_object_focus_next_object_set(m->group_btn[i], + m->plbackbtn, ELM_FOCUS_RIGHT); + + elm_object_focus_next_object_set(m->group_btn[GRP_SONG], m->plbackbtn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(m->plbackbtn, m->group_btn[GRP_SONG], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(m->plbackbtn, m->group_btn[GRP_SONG], ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(m->srcbtn, m->group_btn[GRP_SONG], ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(m->sortbtn, m->group_btn[GRP_SONG], ELM_FOCUS_DOWN); + + elm_object_part_text_set(m->base, MUSIC_PART_NO_CONTENT, _(NO_MUSIC_MESSAGE)); + elm_object_part_text_set(m->base, MUSIC_PART_NO_CONTENT_SUB, _(NO_MUSIC_MESSAGE_SUB)); +} + + +void CMusicBaseView::sm_CbClickedGroupBtn(void *cookie, Evas_Object *obj) +{ + CMusicBaseView *root = (CMusicBaseView*)cookie; + if (root) + root->m_OnClickedGroupBtn(obj); +} + + +void CMusicBaseView::m_OnClickedGroupBtn(Evas_Object *obj) +{ + m_ShowCurrentLayout(); +} + + +void CMusicBaseView::sm_CbClickedCtxBtn(void *cookie, Evas_Object *obj) +{ + CMusicBaseView *root = (CMusicBaseView*)cookie; + if (root) + root->m_OnClickedCtxBtn(obj); +} + + +void CMusicBaseView::m_OnClickedCtxBtn(Evas_Object *obj) +{ + if (m->btntype == TOP_BTN_TYPE_SOURCE) { + if (m->c_grpbtn != m->group_btn[GRP_PLAYLISTS]) + m_ShowCurrentLayout(); + } + else + m_UpdateCurrentLayout(false); +} + + +void CMusicBaseView::m_ShowCurrentLayout(void) +{ + const char *layoutId = NULL; + Evas_Object *evasLayout = NULL; + + elm_object_part_content_unset(m->base, MUSIC_PART_CONTENT); + + if (m->c_grpbtn == m->group_btn[GRP_SONG]) { + layoutId = MUSIC_SONG_LAYOUT; + evasLayout = m->layoutSong->Layout(); + } + else if (m->c_grpbtn == m->group_btn[GRP_ALBUM]) { + layoutId = MUSIC_ALBUM_LAYOUT; + evasLayout = m->layoutAlbum->Layout(); + } + else if (m->c_grpbtn == m->group_btn[GRP_ARTIST]) { + layoutId = MUSIC_CATEGORY_ARTIST_LAYOUT; + evasLayout = m->layoutArtist->Layout(); + } + else if (m->c_grpbtn == m->group_btn[GRP_GENRE]) { + layoutId = MUSIC_CATEGORY_GENRE_LAYOUT; + evasLayout = m->layoutGenre->Layout(); + } + else if (m->c_grpbtn == m->group_btn[GRP_PLAYLISTS]) { + layoutId = MUSIC_CATEGORY_PLAYLISTS_LAYOUT; + evasLayout = m->layoutPlaylists->Layout(); + } + else if (m->c_grpbtn == m->group_btn[GRP_FOLDER]) { + layoutId = MUSIC_FOLDER_LAYOUT; + evasLayout = m->layoutFolder->Layout(); + } + + CExtBaseLayout *layout = (CExtBaseLayout*)m->lmgr->Layout(); + if (layout && layout->EmptyStatus() == true) { + m_UpdateEmptyFocusSequence(); + } + else { + elm_object_part_content_set(m->base, MUSIC_PART_CONTENT, evasLayout); + m->lmgr->Show(layoutId); + m_UpdateFocusSequence(); + } +} + + +void CMusicBaseView::m_DestroyPopup(void) +{ + if (!m->popup) + return; + + if (m->transit) { + elm_transit_del(m->transit); + m->transit = NULL; + } + evas_object_del(m->popup); + m->popup = NULL; +} + + +void CMusicBaseView::m_DestroyCtxPopup(void) +{ + m->pHandlerBtnSource->DestroyCtxPopup(); + m->pHandlerBtnSort->DestroyCtxPopup(); +} + + +Evas_Object *CMusicBaseView::m_CreateLoadingPopup(void) +{ + Evas_Object *popup = NULL, *label = NULL, *icon = NULL; + double scale; + char buf[MAX_LENGTH]; + + popup = elm_popup_add(m->base); + if (!popup) + return NULL; + + elm_object_style_set(popup, MUSIC_STYLE_LOADING_POPUP); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_TOP_RIGHT); + elm_popup_timeout_set(popup, MAX_SHOW_TIME); + evas_object_show(popup); + + label = elm_label_add(popup); + if (!label) { + evas_object_del(popup); + return NULL; + } + + elm_object_style_set(label, MUSIC_STYLE_LOADING_LABEL); + elm_object_text_set(label, _(MUSIC_TEXT_LOADING)); + elm_object_content_set(popup, label); + scale = elm_config_scale_get(); + + icon = elm_icon_add(popup); + if (!icon) { + evas_object_del(popup); + return NULL; + } + + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, MUSIC_IMAGE_LOADING); + elm_image_file_set(icon, buf, NULL); + elm_image_animated_set(icon, EINA_TRUE); + elm_image_animated_play_set(icon, EINA_TRUE); + evas_object_size_hint_min_set(icon, 48 * scale, 48 * scale); + elm_object_part_content_set(popup, MUSIC_SWALLOW_ICON, icon); + + m->transit = elm_transit_add(); + if (!m->transit) { + evas_object_del(popup); + return NULL; + } + + elm_transit_object_add(m->transit, icon); + elm_transit_effect_rotation_add(m->transit, 0, 360); + elm_transit_duration_set(m->transit, 1); + elm_transit_repeat_times_set(m->transit, 5); + elm_transit_objects_final_state_keep_set(m->transit, EINA_TRUE); + elm_transit_go(m->transit); + + return popup; +} + + +void CMusicBaseView::m_UpdatePlaysongLabel(void) +{ + SSongInfo *sinfo = NULL; + char buf[MAX_LENGTH]; + int state; + + state = m->mhandle->PlayState(); + + if (state != PLAY_STATUS_INITIAL && state != PLAY_STATUS_STOP) { + + if (!m->mhandle->GetCurrentSong(&sinfo)) { + _ERR(" failed to find song info "); + return; + } + + snprintf(buf, sizeof(buf), "%s - %s", + song_info_get_title(sinfo), + song_info_get_artist(sinfo)); + + _set_object_text(m->plsonglbl, buf, PLAYSONG_FONT_SIZE, + FONT_STYLE_REGULAR); + elm_label_slide_go(m->plsonglbl); + } + else { + _set_object_text(m->plsonglbl, (char *)MUSIC_STR_EMPTY, + PLAYSONG_FONT_SIZE, (const char *)FONT_STYLE_REGULAR); + } +} + + +void CMusicBaseView::m_AddPlaysongLabel(void) +{ + double scale = elm_config_scale_get(); + + m->plsonglbl = elm_label_add(m->base); + if (!m->plsonglbl) + return; + + elm_object_style_set(m->plsonglbl, MUSIC_STYLE_PLAYSONG_LBL); + elm_label_wrap_width_set(m->plsonglbl, MUSIC_WRAP_WIDTH * scale); + elm_label_slide_duration_set(m->plsonglbl, MUSIC_SLIDE_DURATION); + elm_label_slide_mode_set(m->plsonglbl, ELM_LABEL_SLIDE_MODE_AUTO); + elm_label_slide_go(m->plsonglbl); + evas_object_size_hint_weight_set(m->plsonglbl, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_object_part_content_set(m->base, MUSIC_PART_PLAYSONG_LBL, + m->plsonglbl); + evas_object_show(m->plsonglbl); +} + + +void CMusicBaseView::m_CreateTopSection(void) +{ + int type; + int i; + Evas_Object *btn = NULL; + static struct SBtnInfo btninfo[TOTAL_TOP_BTNS]; + + btninfo[TOP_BTN_TYPE_PLAYBACK].part = MUSIC_PART_PLAYBACK_BTN; + btninfo[TOP_BTN_TYPE_PLAYBACK].style = MUSIC_STYLE_PLAYBACK_BTN; + btninfo[TOP_BTN_TYPE_PLAYBACK].handler = m->pHandlerBtnPlayback;// cb = sm_CbPlaybackBtnClicked; + + btninfo[TOP_BTN_TYPE_SOURCE].part = MUSIC_PART_SOURCE_HOVERSEL; + btninfo[TOP_BTN_TYPE_SOURCE].style = MUSIC_STYLE_SOURCE_BTN; + btninfo[TOP_BTN_TYPE_SOURCE].handler = m->pHandlerBtnSource;// cb = sm_CbSourceBtnClicked; + + btninfo[TOP_BTN_TYPE_SORT].part = MUSIC_PART_SORT_HOVERSEL; + btninfo[TOP_BTN_TYPE_SORT].style = MUSIC_STYLE_SORT_BTN; + btninfo[TOP_BTN_TYPE_SORT].handler = m->pHandlerBtnSort;// cb = sm_CbSortBtnClicked; + + elm_object_part_text_set(m->base, MUSIC_PART_TITLE, + _(MUSIC_TEXT_TITLE)); + + m_AddPlaysongLabel(); + + for (i = 0; i < TOTAL_TOP_BTNS; i++) { + btn = s_AddButton(m->base); + if (!btn) { + _ERR(" Adding btn failed "); + return; + } + + elm_object_style_set(btn, btninfo[i].style); + elm_object_part_content_set(m->base, btninfo[i].part, btn); + + btninfo[i].handler->Connect(btn); + //evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, btninfo[i].cb, m); + ////evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, sm_CbTopBtnKeyPressed, m); + //evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m); + + if (i == TOP_BTN_TYPE_PLAYBACK) + m->plbackbtn = btn; + else if (i == TOP_BTN_TYPE_SOURCE) + m->srcbtn = btn; + else if (i == TOP_BTN_TYPE_SORT) + m->sortbtn = btn; + } + + type = m->mhandle->SourceType(); + elm_object_text_set(m->srcbtn, _(g_sourceText[type])); + + type = m->mhandle->SortType(); + elm_object_text_set(m->sortbtn, _(g_sortText[type])); +} + + +void CMusicBaseView::m_CreateLeftSection(void) +{ + Evas_Object *box = NULL, *ic = NULL; + int i; + char buf[MAX_LENGTH]; + static struct SBtnInfo btninfo[TOTAL_GROUP_BTNS]; + + btninfo[GRP_SONG].txt = MUSIC_TEXT_SONG; + btninfo[GRP_SONG].icon_path = MUSIC_IMAGE_GRPBTN_SONG; + + btninfo[GRP_ALBUM].txt = MUSIC_TEXT_ALBUM; + btninfo[GRP_ALBUM].icon_path = MUSIC_IMAGE_GRPBTN_ALBUM; + + btninfo[GRP_ARTIST].txt = MUSIC_TEXT_ARTIST; + btninfo[GRP_ARTIST].icon_path = MUSIC_IMAGE_GRPBTN_ARTIST; + + btninfo[GRP_GENRE].txt = MUSIC_TEXT_GENRE; + btninfo[GRP_GENRE].icon_path = MUSIC_IMAGE_GRPBTN_GENRE; + + btninfo[GRP_FOLDER].txt = MUSIC_TEXT_FOLDER; + btninfo[GRP_FOLDER].icon_path = MUSIC_IMAGE_GRPBTN_FOLDER; + + btninfo[GRP_PLAYLISTS].txt = MUSIC_TEXT_PLAYLIST; + btninfo[GRP_PLAYLISTS].icon_path = MUSIC_IMAGE_GRPBTN_PLAYLISTS; + + box = _add_box(m->base); + if (!box) + return; + + for (i = 0; i < TOTAL_GROUP_BTNS; i++) { + m->group_btn[i] = s_AddButton(box); + if (!m->group_btn[i]) { + _ERR(" failed to add button to box "); + continue; + } + + elm_box_pack_end(box, m->group_btn[i]); + elm_object_style_set(m->group_btn[i], MUSIC_STYLE_GROUPBTN); + elm_object_text_set(m->group_btn[i], _(btninfo[i].txt)); + + m->pHandlerBtnGroup[i]->Connect(m->group_btn[i]); + m->pHandlerBtnGroup[i]->SetCallback(sm_CbClickedGroupBtn, this); + + ic = elm_image_add(m->group_btn[i]); + if (ic) { + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + btninfo[i].icon_path); + elm_image_file_set(ic, buf, NULL); + elm_object_part_content_set(m->group_btn[i], + MUSIC_PART_ELM_SWALLOWICON, ic); + } + } + + elm_object_part_content_set(m->base, MUSIC_PART_GROUPBTN_BOX, box); +} + + +void CMusicBaseView::m_CreateFullView(void) +{ + m_CreateTopSection(); + m_CreateLeftSection(); +} + + +void CMusicBaseView::m_SetSourceType(void) +{ + if (!m->arglist || !m->arglist->source || !m->mhandle) + return; + + if (!strcmp(g_sourceArg[SOURCE_TYPE_USB], m->arglist->source)) + m->mhandle->SetSourceType(SOURCE_TYPE_USB); + else if (!strcmp(g_sourceArg[SOURCE_TYPE_TV], m->arglist->source)) + m->mhandle->SetSourceType(SOURCE_TYPE_TV); + else + m->mhandle->SetSourceType(SOURCE_TYPE_ALL); +} + + +void CMusicBaseView::m_UpdateCurrentLayout(bool focusFlag) +{ + ((CExtBaseLayout*)m->lmgr->Layout())->Update(focusFlag); +} + + +bool CMusicBaseView::Create(void *data) +{ + ASSERT(!m); + + Evas_Object *win = NULL; + CMusicController *mhandle = NULL; + CLayoutMgr *lmgr = NULL; + char *arg = NULL; + + m = new SMusicBaseView; + if (!m) { + _ERR(" new for SMusicBaseView failed "); + m = NULL; + return false; + } + + win = CViewMgr::GetInstance()->Window(); + if (!win) { + _ERR(" vimewmgr get win failed "); + delete m; + m = NULL; + return false; + } + + mhandle = CMusicController::GetInstance(); + if (!mhandle) { + _ERR(" music controller get music instance failed "); + delete m; + m = NULL; + return false; + } + + m->base = _add_base(win, MUSIC_BASE_VIEW); + if (!m->base) { + _ERR(" add base failed "); + delete m; + m = NULL; + return false; + } + + lmgr = new CLayoutMgr; + if (!lmgr) { + evas_object_del(m->base); + delete m; + m = NULL; + return false; + } + + if (!lmgr->Create(m->base, NULL)) { + _ERR(" init layout mgr failed "); + evas_object_del(m->base); + delete m; + m = NULL; + return false; + } + + bool r = CBaseView::Create(data); + if (!r) { + _ERR(" CBaseView Creation failed "); + lmgr->Destroy(); + evas_object_del(m->base); + delete m; + m = NULL; + return false; + } + + m->win = win; + m->mhandle = mhandle; + m->lmgr = lmgr; + m->fresh_view = true; + m->arglist = (_arg_list *)data; + m->parent = this; + + m->layoutSong = new CSongLayout(MUSIC_SONG_LAYOUT); + arg = NULL; + if (m->arglist && m->arglist->album_id) + arg = m->arglist->album_id; + m->layoutSong->Create(m->lmgr, arg); + lmgr->AddLayout(m->layoutSong); + + m->layoutAlbum = new CAlbumLayout(MUSIC_ALBUM_LAYOUT); + arg = NULL; + if (m->arglist && m->arglist->uri) + arg = m->arglist->uri; + m->layoutAlbum->Create(m->lmgr, arg); + m->layoutAlbum->SetEmptyStatusHandleCallback(sm_CbHandleEmptyStatus, this); + lmgr->AddLayout(m->layoutAlbum); + + m->layoutArtist = new CArtistLayout(MUSIC_CATEGORY_ARTIST_LAYOUT); + m->layoutArtist->Create(m->lmgr); + lmgr->AddLayout(m->layoutArtist); + + m->layoutGenre = new CGenreLayout(MUSIC_CATEGORY_GENRE_LAYOUT); + m->layoutGenre->Create(m->lmgr); + lmgr->AddLayout(m->layoutGenre); + + m->layoutPlaylists = new CPlaylistLayout(MUSIC_CATEGORY_PLAYLISTS_LAYOUT); + m->layoutPlaylists->Create(m->lmgr); + lmgr->AddLayout(m->layoutPlaylists); + + m->layoutFolder = new CFolderLayout(MUSIC_FOLDER_LAYOUT); + m->layoutFolder->Create(m->lmgr); + lmgr->AddLayout(m->layoutFolder); + + elm_object_part_content_unset(m->base, MUSIC_PART_CONTENT); + + m_SetSourceType(); + + evas_object_data_set(m->base, BASE_VIEW_DATA, m); + + m_CreateFullView(); + m->pHandleVolume->Create(m->base); + m_UpdateFocusSequence(); + + Connect(m->base); + + for (int i = 0; i < TOTAL_GROUP_BTNS; i++) { + m->pHandlerBtnGroup[i]->SetCallback(sm_CbClickedGroupBtn, this); + } + m->pHandlerBtnSort->SetCallback(sm_CbClickedCtxBtn, this); + m->pHandlerBtnSource->SetCallback(sm_CbClickedCtxBtn, this); + + mhandle->AddListener(this); + //m->cbinfo[E_SONG_COMPLETE] = mhandle->AddCallback(E_SONG_COMPLETE, sm_CbUpdatePlaysongLabel, this); + //m->cbinfo[E_CONTENT_UPDATE] = mhandle->AddCallback(E_CONTENT_UPDATE, sm_CbContentUpdate, this); + //m->cbinfo[E_USB_CONNECT] = mhandle->AddCallback(E_USB_CONNECT, sm_CbUsbConnect, this); + + return true; +} + + +void CMusicBaseView::Destroy(void) +{ + ASSERT(m); + + m->mhandle->RemoveListener(this); + //m->mhandle->RemoveCallback(m->cbinfo[E_SONG_COMPLETE]); + //m->mhandle->RemoveCallback(m->cbinfo[E_CONTENT_UPDATE]); + //m->mhandle->RemoveCallback(m->cbinfo[E_USB_CONNECT]); + + m->pHandleVolume->Destroy(); + + m->lmgr->RemoveLayout(m->layoutFolder); + m->layoutFolder->Destroy(); + delete m->layoutFolder; + + m->lmgr->RemoveLayout(m->layoutArtist); + m->layoutArtist->Destroy(); + delete m->layoutArtist; + + m->lmgr->RemoveLayout(m->layoutGenre); + m->layoutGenre->Destroy(); + delete m->layoutGenre; + + m->lmgr->RemoveLayout(m->layoutPlaylists); + m->layoutPlaylists->Destroy(); + delete m->layoutPlaylists; + + m->lmgr->RemoveLayout(m->layoutAlbum); + m->layoutAlbum->Destroy(); + delete m->layoutAlbum; + + m->lmgr->RemoveLayout(m->layoutSong); + m->layoutSong->Destroy(); + delete m->layoutSong; + + CBaseView::Destroy(); + m->lmgr->Destroy(); + delete m->lmgr; + evas_object_del(m->base); + + delete m; + m = NULL; +} + + +Evas_Object* CMusicBaseView::Base(void) +{ + ASSERT(m); + + return m->base; +} + + +void CMusicBaseView::t_OnShow(void) +{ + ASSERT(m); + + evas_object_show(m->base); + + if (!m->fresh_view) { + elm_object_focus_set(m->plbackbtn, EINA_TRUE); + m_UpdatePlaysongLabel(); + return; + } + + if (m->arglist && m->arglist->album_id) + m->c_grpbtn = m->group_btn[GRP_ALBUM]; + else + m->c_grpbtn = m->group_btn[GRP_SONG]; + + elm_object_signal_emit(m->c_grpbtn, + MUSIC_SIGNAL_GROUP_SELECTED, MUSIC_BASE_VIEW); + elm_object_focus_set(m->c_grpbtn, EINA_TRUE); + m_UpdatePlaysongLabel(); + + m_ShowCurrentLayout(); + + m->arglist = NULL; + m->fresh_view = false; +} + + +void CMusicBaseView::t_OnUpdate(void *data) +{ + ASSERT(m); + + if (!data) { + m_ShowCurrentLayout(); + return; + } + + SParcel *parcel = (SParcel *)data; + int update_type = parcel->updateType; + const char *layout_id = parcel->layoutId; + + if (update_type == E_FOCUS_UPDATE) + elm_object_focus_set(m->c_grpbtn, EINA_TRUE); + else if (update_type == E_LAYOUT_UPDATE) { + if (!layout_id) + return; + + elm_object_disabled_set(m->sortbtn, EINA_FALSE); + if (!strcmp(layout_id, MUSIC_ALBUM_SONGS_LAYOUT) || + !strcmp(layout_id, MUSIC_CATEGORY_SONGS_LAYOUT) || + !strcmp(layout_id, MUSIC_CATEGORY_ALBUM_LAYOUT) || + !strcmp(layout_id, MUSIC_CATEGORY_SELECTLIST_LAYOUT)) + elm_object_disabled_set(m->sortbtn, EINA_TRUE); + } + else if (update_type == E_DEPTH_UPDATE) { + if (!layout_id) + return; + + if (!strcmp(layout_id, MUSIC_ALBUM_SONGS_LAYOUT)) { + m_ShowCurrentLayout(); + m_UpdateCurrentLayout(true); + } + } +} + + +void CMusicBaseView::t_OnHide(void) +{ + ASSERT(m); + + evas_object_hide(m->base); +} + + +void CMusicBaseView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) +{ + if (!strcmp(ev->keyname, KEY_EXIT)) { + m->mhandle->Stop(); + elm_exit(); + } + else if (!strcmp(ev->keyname, KEY_ENTER)) { + if (elm_object_focus_get(m->c_grpbtn)) { + m_UpdateCurrentLayout(true); + } + } + else if (!strcmp(ev->keyname, KEY_VOLUMEUP)) + m->pHandleVolume->Up(); //m_HandleVolumeKey(SOUND_UP); + else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN)) + m->pHandleVolume->Down();// m_HandleVolumeKey(SOUND_DOWN); + else if (!strcmp(ev->keyname, KEY_MUTE)) + m->pHandleVolume->Mute();// m_HandleVolumeKey(SOUND_MUTE); + else if (!strcmp(ev->keyname, KEY_NEXT) || + !strcmp(ev->keyname, KEY_PREVIOUS) || + !strcmp(ev->keyname, KEY_PLAY) || + !strcmp(ev->keyname, KEY_PAUSE)) { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_KEY_PRESS; + parcel.layoutId = NULL; + parcel.keyEvent = ev->keyname; + CViewMgr::GetInstance()->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel); + } +} + + +void CMusicBaseView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) +{ + if (!strcmp(ev->keyname, KEY_NEXT) || + !strcmp(ev->keyname, KEY_PREVIOUS)) { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_KEY_RELEASE; + parcel.layoutId = NULL; + parcel.keyEvent = ev->keyname; + CViewMgr::GetInstance()->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel); + m_UpdatePlaysongLabel(); + } +} + + +void CMusicBaseView::t_OnComplete(void) +{ + m_UpdatePlaysongLabel(); +} + + +void CMusicBaseView::t_OnError(void) +{ +} + + +void CMusicBaseView::t_OnUsbConnected(void) +{ + m->popup = m_CreateLoadingPopup(); +} + + +void CMusicBaseView::t_OnUpdateContent(void) +{ + int source; + + m_DestroyPopup(); + m_DestroyCtxPopup(); + source = m->mhandle->SourceType(); + elm_object_text_set(m->srcbtn, _(g_sourceText[source])); + + if (source != SOURCE_TYPE_TV) + m_ShowCurrentLayout(); +} \ No newline at end of file diff --git a/src/views/category-layout.cpp b/src/views/category-layout.cpp new file mode 100644 index 0000000..be3c0a6 --- /dev/null +++ b/src/views/category-layout.cpp @@ -0,0 +1,1883 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "AppCommon.h" +#include "dbg.h" +#include "i18n.h" +#include "define.h" + +#include +#include "category_info.h" +#include "album_info.h" +#include "song_info.h" +#include "music-controller.h" +#include "LayoutMgr.h" +#include "entry-popup.h" +#include "common.h" +#include "common-ui.h" +#include "BaseView.h" +#include "ExtBaseLayout.h" +#include "ViewMgr.h" +#include "category-layout.h" +#include "base-view.h" + +#define TOTAL_ADD_BTNS 3 +#define TOTAL_SELECT_BTNS 3 +#define GENGRID_ITEM_SIZE_W (263+20) +#define GENGRID_ITEM_SIZE_H (359+20) + + +enum EAddBtns { + ABTN_PLAY, + ABTN_NEXT, + ABTN_LAST +}; + +enum ESelectBtns { + SBTN_SELECT_ALL, + SBTN_DONE, + SBTN_CANCEL +}; + +enum EIdType { + ID_TYPE_MEDIA, + ID_TYPE_MEMBER +}; + +struct SBtnInfo { + const char *name; + const char *part; + const char *style; + const char *icon; + Evas_Smart_Cb cb; +}; + +struct SCategoryLayout { + Evas_Object *win; + Evas_Object *layout; + Evas_Object *glist; + Evas_Object *add_btn[TOTAL_ADD_BTNS]; + Evas_Object *select_btn[TOTAL_SELECT_BTNS]; + Evas_Object *albumCover; + Evas_Object *def_foc_btn; + Eina_List *catlist; + Eina_List *alblist; + Eina_List *songlist; + Eina_List *it_infolist; + Ecore_Idler *focus_idler; + CMusicController *pMusicController; + CLayoutMgr *lmgr; + CViewMgr *vmgr; + SSongInfo *c_sinfo; + int total_duration; + int count; + + SCategoryLayout() { + memset(this, 0, sizeof(SCategoryLayout)); + } + + ~SCategoryLayout() { + } +}; + + +Eina_Bool CCategoryLayout::sm_CbFocusIdler(void *dt) +{ + CCategoryLayout *root = (CCategoryLayout *)dt; + + Eina_Bool ret = EINA_FALSE; + if (root) + ret = root->m_OnFocusIdler(); + + return ret; +} + + +Eina_Bool CCategoryLayout::m_OnFocusIdler(void) +{ + Elm_Object_Item *it = NULL; + SCatItemInfo *itinfo = NULL; + + m->focus_idler = NULL; + elm_object_tree_focus_allow_set(t.base, EINA_TRUE); + + if (t.depth == E_DEPTH_CATEGORY) { + it = m_FindItemByInfo(m->it_infolist, t.c_catinfo); + if (!it) { + itinfo = (SCatItemInfo *)eina_list_nth(m->it_infolist, 0); + it = itinfo->item; + } + elm_gengrid_item_show(it, ELM_GENGRID_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(it, EINA_TRUE); + } + else + elm_object_focus_set(m->def_foc_btn, EINA_TRUE); + + return ECORE_CALLBACK_CANCEL; +} + + +void CCategoryLayout::sm_CbEntrynameSet(void *dt, const char *name) +{ + CCategoryLayout *root = (CCategoryLayout *)dt; + if (root) + root->m_OnEntrynameSet(name); +} + + +void CCategoryLayout::m_OnEntrynameSet(const char *name) +{ + Eina_List *idlist = NULL; + char *str = NULL; + + if (!name) + return; + + idlist = m_GetSelectedList(m->it_infolist, (int)ID_TYPE_MEDIA); + str = strdup(name); + destroy_entry_popup(t.epopup); + t.epopup = NULL; + + if (!strcmp(str, MUSIC_STR_EMPTY)) { + _create_message_box(Layout(), MUSIC_TEXT_EMPTY_NAME); + free(str); + return; + } + + if (m->pMusicController->MediaExistPlaylist(str)) { + _create_message_box(Layout(), MUSIC_TEXT_INUSE_MSG); + free(str); + return; + } + + if (!m->pMusicController->MediaInsertPlaylist(str, idlist)) { + _ERR("Playlist creation failed "); + free(str); + return; + } + + t.depth = E_DEPTH_CATEGORY; + t_UpdateLayoutWithFocus(); +} + + +void CCategoryLayout::sm_CbSelectAllClicked(void *dt, Evas_Object *obj, void *ev) +{ + CCategoryLayout *root = (CCategoryLayout *)dt; + if (root) + root->m_OnSelectAllClicked(obj, ev); +} + + +void CCategoryLayout::m_OnSelectAllClicked(Evas_Object *obj, void *ev) +{ + Eina_List *l = NULL; + SCatItemInfo *itinfo = NULL; + void *list_obj = NULL; + int tc; + + tc = eina_list_count(m->it_infolist); + + if (m->count == tc) { + elm_object_text_set(m->select_btn[SBTN_SELECT_ALL], + _(MUSIC_TEXT_SELECT_ALL)); + m->count = 0; + EINA_LIST_FOREACH(m->it_infolist, l, list_obj) { + itinfo = (SCatItemInfo *)list_obj; + itinfo->check_status = false; + } + elm_genlist_realized_items_update(m->glist); + + return; + } + + elm_object_text_set(m->select_btn[SBTN_SELECT_ALL], + _(MUSIC_TEXT_DESELECT_ALL)); + m->count = tc; + EINA_LIST_FOREACH(m->it_infolist, l, list_obj) { + itinfo = (SCatItemInfo *)list_obj; + itinfo->check_status = true; + } + elm_genlist_realized_items_update(m->glist); +} + + +void CCategoryLayout::sm_CbDoneBtnClicked(void *dt, Evas_Object *obj, void *ev) +{ + CCategoryLayout *root = (CCategoryLayout *)dt; + if (root) + root->m_OnDoneBtnClicked(obj, ev); +} + + +void CCategoryLayout::m_OnDoneBtnClicked(Evas_Object *obj, void *ev) +{ + if (t.sel_type == SELECT_ADD) { + m_AddSelectedSongs(); + return; + } + else if (t.sel_type == SELECT_REMOVE) { + m_RemoveSelectedSongs(); + return; + } + + if (t.epopup) + destroy_entry_popup(t.epopup); + + t.epopup = create_entry_popup(t.base, MUSIC_STR_EMPTY, + sm_CbEntrynameSet, this); +} + + +void CCategoryLayout::sm_CbCancelBtnClicked(void *dt, Evas_Object *obj, void *ev) +{ + CCategoryLayout *root = (CCategoryLayout *)dt; + if (root) + root->m_OnCancelBtnClicked(obj, ev); +} + + +void CCategoryLayout::m_OnCancelBtnClicked(Evas_Object *obj, void *ev) +{ + t.depth = E_DEPTH_CATEGORY; + t_UpdateLayoutWithFocus(); +} + + +void CCategoryLayout::sm_CbPlayBtnClicked(void *dt, Evas_Object *obj, void *ev) +{ + CCategoryLayout *root = (CCategoryLayout *)dt; + if (root) + root->m_OnPlayBtnClicked(obj, ev); +} + + +void CCategoryLayout::m_OnPlayBtnClicked(Evas_Object *obj, void *ev) +{ + m_GotoPlayback(ADD_TYPE_FRESH, NULL); +} + + +void CCategoryLayout::sm_CbNextBtnClicked(void *dt, Evas_Object *obj, void *ev) +{ + CCategoryLayout *root = (CCategoryLayout *)dt; + if (root) + root->m_OnNextBtnClicked(obj, ev); +} + + +void CCategoryLayout::m_OnNextBtnClicked(Evas_Object *obj, void *ev) +{ + m_GotoPlayback(ADD_TYPE_NEXT, NULL); +} + + +void CCategoryLayout::sm_CbLastBtnClicked(void *dt, Evas_Object *obj, void *ev) +{ + CCategoryLayout *root = (CCategoryLayout *)dt; + if (root) + root->m_OnLastBtnClicked(obj, ev); +} + + +void CCategoryLayout::m_OnLastBtnClicked(Evas_Object *obj, void *ev) +{ + m_GotoPlayback(ADD_TYPE_END, NULL); +} + + +char *CCategoryLayout::sm_CbGetSelectlistItemText(void *data, Evas_Object *obj, const char *part) +{ + SCatItemInfo *itinfo = (SCatItemInfo *)data; + char *str = NULL; + int index; + + if (!itinfo || !obj || !part) + return NULL; + + if (!strcmp(part, "elm.text")) { + str = song_info_get_title(itinfo->sinfo); + + index = elm_genlist_item_index_get(itinfo->item); + if ((index & 1) == 1) + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_EVEN_ROW, MUSIC_BASE_VIEW); + else + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_ODD_ROW, MUSIC_BASE_VIEW); + + if (itinfo->check_status) + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_CHECK_ON, MUSIC_BASE_VIEW); + else + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_CHECK_OFF, MUSIC_BASE_VIEW); + } + else if (!strcmp(part, "elm.text1")) { + str = song_info_get_artist(itinfo->sinfo); + } + else if (!strcmp(part, "elm.text2")) { + str = song_info_get_album(itinfo->sinfo); + } + + if (str) + return strdup(str); + + return NULL; +} + + +char *CCategoryLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part) +{ + SCatItemInfo *itinfo = (SCatItemInfo *)data; + SSongInfo *sinfo = NULL; + char buf[MAX_LENGTH]; + char *timestr = NULL; + int duration; + int index; + + if (!itinfo || !obj || !part) + return NULL; + + sinfo = itinfo->sinfo; + + snprintf(buf, sizeof(buf), "%s", MUSIC_STR_EMPTY); + + if (!strcmp(part, "elm.text")) { + index = elm_genlist_item_index_get(itinfo->item); + if ((index & 1) == 1) { + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_EVEN_ROW, MUSIC_BASE_VIEW); + } + else { + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_ODD_ROW, MUSIC_BASE_VIEW); + } + snprintf(buf, sizeof(buf), "%d", index + 1); + } + else if (!strcmp(part, "elm.text1")) { + snprintf(buf, sizeof(buf), "%s", song_info_get_title(sinfo)); + } + else if (!strcmp(part, "elm.text2")) { + snprintf(buf, sizeof(buf), "%s", song_info_get_artist(sinfo)); + } + else if (!strcmp(part, "elm.text3")) { + if (song_info_get_duration(sinfo, &duration)) { + timestr = _get_timestr_from_milseconds(duration); + if (timestr) { + snprintf(buf, sizeof(buf), "%s", timestr); + free(timestr); + } + } + } + + if (strcmp(buf, MUSIC_STR_EMPTY)) + return strdup(buf); + + return NULL; +} + + +void CCategoryLayout::sm_CbRemoveListItem(void *data, Evas_Object *obj) +{ + free(data); +} + + +void CCategoryLayout::sm_CbSongItemSelect(void *data, Evas_Object *obj, void *event_info) +{ + CCategoryLayout *root = (CCategoryLayout *)data; + if (root) + root->m_OnSongItemSelect(obj, (Elm_Object_Item *)event_info); +} + + +void CCategoryLayout::m_OnSongItemSelect(Evas_Object *obj, Elm_Object_Item *event_info) +{ + SCatItemInfo *itinfo = NULL; + char *id = NULL; + + if (!m || !obj) + return; + + itinfo = m_FindItemInfo(m->it_infolist, (Elm_Object_Item *)event_info); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + if (m->c_sinfo) { + song_info_destroy(m->c_sinfo); + m->c_sinfo = NULL; + } + m->c_sinfo = song_info_duplicate(itinfo->sinfo); + if (!m->c_sinfo) + return; + + id = song_info_get_media_id(m->c_sinfo); + if (!id) { + song_info_destroy(m->c_sinfo); + m->c_sinfo = NULL; + return; + } + + m_GotoPlayback(ADD_TYPE_FRESH, id); +} + + +void CCategoryLayout::sm_CbSelectlistItemSelect(void *data, Evas_Object *obj, void *event_info) +{ + CCategoryLayout *root = (CCategoryLayout *)data; + if (root) + root->m_OnSelectlistItemSelect(obj, (Elm_Object_Item *)event_info); +} + + +void CCategoryLayout::m_OnSelectlistItemSelect(Evas_Object *obj, void *event_info) +{ + SCatItemInfo *itinfo = NULL; + int tc; + + if (!obj) + return; + + itinfo = m_FindItemInfo(m->it_infolist, (Elm_Object_Item *)event_info); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + tc = eina_list_count(m->it_infolist); + if (itinfo->check_status) { + if (tc == m->count) + elm_object_text_set(m->select_btn[SBTN_SELECT_ALL], + _(MUSIC_TEXT_SELECT_ALL)); + m->count = m->count - 1; + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_CHECK_OFF, MUSIC_BASE_VIEW); + itinfo->check_status = false; + } + else { + m->count = m->count + 1; + if (tc == m->count) + elm_object_text_set(m->select_btn[SBTN_SELECT_ALL], + _(MUSIC_TEXT_DESELECT_ALL)); + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_CHECK_ON, MUSIC_BASE_VIEW); + itinfo->check_status = true; + } +} + + +void CCategoryLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) +{ + CCategoryLayout *root = (CCategoryLayout *)dt; + + if (root) + root->t_OnCtxtUpdate(type, lid); +} + + +void CCategoryLayout::t_OnCtxtUpdate(enum EActionType type, int lid) +{ + Eina_List *list = NULL; + Eina_List *alist = NULL, *slist = NULL, *l = NULL, *sl = NULL; + SSongInfo *sinfo = NULL; + album_info *alinfo = NULL; + void *obj = NULL; + EAddType mode; + + if (!t.ctxtinfo || !t.ctxtinfo->context) + return; + + if (type == ACTION_TYPE_ADDNEXT) + mode = ADD_TYPE_NEXT; + else + mode = ADD_TYPE_END; + + if (t.depth == E_DEPTH_SONG) { + sinfo = (SSongInfo *)t.ctxtinfo->context; + list = eina_list_append(list, sinfo); + } + else if (t.depth == E_DEPTH_ALBUM) { + m->pMusicController->MediaGetList(LIST_TYPE_ALBUM_SONG, + t.ctxtinfo->context, &list); + sinfo = (SSongInfo *)eina_list_data_get(list); + } + else { + alist = category_info_get_albumlist((category_info *)t.ctxtinfo->context); + EINA_LIST_FOREACH(alist, l, obj) { + alinfo = (album_info *)obj; + slist = NULL; + if (!m->pMusicController->MediaGetList(LIST_TYPE_ALBUM_SONG, (void *)alinfo, &slist)) { + _ERR(" Failed to get album songlist "); + continue; + } + EINA_LIST_FOREACH(slist, sl, obj) { + sinfo = (SSongInfo *)obj; + list = eina_list_append(list, + song_info_duplicate((SSongInfo *)sinfo)); + } + eina_list_free(slist); + } + sinfo = (SSongInfo *)eina_list_data_get(list); + } + + if (type == ACTION_TYPE_ADDTO) { + if (!m->pMusicController->MediaAddsongsPlaylist(lid, list)) + _ERR(" Adding songs to playlist failed "); + else + _create_message_box(t.base, MUSIC_TEXT_ADDTO_MSG); + + if (t.depth == E_DEPTH_CATEGORY) { + EINA_LIST_FREE(list, obj) { + sinfo = (SSongInfo *)obj; + song_info_destroy(sinfo); + } + } + + return; + } + + m->pMusicController->UpdatePlaylist(list, mode); + if (type == ACTION_TYPE_PLAY) { + m->pMusicController->Stop(); + m->pMusicController->SetCurrentSong(song_info_get_media_id((SSongInfo *)sinfo)); + } + + if (t.depth == E_DEPTH_CATEGORY) { + EINA_LIST_FREE(list, obj) { + sinfo = (SSongInfo *)obj; + song_info_destroy(sinfo); + } + } + else { + eina_list_free(list); + } + + _update_playback_view((EAddType)type, Layout(), t.focused_item); +} + + +void CCategoryLayout::sm_CbCtxtClose(void *dt) +{ + CCategoryLayout *root = (CCategoryLayout *)dt; + if (root) + root->m_OnCtxtClose(); +} + + +void CCategoryLayout::m_OnCtxtClose(void) +{ + m->vmgr->PopView(); + m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); + elm_object_item_focus_set(t.focused_item, EINA_TRUE); +} + + +char *CCategoryLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part) +{ + SCatItemInfo *itinfo = (SCatItemInfo *)data; + int scount, acount; + const char *txt = NULL; + char buf[MAX_LENGTH]; + + if (!itinfo || !obj || !part) + return NULL; + + if (!strcmp(part, "elm.text")) { + if (itinfo->type == CAT_TYPE_PLAYLIST_NEW) + return strdup(_(MUSIC_TEXT_CREATE_PLAYLIST)); + + txt = category_info_get_name(itinfo->catinfo); + if (txt) + return strdup(txt); + } + else if (!strcmp(part, "elm.text1")) { + if (itinfo->type == CAT_TYPE_PLAYLIST_NEW) { + return NULL; + } + else if (itinfo->type == CAT_TYPE_PLAYLISTS) { + scount = category_info_get_songcount(itinfo->catinfo); + snprintf(buf, sizeof(buf), "%d %s", scount, _("Songs")); + } + else { + acount = category_info_get_albumcount(itinfo->catinfo); + scount = category_info_get_songcount(itinfo->catinfo); + snprintf(buf, sizeof(buf), "%d %s, %d %s", acount, + _("Albums"), scount, _("Songs")); + } + return strdup(buf); + } + + return NULL; +} + + +char *CCategoryLayout::sm_CbGetGridAlbumItemText(void *data, Evas_Object *obj, const char *part) +{ + SCatItemInfo *itinfo = (SCatItemInfo *)data; + album_info *alinfo = NULL; + char *txt = NULL; + + if (!itinfo || !obj || !part) + return NULL; + + alinfo = itinfo->alinfo; + + if (!strcmp(part, "elm.text")) { + txt = album_info_get_name(alinfo); + if (txt) + return strdup(txt); + } + else if (!strcmp(part, "elm.text1")) { + if (itinfo->type == CAT_TYPE_ARTIST) + txt = album_info_get_artist(alinfo); + else + txt = album_info_get_genre(alinfo); + if (txt) + return strdup(txt); + } + + return NULL; +} + + +Evas_Object *CCategoryLayout::sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part) +{ + SCatItemInfo *itinfo = (SCatItemInfo *)data; + album_info *alinfo = NULL; + void *list_obj = NULL; + Eina_List *l = NULL, *alist = NULL; + Evas_Object *img = NULL; + char *path = NULL; + char buf[MAX_LENGTH]; + + if (!itinfo || !obj || !part) + return NULL; + + if (!itinfo->catinfo && itinfo->type != CAT_TYPE_PLAYLIST_NEW) + return NULL; + + if (strcmp(part, "elm.swallow.icon")) + return NULL; + + img = elm_image_add(obj); + if (!img) + return NULL; + + path = NULL; + + if (itinfo->type == CAT_TYPE_ARTIST || itinfo->type == CAT_TYPE_GENRE) { + alist = category_info_get_albumlist(itinfo->catinfo); + if (alist) { + EINA_LIST_FOREACH(alist, l, list_obj) { + alinfo = (album_info *)list_obj; + path = album_info_get_thumb(alinfo); + if (path) + break; + } + } + } + else if (itinfo->type == CAT_TYPE_PLAYLISTS) { + path = category_info_get_thumb(itinfo->catinfo); + } + + if (!path) { + if (itinfo->type == CAT_TYPE_PLAYLIST_NEW) + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_CREATE_PLAYLIST); + else + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_DEFAULT_THUMB_126); + elm_image_file_set(img, buf, NULL); + elm_image_no_scale_set(img, EINA_TRUE); + } + else { + elm_image_file_set(img, path, NULL); + elm_image_aspect_fixed_set(img, EINA_FALSE); + } + + return img; +} + + +Evas_Object *CCategoryLayout::sm_CbGetGridAlbumitemContent(void *data, Evas_Object *obj, const char *part) +{ + SCatItemInfo *itinfo = (SCatItemInfo *)data; + album_info *alinfo = NULL; + char *path = NULL; + Evas_Object *img = NULL; + char buf[MAX_LENGTH]; + + if (!itinfo || !obj || !part) + return NULL; + + alinfo = itinfo->alinfo; + + if (strcmp(part, "elm.swallow.icon")) + return NULL; + + img = elm_image_add(obj); + if (!img) + return NULL; + + path = album_info_get_thumb(alinfo); + if (!path) { + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_DEFAULT_THUMB_126); + elm_image_file_set(img, buf, NULL); + elm_image_no_scale_set(img, EINA_TRUE); + } + else { + elm_image_file_set(img, path, NULL); + elm_image_aspect_fixed_set(img, EINA_FALSE); + } + + return img; +} + + +void CCategoryLayout::sm_CbRemoveGridItem(void *data, Evas_Object *obj) +{ + free(data); +} + + +void CCategoryLayout::sm_CbItemSelect(void *data, Elm_Object_Item *it, const char *emission, const char *source) +{ + CCategoryLayout *root = (CCategoryLayout *)data; + if (root) + root->m_OnItemSelect(it, emission, source); +} + + +void CCategoryLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source) +{ + SCatItemInfo *itinfo = NULL; + + itinfo = m_FindItemInfo(m->it_infolist, it); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + if (t.depth == E_DEPTH_ALBUM) { + if (t.c_alinfo) { + album_info_destroy(t.c_alinfo); + t.c_alinfo = NULL; + } + t.c_alinfo = album_info_duplicate(itinfo->alinfo); + t.depth = E_DEPTH_SONG; + } + else { + if (t.c_catinfo) { + category_info_destroy(t.c_catinfo); + t.c_catinfo = NULL; + } + + t_HandleItemSelect(itinfo); + } + + t_UpdateLayoutWithFocus(); +} + + +void CCategoryLayout::sm_CbGengridRealized(void *data, Evas_Object *obj, void *event_info) +{ + if (!data || !obj || !event_info) + return; + + elm_object_item_signal_callback_add((Elm_Object_Item *)event_info, + MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, + sm_CbItemSelect, data); +} + + +void CCategoryLayout::sm_CbGengridUnrealized(void *data, Evas_Object *obj, void *event_info) +{ + if (!data || !obj || !event_info) + return; + + elm_object_item_signal_callback_del((Elm_Object_Item *)event_info, + MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, + sm_CbItemSelect); +} + + +void CCategoryLayout::sm_CbKeyDown(void *dt, Evas *e, Evas_Object *obj, void *ei) +{ + CCategoryLayout *root = (CCategoryLayout *)dt; + + if (root) + root->m_OnKeyDown(e, obj, (Evas_Event_Key_Down*)ei); +} + + +void CCategoryLayout::m_OnKeyDown(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) +{ + Elm_Object_Item *it = NULL; + SContentInfo *ctxtinfo = NULL; + SCatItemInfo *itinfo = NULL; + + if (!obj) + return; + + if (strcmp(ev->keyname, KEY_MENU) || t.depth == + E_DEPTH_SELECT_LIST || t.depth == + E_DEPTH_SHOW_LIST) + return; + + it = elm_object_focused_item_get(obj); + if (!it) { + _ERR(" unable to get focused item "); + return; + } + t.focused_item = it; + + if (t.ctxtinfo) { + free(t.ctxtinfo); + t.ctxtinfo = NULL; + } + + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; + + itinfo = m_FindItemInfo(m->it_infolist, it); + if (!itinfo || itinfo->type == CAT_TYPE_PLAYLIST_NEW) { + free(ctxtinfo); + return; + } + + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + if (t.depth == E_DEPTH_SONG) { + ctxtinfo->type = CONTEXT_TYPE_SONG; + ctxtinfo->context = itinfo->sinfo; + } + else if (t.depth == E_DEPTH_ALBUM) { + ctxtinfo->type = CONTEXT_TYPE_ALBUM; + ctxtinfo->context = itinfo->alinfo; + } + else { + ctxtinfo->type = t_ContextType(); + ctxtinfo->context = itinfo->catinfo; + } + + t.ctxtinfo = ctxtinfo; + + SParcel parcel; + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); +} + + +int CCategoryLayout::m_ConvertToMin(int milsec) +{ + int min; + + min = milsec / 60000; /*milli seconds per minute*/ + + return min; +} + + +void CCategoryLayout::m_RemoveFocusIdler(void) +{ + if (!m->focus_idler) + return; + + ecore_idler_del(m->focus_idler); + m->focus_idler = NULL; +} + + +Elm_Object_Item *CCategoryLayout::m_FindItemByInfo(Eina_List *list, void *info) +{ + Eina_List *l = NULL; + SCatItemInfo *itinfo = NULL; + void *obj = NULL; + int id; + + if (!list || !info) + return NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SCatItemInfo *)obj; + if (!itinfo->catinfo) + continue; + + id = category_info_get_category_id(itinfo->catinfo); + if (id == category_info_get_category_id((category_info *)info)) + return itinfo->item; + } + + return NULL; +} + + +CCategoryLayout::SCatItemInfo *CCategoryLayout::m_FindItemInfo(Eina_List *list, Elm_Object_Item *item) +{ + Eina_List *l = NULL; + SCatItemInfo *itinfo = NULL; + void *obj = NULL; + + if (!list || !item) + return NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SCatItemInfo *)obj; + if (itinfo->item == item) + return itinfo; + } + + return NULL; +} + + +void CCategoryLayout::m_GotoPlayback(int mode, char *id) +{ + if (!m->it_infolist || eina_list_count(m->it_infolist) == 0) { + _create_message_box(Layout(), MUSIC_TEXT_NO_SONGS); + _ERR(" No songs for playback "); + return; + } + + if (t.depth == E_DEPTH_ALBUM) + m_AddAlbumsToPlayback(mode); + else if (t.depth == E_DEPTH_SONG || + t.depth == E_DEPTH_SHOW_LIST) + m_AddSongsToPlayback(mode); + else + return; + + if (mode == ADD_TYPE_FRESH) { + m->pMusicController->Stop(); + if (id) /* If want to play selected song */ + m->pMusicController->SetCurrentSong(id); + } + + _update_playback_view((EAddType)mode, Layout(), NULL); +} + + +Eina_List *CCategoryLayout::m_GetSelectedList(Eina_List *infolist, int type) +{ + Eina_List *idlist = NULL, *l = NULL; + SCatItemInfo *itinfo = NULL; + void *obj = NULL; + char *id = NULL; + EIdType eType = (EIdType)type; + + if (!infolist) + return NULL; + + idlist = NULL; + EINA_LIST_FOREACH(infolist, l, obj) { + itinfo = (SCatItemInfo *)obj; + if (!itinfo->check_status) + continue; + + if (eType == ID_TYPE_MEDIA) { + id = song_info_get_media_id(itinfo->sinfo); + if (id) + idlist = eina_list_append(idlist, id); + } + else { + idlist = eina_list_append(idlist, + itinfo->sinfo); + } + } + + return idlist; +} + + +void CCategoryLayout::m_AddSelectedSongs(void) +{ + Eina_List *idlist = NULL; + int lid; + + if (!t.c_catinfo) + return; + + lid = category_info_get_category_id(t.c_catinfo); + idlist = m_GetSelectedList(m->it_infolist, (int)ID_TYPE_MEDIA); + + if (!lid || !idlist) + return; + + if (!m->pMusicController->MediaAddmediaPlaylist(lid, idlist)) { + _ERR(" Failed to add songs to playlist "); + return; + } + + t.depth = E_DEPTH_CATEGORY; + t_UpdateLayoutWithFocus(); +} + + +void CCategoryLayout::m_RemoveSelectedSongs(void) +{ + Eina_List *idlist = NULL; + int lid; + + if (!t.c_catinfo) + return; + + lid = category_info_get_category_id(t.c_catinfo); + idlist = m_GetSelectedList(m->it_infolist, (int)ID_TYPE_MEMBER); + + if (!lid || !idlist) + return; + + if (!m->pMusicController->MediaRemovemediaPlaylist(lid, idlist)) { + _ERR(" Failed to remove songs from playlist "); + return; + } + + t.depth = E_DEPTH_CATEGORY; + t_UpdateLayoutWithFocus(); +} + + +void CCategoryLayout::m_AddAlbumsToPlayback(int mode) +{ + Eina_List *l = NULL, *sl = NULL; + Eina_List *slist = NULL; + Eina_List *list = NULL; + SSongInfo *sinfo = NULL; + SCatItemInfo *itinfo = NULL; + void *obj = NULL; + Eina_List *infolist = m->it_infolist; + CMusicController *pMusicController = m->pMusicController; + + list = NULL; + EINA_LIST_FOREACH(infolist, l, obj) { + itinfo = (SCatItemInfo *)obj; + slist = NULL; + if (!pMusicController->MediaGetList(LIST_TYPE_ALBUM_SONG, itinfo->alinfo, &slist)) { + _ERR(" Failed to get album songlist "); + continue; + } + + EINA_LIST_FOREACH(slist, sl, obj) { + sinfo = (SSongInfo *)obj; + list = eina_list_append(list, + song_info_duplicate(sinfo)); + } + + eina_list_free(slist); + } + + pMusicController->UpdatePlaylist(list, mode); + EINA_LIST_FREE(list, obj) { + sinfo = (SSongInfo *)obj; + song_info_destroy(sinfo); + } +} + + +void CCategoryLayout::m_AddSongsToPlayback(int mode) +{ + Eina_List *l = NULL; + Eina_List *list = NULL; + struct SCatItemInfo *itinfo = NULL; + void *obj = NULL; + Eina_List *infolist = m->it_infolist; + CMusicController *pMusicController = m->pMusicController; + + list = NULL; + EINA_LIST_FOREACH(infolist, l, obj) { + itinfo = (SCatItemInfo *)obj; + list = eina_list_append(list, itinfo->sinfo); + } + + pMusicController->UpdatePlaylist(list, mode); + eina_list_free(list); +} + + +Evas_Object *CCategoryLayout::m_AddAlbumCover(void) +{ + Evas_Object *album_cover = NULL; + + album_cover = elm_image_add(Layout()); + if (!album_cover) + return NULL; + + evas_object_size_hint_weight_set(album_cover, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + return album_cover; +} + + +Evas_Object *CCategoryLayout::m_AddGrid(void) +{ + Evas_Object *grid = NULL; + + grid = elm_gengrid_add(Layout()); + if (!grid) + return NULL; + + evas_object_size_hint_weight_set(grid, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_gengrid_align_set(grid, 0, 0); + evas_object_event_callback_add(grid, EVAS_CALLBACK_MOUSE_MOVE, _gengrid_mouse_moved, this); + evas_object_smart_callback_add(grid, MUSIC_SIGNAL_REALIZED, sm_CbGengridRealized, this); + evas_object_smart_callback_add(grid, MUSIC_SIGNAL_UNREALIZED, sm_CbGengridUnrealized, this); + evas_object_event_callback_add(grid, EVAS_CALLBACK_KEY_DOWN, sm_CbKeyDown, this); + elm_gengrid_item_size_set(grid, + elm_config_scale_get() * GENGRID_ITEM_SIZE_W, + elm_config_scale_get() * GENGRID_ITEM_SIZE_H); + + return grid; +} + + +void CCategoryLayout::m_AddCategoryItem(Elm_Gengrid_Item_Class *grid_item, ECategoryType type, void *info) +{ + SCatItemInfo *itinfo = NULL; + Elm_Object_Item *item = NULL; + + if (!grid_item) + return; + + itinfo = (SCatItemInfo *)calloc(1, sizeof(*itinfo)); + if (!itinfo) + return; + + itinfo->catinfo = (category_info *)info; + itinfo->type = type; + item = elm_gengrid_item_append(t.grid, + grid_item, itinfo, NULL, m); + itinfo->item = item; + m->it_infolist = eina_list_append(m->it_infolist, + itinfo); +} + + +void CCategoryLayout::m_AddButtons(void) +{ + int i; + Evas_Object *img = NULL; + char buf[MAX_LENGTH]; + SBtnInfo btninfo[TOTAL_ADD_BTNS]; + + btninfo[ABTN_PLAY].name = MUSIC_STR_PLAY; + btninfo[ABTN_PLAY].part = MUSIC_PART_CATEGORY_PLAYBTN; + btninfo[ABTN_PLAY].style = MUSIC_STYLE_ADD_PLAY_BTN; + btninfo[ABTN_PLAY].icon = MUSIC_IMAGE_ADD_PLAY; + btninfo[ABTN_PLAY].cb = sm_CbPlayBtnClicked; + + btninfo[ABTN_NEXT].name = MUSIC_STR_ADDNEXT; + btninfo[ABTN_NEXT].part = MUSIC_PART_CATEGORY_NEXTBTN; + btninfo[ABTN_NEXT].style = MUSIC_STYLE_ADD_NEXT_BTN; + btninfo[ABTN_NEXT].icon = MUSIC_IMAGE_ADD_NEXT; + btninfo[ABTN_NEXT].cb = sm_CbNextBtnClicked; + + btninfo[ABTN_LAST].name = MUSIC_STR_ADDLAST; + btninfo[ABTN_LAST].part = MUSIC_PART_CATEGORY_LASTBTN; + btninfo[ABTN_LAST].style = MUSIC_STYLE_ADD_LAST_BTN; + btninfo[ABTN_LAST].icon = MUSIC_IMAGE_ADD_LAST; + btninfo[ABTN_LAST].cb = sm_CbLastBtnClicked; + + if (t.depth == E_DEPTH_SHOW_LIST) { + btninfo[ABTN_PLAY].part = MUSIC_PART_ALBUM_PLAYBTN; + btninfo[ABTN_NEXT].part = MUSIC_PART_ALBUM_NEXTBTN; + btninfo[ABTN_LAST].part = MUSIC_PART_ALBUM_LASTBTN; + } + + for (i = 0; i < TOTAL_ADD_BTNS; i++) { + m->add_btn[i] = elm_button_add(Layout()); + if (!m->add_btn[i]) + continue; + + evas_object_size_hint_weight_set(m->add_btn[i], + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(m->add_btn[i], _(btninfo[i].name)); + elm_object_style_set(m->add_btn[i], btninfo[i].style); + evas_object_smart_callback_add(m->add_btn[i], + MUSIC_SIGNAL_CLICKED, btninfo[i].cb, this); + evas_object_event_callback_add(m->add_btn[i], + EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, this); + + img = elm_image_add(m->add_btn[i]); + if (img) { + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + btninfo[i].icon); + elm_image_file_set(img, buf, NULL); + elm_object_part_content_set(m->add_btn[i], + MUSIC_PART_ELM_SWALLOWICON, img); + } + + elm_object_part_content_set(Layout(), btninfo[i].part, m->add_btn[i]); + } + + elm_object_focus_set(m->add_btn[ABTN_PLAY], EINA_TRUE); + m->def_foc_btn = m->add_btn[ABTN_PLAY]; +} + + +void CCategoryLayout::m_AddSelectlistButtons(void) +{ + int i; + Evas_Object *btn = NULL; + SBtnInfo btninfo[TOTAL_SELECT_BTNS]; + + btninfo[SBTN_SELECT_ALL].name = MUSIC_TEXT_SELECT_ALL; + btninfo[SBTN_SELECT_ALL].part = MUSIC_PART_LIST_SELECT_ALL; + btninfo[SBTN_SELECT_ALL].style = MUSIC_STYLE_LIST_BTN; + btninfo[SBTN_SELECT_ALL].cb = sm_CbSelectAllClicked; + + btninfo[SBTN_DONE].name = MUSIC_TEXT_LIST_DONE; + btninfo[SBTN_DONE].part = MUSIC_PART_LIST_DONE_BTN; + btninfo[SBTN_DONE].style = MUSIC_STYLE_LIST_BTN; + btninfo[SBTN_DONE].cb = sm_CbDoneBtnClicked; + + btninfo[SBTN_CANCEL].name = MUSIC_TEXT_LIST_CANCEL; + btninfo[SBTN_CANCEL].part = MUSIC_PART_LIST_CANCEL_BTN; + btninfo[SBTN_CANCEL].style = MUSIC_STYLE_LIST_BTN; + btninfo[SBTN_CANCEL].cb = sm_CbCancelBtnClicked; + + if (t.sel_type == SELECT_CREATE) { + elm_object_part_text_set(Layout(), MUSIC_PART_LIST_MSG, + _(MUSIC_TEXT_LIST_CREATE_MSG)); + } + else if (t.sel_type == SELECT_ADD) { + elm_object_part_text_set(Layout(), MUSIC_PART_LIST_MSG, + _(MUSIC_TEXT_LIST_ADD_MSG)); + } + else if (t.sel_type == SELECT_REMOVE) { + elm_object_part_text_set(Layout(), MUSIC_PART_LIST_MSG, + _(MUSIC_TEXT_LIST_REMOVE_MSG)); + } + + for (i = 0; i < TOTAL_SELECT_BTNS; i++) { + btn = elm_button_add(Layout()); + if (!btn) + continue; + + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_object_text_set(btn, _(btninfo[i].name)); + elm_object_style_set(btn, btninfo[i].style); + evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, + btninfo[i].cb, this); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE, + _object_mouse_moved, this); + + elm_object_part_content_set(Layout(), btninfo[i].part, btn); + m->select_btn[i] = btn; + } + + elm_object_focus_set(btn, EINA_TRUE); + m->def_foc_btn = btn; +} + + +void CCategoryLayout::m_CreateSongsTopSection(void) +{ + char *path = NULL; + char buf[MAX_LENGTH]; + + m_AddButtons(); + + m->albumCover = m_AddAlbumCover(); + if (!m->albumCover) + return; + + if (t.depth == E_DEPTH_SHOW_LIST) + path = category_info_get_thumb(t.c_catinfo); + else + path = album_info_get_thumb(t.c_alinfo); + + if (path) { + elm_image_file_set(m->albumCover, path, NULL); + elm_image_aspect_fixed_set(m->albumCover, EINA_FALSE); + } + else { + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_DEFAULT_THUMB_126); + elm_image_file_set(m->albumCover, buf, NULL); + elm_image_no_scale_set(m->albumCover, EINA_TRUE); + } + elm_object_part_content_set(Layout(), MUSIC_PART_ALBUM_THUMB, m->albumCover); + + if (t.depth == E_DEPTH_SHOW_LIST) { + elm_object_part_text_set(Layout(), MUSIC_PART_ALBUM_NAME, + category_info_get_name(t.c_catinfo)); + } + else { + elm_object_part_text_set(Layout(), + MUSIC_PART_CATEGORY_NAME, + category_info_get_name(t.c_catinfo)); + elm_object_part_text_set(Layout(), MUSIC_PART_ALBUM_NAME, + album_info_get_name(t.c_alinfo)); + elm_object_part_text_set(Layout(), MUSIC_PART_ALBUM_ARTIST, + album_info_get_artist(t.c_alinfo)); + } + + snprintf(buf, sizeof(buf), "%d %s", + m_ConvertToMin(m->total_duration), _("min")); + elm_object_part_text_set(Layout(), MUSIC_PART_ALBUM_TIME, buf); + snprintf(buf, sizeof(buf), "%d", eina_list_count(m->songlist)); + elm_object_part_text_set(Layout(), MUSIC_PART_ALBUM_SONGCOUNT, buf); +} + + +void CCategoryLayout::m_CreateSongList(void) +{ + Evas_Object *genlist = NULL; + Elm_Genlist_Item_Class *list_item = NULL; + bool r; + struct SSongInfo *sinfo = NULL; + void *obj = NULL; + Eina_List *l = NULL; + struct SCatItemInfo *itinfo = NULL; + Elm_Object_Item *item = NULL; + int dur; + void (*item_select_fn)(void *, Evas_Object *, void *) = NULL; + + genlist = elm_genlist_add(Layout()); + if (!genlist) + return; + + elm_genlist_homogeneous_set(genlist, EINA_TRUE); + + evas_object_size_hint_weight_set(genlist, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(Layout(), MUSIC_PART_SONGLIST, genlist); + evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_MOVE, _genlist_mouse_moved, this); + evas_object_event_callback_add(genlist, EVAS_CALLBACK_KEY_DOWN, sm_CbKeyDown, this); + m->glist = genlist; + + list_item = elm_genlist_item_class_new(); + if (!list_item) { + evas_object_del(genlist); + _ERR(" elm_genlist_item_class_new failed "); + return; + } + list_item->func.content_get = NULL; + list_item->func.state_get = NULL; + list_item->func.del = sm_CbRemoveListItem; + m->count = 0; + + if (t.depth == E_DEPTH_SELECT_LIST) { + list_item->func.text_get = sm_CbGetSelectlistItemText; + list_item->item_style = MUSIC_STYLE_SELECT_LIST; + item_select_fn = sm_CbSelectlistItemSelect; + if (t.sel_type == SELECT_REMOVE) { + r = m->pMusicController->MediaGetList(LIST_TYPE_PLAYLISTS_SONG, t.c_catinfo, &(m->songlist)); + } + else { + r = m->pMusicController->MediaGetList(LIST_TYPE_SONG, NULL, &(m->songlist)); + } + } + else { + list_item->func.text_get = sm_CbGetListItemText; + list_item->item_style = MUSIC_STYLE_ALBUM_SONGLIST; + item_select_fn = sm_CbSongItemSelect; + if (t.depth == E_DEPTH_SHOW_LIST) + r = m->pMusicController->MediaGetList(LIST_TYPE_PLAYLISTS_SONG, t.c_catinfo, &(m->songlist)); + else + r = m->pMusicController->MediaGetList(LIST_TYPE_ALBUM_SONG, t.c_alinfo, &(m->songlist)); + } + + if (r == false) { + _ERR(" Fetching song list from media failed "); + evas_object_del(genlist); + elm_genlist_item_class_free(list_item); + return; + } + + EINA_LIST_FOREACH(m->songlist, l, obj) { + sinfo = (SSongInfo *)obj; + itinfo = (SCatItemInfo *)calloc(1, sizeof(*itinfo)); + if (!itinfo) + return; + + itinfo->sinfo = sinfo; + item = elm_genlist_item_append(genlist, list_item, + itinfo, NULL, ELM_GENLIST_ITEM_NONE, + item_select_fn, this); + itinfo->item = item; + m->it_infolist = eina_list_append(m->it_infolist, itinfo); + dur = 0; + song_info_get_duration(sinfo, &dur); + m->total_duration = m->total_duration + dur; + } + elm_genlist_item_class_free(list_item); +} + + +void CCategoryLayout::m_CreateAlbumgrid(void) +{ + album_info *alinfo = NULL; + void *obj = NULL; + Eina_List *l = NULL; + SCatItemInfo *itinfo = NULL; + Elm_Object_Item *item = NULL; + char buf[MAX_LENGTH]; + Elm_Gengrid_Item_Class *grid_item = NULL; + + t.grid = m_AddGrid(); + if (!t.grid) + return; + + grid_item = elm_gengrid_item_class_new(); + if (!grid_item) { + evas_object_del(t.grid); + _ERR(" elm_genlist_item_class_new failed "); + return; + } + grid_item->item_style = MUSIC_STYLE_CATEGORY_GRID; + grid_item->func.text_get = sm_CbGetGridAlbumItemText; + grid_item->func.content_get = sm_CbGetGridAlbumitemContent; + grid_item->func.state_get = NULL; + grid_item->func.del = sm_CbRemoveGridItem; + + m->alblist = category_info_get_albumlist(t.c_catinfo); + if (!m->alblist || eina_list_count(m->alblist) == 0) { + _ERR(" Fetching album list failed "); + evas_object_del(t.grid); + elm_gengrid_item_class_free(grid_item); + return; + } + + EINA_LIST_FOREACH(m->alblist, l, obj) { + alinfo = (album_info *)obj; + itinfo = (SCatItemInfo *)calloc(1, sizeof(*itinfo)); + if (!itinfo) + return; + itinfo->alinfo = alinfo; + item = elm_gengrid_item_append(t.grid, + grid_item, itinfo, NULL, m); + itinfo->item = item; + m->it_infolist = eina_list_append(m->it_infolist, + itinfo); + } + elm_gengrid_item_class_free(grid_item); + + elm_object_part_text_set(Layout(), + MUSIC_PART_CATEGORY_NAME, + category_info_get_name(t.c_catinfo)); + snprintf(buf, sizeof(buf), "%d", + category_info_get_albumcount(t.c_catinfo)); + elm_object_part_text_set(Layout(), + MUSIC_PART_CATEGORY_ALBUMCOUNT, buf); + snprintf(buf, sizeof(buf), "%d", + category_info_get_songcount(t.c_catinfo)); + elm_object_part_text_set(Layout(), + MUSIC_PART_CATEGORY_SONGCOUNT, buf); + elm_object_part_content_set(Layout(), + MUSIC_PART_CATEGORY_ALBUM_GRID, t.grid); +} + + +void CCategoryLayout::m_CreateCatgrid(bool sort_flag) +{ + void *info = NULL; + Eina_List *l = NULL; + Elm_Gengrid_Item_Class *grid_item = NULL; + + t.grid = m_AddGrid(); + if (!t.grid) + return; + + grid_item = elm_gengrid_item_class_new(); + if (!grid_item) { + evas_object_del(t.grid); + _ERR(" elm_genlist_item_class_new failed "); + return; + } + grid_item->item_style = MUSIC_STYLE_CATEGORY_GRID; + grid_item->func.text_get = sm_CbGetGridItemText; + grid_item->func.content_get = sm_CbGetGridItemContent; + grid_item->func.state_get = NULL; + grid_item->func.del = sm_CbRemoveGridItem; + + if (!sort_flag) { + if (!t_GetMediaList(&m->catlist)) { + if (t_CategoryType() != CAT_TYPE_PLAYLISTS) { + _ERR(" Fetching list failed "); + SetEmptyStatus(true); + elm_gengrid_item_class_free(grid_item); + return; + } + } + } + m_SortCatgrid(); + + if (t_CategoryType() == CAT_TYPE_PLAYLISTS) + m_AddCategoryItem(grid_item, CAT_TYPE_PLAYLIST_NEW, NULL); + + EINA_LIST_FOREACH(m->catlist, l, info) + m_AddCategoryItem(grid_item, t_CategoryType(), info); + + elm_gengrid_item_class_free(grid_item); + + elm_object_part_content_set(Layout(), + MUSIC_PART_CATEGORY_GRID, t.grid); +} + + +void CCategoryLayout::m_SortCatgrid(void) +{ + int(*_sort[])(const void *d1, const void *d2) = { + sortcategorys_az, + sortcategorys_za + }; + int sort_type; + + if (!m->catlist) + return; + + sort_type = m->pMusicController->SortType(); + m->catlist = eina_list_sort(m->catlist, 0, + _sort[sort_type]); +} + + +void CCategoryLayout::m_EmptyLayout(bool sort_flag) +{ + if (t.grid) + elm_gengrid_clear(t.grid); + + if (m->glist) + elm_genlist_clear(m->glist); + + if (!sort_flag) { + if (m->catlist) { + eina_list_free(m->catlist); + m->catlist = NULL; + } + } + + if (m->alblist) { + eina_list_free(m->alblist); + m->alblist = NULL; + } + + if (m->songlist) { + eina_list_free(m->songlist); + m->songlist = NULL; + } + + if (m->it_infolist) { + eina_list_free(m->it_infolist); + m->it_infolist = NULL; + } + + m->total_duration = 0; + + int i; + + for (i = 0; i < TOTAL_ADD_BTNS; i++) { + if (m->add_btn[i]) + evas_object_del(m->add_btn[i]); + m->add_btn[i] = NULL; + } + + for (i = 0; i < TOTAL_SELECT_BTNS; i++) { + if (m->select_btn[i]) + evas_object_del(m->select_btn[i]); + m->select_btn[i] = NULL; + } + + if (m->albumCover) + evas_object_del(m->albumCover); + m->albumCover = NULL; + + evas_object_hide(Layout()); + elm_object_part_content_unset(t.base, MUSIC_PART_CONTENT); +} + + + +bool CCategoryLayout::t_SetEdje(const char *szLayout) +{ + ASSERT(szLayout); + if (!elm_layout_file_set(Layout(), EDJEFILE, szLayout)) { + _ERR(" elm szLayout file set failed "); + return false; + } + return true; +} + + +void CCategoryLayout::t_UpdateLayout(bool sort_flag) +{ + /* Remove existing grid and prepare afresh */ + m_EmptyLayout(sort_flag); + + SParcel parcel; + parcel.ctxtInfo = NULL; + + if (t.depth == E_DEPTH_SONG) { + if (!t_SetEdje(MUSIC_CATEGORY_SONGS_LAYOUT)) { + _ERR(" get layout failed "); + return; + } + m_CreateSongList(); + m_CreateSongsTopSection(); + + parcel.updateType = E_LAYOUT_UPDATE; + parcel.layoutId = MUSIC_CATEGORY_SONGS_LAYOUT; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + else if (t.depth == E_DEPTH_SHOW_LIST) { + if (!t_SetEdje(MUSIC_ALBUM_SONGS_LAYOUT)) { + _ERR(" get layout failed "); + return; + } + m_CreateSongList(); + m_CreateSongsTopSection(); + + parcel.updateType = E_LAYOUT_UPDATE; + parcel.layoutId = MUSIC_CATEGORY_SONGS_LAYOUT; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + else if (t.depth == E_DEPTH_ALBUM) { + if (!t_SetEdje(MUSIC_CATEGORY_ALBUM_LAYOUT)) { + _ERR(" get layout failed "); + return; + } + m_AddButtons(); + m_CreateAlbumgrid(); + + parcel.updateType = E_LAYOUT_UPDATE; + parcel.layoutId = MUSIC_CATEGORY_ALBUM_LAYOUT; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + else if (t.depth == E_DEPTH_SELECT_LIST) { + if (!t_SetEdje(MUSIC_CATEGORY_SELECTLIST_LAYOUT)) { + _ERR(" get layout failed "); + return; + } + m_CreateSongList(); + m_AddSelectlistButtons(); + + parcel.updateType = E_LAYOUT_UPDATE; + parcel.layoutId = MUSIC_CATEGORY_SELECTLIST_LAYOUT; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + elm_object_focus_next_object_set(m->glist, + m->select_btn[SBTN_DONE], ELM_FOCUS_RIGHT); + } + else { + if (!t_SetEdje(MUSIC_CATEGORY_LAYOUT)) { + _ERR(" get layout failed "); + return; + } + m_CreateCatgrid(sort_flag); + + parcel.updateType = E_LAYOUT_UPDATE; + parcel.layoutId = MUSIC_CATEGORY_LAYOUT; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } +} + + +void CCategoryLayout::t_UpdateLayoutWithFocus(void) +{ + elm_object_tree_focus_allow_set(t.base, EINA_FALSE); + t_UpdateLayout(false); + elm_object_part_content_set(t.base, MUSIC_PART_CONTENT, Layout()); + evas_object_show(Layout()); + m_RemoveFocusIdler(); + m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this); +} + + +bool CCategoryLayout::Create(CLayoutMgr *mgr) +{ + ASSERT(!m); + + Evas_Object *base = NULL; + Evas_Object *win = NULL; + Evas_Object *layout = NULL; + CMusicController *pMusicController = NULL; + CViewMgr *vmgr = NULL; + + if (!mgr) + return false; + + m = new SCategoryLayout; + if (!m) { + _ERR(" calloc failed "); + return false; + } + + vmgr = CViewMgr::GetInstance(); + if (!vmgr) { + _ERR(" get view mgr failed "); + delete m; + m = NULL; + return false; + } + + base = mgr->Base(); + if (!base) { + _ERR(" get base failed "); + delete m; + m = NULL; + return false; + } + + win = vmgr->Window(); + if (!win) { + _ERR(" vimewmgr get win failed "); + delete m; + m = NULL; + return false; + } + + pMusicController = CMusicController::GetInstance(); + if (!pMusicController) { + _ERR(" music controller get music instance failed "); + delete m; + m = NULL; + return false; + } + + layout = elm_layout_add(base); + if (!layout) { + _ERR(" layout creation failed "); + delete m; + m = NULL; + return false; + } + + bool r = CExtBaseLayout::Create(layout); + if (!r) { + _ERR(" CBaseLayout creation failed "); + evas_object_del(layout); + delete m; + m = NULL; + return false; + } + + m->win = win; + t.base = base; + m->vmgr = vmgr; + m->pMusicController = pMusicController; + m->lmgr = mgr; + t.depth = E_DEPTH_CATEGORY; + + t_UpdateLayout(false); + Connect(Layout()); + + return true; +} + + +void CCategoryLayout::Destroy(void) +{ + ASSERT(m); + + Disconnect(Layout()); + if (t.epopup) + destroy_entry_popup(t.epopup); + + m_RemoveFocusIdler(); + m_EmptyLayout(false); + category_info_destroy(t.c_catinfo); + album_info_destroy(t.c_alinfo); + song_info_destroy(m->c_sinfo); + CExtBaseLayout::Destroy(); + evas_object_del(Layout()); + + delete m; + m = NULL; +} + + +void CCategoryLayout::t_OnShow(void) +{; + ASSERT(m); + + t.depth = E_DEPTH_CATEGORY; + t_UpdateLayout(false); + elm_object_part_content_set(t.base, MUSIC_PART_CONTENT, Layout()); + evas_object_show(Layout()); +} + + +void CCategoryLayout::Update(bool focusFlag) +{ + ASSERT(m); + + if (!focusFlag) { + if (t.depth != E_DEPTH_CATEGORY) + return; + t_UpdateLayout(true); + return; + } + + elm_object_focus_set(t.grid, EINA_TRUE); +} + + +void CCategoryLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) +{ + int count; + Eina_List *alist = NULL; + + if (!strcmp(ev->keyname, KEY_BACK)) { + if (t.depth == E_DEPTH_CATEGORY) { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_FOCUS_UPDATE; + parcel.layoutId = NULL; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + return; + } + else if (t.depth == E_DEPTH_ALBUM) { + t.depth = E_DEPTH_CATEGORY; + } + else if (t.depth == E_DEPTH_SELECT_LIST) { + t.depth = E_DEPTH_CATEGORY; + } + else if (t.depth == E_DEPTH_SHOW_LIST) { + t.depth = E_DEPTH_CATEGORY; + } + else if (t.depth == E_DEPTH_SONG) { + count = 0; + alist = category_info_get_albumlist(t.c_catinfo); + if (alist) + count = eina_list_count(alist); + if (count == 1) + t.depth = E_DEPTH_CATEGORY; + else + t.depth = E_DEPTH_ALBUM; + } + + t_UpdateLayoutWithFocus(); + } +} diff --git a/src/views/common-ui.cpp b/src/views/common-ui.cpp new file mode 100644 index 0000000..2098c6e --- /dev/null +++ b/src/views/common-ui.cpp @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "i18n.h" +#include "define.h" +#include "dbg.h" +#include "common.h" +#include "common-ui.h" +#include "BaseView.h" +#include "ViewMgr.h" +#include "song_info.h" +//#include "playback-view.h" + +#define MESSAGE_SHOW_TIME 2 + +struct msg_box { + Evas_Object *ly; + Ecore_Timer *timer; +}; + +char *_get_timestr_from_milseconds(int mseconds) +{ + int sec; + char buf[MAX_LENGTH]; + + sec = mseconds / 1000; + snprintf(buf, sizeof(buf), "%02d:%02d", sec / 60, sec % 60); + + return strdup(buf); +} + +void _set_object_text(Evas_Object *lbl, char *text, int size, const char *style) +{ + char buf[MAX_LENGTH]; + + if (!lbl || !text) + return; + + snprintf(buf, sizeof(buf), + "

" + "%s" + "
", + style, size, text); + + elm_object_text_set(lbl, buf); +} + +Evas_Object *_add_box(Evas_Object *base) +{ + Evas_Object *box; + if (!base) + return NULL; + + box = elm_box_add(base); + if (!box) + return NULL; + + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + return box; +} + +Evas_Object *_add_base(Evas_Object *win, const char *layout) +{ + Evas_Object *base; + if (!win) + return NULL; + + base = elm_layout_add(win); + if (!base) + return NULL; + + if (layout) { + if (!elm_layout_file_set(base, EDJEFILE, layout)) { + evas_object_del(base); + _ERR(" elm layout file set failed "); + return NULL; + } + } + + return base; +} + +void _object_mouse_moved(void *dt, Evas *e, Evas_Object *obj, void *ei) +{ + if (!obj) + return; + + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); +} + +void _genlist_mouse_moved(void *dt, Evas *e, Evas_Object *obj, void *ei) +{ + Elm_Object_Item *item; + Evas_Event_Mouse_Move *ev; + + if (!obj || !ei) + return; + + ev = (Evas_Event_Mouse_Move *)ei; + + item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL); + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); +} + +void _gengrid_mouse_moved(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + Elm_Object_Item *item; + Evas_Event_Mouse_Move *ev; + + if (!obj || !ei) + return; + + ev = (Evas_Event_Mouse_Move *)ei; + + item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL, NULL); + if (!item) + return; + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); +} + +static Eina_Bool _timer_cb(void *dt) +{ + struct msg_box *mbox; + + if (!dt) + return ECORE_CALLBACK_CANCEL; + + mbox = (msg_box *)dt; + + mbox->timer = NULL; + evas_object_del(mbox->ly); + free(mbox); + + return ECORE_CALLBACK_CANCEL; +} + +void _create_message_box(Evas_Object *base, const char *msg) +{ + Evas_Object *ly; + struct msg_box *mbox; + + if (!base || !msg) + return; + + mbox = (msg_box *)calloc(1, sizeof(*mbox)); + if (!mbox) + return; + + ly = _add_base(base, MUSIC_MESSAGE_LAYOUT); + if (!ly) { + _ERR(" Failed to add layout "); + free(mbox); + return; + } + + elm_object_part_text_set(ly, MUSIC_PART_MESSAGE, msg); + + evas_object_show(ly); + mbox->ly = ly; + mbox->timer = ecore_timer_add(MESSAGE_SHOW_TIME, _timer_cb, mbox); +} + +Evas_Object *_create_remove_popup(Evas_Object *base, const char *msg, + Evas_Object_Event_Cb _close_cb, Evas_Smart_Cb _remove_cb, + Evas_Smart_Cb _cancel_cb, void *dt) +{ + Evas_Object *popup, *yesbtn, *nobtn, *lbl; + + if (!base || !_remove_cb || !_cancel_cb || !dt) { + _ERR("Invalid argument."); + return NULL; + } + + popup = elm_popup_add(base); + if (!popup) { + _ERR("elm_popup_add failed."); + return NULL; + } + + elm_object_style_set(popup, MUSIC_STYLE_REMOVE_POPUP); + elm_object_part_text_set(popup, MUSIC_PART_RPOPUP_TITLE, + _(MUSIC_TEXT_REMOVE)); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); + evas_object_event_callback_add(popup, EVAS_CALLBACK_KEY_DOWN, + _close_cb, dt); + evas_object_show(popup); + + lbl = elm_label_add(popup); + if (!lbl) + goto err; + + elm_object_style_set(lbl, MUSIC_STYLE_REMOVE_LABEL); + elm_object_text_set(lbl, _(msg)); + elm_object_content_set(popup, lbl); + + yesbtn = elm_button_add(popup); + if (!yesbtn) + goto err; + + elm_object_text_set(yesbtn, _(MUSIC_TEXT_REMOVE)); + elm_object_part_content_set(popup, MUSIC_PART_RPOPUP_BTN1, yesbtn); + evas_object_smart_callback_add(yesbtn, MUSIC_SIGNAL_CLICKED, + _remove_cb, dt); + + nobtn = elm_button_add(popup); + if (!nobtn) + goto err; + + elm_object_text_set(nobtn, _(MUSIC_TEXT_CANCEL)); + elm_object_part_content_set(popup, MUSIC_PART_RPOPUP_BTN2, nobtn); + evas_object_smart_callback_add(nobtn, MUSIC_SIGNAL_CLICKED, + _cancel_cb, dt); + elm_object_focus_set(nobtn, EINA_TRUE); + + return popup; + +err: + _ERR("Add Evas_Object failed."); + evas_object_del(popup); + + return NULL; +} + +void _update_playback_view(enum EAddType type, + Evas_Object *layout, Elm_Object_Item *focused_item) +{ + Evas_Object *obj; + + CViewMgr* vmgr = CViewMgr::GetInstance(); + if (!vmgr || !layout) + return; + + obj = NULL; + if (!focused_item) + obj = elm_object_focused_object_get(layout); + + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_PLAYLIST_UPDATE; + parcel.layoutId = NULL; + parcel.keyEvent = NULL; + + if (!vmgr->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel)) { + if (!vmgr->PushView(MUSIC_PLAYBACK_VIEW, NULL)) + _ERR(" viewmgr push view failed "); + return; + } + + if (type == ADD_TYPE_FRESH) { + if (!vmgr->PushView(MUSIC_PLAYBACK_VIEW, NULL)) + _ERR(" viewmgr show failed "); + + return; + } + + if (focused_item) { + if (!vmgr->PushView(MUSIC_BASE_VIEW, NULL)) { + _ERR(" viewmgr show failed "); + return; + } + elm_object_item_focus_set(focused_item, EINA_TRUE); + } else { + if (obj) + elm_object_focus_set(obj, EINA_TRUE); + } + + if (type == ADD_TYPE_NEXT) + _create_message_box(layout, MUSIC_TEXT_NEXT_MSG); + else + _create_message_box(layout, MUSIC_TEXT_LAST_MSG); +} diff --git a/src/views/context-view.cpp b/src/views/context-view.cpp new file mode 100644 index 0000000..c8dd6a6 --- /dev/null +++ b/src/views/context-view.cpp @@ -0,0 +1,1701 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "AppCommon.h" +#include +#include "dbg.h" +#include "i18n.h" +#include "define.h" +#include "song_info.h" +#include "album_info.h" +#include "category_info.h" +#include "folder_info.h" +#include "common.h" +#include "common-ui.h" +#include "music-controller.h" +#include "mediadata.h" +#include "BaseView.h" +#include "ViewMgr.h" +#include "context-view.h" + +#define _GET_PRIV(o) evas_object_data_get(o, "CTMDATA"); +#define _SET_PRIV(o, data) evas_object_data_set(o, "CTMDATA", data); + +#define TOTAL_REL_CONTENTS 10 +#define TOTAL_CONTEXT_BTNS 10 +#define TABLE_MAX_COL 2 +#define MIN_LABEL_WIDTH 103 +#define MUSIC_CTXT_BTN_WPAD 26 +#define MUSIC_CTXT_TABLE_WPAD 14 +#define MUSIC_CTXT_TABLE_HPAD 14 + + +enum EBtnType { + CTXBTN_INVALID = -1, + CTXBTN_PLAY = 0, + CTXBTN_NEXT, + CTXBTN_LAST, + CTXBTN_ADDTO, + CTXBTN_PLAYSONG, + CTXBTN_DEL, + CTXBTN_RENAME, + CTXBTN_ADDSONG, + CTXBTN_REMOVESONG, + CTXBTN_DELETE, + CTXBTN_MAX +}; + +struct SBtnInfo { + const char *txt; + const char *icon; +}; + +struct SRltvCtnt { + char* title; + char* imgpath; + char* link; +}; + +struct SContextView { + Evas_Object *win; + Evas_Object *base; + Evas_Object *table; + Evas_Object *moreinfo; + Evas_Object *playbtn; + Evas_Object *first_line[TABLE_MAX_COL]; + Evas_Object *last_line[TABLE_MAX_COL]; + Evas_Object *popup; + Ecore_Idler *idler; + CMusicController *mhandle; + CViewMgr *vmgr; + SContentInfo *ctxtinfo; + EContextType type; + int lid; + CContextView *parent; + + class CHandlerButton : public CListenerMgr, + public IMouseMoveListener, public IMouseUpListener, public IKeyUpListener, + public IFocusedListener, public IUnfocusedListener { + public: + struct SCallback { + void(*addScroller)(void* cookie, Evas_Object *base, Evas_Object **scroller); + void* cookie; + }; + + private: + SContextView *m; + SCallback m_callback; + + private: + static void sm_CbPopupKeyPressed(void *data, Evas *e, Evas_Object *obj, void *ei) + { + CHandlerButton *root = (CHandlerButton *)data; + if (root) + root->m_OnPopUpKeyPressed(e, obj, (Evas_Event_Key_Down *)ei); + } + + void m_OnPopUpKeyPressed(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) + { + if (!ev->keyname) + return; + + if (!strcmp(ev->keyname, KEY_BACK)) + m_DestroyPopup(); + } + + static void sm_CbRemove(void *data, Evas_Object *obj, void *ei) + { + CHandlerButton *root = (CHandlerButton *)data; + if (root) + root->m_OnRemove(obj); + } + + void m_OnRemove(Evas_Object *obj) + { + SContentInfo *cinfo = NULL; + + if (!obj) { + _ERR("Invalid argument."); + return; + } + + m_DestroyPopup(); + + if (!m->ctxtinfo || !m->ctxtinfo->update) + return; + + cinfo = m->ctxtinfo; + cinfo->update(cinfo->cbdata, ACTION_TYPE_DELETE, 0); + } + + static void sm_CbCancel(void *data, Evas_Object *obj, void *ei) + { + CHandlerButton *root = (CHandlerButton *)data; + if (root) + root->m_OnCancel(obj); + } + + void m_OnCancel(Evas_Object *obj) + { + if (!obj) { + _ERR("Invalid argument."); + return; + } + + m_DestroyPopup(); + } + + static int sm_CbSortPlaylist(const void *d1, const void *d2) + { + SCtxtPlaylistItem *info1 = (SCtxtPlaylistItem *)d1; + SCtxtPlaylistItem *info2 = (SCtxtPlaylistItem *)d2; + char *txt1 = NULL; + char *txt2 = NULL; + + txt1 = info1->name; + txt2 = info2->name; + + if (!txt1) + return 1; + if (!txt2) + return -1; + + return strcasecmp(txt1, txt2); + } + + static void sm_CbPopupDeleted(void *data, Evas *e, Evas_Object *obj, void *ei) + { + Eina_List *list = (Eina_List *)data; + SCtxtPlaylistItem *item = NULL; + void *listObj = NULL; + + if (!list) + return; + + EINA_LIST_FREE(list, listObj) { + item = (SCtxtPlaylistItem *)listObj; + free(item->name); + free(item); + } + } + + static void sm_CbPopupBtnClicked(void *data, Evas_Object *obj, void *ei) + { + CHandlerButton *root = (CHandlerButton *)data; + if (root) + root->m_OnPopupBtnClicked(obj); + } + + void m_OnPopupBtnClicked(Evas_Object *obj) + { + SCtxtPlaylistItem *item = (SCtxtPlaylistItem *)_GET_PRIV(obj); + + if (!item) { + _ERR("Invalid argument."); + return; + } + + m->lid = item->id; + m->idler = ecore_idler_add(sm_CbSelectIdler, this); + } + + static Eina_Bool sm_CbSelectIdler(void *dt) + { + CHandlerButton *root = (CHandlerButton *)dt; + Eina_Bool r; + + if (root) + r = root->m_OnSelectIdler(); + + return r; + } + + Eina_Bool m_OnSelectIdler(void) + { + SContentInfo *cinfo = NULL; + + m->idler = NULL; + m_DestroyPopup(); + + if (!m->ctxtinfo || !m->ctxtinfo->update) + return ECORE_CALLBACK_CANCEL; + + cinfo = m->ctxtinfo; + cinfo->update(cinfo->cbdata, ACTION_TYPE_ADDTO, m->lid); + cinfo->close(cinfo->cbdata); + + return ECORE_CALLBACK_CANCEL; + } + + private: + void m_HandleBtnSelected(int btnType) + { + SContentInfo *cinfo = NULL; + + if (!m->ctxtinfo || !m->ctxtinfo->update) + return; + + EBtnType type = (EBtnType)btnType; + + cinfo = m->ctxtinfo; + + switch (type) { + case CTXBTN_PLAY: + case CTXBTN_PLAYSONG: + cinfo->update(cinfo->cbdata, ACTION_TYPE_PLAY, 0); + break; + + case CTXBTN_NEXT: + cinfo->update(cinfo->cbdata, ACTION_TYPE_ADDNEXT, 0); + break; + + case CTXBTN_LAST: + cinfo->update(cinfo->cbdata, ACTION_TYPE_ADDLAST, 0); + break; + + case CTXBTN_ADDTO: + m->popup = m_CreatePlaylistPopup(); + if (!m->popup) + _create_message_box(m->base, MUSIC_TEXT_NOLIST_MSG); + break; + + case CTXBTN_DEL: + m->popup = m_CreateRemovePopup(m->base, + MUSIC_TEXT_REMOVE_SMSG, sm_CbPopupKeyPressed, + sm_CbRemove, sm_CbCancel, this); + break; + + case CTXBTN_RENAME: + cinfo->update(cinfo->cbdata, ACTION_TYPE_RENAME, 0); + break; + + case CTXBTN_ADDSONG: + cinfo->update(cinfo->cbdata, ACTION_TYPE_ADDSONG, 0); + break; + + case CTXBTN_REMOVESONG: + cinfo->update(cinfo->cbdata, ACTION_TYPE_REMOVESONG, 0); + break; + + case CTXBTN_DELETE: + m->popup = m_CreateRemovePopup(m->base, + MUSIC_TEXT_REMOVE_PLMSG, sm_CbPopupKeyPressed, + sm_CbRemove, sm_CbCancel, this); + break; + + default: + _ERR("Wrong btn type"); + } + } + + Evas_Object *m_CreatePlaylistPopup(void) + { + Evas_Object *popup = NULL, *box = NULL, *btn = NULL, *scr = NULL, *firstbtn = NULL; + Eina_List *l = NULL, *list = NULL; + struct SCtxtPlaylistItem *item = NULL; + void *obj = NULL; + int i, tc; + + popup = elm_ctxpopup_add(m->base); + if (!popup) { + _ERR("elm_ctxpopup_add failed."); + return NULL; + } + + box = elm_box_add(popup); + if (!box) { + _ERR("elm_box_add failed."); + evas_object_del(popup); + return NULL; + } + + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0); + + list = CMediadata::PlaylistsForCtxt(); + if (!list || eina_list_count(list) == 0) { + _ERR("Fetching list of playlists failed"); + evas_object_del(popup); + return NULL; + } + + list = eina_list_sort(list, 0, sm_CbSortPlaylist); + elm_object_style_set(popup, MUSIC_STYLE_LIST_POPUP); + evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, + sm_CbPopupDeleted, list); + + btn = NULL; + firstbtn = NULL; + i = 0; + tc = eina_list_count(list); + + EINA_LIST_FOREACH(list, l, obj) { + item = (SCtxtPlaylistItem *)obj; + btn = elm_button_add(box); + if (!btn) { + _ERR("elm_button_add failed."); + evas_object_del(popup); + return NULL; + } + + if (i == 0) { + elm_object_style_set(btn, MUSIC_STYLE_TOPTEXT_BTN); + firstbtn = btn; + } + else if (i == tc - 1) { + _INFO(); + elm_object_style_set(btn, MUSIC_STYLE_BOTTOMTEXT_BTN); + elm_object_signal_emit(btn, MUSIC_SIGNAL_HIDELINE, + MUSIC_CONTEXT_VIEW); + } + else { + elm_object_style_set(btn, MUSIC_STYLE_MIDDLETEXT_BTN); + } + + i++; + elm_object_text_set(btn, item->name); + evas_object_show(btn); + elm_box_pack_end(box, btn); + _SET_PRIV(btn, item); + + evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, + sm_CbPopupBtnClicked, this); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE, + _object_mouse_moved, NULL); + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, + sm_CbPopupKeyPressed, m); + } + + m_callback.addScroller(m_callback.cookie, popup, &scr); + if (!scr) { + evas_object_del(popup); + return NULL; + } + + elm_object_content_set(scr, box); + elm_object_content_set(popup, scr); + elm_object_part_content_set(m->base, MUSIC_PART_PLIST_POPUP, popup); + + elm_ctxpopup_direction_priority_set(popup, (Elm_Ctxpopup_Direction)0, (Elm_Ctxpopup_Direction)0, (Elm_Ctxpopup_Direction)0, (Elm_Ctxpopup_Direction)0); + + if (firstbtn && btn) { + elm_object_focus_set(firstbtn, EINA_TRUE); + elm_object_focus_next_object_set(firstbtn, btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn, firstbtn, ELM_FOCUS_DOWN); + } + + return popup; + } + + Evas_Object *m_CreateRemovePopup(Evas_Object *base, const char *msg, + Evas_Object_Event_Cb _close_cb, Evas_Smart_Cb _remove_cb, + Evas_Smart_Cb _cancel_cb, void *dt) + { + Evas_Object *popup, *yesbtn, *nobtn, *lbl; + + if (!base || !_remove_cb || !_cancel_cb || !dt) { + _ERR("Invalid argument."); + return NULL; + } + + popup = elm_popup_add(base); + if (!popup) { + _ERR("elm_popup_add failed."); + return NULL; + } + + elm_object_style_set(popup, MUSIC_STYLE_REMOVE_POPUP); + elm_object_part_text_set(popup, MUSIC_PART_RPOPUP_TITLE, + _(MUSIC_TEXT_REMOVE)); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); + evas_object_event_callback_add(popup, EVAS_CALLBACK_KEY_DOWN, + _close_cb, dt); + evas_object_show(popup); + + lbl = elm_label_add(popup); + if (!lbl) { + _ERR("Add Evas_Object failed."); + evas_object_del(popup); + return NULL; + } + + elm_object_style_set(lbl, MUSIC_STYLE_REMOVE_LABEL); + elm_object_text_set(lbl, _(msg)); + elm_object_content_set(popup, lbl); + + yesbtn = elm_button_add(popup); + if (!yesbtn) { + _ERR("Add Evas_Object failed."); + evas_object_del(popup); + return NULL; + } + + elm_object_text_set(yesbtn, _(MUSIC_TEXT_REMOVE)); + elm_object_part_content_set(popup, MUSIC_PART_RPOPUP_BTN1, yesbtn); + evas_object_smart_callback_add(yesbtn, MUSIC_SIGNAL_CLICKED, + _remove_cb, dt); + + nobtn = elm_button_add(popup); + if (!nobtn) { + _ERR("Add Evas_Object failed."); + evas_object_del(popup); + return NULL; + } + + elm_object_text_set(nobtn, _(MUSIC_TEXT_CANCEL)); + elm_object_part_content_set(popup, MUSIC_PART_RPOPUP_BTN2, nobtn); + evas_object_smart_callback_add(nobtn, MUSIC_SIGNAL_CLICKED, + _cancel_cb, dt); + elm_object_focus_set(nobtn, EINA_TRUE); + + return popup; + } + + void m_DestroyPopup(void) + { + if (!m->popup) + return; + + evas_object_del(m->popup); + m->popup = NULL; + } + + public: + CHandlerButton(SContextView *ins) : + IMouseMoveListener(this), + IMouseUpListener(this), + IKeyUpListener(this), + IFocusedListener(this), + IUnfocusedListener(this) { + m = ins; + } + + ~CHandlerButton() { + m_DestroyPopup(); + } + + void SetCallback(const SCallback* cb) { + m_callback = *cb; + } + + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) + { + if (!obj) + return; + + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); + } + + virtual void OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev) + { + m_HandleBtnSelected(id); + } + + virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) + { + if (strcmp(ev->keyname, KEY_ENTER)) + return; + + m_HandleBtnSelected(id); + } + + virtual void OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item) + { + if (!obj) + return; + + elm_object_signal_emit(obj, MUSIC_SIGNAL_FOCUSED, MUSIC_CONTEXT_VIEW); + } + + virtual void OnUnfocused(int id, Evas_Object *obj, Elm_Object_Item *item) + { + if (!obj) + return; + + elm_object_signal_emit(obj, MUSIC_SIGNAL_UNFOCUSED, MUSIC_CONTEXT_VIEW); + } + } *pHandlerButton; + + class CHandlerLayout : public CListenerMgr, + public IMouseMoveListener, public IMouseUpListener, public IKeyUpListener, + public IFocusedListener, public IUnfocusedListener { + protected: + SContextView *m; + + public: + CHandlerLayout(SContextView *ins) : + IMouseMoveListener(this), + IMouseUpListener(this), + IKeyUpListener(this), + IFocusedListener(this), + IUnfocusedListener(this) { + m = ins; + }; + + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) + { + if (!obj) + return; + + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); + } + + virtual void OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev) = 0; + virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) = 0; + + virtual void OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item) + { + if (!obj) + return; + + elm_object_signal_emit(obj, MUSIC_SIGNAL_FOCUSED, MUSIC_CONTEXT_VIEW); + } + + virtual void OnUnfocused(int id, Evas_Object *obj, Elm_Object_Item *item) + { + if (!obj) + return; + + elm_object_signal_emit(obj, MUSIC_SIGNAL_UNFOCUSED, MUSIC_CONTEXT_VIEW); + } + }; + + class CHandlerRelativeContentLayout : public CHandlerLayout { + public: + CHandlerRelativeContentLayout(SContextView *ins) : CHandlerLayout(ins) {} + + virtual void OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev) + { + if (!obj) + return; + + elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTENT_CLICKED, + MUSIC_CONTEXT_VIEW); + } + + virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) + { + if (!obj || !ev) + return; + + if (strcmp(ev->keyname, KEY_ENTER)) + return; + + elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTENT_CLICKED, + MUSIC_CONTEXT_VIEW); + } + }; + + Eina_List *listRltvCtntLayout; + + class CHandlerMoreInfoLayout : public CHandlerLayout { + private: + void m_HandleMoreinfoSelected(Evas_Object *obj) + { + SRltvCtnt *rctnt = NULL; + + if (!obj) + return; + + rctnt = (SRltvCtnt *)_GET_PRIV(obj); + if (!rctnt) + return; + + /* Using prints till actual APIs come from wiki and youtube */ + switch (m->type) { + case CONTEXT_TYPE_ALBUM: + _INFO("Album more info clicked %s", rctnt->link); + break; + + case CONTEXT_TYPE_ARTIST: + _INFO("Artist more info clicked %s", rctnt->link); + break; + + case CONTEXT_TYPE_GENRE: + _INFO("Genre more info clicked %s", rctnt->link); + break; + + default: + _ERR("Wrong content type for more info"); + } + } + + public: + CHandlerMoreInfoLayout(SContextView *ins) : CHandlerLayout(ins) {} + + virtual void OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev) + { + if (!obj) + return; + + m_HandleMoreinfoSelected(obj); + } + + virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) + { + if (!obj || !ev) + return; + + if (strcmp(ev->keyname, KEY_ENTER)) + return; + + m_HandleMoreinfoSelected(obj); + } + } *pHandlerMoreInfoLayout; + + SContextView() { + memset(this, 0, sizeof(SContextView)); + pHandlerButton = new CHandlerButton(this); + pHandlerMoreInfoLayout = new CHandlerMoreInfoLayout(this); + } + + ~SContextView() { + delete pHandlerButton; + delete pHandlerMoreInfoLayout; + } +}; + +/* Dummy content for testing. Actuals should come from youtube and wiki */ +char g_DummyRelContent1Title[] = "Rel Content 1"; +char g_DummyRelContent1Imgpath[] = ""; +char g_DummyRelContent1Link[] = "CONTENT1"; +char g_DummyRelContent2Title[] = "Rel Content 2"; +char g_DummyRelContent2Imgpath[] = ""; +char g_DummyRelContent2Link[] = "CONTENT2"; +char g_DummyRelContent3Title[] = "Rel Content 3"; +char g_DummyRelContent3Imgpath[] = ""; +char g_DummyRelContent3Link[] = "CONTENT3"; +char g_DummyRelContent4Title[] = "Rel Content 4"; +char g_DummyRelContent4Imgpath[] = ""; +char g_DummyRelContent4Link[] = "CONTENT4"; +char g_DummyRelContent5Title[] = "Rel Content 5"; +char g_DummyRelContent5Imgpath[] = ""; +char g_DummyRelContent5Link[] = "CONTENT5"; +char g_DummyRelContent6Title[] = "Rel Content 6"; +char g_DummyRelContent6Imgpath[] = ""; +char g_DummyRelContent6Link[] = "CONTENT6"; +char g_DummyRelContent7Title[] = "Rel Content 7"; +char g_DummyRelContent7Imgpath[] = ""; +char g_DummyRelContent7Link[] = "CONTENT7"; +char g_DummyRelContent8Title[] = "Rel Content 8"; +char g_DummyRelContent8Imgpath[] = ""; +char g_DummyRelContent8Link[] = "CONTENT8"; +char g_DummyRelContent9Title[] = "Rel Content 9"; +char g_DummyRelContent9Imgpath[] = ""; +char g_DummyRelContent9Link[] = "CONTENT9"; +char g_DummyRelContent10Title[] = "Rel Content 10"; +char g_DummyRelContent10Imgpath[] = ""; +char g_DummyRelContent10Link[] = "CONTENT10"; +char g_DummyRelSampleContentLink[] = "SAMPLE MOREINFO"; +SRltvCtnt SRltvCtnt_list[TOTAL_REL_CONTENTS]; +SRltvCtnt samplectnt; + + +void CContextView::sm_CbRltdCtntSelected(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + SRltvCtnt *rctnt = NULL; + + if (!obj || !data) + return; + + rctnt = (SRltvCtnt *)_GET_PRIV(obj); + if (!rctnt) + return; + + /* Using prints till actual APIs come from wiki and youtube */ + _INFO("Content Selected is:%s", rctnt->link); +} + + +void CContextView::sm_CbAddScroller(void *cookie, Evas_Object *base, Evas_Object **scroller) +{ + CContextView *root = (CContextView *)cookie; + if (root) + root->m_OnAddScroller(base, scroller); +} + + +void CContextView::m_OnAddScroller(Evas_Object *base, Evas_Object **scroller) +{ + Evas_Object *scr = m_AddScroller(base); + *scroller = scr; +} + + +Evas_Object *CContextView::m_AddScroller(Evas_Object *base) +{ + Evas_Object *scroller = NULL; + + if (!base) { + _ERR("Invalid argument."); + return NULL; + } + + scroller = elm_scroller_add(base); + if (!scroller) { + _ERR("elm_scroller_add failed."); + return NULL; + } + + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, 0.0); + + return scroller; +} + + +void CContextView::m_SetBtnDownFocus(Evas_Object *btn) +{ + if (!btn) + return; + + if (!m->moreinfo && !m->first_line[0]) { + elm_object_focus_next_object_set(btn, btn, + ELM_FOCUS_DOWN); + return; + } + + if (m->moreinfo) + elm_object_focus_next_object_set(btn, m->moreinfo, + ELM_FOCUS_DOWN); + else + elm_object_focus_next_object_set(btn, m->first_line[0], + ELM_FOCUS_DOWN); +} + + +void CContextView::m_SetLayoutFocusOrder(Evas_Object *btn) +{ + int i; + Evas_Object *obj = NULL; + + if (!btn) + return; + + if (m->moreinfo) { + elm_object_focus_next_object_set(m->moreinfo, btn, + ELM_FOCUS_UP); + elm_object_focus_next_object_set(m->moreinfo, + m->first_line[0], ELM_FOCUS_DOWN); + } + + for (i = 0; i < TABLE_MAX_COL; i++) { + if (!m->first_line[i]) + continue; + + obj = m->first_line[i]; + if (m->moreinfo) + elm_object_focus_next_object_set(obj, m->moreinfo, + ELM_FOCUS_UP); + else + elm_object_focus_next_object_set(obj, btn, + ELM_FOCUS_UP); + } +} + + +void CContextView::m_SetBtnsFocusOrder(Evas_Object *btn, Evas_Object *prv, + int btnTypeIndex, int btnTypeFirst, int btnTypeLast) +{ + if (!btn) + return; + + EBtnType idx = (EBtnType)btnTypeIndex; + EBtnType first = (EBtnType)btnTypeFirst; + + if (idx == first) + elm_object_focus_set(btn, EINA_TRUE); + + if (prv) { + elm_object_focus_next_object_set(prv, btn, + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(btn, prv, + ELM_FOCUS_LEFT); + } +} + + +bool CContextView::m_AddBtnLabel(Evas_Object *btn, const char *txt) +{ + Evas_Object *lbl = NULL; + char buf[MAX_LENGTH]; + + if (!btn || !txt) + return false; + + lbl = elm_label_add(btn); + if (!lbl) { + _ERR("elm_label_add failed."); + return false; + } + + snprintf(buf, sizeof(buf), + "" + "" + "%s" + "", FONT_STYLE_MEDIUM, _(txt)); + elm_object_text_set(lbl, buf); + elm_label_line_wrap_set(lbl, ELM_WRAP_WORD); + evas_object_size_hint_min_set(lbl, MIN_LABEL_WIDTH, 0); + elm_object_part_content_set(btn, MUSIC_PART_CTXT_BTNTEXT, lbl); + + return true; +} + + +bool CContextView::m_AddBtnIcon(Evas_Object *btn, const char *icon) +{ + Evas_Object *img = NULL; + char buf[MAX_LENGTH]; + + if (!btn || !icon) + return false; + + img = elm_image_add(btn); + if (!img) { + _ERR("elm_image_add failed."); + return false; + } + + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, icon); + elm_image_file_set(img, buf, NULL); + elm_object_part_content_set(btn, MUSIC_PART_CTXT_BTNICON, img); + + return true; +} + + +bool CContextView::m_AddBtnInfo(Evas_Object *btn, const char *icon, const char *txt) +{ + if (!btn || !icon || !txt) + return false; + + if (!m_AddBtnIcon(btn, icon)) + return false; + + if (!m_AddBtnLabel(btn, txt)) + return false; + + return true; +} + + +Evas_Object *CContextView::m_AddButton(Evas_Object *base) +{ + Evas_Object *btn = NULL; + + if (!base) + return NULL; + + btn = elm_layout_add(base); + if (!btn) { + _ERR("elm_layout_add failed."); + return NULL; + } + + evas_object_size_hint_weight_set(btn, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, 0.0, 0.5); + + elm_layout_file_set(btn, EDJEFILE, MUSIC_CONTEXT_BTN); + elm_object_focus_allow_set(btn, EINA_TRUE); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP); + + evas_object_show(btn); + + return btn; +} + + +Evas_Object *CContextView::m_AddBtnBox(Evas_Object *base) +{ + Evas_Object *box = NULL; + + if (!base) + return NULL; + + box = elm_box_add(base); + if (!box) { + _ERR(" elm_box_add failed "); + return NULL; + } + + elm_box_horizontal_set(box, EINA_TRUE); + elm_box_padding_set(box, MUSIC_CTXT_BTN_WPAD, 0); + elm_box_align_set(box, 0, 0.5); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + return box; +} + + +bool CContextView::m_CreateBtnsPart(void) +{ + Evas_Object *btn = NULL, *box = NULL, *prv = NULL, *firstbtn = NULL; + int i; + EBtnType first, last; + SBtnInfo btninfo[TOTAL_CONTEXT_BTNS]; + + btninfo[CTXBTN_PLAY].txt = MUSIC_TEXT_PLAY_THIS; + btninfo[CTXBTN_PLAY].icon = MUSIC_IMAGE_CTXT_BTNPLAY; + + btninfo[CTXBTN_NEXT].txt = MUSIC_TEXT_ADD_NEXT; + btninfo[CTXBTN_NEXT].icon = MUSIC_IMAGE_CTXT_BTNNEXT; + + btninfo[CTXBTN_LAST].txt = MUSIC_TEXT_ADD_LAST; + btninfo[CTXBTN_LAST].icon = MUSIC_IMAGE_CTXT_BTNLAST; + + btninfo[CTXBTN_ADDTO].txt = MUSIC_TEXT_ADD_TO_PLAYLIST; + btninfo[CTXBTN_ADDTO].icon = MUSIC_IMAGE_CTXT_ADDTO; + + btninfo[CTXBTN_PLAYSONG].txt = MUSIC_TEXT_PLAY; + btninfo[CTXBTN_PLAYSONG].icon = MUSIC_IMAGE_CTXT_BTNPLAY; + + btninfo[CTXBTN_DEL].txt = MUSIC_TEXT_DEL; + btninfo[CTXBTN_DEL].icon = MUSIC_IMAGE_CTXT_BTNDEL; + + btninfo[CTXBTN_RENAME].txt = MUSIC_TEXT_RENAME; + btninfo[CTXBTN_RENAME].icon = MUSIC_IMAGE_CTXT_RENAME; + + btninfo[CTXBTN_ADDSONG].txt = MUSIC_TEXT_ADDSONG; + btninfo[CTXBTN_ADDSONG].icon = MUSIC_IMAGE_CTXT_ADDSONG; + + btninfo[CTXBTN_REMOVESONG].txt = MUSIC_TEXT_REMOVESONG; + btninfo[CTXBTN_REMOVESONG].icon = MUSIC_IMAGE_CTXT_REMOVESONG; + + btninfo[CTXBTN_DELETE].txt = MUSIC_TEXT_DEL; + btninfo[CTXBTN_DELETE].icon = MUSIC_IMAGE_CTXT_BTNDEL; + + box = m_AddBtnBox(m->base); + if (!box) + return false; + + if (m->type == CONTEXT_TYPE_PLAYLIST) { + first = CTXBTN_RENAME; + last = CTXBTN_DELETE; + } + else if (m->type == CONTEXT_TYPE_PLAYSONG) { + first = CTXBTN_PLAYSONG; + last = CTXBTN_DEL; + if (m->ctxtinfo->status == PLAY_STATUS_PLAY) { + btninfo[CTXBTN_PLAYSONG].txt = MUSIC_TEXT_PAUSE; + btninfo[CTXBTN_PLAYSONG].icon = MUSIC_IMAGE_CTXT_BTNPAUSE; + } + } + else { + first = CTXBTN_PLAY; + last = CTXBTN_ADDTO; + } + + prv = NULL; + firstbtn = NULL; + for (i = first; i <= last; i++) { + btn = m_AddButton(box); + if (!btn) { + evas_object_del(box); + return false; + } + + m->pHandlerButton->Connect(btn, i); + + if (!m_AddBtnInfo(btn, btninfo[i].icon, btninfo[i].txt)) { + evas_object_del(box); + return false; + } + if (!firstbtn) + firstbtn = btn; + + m_SetBtnsFocusOrder(btn, prv, (EBtnType)i, first, last); + m_SetBtnDownFocus(btn); + + prv = btn; + elm_box_pack_end(box, btn); + + if (i == CTXBTN_PLAYSONG) + m->playbtn = btn; + } + m_SetLayoutFocusOrder(firstbtn); + + elm_object_focus_next_object_set(firstbtn, btn, + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(btn, firstbtn, + ELM_FOCUS_RIGHT); + + elm_object_part_content_set(m->base, MUSIC_PART_CTXT_BTNAREA, box); + + return true; +} + + +Eina_List *CContextView::m_OtherSongsOfArtist(char *artist, char *title) +{ + /*Dummy function. Actual should come from wiki and youtube*/ + Eina_List *list = NULL; + int i; + + SRltvCtnt_list[0].title = (char *)g_DummyRelContent1Title; + SRltvCtnt_list[0].imgpath = (char *)g_DummyRelContent1Imgpath; + SRltvCtnt_list[0].link = (char *)g_DummyRelContent1Link; + SRltvCtnt_list[1].title = (char *)g_DummyRelContent2Title; + SRltvCtnt_list[1].imgpath = (char *)g_DummyRelContent2Imgpath; + SRltvCtnt_list[1].link = (char *)g_DummyRelContent2Link; + SRltvCtnt_list[2].title = (char *)g_DummyRelContent3Title; + SRltvCtnt_list[2].imgpath = (char *)g_DummyRelContent3Imgpath; + SRltvCtnt_list[2].link = (char *)g_DummyRelContent3Link; + SRltvCtnt_list[3].title = (char *)g_DummyRelContent4Title; + SRltvCtnt_list[3].imgpath = (char *)g_DummyRelContent4Imgpath; + SRltvCtnt_list[3].link = (char *)g_DummyRelContent4Link; + SRltvCtnt_list[4].title = (char *)g_DummyRelContent5Title; + SRltvCtnt_list[4].imgpath = (char *)g_DummyRelContent5Imgpath; + SRltvCtnt_list[4].link = (char *)g_DummyRelContent5Link; + SRltvCtnt_list[5].title = (char *)g_DummyRelContent6Title; + SRltvCtnt_list[5].imgpath = (char *)g_DummyRelContent6Imgpath; + SRltvCtnt_list[5].link = (char *)g_DummyRelContent6Link; + SRltvCtnt_list[6].title = (char *)g_DummyRelContent7Title; + SRltvCtnt_list[6].imgpath = (char *)g_DummyRelContent7Imgpath; + SRltvCtnt_list[6].link = (char *)g_DummyRelContent7Link; + SRltvCtnt_list[7].title = (char *)g_DummyRelContent8Title; + SRltvCtnt_list[7].imgpath = (char *)g_DummyRelContent8Imgpath; + SRltvCtnt_list[7].link = (char *)g_DummyRelContent8Link; + SRltvCtnt_list[8].title = (char *)g_DummyRelContent9Title; + SRltvCtnt_list[8].imgpath = (char *)g_DummyRelContent9Imgpath; + SRltvCtnt_list[8].link = (char *)g_DummyRelContent9Link; + SRltvCtnt_list[9].title = (char *)g_DummyRelContent10Title; + SRltvCtnt_list[9].imgpath = (char *)g_DummyRelContent10Imgpath; + SRltvCtnt_list[9].link = (char *)g_DummyRelContent10Link; + + for (i = 0; i < TOTAL_REL_CONTENTS; i++) + list = eina_list_append(list, &SRltvCtnt_list[i]); + + return list; +} + + +Eina_List *CContextView::m_OtherAlbumsOfArtist(char *artist, char *album) +{ + /*Dummy function. Actual should come from wiki and youtube*/ + return m_OtherSongsOfArtist(artist, (char *)""); +} + + +Eina_List *CContextView::m_OtherSimilarArtist(char *artist) +{ + /*Dummy function. Actual should come from wiki and youtube*/ + return m_OtherSongsOfArtist(artist, (char *)""); +} + + +Eina_List *CContextView::m_OtherSongsOfGenre(char *genre) +{ + /*Dummy function. Actual should come from wiki and youtube*/ + return m_OtherSongsOfArtist(genre, (char *)""); +} + + +SRltvCtnt *CContextView::m_InfoOfAlbum(char *album) +{ + /*Dummy function. Actual should come from wiki and youtube*/ + samplectnt.title = NULL; + samplectnt.imgpath = NULL; + samplectnt.link = g_DummyRelSampleContentLink; + return &samplectnt; +} + + +SRltvCtnt *CContextView::m_InfoOfArtist(char *artist) +{ + /*Dummy function. Actual should come from wiki and youtube*/ + samplectnt.title = NULL; + samplectnt.imgpath = NULL; + samplectnt.link = g_DummyRelSampleContentLink; + return &samplectnt; +} + + +SRltvCtnt *CContextView::m_InfoOfGenre(char *genre) +{ + /*Dummy function. Actual should come from wiki and youtube*/ + samplectnt.title = NULL; + samplectnt.imgpath = NULL; + samplectnt.link = g_DummyRelSampleContentLink; + return &samplectnt; +} + + +bool CContextView::m_GetContextDetails(SContentInfo *cinfo, char **path, + char **title, char **subtitle, char **subtitle2, + char **rltvtitle, SRltvCtnt **ctntinfo, + Eina_List **rltvlist) +{ + char buf[MAX_LENGTH]; + Eina_List *alist = NULL, *l = NULL; + album_info *alinfo = NULL; + void *obj = NULL; + + if (!cinfo || !cinfo->context) + return false; + + switch (cinfo->type) { + case CONTEXT_TYPE_PLAYSONG: + *subtitle2 = song_info_get_album((SSongInfo *)cinfo->context); + case CONTEXT_TYPE_SONG: + *path = song_info_get_thumb((SSongInfo *)cinfo->context); + *title = song_info_get_title((SSongInfo *)cinfo->context); + *subtitle = song_info_get_artist((SSongInfo *)cinfo->context); + *rltvtitle = (char *)MUSIC_TEXT_SONG_RLTV; + *rltvlist = m_OtherSongsOfArtist(*subtitle, *title); + break; + + case CONTEXT_TYPE_ALBUM: + *path = album_info_get_thumb((album_info *)cinfo->context); + *title = album_info_get_name((album_info *)cinfo->context); + *subtitle = album_info_get_artist((album_info *)cinfo->context); + *rltvtitle = (char *)MUSIC_TEXT_ALBUM_RLTV; + *ctntinfo = m_InfoOfAlbum(*title); + *rltvlist = m_OtherAlbumsOfArtist(*subtitle, *title); + break; + + case CONTEXT_TYPE_ARTIST: + alist = category_info_get_albumlist((category_info *)cinfo->context); + EINA_LIST_FOREACH(alist, l, obj) { + alinfo = (album_info *)obj; + *path = album_info_get_thumb(alinfo); + if (*path) + break; + } + *title = (char *)category_info_get_name((category_info *)cinfo->context); + snprintf(buf, sizeof(buf), "%d %s", + category_info_get_songcount((category_info *)cinfo->context), + _(MUSIC_TEXT_SONGS)); + *subtitle = strdup(buf); + *rltvtitle = (char *)MUSIC_TEXT_ARTIST_RLTV; + *ctntinfo = m_InfoOfArtist(*title); + *rltvlist = m_OtherSimilarArtist(*title); + break; + + case CONTEXT_TYPE_GENRE: + alist = category_info_get_albumlist((category_info *)cinfo->context); + EINA_LIST_FOREACH(alist, l, obj) { + alinfo = (album_info *)obj; + *path = album_info_get_thumb(alinfo); + if (*path) + break; + } + *title = (char *)category_info_get_name((category_info *)cinfo->context); + snprintf(buf, sizeof(buf), "%d %s", + category_info_get_songcount((category_info *)cinfo->context), + _(MUSIC_TEXT_SONGS)); + *subtitle = strdup(buf); + *rltvtitle = (char *)MUSIC_TEXT_GENRE_RLTV; + *ctntinfo = m_InfoOfGenre(*title); + *rltvlist = m_OtherSongsOfGenre(*title); + break; + + case CONTEXT_TYPE_FOLDER: + snprintf(buf, sizeof(buf), "%d %s", + folder_info_get_count((folder_info *)cinfo->context), + _(MUSIC_TEXT_SONGS)); + *subtitle = strdup(buf); + *title = folder_info_get_name((folder_info *)cinfo->context); + break; + + case CONTEXT_TYPE_PLAYLIST: + snprintf(buf, sizeof(buf), "%d %s", + category_info_get_songcount((category_info *)cinfo->context), + _(MUSIC_TEXT_SONGS)); + *subtitle = strdup(buf); + *title = (char *)category_info_get_name((category_info *)cinfo->context); + *path = category_info_get_thumb((category_info *)cinfo->context); + break; + + default: + _ERR(" wrong context type "); + return false; + } + + return true; +} + + +Evas_Object *CContextView::m_AddRltvCtnt(Evas_Object *obj, char *name, char *icon) +{ + Evas_Object *ly = NULL, *img = NULL; + char buf[MAX_LENGTH]; + + if (!obj) { + _ERR("Invalid argument."); + return NULL; + } + + ly = elm_layout_add(obj); + if (!ly) { + _ERR("elm_layout_add failed."); + return NULL; + } + + elm_layout_file_set(ly, EDJEFILE, MUSIC_CONTEXT_REL_CONTENT); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + img = elm_image_add(ly); + if (!img) { + _ERR("elm_image_add failed."); + evas_object_del(ly); + return NULL; + } + + if (!icon || !strcmp(icon, MUSIC_STR_EMPTY)) { + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_DEFAULT_THUMB_126); + elm_image_file_set(img, buf, NULL); + elm_image_no_scale_set(img, EINA_TRUE); + } + else { + elm_image_file_set(img, icon, NULL); + elm_image_aspect_fixed_set(img, EINA_FALSE); + } + + elm_object_part_content_set(ly, MUSIC_PART_CTXT_RELCTNT_ICON, img); + elm_object_part_text_set(ly, MUSIC_PART_CTXT_RELCTNT_NAME, name); + elm_object_focus_allow_set(ly, EINA_TRUE); + + return ly; +} + + +bool CContextView::m_AddTableContents(Eina_List *list) +{ + int row, col; + Evas_Object *ly = NULL; + Eina_List *l = NULL; + SRltvCtnt *rctnt = NULL; + SContextView::CHandlerRelativeContentLayout *layoutHandler = NULL; + void *obj = NULL; + + if (!list) + return false; + + row = 0; + col = 0; + + EINA_LIST_FOREACH(list, l, obj) { + rctnt = (SRltvCtnt *)obj; + ly = m_AddRltvCtnt(m->table, rctnt->title, rctnt->imgpath); + if (!ly) + continue; + _SET_PRIV(ly, rctnt); + elm_table_pack(m->table, ly, col, row, 1, 1); + evas_object_show(ly); + + elm_object_signal_callback_add(ly, MUSIC_SIGNAL_BTN_CLICKED, + MUSIC_CONTEXT_VIEW, sm_CbRltdCtntSelected, m); + + layoutHandler = new SContextView::CHandlerRelativeContentLayout(m); + layoutHandler->Connect(ly); + m->listRltvCtntLayout = eina_list_append(m->listRltvCtntLayout, layoutHandler); + + if (row == 0) + m->first_line[col] = ly; + + if (col == 0) + elm_object_focus_next_object_set(ly, ly, + ELM_FOCUS_LEFT); + + if (col == TABLE_MAX_COL - 1) + elm_object_focus_next_object_set(ly, ly, + ELM_FOCUS_RIGHT); + + if (col >= 0 && col < TABLE_MAX_COL) + m->last_line[col] = ly; + + col++; + if (col >= TABLE_MAX_COL) { + row++; + col = 0; + } + } + + return true; +} + + +Evas_Object *CContextView::m_AddTable(Evas_Object *base) +{ + Evas_Object *table = NULL; + + if (!base) { + _ERR("Invalid argument."); + return NULL; + } + + table = elm_table_add(base); + if (!table) { + _ERR("elm_table_add failed."); + return NULL; + } + + elm_table_homogeneous_set(table, EINA_TRUE); + elm_table_padding_set(table, + MUSIC_CTXT_TABLE_WPAD * elm_config_scale_get(), + MUSIC_CTXT_TABLE_HPAD * elm_config_scale_get()); + evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(table); + + return table; +} + + +bool CContextView::m_CreateRltvContent(Eina_List *list) +{ + Evas_Object *scroller = NULL, *table = NULL; + int r; + + if (!list) { + _ERR("Invalid argument."); + return false; + } + + scroller = m_AddScroller(m->base); + if (!scroller) { + _ERR("m_AddScroller failed."); + return false; + } + + table = m_AddTable(scroller); + if (!table) { + _ERR("m_AddTable failed."); + evas_object_del(scroller); + return false; + } + + m->table = table; + + r = m_AddTableContents(list); + if (!r) { + _ERR("m_AddTableContents failed."); + evas_object_del(scroller); + return false; + } + + elm_object_content_set(scroller, table); + elm_object_part_content_set(m->base, MUSIC_PART_CTXT_RELCTNTAREA, + scroller); + + return true; +} + + +bool CContextView::m_CreateMoreinfoLayout(SRltvCtnt *rctnt, Evas_Object *img) +{ + Evas_Object *ly = NULL; + + if (!rctnt) + return false; + + ly = elm_layout_add(m->base); + if (!ly) + return false; + + evas_object_size_hint_weight_set(ly, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, 0.0, 0.5); + elm_layout_file_set(ly, EDJEFILE, MUSIC_CONTEXT_INFO); + elm_object_part_content_set(ly, MUSIC_PART_CTXT_INFOICON, img); + elm_object_part_text_set(ly, MUSIC_PART_CTXT_INFOTEXT, + _(MUSIC_TEXT_MOREINFO)); + elm_object_focus_allow_set(ly, EINA_TRUE); + _SET_PRIV(ly, rctnt); + + m->pHandlerMoreInfoLayout->Connect(ly); + + elm_object_focus_next_object_set(ly, ly, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(ly, ly, ELM_FOCUS_RIGHT); + + elm_object_part_content_set(m->base, MUSIC_PART_CTXT_INFO, ly); + + m->moreinfo = ly; + + return true; +} + + +bool CContextView::m_CreateInfoPart(void) +{ + SContentInfo *cinfo = NULL; + SRltvCtnt *ctntinfo = NULL; + Evas_Object *img = NULL, *icon = NULL; + char *title = NULL, *subtitle = NULL, *subtitle2 = NULL; + char *rltvtitle = NULL, *path = NULL; + char buf[MAX_LENGTH]; + Eina_List *rltvlist = NULL; + + cinfo = m->ctxtinfo; + path = NULL; + title = NULL; + subtitle = NULL; + subtitle2 = NULL; + rltvtitle = NULL; + rltvlist = NULL; + ctntinfo = NULL; + + if (!m_GetContextDetails(cinfo, &path, &title, &subtitle, &subtitle2, + &rltvtitle, &ctntinfo, &rltvlist)) + return false; + + img = elm_image_add(m->base); + if (!img) + return false; + + icon = elm_image_add(m->base); + if (!icon) + return false; + + if (!path) { + if (cinfo->type == CONTEXT_TYPE_FOLDER) + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_FOLDER); + else + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_DEFAULT_THUMB_180); + elm_image_file_set(img, buf, NULL); + elm_image_no_scale_set(img, EINA_TRUE); + elm_image_file_set(icon, buf, NULL); + } + else { + elm_image_file_set(img, path, NULL); + elm_image_aspect_fixed_set(img, EINA_FALSE); + elm_image_file_set(icon, path, NULL); + elm_image_aspect_fixed_set(icon, EINA_FALSE); + } + + elm_object_part_content_set(m->base, MUSIC_PART_CTXT_ICON, img); + elm_object_part_text_set(m->base, MUSIC_PART_CTXT_TITLE, title); + elm_object_part_text_set(m->base, MUSIC_PART_CTXT_SUBTITLE, subtitle); + elm_object_part_text_set(m->base, MUSIC_PART_CTXT_SUBTITLE2, + subtitle2); + elm_object_part_text_set(m->base, MUSIC_PART_CTXT_RELCTNTTEXT, + _(rltvtitle)); + + if (cinfo->type == CONTEXT_TYPE_ARTIST || cinfo->type == CONTEXT_TYPE_GENRE || + cinfo->type == CONTEXT_TYPE_FOLDER || + cinfo->type == CONTEXT_TYPE_PLAYLIST) + free(subtitle); + + if (rltvlist) + m_CreateRltvContent(rltvlist); + + if (ctntinfo) + m_CreateMoreinfoLayout(ctntinfo, icon); + else + elm_object_signal_emit(m->base, MUSIC_SIGNAL_HIDE, + MUSIC_CONTEXT_VIEW); + + return true; +} + + +bool CContextView::m_CreateFullView(void) +{ + if (!m_CreateInfoPart()) + return false; + + if (!m_CreateBtnsPart()) + return false; + + return true; +} + + +bool CContextView::Create(void *data) +{ + ASSERT(!m); + + Evas_Object *base; + Evas_Object *win; + CMusicController *mhandle; + SContentInfo *ctxtinfo; + CViewMgr *mgr = CViewMgr::GetInstance(); + + if (!mgr || !data) + return false; + + win = mgr->Window(); + if (!win) { + _ERR(" vimewmgr get win failed "); + return false; + } + + mhandle = CMusicController::GetInstance(); + if (!mhandle) { + _ERR(" music controller get music instance failed "); + return false; + } + + SParcel *parcel = (SParcel *)data; + ctxtinfo = parcel->ctxtInfo; + if (ctxtinfo->type < CONTEXT_TYPE_SONG || ctxtinfo->type > CONTEXT_TYPE_PLAYSONG + || !ctxtinfo->context) { + _ERR("Wrong context info"); + return false; + } + + m = new SContextView; + if (!m) { + _ERR(" calloc failed "); + return false; + } + + base = _add_base(win, MUSIC_CONTEXT_VIEW); + if (!base) { + _ERR(" add base failed "); + delete m; + m = NULL; + return false; + } + + bool r = CBaseView::Create(data); + if (!r) { + _ERR(" CBaseView Creation failed "); + evas_object_del(base); + delete m; + m = NULL; + return false; + } + + m->type = ctxtinfo->type; + m->vmgr = mgr; + m->win = win; + m->mhandle = mhandle; + m->base = base; + m->ctxtinfo = ctxtinfo; + m->parent = this; + m->listRltvCtntLayout = NULL; + + if (!m_CreateFullView()) { + _ERR(" create full failed "); + delete m; + evas_object_del(base); + return false; + } + + Connect(base); + + SContextView::CHandlerButton::SCallback cb; + cb.addScroller = &sm_CbAddScroller; + cb.cookie = this; + m->pHandlerButton->SetCallback(&cb); + + return true; +} + + +void CContextView::Destroy(void) +{ + ASSERT(m); + + if (m->idler) + ecore_idler_del(m->idler); + + if (m->listRltvCtntLayout) { + SContextView::CHandlerRelativeContentLayout *layoutHandler; + void *obj; + EINA_LIST_FREE(m->listRltvCtntLayout, obj) { + layoutHandler = (SContextView::CHandlerRelativeContentLayout *)obj; + delete layoutHandler; + } + } + + CBaseView::Destroy(); + evas_object_del(m->base); + + delete m; + m = NULL; +} + + +Evas_Object* CContextView::Base(void) +{ + ASSERT(m); + + return m->base; +} + + +void CContextView::t_OnShow(void) +{ + ASSERT(m); + + evas_object_show(m->base); +} + + +void CContextView::t_OnUpdate(void *data) +{ + ASSERT(m); + + if (!data) + return; + + SParcel *parcel = (SParcel *)data; + if (parcel->ctxtInfo != NULL) { + SContentInfo *ctxtinfo = parcel->ctxtInfo; + + m->type = ctxtinfo->type; + m->ctxtinfo = ctxtinfo; + + m_CreateFullView(); + } + else { + int update_type = parcel->updateType; + + if (update_type != E_SONG_UPDATE) + return; + + if (m->ctxtinfo->status == PLAY_STATUS_PLAY) { + m_AddBtnLabel(m->playbtn, MUSIC_TEXT_PAUSE); + m_AddBtnIcon(m->playbtn, MUSIC_IMAGE_CTXT_BTNPAUSE); + } + else { + m_AddBtnLabel(m->playbtn, MUSIC_TEXT_PLAY); + m_AddBtnIcon(m->playbtn, MUSIC_IMAGE_CTXT_BTNPLAY); + } + } +} + + +void CContextView::t_OnHide(void) +{ + ASSERT(m); + + evas_object_hide(m->base); +} + + +void CContextView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) +{ + if (!strcmp(ev->keyname, KEY_BACK)) { + if (m->ctxtinfo && m->ctxtinfo->close) + m->ctxtinfo->close(m->ctxtinfo->cbdata); + } + else if (!strcmp(ev->keyname, KEY_EXIT)) + elm_exit(); +} diff --git a/src/views/entry-popup.cpp b/src/views/entry-popup.cpp new file mode 100644 index 0000000..a222f58 --- /dev/null +++ b/src/views/entry-popup.cpp @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "i18n.h" +#include "define.h" +#include "common.h" +#include "common-ui.h" +#include "entry-popup.h" + +//#define KEY_SELECT "Select" +#define KEY_POPUP_ENTER "Return" + +struct entrypopup_data { + Evas_Object *layout; + Evas_Object *entry; + void (*entryname_cb)(void *, const char *); + void *data; + Ecore_Idler *idler; +}; + +static void _entry_key_pressed(void *dt, Evas *e, Evas_Object *obj, void *ei) +{ + struct entrypopup_data *epd; + Evas_Event_Key_Down *ev; + const char *str; + + if (!obj || !e || !ei || !dt) + return; + + epd = (entrypopup_data *)dt; + ev = (Evas_Event_Key_Down *)ei; + + if (!ev->keyname) + return; + + if (strcmp(ev->keyname, KEY_BACK) == 0) + destroy_entry_popup(epd->layout); + // Keyname should be checked!!! + else if (strcmp(ev->keyname, KEY_POPUP_ENTER/*KEY_SELECT*/) == 0) { + str = elm_entry_entry_get(obj); + if (epd->entryname_cb && str) + epd->entryname_cb(epd->data, str); + } +} + +static Eina_Bool _focus_idler_cb(void *dt) +{ + struct entrypopup_data *epd; + + if (!dt) + return ECORE_CALLBACK_CANCEL; + + epd = (entrypopup_data *)dt; + epd->idler = NULL; + elm_object_focus_set(epd->entry, EINA_TRUE); + + return ECORE_CALLBACK_CANCEL; +} + +void destroy_entry_popup(Evas_Object *layout) +{ + struct entrypopup_data *epd; + + if (!layout) + return; + + epd = (entrypopup_data *)evas_object_data_get(layout, MUSIC_ENTRY_POPUP_DATA); + if (epd) { + if (epd->idler) + ecore_idler_del(epd->idler); + free(epd); + } + + evas_object_del(layout); +} + +Evas_Object *create_entry_popup(Evas_Object *base, const char *text, + void (*entryname_cb)(void *, const char *), void *data) +{ + Evas_Object *layout, *entry; + struct entrypopup_data *epd; + + if (!base) + return NULL; + + layout = elm_layout_add(base); + if (!layout) + return NULL; + + elm_layout_file_set(layout, EDJEFILE, MUSIC_ENTRY_POPUP_LAYOUT); + evas_object_size_hint_weight_set(layout, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(layout, + EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(layout); + + entry = elm_entry_add(layout); + if (!entry) { + evas_object_del(layout); + return NULL; + } + + elm_object_style_set(entry, MUSIC_STYLE_ENTRY); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_input_panel_language_set(entry, + ELM_INPUT_PANEL_LANG_ALPHABET); + evas_object_size_hint_weight_set(entry, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, + EVAS_HINT_FILL, EVAS_HINT_FILL); + + if (text) + elm_entry_entry_set(entry, text); + elm_entry_cursor_end_set(entry); + elm_object_part_content_set(layout, MUSIC_PART_ENTRY, entry); + + epd = (entrypopup_data *)calloc(1, sizeof(*epd)); + if (!epd) { + evas_object_del(layout); + return NULL; + } + + epd->layout = layout; + epd->entry = entry; + epd->entryname_cb = entryname_cb; + epd->data = data; + epd->idler = ecore_idler_add(_focus_idler_cb, epd); + + evas_object_event_callback_add(entry, EVAS_CALLBACK_KEY_DOWN, + _entry_key_pressed, epd); + evas_object_data_set(layout, MUSIC_ENTRY_POPUP_DATA, epd); + + return layout; +} diff --git a/src/views/folder-layout.cpp b/src/views/folder-layout.cpp new file mode 100644 index 0000000..e350d0c --- /dev/null +++ b/src/views/folder-layout.cpp @@ -0,0 +1,1071 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "AppCommon.h" +#include "dbg.h" +#include "i18n.h" +#include "define.h" +#include "folder_info.h" +#include "song_info.h" + +#include +#include "music-controller.h" +#include "LayoutMgr.h" +#include "common.h" +#include "common-ui.h" +#include "BaseView.h" +#include "ExtBaseLayout.h" +#include "ViewMgr.h" +#include "folder-layout.h" +#include "base-view.h" + +#define TOTAL_ADD_BTNS 3 +#define GENGRID_ITEM_SIZE_W (263+20) +#define GENGRID_ITEM_SIZE_H (359+20) + +struct SFolderItemInfo { + folder_info *finfo; + SSongInfo *sinfo; + Elm_Object_Item *item; + int depth; +}; + +const char *g_sourceTexts[] = { + N_("All Source"), // SOURCE_TYPE_ALL + N_("TV"), // SOURCE_TYPE_TV + N_("USB") // SOURCE_TYPE_USB +}; + +enum EBtnType { + ABTN_PLAY, + ABTN_NEXT, + ABTN_LAST +}; + +enum EDepthType { + E_DEPTH_NONE, + E_DEPTH_FOLDER, + E_DEPTH_SONG +}; + +struct SBtnInfo { + const char *name; + const char *part; + const char *style; + const char *icon; +}; + +struct SFolderLayout { + Evas_Object *win; + Evas_Object *base; + Evas_Object *grid; + Elm_Object_Item *focused_item; + Eina_List *flist; + Eina_List *slist; + Eina_List *it_infolist; + Elm_Gengrid_Item_Class *item_class; + Elm_Gengrid_Item_Class *songitem_class; + Ecore_Idler *focus_idler; + CMusicController *mhandle; + CLayoutMgr *lmgr; + CViewMgr *vmgr; + folder_info *c_finfo; + SSongInfo *c_sinfo; + SContentInfo *ctxtinfo; + CFolderLayout *parent; + int depth; + + class CHandlerButton : public CListenerMgr, public IMouseMoveListener, public IMouseClickedListener { + public: + struct SCallback { + void(*gotoPlayBackView)(void* cookie, int mode, char *mediaId); + void* cookie; + }; + + private: + SFolderLayout *m; + + protected: + SCallback m_callback; + + public: + CHandlerButton(SFolderLayout *ins) : + IMouseMoveListener(this), + IMouseClickedListener(this) { + m = ins; + } + + void SetCallback(const SCallback* cb) { + m_callback = *cb; + } + + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) + { + if (!obj) + return; + + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); + } + + virtual void OnMouseClicked(int id, Evas_Object *obj) + { + EBtnType type = (EBtnType)id; + + switch (type) + { + case ABTN_PLAY: + if (m_callback.gotoPlayBackView) + m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_FRESH, NULL); + break; + + case ABTN_NEXT: + if (m_callback.gotoPlayBackView) + m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_NEXT, NULL); + break; + + case ABTN_LAST: + if (m_callback.gotoPlayBackView) + m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_END, NULL); + break; + + default: + _ERR("Invalid Button Type"); + ASSERT(0); + break; + } + } + } *pHandlerButton; + + class CHandlerGrid : public CListenerMgr, public IMouseMoveListener, public IKeyDownListener, public IRealizedListener, public IUnrealizedListener { + public: + struct SCallback { + void(*goToPlaybackView)(void *cookie, int mode, char *mediaId); + void(*goToContextView)(void *cookie, SContentInfo *contextInfo); + void(*updateGrid)(void *cookie); + void* cookie; + }; + + private: + SFolderLayout *m; + SCallback m_callback; + + private: + SFolderItemInfo *m_FindItemInfo(Eina_List *list, Elm_Object_Item *item) + { + Eina_List *l = NULL; + SFolderItemInfo *itinfo = NULL; + void *obj = NULL; + + if (!list || !item) + return NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SFolderItemInfo *)obj; + if (itinfo->item == item) + return itinfo; + } + + return NULL; + } + + static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) + { + CHandlerGrid *root = (CHandlerGrid *)dt; + if (root) { + root->m_OnCtxtUpdate(type, lid); + } + } + + void m_OnCtxtUpdate(EActionType type, int lid) + { + Eina_List *list = NULL; + SSongInfo *sinfo = NULL; + EAddType mode; + + if (!m->ctxtinfo || !m->ctxtinfo->context) + return; + + if (type == ACTION_TYPE_ADDNEXT) + mode = ADD_TYPE_NEXT; + else + mode = ADD_TYPE_END; + + if (m->depth == E_DEPTH_SONG) { + sinfo = (SSongInfo *)m->ctxtinfo->context; + list = eina_list_append(list, sinfo); + } + else { + m->mhandle->MediaGetList(LIST_TYPE_FOLDER_SONG, + m->ctxtinfo->context, &list); + sinfo = (SSongInfo *)eina_list_data_get(list); + } + + if (type == ACTION_TYPE_ADDTO) { + if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) + _ERR(" Adding songs to playlist failed "); + else + _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); + + return; + } + + m->mhandle->UpdatePlaylist(list, mode); + eina_list_free(list); + + if (type == ACTION_TYPE_PLAY) { + m->mhandle->Stop(); + m->mhandle->SetCurrentSong(song_info_get_media_id(sinfo)); + } + + _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); + } + + static void sm_CbCtxtClose(void *dt) + { + CHandlerGrid *root = (CHandlerGrid *)dt; + if (root) + root->m_OnCtxtClose(); + } + + void m_OnCtxtClose(void) + { + m->vmgr->PopView(); + m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); + elm_object_item_focus_set(m->focused_item, EINA_TRUE); + } + + static void sm_CbItemSelect(void *data, Elm_Object_Item *it, const char *emission, const char *source) + { + CHandlerGrid *root = (CHandlerGrid *)data; + if (root) + root->m_OnItemSelect(it, emission, source); + } + + void m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source) + { + SFolderItemInfo *itinfo = NULL; + char *id = NULL; + + if (!m) + return; + + itinfo = m_FindItemInfo(m->it_infolist, it); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + if (m->depth == E_DEPTH_SONG) { + if (m->c_sinfo) { + song_info_destroy(m->c_sinfo); + m->c_sinfo = NULL; + } + m->c_sinfo = song_info_duplicate(itinfo->sinfo); + } + else { + if (m->c_finfo) { + folder_info_destroy(m->c_finfo); + m->c_finfo = NULL; + } + m->c_finfo = folder_info_duplicate(itinfo->finfo); + } + + if (m->depth == E_DEPTH_SONG) { + id = song_info_get_media_id(m->c_sinfo); + elm_gengrid_item_selected_set(it, EINA_FALSE); + // Goto Playback View with id + if (m_callback.goToPlaybackView) + m_callback.goToPlaybackView(m_callback.cookie, ADD_TYPE_FRESH, id); + } + else { + m->depth = E_DEPTH_SONG; + // Update folder grid and add idler + if (m_callback.updateGrid) + m_callback.updateGrid(m_callback.cookie); + } + } + + public: + CHandlerGrid(SFolderLayout *ins) : + IMouseMoveListener(this), + IKeyDownListener(this), + IRealizedListener(this), + IUnrealizedListener(this) { + m = ins; + } + + void SetCallback(const SCallback* cb) + { + m_callback = *cb; + } + + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) + { + Elm_Object_Item *item; + + item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL, NULL); + if (!item) + return; + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); + } + + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) + { + Elm_Object_Item *it = NULL; + SContentInfo *ctxtinfo = NULL; + SFolderItemInfo *itinfo = NULL; + + if (!obj) + return; + + if (strcmp(ev->keyname, KEY_MENU)) + return; + + it = elm_object_focused_item_get(obj); + if (!it) { + _ERR(" unable to get focused item "); + return; + } + m->focused_item = it; + + if (m->ctxtinfo) { + free(m->ctxtinfo); + m->ctxtinfo = NULL; + } + + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; + + itinfo = m_FindItemInfo(m->it_infolist, it); + if (!itinfo) { + free(ctxtinfo); + return; + } + + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + if (m->depth == E_DEPTH_SONG) { + ctxtinfo->type = CONTEXT_TYPE_SONG; + ctxtinfo->context = itinfo->sinfo; + } + else { + ctxtinfo->type = CONTEXT_TYPE_FOLDER; + ctxtinfo->context = itinfo->finfo; + } + + m->ctxtinfo = ctxtinfo; + + // Go to the context view with ctxtinfo + if (m_callback.goToContextView) + m_callback.goToContextView(m_callback.cookie, ctxtinfo); + } + + virtual void OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item) + { + elm_object_item_signal_callback_add(item, + MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, + sm_CbItemSelect, this); + } + + virtual void OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item) + { + elm_object_item_signal_callback_del((Elm_Object_Item *)item, + MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, + sm_CbItemSelect); + } + } *pHandlerGrid; + + SFolderLayout() { + memset(this, 0, sizeof(SFolderLayout)); + pHandlerGrid = new CHandlerGrid(this); + pHandlerButton = new CHandlerButton(this); + } + + ~SFolderLayout() { + delete pHandlerGrid; + delete pHandlerButton; + } +}; + + +char *CFolderLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part) +{ + SFolderItemInfo *itinfo = (SFolderItemInfo *)data; + folder_info *finfo = NULL; + char *txt = NULL; + char buf[MAX_LENGTH]; + int count; + + if (!itinfo || !obj) + return NULL; + + finfo = itinfo->finfo; + + if (!strcmp(part, "elm.text")) { + txt = folder_info_get_name(finfo); + if (txt) + return strdup(txt); + } + else if (!strcmp(part, "elm.text1")) { + count = folder_info_get_count(finfo); + snprintf(buf, sizeof(buf), "%d Songs", count); + return strdup(buf); + } + + return NULL; +} + + +char *CFolderLayout::sm_CbGetGridSongItemText(void *data, Evas_Object *obj, const char *part) +{ + SFolderItemInfo *itinfo = (SFolderItemInfo *)data; + SSongInfo *sinfo = NULL; + char *txt = NULL; + + if (!itinfo || !obj) + return NULL; + + sinfo = itinfo->sinfo; + + if (!strcmp(part, "elm.text")) + txt = song_info_get_title(sinfo); + else if (!strcmp(part, "elm.text1")) + txt = song_info_get_artist(sinfo); + + if (txt) + return strdup(txt); + + return NULL; +} + + +Evas_Object *CFolderLayout::sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part) +{ + Evas_Object *img = NULL; + char buf[MAX_LENGTH]; + + if (!data || !obj) + return NULL; + + if (!strcmp(part, "elm.swallow.icon")) { + img = elm_image_add(obj); + if (!img) + return NULL; + + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_FOLDER); + elm_image_file_set(img, buf, "NULL"); + elm_image_no_scale_set(img, EINA_TRUE); + return img; + } + + return NULL; +} + + +Evas_Object *CFolderLayout::sm_CbGetGridSongItemContent(void *data, Evas_Object *obj, const char *part) +{ + SSongInfo *sinfo = NULL; + SFolderItemInfo *itinfo = NULL; + char *path = NULL; + Evas_Object *img = NULL; + char buf[MAX_LENGTH]; + + if (!data || !obj) + return NULL; + + itinfo = (SFolderItemInfo *)data; + sinfo = itinfo->sinfo; + + if (!strcmp(part, "elm.swallow.icon")) { + img = elm_image_add(obj); + if (!img) + return NULL; + + path = song_info_get_thumb(sinfo); + if (!path) { + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_DEFAULT_THUMB_126); + elm_image_file_set(img, buf, NULL); + elm_image_no_scale_set(img, EINA_TRUE); + } + else { + elm_image_file_set(img, path, NULL); + elm_image_aspect_fixed_set(img, EINA_FALSE); + } + return img; + } + return NULL; +} + + +void CFolderLayout::sm_CbRemoveGridItem(void *data, Evas_Object *obj) +{ + free(data); +} + + +Eina_Bool CFolderLayout::sm_CbFocusIdler(void *dt) +{ + CFolderLayout *root = (CFolderLayout *)dt; + + if (root) + root->m_OnFocusIdler(); + + return ECORE_CALLBACK_CANCEL; +} + + +void CFolderLayout::m_OnFocusIdler(void) +{ + Elm_Object_Item *it = NULL; + + m->focus_idler = NULL; + + if (m->depth == E_DEPTH_SONG) { + it = elm_gengrid_first_item_get(m->grid); + elm_object_item_focus_set(it, EINA_TRUE); + } + else { + it = m_FindItemByInfo(m->it_infolist, m->c_finfo); + if (it) { + elm_gengrid_item_show(it, ELM_GENGRID_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(it, EINA_TRUE); + } + } +} + + +void CFolderLayout::sm_CbGoToContextView(void *cookie, SContentInfo *contextInfo) +{ + CFolderLayout *root = (CFolderLayout *)cookie; + if (root) + root->m_OnGotoContextView(contextInfo); +} + + +void CFolderLayout::m_OnGotoContextView(SContentInfo *contextInfo) +{ + SParcel parcel; + parcel.ctxtInfo = contextInfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); +} + + +void CFolderLayout::sm_CbUpdateGrid(void *cookie) +{ + CFolderLayout *root = (CFolderLayout *)cookie; + if (root) + root->m_OnCbUpdateGrid(); +} + + +void CFolderLayout::m_OnCbUpdateGrid(void) +{ + m_UpdateFolderGrid(false); + m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this); +} + + +void CFolderLayout::sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId) +{ + CFolderLayout *root = (CFolderLayout *)cookie; + if (root) + root->m_GotoPlayback(mode, mediaId); +} + + +int CFolderLayout::m_ConvertToMin(int milsec) +{ + int min; + min = milsec / 60000; /*milli seconds per minute*/ + + return min; +} + + +void CFolderLayout::m_RemoveFocusIdler(void) +{ + if (!m->focus_idler) + return; + + ecore_idler_del(m->focus_idler); + m->focus_idler = NULL; +} + + +void CFolderLayout::m_GotoPlayback(int mode, char *id) +{ + Eina_List *list = NULL; + Eina_List *l = NULL; + SFolderItemInfo *itinfo = NULL; + void *obj = NULL; + bool r; + + if (!m->it_infolist || eina_list_count(m->it_infolist) == 0) + return; + + if (m->depth == E_DEPTH_SONG) { + EINA_LIST_FOREACH(m->it_infolist, l, obj) { + itinfo = (SFolderItemInfo *)obj; + list = eina_list_append(list, itinfo->sinfo); + } + } + else { + r = m->mhandle->MediaGetList(LIST_TYPE_SONG, NULL, &list); + if (r == false || eina_list_count(list) == 0) + return; + } + + m->mhandle->UpdatePlaylist(list, mode); + eina_list_free(list); + + if (mode == ADD_TYPE_FRESH) { + m->mhandle->Stop(); + if (id) /* If want to play selected song */ + m->mhandle->SetCurrentSong(id); + } + + _update_playback_view((EAddType)mode, CExtBaseLayout::Layout(), NULL); +} + + +Elm_Object_Item *CFolderLayout::m_FindItemByInfo(Eina_List *list, folder_info *finfo) +{ + Eina_List *l = NULL; + SFolderItemInfo *itinfo = NULL; + void *obj = NULL; + char *id = NULL; + + if (!list || !finfo) + return NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SFolderItemInfo *)obj; + id = folder_info_get_folder_id(itinfo->finfo); + if (!strcmp(id, folder_info_get_folder_id(finfo))) + return itinfo->item; + } + + return NULL; +} + + +void CFolderLayout::m_SortFolderGrid(void) +{ + int sort_type; + int(*_sortfolders[])(const void *d1, const void *d2) = { + sortfolders_az, + sortfolders_za + }; + int(*_sortsongs[])(const void *d1, const void *d2) = { + sortsongs_title_az, + sortsongs_title_za + }; + + if (!m->flist) + return; + + sort_type = m->mhandle->SortType(); + + if (m->depth == E_DEPTH_SONG) + m->flist = eina_list_sort(m->flist, 0, + _sortsongs[sort_type]); + else + m->flist = eina_list_sort(m->flist, 0, + _sortfolders[sort_type]); +} + + +void CFolderLayout::m_CreateFolderGrid(void) +{ + Evas_Object *grid = NULL; + Elm_Gengrid_Item_Class *grid_item = NULL; + + grid = elm_gengrid_add(Layout()); + if (!grid) + return; + evas_object_size_hint_weight_set(grid, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_gengrid_align_set(grid, 0, 0); + elm_object_part_content_set(Layout(), MUSIC_PART_FOLDER_GRID, grid); + m->pHandlerGrid->Connect(grid); + elm_gengrid_item_size_set(grid, + elm_config_scale_get() * GENGRID_ITEM_SIZE_W, + elm_config_scale_get() * GENGRID_ITEM_SIZE_H); + m->grid = grid; + + grid_item = elm_gengrid_item_class_new(); + if (!grid_item) { + evas_object_del(grid); + _ERR(" elm_genlist_item_class_new failed "); + return; + } + grid_item->item_style = MUSIC_STYLE_FOLDER_GRID; + grid_item->func.text_get = sm_CbGetGridItemText; + grid_item->func.content_get = sm_CbGetGridItemContent; + grid_item->func.state_get = NULL; + grid_item->func.del = sm_CbRemoveGridItem; + m->item_class = grid_item; + + grid_item = elm_gengrid_item_class_new(); + if (!grid_item) { + elm_gengrid_item_class_free(m->item_class); + m->item_class = NULL; + evas_object_del(grid); + _ERR(" elm_genlist_item_class_new failed "); + return; + } + grid_item->item_style = MUSIC_STYLE_FOLDER_GRID; + grid_item->func.text_get = sm_CbGetGridSongItemText; + grid_item->func.content_get = sm_CbGetGridSongItemContent; + grid_item->func.state_get = NULL; + grid_item->func.del = sm_CbRemoveGridItem; + m->songitem_class = grid_item; + + m_UpdateFolderGrid(false); +} + + +void CFolderLayout::m_EmptyFolderGrid(bool sort_flag) +{ + if (m->grid) + elm_gengrid_clear(m->grid); + + if (!sort_flag) { + eina_list_free(m->flist); + m->flist = NULL; + } + + eina_list_free(m->it_infolist); + m->it_infolist = NULL; +} + + +void CFolderLayout::m_UpdateFolderGrid(bool sort_flag) +{ + bool r; + int ts, td, dur; + folder_info *finfo = NULL; + SSongInfo *sinfo = NULL; + void *obj = NULL; + Eina_List *l = NULL; + struct SFolderItemInfo *itinfo = NULL; + Elm_Object_Item *item = NULL; + char buf[MAX_LENGTH]; + int source_type; + + if (!m->grid || !m->item_class) + return; + + /* Remove existing foldergrid and prepare afresh */ + m_EmptyFolderGrid(sort_flag); + + if (!sort_flag) { + if (m->depth == E_DEPTH_SONG) { + r = m->mhandle->MediaGetList(LIST_TYPE_FOLDER_SONG, m->c_finfo, &(m->flist)); + if (r == false || + eina_list_count(m->flist) == 0) { + _ERR(" Fetching folder list failed "); + return; + } + } + else { + r = m->mhandle->MediaGetList(LIST_TYPE_FOLDER, + NULL, &(m->flist)); + if (r == false || + eina_list_count(m->flist) == 0) { + _ERR(" Fetching folder list failed "); + SetEmptyStatus(true); + return; + } + } + } + + m_SortFolderGrid(); + + ts = 0; + td = 0; + if (m->depth == E_DEPTH_SONG) { + EINA_LIST_FOREACH(m->flist, l, obj) { + sinfo = (SSongInfo *)obj; + itinfo = (SFolderItemInfo *)calloc(1, sizeof(*itinfo)); + if (!itinfo) + return; + itinfo->sinfo = sinfo; + item = elm_gengrid_item_append(m->grid, + m->songitem_class, itinfo, + NULL, m); + itinfo->item = item; + m->it_infolist = eina_list_append(m->it_infolist, + itinfo); + elm_object_part_text_set(Layout(), + MUSIC_PART_FOLDER_NAME, + folder_info_get_name(m->c_finfo)); + ts = ts + 1; + song_info_get_duration(sinfo, &dur); + td = td + dur; + } + } + else { + EINA_LIST_FOREACH(m->flist, l, obj) { + finfo = (folder_info *)obj; + itinfo = (SFolderItemInfo *)calloc(1, sizeof(*itinfo)); + if (!itinfo) + return; + itinfo->finfo = finfo; + item = elm_gengrid_item_append(m->grid, m->item_class, + itinfo, NULL, NULL); + itinfo->item = item; + m->it_infolist = eina_list_append(m->it_infolist, + itinfo); + source_type = m->mhandle->SourceType(); + elm_object_part_text_set(Layout(), + MUSIC_PART_FOLDER_NAME, + _(g_sourceTexts[source_type])); + ts = ts + folder_info_get_count(finfo); + td = td + folder_info_get_duration(finfo); + } + } + snprintf(buf, sizeof(buf), "%d", ts); + elm_object_part_text_set(Layout(), MUSIC_PART_FOLDER_SONGCOUNT, buf); + + snprintf(buf, sizeof(buf), "%d %s", m_ConvertToMin(td), + _(MUSIC_TEXT_MIN)); + elm_object_part_text_set(Layout(), MUSIC_PART_FOLDER_TIME, buf); +} + + +void CFolderLayout::m_CreateTopsection(void) +{ + int i; + Evas_Object *btn; + char buf[MAX_LENGTH]; + Evas_Object *img; + SBtnInfo btninfo[TOTAL_ADD_BTNS]; + + btninfo[ABTN_PLAY].name = MUSIC_STR_PLAY; + btninfo[ABTN_PLAY].part = MUSIC_PART_FOLDER_PLAYBTN; + btninfo[ABTN_PLAY].style = MUSIC_STYLE_ADD_PLAY_BTN; + btninfo[ABTN_PLAY].icon = MUSIC_IMAGE_ADD_PLAY; + + btninfo[ABTN_NEXT].name = MUSIC_STR_ADDNEXT; + btninfo[ABTN_NEXT].part = MUSIC_PART_FOLDER_NEXTBTN; + btninfo[ABTN_NEXT].style = MUSIC_STYLE_ADD_NEXT_BTN; + btninfo[ABTN_NEXT].icon = MUSIC_IMAGE_ADD_NEXT; + + btninfo[ABTN_LAST].name = MUSIC_STR_ADDLAST; + btninfo[ABTN_LAST].part = MUSIC_PART_FOLDER_LASTBTN; + btninfo[ABTN_LAST].style = MUSIC_STYLE_ADD_LAST_BTN; + btninfo[ABTN_LAST].icon = MUSIC_IMAGE_ADD_LAST; + + for (i = 0; i < TOTAL_ADD_BTNS; i++) { + btn = elm_button_add(Layout()); + if (!btn) + continue; + + evas_object_size_hint_weight_set(btn, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(btn, _(btninfo[i].name)); + elm_object_style_set(btn, btninfo[i].style); + + m->pHandlerButton->Connect(btn, i); + + img = elm_image_add(btn); + if (img) { + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + btninfo[i].icon); + elm_image_file_set(img, buf, NULL); + elm_object_part_content_set(btn, + MUSIC_PART_ELM_SWALLOWICON, img); + } + + elm_object_part_content_set(Layout(), btninfo[i].part, + btn); + } +} + + +bool CFolderLayout::Create(CLayoutMgr *mgr) +{ + ASSERT(!m); + + Evas_Object *base = NULL; + Evas_Object *win = NULL; + Evas_Object *layout = NULL; + CMusicController *mhandle = NULL; + CViewMgr *vmgr = NULL; + + if (!mgr) + return false; + + m = new SFolderLayout; + if (!m) { + _ERR(" calloc failed "); + return false; + } + + vmgr = CViewMgr::GetInstance(); + if (!vmgr) { + _ERR(" get view mgr failed "); + delete m; + m = NULL; + return false; + } + + base = mgr->Base(); + if (!base) { + _ERR(" get base failed "); + delete m; + m = NULL; + return false; + } + + win = vmgr->Window(); + if (!win) { + _ERR(" vimewmgr get win failed "); + delete m; + return false; + } + + mhandle = CMusicController::GetInstance(); + if (!mhandle) { + _ERR(" music controller get music instance failed "); + delete m; + m = NULL; + return false; + } + + layout = _add_base(base, MUSIC_FOLDER_LAYOUT); + if (!layout) { + _ERR(" get layout failed "); + delete m; + return false; + } + + bool r = CExtBaseLayout::Create(layout); + if (!r) { + _ERR(" CBaseLayout creation failed "); + evas_object_del(layout); + delete m; + m = NULL; + return false; + } + + m->win = win; + m->base = base; + m->vmgr = vmgr; + m->mhandle = mhandle; + m->lmgr = mgr; + m->depth = E_DEPTH_FOLDER; + m->parent = this; + + m_CreateTopsection(); + m_CreateFolderGrid(); + + Connect(layout); + + SFolderLayout::CHandlerGrid::SCallback cb; + cb.goToPlaybackView = &sm_CbGoToPlaybackView; + cb.goToContextView = &sm_CbGoToContextView; + cb.updateGrid = &sm_CbUpdateGrid; + cb.cookie = this; + m->pHandlerGrid->SetCallback(&cb); + + SFolderLayout::CHandlerButton::SCallback btnCb; + btnCb.gotoPlayBackView = &sm_CbGoToPlaybackView; + btnCb.cookie = this; + m->pHandlerButton->SetCallback(&btnCb); + + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_LAYOUT_UPDATE; + parcel.layoutId = NULL; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + + return true; +} + + +void CFolderLayout::Destroy(void) +{ + ASSERT(m); + + m_RemoveFocusIdler(); + m_EmptyFolderGrid(false); + CExtBaseLayout::Destroy(); + evas_object_del(Layout()); + + free(m->c_finfo); + free(m->c_sinfo); + free(m->ctxtinfo); + delete m; + m = NULL; +} + + +void CFolderLayout::t_OnShow(void) +{ + ASSERT(m); + m->depth = E_DEPTH_FOLDER; + m_UpdateFolderGrid(false); + evas_object_show(Layout()); +} + + +void CFolderLayout::Update(bool focusFlag) +{ + ASSERT(m); + + if (!focusFlag) { + m_UpdateFolderGrid(true); + return; + } + + elm_object_focus_set(m->grid, EINA_TRUE); +} + + +void CFolderLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) +{ + if (!strcmp(ev->keyname, KEY_BACK)) { + if (m->depth == E_DEPTH_SONG) { + m->depth = E_DEPTH_FOLDER; + m_UpdateFolderGrid(false); + m_RemoveFocusIdler(); + m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this); + } + else { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_FOCUS_UPDATE; + parcel.layoutId = NULL; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + } +} \ No newline at end of file diff --git a/src/views/genre-layout.cpp b/src/views/genre-layout.cpp new file mode 100644 index 0000000..c79d509 --- /dev/null +++ b/src/views/genre-layout.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "AppCommon.h" +#include "dbg.h" +#include "i18n.h" +#include "define.h" + +#include +#include "category_info.h" +#include "album_info.h" +#include "song_info.h" +#include "music-controller.h" +#include "LayoutMgr.h" +#include "entry-popup.h" +#include "common.h" +#include "common-ui.h" +#include "BaseView.h" +#include "ExtBaseLayout.h" +#include "ViewMgr.h" +#include "category-layout.h" +#include "base-view.h" +#include "genre-layout.h" + + +struct SGenreLayout { + +}; + + +void CGenreLayout::t_HandleItemSelect(SCatItemInfo *itinfo) +{ + int count; + album_info *alinfo = NULL; + Eina_List *alist = NULL; + + if (!itinfo) + return; + + t.c_catinfo = category_info_duplicate(itinfo->catinfo); + count = 0; + + alist = category_info_get_albumlist(t.c_catinfo); + if (alist) + count = eina_list_count(alist); + + if (count <= 0) + return; + + t.depth = E_DEPTH_ALBUM; + if (count == 1) { + t.depth = E_DEPTH_SONG; + if (t.c_alinfo) { + album_info_destroy(t.c_alinfo); + t.c_alinfo = NULL; + } + alinfo = (album_info *)eina_list_nth(t.c_catinfo->albumlist, 0); + t.c_alinfo = album_info_duplicate(alinfo); + } +} + + +bool CGenreLayout::t_GetMediaList(Eina_List **list) +{ + return CMusicController::GetInstance()->MediaGetList(LIST_TYPE_GENRE, NULL, list); +} diff --git a/src/views/playback-view.cpp b/src/views/playback-view.cpp new file mode 100644 index 0000000..612fa05 --- /dev/null +++ b/src/views/playback-view.cpp @@ -0,0 +1,2203 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "AppCommon.h" +#include "dbg.h" +#include "define.h" +#include +#include "song_info.h" +#include "music-controller.h" +#include "volume-control.h" +#include "i18n.h" +#include "common.h" +#include "common-ui.h" +#include "BaseView.h" +#include "ViewMgr.h" +#include "playback-view.h" +#include "context-view.h" +#include "HandleVolume.h" + + +#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) +#define TITLE_FONT_SIZE 50 +#define ARTIST_FONT_SIZE 30 +#define TOTAL_CONTROL_BTNS 6 +#define TOTAL_SETTING_BTNS 2 +#define TOTAL_EDIT_BTNS 3 +#define S_INTERVAL 1 /* seconds */ +#define LP_INTERVAL 0.5 /* seconds */ +#define WAIT_INTERVAL 0.5 /* seconds */ +#define SLIDER_STEP 5000 /* milli seconds */ +#define LP_CHANGE 10000 /* milli seconds */ +#define S_INCREMENT 1000 /* milli seconds */ + + +enum EEvasObject { + EO_BASE, + + EO_ERROR_POPUP_BUTTON, + + EO_EDIT_PLAYLIST, + EO_CLEAR_PLAYLIST, // TOTAL_SETTING_BTNS + + EO_CANCEL, + EO_DESELECT, + EO_DELETE, // TOTAL_EDIT_BTNS + + EO_BTN_SETTINGS, + EO_BTN_SHUFFLE, + EO_BTN_REPEAT, + EO_BTN_REWIND, + EO_BTN_PLAY, + EO_BTN_FORWARD, // TOTAL_CONTROL_BTNS + + EO_SLIDER, + + EO_PLAYLIST, + + EO_BOX, +}; + + +struct SItemInfo { + Elm_Object_Item *item; + SSongInfo *sinfo; + bool edit_mode; + bool check_status; + bool select_status; +}; + +struct SPlaybackView { + Evas_Object *eoWin; + + Evas_Object *eoBase; + Evas_Object *eoCtxPopup; /*settings popup*/ + Evas_Object *eoErrPopup; + Evas_Object *eoPlaylist; + + Elm_Object_Item *focused_item; + + Evas_Object *eoBtnControl[TOTAL_CONTROL_BTNS]; + Evas_Object *eoBtnSetting[TOTAL_SETTING_BTNS]; + Evas_Object *eoBtnEdit[TOTAL_EDIT_BTNS]; + + Evas_Object *eoAlbumCover; + Evas_Object *eoSlider; + Evas_Object *eoPressedObj; + + Eina_List *elInfo; + Ecore_Timer *etSlider; + Ecore_Timer *etLongPress; + Ecore_Timer *etWait; + CMusicController *hMusicController; //! NOT NULL + SSongInfo *csinfo; + CViewMgr *mgr; + SItemInfo *cs_itinfo; + SContentInfo *ctxtinfo; + int press_status; + + CPlaybackView *parent; + CHandleVolume *pHandleVolume; + + SPlaybackView() { + memset(this, 0, sizeof(SPlaybackView)); + pHandleVolume = new CHandleVolume; + } + ~SPlaybackView() { + delete pHandleVolume; + } +}; + +struct SBtnInfo { + const char *txt; + const char *part; + EEvasObject type; + //Evas_Smart_Cb cb; +}; + +enum EPressTypes { + PRESS_SHORT, + PRESS_SHORT_PAUSE, + PRESS_LONG, + PRESS_LONG_PAUSE, +}; + +enum EControlBtns { + BTN_SETTINGS, + BTN_SHUFFLE, + BTN_REPEAT, + BTN_REWIND, + BTN_PLAY, + BTN_FORWARD +}; + +enum ESettingBtns { + BTN_EDIT, + BTN_CLEAR +}; + +enum EEditBtns { + BTN_CANCEL, + BTN_DESELECT, + BTN_DELETE +}; + +enum ETimers { + TIMER_SLIDER, + TIMER_WAIT, + TIMER_LONGPRESS, + TIMER_VOLUME +}; + +Eina_Bool CPlaybackView::sm_CbUpdateSlider(void *dt) +{ + SPlaybackView *m = (SPlaybackView *)dt; + char *timestr = NULL; + int value; + int duration; + + if (!m) + return ECORE_CALLBACK_CANCEL; + + if (!m->hMusicController->GetPosition(&value)) { + m->etSlider = NULL; + return ECORE_CALLBACK_CANCEL; + } + + if (!song_info_get_duration(m->csinfo, &duration)) { + m->etSlider = NULL; + return ECORE_CALLBACK_CANCEL; + } + + value = value + S_INCREMENT; + if (value > duration) { + m->etSlider = NULL; + return ECORE_CALLBACK_CANCEL; + } + + elm_slider_value_set(m->eoSlider, value); + timestr = _get_timestr_from_milseconds(value); + if (timestr) { + elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, + timestr); + free(timestr); + } + + return ECORE_CALLBACK_RENEW; +} + + +Eina_Bool CPlaybackView::sm_CbLongpressTimer(void *dt) +{ + SPlaybackView *m = (SPlaybackView *)dt; + + m->parent->m_HandleOnRepeated(); + + return ECORE_CALLBACK_RENEW; +} + + +Eina_Bool CPlaybackView::sm_CbWaitTimer(void *dt) +{ + SPlaybackView *m = (SPlaybackView *)dt; + + m->press_status = PRESS_LONG; + if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY) { + /* Handle long press */ + m->parent->m_PlaybackPause(); + m->etLongPress = ecore_timer_add(LP_INTERVAL, sm_CbLongpressTimer, m); + } + else { + m->press_status = PRESS_LONG_PAUSE; + } + + m->etWait = NULL; + return ECORE_CALLBACK_CANCEL; +} + + +void CPlaybackView::sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info) +{ +} + + +void CPlaybackView::sm_CbGenlistItemCheckClicked(void *data, Elm_Object_Item *it, const char *emission, const char *source) +{ + CPlaybackView *root = (CPlaybackView*)data; + if (root) + root->m_OnGenlistItemCheckClicked(it, emission, source); +} + + +void CPlaybackView::m_OnGenlistItemCheckClicked(Elm_Object_Item *it, const char *emission, const char *source) +{ + SItemInfo *itinfo = NULL; + + if (!it || !emission) + return; + + itinfo = m_FindItemInfoFromItem(m->elInfo, it); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + if (itinfo->edit_mode) { + m_UpdateItemCheck(itinfo); + m_DisableEditButtons(false); + } +} + + +void CPlaybackView::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) +{ + SPlaybackView *m = (SPlaybackView *)dt; + SItemInfo *itinfo = NULL; + + if (!m) + return; + + if (!m->ctxtinfo || !m->ctxtinfo->context) + return; + + itinfo = m->parent->m_FindItemInfoFromSong(m->elInfo, + (SSongInfo *)m->ctxtinfo->context); + if (!itinfo) { + _ERR(" Unable to find song in the list "); + return; + } + + if (type == ACTION_TYPE_DELETE) { + itinfo->check_status = true; + m->parent->m_DeleteSelectedItems(); + } + else if (type == ACTION_TYPE_PLAY) { + if (m->ctxtinfo->status == PLAY_STATUS_PLAY) + m->parent->m_KeyPausePress(); + else { + if (itinfo == m->cs_itinfo) + m->parent->m_KeyPlayPress(); + else + m->parent->m_HandleGenlistItemActivated(m->eoPlaylist, itinfo->item); + } + } + else + _ERR(" Wrong ctxt add type in plaback view "); + + if (!m->mgr->PushView(MUSIC_PLAYBACK_VIEW, NULL)) { + _ERR(" viewmgr show failed "); + return; + } + elm_object_item_focus_set(m->focused_item, EINA_TRUE); +} + + +void CPlaybackView::sm_CbCtxtClose(void *dt) +{ + SPlaybackView *m = (SPlaybackView *)dt; + + if (!m) + return; + + m->mgr->PopView(); + m->mgr->PushView(MUSIC_PLAYBACK_VIEW, NULL); + elm_object_item_focus_set(m->focused_item, EINA_TRUE); +} + + +void CPlaybackView::m_RemoveTimer(int timer_code) +{ + ETimers timerCode = (ETimers)timer_code; + + switch (timerCode) { + case TIMER_SLIDER: + if (m->etSlider) { + ecore_timer_del(m->etSlider); + m->etSlider = NULL; + } + break; + + case TIMER_WAIT: + if (m->etWait) { + ecore_timer_del(m->etWait); + m->etWait = NULL; + } + break; + + case TIMER_LONGPRESS: + if (m->etLongPress) { + ecore_timer_del(m->etLongPress); + m->etLongPress = NULL; + } + break; + + case TIMER_VOLUME: + m->pHandleVolume->RemoveTimer(); + break; + + default: + _ERR(" invalid value "); + break; + } +} + + +void CPlaybackView::m_PlaybackPause(void) +{ + m->hMusicController->Pause(); + + if (m->etSlider) + ecore_timer_freeze(m->etSlider); +} + + +void CPlaybackView::m_PlaybackResume(void) +{ + m->hMusicController->Resume(); + + if (m->etSlider) + ecore_timer_thaw(m->etSlider); +} + + +void CPlaybackView::m_ChangeEditmodeAll(Eina_List *list, bool flag) +{ + SItemInfo *itinfo = NULL; + void *obj = NULL; + Eina_List *l = NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SItemInfo *)obj; + itinfo->edit_mode = flag; + } +} + + +void CPlaybackView::m_DisableCheckAll(Eina_List *list) +{ + SItemInfo *itinfo = NULL; + void *obj = NULL; + Eina_List *l = NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SItemInfo *)obj; + itinfo->check_status = false; + } +} + + +void CPlaybackView::m_SelectItem(SItemInfo *pItemInfo) +{ + if (!pItemInfo || !pItemInfo->item) + return; + + elm_genlist_item_bring_in(pItemInfo->item, ELM_GENLIST_ITEM_SCROLLTO_IN); + elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW); + + pItemInfo->select_status = true; +} + + +void CPlaybackView::m_UnselectItem(SItemInfo *pItemInfo) +{ + if (!pItemInfo || !pItemInfo->item) + return; + + elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_UNSELECT_ITEM, + MUSIC_PLAYBACK_VIEW); + + pItemInfo->select_status = false; +} + + +void CPlaybackView::m_UpdateControlBtns(void) +{ + int state; + + state = m->hMusicController->PlayState(); + if (state != PLAY_STATUS_STOP) { + elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE); + elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE); + } + else { + if (!m->eoErrPopup) + elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE); + elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE); + elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE); + } + + if (state == PLAY_STATUS_PLAY) { + elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW); + } + else { + elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW); + } + + state = m->hMusicController->ShuffleState(); + if (state == SHUFFLE_STATUS_OFF) { + elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE], MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW); + } + else { + elm_object_signal_emit(m->eoBtnControl[BTN_SHUFFLE], MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW); + } + + state = m->hMusicController->RepeatState(); + if (state == REPEAT_STATUS_NONE) { + elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW); + } + else if (state == REPEAT_STATUS_ALL) { + elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW); + } + else { + elm_object_signal_emit(m->eoBtnControl[BTN_REPEAT], MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW); + } +} + + +void CPlaybackView::m_UpdateCurrentSongProgressbar(void) +{ + int duration; + char *timestr = NULL; + double step; + int state; + + if (!m->csinfo) + return; + + elm_slider_value_set(m->eoSlider, 0); + elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00"); + + state = m->hMusicController->PlayState(); + + if (state == PLAY_STATUS_STOP) { + elm_object_disabled_set(m->eoSlider, EINA_TRUE); + m_RemoveTimer(TIMER_SLIDER); + return; + } + + elm_object_disabled_set(m->eoSlider, EINA_FALSE); + + if (song_info_get_duration(m->csinfo, &duration)) { + m_RemoveTimer(TIMER_SLIDER); + m->etSlider = ecore_timer_add(S_INTERVAL, + sm_CbUpdateSlider, m); + + elm_slider_min_max_set(m->eoSlider, 0, duration); + timestr = _get_timestr_from_milseconds(duration); + if (timestr) { + elm_object_part_text_set(m->eoBase, + MUSIC_PART_FULLTIME, timestr); + free(timestr); + } + + step = (double)SLIDER_STEP / (double)duration; + elm_slider_step_set(m->eoSlider, step); + } +} + + +void CPlaybackView::m_UpdateCurrentSongThumbnail(void) +{ + char *path = NULL; + char buf[MAX_LENGTH]; + + if (!m->cs_itinfo || !m->cs_itinfo->sinfo) + return; + + path = song_info_get_thumb(m->cs_itinfo->sinfo); + if (path) + elm_image_file_set(m->eoAlbumCover, path, NULL); + else { + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_DEFAULT_THUMB_450); + elm_image_file_set(m->eoAlbumCover, buf, NULL); + } +} + + +void CPlaybackView::m_UpdateCurrentSongLabels(void) +{ + char buf[MAX_LENGTH]; + + if (!m->csinfo) + return; + + elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE, + song_info_get_title(m->csinfo)); + + snprintf(buf, sizeof(buf), "%s - %s", song_info_get_artist(m->csinfo), + song_info_get_album(m->csinfo)); + + elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM, buf); +} + + +void CPlaybackView::m_UpdateEmptySongInfo(void) +{ + char buf[MAX_LENGTH]; + + elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], + MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW); + elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE); + elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT], + m->eoBtnControl[BTN_REPEAT], ELM_FOCUS_RIGHT); + elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_TRUE); + elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_TRUE); + elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE); + elm_object_disabled_set(m->eoSlider, EINA_TRUE); + elm_object_part_text_set(m->eoBase, MUSIC_PART_FULLTIME, "00:00"); + elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, "00:00"); + elm_slider_value_set(m->eoSlider, 0); + elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE, + _(NO_PLAYLIST_MESSAGE)); + elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM, + _(NO_PLAYLIST_MESSAGE_SUB)); + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_DEFAULT_THUMB_450); + elm_image_file_set(m->eoAlbumCover, buf, NULL); + m->hMusicController->SetPlayState(PLAY_STATUS_INITIAL); +} + + +void CPlaybackView::m_UpdateCtxtView(int playStatus) +{ + if (!m->cs_itinfo || !m->ctxtinfo) + return; + + if (!m->mgr->CheckTop(MUSIC_CONTEXT_VIEW)) + return; + + if (m->cs_itinfo->sinfo == m->ctxtinfo->context) { + m->ctxtinfo->status = (EPlayStatus)playStatus; + + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_SONG_UPDATE; + parcel.layoutId = NULL; + parcel.keyEvent = NULL; + m->mgr->UpdateView((const char *)MUSIC_CONTEXT_VIEW, &parcel); + } +} + + +void CPlaybackView::m_UpdateCurrentSongItem(int index) +{ + SItemInfo *pItemInfo = NULL; + + if (m->cs_itinfo) { + m_UnselectItem(m->cs_itinfo); + m_UpdateCtxtView(PLAY_STATUS_PAUSE); + } + + pItemInfo = (SItemInfo *)eina_list_nth(m->elInfo, index); + + if (pItemInfo) { + m->cs_itinfo = pItemInfo; + if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) { + elm_genlist_item_bring_in(pItemInfo->item, + ELM_GENLIST_ITEM_SCROLLTO_IN); + } + else { + m_SelectItem(pItemInfo); + m_UpdateCtxtView(PLAY_STATUS_PLAY); + } + } +} + + +void CPlaybackView::m_UpdateEditmodeFocusSequence(void) +{ + elm_object_focus_next_object_set(m->eoPlaylist, + m->eoBtnEdit[BTN_CANCEL], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL], + m->eoPlaylist, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(m->eoSlider, m->eoBtnEdit[BTN_CANCEL], + ELM_FOCUS_DOWN); +} + + +void CPlaybackView::m_UpdatePlaymodeFocusSequence(void) +{ + elm_object_focus_next_object_set(m->eoSlider, m->eoPlaylist, + ELM_FOCUS_UP); + elm_object_focus_next_object_set(m->eoSlider, m->eoBtnControl[BTN_PLAY], + ELM_FOCUS_DOWN); + if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) { + elm_object_focus_next_object_set(m->eoPlaylist, + m->eoBtnControl[BTN_PLAY], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY], + m->eoPlaylist, ELM_FOCUS_RIGHT); + } + else { + elm_object_focus_next_object_set(m->eoPlaylist, + m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(m->eoBtnControl[BTN_FORWARD], + m->eoPlaylist, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(m->eoBtnControl[BTN_PLAY], + m->eoBtnControl[BTN_FORWARD], ELM_FOCUS_RIGHT); + } +} + + +void CPlaybackView::m_UpdateCurrentSongInfo(void) +{ + SSongInfo *sinfo = NULL; + int index; + + if (eina_list_count(m->elInfo) == 0) { + m_UpdateEmptySongInfo(); + return; + } + + if (!m->hMusicController->GetCurrentSongIndex(&index)) { + _ERR(" music get current song index failed "); + return; + } + + if (!m->hMusicController->GetSonginfoFromIndex(index, &sinfo)) { + _ERR(" music get songinfo failed "); + return; + } + m->csinfo = sinfo; + + m_UpdateCurrentSongItem(index); + m_UpdateCurrentSongLabels(); + m_UpdateCurrentSongThumbnail(); + m_UpdateCurrentSongProgressbar(); + m_UpdateControlBtns(); + m_UpdatePlaymodeFocusSequence(); +} + + +void CPlaybackView::m_DisableEditButtons(bool flag) +{ + /* flag - 1 means disable edit buttons and 0 means enable */ + if (flag) + elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE); + + elm_object_disabled_set(m->eoBtnEdit[BTN_DELETE], (Eina_Bool)flag); + elm_object_disabled_set(m->eoBtnEdit[BTN_DESELECT], (Eina_Bool)flag); + if (flag) { + m_UpdateEditmodeFocusSequence(); + elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE); + } + else { + elm_object_focus_next_object_set(m->eoBtnEdit[BTN_CANCEL], + m->eoBtnEdit[BTN_DESELECT], ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(m->eoBtnEdit[BTN_DELETE], + m->eoPlaylist, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(m->eoPlaylist, + m->eoBtnEdit[BTN_DELETE], ELM_FOCUS_LEFT); + } +} + + +void CPlaybackView::m_CreateErrorPopup(void) +{ + Evas_Object *popup = NULL, *btn = NULL, *label = NULL; + + popup = elm_popup_add(m->eoBase); + if (!popup) + return; + + elm_object_style_set(popup, MUSIC_STYLE_ERROR_POPUP); + evas_object_show(popup); + + label = elm_label_add(popup); + if (!label) { + evas_object_del(popup); + return; + } + + elm_object_style_set(label, MUSIC_STYLE_ERROR_LABEL); + elm_object_text_set(label, MUSIC_TEXT_PLAYBACK_ERROR); + elm_object_content_set(popup, label); + + btn = elm_button_add(popup); + if (!btn) { + evas_object_del(popup); + return; + } + + elm_object_style_set(btn, MUSIC_STYLE_EDIT_BTN); + elm_object_text_set(btn, MUSIC_TEXT_OK); + elm_object_part_content_set(popup, MUSIC_PART_POPUP_BUTTON, btn); + + m->eoErrPopup = popup; + + Connect(btn, EO_ERROR_POPUP_BUTTON, TYPE_CLICKED | TYPE_KEY_DOWN); + //evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, sm_CbPopupOkBtnClicked, m); + //evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, sm_CbPopupOkKeyPressed, m); + elm_object_focus_set(btn, EINA_TRUE); + + return; +} + + +void CPlaybackView::m_DestroyErrorPopup(void) +{ + if (!m->eoErrPopup) + return; + + evas_object_del(m->eoErrPopup); + m->eoErrPopup = NULL; +} + + +void CPlaybackView::m_CreateSettingsPopup(void) +{ + Evas_Object *box = NULL; + Evas_Object *eoCtxPopup = NULL; + int i; + double scale; + SBtnInfo btninfo[TOTAL_SETTING_BTNS]; + + btninfo[BTN_EDIT].txt = MUSIC_TEXT_EDIT_PLAYLIST; + //btninfo[BTN_EDIT].cb = sm_CbEditBtnClicked; + btninfo[BTN_EDIT].type = EO_EDIT_PLAYLIST; + + btninfo[BTN_CLEAR].txt = MUSIC_TEXT_CLEAR_PLAYLIST; + //btninfo[BTN_CLEAR].cb = sm_CbClearBtnClicked; + btninfo[BTN_CLEAR].type = EO_CLEAR_PLAYLIST; + + eoCtxPopup = elm_ctxpopup_add(m->eoWin); + if (!eoCtxPopup) + return; + + box = _add_box(eoCtxPopup); + if (!box) { + evas_object_del(eoCtxPopup); + return; + } + + for (i = 0; i < TOTAL_SETTING_BTNS; i++) { + m->eoBtnSetting[i] = elm_button_add(box); + if (!m->eoBtnSetting[i]) + continue; + if (i == BTN_EDIT) { + elm_object_style_set(m->eoBtnSetting[i], + MUSIC_STYLE_SETTING_BTN_T); + } + else { + elm_object_style_set(m->eoBtnSetting[i], + MUSIC_STYLE_SETTING_BTN_B); + } + evas_object_size_hint_weight_set(m->eoBtnSetting[i], + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, m->eoBtnSetting[i]); + elm_object_text_set(m->eoBtnSetting[i], _(btninfo[i].txt)); + + Connect(m->eoBtnSetting[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE); + //evas_object_smart_callback_add(m->eoBtnSetting[i], MUSIC_SIGNAL_CLICKED, btninfo[i].cb, m); + //evas_object_event_callback_add(m->eoBtnSetting[i], EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m); + + evas_object_show(m->eoBtnSetting[i]); + } + + elm_object_style_set(eoCtxPopup, MUSIC_STYLE_SETTING_POPUP); + elm_object_content_set(eoCtxPopup, box); + + scale = elm_config_scale_get(); + Connect(box, EO_BOX, TYPE_KEY_DOWN); + //evas_object_event_callback_add(box, EVAS_CALLBACK_KEY_DOWN, sm_CbPopupKeyPressed, m); + elm_object_part_content_set(m->eoBase, MUSIC_PART_SETTINGS_POPUP, eoCtxPopup); + + /* If list empty disable these options */ + if (eina_list_count(m->elInfo) == 0) { + elm_object_disabled_set(m->eoBtnSetting[BTN_EDIT], EINA_TRUE); + elm_object_disabled_set(m->eoBtnSetting[BTN_CLEAR], EINA_TRUE); + } + + elm_object_focus_set(m->eoBtnSetting[BTN_EDIT], EINA_TRUE); + + m->eoCtxPopup = eoCtxPopup; +} + + +void CPlaybackView::m_DestroySettingsPopup(void) +{ + if (!m->eoCtxPopup) + return; + + evas_object_del(m->eoCtxPopup); + m->eoCtxPopup = NULL; +} + + +void CPlaybackView::m_FromEditToPlaybackMode(void) +{ + if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) { + elm_genlist_item_bring_in(m->cs_itinfo->item, + ELM_GENLIST_ITEM_SCROLLTO_IN); + } + else + m_SelectItem(m->cs_itinfo); + + elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE, + MUSIC_PLAYBACK_VIEW); + elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE); + + m_ChangeEditmodeAll(m->elInfo, false); + + elm_genlist_realized_items_update(m->eoPlaylist); + + m_UpdatePlaymodeFocusSequence(); +} + + +void CPlaybackView::m_FromPlaybackToEditMode(void) +{ + elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_EDIT_MODE, + MUSIC_PLAYBACK_VIEW); + + m_DisableEditButtons(true); + + elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE); + + m_ChangeEditmodeAll(m->elInfo, true); + + elm_genlist_realized_items_update(m->eoPlaylist); + + m_UpdateEditmodeFocusSequence(); +} + + +void CPlaybackView::m_HandleOnRepeated(void) +{ + Evas_Object *obj = NULL; + int value; + int duration; + char *timestr = NULL; + + if (!m->eoPressedObj) + return; + + obj = m->eoPressedObj; + + value = elm_slider_value_get(m->eoSlider); + if (!song_info_get_duration(m->cs_itinfo->sinfo, &duration)) { + _ERR("can not get duration "); + return; + } + + if (obj == m->eoBtnControl[BTN_REWIND]) { + if (value == 0) { + m_RemoveTimer(TIMER_LONGPRESS); + return; + } + value = value - LP_CHANGE; + if (value <= 0) + value = 0; + } + else { + if (value == duration) { + if (m->hMusicController->PlayNextSong()) + m_UpdateCurrentSongInfo(); + else + _ERR(" music play next song failed "); + + m->press_status = PRESS_LONG_PAUSE; + elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], MUSIC_SIGNAL_PAUSE, + MUSIC_PLAYBACK_VIEW); + m_PlaybackPause(); + m_RemoveTimer(TIMER_LONGPRESS); + + return; + } + value = value + LP_CHANGE; + if (value >= duration) + value = duration; + } + + m->hMusicController->SetPosition(value); + elm_slider_value_set(m->eoSlider, value); + timestr = _get_timestr_from_milseconds(value); + if (timestr) { + elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, + timestr); + free(timestr); + } + + return; +} + + +void CPlaybackView::m_DeleteSelectedItems(void) +{ + Eina_List *l = NULL, *l_next = NULL; + SItemInfo *pItemInfo = NULL; + void *obj = NULL; + int index; + bool flag = false; + + m_DisableEditButtons(true); + EINA_LIST_FOREACH_SAFE(m->elInfo, l, l_next, obj) { + pItemInfo = (SItemInfo *)obj; + if (pItemInfo->check_status) { + if (m->cs_itinfo == pItemInfo) { + flag = true; + m_UnselectItem(m->cs_itinfo); + m_RemoveTimer(TIMER_SLIDER); + m->cs_itinfo = NULL; + m->hMusicController->SetPlayState(PLAY_STATUS_STOP); + m->hMusicController->Stop(); + } + index = elm_genlist_item_index_get(pItemInfo->item); + m->hMusicController->RemoveSong(pItemInfo->sinfo, index); + + m->elInfo = eina_list_remove(m->elInfo, + pItemInfo); + elm_object_item_del(pItemInfo->item); + } + } + + if (eina_list_count(m->elInfo) == 0) { + m_UpdateEmptySongInfo(); + elm_genlist_realized_items_update(m->eoPlaylist); + elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE); + return; + } + + if (flag) + m_UpdateCurrentSongInfo(); + + elm_genlist_realized_items_update(m->eoPlaylist); + elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE); +} + + +void CPlaybackView::m_KeyBackPress(void) +{ + if (m->eoCtxPopup) { + m_DestroySettingsPopup(); + elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_FALSE); + elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE); + return; + } + + t_OnHide(); + m->mgr->PushView(MUSIC_BASE_VIEW, NULL); +} + + +void CPlaybackView::m_KeyExitPress(void) +{ + m_RemoveTimer(TIMER_SLIDER); + m->hMusicController->Stop(); + elm_exit(); +} + + +void CPlaybackView::m_KeyPlayPress(void) +{ + int state; + + if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY])) + return; + + state = m->hMusicController->PlayState(); + if (state == PLAY_STATUS_PAUSE) { + m_PlaybackResume(); + elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], + MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW); + } + else if (state != PLAY_STATUS_PLAY) { + if (m->hMusicController) + m->hMusicController->Start(); + + m_UpdateCurrentSongInfo(); + } +} + + +void CPlaybackView::m_KeyPausePress(void) +{ + int state; + + if (elm_object_disabled_get(m->eoBtnControl[BTN_PLAY])) + return; + + state = m->hMusicController->PlayState(); + if (state == PLAY_STATUS_PLAY) { + elm_object_signal_emit(m->eoBtnControl[BTN_PLAY], + MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW); + m_PlaybackPause(); + } +} + + +void CPlaybackView::m_KeyNextPress(void) +{ + if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD])) + return; + + m_HandleOnPressed(m->eoBtnControl[BTN_FORWARD]); +} + + +void CPlaybackView::m_KeyPreviousPress(void) +{ + if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND])) + return; + + m_HandleOnPressed(m->eoBtnControl[BTN_REWIND]); +} + + +void CPlaybackView::m_KeyNextUnpress(void) +{ + if (elm_object_disabled_get(m->eoBtnControl[BTN_FORWARD])) + return; + + m_HandleOnUnpressed(m->eoBtnControl[BTN_FORWARD]); + //sm_CbOnUnpressed(m, m->eoBtnControl[BTN_FORWARD], NULL); +} + + +void CPlaybackView::m_KeyPreviousUnpress(void) +{ + if (elm_object_disabled_get(m->eoBtnControl[BTN_REWIND])) + return; + + m_HandleOnUnpressed(m->eoBtnControl[BTN_REWIND]); + //sm_CbOnUnpressed(m, m->eoBtnControl[BTN_REWIND], NULL); +} + + +void CPlaybackView::m_HandleKeyPress(char *keyname) +{ + if (strcmp(keyname, (char*)KEY_EXIT) == 0) + m_KeyExitPress(); + else if (strcmp(keyname, (char*)KEY_BACK) == 0) + m_KeyBackPress(); + else if (strcmp(keyname, (char*)KEY_PLAY) == 0) + m_KeyPlayPress(); + else if (strcmp(keyname, (char*)KEY_PAUSE) == 0) + m_KeyPausePress(); + else if (strcmp(keyname, (char*)KEY_NEXT) == 0) + m_KeyNextPress(); + else if (strcmp(keyname, (char*)KEY_PREVIOUS) == 0) + m_KeyPreviousPress(); + else if (strcmp(keyname, (char*)KEY_VOLUMEUP) == 0) + m->pHandleVolume->Up(); //m_KeyVolumeupPress(); + else if (strcmp(keyname, (char*)KEY_VOLUMEDOWN) == 0) + m->pHandleVolume->Down();// m_KeyVolumedownPress(); + else if (strcmp(keyname, (char*)KEY_MUTE) == 0) + m->pHandleVolume->Mute(); // m_KeyMutePress(); +} + + +void CPlaybackView::m_HandleKeyUnpress(char *keyname) +{ + if (!strcmp(keyname, KEY_PREVIOUS)) + m_KeyPreviousUnpress(); + else if (!strcmp(keyname, KEY_NEXT)) + m_KeyNextUnpress(); +} + + +void CPlaybackView::m_AddSlider(void) +{ + Evas_Object *eoSlider = NULL; + + eoSlider = elm_slider_add(m->eoBase); + if (!eoSlider) + return; + + elm_slider_indicator_show_set(eoSlider, EINA_FALSE); + elm_slider_indicator_show_on_focus_set(eoSlider, EINA_FALSE); + elm_object_style_set(eoSlider, MUSIC_STYLE_SLIDER); + elm_slider_horizontal_set(eoSlider, EINA_TRUE); + elm_object_part_content_set(m->eoBase, MUSIC_PART_PROGRESSBAR, eoSlider); + + Connect(eoSlider, EO_SLIDER, TYPE_CHANGED | TYPE_MOUSE_MOVE); + //evas_object_smart_callback_add(eoSlider, MUSIC_SIGNAL_CHANGED, sm_CbSliderValueChanged, m); + //evas_object_event_callback_add(eoSlider, EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m); + evas_object_show(eoSlider); + m->eoSlider = eoSlider; +} + + +void CPlaybackView::m_AddAlbumCover(void) +{ + Evas_Object *eoAlbumCover = NULL; + + eoAlbumCover = elm_image_add(m->eoBase); + if (!eoAlbumCover) + return; + + evas_object_size_hint_weight_set(eoAlbumCover, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_image_aspect_fixed_set(eoAlbumCover, EINA_FALSE); + + elm_object_part_content_set(m->eoBase, MUSIC_PART_ALBUMCOVER, + eoAlbumCover); + evas_object_show(eoAlbumCover); + m->eoAlbumCover = eoAlbumCover; + +} + + +void CPlaybackView::m_AddCurrentSonginfo(void) +{ + m_AddAlbumCover(); + m_AddSlider(); +} + + +void CPlaybackView::m_AddEditPlaylistButtons(void) +{ + Evas_Object *box = NULL; + int i; + SBtnInfo btninfo[TOTAL_EDIT_BTNS]; + + btninfo[BTN_CANCEL].txt = MUSIC_TEXT_CANCEL; + //btninfo[BTN_CANCEL].cb = sm_CbCancelBtnClicked; + btninfo[BTN_CANCEL].type = EO_CANCEL; + + btninfo[BTN_DESELECT].txt = MUSIC_TEXT_DESELECT; + //btninfo[BTN_DESELECT].cb = sm_CbDeselectBtnClicked; + btninfo[BTN_DESELECT].type = EO_DESELECT; + + btninfo[BTN_DELETE].txt = MUSIC_TEXT_DELETE; + //btninfo[BTN_DELETE].cb = sm_CbDeleteBtnClicked; + btninfo[BTN_DELETE].type = EO_DELETE; + + box = _add_box(m->eoBase); + if (!box) + return; + + elm_box_horizontal_set(box, EINA_TRUE); + elm_box_padding_set(box, + MUSIC_EDIT_BTNS_PADDING * elm_config_scale_get(), 0); + + for (i = 0; i < TOTAL_EDIT_BTNS; i++) { + m->eoBtnEdit[i] = elm_button_add(m->eoBase); + if (!m->eoBtnEdit[i]) + continue; + + elm_object_style_set(m->eoBtnEdit[i], + MUSIC_STYLE_EDIT_BTN); + evas_object_size_hint_weight_set(m->eoBtnEdit[i], + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, m->eoBtnEdit[i]); + elm_object_text_set(m->eoBtnEdit[i], _(btninfo[i].txt)); + + //evas_object_smart_callback_add(m->eoBtnEdit[i], MUSIC_SIGNAL_CLICKED, btninfo[i].cb, m); + //evas_object_event_callback_add(m->eoBtnEdit[i], EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m); + + evas_object_show(m->eoBtnEdit[i]); + } + elm_object_part_content_set(m->eoBase, MUSIC_PART_EDITBTNS, box); + elm_object_signal_emit(m->eoBase, MUSIC_SIGNAL_PLAYBACK_MODE, + MUSIC_PLAYBACK_VIEW); +} + + +void CPlaybackView::m_AddControlButtons(void) +{ + Evas_Object *box = NULL; + int i; + SBtnInfo btninfo[TOTAL_CONTROL_BTNS]; + + btninfo[BTN_SETTINGS].txt = MUSIC_STYLE_BTN_SETTINGS; + //btninfo[BTN_SETTINGS].cb = sm_CbSettingsBtnClicked; + btninfo[BTN_SETTINGS].type = EO_BTN_SETTINGS; + + btninfo[BTN_SHUFFLE].txt = MUSIC_STYLE_BTN_SHUFFLE; + //btninfo[BTN_SHUFFLE].cb = sm_CbShuffleBtnClicked; + btninfo[BTN_SHUFFLE].type = EO_BTN_SHUFFLE; + + btninfo[BTN_REPEAT].txt = MUSIC_STYLE_BTN_REPEAT; + //btninfo[BTN_REPEAT].cb = sm_CbRepeatBtnClicked; + btninfo[BTN_REPEAT].type = EO_BTN_REPEAT; + + btninfo[BTN_REWIND].txt = MUSIC_STYLE_BTN_REWIND; + btninfo[BTN_REWIND].type = EO_BTN_REWIND; + + btninfo[BTN_PLAY].txt = MUSIC_STYLE_BTN_PLAY; + //btninfo[BTN_PLAY].cb = sm_CbPlayBtnClicked; + btninfo[BTN_PLAY].type = EO_BTN_PLAY; + + btninfo[BTN_FORWARD].txt = MUSIC_STYLE_BTN_FORWARD; + btninfo[BTN_FORWARD].type = EO_BTN_FORWARD; + + box = elm_box_add(m->eoBase); + if (!box) + return; + + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0); + elm_box_horizontal_set(box, EINA_TRUE); + elm_box_padding_set(box, + MUSIC_CONTROL_BTNS_PADDING * elm_config_scale_get(), 0); + + for (i = 0; i < TOTAL_CONTROL_BTNS; i++) { + m->eoBtnControl[i] = elm_button_add(m->eoBase); + if (!m->eoBtnControl[i]) + continue; + + elm_object_style_set(m->eoBtnControl[i], btninfo[i].txt); + evas_object_size_hint_weight_set(m->eoBtnControl[i], + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, m->eoBtnControl[i]); + + if (i == BTN_REWIND || i == BTN_FORWARD) { + Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_PRESSED | TYPE_UNPRESSED | TYPE_MOUSE_MOVE); + //evas_object_smart_callback_add(m->eoBtnControl[i], MUSIC_SIGNAL_PRESSED, sm_CbOnPressed, m); + //evas_object_smart_callback_add(m->eoBtnControl[i], MUSIC_SIGNAL_UNPRESSED, sm_CbOnUnpressed, m); + } + else { + Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE); + //evas_object_smart_callback_add(m->eoBtnControl[i], MUSIC_SIGNAL_CLICKED, btninfo[i].cb, m); + } + //evas_object_event_callback_add(m->eoBtnControl[i], EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m); + evas_object_show(m->eoBtnControl[i]); + } + + elm_object_part_content_set(m->eoBase, MUSIC_PART_CONTROLBTNS, box); +} + + +SItemInfo *CPlaybackView::m_FindItemInfoFromSong(Eina_List *list, SSongInfo *sinfo) +{ + Eina_List *l = NULL; + SItemInfo *itinfo = NULL; + void *obj = NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SItemInfo *)obj; + if (itinfo->sinfo == sinfo) + return itinfo; + } + + return NULL; +} + + +SItemInfo *CPlaybackView::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item) +{ + Eina_List *l = NULL; + SItemInfo *itinfo = NULL; + void *obj = NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SItemInfo *)obj; + if (itinfo->item == item) + return itinfo; + } + + return NULL; +} + + +void CPlaybackView::m_UpdateItemCheck(SItemInfo *itinfo) +{ + if (!itinfo) { + _ERR(" No item info to Update check "); + return; + } + + if (itinfo->check_status) { + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW); + itinfo->check_status = false; + return; + } + + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_CHECK_ON, MUSIC_PLAYBACK_VIEW); + itinfo->check_status = true; +} + + +class CElmGenlistItemClass { +public: + static char *sm_CbTextGet(void *data, Evas_Object *obj, const char *part) + { + SSongInfo *sinfo = NULL; + SItemInfo *pItemInfo = (SItemInfo *)data; + char buf[MAX_LENGTH]; + char *timestr = NULL; + int duration; + int index; + + if (!pItemInfo || !obj) + return NULL; + + sinfo = pItemInfo->sinfo; + + snprintf(buf, sizeof(buf), "%s", MUSIC_STR_EMPTY); + + if (!strcmp(part, "elm.text0")) { + index = elm_genlist_item_index_get(pItemInfo->item); + snprintf(buf, sizeof(buf), "%d", index + 1); + if ((index & 1) == 1) { + elm_object_item_signal_emit(pItemInfo->item, + MUSIC_SIGNAL_EVEN_ROW, MUSIC_PLAYBACK_VIEW); + } + else { + elm_object_item_signal_emit(pItemInfo->item, + MUSIC_SIGNAL_ODD_ROW, MUSIC_PLAYBACK_VIEW); + } + } + else if (!strcmp(part, "elm.text1")) + snprintf(buf, sizeof(buf), "%s", song_info_get_title(sinfo)); + else if (!strcmp(part, "elm.text2")) + snprintf(buf, sizeof(buf), "%s - %s", + song_info_get_artist(sinfo), + song_info_get_album(sinfo)); + else if (!strcmp(part, "elm.text3")) { + if (song_info_get_duration(sinfo, &duration)) { + timestr = _get_timestr_from_milseconds(duration); + if (timestr) { + snprintf(buf, sizeof(buf), "%s", timestr); + free(timestr); + } + } + } + + if (strcmp(buf, MUSIC_STR_EMPTY)) + return strdup(buf); + + return NULL; + } + static Evas_Object *sm_CbContentGet(void *data, Evas_Object *obj, const char *part) + { + SSongInfo *sinfo = NULL; + SItemInfo *pItemInfo = (SItemInfo *)data; + Evas_Object *img = NULL; + char *path = NULL; + char buf[MAX_LENGTH]; + + if (!pItemInfo || !obj) + return NULL; + + sinfo = pItemInfo->sinfo; + + img = elm_image_add(obj); + if (!img) + return NULL; + + elm_image_aspect_fixed_set(img, EINA_FALSE); + + if (!strcmp(part, "elm.swallow.icon")) { + path = song_info_get_thumb(sinfo); + if (path) + elm_image_file_set(img, path, "NULL"); + else { + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_DEFAULT_THUMB_126); + elm_image_file_set(img, buf, "NULL"); + } + } + + if (pItemInfo->select_status) { + elm_object_item_signal_emit(pItemInfo->item, + MUSIC_SIGNAL_SELECT_ITEM, MUSIC_PLAYBACK_VIEW); + } + else { + elm_object_item_signal_emit(pItemInfo->item, + MUSIC_SIGNAL_UNSELECT_ITEM, + MUSIC_PLAYBACK_VIEW); + } + + if (pItemInfo->edit_mode) { + elm_object_item_signal_emit(pItemInfo->item, + MUSIC_SIGNAL_EDITMODE_ON, MUSIC_PLAYBACK_VIEW); + if (pItemInfo->check_status) { + elm_object_item_signal_emit(pItemInfo->item, + MUSIC_SIGNAL_CHECK_ON, + MUSIC_PLAYBACK_VIEW); + } + else { + elm_object_item_signal_emit(pItemInfo->item, + MUSIC_SIGNAL_CHECK_OFF, MUSIC_PLAYBACK_VIEW); + } + } + else { + elm_object_item_signal_emit(pItemInfo->item, + MUSIC_SIGNAL_EDITMODE_OFF, MUSIC_PLAYBACK_VIEW); + } + + return img; + + } + static void sm_CbDel(void *data, Evas_Object *obj) + { + free(data); + } +}; + + +Elm_Genlist_Item_Class *CPlaybackView::m_GetItemClass(void) +{ + Elm_Genlist_Item_Class *list_item = NULL; + + list_item = elm_genlist_item_class_new(); + if (!list_item) { + _ERR(" elm_genlist_item_class_new failed "); + return NULL; + } + + list_item->item_style = MUSIC_STYLE_PLAYLIST; + list_item->func.text_get = CElmGenlistItemClass::sm_CbTextGet; + list_item->func.content_get = CElmGenlistItemClass::sm_CbContentGet; + list_item->func.state_get = NULL; + list_item->func.del = CElmGenlistItemClass::sm_CbDel; + + return list_item; +} + + +void CPlaybackView::m_AddGenlist(void) +{ + Evas_Object *genlist = NULL; + Evas_Object *eoBase = NULL; + + eoBase = m->eoBase; + genlist = elm_genlist_add(eoBase); + if (!genlist) + return; + + elm_genlist_homogeneous_set(genlist, EINA_TRUE); + evas_object_size_hint_weight_set(genlist, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(eoBase, MUSIC_PART_PLAYLIST, genlist); + elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_genlist_multi_select_set(genlist, EINA_FALSE); + + Connect(genlist, EO_PLAYLIST, TYPE_REALIZED | TYPE_UNREALIZED | TYPE_MOUSE_MOVE | TYPE_KEY_DOWN | TYPE_ACTIVATED); + //evas_object_smart_callback_add(genlist, MUSIC_SIGNAL_ACTIVATED, sm_CbGenlistItemActivated, m); + //evas_object_smart_callback_add(genlist, MUSIC_SIGNAL_REALIZED, sm_CbGenlistRealized, m); + //evas_object_smart_callback_add(genlist, MUSIC_SIGNAL_UNREALIZED, sm_CbGenlistUnrealized, m); + //evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_MOVE, _genlist_mouse_moved, m); + //evas_object_event_callback_add(genlist, EVAS_CALLBACK_KEY_DOWN, sm_CbKeyDown, m); + evas_object_show(genlist); + m->eoPlaylist = genlist; +} + + +void CPlaybackView::m_AddPlaylist(void) +{ + Elm_Genlist_Item_Class *list_item = NULL; + int ts = 0; + int i, index = -1; + struct SSongInfo *sinfo = NULL; + Elm_Object_Item *item = NULL; + SItemInfo *pItemInfo = NULL; + + m_AddGenlist(); + if (!m->eoPlaylist) + return; + + list_item = m_GetItemClass(); + if (!list_item) { + evas_object_del(m->eoPlaylist); + return; + } + + if (!m->hMusicController->GetTotalSongs(&ts)) { + _ERR(" music get total songs failed "); + return; + } + + if (!m->hMusicController->GetCurrentSongIndex(&index)) + _ERR(" music get current song index failed "); + + for (i = 0; i < ts; i++) { + if (!m->hMusicController->GetSonginfoFromIndex(i, &sinfo)) { + _ERR(" music get songinfo failed "); + continue; + } + pItemInfo = (SItemInfo *)calloc(1, sizeof(*pItemInfo)); + if (!pItemInfo) + return; + pItemInfo->sinfo = sinfo; + pItemInfo->edit_mode = false; + pItemInfo->check_status = false; + pItemInfo->select_status = false; + + item = elm_genlist_item_append(m->eoPlaylist, list_item, + pItemInfo, NULL, ELM_GENLIST_ITEM_NONE, + sm_CbItemSelect, m); + pItemInfo->item = item; + + if (i == index) { + pItemInfo->select_status = true; + m->cs_itinfo = pItemInfo; + } + m->elInfo = eina_list_append(m->elInfo, pItemInfo); + } +} + + +void CPlaybackView::m_RemovePlaylist(void) +{ + if (m->eoPlaylist) { + elm_genlist_clear(m->eoPlaylist); + m->eoPlaylist = NULL; + } + + if (m->elInfo) { + eina_list_free(m->elInfo); + m->elInfo = NULL; + } +} + + +void CPlaybackView::m_HandleRewindBtnClicked(Evas_Object *obj) +{ + elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, + MUSIC_PLAYBACK_VIEW); + + if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) + return; + + if (!m->hMusicController->PlayPreviousSong()){ + _ERR(" music play previous song failed "); + return; + } + + m_UpdateCurrentSongInfo(); +} + + +void CPlaybackView::m_HandleForwardBtnClicked(Evas_Object *obj) +{ + elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, + MUSIC_PLAYBACK_VIEW); + + if (m->hMusicController->PlayState() == PLAY_STATUS_STOP) + return; + + if (!m->hMusicController->PlayNextSong()) { + _ERR(" music play next song failed "); + return; + } + + m_UpdateCurrentSongInfo(); +} + + +void CPlaybackView::m_HandleOnPressed(Evas_Object *obj) +{ + m->press_status = PRESS_SHORT; + m->eoPressedObj = obj; + + m->etWait = ecore_timer_add(WAIT_INTERVAL, sm_CbWaitTimer, m); +} + + +void CPlaybackView::m_HandleOnUnpressed(Evas_Object *obj) +{ + m_RemoveTimer(TIMER_WAIT); + m_RemoveTimer(TIMER_LONGPRESS); + + if (m->press_status == PRESS_SHORT) { + /* Handle song change */ + if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY) + m_PlaybackPause(); + + if (obj == m->eoBtnControl[BTN_FORWARD]) + m_HandleForwardBtnClicked(obj); + else + m_HandleRewindBtnClicked(obj); + + if (m->hMusicController->PlayState() != PLAY_STATUS_PLAY) + m_PlaybackResume(); + } + else if (m->press_status == PRESS_LONG) { + if (m->hMusicController->PlayState() != PLAY_STATUS_PLAY) + m_PlaybackResume(); + } + + m->press_status = PRESS_SHORT; +} + + +void CPlaybackView::m_HandleGenlistItemActivated(Evas_Object *obj, Elm_Object_Item *genListItem) +{ + int index; + SItemInfo *itinfo = NULL; + + if (!obj || !genListItem) + return; + + itinfo = m_FindItemInfoFromItem(m->elInfo, genListItem); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + if (itinfo->edit_mode) { + m_UpdateItemCheck(itinfo); + m_DisableEditButtons(false); + return; + } + + index = elm_genlist_item_index_get(genListItem); + + m->hMusicController->PlayIndexSong(index); + m_UpdateCurrentSongInfo(); +} + + +bool CPlaybackView::Create(void *data) +{ + ASSERT(!m); + + _CREATE_BEGIN{ + _CHECK(m = new SPlaybackView) + _CHECK(m->mgr = CViewMgr::GetInstance()) + _CHECK(m->eoWin = m->mgr->Window()) + _CHECK(m->hMusicController = CMusicController::GetInstance()) + _CHECK(m->eoBase = _add_base(m->eoWin, MUSIC_PLAYBACK_VIEW)) + _CHECK(CBaseView::Create(data)) + _WHEN_SUCCESS{} + _CHECK_FAIL{ CBaseView::Destroy(); } + _CHECK_FAIL{ evas_object_del(m->eoBase); } + _CHECK_FAIL{ /* CMusicController::GetInstance())*/ } + _CHECK_FAIL{ /* mgr->Window() */ } + _CHECK_FAIL{ /* CViewerMgr::GetInstance() */} + _CHECK_FAIL{ delete m; m = NULL; } + }_CREATE_END_AND_CATCH{ return false; } + + m->press_status = PRESS_SHORT; + m->parent = this; + + evas_object_data_set(m->eoBase, PLAYBACK_VIEW_DATA, m); + + m_AddControlButtons(); + m_AddEditPlaylistButtons(); + m_AddCurrentSonginfo(); + m_AddPlaylist(); + + m->pHandleVolume->Create(m->eoBase); + m_UpdatePlaymodeFocusSequence(); + + Connect(m->eoBase, EO_BASE, TYPE_KEY_DOWN | TYPE_KEY_UP); + //evas_object_event_callback_add(eoBase, EVAS_CALLBACK_KEY_DOWN, sm_CbKeyPressed, m); + //evas_object_event_callback_add(eoBase, EVAS_CALLBACK_KEY_UP, sm_CbKeyReleased, m); + + m->hMusicController->AddListener(this); + //m->cbInfo[E_SONG_COMPLETE] = m->hMusicController->AddCallback(E_SONG_COMPLETE, sm_CbUpdateCurrentSongInfo, m); + //m->cbInfo[E_PLAYBACK_ERROR] = m->hMusicController->AddCallback(E_PLAYBACK_ERROR, sm_CbPlaybackError, m); + + return true; +} + + +void CPlaybackView::Destroy(void) +{ + ASSERT(m); + + m->hMusicController->RemoveListener(this); + //m->hMusicController->RemoveCallback(m->cbInfo[E_SONG_COMPLETE]); + //m->hMusicController->RemoveCallback(m->cbInfo[E_PLAYBACK_ERROR]); + + m_DestroyErrorPopup(); + + m_RemoveTimer(TIMER_SLIDER); + m_RemoveTimer(TIMER_WAIT); + m_RemoveTimer(TIMER_LONGPRESS); + m_DestroySettingsPopup(); + + m->pHandleVolume->Destroy(); + CBaseView::Destroy(); + evas_object_del(m->eoBase); + + free(m->ctxtinfo); + delete m; + m = NULL; +} + + +Evas_Object* CPlaybackView::Base(void) +{ + ASSERT(m); + + return m->eoBase; +} + + +void CPlaybackView::t_OnClickedSettings(Evas_Object *obj) +{ + elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW); + + if (eina_list_count(m->elInfo) == 0) + return; + + elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTROL_SELECTED, MUSIC_PLAYBACK_VIEW); + m_DestroySettingsPopup(); + m_CreateSettingsPopup(); +} + + +void CPlaybackView::t_OnClickedShuffle(Evas_Object *obj) +{ + elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW); + + switch (m->hMusicController->ShuffleState()) { + case SHUFFLE_STATUS_OFF: + m->hMusicController->SetShuffleState(SHUFFLE_STATUS_ON); + elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_ON, MUSIC_PLAYBACK_VIEW); + break; + + default: + m->hMusicController->SetShuffleState(SHUFFLE_STATUS_OFF); + elm_object_signal_emit(obj, MUSIC_SIGNAL_SHUFFLE_OFF, MUSIC_PLAYBACK_VIEW); + break; + } +} + + +void CPlaybackView::t_OnClickedRepeat(Evas_Object *obj) +{ + elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW); + + switch (m->hMusicController->RepeatState()) { + case REPEAT_STATUS_NONE: + m->hMusicController->SetRepeatState(REPEAT_STATUS_ALL); + elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ALL, MUSIC_PLAYBACK_VIEW); + break; + + case REPEAT_STATUS_ALL: + m->hMusicController->SetRepeatState(REPEAT_STATUS_ONE); + elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_ONE, MUSIC_PLAYBACK_VIEW); + break; + + default: + m->hMusicController->SetRepeatState(REPEAT_STATUS_NONE); + elm_object_signal_emit(obj, MUSIC_SIGNAL_REPEAT_OFF, MUSIC_PLAYBACK_VIEW); + break; + } +} + + +void CPlaybackView::t_OnClickedPlay(Evas_Object *obj) +{ + elm_object_signal_emit(obj, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_PLAYBACK_VIEW); + + switch (m->hMusicController->PlayState()) { + case PLAY_STATUS_PAUSE: + m_PlaybackResume(); + elm_object_signal_emit(obj, MUSIC_SIGNAL_PLAY, MUSIC_PLAYBACK_VIEW); + break; + + case PLAY_STATUS_PLAY: + elm_object_signal_emit(obj, MUSIC_SIGNAL_PAUSE, MUSIC_PLAYBACK_VIEW); + m_PlaybackPause(); + break; + + default: + if (m->hMusicController) + m->hMusicController->Start(); + m_UpdateCurrentSongInfo(); + break; + } +} + + +void CPlaybackView::t_OnShow(void) +{ + ASSERT(m); + + int state; + + if (m->cs_itinfo) { + elm_genlist_item_show(m->cs_itinfo->item, + ELM_GENLIST_ITEM_SCROLLTO_IN); + elm_object_item_focus_set(m->cs_itinfo->item, EINA_TRUE); + } + + state = m->hMusicController->PlayState(); + if (state == PLAY_STATUS_INITIAL || state == PLAY_STATUS_STOP) { + m_RemovePlaylist(); + m_AddPlaylist(); + m->hMusicController->Start(); + m_UpdateCurrentSongInfo(); + } + + evas_object_show(m->eoBase); +} + + +void CPlaybackView::t_OnUpdate(void *data) +{ + ASSERT(m); + + if (!data) + return; + + SParcel *parcel = (SParcel *)data; + int updateType = parcel->updateType; + char *key = (char *)parcel->keyEvent; + + switch (updateType) { + case E_PLAYLIST_UPDATE: + m_RemovePlaylist(); + m_AddPlaylist(); + elm_object_disabled_set(m->eoBtnControl[BTN_FORWARD], EINA_FALSE); + elm_object_disabled_set(m->eoBtnControl[BTN_REWIND], EINA_FALSE); + elm_object_disabled_set(m->eoBtnControl[BTN_PLAY], EINA_FALSE); + elm_object_focus_next_object_set(m->eoBtnControl[BTN_REPEAT], + m->eoBtnControl[BTN_REWIND], ELM_FOCUS_RIGHT); + m_FromEditToPlaybackMode(); + break; + + case E_KEY_PRESS: + m_HandleKeyPress(key); + break; + + case E_KEY_RELEASE: + m_HandleKeyUnpress(key); + break; + + default: + break; + } +} + + +void CPlaybackView::t_OnHide(void) +{ + ASSERT(m); + + evas_object_hide(m->eoBase); +} + + +void CPlaybackView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) +{ + switch (id) { + case EO_BASE: + m_HandleKeyPress(ev->keyname); + break; + + case EO_ERROR_POPUP_BUTTON: + if (!strcmp(ev->keyname, KEY_BACK)) { + m_DestroyErrorPopup(); + elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE); + } + break; + + case EO_PLAYLIST: + { + Elm_Object_Item *it = NULL; + SContentInfo *ctxtinfo = NULL; + SItemInfo *itinfo = NULL; + + if (strcmp(ev->keyname, KEY_MENU)) + return; + + it = elm_object_focused_item_get(obj); + if (!it) { + _ERR(" unable to get focused item "); + return; + } + m->focused_item = it; + + if (m->ctxtinfo) { + free(m->ctxtinfo); + m->ctxtinfo = NULL; + } + + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; + + itinfo = m_FindItemInfoFromItem(m->elInfo, it); + if (!itinfo) { + free(ctxtinfo); + return; + } + + if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY && + itinfo == m->cs_itinfo) + ctxtinfo->status = PLAY_STATUS_PLAY; + else + ctxtinfo->status = PLAY_STATUS_PAUSE; + + ctxtinfo->cbdata = m; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + ctxtinfo->type = CONTEXT_TYPE_PLAYSONG; + ctxtinfo->context = itinfo->sinfo; + + m->ctxtinfo = ctxtinfo; + + SParcel parcel; + parcel.ctxtInfo = ctxtinfo; + if (!m->mgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); + } + + case EO_BOX: + if (!strcmp(ev->keyname, KEY_BACK)) { + _ERR("eoCtxPopup BACK key pressed "); + m_DestroySettingsPopup(); + elm_object_focus_set(m->eoBtnControl[BTN_SETTINGS], EINA_TRUE); + + } + else if (!strcmp(ev->keyname, KEY_EXIT)) { + _ERR("eoCtxPopup EXIT key pressed "); + m_DestroySettingsPopup(); + m_RemoveTimer(TIMER_SLIDER); + m->hMusicController->Stop(); + elm_exit(); + } + break; + + default: + break; + } +} + + +void CPlaybackView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) +{ + switch (id) { + case EO_BASE: + m_HandleKeyUnpress(ev->keyname); + break; + + default: + break; + } +} + + +void CPlaybackView::OnMouseClicked(int id, Evas_Object *obj) +{ + switch (id) { + case EO_ERROR_POPUP_BUTTON: + m_DestroyErrorPopup(); + elm_object_focus_set(m->eoBtnControl[BTN_PLAY], EINA_TRUE); + break; + + case EO_EDIT_PLAYLIST: + m_DestroySettingsPopup(); + m_FromPlaybackToEditMode(); + break; + + case EO_CLEAR_PLAYLIST: + m->hMusicController->Stop(); + m->hMusicController->EmptyPlaylist(); + + eina_list_free(m->elInfo); + m->elInfo = NULL; + + elm_genlist_clear(m->eoPlaylist); + + m_DestroySettingsPopup(); + m_UpdateEmptySongInfo(); + break; + + case EO_CANCEL: + m_DisableCheckAll(m->elInfo); + m_DisableEditButtons(true); + m_FromEditToPlaybackMode(); + break; + + case EO_DESELECT: + m_DisableCheckAll(m->elInfo); + m_DisableEditButtons(true); + elm_genlist_realized_items_update(m->eoPlaylist); + elm_object_focus_set(m->eoBtnEdit[BTN_CANCEL], EINA_TRUE); + break; + + case EO_DELETE: + m_DeleteSelectedItems(); + break; + + case EO_BTN_SETTINGS: + t_OnClickedSettings(obj); + break; + + case EO_BTN_SHUFFLE: + t_OnClickedShuffle(obj); + break; + + case EO_BTN_REPEAT: + t_OnClickedRepeat(obj); + break; + + case EO_BTN_PLAY: + t_OnClickedPlay(obj); + break; + + default: + break; + } +} + + +void CPlaybackView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) +{ + switch (id) { + case EO_CANCEL: + case EO_DESELECT: + case EO_DELETE: + case EO_SLIDER: + case EO_BTN_FORWARD: + case EO_BTN_PLAY: + case EO_BTN_REPEAT: + case EO_BTN_REWIND: + case EO_BTN_SETTINGS: + case EO_BTN_SHUFFLE: + case EO_EDIT_PLAYLIST: + case EO_CLEAR_PLAYLIST: + case EO_PLAYLIST: + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); + break; + + default: + break; + } +} + + +void CPlaybackView::OnPressed(int id, Evas_Object *obj) +{ + switch (id) { + case EO_BTN_FORWARD: + case EO_BTN_REWIND: + m_HandleOnPressed(obj); + break; + + default: + break; + } +} + + +void CPlaybackView::OnUnpressed(int id, Evas_Object *obj) +{ + switch (id) { + case EO_BTN_FORWARD: + case EO_BTN_REWIND: + m_HandleOnUnpressed(obj); + break; + + default: + break; + } +} + + +void CPlaybackView::OnChanged(int id, Evas_Object *obj) +{ + switch (id) { + case EO_SLIDER: + { + char *timestr = NULL; + int value; + + if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY) { + if (m->etSlider) + ecore_timer_freeze(m->etSlider); + } + + value = elm_slider_value_get(obj); + m->hMusicController->SetPosition(value); + timestr = _get_timestr_from_milseconds(value); + if (timestr) { + elm_object_part_text_set(m->eoBase, MUSIC_PART_PROGRESSTIME, + timestr); + free(timestr); + } + + if (m->hMusicController->PlayState() == PLAY_STATUS_PLAY) { + if (m->etSlider) + ecore_timer_thaw(m->etSlider); + } + } + break; + + default: + break; + } +} + + +void CPlaybackView::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + switch (id) { + case EO_PLAYLIST: + elm_object_item_signal_callback_add(item, + MUSIC_SIGNAL_CHECK_CLICKED, MUSIC_PLAYBACK_VIEW, + sm_CbGenlistItemCheckClicked, this); + break; + + default: + break; + } +} + + +void CPlaybackView::OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + switch (id) { + case EO_PLAYLIST: + elm_object_item_signal_callback_del(item, + MUSIC_SIGNAL_CHECK_CLICKED, MUSIC_PLAYBACK_VIEW, + sm_CbGenlistItemCheckClicked); + break; + + default: + break; + } +} + + +void CPlaybackView::OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + switch (id) { + case EO_PLAYLIST: + m_HandleGenlistItemActivated(obj, item); + break; + + default: + break; + } +} + + +void CPlaybackView::t_OnComplete(void) +{ + m_UpdateCurrentSongInfo(); +} + + +void CPlaybackView::t_OnError(void) +{ + m_CreateErrorPopup(); +} + + +void CPlaybackView::t_OnUsbConnected(void) +{ +} + + +void CPlaybackView::t_OnUpdateContent(void) +{ +} diff --git a/src/views/playlist-layout.cpp b/src/views/playlist-layout.cpp new file mode 100644 index 0000000..e63c0e5 --- /dev/null +++ b/src/views/playlist-layout.cpp @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "AppCommon.h" +#include "dbg.h" +#include "i18n.h" +#include "define.h" + +#include +#include "category_info.h" +#include "album_info.h" +#include "song_info.h" +#include "music-controller.h" +#include "LayoutMgr.h" +#include "entry-popup.h" +#include "common.h" +#include "common-ui.h" +#include "BaseView.h" +#include "ExtBaseLayout.h" +#include "ViewMgr.h" +#include "category-layout.h" +#include "base-view.h" +#include "playlist-layout.h" + + +struct SPlaylistLayout { +}; + + +void CPlaylistLayout::sm_CbEntryRename(void *dt, const char *name) +{ + CPlaylistLayout *root = (CPlaylistLayout*)dt; + + if (root) + root->m_OnEntryRename(name); +} + + +void CPlaylistLayout::m_OnEntryRename(const char *name) +{ + int id; + char *str = NULL; + + if (!name) + return; + + id = category_info_get_category_id(t.c_catinfo); + str = strdup(name); + + destroy_entry_popup(t.epopup); + t.epopup = NULL; + + if (CMusicController::GetInstance()->MediaExistPlaylist(str)) { + _create_message_box(Layout(), MUSIC_TEXT_INUSE_MSG); + elm_object_item_focus_set(t.focused_item, EINA_TRUE); + free(str); + return; + } + + if (!CMusicController::GetInstance()->MediaRenamePlaylist(id, str)) + _ERR(" Rename playlist failed "); + + t.depth = E_DEPTH_CATEGORY; + t_UpdateLayoutWithFocus(); +} + + +void CPlaylistLayout::m_PlaylistCtxtAction(EActionType type) +{ + category_info *catinfo = NULL; + int id; + const char *text = NULL; + + if (!t.ctxtinfo || !t.ctxtinfo->context) + return; + + catinfo = (category_info *)t.ctxtinfo->context; + + if (!CViewMgr::GetInstance()->PushView(MUSIC_BASE_VIEW, NULL)) { + _ERR(" viewmgr show failed "); + return; + } + + if (t.c_catinfo) { + category_info_destroy(t.c_catinfo); + t.c_catinfo = NULL; + } + t.c_catinfo = category_info_duplicate(catinfo); + + if (type == ACTION_TYPE_DELETE) { + id = category_info_get_category_id(catinfo); + if (!CMusicController::GetInstance()->MediaDeletePlaylist(id)) + _ERR(" Delete playlist failed "); + + t_UpdateLayout(false); + elm_object_focus_set(t.grid, EINA_TRUE); + + } + else if (type == ACTION_TYPE_RENAME) { + text = category_info_get_name(catinfo); + if (t.epopup) + destroy_entry_popup(t.epopup); + + t.epopup = create_entry_popup(t.base, text, sm_CbEntryRename, this); + + } + else if (type == ACTION_TYPE_ADDSONG) { + t.depth = E_DEPTH_SELECT_LIST; + t.sel_type = SELECT_ADD; + t_UpdateLayoutWithFocus(); + + } + else if (type == ACTION_TYPE_REMOVESONG) { + if (category_info_get_songcount(catinfo) == 0) { + elm_object_item_focus_set(t.focused_item, EINA_TRUE); + _create_message_box(Layout(), MUSIC_TEXT_NO_SONGS); + return; + } + t.depth = E_DEPTH_SELECT_LIST; + t.sel_type = SELECT_REMOVE; + t_UpdateLayoutWithFocus(); + + } + else { + elm_object_item_focus_set(t.focused_item, EINA_TRUE); + } +} + + +void CPlaylistLayout::t_HandleItemSelect(SCatItemInfo *itinfo) +{ + if (!itinfo) + return; + + if (itinfo->type == CAT_TYPE_PLAYLIST_NEW) { + t.depth = E_DEPTH_SELECT_LIST; + t.sel_type = SELECT_CREATE; + } + else { + t.c_catinfo = category_info_duplicate(itinfo->catinfo); + t.depth = E_DEPTH_SHOW_LIST; + } +} + + +bool CPlaylistLayout::t_GetMediaList(Eina_List **list) +{ + return CMusicController::GetInstance()->MediaGetList(LIST_TYPE_PLAYLISTS, NULL, list); +} + + +void CPlaylistLayout::t_OnCtxtUpdate(enum EActionType type, int lid) +{ + m_PlaylistCtxtAction(type); +} diff --git a/src/views/song-layout.cpp b/src/views/song-layout.cpp new file mode 100644 index 0000000..db8e9c1 --- /dev/null +++ b/src/views/song-layout.cpp @@ -0,0 +1,640 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "AppCommon.h" +#include "InputHandler.h" +#include "dbg.h" +#include "i18n.h" +#include "define.h" +#include "song_info.h" +#include "music-controller.h" +#include "LayoutMgr.h" +#include "common.h" +#include "common-ui.h" +#include "BaseView.h" +#include "ExtBaseLayout.h" +#include "ViewMgr.h" +#include "song-layout.h" +#include "base-view.h" + +struct SSongItemInfo { + SSongInfo *sinfo; + Elm_Object_Item *item; +}; + +struct SSongLayout { + Evas_Object *win; + Evas_Object *base; + Evas_Object *songlist; + Elm_Object_Item *focused_item; + Eina_List *slist; + Eina_List *it_infolist; + Elm_Genlist_Item_Class *item_class; + CMusicController *mhandle; + CLayoutMgr* mgr; + CViewMgr* vmgr; + SContentInfo *ctxtinfo; + char *uri; + CSongLayout *parent; + + class CHandlerGenlist : public CListenerMgr, public IMouseMoveListener, public IKeyDownListener { + public: + struct SCallback { + void(*cb)(void* cookie); + void* cookie; + }; + + private: + SSongLayout *m; + SCallback m_callback; + + private: + SSongItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item) + { + Eina_List *l; + SSongItemInfo *itinfo = NULL; + void *obj = NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SSongItemInfo *)obj; + if (itinfo->item == item) + return itinfo; + } + + return NULL; + } + + static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info) + { + CHandlerGenlist *root = (CHandlerGenlist*)data; + + if (root) + root->m_OnItemSelect(obj, event_info); + } + + void m_OnItemSelect(Evas_Object *obj, void *event_info) + { + SSongItemInfo *itinfo = NULL; + char *mediaId = NULL; + + itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + mediaId = song_info_get_media_id(itinfo->sinfo); + + m->mhandle->Stop(); + m->mhandle->UpdatePlaylist(m->slist, ADD_TYPE_FRESH); + m->mhandle->SetCurrentSong(mediaId); + + if (m_callback.cb) { + m_callback.cb(m_callback.cookie); + } + } + + static void sm_CbCtxtClose(void *dt) + { + CHandlerGenlist *root = (CHandlerGenlist*)dt; + + if (root) + root->m_OnCtxtClose(); + } + + void m_OnCtxtClose(void) + { + m->vmgr->PopView(); + m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); + elm_object_item_focus_set(m->focused_item, EINA_TRUE); + } + + static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) + { + CHandlerGenlist *root = (CHandlerGenlist*)dt; + + if (root) + root->m_OnCtxtUpdate(type, lid); + } + + void m_OnCtxtUpdate(EActionType type, int lid) + { + Eina_List *list = NULL; + EAddType mode; + + if (!m->ctxtinfo || !m->ctxtinfo->context) + return; + + if (type == ACTION_TYPE_ADDNEXT) + mode = ADD_TYPE_NEXT; + else + mode = ADD_TYPE_END; + + list = eina_list_append(list, m->ctxtinfo->context); + if (type == ACTION_TYPE_ADDTO) { + if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) + _ERR(" Adding songs to playlist failed "); + else + _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); + + return; + } + + m->mhandle->UpdatePlaylist(list, mode); + eina_list_free(list); + + if (type == ACTION_TYPE_PLAY) { + m->mhandle->Stop(); + m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context)); + } + + _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); + } + + void m_SortSongList(void) + { + int sort_type; + + int(*_sort_fn[])(const void *d1, const void *d2) = { + sortsongs_title_az, + sortsongs_title_za, + sortsongs_artist_az, + sortsongs_artist_za, + sortsongs_album_az, + sortsongs_album_za + }; + + sort_type = m->mhandle->SortType(); + + m->slist = eina_list_sort(m->slist, 0, _sort_fn[sort_type]); + } + + void m_EmptySongList(bool sort_flag) + { + if (m->songlist) + elm_genlist_clear(m->songlist); + + if (!sort_flag) { + eina_list_free(m->slist); + m->slist = NULL; + } + + eina_list_free(m->it_infolist); + m->it_infolist = NULL; + } + + public: + CHandlerGenlist(SSongLayout *ins) : + IMouseMoveListener(this), + IKeyDownListener(this) { + m = ins; + } + + virtual ~CHandlerGenlist() { + m_EmptySongList(false); + } + + void SetCallback(const SCallback* cb) { + m_callback = *cb; + } + + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { + Elm_Object_Item *item; + + item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL); + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); + } + + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { + Elm_Object_Item *it = NULL; + SContentInfo *ctxtinfo = NULL; + SSongItemInfo *itinfo = NULL; + + if (strcmp(ev->keyname, KEY_MENU)) + return; + + it = elm_object_focused_item_get(obj); + if (!it) { + _ERR(" unable to get focused item "); + return; + } + m->focused_item = it; + + if (m->ctxtinfo) { + free(m->ctxtinfo); + m->ctxtinfo = NULL; + } + + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; + + itinfo = m_FindItemInfoFromItem(m->it_infolist, it); + if (!itinfo) { + free(ctxtinfo); + return; + } + + ctxtinfo->type = CONTEXT_TYPE_SONG; + ctxtinfo->context = itinfo->sinfo; + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + + m->ctxtinfo = ctxtinfo; + + SParcel parcel; + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); + } + + void UpdateSongList(bool sort_flag) + { + bool r; + struct SSongInfo *sinfo; + void *obj; + Eina_List *l; + struct SSongItemInfo *itinfo; + Elm_Object_Item *item; + + /* Remove existing songlist and prepare afresh */ + m_EmptySongList(sort_flag); + + if (!sort_flag) { + r = m->mhandle->MediaGetList(LIST_TYPE_SONG, NULL, &(m->slist)); + if (r == false || eina_list_count(m->slist) == 0) { + _ERR(" Fetching song list from media failed "); + + m->parent->SetEmptyStatus(true); + return; + } + } + + m_SortSongList(); + + EINA_LIST_FOREACH(m->slist, l, obj) { + sinfo = (SSongInfo *)obj; + itinfo = (SSongItemInfo *)calloc(1, sizeof(*itinfo)); + if (!itinfo) + return; + + itinfo->sinfo = sinfo; + item = elm_genlist_item_append(m->songlist, m->item_class, + itinfo, NULL, ELM_GENLIST_ITEM_NONE, + sm_CbItemSelect, this); + itinfo->item = item; + m->it_infolist = eina_list_append(m->it_infolist, itinfo); + } + } + } *pHandlerGenlist; + + SSongLayout() { + memset(this, 0, sizeof(SSongLayout)); + pHandlerGenlist = new CHandlerGenlist(this); + } + + ~SSongLayout() { + delete pHandlerGenlist; + } +}; + + +char *CSongLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part) +{ + SSongItemInfo *itinfo = (SSongItemInfo *)data; + SSongInfo *sinfo = NULL; + char buf[MAX_LENGTH]; + char *timestr = NULL; + int duration; + int index; + + if (!itinfo || !obj) + return NULL; + + sinfo = itinfo->sinfo; + + snprintf(buf, sizeof(buf), "%s", MUSIC_STR_EMPTY); + + if (!strcmp(part, "elm.text")) { + index = elm_genlist_item_index_get(itinfo->item); + if ((index & 1) == 1) { + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_EVEN_ROW, MUSIC_BASE_VIEW); + } + else { + elm_object_item_signal_emit(itinfo->item, + MUSIC_SIGNAL_ODD_ROW, MUSIC_BASE_VIEW); + } + snprintf(buf, sizeof(buf), " %s", song_info_get_title(sinfo)); + } + else if (!strcmp(part, "elm.text1")) + snprintf(buf, sizeof(buf), "%s", song_info_get_artist(sinfo)); + else if (!strcmp(part, "elm.text2")) + snprintf(buf, sizeof(buf), "%s", song_info_get_album(sinfo)); + else if (!strcmp(part, "elm.text3")) { + if (song_info_get_duration(sinfo, &duration)) { + timestr = _get_timestr_from_milseconds(duration); + if (timestr) { + snprintf(buf, sizeof(buf), "%s", timestr); + free(timestr); + } + } + } + + if (strcmp(buf, MUSIC_STR_EMPTY)) + return strdup(buf); + + return NULL; +} + + +Evas_Object *CSongLayout::sm_CbGetListItemContent(void *data, Evas_Object *obj, const char *part) +{ + SSongItemInfo *itinfo = (SSongItemInfo *)data; + SSongInfo *sinfo = NULL; + Evas_Object *img = NULL; + char *path = NULL; + char buf[MAX_LENGTH]; + + if (!itinfo || !obj) + return NULL; + + sinfo = itinfo->sinfo; + + img = elm_image_add(obj); + if (!img) + return NULL; + elm_image_aspect_fixed_set(img, EINA_FALSE); + + if (!strcmp(part, "elm.swallow.icon")) { + path = song_info_get_thumb(sinfo); + if (path) + elm_image_file_set(img, path, "NULL"); + else { + snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, + MUSIC_IMAGE_DEFAULT_THUMB); + elm_image_file_set(img, buf, "NULL"); + } + } + + return img; +} + + +void CSongLayout::sm_CbRemoveListItem(void *data, Evas_Object *obj) +{ + free(data); +} + + +void CSongLayout::sm_CbSelectItem(void *cookie) +{ + CSongLayout *root = (CSongLayout *)cookie; + + if (root) + root->m_OnSelectItem(); +} + + +void CSongLayout::m_OnSelectItem(void) +{ + m_GotoPlayback(); +} + + +void CSongLayout::m_GotoPlayback(void) +{ + if (!m->vmgr->PushView(MUSIC_PLAYBACK_VIEW, NULL)) + _ERR(" viewmgr push view MUSIC_PLAYBACK_VIEW failed "); +} + + +void CSongLayout::m_GotoPlaybackUri(void) +{ + Eina_List *list = NULL; + SSongInfo *sinfo = m->mhandle->MediaSongByUri(m->uri); + if (!sinfo) { + _ERR(" Fetching song list from uri failed "); + return; + } + + list = eina_list_append(list, sinfo); + if (!list) + return; + + m->mhandle->UpdatePlaylist(list, ADD_TYPE_FRESH); + + eina_list_free(list); + + m_GotoPlayback(); +} + + +void CSongLayout::m_CreateSongList(void) +{ + Evas_Object *genlist = NULL; + Elm_Genlist_Item_Class *list_item = NULL; + + genlist = elm_genlist_add(Layout()); + if (!genlist) + return; + + elm_genlist_homogeneous_set(genlist, EINA_TRUE); + evas_object_size_hint_weight_set(genlist, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(Layout(), MUSIC_PART_SONGLIST, genlist); + m->pHandlerGenlist->Connect(genlist); + m->songlist = genlist; + + list_item = elm_genlist_item_class_new(); + if (!list_item) { + evas_object_del(genlist); + _ERR(" elm_genlist_item_class_new failed "); + return; + } + list_item->item_style = MUSIC_STYLE_SONGLIST; + list_item->func.text_get = sm_CbGetListItemText; + list_item->func.content_get = sm_CbGetListItemContent; + list_item->func.state_get = NULL; + list_item->func.del = sm_CbRemoveListItem; + m->item_class = list_item; + + m->pHandlerGenlist->UpdateSongList(false); +} + + +bool CSongLayout::Create(CLayoutMgr *mgr, const char *uri) +{ + ASSERT(!m); + + Evas_Object *base = NULL; + Evas_Object *win = NULL; + Evas_Object *layout = NULL; + CMusicController *mhandle = NULL; + CViewMgr *vmgr = NULL; + + if (!mgr) + return false; + + m = new SSongLayout; + if (!m) { + _ERR(" calloc failed "); + return false; + } + + vmgr = CViewMgr::GetInstance(); + if (!vmgr) { + _ERR(" get view mgr failed "); + delete m; + m = NULL; + return false; + } + + base = mgr->Base(); + if (!base) { + _ERR(" get base failed "); + delete m; + m = NULL; + return false; + } + + win = vmgr->Window(); + if (!win) { + _ERR(" vimewmgr get win failed "); + delete m; + m = NULL; + return false; + } + + mhandle = CMusicController::GetInstance(); + if (!mhandle) { + _ERR(" music controller get music instance failed "); + delete m; + m = NULL; + return false; + } + + layout = _add_base(base, MUSIC_SONG_LAYOUT); + if (!layout) { + _ERR(" get layout failed "); + delete m; + m = NULL; + return false; + } + + bool r = CExtBaseLayout::Create(layout); + if (!r) { + _ERR(" CBaseLayout creation failed "); + evas_object_del(layout); + delete m; + m = NULL; + return false; + } + + if (uri) { + m->uri = new char[strlen(uri) + 1]; + strcpy(m->uri, uri); + } + else { + m->uri = NULL; + } + + m->win = win; + m->base = base; + m->vmgr = vmgr; + m->mhandle = mhandle; + m->mgr = mgr; + m->parent = this; + + m_CreateSongList(); + + Connect(layout); + + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_FOCUS_UPDATE; + parcel.layoutId = MUSIC_SONG_LAYOUT; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + + SSongLayout::CHandlerGenlist::SCallback cb; + cb.cb = &sm_CbSelectItem; + cb.cookie = this; + m->pHandlerGenlist->SetCallback(&cb); + + return true; +} + +void CSongLayout::Destroy(void) +{ + ASSERT(m); + + CExtBaseLayout::Destroy(); + evas_object_del(Layout()); + + free(m->ctxtinfo); + delete[] m->uri; + delete m; + m = NULL; +} + + +void CSongLayout::t_OnShow(void) +{ + ASSERT(m); + + evas_object_show(Layout()); + + if (!m->uri) + return; + + m_GotoPlaybackUri(); + delete[] m->uri; + m->uri = NULL; +} + + +void CSongLayout::Update(bool focusFlag) +{ + ASSERT(m); + + if (!focusFlag) { + m->pHandlerGenlist->UpdateSongList(true); + return; + } + + elm_object_focus_set(m->songlist, EINA_TRUE); +} + + +void CSongLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) +{ + if (!strcmp(ev->keyname, KEY_BACK)) { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_FOCUS_UPDATE; + parcel.layoutId = NULL; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } +} \ No newline at end of file -- 2.7.4 From 76ec1148af44260f0c3a94e670494284f53724d4 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Thu, 29 Jan 2015 11:18:33 +0900 Subject: [PATCH 03/16] Fix build error due to deleting the folder "demosongs" Change-Id: Id971f09c18a1b86c01d8f253b7a86bda79d797cf Signed-off-by: Kim Tae Soo --- CMakeLists.txt | 8 ++++---- packaging/org.tizen.music-player-tv-ref.spec | 3 --- 2 files changed, 4 insertions(+), 7 deletions(-) mode change 100755 => 100644 packaging/org.tizen.music-player-tv-ref.spec diff --git a/CMakeLists.txt b/CMakeLists.txt index 518e81b..b790a64 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,9 +40,9 @@ ENDIF(NOT DEFINED IMAGEDIR) IF(NOT DEFINED MANIFESTDIR) SET(MANIFESTDIR "/usr/share/packages") ENDIF(NOT DEFINED MANIFESTDIR) -IF(NOT DEFINED MEDIA_AUDIO_DIR) - SET(MEDIA_AUDIO_DIR "/opt/usr/media/Sounds") -ENDIF(NOT DEFINED MEDIA_AUDIO_DIR) +#IF(NOT DEFINED MEDIA_AUDIO_DIR) +# SET(MEDIA_AUDIO_DIR "/opt/usr/media/Sounds") +#ENDIF(NOT DEFINED MEDIA_AUDIO_DIR) IF(NOT DEFINED DESKTOP_ICONDIR) SET(DESKTOP_ICONDIR "/usr/share/icons/default/small") ENDIF(NOT DEFINED DESKTOP_ICONDIR) @@ -126,7 +126,7 @@ INSTALL(FILES ${PACKAGE_NAME}.xml DESTINATION ${MANIFESTDIR}) INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/res/images DESTINATION ${RESDIR}) INSTALL(FILES ${CMAKE_SOURCE_DIR}/icons/${DESKTOP_ICON} DESTINATION ${DESKTOP_ICONDIR}) INSTALL(FILES ${CMAKE_SOURCE_DIR}/icons/${LANDSCAPE_ICON} DESTINATION ${DESKTOP_ICONDIR}) -INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/demosongs DESTINATION ${MEDIA_AUDIO_DIR}) +#INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/demosongs DESTINATION ${MEDIA_AUDIO_DIR}) #i18n ADD_SUBDIRECTORY(po) diff --git a/packaging/org.tizen.music-player-tv-ref.spec b/packaging/org.tizen.music-player-tv-ref.spec old mode 100755 new mode 100644 index cfec9df..e739785 --- a/packaging/org.tizen.music-player-tv-ref.spec +++ b/packaging/org.tizen.music-player-tv-ref.spec @@ -31,7 +31,6 @@ BuildRequires: gettext-devel %define _resdir %{_pkgdir}/res %define _localedir %{_resdir}/locale %define _manifestdir /usr/share/packages -%define _media_audiodir /opt/usr/media/Sounds %define _desktop_icondir /usr/share/icons/default/small %description @@ -47,7 +46,6 @@ cmake \ -DBINDIR=%{_bindir} \ -DLOCALEDIR=%{_localedir} \ -DMANIFESTDIR=%{_manifestdir} \ - -DMEDIA_AUDIO_DIR=%{_media_audiodir} \ -DDESKTOP_ICONDIR=%{_desktop_icondir} \ -DVERSION=%{version} @@ -66,6 +64,5 @@ rm -rf %{buildroot} %{_bindir}/* %{_resdir}/* %{_manifestdir}/%{name}.xml -%{_media_audiodir}/* %{_desktop_icondir}/%{name}.png %{_desktop_icondir}/%{name}_4x2.png -- 2.7.4 From c5c588e5178422782b329ef39aeab28f02cc14c9 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Fri, 30 Jan 2015 10:40:46 +0900 Subject: [PATCH 04/16] Fix build error due to delete API "audio_meta_get_title" Change-Id: I7c3060ac957fa4e34c9ada36dbcaa934734605f3 Signed-off-by: Kim Tae Soo --- src/data/mediadata.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/mediadata.cpp b/src/data/mediadata.cpp index fa7f38d..33b5608 100644 --- a/src/data/mediadata.cpp +++ b/src/data/mediadata.cpp @@ -287,7 +287,7 @@ bool CMediadata::m_HandleEachMediaData(media_info_h md_h) return false; } - if (audio_meta_get_title(audio_h, &(sinfo->title)) != + if (media_info_get_title(md_h, &(sinfo->title)) != MEDIA_CONTENT_ERROR_NONE) _ERR("audio title get error"); -- 2.7.4 From 613a23dac12d5b9f5968d42d98a14ac127397f2f Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Mon, 2 Feb 2015 10:32:39 +0900 Subject: [PATCH 05/16] Apply Modified Listener Change-Id: Id1c42a79f5f12494fbf85662fd5339b7de24933e Signed-off-by: Kim Tae Soo --- include/album-songs-layout.h | 26 +- include/song-layout.h | 26 +- src/views/album-songs-layout.cpp | 630 ++++++++++++++++++--------------------- src/views/song-layout.cpp | 537 ++++++++++++++++----------------- 4 files changed, 593 insertions(+), 626 deletions(-) diff --git a/include/album-songs-layout.h b/include/album-songs-layout.h index 373852d..4db5a4f 100644 --- a/include/album-songs-layout.h +++ b/include/album-songs-layout.h @@ -18,7 +18,10 @@ #define __ALBUM_SONGS_LAYOUT_H__ -class CAlbumSongsLayout : public CExtBaseLayout, public CListenerMgr, public IKeyDownListener { +struct SAlbumSongsItemInfo; + +class CAlbumSongsLayout : public CExtBaseLayout, public CListenerMgr, + public IKeyDownListener, public IMouseMoveListener, public IMouseClickedListener { private: struct SAlbumSongsLayout *m; @@ -27,7 +30,19 @@ private: static void sm_CbRemoveListItem(void *data, Evas_Object *obj); static void sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId); + static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid); + void m_OnCtxtUpdate(EActionType type, int lid); + + static void sm_CbCtxtClose(void *dt); + void m_OnCtxtClose(void); + + static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info); + void m_OnItemSelect(Evas_Object *obj, void *event_info); + private: + SAlbumSongsItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item); + void m_UpdateSongList(void); + void m_EmptySongList(void); inline int m_ConvertToMin(int milsec); void m_GotoPlayback(int mode, char *id); Evas_Object *m_AddAlbumCover(void); @@ -38,7 +53,12 @@ protected: virtual void t_OnShow(void); public: - CAlbumSongsLayout(const char *pLayoutId) : CExtBaseLayout(pLayoutId), IKeyDownListener(this), m(0) {} + CAlbumSongsLayout(const char *pLayoutId) : + CExtBaseLayout(pLayoutId), + IKeyDownListener(this), + IMouseMoveListener(this), + IMouseClickedListener(this), + m(0) {} virtual ~CAlbumSongsLayout() {} bool Create(CLayoutMgr *mgr); @@ -46,6 +66,8 @@ public: public: virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); + virtual void OnMouseClicked(int id, Evas_Object *obj); }; diff --git a/include/song-layout.h b/include/song-layout.h index fe1be2b..25e7d41 100644 --- a/include/song-layout.h +++ b/include/song-layout.h @@ -18,7 +18,10 @@ #define __SONG_LAYOUT_H__ -class CSongLayout : public CExtBaseLayout, public CListenerMgr, public IKeyDownListener { +struct SSongItemInfo; + +class CSongLayout : public CExtBaseLayout, public CListenerMgr, + public IKeyDownListener, public IMouseMoveListener { private: struct SSongLayout *m; @@ -28,10 +31,20 @@ private: static void sm_CbRemoveListItem(void *data, Evas_Object *obj); static void sm_CbGenlistKeyDown(void *dt, Evas *e, Evas_Object *obj, void *ei); - static void sm_CbSelectItem(void *cookie); - void m_OnSelectItem(void); + static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid); + void m_OnCtxtUpdate(EActionType type, int lid); + + static void sm_CbCtxtClose(void *dt); + void m_OnCtxtClose(void); + + static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info); + void m_OnItemSelect(Evas_Object *obj, void *event_info); private: + SSongItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item); + void m_UpdateSongList(bool sort_flag); + void m_SortSongList(void); + void m_EmptySongList(bool sort_flag); void m_GotoPlayback(void); void m_GotoPlaybackUri(void); void m_CreateSongList(void); @@ -40,7 +53,11 @@ protected: virtual void t_OnShow(void); public: - CSongLayout(const char *pLayoutId) : CExtBaseLayout(pLayoutId), IKeyDownListener(this), m(0) {} + CSongLayout(const char *pLayoutId) : + CExtBaseLayout(pLayoutId), + IKeyDownListener(this), + IMouseMoveListener(this), + m(0) {} virtual ~CSongLayout() {} bool Create(CLayoutMgr *mgr, const char *uri); @@ -50,6 +67,7 @@ public: public: virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); }; diff --git a/src/views/album-songs-layout.cpp b/src/views/album-songs-layout.cpp index 1364485..cc87998 100644 --- a/src/views/album-songs-layout.cpp +++ b/src/views/album-songs-layout.cpp @@ -37,10 +37,12 @@ #define TOTAL_ADD_BTNS 3 -enum EBtnType { - ABTN_PLAY, - ABTN_NEXT, - ABTN_LAST +enum EObjectType { + ALBUM_SONGS_PLAY_BUTTON, + ALBUM_SONGS_NEXT_BUTTON, + ALBUM_SONGS_LAST_BUTTON, + ALBUM_SONGS_LAYOUT, + ALBUM_SONGS_GENLIST, }; struct SAlbumSongsItemInfo { @@ -64,312 +66,11 @@ struct SAlbumSongsLayout { int total_duration; CAlbumSongsLayout *parent; - class CHandlerButton : public CListenerMgr, public IMouseMoveListener, public IMouseClickedListener { - public: - struct SCallback { - void(*gotoPlayBackView)(void* cookie, int mode, char *mediaId); - void* cookie; - }; - - private: - SAlbumSongsLayout *m; - - protected: - SCallback m_callback; - - public: - CHandlerButton(SAlbumSongsLayout *ins) : - IMouseMoveListener(this), - IMouseClickedListener(this) { - m = ins; - } - - void SetCallback(const SCallback* cb) { - m_callback = *cb; - } - - virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) - { - if (!obj) - return; - - if (!elm_object_focus_get(obj)) - elm_object_focus_set(obj, EINA_TRUE); - } - - virtual void OnMouseClicked(int id, Evas_Object *obj) { - EBtnType type = (EBtnType)id; - - switch (type) - { - case ABTN_PLAY: - if (m_callback.gotoPlayBackView) - m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_FRESH, NULL); - break; - - case ABTN_NEXT: - if (m_callback.gotoPlayBackView) - m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_NEXT, NULL); - break; - - case ABTN_LAST: - if (m_callback.gotoPlayBackView) - m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_END, NULL); - break; - - default: - _ERR("Invalid Button Type"); - ASSERT(0); - break; - } - } - } *pHandlerButton; - - class CHandlerGenlist : public CListenerMgr, public IMouseMoveListener, public IKeyDownListener { - public: - struct SCallback { - void(*gotoPlaybackView)(void* cookie, int mode, char *mediaId); - void* cookie; - }; - - private: - SAlbumSongsLayout *m; - SCallback m_callback; - - private: - SAlbumSongsItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item) - { - Eina_List *l = NULL; - SAlbumSongsItemInfo *itinfo = NULL; - void *obj = NULL; - - EINA_LIST_FOREACH(list, l, obj) { - itinfo = (SAlbumSongsItemInfo *)obj; - if (itinfo->item == item) - return itinfo; - } - - return NULL; - } - - static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) - { - CHandlerGenlist *root = (CHandlerGenlist*)dt; - - if (root) - root->m_OnCtxtUpdate(type, lid); - } - - void m_OnCtxtUpdate(EActionType type, int lid) - { - Eina_List *list = NULL; - EAddType mode; - - if (!m->ctxtinfo || !m->ctxtinfo->context) - return; - - if (type == ACTION_TYPE_ADDNEXT) - mode = ADD_TYPE_NEXT; - else - mode = ADD_TYPE_END; - - list = eina_list_append(list, m->ctxtinfo->context); - if (type == ACTION_TYPE_ADDTO) { - if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) - _ERR(" Adding songs to playlist failed "); - else - _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); - - return; - } - - m->mhandle->UpdatePlaylist(list, mode); - eina_list_free(list); - - if (type == ACTION_TYPE_PLAY) { - m->mhandle->Stop(); - m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context)); - } - - _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); - } - - static void sm_CbCtxtClose(void *dt) - { - CHandlerGenlist *root = (CHandlerGenlist*)dt; - - if (root) - root->m_OnCtxtClose(); - } - - void m_OnCtxtClose(void) - { - m->vmgr->PopView(); - m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); - elm_object_item_focus_set(m->focused_item, EINA_TRUE); - } - - static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info) - { - CHandlerGenlist *root = (CHandlerGenlist*)data; - - if (root) - root->m_OnItemSelect(obj, event_info); - } - - void m_OnItemSelect(Evas_Object *obj, void *event_info) - { - SAlbumSongsItemInfo *itinfo = NULL; - char *mediaId = NULL; - - itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info); - if (!itinfo) { - _ERR(" no item info found "); - return; - } - - mediaId = song_info_get_media_id(itinfo->sinfo); - - if (m_callback.gotoPlaybackView) { - m_callback.gotoPlaybackView(m_callback.cookie, ADD_TYPE_FRESH, mediaId); - } - } - - public: - CHandlerGenlist(SAlbumSongsLayout *ins) : - IMouseMoveListener(this), - IKeyDownListener(this) { - m = ins; - } - - virtual ~CHandlerGenlist() { - EmptySongList(); - } - - void SetCallback(const SCallback* cb) { - m_callback = *cb; - } - - virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { - Elm_Object_Item *item; - - item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x, - ev->cur.canvas.y, NULL); - - if (!elm_object_item_focus_get(item)) - elm_object_item_focus_set(item, EINA_TRUE); - } - - virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - Elm_Object_Item *it = NULL; - SContentInfo *ctxtinfo = NULL; - SAlbumSongsItemInfo *itinfo = NULL; - - if (strcmp(ev->keyname, KEY_MENU)) - return; - - it = elm_object_focused_item_get(obj); - if (!it) { - _ERR(" unable to get focused item "); - return; - } - m->focused_item = it; - - if (m->ctxtinfo) { - free(m->ctxtinfo); - m->ctxtinfo = NULL; - } - - ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); - if (!ctxtinfo) - return; - - itinfo = m_FindItemInfoFromItem(m->it_infolist, it); - if (!itinfo) { - free(ctxtinfo); - return; - } - - ctxtinfo->type = CONTEXT_TYPE_SONG; - ctxtinfo->context = itinfo->sinfo; - ctxtinfo->cbdata = this; - ctxtinfo->update = sm_CbCtxtUpdate; - ctxtinfo->close = sm_CbCtxtClose; - - m->ctxtinfo = ctxtinfo; - - SParcel parcel; - parcel.ctxtInfo = ctxtinfo; - if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) - _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); - } - - void UpdateSongList(void) - { - SSongInfo *sinfo = NULL; - void *obj = NULL; - Eina_List *l = NULL; - SAlbumSongsItemInfo *itinfo = NULL; - Elm_Object_Item *item = NULL; - int dur = 0; - album_info *alinfo = NULL; - - if (!m->songlist || !m->item_class) - return; - - /* Remove existing songlist and prepare afresh */ - EmptySongList(); - - alinfo = m->mhandle->CurrentAlbum(); - if (!m->mhandle->MediaGetList(LIST_TYPE_ALBUM_SONG, alinfo, &(m->slist))) { - _ERR(" Fetching song list from media failed "); - return; - } - - EINA_LIST_FOREACH(m->slist, l, obj) { - sinfo = (SSongInfo *)obj; - itinfo = (SAlbumSongsItemInfo *)calloc(1, sizeof(*itinfo)); - if (!itinfo) - return; - - itinfo->sinfo = sinfo; - item = elm_genlist_item_append(m->songlist, m->item_class, - itinfo, NULL, ELM_GENLIST_ITEM_NONE, sm_CbItemSelect, this); - itinfo->item = item; - m->it_infolist = eina_list_append(m->it_infolist, itinfo); - song_info_get_duration(sinfo, &dur); - m->total_duration = m->total_duration + dur; - } - } - - void EmptySongList(void) - { - if (m->songlist) - elm_genlist_clear(m->songlist); - - if (m->slist) { - eina_list_free(m->slist); - m->slist = NULL; - } - - if (m->it_infolist) { - eina_list_free(m->it_infolist); - m->it_infolist = NULL; - } - - m->total_duration = 0; - } - } *pHandlerGenlist; - SAlbumSongsLayout() { memset(this, 0, sizeof(SAlbumSongsLayout)); - pHandlerGenlist = new CHandlerGenlist(this); - pHandlerButton = new CHandlerButton(this); } ~SAlbumSongsLayout() { - delete pHandlerGenlist; - delete pHandlerButton; } }; @@ -437,11 +138,158 @@ void CAlbumSongsLayout::sm_CbRemoveListItem(void *data, Evas_Object *obj) } -void CAlbumSongsLayout::sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId) +void CAlbumSongsLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) { - CAlbumSongsLayout *root = (CAlbumSongsLayout *)cookie; + CAlbumSongsLayout *root = (CAlbumSongsLayout*)dt; + if (root) - root->m_GotoPlayback(mode, mediaId); + root->m_OnCtxtUpdate(type, lid); +} + +void CAlbumSongsLayout::m_OnCtxtUpdate(EActionType type, int lid) +{ + Eina_List *list = NULL; + EAddType mode; + + if (!m->ctxtinfo || !m->ctxtinfo->context) + return; + + if (type == ACTION_TYPE_ADDNEXT) + mode = ADD_TYPE_NEXT; + else + mode = ADD_TYPE_END; + + list = eina_list_append(list, m->ctxtinfo->context); + if (type == ACTION_TYPE_ADDTO) { + if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) + _ERR(" Adding songs to playlist failed "); + else + _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); + + return; + } + + m->mhandle->UpdatePlaylist(list, mode); + eina_list_free(list); + + if (type == ACTION_TYPE_PLAY) { + m->mhandle->Stop(); + m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context)); + } + + _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); +} + +void CAlbumSongsLayout::sm_CbCtxtClose(void *dt) +{ + CAlbumSongsLayout *root = (CAlbumSongsLayout*)dt; + + if (root) + root->m_OnCtxtClose(); +} + +void CAlbumSongsLayout::m_OnCtxtClose(void) +{ + m->vmgr->PopView(); + m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); + elm_object_item_focus_set(m->focused_item, EINA_TRUE); +} + +void CAlbumSongsLayout::sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info) +{ + CAlbumSongsLayout *root = (CAlbumSongsLayout*)data; + + if (root) + root->m_OnItemSelect(obj, event_info); +} + +void CAlbumSongsLayout::m_OnItemSelect(Evas_Object *obj, void *event_info) +{ + SAlbumSongsItemInfo *itinfo = NULL; + char *mediaId = NULL; + + itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + mediaId = song_info_get_media_id(itinfo->sinfo); + + m_GotoPlayback(ADD_TYPE_FRESH, mediaId); +} + + +SAlbumSongsItemInfo *CAlbumSongsLayout::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item) +{ + Eina_List *l = NULL; + SAlbumSongsItemInfo *itinfo = NULL; + void *obj = NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SAlbumSongsItemInfo *)obj; + if (itinfo->item == item) + return itinfo; + } + + return NULL; +} + + +void CAlbumSongsLayout::m_UpdateSongList(void) +{ + SSongInfo *sinfo = NULL; + void *obj = NULL; + Eina_List *l = NULL; + SAlbumSongsItemInfo *itinfo = NULL; + Elm_Object_Item *item = NULL; + int dur = 0; + album_info *alinfo = NULL; + + if (!m->songlist || !m->item_class) + return; + + /* Remove existing songlist and prepare afresh */ + m_EmptySongList(); + + alinfo = m->mhandle->CurrentAlbum(); + if (!m->mhandle->MediaGetList(LIST_TYPE_ALBUM_SONG, alinfo, &(m->slist))) { + _ERR(" Fetching song list from media failed "); + return; + } + + EINA_LIST_FOREACH(m->slist, l, obj) { + sinfo = (SSongInfo *)obj; + itinfo = (SAlbumSongsItemInfo *)calloc(1, sizeof(*itinfo)); + if (!itinfo) + return; + + itinfo->sinfo = sinfo; + item = elm_genlist_item_append(m->songlist, m->item_class, + itinfo, NULL, ELM_GENLIST_ITEM_NONE, sm_CbItemSelect, this); + itinfo->item = item; + m->it_infolist = eina_list_append(m->it_infolist, itinfo); + song_info_get_duration(sinfo, &dur); + m->total_duration = m->total_duration + dur; + } +} + +void CAlbumSongsLayout::m_EmptySongList(void) +{ + if (m->songlist) + elm_genlist_clear(m->songlist); + + if (m->slist) { + eina_list_free(m->slist); + m->slist = NULL; + } + + if (m->it_infolist) { + eina_list_free(m->it_infolist); + m->it_infolist = NULL; + } + + m->total_duration = 0; } @@ -511,20 +359,20 @@ void CAlbumSongsLayout::m_CreateTopSection(void) SBtnInfo btninfo[TOTAL_ADD_BTNS]; Evas_Object *layout = Layout(); - btninfo[ABTN_PLAY].name = MUSIC_STR_PLAY; - btninfo[ABTN_PLAY].part = MUSIC_PART_ALBUM_PLAYBTN; - btninfo[ABTN_PLAY].style = MUSIC_STYLE_ADD_PLAY_BTN; - btninfo[ABTN_PLAY].icon = MUSIC_IMAGE_ADD_PLAY; + btninfo[ALBUM_SONGS_PLAY_BUTTON].name = MUSIC_STR_PLAY; + btninfo[ALBUM_SONGS_PLAY_BUTTON].part = MUSIC_PART_ALBUM_PLAYBTN; + btninfo[ALBUM_SONGS_PLAY_BUTTON].style = MUSIC_STYLE_ADD_PLAY_BTN; + btninfo[ALBUM_SONGS_PLAY_BUTTON].icon = MUSIC_IMAGE_ADD_PLAY; - btninfo[ABTN_NEXT].name = MUSIC_STR_ADDNEXT; - btninfo[ABTN_NEXT].part = MUSIC_PART_ALBUM_NEXTBTN; - btninfo[ABTN_NEXT].style = MUSIC_STYLE_ADD_NEXT_BTN; - btninfo[ABTN_NEXT].icon = MUSIC_IMAGE_ADD_NEXT; + btninfo[ALBUM_SONGS_NEXT_BUTTON].name = MUSIC_STR_ADDNEXT; + btninfo[ALBUM_SONGS_NEXT_BUTTON].part = MUSIC_PART_ALBUM_NEXTBTN; + btninfo[ALBUM_SONGS_NEXT_BUTTON].style = MUSIC_STYLE_ADD_NEXT_BTN; + btninfo[ALBUM_SONGS_NEXT_BUTTON].icon = MUSIC_IMAGE_ADD_NEXT; - btninfo[ABTN_LAST].name = MUSIC_STR_ADDLAST; - btninfo[ABTN_LAST].part = MUSIC_PART_ALBUM_LASTBTN; - btninfo[ABTN_LAST].style = MUSIC_STYLE_ADD_LAST_BTN; - btninfo[ABTN_LAST].icon = MUSIC_IMAGE_ADD_LAST; + btninfo[ALBUM_SONGS_LAST_BUTTON].name = MUSIC_STR_ADDLAST; + btninfo[ALBUM_SONGS_LAST_BUTTON].part = MUSIC_PART_ALBUM_LASTBTN; + btninfo[ALBUM_SONGS_LAST_BUTTON].style = MUSIC_STYLE_ADD_LAST_BTN; + btninfo[ALBUM_SONGS_LAST_BUTTON].icon = MUSIC_IMAGE_ADD_LAST; thumb = m_AddAlbumCover(); if (!thumb) @@ -540,7 +388,7 @@ void CAlbumSongsLayout::m_CreateTopSection(void) elm_object_text_set(btn[i], _(btninfo[i].name)); elm_object_style_set(btn[i], btninfo[i].style); - m->pHandlerButton->Connect(btn[i], i); + Connect(btn[i], i, TYPE_MOUSE_MOVE | TYPE_CLICKED); img = elm_image_add(btn[i]); if (img) { @@ -601,7 +449,7 @@ void CAlbumSongsLayout::m_CreateSongList(void) evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_object_part_content_set(layout, MUSIC_PART_SONGLIST, genlist); - m->pHandlerGenlist->Connect(genlist); + Connect(genlist, ALBUM_SONGS_GENLIST, TYPE_MOUSE_MOVE | TYPE_KEY_DOWN); m->songlist = genlist; list_item = elm_genlist_item_class_new(); @@ -617,7 +465,7 @@ void CAlbumSongsLayout::m_CreateSongList(void) list_item->func.del = sm_CbRemoveListItem; m->item_class = list_item; - m->pHandlerGenlist->UpdateSongList(); + m_UpdateSongList(); } @@ -696,17 +544,7 @@ bool CAlbumSongsLayout::Create(CLayoutMgr *mgr) m->mgr = mgr; m->parent = this; - Connect(layout); - - SAlbumSongsLayout::CHandlerGenlist::SCallback listCb; - listCb.gotoPlaybackView = &sm_CbGoToPlaybackView; - listCb.cookie = this; - m->pHandlerGenlist->SetCallback(&listCb); - - SAlbumSongsLayout::CHandlerButton::SCallback btnCb; - btnCb.gotoPlayBackView = &sm_CbGoToPlaybackView; - btnCb.cookie = this; - m->pHandlerButton->SetCallback(&btnCb); + Connect(layout, ALBUM_SONGS_LAYOUT, TYPE_KEY_DOWN); return true; } @@ -715,7 +553,7 @@ void CAlbumSongsLayout::Destroy(void) { ASSERT(m); - m->pHandlerGenlist->EmptySongList(); + m_EmptySongList(); CExtBaseLayout::Destroy(); evas_object_del(Layout()); @@ -729,7 +567,7 @@ void CAlbumSongsLayout::t_OnShow(void) { ASSERT(m); - m->pHandlerGenlist->EmptySongList(); + m_EmptySongList(); m_CreateSongList(); m_CreateTopSection(); @@ -747,12 +585,118 @@ void CAlbumSongsLayout::t_OnShow(void) void CAlbumSongsLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - if (!strcmp(ev->keyname, KEY_BACK)) { - SParcel parcel; - parcel.ctxtInfo = NULL; - parcel.updateType = E_DEPTH_UPDATE; - parcel.layoutId = MUSIC_ALBUM_SONGS_LAYOUT; - parcel.keyEvent = NULL; - m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + switch (id) + { + case ALBUM_SONGS_LAYOUT: + if (!strcmp(ev->keyname, KEY_BACK)) { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_DEPTH_UPDATE; + parcel.layoutId = MUSIC_ALBUM_SONGS_LAYOUT; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + break; + + case ALBUM_SONGS_GENLIST: + { + Elm_Object_Item *it = NULL; + SContentInfo *ctxtinfo = NULL; + SAlbumSongsItemInfo *itinfo = NULL; + + if (strcmp(ev->keyname, KEY_MENU)) + return; + + it = elm_object_focused_item_get(obj); + if (!it) { + _ERR(" unable to get focused item "); + return; + } + m->focused_item = it; + + if (m->ctxtinfo) { + free(m->ctxtinfo); + m->ctxtinfo = NULL; + } + + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; + + itinfo = m_FindItemInfoFromItem(m->it_infolist, it); + if (!itinfo) { + free(ctxtinfo); + return; + } + + ctxtinfo->type = CONTEXT_TYPE_SONG; + ctxtinfo->context = itinfo->sinfo; + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + + m->ctxtinfo = ctxtinfo; + + SParcel parcel; + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); + } + break; + + default: + break; + } +} + + +void CAlbumSongsLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) +{ + switch (id) { + case ALBUM_SONGS_GENLIST: + { + Elm_Object_Item *item; + + item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL); + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); + } + break; + + case ALBUM_SONGS_PLAY_BUTTON: + case ALBUM_SONGS_NEXT_BUTTON: + case ALBUM_SONGS_LAST_BUTTON: + { + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); + } + break; + + default: + break; + } +} + + +void CAlbumSongsLayout::OnMouseClicked(int id, Evas_Object *obj) +{ + switch (id) + { + case ALBUM_SONGS_PLAY_BUTTON: + m_GotoPlayback(ADD_TYPE_FRESH, NULL); + break; + + case ALBUM_SONGS_NEXT_BUTTON: + m_GotoPlayback(ADD_TYPE_NEXT, NULL); + break; + + case ALBUM_SONGS_LAST_BUTTON: + m_GotoPlayback(ADD_TYPE_END, NULL); + break; + + default: + break; } } \ No newline at end of file diff --git a/src/views/song-layout.cpp b/src/views/song-layout.cpp index db8e9c1..36f763d 100644 --- a/src/views/song-layout.cpp +++ b/src/views/song-layout.cpp @@ -33,6 +33,12 @@ #include "song-layout.h" #include "base-view.h" + +enum EObjectType { + SONG_LAYOUT, + SONG_LAYOUT_GENLIST, +}; + struct SSongItemInfo { SSongInfo *sinfo; Elm_Object_Item *item; @@ -53,268 +59,11 @@ struct SSongLayout { char *uri; CSongLayout *parent; - class CHandlerGenlist : public CListenerMgr, public IMouseMoveListener, public IKeyDownListener { - public: - struct SCallback { - void(*cb)(void* cookie); - void* cookie; - }; - - private: - SSongLayout *m; - SCallback m_callback; - - private: - SSongItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item) - { - Eina_List *l; - SSongItemInfo *itinfo = NULL; - void *obj = NULL; - - EINA_LIST_FOREACH(list, l, obj) { - itinfo = (SSongItemInfo *)obj; - if (itinfo->item == item) - return itinfo; - } - - return NULL; - } - - static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info) - { - CHandlerGenlist *root = (CHandlerGenlist*)data; - - if (root) - root->m_OnItemSelect(obj, event_info); - } - - void m_OnItemSelect(Evas_Object *obj, void *event_info) - { - SSongItemInfo *itinfo = NULL; - char *mediaId = NULL; - - itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info); - if (!itinfo) { - _ERR(" no item info found "); - return; - } - - mediaId = song_info_get_media_id(itinfo->sinfo); - - m->mhandle->Stop(); - m->mhandle->UpdatePlaylist(m->slist, ADD_TYPE_FRESH); - m->mhandle->SetCurrentSong(mediaId); - - if (m_callback.cb) { - m_callback.cb(m_callback.cookie); - } - } - - static void sm_CbCtxtClose(void *dt) - { - CHandlerGenlist *root = (CHandlerGenlist*)dt; - - if (root) - root->m_OnCtxtClose(); - } - - void m_OnCtxtClose(void) - { - m->vmgr->PopView(); - m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); - elm_object_item_focus_set(m->focused_item, EINA_TRUE); - } - - static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) - { - CHandlerGenlist *root = (CHandlerGenlist*)dt; - - if (root) - root->m_OnCtxtUpdate(type, lid); - } - - void m_OnCtxtUpdate(EActionType type, int lid) - { - Eina_List *list = NULL; - EAddType mode; - - if (!m->ctxtinfo || !m->ctxtinfo->context) - return; - - if (type == ACTION_TYPE_ADDNEXT) - mode = ADD_TYPE_NEXT; - else - mode = ADD_TYPE_END; - - list = eina_list_append(list, m->ctxtinfo->context); - if (type == ACTION_TYPE_ADDTO) { - if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) - _ERR(" Adding songs to playlist failed "); - else - _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); - - return; - } - - m->mhandle->UpdatePlaylist(list, mode); - eina_list_free(list); - - if (type == ACTION_TYPE_PLAY) { - m->mhandle->Stop(); - m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context)); - } - - _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); - } - - void m_SortSongList(void) - { - int sort_type; - - int(*_sort_fn[])(const void *d1, const void *d2) = { - sortsongs_title_az, - sortsongs_title_za, - sortsongs_artist_az, - sortsongs_artist_za, - sortsongs_album_az, - sortsongs_album_za - }; - - sort_type = m->mhandle->SortType(); - - m->slist = eina_list_sort(m->slist, 0, _sort_fn[sort_type]); - } - - void m_EmptySongList(bool sort_flag) - { - if (m->songlist) - elm_genlist_clear(m->songlist); - - if (!sort_flag) { - eina_list_free(m->slist); - m->slist = NULL; - } - - eina_list_free(m->it_infolist); - m->it_infolist = NULL; - } - - public: - CHandlerGenlist(SSongLayout *ins) : - IMouseMoveListener(this), - IKeyDownListener(this) { - m = ins; - } - - virtual ~CHandlerGenlist() { - m_EmptySongList(false); - } - - void SetCallback(const SCallback* cb) { - m_callback = *cb; - } - - virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { - Elm_Object_Item *item; - - item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x, - ev->cur.canvas.y, NULL); - - if (!elm_object_item_focus_get(item)) - elm_object_item_focus_set(item, EINA_TRUE); - } - - virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - Elm_Object_Item *it = NULL; - SContentInfo *ctxtinfo = NULL; - SSongItemInfo *itinfo = NULL; - - if (strcmp(ev->keyname, KEY_MENU)) - return; - - it = elm_object_focused_item_get(obj); - if (!it) { - _ERR(" unable to get focused item "); - return; - } - m->focused_item = it; - - if (m->ctxtinfo) { - free(m->ctxtinfo); - m->ctxtinfo = NULL; - } - - ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); - if (!ctxtinfo) - return; - - itinfo = m_FindItemInfoFromItem(m->it_infolist, it); - if (!itinfo) { - free(ctxtinfo); - return; - } - - ctxtinfo->type = CONTEXT_TYPE_SONG; - ctxtinfo->context = itinfo->sinfo; - ctxtinfo->cbdata = this; - ctxtinfo->update = sm_CbCtxtUpdate; - ctxtinfo->close = sm_CbCtxtClose; - - m->ctxtinfo = ctxtinfo; - - SParcel parcel; - parcel.ctxtInfo = ctxtinfo; - if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) - _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); - } - - void UpdateSongList(bool sort_flag) - { - bool r; - struct SSongInfo *sinfo; - void *obj; - Eina_List *l; - struct SSongItemInfo *itinfo; - Elm_Object_Item *item; - - /* Remove existing songlist and prepare afresh */ - m_EmptySongList(sort_flag); - - if (!sort_flag) { - r = m->mhandle->MediaGetList(LIST_TYPE_SONG, NULL, &(m->slist)); - if (r == false || eina_list_count(m->slist) == 0) { - _ERR(" Fetching song list from media failed "); - - m->parent->SetEmptyStatus(true); - return; - } - } - - m_SortSongList(); - - EINA_LIST_FOREACH(m->slist, l, obj) { - sinfo = (SSongInfo *)obj; - itinfo = (SSongItemInfo *)calloc(1, sizeof(*itinfo)); - if (!itinfo) - return; - - itinfo->sinfo = sinfo; - item = elm_genlist_item_append(m->songlist, m->item_class, - itinfo, NULL, ELM_GENLIST_ITEM_NONE, - sm_CbItemSelect, this); - itinfo->item = item; - m->it_infolist = eina_list_append(m->it_infolist, itinfo); - } - } - } *pHandlerGenlist; - SSongLayout() { memset(this, 0, sizeof(SSongLayout)); - pHandlerGenlist = new CHandlerGenlist(this); } ~SSongLayout() { - delete pHandlerGenlist; } }; @@ -407,21 +156,184 @@ void CSongLayout::sm_CbRemoveListItem(void *data, Evas_Object *obj) } -void CSongLayout::sm_CbSelectItem(void *cookie) +void CSongLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) { - CSongLayout *root = (CSongLayout *)cookie; + CSongLayout *root = (CSongLayout *)dt; if (root) - root->m_OnSelectItem(); + root->m_OnCtxtUpdate(type, lid); } -void CSongLayout::m_OnSelectItem(void) +void CSongLayout::m_OnCtxtUpdate(EActionType type, int lid) { + Eina_List *list = NULL; + EAddType mode; + + if (!m->ctxtinfo || !m->ctxtinfo->context) + return; + + if (type == ACTION_TYPE_ADDNEXT) + mode = ADD_TYPE_NEXT; + else + mode = ADD_TYPE_END; + + list = eina_list_append(list, m->ctxtinfo->context); + if (type == ACTION_TYPE_ADDTO) { + if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) + _ERR(" Adding songs to playlist failed "); + else + _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); + + return; + } + + m->mhandle->UpdatePlaylist(list, mode); + eina_list_free(list); + + if (type == ACTION_TYPE_PLAY) { + m->mhandle->Stop(); + m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context)); + } + + _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); +} + + +void CSongLayout::sm_CbCtxtClose(void *dt) +{ + CSongLayout *root = (CSongLayout *)dt; + + if (root) + root->m_OnCtxtClose(); +} + + +void CSongLayout::m_OnCtxtClose(void) +{ + m->vmgr->PopView(); + m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); + elm_object_item_focus_set(m->focused_item, EINA_TRUE); +} + + +void CSongLayout::sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info) +{ + CSongLayout *root = (CSongLayout*)data; + + if (root) + root->m_OnItemSelect(obj, event_info); +} + +void CSongLayout::m_OnItemSelect(Evas_Object *obj, void *event_info) +{ + SSongItemInfo *itinfo = NULL; + char *mediaId = NULL; + + itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + mediaId = song_info_get_media_id(itinfo->sinfo); + + m->mhandle->Stop(); + m->mhandle->UpdatePlaylist(m->slist, ADD_TYPE_FRESH); + m->mhandle->SetCurrentSong(mediaId); + m_GotoPlayback(); } +SSongItemInfo *CSongLayout::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item) +{ + Eina_List *l; + SSongItemInfo *itinfo = NULL; + void *obj = NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SSongItemInfo *)obj; + if (itinfo->item == item) + return itinfo; + } + + return NULL; +} + + +void CSongLayout::m_UpdateSongList(bool sort_flag) +{ + bool r; + struct SSongInfo *sinfo; + void *obj; + Eina_List *l; + struct SSongItemInfo *itinfo; + Elm_Object_Item *item; + + /* Remove existing songlist and prepare afresh */ + m_EmptySongList(sort_flag); + + if (!sort_flag) { + r = m->mhandle->MediaGetList(LIST_TYPE_SONG, NULL, &(m->slist)); + if (r == false || eina_list_count(m->slist) == 0) { + _ERR(" Fetching song list from media failed "); + + m->parent->SetEmptyStatus(true); + return; + } + } + + m_SortSongList(); + + EINA_LIST_FOREACH(m->slist, l, obj) { + sinfo = (SSongInfo *)obj; + itinfo = (SSongItemInfo *)calloc(1, sizeof(*itinfo)); + if (!itinfo) + return; + + itinfo->sinfo = sinfo; + item = elm_genlist_item_append(m->songlist, m->item_class, + itinfo, NULL, ELM_GENLIST_ITEM_NONE, + sm_CbItemSelect, this); + itinfo->item = item; + m->it_infolist = eina_list_append(m->it_infolist, itinfo); + } +} + +void CSongLayout::m_SortSongList(void) +{ + int sort_type; + + int(*_sort_fn[])(const void *d1, const void *d2) = { + sortsongs_title_az, + sortsongs_title_za, + sortsongs_artist_az, + sortsongs_artist_za, + sortsongs_album_az, + sortsongs_album_za + }; + + sort_type = m->mhandle->SortType(); + + m->slist = eina_list_sort(m->slist, 0, _sort_fn[sort_type]); +} + +void CSongLayout::m_EmptySongList(bool sort_flag) +{ + if (m->songlist) + elm_genlist_clear(m->songlist); + + if (!sort_flag) { + eina_list_free(m->slist); + m->slist = NULL; + } + + eina_list_free(m->it_infolist); + m->it_infolist = NULL; +} + + void CSongLayout::m_GotoPlayback(void) { if (!m->vmgr->PushView(MUSIC_PLAYBACK_VIEW, NULL)) @@ -463,7 +375,7 @@ void CSongLayout::m_CreateSongList(void) evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_object_part_content_set(Layout(), MUSIC_PART_SONGLIST, genlist); - m->pHandlerGenlist->Connect(genlist); + Connect(genlist, SONG_LAYOUT_GENLIST, TYPE_MOUSE_MOVE | TYPE_KEY_DOWN); m->songlist = genlist; list_item = elm_genlist_item_class_new(); @@ -479,7 +391,7 @@ void CSongLayout::m_CreateSongList(void) list_item->func.del = sm_CbRemoveListItem; m->item_class = list_item; - m->pHandlerGenlist->UpdateSongList(false); + m_UpdateSongList(false); } @@ -568,7 +480,7 @@ bool CSongLayout::Create(CLayoutMgr *mgr, const char *uri) m_CreateSongList(); - Connect(layout); + Connect(layout, SONG_LAYOUT, TYPE_KEY_DOWN); SParcel parcel; parcel.ctxtInfo = NULL; @@ -577,11 +489,6 @@ bool CSongLayout::Create(CLayoutMgr *mgr, const char *uri) parcel.keyEvent = NULL; m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); - SSongLayout::CHandlerGenlist::SCallback cb; - cb.cb = &sm_CbSelectItem; - cb.cookie = this; - m->pHandlerGenlist->SetCallback(&cb); - return true; } @@ -619,7 +526,7 @@ void CSongLayout::Update(bool focusFlag) ASSERT(m); if (!focusFlag) { - m->pHandlerGenlist->UpdateSongList(true); + m_UpdateSongList(true); return; } @@ -629,12 +536,88 @@ void CSongLayout::Update(bool focusFlag) void CSongLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - if (!strcmp(ev->keyname, KEY_BACK)) { - SParcel parcel; - parcel.ctxtInfo = NULL; - parcel.updateType = E_FOCUS_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; - m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + switch (id) { + case SONG_LAYOUT: + { + if (!strcmp(ev->keyname, KEY_BACK)) { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_FOCUS_UPDATE; + parcel.layoutId = NULL; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + } + break; + + case SONG_LAYOUT_GENLIST: + { + Elm_Object_Item *it = NULL; + SContentInfo *ctxtinfo = NULL; + SSongItemInfo *itinfo = NULL; + + if (strcmp(ev->keyname, KEY_MENU)) + return; + + it = elm_object_focused_item_get(obj); + if (!it) { + _ERR(" unable to get focused item "); + return; + } + m->focused_item = it; + + if (m->ctxtinfo) { + free(m->ctxtinfo); + m->ctxtinfo = NULL; + } + + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; + + itinfo = m_FindItemInfoFromItem(m->it_infolist, it); + if (!itinfo) { + free(ctxtinfo); + return; + } + + ctxtinfo->type = CONTEXT_TYPE_SONG; + ctxtinfo->context = itinfo->sinfo; + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + + m->ctxtinfo = ctxtinfo; + + SParcel parcel; + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); + } + break; + + default: + break; + } +} + + +void CSongLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) +{ + switch (id) { + case SONG_LAYOUT_GENLIST: + { + Elm_Object_Item *item; + + item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL); + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); + } + break; + + default: + break; } } \ No newline at end of file -- 2.7.4 From 070a2012b8ac0504c49f2e6b3e2d22d09945f861 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Mon, 2 Feb 2015 11:33:58 +0900 Subject: [PATCH 06/16] Apply Modified Listeners Change-Id: I7b216d149b2b5658852c33edd3b18dc6f4daa977 Signed-off-by: Kim Tae Soo --- include/base-view.h | 40 +- include/folder-layout.h | 39 +- src/main.cpp | 4 +- src/views/base-view.cpp | 887 +++++++++++++++++++++----------------------- src/views/folder-layout.cpp | 673 +++++++++++++++------------------ 5 files changed, 784 insertions(+), 859 deletions(-) diff --git a/include/base-view.h b/include/base-view.h index ecd0738..52f7985 100644 --- a/include/base-view.h +++ b/include/base-view.h @@ -18,15 +18,17 @@ #define __MUSIC_BASE_VIEW_H__ -struct _arg_list { +struct SArgList { char *album_id; char *uri; char *source; }; -class CMusicBaseView : public CBaseView, public CListenerMgr, public IKeyDownListener, public IKeyUpListener, - IMusicControllerListener +class CMusicBaseView : public CBaseView, public CListenerMgr, + public IKeyDownListener, public IKeyUpListener, + public IMouseMoveListener, public IMouseClickedListener, + public IMusicControllerListener { private: struct SMusicBaseView* m; @@ -35,22 +37,27 @@ private: static void sm_CbHandleEmptyStatus(void *cookie, bool emptyStatus); void m_OnHandleEmptyStatus(bool emptyStatus); + static void sm_CbCtxPopupBtnClicked(void *dt, Evas_Object *obj, void *ev); + void m_CbCtxPopupBtnClicked(Evas_Object *obj, void *ev); + + static void sm_CbCtxPopupBtnKeyPressed(void *dt, Evas *e, Evas_Object *obj, void *ei); + void m_OnCtxPopupBtnKeyPressed(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); + private: void m_UpdateFocusSequence(void); void m_UpdateEmptyFocusSequence(void); - static void sm_CbClickedGroupBtn(void *cookie, Evas_Object *obj); - void m_OnClickedGroupBtn(Evas_Object *obj); - - static void sm_CbClickedCtxBtn(void *cookie, Evas_Object *obj); - void m_OnClickedCtxBtn(Evas_Object *obj); - void m_ShowCurrentLayout(void); + void m_GotoPlayback(void); + static bool sm_FindIndex(const char **arr, int arrsize, const char *text, int *index); - void m_DestroyPopup(void); + void m_CreateCtxPopup(int btnType); void m_DestroyCtxPopup(void); + Evas_Object *m_CreateLoadingPopup(void); + void m_DestroyPopup(void); + void m_UpdatePlaysongLabel(void); void m_AddPlaysongLabel(void); void m_CreateTopSection(void); @@ -66,7 +73,13 @@ protected: virtual void t_OnUpdate(void* data); public: - CMusicBaseView(const char *pViewId) : CBaseView(pViewId), IKeyDownListener(this), IKeyUpListener(this), m(0) {} + CMusicBaseView(const char *pViewId) : + CBaseView(pViewId), + IKeyDownListener(this), + IKeyUpListener(this), + IMouseMoveListener(this), + IMouseClickedListener(this), + m(0) {} virtual ~CMusicBaseView() {} virtual bool Create(void *data); @@ -75,12 +88,13 @@ public: virtual Evas_Object* Base(void); public: - virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev); + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); + virtual void OnMouseClicked(int id, Evas_Object *obj); -protected: +protected: virtual void t_OnComplete(void); virtual void t_OnError(void); virtual void t_OnUsbConnected(void); diff --git a/include/folder-layout.h b/include/folder-layout.h index 7d842bc..6b33728 100644 --- a/include/folder-layout.h +++ b/include/folder-layout.h @@ -21,33 +21,37 @@ struct SFolderItemInfo; struct folder_info; -class CFolderLayout : public CExtBaseLayout, public CListenerMgr, public IKeyDownListener { +class CFolderLayout : public CExtBaseLayout, public CListenerMgr, + public IMouseMoveListener, public IMouseClickedListener, + public IRealizedListener, public IUnrealizedListener, + public IKeyDownListener { private: struct SFolderLayout *m; private: - static Eina_Bool sm_CbFocusIdler(void *dt); - static void sm_CbGoToContextView(void *cookie, SContentInfo *contextInfo); - static void sm_CbUpdateGrid(void *cookie); - static void sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId); - static char *sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part); static char *sm_CbGetGridSongItemText(void *data, Evas_Object *obj, const char *part); static Evas_Object *sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part); static Evas_Object *sm_CbGetGridSongItemContent(void *data, Evas_Object *obj, const char *part); static void sm_CbRemoveGridItem(void *data, Evas_Object *obj); -private: + static Eina_Bool sm_CbFocusIdler(void *dt); void m_OnFocusIdler(void); - void m_OnGotoPlaybackView(char *mediaId); - void m_OnGotoContextView(SContentInfo *contextInfo); - void m_OnCbUpdateGrid(void); + + static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid); + void m_OnCtxtUpdate(EActionType type, int lid); + + static void sm_CbCtxtClose(void *dt); + void m_OnCtxtClose(void); + + static void sm_CbItemSelect(void *data, Elm_Object_Item *it, const char *emission, const char *source); + void m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source); private: + SFolderItemInfo *m_FindItemInfo(Eina_List *list, Elm_Object_Item *item); inline int m_ConvertToMin(int milsec); void m_RemoveFocusIdler(void); void m_GotoPlayback(int mode, char *id); - SFolderItemInfo *m_FindItemInfo(Eina_List *list, Elm_Object_Item *item); Elm_Object_Item *m_FindItemByInfo(Eina_List *list, folder_info *finfo); void m_SortFolderGrid(void); void m_CreateFolderGrid(void); @@ -59,7 +63,14 @@ protected: virtual void t_OnShow(void); public: - CFolderLayout(const char *pLayoutId) : CExtBaseLayout(pLayoutId), IKeyDownListener(this), m(0) {} + CFolderLayout(const char *pLayoutId) : + CExtBaseLayout(pLayoutId), + IMouseMoveListener(this), + IMouseClickedListener(this), + IRealizedListener(this), + IUnrealizedListener(this), + IKeyDownListener(this), + m(0) {} virtual ~CFolderLayout() {} bool Create(CLayoutMgr *mgr); @@ -68,6 +79,10 @@ public: virtual void Update(bool focusFlag); public: + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); + virtual void OnMouseClicked(int id, Evas_Object *obj); + virtual void OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item); + virtual void OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item); virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); }; diff --git a/src/main.cpp b/src/main.cpp index ee893de..ba357f7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -39,7 +39,7 @@ private: struct _appdata { Evas_Object *win; - struct _arg_list *arglist; + SArgList *arglist; } ad; CMusicBaseView *m_cBaseView; @@ -147,7 +147,7 @@ public: elm_win_activate(ad.win); t_RemoveArglist(); - ad.arglist = (_arg_list *)calloc(1, sizeof(struct _arg_list)); + ad.arglist = (SArgList *)calloc(1, sizeof(SArgList)); if (!ad.arglist) goto error; _DBG(""); diff --git a/src/views/base-view.cpp b/src/views/base-view.cpp index 07749fe..e6033e4 100644 --- a/src/views/base-view.cpp +++ b/src/views/base-view.cpp @@ -123,6 +123,20 @@ Evas_Object *s_AddButton(Evas_Object *box) } +enum EObjectType { + BASE_VIEW, + BASE_VIEW_PLAY_BUTTON, + BASE_VIEW_SOURCE_BUTTON, + BASE_VIEW_SORT_BUTTON, + BASE_VIEW_GROUP_SONG, + BASE_VIEW_GROUP_ALBUM, + BASE_VIEW_GROUP_ARTIST, + BASE_VIEW_GROUP_GENRE, + BASE_VIEW_GROUP_FOLDER, + BASE_VIEW_GROUP_PLAYLIST, +}; + + struct SMusicBaseView { Evas_Object *win; Evas_Object *base; @@ -138,7 +152,7 @@ struct SMusicBaseView { Evas_Object *c_grpbtn; CMusicController *mhandle; CLayoutMgr *lmgr; - struct _arg_list *arglist; + SArgList *arglist; int btntype; bool fresh_view; @@ -154,369 +168,12 @@ struct SMusicBaseView { CMusicBaseView *parent; CHandleVolume *pHandleVolume; - class CHandlerBtn : public CListenerMgr, public IKeyDownListener, public IMouseMoveListener, public IMouseClickedListener { - public: - SMusicBaseView *m; - void(*m_cbClicked)(void* cookie, Evas_Object *obj); - void *m_cookie; - - public: - CHandlerBtn(SMusicBaseView *ins) : IKeyDownListener(this), IMouseMoveListener(this), IMouseClickedListener(this) { m = ins; } - - void SetCallback(void(*clicked)(void* cookie, Evas_Object *obj), void* cookie) { - m_cbClicked = clicked; - m_cookie = cookie; - } - - virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) { - if (!elm_object_focus_get(obj)) - elm_object_focus_set(obj, EINA_TRUE); - } - }; - - class CHandlerBtnGroup : public CHandlerBtn { - public: - CHandlerBtnGroup(SMusicBaseView *ins) : CHandlerBtn(ins) {} - - virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - if (!strcmp(ev->keyname, KEY_BACK)) { - m->mhandle->Stop(); - elm_exit(); - } - } - - virtual void OnMouseClicked(int id, Evas_Object *obj) { - if (m->c_grpbtn == obj) - return; - - elm_object_signal_emit(m->c_grpbtn, - MUSIC_SIGNAL_GROUP_UNSELECTED, MUSIC_BASE_VIEW); - m->c_grpbtn = obj; - elm_object_signal_emit(m->c_grpbtn, - MUSIC_SIGNAL_GROUP_SELECTED, MUSIC_BASE_VIEW); - - if (obj == m->group_btn[GRP_FOLDER]) - elm_object_text_set(m->sortbtn, _(g_sortTextFolder[0])); - else if (obj == m->group_btn[GRP_PLAYLISTS]) - elm_object_text_set(m->sortbtn, _(g_sortTextPlaylists[0])); - else if (obj == m->group_btn[GRP_ALBUM]) - elm_object_text_set(m->sortbtn, _(g_sortTextAlbum[0])); - else if (obj == m->group_btn[GRP_ARTIST]) - elm_object_text_set(m->sortbtn, _(g_sortTextArtist[0])); - else if (obj == m->group_btn[GRP_GENRE]) - elm_object_text_set(m->sortbtn, _(g_sortTextGenre[0])); - else - elm_object_text_set(m->sortbtn, _(g_sortText[0])); - - m->mhandle->SetSortType(0); - - if (m_cbClicked) - m_cbClicked(m_cookie, obj); - } - } *pHandlerBtnGroup[TOTAL_GROUP_BTNS]; - - class CHandlerBtnPlayback : public CHandlerBtn { - private: - void m_GotoPlayback(void) - { - if (!CViewMgr::GetInstance()->PushView(MUSIC_PLAYBACK_VIEW, NULL)) - _ERR(" viewmgr push view MUSIC_PLAYBACK_VIEW failed "); - } - - public: - CHandlerBtnPlayback(SMusicBaseView *ins) : CHandlerBtn(ins) {} - - virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - if (!strcmp(ev->keyname, KEY_BACK)) - elm_object_focus_set(m->c_grpbtn, EINA_TRUE); - } - - virtual void OnMouseClicked(int id, Evas_Object *obj) { - Eina_List *list = NULL; - bool r; - int state; - - state = m->mhandle->PlayState(); - - if (state != PLAY_STATUS_INITIAL) { - if (!CViewMgr::GetInstance()->PushView(MUSIC_PLAYBACK_VIEW, NULL)) - _ERR(" viewmgr push view failed "); - - return; - } - - r = m->mhandle->MediaGetList(LIST_TYPE_SONG, NULL, &list); - if (r == false || eina_list_count(list) == 0) { - _ERR(" No songs "); - return; - } - - m->mhandle->Stop(); - m->mhandle->UpdatePlaylist(list, ADD_TYPE_FRESH); - eina_list_free(list); - - m_GotoPlayback(); - } - } *pHandlerBtnPlayback; - - class CHandlerBtnCtxpopup : public CHandlerBtn { - private: - ETopBtnType m_type; - - public: - CHandlerBtnCtxpopup(SMusicBaseView *ins, ETopBtnType type) : CHandlerBtn(ins) { m_type = type; } - - private: - static void sm_CbCtxPopupBtnClicked(void *dt, Evas_Object *obj, void *ev) - { - CHandlerBtnCtxpopup *root = (CHandlerBtnCtxpopup*)dt; - if (root) - root->m_CbCtxPopupBtnClicked(obj, ev); - } - - void m_CbCtxPopupBtnClicked(Evas_Object *obj, void *ev) - { - const char *text = NULL; - const char *layout_id = NULL; - int size = 0; - int type = 0; - - text = elm_object_text_get(obj); - - if (m->btntype == TOP_BTN_TYPE_SOURCE) { - size = ARRAY_SIZE(g_sourceText); - st_FindIndex(g_sourceText, size, text, &type); - DestroyCtxPopup(); - if (type == m->mhandle->SourceType()) - return; - - m->mhandle->SetSourceType(type); - elm_object_text_set(m->srcbtn, _(text)); - } - else { - layout_id = m->lmgr->Layout()->LayoutId(); - if (!strcmp(layout_id, MUSIC_FOLDER_LAYOUT)) { - size = ARRAY_SIZE(g_sortTextFolder); - st_FindIndex(g_sortTextFolder, size, text, &type); - } - else if (!strcmp(layout_id, MUSIC_ALBUM_LAYOUT)) { - size = ARRAY_SIZE(g_sortTextAlbum); - st_FindIndex(g_sortTextAlbum, size, text, &type); - } - else if (!strcmp(layout_id, MUSIC_CATEGORY_PLAYLISTS_LAYOUT)) { - size = ARRAY_SIZE(g_sortTextPlaylists); - st_FindIndex(g_sortTextPlaylists, size, text, &type); - } - else if (!strcmp(layout_id, MUSIC_CATEGORY_ARTIST_LAYOUT)) { - size = ARRAY_SIZE(g_sortTextArtist); - st_FindIndex(g_sortTextArtist, size, text, &type); - } - else if (!strcmp(layout_id, MUSIC_CATEGORY_GENRE_LAYOUT)) { - size = ARRAY_SIZE(g_sortTextGenre); - st_FindIndex(g_sortTextGenre, size, text, &type); - } - else { - size = ARRAY_SIZE(g_sortText); - st_FindIndex(g_sortText, size, text, &type); - } - DestroyCtxPopup(); - if (type == m->mhandle->SortType()) - return; - - m->mhandle->SetSortType(type); - elm_object_text_set(m->sortbtn, _(text)); - } - - if (m_cbClicked) - m_cbClicked(m_cookie, obj); - } - - static void sm_CbCtxPopupBtnKeyPressed(void *dt, Evas *e, Evas_Object *obj, void *ei) - { - CHandlerBtnCtxpopup *root = (CHandlerBtnCtxpopup*)dt; - if (root) - root->m_OnCtxPopupBtnKeyPressed(e, obj, (Evas_Event_Key_Down*)ei); - } - - void m_OnCtxPopupBtnKeyPressed(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) - { - if (strcmp(ev->keyname, KEY_BACK) == 0) - DestroyCtxPopup(); - } - - protected: - static bool st_FindIndex(const char **arr, int arrsize, const char *text, int *index) - { - int i; - - if (!arr || !arrsize || !text) - return false; - - for (i = 0; i < arrsize; i++) { - if (arr[i] && !strcmp(arr[i], text)) { - *index = i; - return true; - } - } - - return false; - } - - void t_CreateCtxPopup(int btnType) - { - Evas_Object *ctxpopup = NULL, *box = NULL, *btn = NULL; - Evas_Object *firstbtn = NULL; - int i, size, selected_index; - const char **arr; - const char *layout_id = NULL; - const char *part = NULL; - - if (!m->base) - return; - - ctxpopup = elm_ctxpopup_add(m->base); - if (!ctxpopup) - return; - - box = elm_box_add(ctxpopup); - if (!box) { - evas_object_del(ctxpopup); - return; - } - evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); - evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0); - - if (btnType == TOP_BTN_TYPE_SOURCE) { - arr = g_sourceText; - size = ARRAY_SIZE(g_sourceText); - selected_index = m->mhandle->SourceType(); - m->btntype = btnType; - part = MUSIC_PART_SOURCE_POPUP; - } - else if (btnType == TOP_BTN_TYPE_SORT) { - arr = g_sortText; - size = ARRAY_SIZE(g_sortText); - layout_id = m->lmgr->Layout()->LayoutId(); - if (layout_id) { - if (!strcmp(layout_id, MUSIC_ALBUM_LAYOUT)) { - arr = g_sortTextAlbum; - size = ARRAY_SIZE(g_sortTextAlbum); - } - else if (!strcmp(layout_id, MUSIC_FOLDER_LAYOUT)) { - arr = g_sortTextFolder; - size = ARRAY_SIZE(g_sortTextFolder); - } - else if (!strcmp(layout_id, MUSIC_CATEGORY_PLAYLISTS_LAYOUT)) { - arr = g_sortTextPlaylists; - size = ARRAY_SIZE(g_sortTextPlaylists); - } - else if (!strcmp(layout_id, MUSIC_CATEGORY_ARTIST_LAYOUT)) { - arr = g_sortTextArtist; - size = ARRAY_SIZE(g_sortTextArtist); - } - else if (!strcmp(layout_id, MUSIC_CATEGORY_GENRE_LAYOUT)) { - arr = g_sortTextGenre; - size = ARRAY_SIZE(g_sortTextGenre); - } - } - part = MUSIC_PART_SORT_POPUP; - selected_index = m->mhandle->SortType(); - m->btntype = btnType; - } - else { - evas_object_del(ctxpopup); - return; - } - - for (i = 0; i < size; i++) { - if (btnType == TOP_BTN_TYPE_SOURCE && i == SOURCE_TYPE_USB && - !m->mhandle->CheckUsb()) - continue; - - btn = s_AddButton(box); - if (!btn) { - evas_object_del(ctxpopup); - return; - } - elm_object_style_set(btn, MUSIC_STYLE_HOVER_ENTRY); - elm_object_text_set(btn, _(arr[i])); - elm_box_pack_end(box, btn); - - if (i == 0) - firstbtn = btn; /* to set focus later */ - - if (i == selected_index) - elm_object_signal_emit(btn, - "elm,action,highlight", "elm"); - - if (i == size - 1) { - elm_object_signal_emit(btn, - "elm,action,hideline", "elm"); - _ERR("hiding last line"); - } - - evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, sm_CbCtxPopupBtnClicked, this); - evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m); - evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, sm_CbCtxPopupBtnKeyPressed, this); - } - - elm_object_content_set(ctxpopup, box); - elm_object_style_set(ctxpopup, MUSIC_STYLE_HOVER_CTXPOPUP); - elm_ctxpopup_direction_priority_set(ctxpopup, - ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN); - elm_object_part_content_set(m->base, part, ctxpopup); - - m->ctxpopup = ctxpopup; - - if (firstbtn && btn) { - elm_object_focus_set(firstbtn, EINA_TRUE); - elm_object_focus_next_object_set(firstbtn, - btn, ELM_FOCUS_UP); - elm_object_focus_next_object_set(btn, - firstbtn, ELM_FOCUS_DOWN); - } - } - public: - void DestroyCtxPopup(void) - { - if (!m->ctxpopup) - return; - - evas_object_hide(m->ctxpopup); - evas_object_del(m->ctxpopup); - m->ctxpopup = NULL; - } - - public: - virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - if (!strcmp(ev->keyname, KEY_BACK)) - elm_object_focus_set(m->c_grpbtn, EINA_TRUE); - } - - virtual void OnMouseClicked(int id, Evas_Object *obj) { - t_CreateCtxPopup(m_type); - } - } *pHandlerBtnSource, *pHandlerBtnSort; - - SMusicBaseView() { memset(this, 0, sizeof(SMusicBaseView)); - for (int a = 0; a < TOTAL_GROUP_BTNS; a++) - pHandlerBtnGroup[a] = new CHandlerBtnGroup(this); - - pHandlerBtnPlayback = new CHandlerBtnPlayback(this); - pHandlerBtnSource = new CHandlerBtnCtxpopup(this, TOP_BTN_TYPE_SOURCE); - pHandlerBtnSort = new CHandlerBtnCtxpopup(this, TOP_BTN_TYPE_SORT); pHandleVolume = new CHandleVolume; } ~SMusicBaseView() { delete pHandleVolume; - delete pHandlerBtnSort; - delete pHandlerBtnSource; - delete pHandlerBtnPlayback; - - for (int a = 0; a < TOTAL_GROUP_BTNS; a++) - delete pHandlerBtnGroup[a]; } }; @@ -525,9 +182,6 @@ struct SBtnInfo { const char *part; const char *style; const char *icon_path; - - SMusicBaseView::CHandlerBtn *handler; - //Evas_Smart_Cb cb; }; @@ -586,39 +240,6 @@ void CMusicBaseView::m_UpdateEmptyFocusSequence(void) } -void CMusicBaseView::sm_CbClickedGroupBtn(void *cookie, Evas_Object *obj) -{ - CMusicBaseView *root = (CMusicBaseView*)cookie; - if (root) - root->m_OnClickedGroupBtn(obj); -} - - -void CMusicBaseView::m_OnClickedGroupBtn(Evas_Object *obj) -{ - m_ShowCurrentLayout(); -} - - -void CMusicBaseView::sm_CbClickedCtxBtn(void *cookie, Evas_Object *obj) -{ - CMusicBaseView *root = (CMusicBaseView*)cookie; - if (root) - root->m_OnClickedCtxBtn(obj); -} - - -void CMusicBaseView::m_OnClickedCtxBtn(Evas_Object *obj) -{ - if (m->btntype == TOP_BTN_TYPE_SOURCE) { - if (m->c_grpbtn != m->group_btn[GRP_PLAYLISTS]) - m_ShowCurrentLayout(); - } - else - m_UpdateCurrentLayout(false); -} - - void CMusicBaseView::m_ShowCurrentLayout(void) { const char *layoutId = NULL; @@ -663,24 +284,241 @@ void CMusicBaseView::m_ShowCurrentLayout(void) } -void CMusicBaseView::m_DestroyPopup(void) +void CMusicBaseView::m_GotoPlayback(void) { - if (!m->popup) + if (!CViewMgr::GetInstance()->PushView(MUSIC_PLAYBACK_VIEW, NULL)) + _ERR(" viewmgr push view MUSIC_PLAYBACK_VIEW failed "); +} + + +bool CMusicBaseView::sm_FindIndex(const char **arr, int arrsize, const char *text, int *index) +{ + int i; + + if (!arr || !arrsize || !text) + return false; + + for (i = 0; i < arrsize; i++) { + if (arr[i] && !strcmp(arr[i], text)) { + *index = i; + return true; + } + } + + return false; +} + + +void CMusicBaseView::m_CreateCtxPopup(int btnType) +{ + Evas_Object *ctxpopup = NULL, *box = NULL, *btn = NULL; + Evas_Object *firstbtn = NULL; + int i, size, selected_index; + const char **arr; + const char *layout_id = NULL; + const char *part = NULL; + + if (!m->base) return; - if (m->transit) { - elm_transit_del(m->transit); - m->transit = NULL; + ctxpopup = elm_ctxpopup_add(m->base); + if (!ctxpopup) + return; + + box = elm_box_add(ctxpopup); + if (!box) { + evas_object_del(ctxpopup); + return; + } + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0); + + if (btnType == TOP_BTN_TYPE_SOURCE) { + arr = g_sourceText; + size = ARRAY_SIZE(g_sourceText); + selected_index = m->mhandle->SourceType(); + m->btntype = btnType; + part = MUSIC_PART_SOURCE_POPUP; + } + else if (btnType == TOP_BTN_TYPE_SORT) { + arr = g_sortText; + size = ARRAY_SIZE(g_sortText); + layout_id = m->lmgr->Layout()->LayoutId(); + if (layout_id) { + if (!strcmp(layout_id, MUSIC_ALBUM_LAYOUT)) { + arr = g_sortTextAlbum; + size = ARRAY_SIZE(g_sortTextAlbum); + } + else if (!strcmp(layout_id, MUSIC_FOLDER_LAYOUT)) { + arr = g_sortTextFolder; + size = ARRAY_SIZE(g_sortTextFolder); + } + else if (!strcmp(layout_id, MUSIC_CATEGORY_PLAYLISTS_LAYOUT)) { + arr = g_sortTextPlaylists; + size = ARRAY_SIZE(g_sortTextPlaylists); + } + else if (!strcmp(layout_id, MUSIC_CATEGORY_ARTIST_LAYOUT)) { + arr = g_sortTextArtist; + size = ARRAY_SIZE(g_sortTextArtist); + } + else if (!strcmp(layout_id, MUSIC_CATEGORY_GENRE_LAYOUT)) { + arr = g_sortTextGenre; + size = ARRAY_SIZE(g_sortTextGenre); + } + } + part = MUSIC_PART_SORT_POPUP; + selected_index = m->mhandle->SortType(); + m->btntype = btnType; + } + else { + evas_object_del(ctxpopup); + return; + } + + for (i = 0; i < size; i++) { + if (btnType == TOP_BTN_TYPE_SOURCE && i == SOURCE_TYPE_USB && + !m->mhandle->CheckUsb()) + continue; + + btn = s_AddButton(box); + if (!btn) { + evas_object_del(ctxpopup); + return; + } + elm_object_style_set(btn, MUSIC_STYLE_HOVER_ENTRY); + elm_object_text_set(btn, _(arr[i])); + elm_box_pack_end(box, btn); + + if (i == 0) + firstbtn = btn; /* to set focus later */ + + if (i == selected_index) + elm_object_signal_emit(btn, + "elm,action,highlight", "elm"); + + if (i == size - 1) { + elm_object_signal_emit(btn, + "elm,action,hideline", "elm"); + _ERR("hiding last line"); + } + + evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, sm_CbCtxPopupBtnClicked, this); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m); + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, sm_CbCtxPopupBtnKeyPressed, this); + } + + elm_object_content_set(ctxpopup, box); + elm_object_style_set(ctxpopup, MUSIC_STYLE_HOVER_CTXPOPUP); + elm_ctxpopup_direction_priority_set(ctxpopup, + ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN); + elm_object_part_content_set(m->base, part, ctxpopup); + + m->ctxpopup = ctxpopup; + + if (firstbtn && btn) { + elm_object_focus_set(firstbtn, EINA_TRUE); + elm_object_focus_next_object_set(firstbtn, + btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn, + firstbtn, ELM_FOCUS_DOWN); } - evas_object_del(m->popup); - m->popup = NULL; } void CMusicBaseView::m_DestroyCtxPopup(void) { - m->pHandlerBtnSource->DestroyCtxPopup(); - m->pHandlerBtnSort->DestroyCtxPopup(); + if (!m->ctxpopup) + return; + + evas_object_hide(m->ctxpopup); + evas_object_del(m->ctxpopup); + m->ctxpopup = NULL; +} + + +void CMusicBaseView::sm_CbCtxPopupBtnClicked(void *dt, Evas_Object *obj, void *ev) +{ + CMusicBaseView *root = (CMusicBaseView*)dt; + if (root) + root->m_CbCtxPopupBtnClicked(obj, ev); +} + + +void CMusicBaseView::m_CbCtxPopupBtnClicked(Evas_Object *obj, void *ev) +{ + const char *text = NULL; + const char *layout_id = NULL; + int size = 0; + int type = 0; + + text = elm_object_text_get(obj); + + if (m->btntype == TOP_BTN_TYPE_SOURCE) { + size = ARRAY_SIZE(g_sourceText); + sm_FindIndex(g_sourceText, size, text, &type); + m_DestroyCtxPopup(); + if (type == m->mhandle->SourceType()) + return; + + m->mhandle->SetSourceType(type); + elm_object_text_set(m->srcbtn, _(text)); + } + else { + layout_id = m->lmgr->Layout()->LayoutId(); + if (!strcmp(layout_id, MUSIC_FOLDER_LAYOUT)) { + size = ARRAY_SIZE(g_sortTextFolder); + sm_FindIndex(g_sortTextFolder, size, text, &type); + } + else if (!strcmp(layout_id, MUSIC_ALBUM_LAYOUT)) { + size = ARRAY_SIZE(g_sortTextAlbum); + sm_FindIndex(g_sortTextAlbum, size, text, &type); + } + else if (!strcmp(layout_id, MUSIC_CATEGORY_PLAYLISTS_LAYOUT)) { + size = ARRAY_SIZE(g_sortTextPlaylists); + sm_FindIndex(g_sortTextPlaylists, size, text, &type); + } + else if (!strcmp(layout_id, MUSIC_CATEGORY_ARTIST_LAYOUT)) { + size = ARRAY_SIZE(g_sortTextArtist); + sm_FindIndex(g_sortTextArtist, size, text, &type); + } + else if (!strcmp(layout_id, MUSIC_CATEGORY_GENRE_LAYOUT)) { + size = ARRAY_SIZE(g_sortTextGenre); + sm_FindIndex(g_sortTextGenre, size, text, &type); + } + else { + size = ARRAY_SIZE(g_sortText); + sm_FindIndex(g_sortText, size, text, &type); + } + m_DestroyCtxPopup(); + if (type == m->mhandle->SortType()) + return; + + m->mhandle->SetSortType(type); + elm_object_text_set(m->sortbtn, _(text)); + } + + if (m->btntype == TOP_BTN_TYPE_SOURCE) { + if (m->c_grpbtn != m->group_btn[GRP_PLAYLISTS]) + m_ShowCurrentLayout(); + } + else { + m_UpdateCurrentLayout(false); + } +} + + +void CMusicBaseView::sm_CbCtxPopupBtnKeyPressed(void *dt, Evas *e, Evas_Object *obj, void *ei) +{ + CMusicBaseView *root = (CMusicBaseView*)dt; + if (root) + root->m_OnCtxPopupBtnKeyPressed(e, obj, (Evas_Event_Key_Down*)ei); +} + + +void CMusicBaseView::m_OnCtxPopupBtnKeyPressed(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) +{ + if (strcmp(ev->keyname, KEY_BACK) == 0) + m_DestroyCtxPopup(); } @@ -740,6 +578,20 @@ Evas_Object *CMusicBaseView::m_CreateLoadingPopup(void) } +void CMusicBaseView::m_DestroyPopup(void) +{ + if (!m->popup) + return; + + if (m->transit) { + elm_transit_del(m->transit); + m->transit = NULL; + } + evas_object_del(m->popup); + m->popup = NULL; +} + + void CMusicBaseView::m_UpdatePlaysongLabel(void) { SSongInfo *sinfo = NULL; @@ -796,19 +648,16 @@ void CMusicBaseView::m_CreateTopSection(void) int type; int i; Evas_Object *btn = NULL; - static struct SBtnInfo btninfo[TOTAL_TOP_BTNS]; + SBtnInfo btninfo[TOTAL_TOP_BTNS]; btninfo[TOP_BTN_TYPE_PLAYBACK].part = MUSIC_PART_PLAYBACK_BTN; btninfo[TOP_BTN_TYPE_PLAYBACK].style = MUSIC_STYLE_PLAYBACK_BTN; - btninfo[TOP_BTN_TYPE_PLAYBACK].handler = m->pHandlerBtnPlayback;// cb = sm_CbPlaybackBtnClicked; btninfo[TOP_BTN_TYPE_SOURCE].part = MUSIC_PART_SOURCE_HOVERSEL; btninfo[TOP_BTN_TYPE_SOURCE].style = MUSIC_STYLE_SOURCE_BTN; - btninfo[TOP_BTN_TYPE_SOURCE].handler = m->pHandlerBtnSource;// cb = sm_CbSourceBtnClicked; btninfo[TOP_BTN_TYPE_SORT].part = MUSIC_PART_SORT_HOVERSEL; btninfo[TOP_BTN_TYPE_SORT].style = MUSIC_STYLE_SORT_BTN; - btninfo[TOP_BTN_TYPE_SORT].handler = m->pHandlerBtnSort;// cb = sm_CbSortBtnClicked; elm_object_part_text_set(m->base, MUSIC_PART_TITLE, _(MUSIC_TEXT_TITLE)); @@ -825,10 +674,7 @@ void CMusicBaseView::m_CreateTopSection(void) elm_object_style_set(btn, btninfo[i].style); elm_object_part_content_set(m->base, btninfo[i].part, btn); - btninfo[i].handler->Connect(btn); - //evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, btninfo[i].cb, m); - ////evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, sm_CbTopBtnKeyPressed, m); - //evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m); + Connect(btn, BASE_VIEW_PLAY_BUTTON + i, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_CLICKED); if (i == TOP_BTN_TYPE_PLAYBACK) m->plbackbtn = btn; @@ -886,8 +732,7 @@ void CMusicBaseView::m_CreateLeftSection(void) elm_object_style_set(m->group_btn[i], MUSIC_STYLE_GROUPBTN); elm_object_text_set(m->group_btn[i], _(btninfo[i].txt)); - m->pHandlerBtnGroup[i]->Connect(m->group_btn[i]); - m->pHandlerBtnGroup[i]->SetCallback(sm_CbClickedGroupBtn, this); + Connect(m->group_btn[i], BASE_VIEW_GROUP_SONG + i, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_CLICKED); ic = elm_image_add(m->group_btn[i]); if (ic) { @@ -1000,7 +845,7 @@ bool CMusicBaseView::Create(void *data) m->mhandle = mhandle; m->lmgr = lmgr; m->fresh_view = true; - m->arglist = (_arg_list *)data; + m->arglist = (SArgList *)data; m->parent = this; m->layoutSong = new CSongLayout(MUSIC_SONG_LAYOUT); @@ -1044,18 +889,9 @@ bool CMusicBaseView::Create(void *data) m->pHandleVolume->Create(m->base); m_UpdateFocusSequence(); - Connect(m->base); - - for (int i = 0; i < TOTAL_GROUP_BTNS; i++) { - m->pHandlerBtnGroup[i]->SetCallback(sm_CbClickedGroupBtn, this); - } - m->pHandlerBtnSort->SetCallback(sm_CbClickedCtxBtn, this); - m->pHandlerBtnSource->SetCallback(sm_CbClickedCtxBtn, this); + Connect(m->base, BASE_VIEW, TYPE_KEY_DOWN | TYPE_KEY_UP); mhandle->AddListener(this); - //m->cbinfo[E_SONG_COMPLETE] = mhandle->AddCallback(E_SONG_COMPLETE, sm_CbUpdatePlaysongLabel, this); - //m->cbinfo[E_CONTENT_UPDATE] = mhandle->AddCallback(E_CONTENT_UPDATE, sm_CbContentUpdate, this); - //m->cbinfo[E_USB_CONNECT] = mhandle->AddCallback(E_USB_CONNECT, sm_CbUsbConnect, this); return true; } @@ -1066,9 +902,6 @@ void CMusicBaseView::Destroy(void) ASSERT(m); m->mhandle->RemoveListener(this); - //m->mhandle->RemoveCallback(m->cbinfo[E_SONG_COMPLETE]); - //m->mhandle->RemoveCallback(m->cbinfo[E_CONTENT_UPDATE]); - //m->mhandle->RemoveCallback(m->cbinfo[E_USB_CONNECT]); m->pHandleVolume->Destroy(); @@ -1191,46 +1024,182 @@ void CMusicBaseView::t_OnHide(void) void CMusicBaseView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - if (!strcmp(ev->keyname, KEY_EXIT)) { - m->mhandle->Stop(); - elm_exit(); + switch (id) { + case BASE_VIEW: + if (!strcmp(ev->keyname, KEY_EXIT)) { + m->mhandle->Stop(); + elm_exit(); + } + else if (!strcmp(ev->keyname, KEY_ENTER)) { + if (elm_object_focus_get(m->c_grpbtn)) { + m_UpdateCurrentLayout(true); + } + } + else if (!strcmp(ev->keyname, KEY_VOLUMEUP)) + m->pHandleVolume->Up(); + else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN)) + m->pHandleVolume->Down(); + else if (!strcmp(ev->keyname, KEY_MUTE)) + m->pHandleVolume->Mute(); + else if (!strcmp(ev->keyname, KEY_NEXT) || + !strcmp(ev->keyname, KEY_PREVIOUS) || + !strcmp(ev->keyname, KEY_PLAY) || + !strcmp(ev->keyname, KEY_PAUSE)) { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_KEY_PRESS; + parcel.layoutId = NULL; + parcel.keyEvent = ev->keyname; + CViewMgr::GetInstance()->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel); + } + break; + + case BASE_VIEW_PLAY_BUTTON: + case BASE_VIEW_SORT_BUTTON: + case BASE_VIEW_SOURCE_BUTTON: + if (!strcmp(ev->keyname, KEY_BACK)) + elm_object_focus_set(m->c_grpbtn, EINA_TRUE); + break; + + case BASE_VIEW_GROUP_SONG: + case BASE_VIEW_GROUP_ALBUM: + case BASE_VIEW_GROUP_ARTIST: + case BASE_VIEW_GROUP_GENRE: + case BASE_VIEW_GROUP_FOLDER: + case BASE_VIEW_GROUP_PLAYLIST: + if (!strcmp(ev->keyname, KEY_BACK)) { + m->mhandle->Stop(); + elm_exit(); + } + break; + + default: + break; } - else if (!strcmp(ev->keyname, KEY_ENTER)) { - if (elm_object_focus_get(m->c_grpbtn)) { - m_UpdateCurrentLayout(true); +} + + +void CMusicBaseView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) +{ + switch (id) { + case BASE_VIEW: + if (!strcmp(ev->keyname, KEY_NEXT) || + !strcmp(ev->keyname, KEY_PREVIOUS)) { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_KEY_RELEASE; + parcel.layoutId = NULL; + parcel.keyEvent = ev->keyname; + CViewMgr::GetInstance()->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel); + m_UpdatePlaysongLabel(); } + break; + + default: + break; } - else if (!strcmp(ev->keyname, KEY_VOLUMEUP)) - m->pHandleVolume->Up(); //m_HandleVolumeKey(SOUND_UP); - else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN)) - m->pHandleVolume->Down();// m_HandleVolumeKey(SOUND_DOWN); - else if (!strcmp(ev->keyname, KEY_MUTE)) - m->pHandleVolume->Mute();// m_HandleVolumeKey(SOUND_MUTE); - else if (!strcmp(ev->keyname, KEY_NEXT) || - !strcmp(ev->keyname, KEY_PREVIOUS) || - !strcmp(ev->keyname, KEY_PLAY) || - !strcmp(ev->keyname, KEY_PAUSE)) { - SParcel parcel; - parcel.ctxtInfo = NULL; - parcel.updateType = E_KEY_PRESS; - parcel.layoutId = NULL; - parcel.keyEvent = ev->keyname; - CViewMgr::GetInstance()->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel); +} + + +void CMusicBaseView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) +{ + switch (id) { + case BASE_VIEW_PLAY_BUTTON: + case BASE_VIEW_SORT_BUTTON: + case BASE_VIEW_SOURCE_BUTTON: + case BASE_VIEW_GROUP_SONG: + case BASE_VIEW_GROUP_ALBUM: + case BASE_VIEW_GROUP_ARTIST: + case BASE_VIEW_GROUP_GENRE: + case BASE_VIEW_GROUP_FOLDER: + case BASE_VIEW_GROUP_PLAYLIST: + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); + break; + + default: + break; } } -void CMusicBaseView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) +void CMusicBaseView::OnMouseClicked(int id, Evas_Object *obj) { - if (!strcmp(ev->keyname, KEY_NEXT) || - !strcmp(ev->keyname, KEY_PREVIOUS)) { - SParcel parcel; - parcel.ctxtInfo = NULL; - parcel.updateType = E_KEY_RELEASE; - parcel.layoutId = NULL; - parcel.keyEvent = ev->keyname; - CViewMgr::GetInstance()->UpdateView((const char *)MUSIC_PLAYBACK_VIEW, &parcel); - m_UpdatePlaysongLabel(); + switch (id) { + case BASE_VIEW_PLAY_BUTTON: + { + Eina_List *list = NULL; + bool r; + int state; + + state = m->mhandle->PlayState(); + + if (state != PLAY_STATUS_INITIAL) { + if (!CViewMgr::GetInstance()->PushView(MUSIC_PLAYBACK_VIEW, NULL)) + _ERR(" viewmgr push view failed "); + + return; + } + + r = m->mhandle->MediaGetList(LIST_TYPE_SONG, NULL, &list); + if (r == false || eina_list_count(list) == 0) { + _ERR(" No songs "); + return; + } + + m->mhandle->Stop(); + m->mhandle->UpdatePlaylist(list, ADD_TYPE_FRESH); + eina_list_free(list); + + m_GotoPlayback(); + } + break; + + case BASE_VIEW_SOURCE_BUTTON: + m_CreateCtxPopup(TOP_BTN_TYPE_SOURCE); + break; + + case BASE_VIEW_SORT_BUTTON: + m_CreateCtxPopup(TOP_BTN_TYPE_SORT); + break; + + case BASE_VIEW_GROUP_SONG: + case BASE_VIEW_GROUP_ALBUM: + case BASE_VIEW_GROUP_ARTIST: + case BASE_VIEW_GROUP_GENRE: + case BASE_VIEW_GROUP_FOLDER: + case BASE_VIEW_GROUP_PLAYLIST: + { + if (m->c_grpbtn == obj) + return; + + elm_object_signal_emit(m->c_grpbtn, + MUSIC_SIGNAL_GROUP_UNSELECTED, MUSIC_BASE_VIEW); + m->c_grpbtn = obj; + elm_object_signal_emit(m->c_grpbtn, + MUSIC_SIGNAL_GROUP_SELECTED, MUSIC_BASE_VIEW); + + if (obj == m->group_btn[GRP_FOLDER]) + elm_object_text_set(m->sortbtn, _(g_sortTextFolder[0])); + else if (obj == m->group_btn[GRP_PLAYLISTS]) + elm_object_text_set(m->sortbtn, _(g_sortTextPlaylists[0])); + else if (obj == m->group_btn[GRP_ALBUM]) + elm_object_text_set(m->sortbtn, _(g_sortTextAlbum[0])); + else if (obj == m->group_btn[GRP_ARTIST]) + elm_object_text_set(m->sortbtn, _(g_sortTextArtist[0])); + else if (obj == m->group_btn[GRP_GENRE]) + elm_object_text_set(m->sortbtn, _(g_sortTextGenre[0])); + else + elm_object_text_set(m->sortbtn, _(g_sortText[0])); + + m->mhandle->SetSortType(0); + + m_ShowCurrentLayout(); + } + break; + + default: + break; } } diff --git a/src/views/folder-layout.cpp b/src/views/folder-layout.cpp index e350d0c..fadc726 100644 --- a/src/views/folder-layout.cpp +++ b/src/views/folder-layout.cpp @@ -39,6 +39,15 @@ #define GENGRID_ITEM_SIZE_W (263+20) #define GENGRID_ITEM_SIZE_H (359+20) + +enum EObjectType { + FOLDER_LAYOUT_PLAY_BUTTON, + FOLDER_LAYOUT_NEXT_BUTTON, + FOLDER_LAYOUT_LAST_BUTTON, + FOLDER_LAYOUT, + FOLDER_LAYOUT_GENGRID, +}; + struct SFolderItemInfo { folder_info *finfo; SSongInfo *sinfo; @@ -52,12 +61,6 @@ const char *g_sourceTexts[] = { N_("USB") // SOURCE_TYPE_USB }; -enum EBtnType { - ABTN_PLAY, - ABTN_NEXT, - ABTN_LAST -}; - enum EDepthType { E_DEPTH_NONE, E_DEPTH_FOLDER, @@ -91,321 +94,11 @@ struct SFolderLayout { CFolderLayout *parent; int depth; - class CHandlerButton : public CListenerMgr, public IMouseMoveListener, public IMouseClickedListener { - public: - struct SCallback { - void(*gotoPlayBackView)(void* cookie, int mode, char *mediaId); - void* cookie; - }; - - private: - SFolderLayout *m; - - protected: - SCallback m_callback; - - public: - CHandlerButton(SFolderLayout *ins) : - IMouseMoveListener(this), - IMouseClickedListener(this) { - m = ins; - } - - void SetCallback(const SCallback* cb) { - m_callback = *cb; - } - - virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) - { - if (!obj) - return; - - if (!elm_object_focus_get(obj)) - elm_object_focus_set(obj, EINA_TRUE); - } - - virtual void OnMouseClicked(int id, Evas_Object *obj) - { - EBtnType type = (EBtnType)id; - - switch (type) - { - case ABTN_PLAY: - if (m_callback.gotoPlayBackView) - m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_FRESH, NULL); - break; - - case ABTN_NEXT: - if (m_callback.gotoPlayBackView) - m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_NEXT, NULL); - break; - - case ABTN_LAST: - if (m_callback.gotoPlayBackView) - m_callback.gotoPlayBackView(m_callback.cookie, ADD_TYPE_END, NULL); - break; - - default: - _ERR("Invalid Button Type"); - ASSERT(0); - break; - } - } - } *pHandlerButton; - - class CHandlerGrid : public CListenerMgr, public IMouseMoveListener, public IKeyDownListener, public IRealizedListener, public IUnrealizedListener { - public: - struct SCallback { - void(*goToPlaybackView)(void *cookie, int mode, char *mediaId); - void(*goToContextView)(void *cookie, SContentInfo *contextInfo); - void(*updateGrid)(void *cookie); - void* cookie; - }; - - private: - SFolderLayout *m; - SCallback m_callback; - - private: - SFolderItemInfo *m_FindItemInfo(Eina_List *list, Elm_Object_Item *item) - { - Eina_List *l = NULL; - SFolderItemInfo *itinfo = NULL; - void *obj = NULL; - - if (!list || !item) - return NULL; - - EINA_LIST_FOREACH(list, l, obj) { - itinfo = (SFolderItemInfo *)obj; - if (itinfo->item == item) - return itinfo; - } - - return NULL; - } - - static void sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) - { - CHandlerGrid *root = (CHandlerGrid *)dt; - if (root) { - root->m_OnCtxtUpdate(type, lid); - } - } - - void m_OnCtxtUpdate(EActionType type, int lid) - { - Eina_List *list = NULL; - SSongInfo *sinfo = NULL; - EAddType mode; - - if (!m->ctxtinfo || !m->ctxtinfo->context) - return; - - if (type == ACTION_TYPE_ADDNEXT) - mode = ADD_TYPE_NEXT; - else - mode = ADD_TYPE_END; - - if (m->depth == E_DEPTH_SONG) { - sinfo = (SSongInfo *)m->ctxtinfo->context; - list = eina_list_append(list, sinfo); - } - else { - m->mhandle->MediaGetList(LIST_TYPE_FOLDER_SONG, - m->ctxtinfo->context, &list); - sinfo = (SSongInfo *)eina_list_data_get(list); - } - - if (type == ACTION_TYPE_ADDTO) { - if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) - _ERR(" Adding songs to playlist failed "); - else - _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); - - return; - } - - m->mhandle->UpdatePlaylist(list, mode); - eina_list_free(list); - - if (type == ACTION_TYPE_PLAY) { - m->mhandle->Stop(); - m->mhandle->SetCurrentSong(song_info_get_media_id(sinfo)); - } - - _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); - } - - static void sm_CbCtxtClose(void *dt) - { - CHandlerGrid *root = (CHandlerGrid *)dt; - if (root) - root->m_OnCtxtClose(); - } - - void m_OnCtxtClose(void) - { - m->vmgr->PopView(); - m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); - elm_object_item_focus_set(m->focused_item, EINA_TRUE); - } - - static void sm_CbItemSelect(void *data, Elm_Object_Item *it, const char *emission, const char *source) - { - CHandlerGrid *root = (CHandlerGrid *)data; - if (root) - root->m_OnItemSelect(it, emission, source); - } - - void m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source) - { - SFolderItemInfo *itinfo = NULL; - char *id = NULL; - - if (!m) - return; - - itinfo = m_FindItemInfo(m->it_infolist, it); - if (!itinfo) { - _ERR(" no item info found "); - return; - } - - if (m->depth == E_DEPTH_SONG) { - if (m->c_sinfo) { - song_info_destroy(m->c_sinfo); - m->c_sinfo = NULL; - } - m->c_sinfo = song_info_duplicate(itinfo->sinfo); - } - else { - if (m->c_finfo) { - folder_info_destroy(m->c_finfo); - m->c_finfo = NULL; - } - m->c_finfo = folder_info_duplicate(itinfo->finfo); - } - - if (m->depth == E_DEPTH_SONG) { - id = song_info_get_media_id(m->c_sinfo); - elm_gengrid_item_selected_set(it, EINA_FALSE); - // Goto Playback View with id - if (m_callback.goToPlaybackView) - m_callback.goToPlaybackView(m_callback.cookie, ADD_TYPE_FRESH, id); - } - else { - m->depth = E_DEPTH_SONG; - // Update folder grid and add idler - if (m_callback.updateGrid) - m_callback.updateGrid(m_callback.cookie); - } - } - - public: - CHandlerGrid(SFolderLayout *ins) : - IMouseMoveListener(this), - IKeyDownListener(this), - IRealizedListener(this), - IUnrealizedListener(this) { - m = ins; - } - - void SetCallback(const SCallback* cb) - { - m_callback = *cb; - } - - virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) - { - Elm_Object_Item *item; - - item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x, - ev->cur.canvas.y, NULL, NULL); - if (!item) - return; - - if (!elm_object_item_focus_get(item)) - elm_object_item_focus_set(item, EINA_TRUE); - } - - virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) - { - Elm_Object_Item *it = NULL; - SContentInfo *ctxtinfo = NULL; - SFolderItemInfo *itinfo = NULL; - - if (!obj) - return; - - if (strcmp(ev->keyname, KEY_MENU)) - return; - - it = elm_object_focused_item_get(obj); - if (!it) { - _ERR(" unable to get focused item "); - return; - } - m->focused_item = it; - - if (m->ctxtinfo) { - free(m->ctxtinfo); - m->ctxtinfo = NULL; - } - - ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); - if (!ctxtinfo) - return; - - itinfo = m_FindItemInfo(m->it_infolist, it); - if (!itinfo) { - free(ctxtinfo); - return; - } - - ctxtinfo->cbdata = this; - ctxtinfo->update = sm_CbCtxtUpdate; - ctxtinfo->close = sm_CbCtxtClose; - if (m->depth == E_DEPTH_SONG) { - ctxtinfo->type = CONTEXT_TYPE_SONG; - ctxtinfo->context = itinfo->sinfo; - } - else { - ctxtinfo->type = CONTEXT_TYPE_FOLDER; - ctxtinfo->context = itinfo->finfo; - } - - m->ctxtinfo = ctxtinfo; - - // Go to the context view with ctxtinfo - if (m_callback.goToContextView) - m_callback.goToContextView(m_callback.cookie, ctxtinfo); - } - - virtual void OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item) - { - elm_object_item_signal_callback_add(item, - MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, - sm_CbItemSelect, this); - } - - virtual void OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item) - { - elm_object_item_signal_callback_del((Elm_Object_Item *)item, - MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, - sm_CbItemSelect); - } - } *pHandlerGrid; - SFolderLayout() { memset(this, 0, sizeof(SFolderLayout)); - pHandlerGrid = new CHandlerGrid(this); - pHandlerButton = new CHandlerButton(this); } ~SFolderLayout() { - delete pHandlerGrid; - delete pHandlerButton; } }; @@ -558,43 +251,140 @@ void CFolderLayout::m_OnFocusIdler(void) } -void CFolderLayout::sm_CbGoToContextView(void *cookie, SContentInfo *contextInfo) +void CFolderLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) { - CFolderLayout *root = (CFolderLayout *)cookie; + CFolderLayout *root = (CFolderLayout *)dt; + if (root) { + root->m_OnCtxtUpdate(type, lid); + } +} + +void CFolderLayout::m_OnCtxtUpdate(EActionType type, int lid) +{ + Eina_List *list = NULL; + SSongInfo *sinfo = NULL; + EAddType mode; + + if (!m->ctxtinfo || !m->ctxtinfo->context) + return; + + if (type == ACTION_TYPE_ADDNEXT) + mode = ADD_TYPE_NEXT; + else + mode = ADD_TYPE_END; + + if (m->depth == E_DEPTH_SONG) { + sinfo = (SSongInfo *)m->ctxtinfo->context; + list = eina_list_append(list, sinfo); + } + else { + m->mhandle->MediaGetList(LIST_TYPE_FOLDER_SONG, + m->ctxtinfo->context, &list); + sinfo = (SSongInfo *)eina_list_data_get(list); + } + + if (type == ACTION_TYPE_ADDTO) { + if (!m->mhandle->MediaAddsongsPlaylist(lid, list)) + _ERR(" Adding songs to playlist failed "); + else + _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG); + + return; + } + + m->mhandle->UpdatePlaylist(list, mode); + eina_list_free(list); + + if (type == ACTION_TYPE_PLAY) { + m->mhandle->Stop(); + m->mhandle->SetCurrentSong(song_info_get_media_id(sinfo)); + } + + _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); +} + +void CFolderLayout::sm_CbCtxtClose(void *dt) +{ + CFolderLayout *root = (CFolderLayout *)dt; if (root) - root->m_OnGotoContextView(contextInfo); + root->m_OnCtxtClose(); } -void CFolderLayout::m_OnGotoContextView(SContentInfo *contextInfo) +void CFolderLayout::m_OnCtxtClose(void) { - SParcel parcel; - parcel.ctxtInfo = contextInfo; - if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) - _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); + m->vmgr->PopView(); + m->vmgr->PushView(MUSIC_BASE_VIEW, NULL); + elm_object_item_focus_set(m->focused_item, EINA_TRUE); } -void CFolderLayout::sm_CbUpdateGrid(void *cookie) +void CFolderLayout::sm_CbItemSelect(void *data, Elm_Object_Item *it, const char *emission, const char *source) { - CFolderLayout *root = (CFolderLayout *)cookie; + CFolderLayout *root = (CFolderLayout *)data; if (root) - root->m_OnCbUpdateGrid(); + root->m_OnItemSelect(it, emission, source); } -void CFolderLayout::m_OnCbUpdateGrid(void) +void CFolderLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source) { - m_UpdateFolderGrid(false); - m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this); + SFolderItemInfo *itinfo = NULL; + char *id = NULL; + + if (!m) + return; + + itinfo = m_FindItemInfo(m->it_infolist, it); + if (!itinfo) { + _ERR(" no item info found "); + return; + } + + if (m->depth == E_DEPTH_SONG) { + if (m->c_sinfo) { + song_info_destroy(m->c_sinfo); + m->c_sinfo = NULL; + } + m->c_sinfo = song_info_duplicate(itinfo->sinfo); + } + else { + if (m->c_finfo) { + folder_info_destroy(m->c_finfo); + m->c_finfo = NULL; + } + m->c_finfo = folder_info_duplicate(itinfo->finfo); + } + + if (m->depth == E_DEPTH_SONG) { + id = song_info_get_media_id(m->c_sinfo); + elm_gengrid_item_selected_set(it, EINA_FALSE); + m_GotoPlayback(ADD_TYPE_FRESH, id); + } + else { + m->depth = E_DEPTH_SONG; + m_UpdateFolderGrid(false); + m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this); + } } -void CFolderLayout::sm_CbGoToPlaybackView(void *cookie, int mode, char *mediaId) +SFolderItemInfo *CFolderLayout::m_FindItemInfo(Eina_List *list, Elm_Object_Item *item) { - CFolderLayout *root = (CFolderLayout *)cookie; - if (root) - root->m_GotoPlayback(mode, mediaId); + Eina_List *l = NULL; + SFolderItemInfo *itinfo = NULL; + void *obj = NULL; + + if (!list || !item) + return NULL; + + EINA_LIST_FOREACH(list, l, obj) { + itinfo = (SFolderItemInfo *)obj; + if (itinfo->item == item) + return itinfo; + } + + return NULL; } @@ -712,7 +502,9 @@ void CFolderLayout::m_CreateFolderGrid(void) EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_gengrid_align_set(grid, 0, 0); elm_object_part_content_set(Layout(), MUSIC_PART_FOLDER_GRID, grid); - m->pHandlerGrid->Connect(grid); + Connect(grid, FOLDER_LAYOUT_GENGRID, + TYPE_MOUSE_MOVE | TYPE_KEY_DOWN | + TYPE_REALIZED | TYPE_UNREALIZED); elm_gengrid_item_size_set(grid, elm_config_scale_get() * GENGRID_ITEM_SIZE_W, elm_config_scale_get() * GENGRID_ITEM_SIZE_H); @@ -867,20 +659,20 @@ void CFolderLayout::m_CreateTopsection(void) Evas_Object *img; SBtnInfo btninfo[TOTAL_ADD_BTNS]; - btninfo[ABTN_PLAY].name = MUSIC_STR_PLAY; - btninfo[ABTN_PLAY].part = MUSIC_PART_FOLDER_PLAYBTN; - btninfo[ABTN_PLAY].style = MUSIC_STYLE_ADD_PLAY_BTN; - btninfo[ABTN_PLAY].icon = MUSIC_IMAGE_ADD_PLAY; + btninfo[FOLDER_LAYOUT_PLAY_BUTTON].name = MUSIC_STR_PLAY; + btninfo[FOLDER_LAYOUT_PLAY_BUTTON].part = MUSIC_PART_FOLDER_PLAYBTN; + btninfo[FOLDER_LAYOUT_PLAY_BUTTON].style = MUSIC_STYLE_ADD_PLAY_BTN; + btninfo[FOLDER_LAYOUT_PLAY_BUTTON].icon = MUSIC_IMAGE_ADD_PLAY; - btninfo[ABTN_NEXT].name = MUSIC_STR_ADDNEXT; - btninfo[ABTN_NEXT].part = MUSIC_PART_FOLDER_NEXTBTN; - btninfo[ABTN_NEXT].style = MUSIC_STYLE_ADD_NEXT_BTN; - btninfo[ABTN_NEXT].icon = MUSIC_IMAGE_ADD_NEXT; + btninfo[FOLDER_LAYOUT_NEXT_BUTTON].name = MUSIC_STR_ADDNEXT; + btninfo[FOLDER_LAYOUT_NEXT_BUTTON].part = MUSIC_PART_FOLDER_NEXTBTN; + btninfo[FOLDER_LAYOUT_NEXT_BUTTON].style = MUSIC_STYLE_ADD_NEXT_BTN; + btninfo[FOLDER_LAYOUT_NEXT_BUTTON].icon = MUSIC_IMAGE_ADD_NEXT; - btninfo[ABTN_LAST].name = MUSIC_STR_ADDLAST; - btninfo[ABTN_LAST].part = MUSIC_PART_FOLDER_LASTBTN; - btninfo[ABTN_LAST].style = MUSIC_STYLE_ADD_LAST_BTN; - btninfo[ABTN_LAST].icon = MUSIC_IMAGE_ADD_LAST; + btninfo[FOLDER_LAYOUT_LAST_BUTTON].name = MUSIC_STR_ADDLAST; + btninfo[FOLDER_LAYOUT_LAST_BUTTON].part = MUSIC_PART_FOLDER_LASTBTN; + btninfo[FOLDER_LAYOUT_LAST_BUTTON].style = MUSIC_STYLE_ADD_LAST_BTN; + btninfo[FOLDER_LAYOUT_LAST_BUTTON].icon = MUSIC_IMAGE_ADD_LAST; for (i = 0; i < TOTAL_ADD_BTNS; i++) { btn = elm_button_add(Layout()); @@ -892,7 +684,7 @@ void CFolderLayout::m_CreateTopsection(void) elm_object_text_set(btn, _(btninfo[i].name)); elm_object_style_set(btn, btninfo[i].style); - m->pHandlerButton->Connect(btn, i); + Connect(btn, i, TYPE_MOUSE_MOVE | TYPE_CLICKED); img = elm_image_add(btn); if (img) { @@ -986,19 +778,7 @@ bool CFolderLayout::Create(CLayoutMgr *mgr) m_CreateTopsection(); m_CreateFolderGrid(); - Connect(layout); - - SFolderLayout::CHandlerGrid::SCallback cb; - cb.goToPlaybackView = &sm_CbGoToPlaybackView; - cb.goToContextView = &sm_CbGoToContextView; - cb.updateGrid = &sm_CbUpdateGrid; - cb.cookie = this; - m->pHandlerGrid->SetCallback(&cb); - - SFolderLayout::CHandlerButton::SCallback btnCb; - btnCb.gotoPlayBackView = &sm_CbGoToPlaybackView; - btnCb.cookie = this; - m->pHandlerButton->SetCallback(&btnCb); + Connect(layout, FOLDER_LAYOUT, TYPE_KEY_DOWN); SParcel parcel; parcel.ctxtInfo = NULL; @@ -1050,22 +830,169 @@ void CFolderLayout::Update(bool focusFlag) } +void CFolderLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) +{ + switch (id) { + case FOLDER_LAYOUT_GENGRID: + { + Elm_Object_Item *item; + + item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL, NULL); + if (!item) + return; + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); + } + break; + + case FOLDER_LAYOUT_PLAY_BUTTON: + case FOLDER_LAYOUT_NEXT_BUTTON: + case FOLDER_LAYOUT_LAST_BUTTON: + { + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); + } + break; + + default: + break; + } +} + + +void CFolderLayout::OnMouseClicked(int id, Evas_Object *obj) +{ + switch (id) { + case FOLDER_LAYOUT_PLAY_BUTTON: + m_GotoPlayback(ADD_TYPE_FRESH, NULL); + break; + + case FOLDER_LAYOUT_NEXT_BUTTON: + m_GotoPlayback(ADD_TYPE_NEXT, NULL); + break; + + case FOLDER_LAYOUT_LAST_BUTTON: + m_GotoPlayback(ADD_TYPE_END, NULL); + break; + + default: + break; + } +} + + +void CFolderLayout::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + switch (id) { + case FOLDER_LAYOUT_GENGRID: + elm_object_item_signal_callback_add(item, + MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, + sm_CbItemSelect, this); + break; + + default: + break; + } +} + + +void CFolderLayout::OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + switch (id) { + case FOLDER_LAYOUT_GENGRID: + elm_object_item_signal_callback_del((Elm_Object_Item *)item, + MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, + sm_CbItemSelect); + break; + + default: + break; + } +} + + void CFolderLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - if (!strcmp(ev->keyname, KEY_BACK)) { - if (m->depth == E_DEPTH_SONG) { - m->depth = E_DEPTH_FOLDER; - m_UpdateFolderGrid(false); - m_RemoveFocusIdler(); - m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this); + switch (id) { + case FOLDER_LAYOUT: + { + if (!strcmp(ev->keyname, KEY_BACK)) { + if (m->depth == E_DEPTH_SONG) { + m->depth = E_DEPTH_FOLDER; + m_UpdateFolderGrid(false); + m_RemoveFocusIdler(); + m->focus_idler = ecore_idler_add(sm_CbFocusIdler, this); + } + else { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_FOCUS_UPDATE; + parcel.layoutId = NULL; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + } + } } - else { + break; + + case FOLDER_LAYOUT_GENGRID: + { + Elm_Object_Item *it = NULL; + SContentInfo *ctxtinfo = NULL; + SFolderItemInfo *itinfo = NULL; + + if (!obj) + return; + + if (strcmp(ev->keyname, KEY_MENU)) + return; + + it = elm_object_focused_item_get(obj); + if (!it) { + _ERR(" unable to get focused item "); + return; + } + m->focused_item = it; + + if (m->ctxtinfo) { + free(m->ctxtinfo); + m->ctxtinfo = NULL; + } + + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; + + itinfo = m_FindItemInfo(m->it_infolist, it); + if (!itinfo) { + free(ctxtinfo); + return; + } + + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + if (m->depth == E_DEPTH_SONG) { + ctxtinfo->type = CONTEXT_TYPE_SONG; + ctxtinfo->context = itinfo->sinfo; + } + else { + ctxtinfo->type = CONTEXT_TYPE_FOLDER; + ctxtinfo->context = itinfo->finfo; + } + + m->ctxtinfo = ctxtinfo; + SParcel parcel; - parcel.ctxtInfo = NULL; - parcel.updateType = E_FOCUS_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; - m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); } + break; + + default: + break; } } \ No newline at end of file -- 2.7.4 From d86378300b98e9ab87599a06e320bf913dc25c56 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Tue, 3 Feb 2015 16:45:54 +0900 Subject: [PATCH 07/16] Apply modified Listeners Change-Id: I2f6c17009e2e458b6b3d6510288ed09cc4a93479 Signed-off-by: Kim Tae Soo --- include/category-layout.h | 46 ++-- include/common.h | 16 -- include/entry-popup.h | 22 +- src/views/album-songs-layout.cpp | 40 ++- src/views/base-view.cpp | 166 +++++++----- src/views/category-layout.cpp | 573 +++++++++++++++++++++------------------ src/views/entry-popup.cpp | 148 +++++----- src/views/folder-layout.cpp | 40 ++- src/views/playback-view.cpp | 46 +--- src/views/playlist-layout.cpp | 9 +- 10 files changed, 570 insertions(+), 536 deletions(-) diff --git a/include/category-layout.h b/include/category-layout.h index ae50715..57eeb59 100644 --- a/include/category-layout.h +++ b/include/category-layout.h @@ -18,7 +18,9 @@ #define __CATEGORY_LAYOUT_H__ -class CCategoryLayout : public CExtBaseLayout, public CListenerMgr, public IKeyDownListener { +class CCategoryLayout : public CExtBaseLayout, public CListenerMgr, + public IKeyDownListener, public IMouseMoveListener, public IMouseClickedListener, + public IRealizedListener, public IUnrealizedListener { private: struct SCategoryLayout *m; @@ -54,7 +56,7 @@ protected: SContentInfo *ctxtinfo; ESelectType sel_type; Evas_Object *grid; - Evas_Object *epopup; + class CEntryPopup *epopup; Evas_Object *base; Elm_Object_Item *focused_item; } t; @@ -66,24 +68,6 @@ private: static void sm_CbEntrynameSet(void *dt, const char *name); void m_OnEntrynameSet(const char *name); - static void sm_CbSelectAllClicked(void *dt, Evas_Object *obj, void *ev); - void m_OnSelectAllClicked(Evas_Object *obj, void *ev); - - static void sm_CbDoneBtnClicked(void *dt, Evas_Object *obj, void *ev); - void m_OnDoneBtnClicked(Evas_Object *obj, void *ev); - - static void sm_CbCancelBtnClicked(void *dt, Evas_Object *obj, void *ev); - void m_OnCancelBtnClicked(Evas_Object *obj, void *ev); - - static void sm_CbPlayBtnClicked(void *dt, Evas_Object *obj, void *ev); - void m_OnPlayBtnClicked(Evas_Object *obj, void *ev); - - static void sm_CbNextBtnClicked(void *dt, Evas_Object *obj, void *ev); - void m_OnNextBtnClicked(Evas_Object *obj, void *ev); - - static void sm_CbLastBtnClicked(void *dt, Evas_Object *obj, void *ev); - void m_OnLastBtnClicked(Evas_Object *obj, void *ev); - static char *sm_CbGetSelectlistItemText(void *data, Evas_Object *obj, const char *part); static char *sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part); static void sm_CbRemoveListItem(void *data, Evas_Object *obj); @@ -111,15 +95,6 @@ private: static void sm_CbItemSelect(void *data, Elm_Object_Item *it, const char *emission, const char *source); void m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source); - static void sm_CbGengridRealized(void *data, Evas_Object *obj, void *event_info); - static void sm_CbGengridUnrealized(void *data, Evas_Object *obj, void *event_info); - - static void sm_CbKeyDown(void *dt, Evas *e, Evas_Object *obj, void *ei); - void m_OnKeyDown(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); - - static void sm_CbKeyPressed(void *dt, Evas *e, Evas_Object *obj, void *ei); - void m_OnKeyPressed(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); - private: inline int m_ConvertToMin(int milsec); void m_RemoveFocusIdler(void); @@ -159,7 +134,14 @@ protected: virtual ECategoryType t_CategoryType(void) = 0; public: - CCategoryLayout(const char *pLayoutId) : CExtBaseLayout(pLayoutId), IKeyDownListener(this), m(0) { + CCategoryLayout(const char *pLayoutId) : + CExtBaseLayout(pLayoutId), + IKeyDownListener(this), + IMouseMoveListener(this), + IMouseClickedListener(this), + IRealizedListener(this), + IUnrealizedListener(this), + m(0) { memset(&t, 0, sizeof(t)); } virtual ~CCategoryLayout() {} @@ -171,6 +153,10 @@ public: public: virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); + virtual void OnMouseClicked(int id, Evas_Object *obj); + virtual void OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item); + virtual void OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item); }; diff --git a/include/common.h b/include/common.h index 6f7fae1..bef2530 100644 --- a/include/common.h +++ b/include/common.h @@ -29,15 +29,6 @@ struct SCtxtPlaylistItem { int id; }; -enum { - GRP_SONG, - GRP_ALBUM, - GRP_ARTIST, - GRP_GENRE, - GRP_FOLDER, - GRP_PLAYLISTS -}; - enum ESourceType { SOURCE_TYPE_NONE = -1, SOURCE_TYPE_ALL, @@ -60,13 +51,6 @@ enum EAddType { ADD_TYPE_END }; - -enum ETopBtnType { - TOP_BTN_TYPE_PLAYBACK, - TOP_BTN_TYPE_SOURCE, - TOP_BTN_TYPE_SORT, -}; - enum EPlayStatus { PLAY_STATUS_INITIAL = -1, PLAY_STATUS_STOP, diff --git a/include/entry-popup.h b/include/entry-popup.h index e4bfa24..246f0a0 100644 --- a/include/entry-popup.h +++ b/include/entry-popup.h @@ -17,8 +17,24 @@ #ifndef __ENTRY_POPUP_H__ #define __ENTRY_POPUP_H__ -Evas_Object *create_entry_popup(Evas_Object *base, const char *text, - void (*)(void *, const char *), void *data); -void destroy_entry_popup(Evas_Object *layout); +class CEntryPopup : public CListenerMgr, public IKeyDownListener { +private: + struct SEntryPopup *m; + +private: + static Eina_Bool sm_CbFocusIdler(void *dt); + void m_OnFocusIdler(void); + +public: + CEntryPopup() : IKeyDownListener(this), m(0) {} + virtual ~CEntryPopup() {} + + bool Create(Evas_Object *base, const char *text, void(*cbEntryName)(void *, const char *), void *data); + virtual void Destroy(void); + + bool FlagCreate(void); + + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); +}; #endif /* __ENTRY_POPUP_H__ */ diff --git a/src/views/album-songs-layout.cpp b/src/views/album-songs-layout.cpp index cc87998..a9a4cbb 100644 --- a/src/views/album-songs-layout.cpp +++ b/src/views/album-songs-layout.cpp @@ -38,11 +38,17 @@ enum EObjectType { + ALBUM_SONGS_LAYOUT, + ALBUM_SONGS_GENLIST, ALBUM_SONGS_PLAY_BUTTON, ALBUM_SONGS_NEXT_BUTTON, ALBUM_SONGS_LAST_BUTTON, - ALBUM_SONGS_LAYOUT, - ALBUM_SONGS_GENLIST, +}; + +enum EBtnType { + BTN_PLAY, + BTN_NEXT, + BTN_LAST }; struct SAlbumSongsItemInfo { @@ -80,6 +86,7 @@ struct SBtnInfo { const char *part; const char *style; const char *icon; + EObjectType type; }; @@ -359,20 +366,23 @@ void CAlbumSongsLayout::m_CreateTopSection(void) SBtnInfo btninfo[TOTAL_ADD_BTNS]; Evas_Object *layout = Layout(); - btninfo[ALBUM_SONGS_PLAY_BUTTON].name = MUSIC_STR_PLAY; - btninfo[ALBUM_SONGS_PLAY_BUTTON].part = MUSIC_PART_ALBUM_PLAYBTN; - btninfo[ALBUM_SONGS_PLAY_BUTTON].style = MUSIC_STYLE_ADD_PLAY_BTN; - btninfo[ALBUM_SONGS_PLAY_BUTTON].icon = MUSIC_IMAGE_ADD_PLAY; + btninfo[BTN_PLAY].name = MUSIC_STR_PLAY; + btninfo[BTN_PLAY].part = MUSIC_PART_ALBUM_PLAYBTN; + btninfo[BTN_PLAY].style = MUSIC_STYLE_ADD_PLAY_BTN; + btninfo[BTN_PLAY].icon = MUSIC_IMAGE_ADD_PLAY; + btninfo[BTN_PLAY].type = ALBUM_SONGS_PLAY_BUTTON; - btninfo[ALBUM_SONGS_NEXT_BUTTON].name = MUSIC_STR_ADDNEXT; - btninfo[ALBUM_SONGS_NEXT_BUTTON].part = MUSIC_PART_ALBUM_NEXTBTN; - btninfo[ALBUM_SONGS_NEXT_BUTTON].style = MUSIC_STYLE_ADD_NEXT_BTN; - btninfo[ALBUM_SONGS_NEXT_BUTTON].icon = MUSIC_IMAGE_ADD_NEXT; + btninfo[BTN_NEXT].name = MUSIC_STR_ADDNEXT; + btninfo[BTN_NEXT].part = MUSIC_PART_ALBUM_NEXTBTN; + btninfo[BTN_NEXT].style = MUSIC_STYLE_ADD_NEXT_BTN; + btninfo[BTN_NEXT].icon = MUSIC_IMAGE_ADD_NEXT; + btninfo[BTN_NEXT].type = ALBUM_SONGS_NEXT_BUTTON; - btninfo[ALBUM_SONGS_LAST_BUTTON].name = MUSIC_STR_ADDLAST; - btninfo[ALBUM_SONGS_LAST_BUTTON].part = MUSIC_PART_ALBUM_LASTBTN; - btninfo[ALBUM_SONGS_LAST_BUTTON].style = MUSIC_STYLE_ADD_LAST_BTN; - btninfo[ALBUM_SONGS_LAST_BUTTON].icon = MUSIC_IMAGE_ADD_LAST; + btninfo[BTN_LAST].name = MUSIC_STR_ADDLAST; + btninfo[BTN_LAST].part = MUSIC_PART_ALBUM_LASTBTN; + btninfo[BTN_LAST].style = MUSIC_STYLE_ADD_LAST_BTN; + btninfo[BTN_LAST].icon = MUSIC_IMAGE_ADD_LAST; + btninfo[BTN_LAST].type = ALBUM_SONGS_LAST_BUTTON; thumb = m_AddAlbumCover(); if (!thumb) @@ -388,7 +398,7 @@ void CAlbumSongsLayout::m_CreateTopSection(void) elm_object_text_set(btn[i], _(btninfo[i].name)); elm_object_style_set(btn[i], btninfo[i].style); - Connect(btn[i], i, TYPE_MOUSE_MOVE | TYPE_CLICKED); + Connect(btn[i], btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_CLICKED); img = elm_image_add(btn[i]); if (img) { diff --git a/src/views/base-view.cpp b/src/views/base-view.cpp index e6033e4..f17c58f 100644 --- a/src/views/base-view.cpp +++ b/src/views/base-view.cpp @@ -103,31 +103,13 @@ const char *g_sourceArg[] = { "usb" // SOURCE_TYPE_USB }; - -Evas_Object *s_AddButton(Evas_Object *box) -{ - Evas_Object *button; - - if (!box) - return NULL; - - button = elm_button_add(box); - if (!button) - return NULL; - - evas_object_size_hint_weight_set(button, - EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(button); - - return button; -} - - enum EObjectType { BASE_VIEW, + BASE_VIEW_PLAY_BUTTON, BASE_VIEW_SOURCE_BUTTON, BASE_VIEW_SORT_BUTTON, + BASE_VIEW_GROUP_SONG, BASE_VIEW_GROUP_ALBUM, BASE_VIEW_GROUP_ARTIST, @@ -136,6 +118,20 @@ enum EObjectType { BASE_VIEW_GROUP_PLAYLIST, }; +enum EBtnType { + BTN_PLAY, + BTN_SOURCE, + BTN_SORT +}; + +enum EGroupBtnType { + GROUP_BTN_SONG, + GROUP_BTN_ALBUM, + GROUP_BTN_ARTIST, + GROUP_BTN_GENRE, + GROUP_BTN_FOLDER, + GROUP_BTN_PLAYLIST +}; struct SMusicBaseView { Evas_Object *win; @@ -182,9 +178,28 @@ struct SBtnInfo { const char *part; const char *style; const char *icon_path; + EObjectType type; }; +Evas_Object *s_AddButton(Evas_Object *box) +{ + Evas_Object *button; + + if (!box) + return NULL; + + button = elm_button_add(box); + if (!button) + return NULL; + + evas_object_size_hint_weight_set(button, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(button); + + return button; +} + void CMusicBaseView::sm_CbHandleEmptyStatus(void *cookie, bool emptyStatus) { CMusicBaseView *root = (CMusicBaseView*)cookie; @@ -210,8 +225,8 @@ void CMusicBaseView::m_UpdateFocusSequence(void) elm_object_focus_next_object_set(m->group_btn[i], m->content, ELM_FOCUS_RIGHT); - elm_object_focus_next_object_set(m->group_btn[GRP_SONG], m->plbackbtn, ELM_FOCUS_UP); - elm_object_focus_next_object_set(m->plbackbtn, m->group_btn[GRP_SONG], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(m->group_btn[GROUP_BTN_SONG], m->plbackbtn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(m->plbackbtn, m->group_btn[GROUP_BTN_SONG], ELM_FOCUS_LEFT); elm_object_focus_next_object_set(m->plbackbtn, m->content, ELM_FOCUS_DOWN); elm_object_focus_next_object_set(m->srcbtn, m->content, ELM_FOCUS_DOWN); elm_object_focus_next_object_set(m->sortbtn, m->content, ELM_FOCUS_DOWN); @@ -229,11 +244,11 @@ void CMusicBaseView::m_UpdateEmptyFocusSequence(void) elm_object_focus_next_object_set(m->group_btn[i], m->plbackbtn, ELM_FOCUS_RIGHT); - elm_object_focus_next_object_set(m->group_btn[GRP_SONG], m->plbackbtn, ELM_FOCUS_UP); - elm_object_focus_next_object_set(m->plbackbtn, m->group_btn[GRP_SONG], ELM_FOCUS_LEFT); - elm_object_focus_next_object_set(m->plbackbtn, m->group_btn[GRP_SONG], ELM_FOCUS_DOWN); - elm_object_focus_next_object_set(m->srcbtn, m->group_btn[GRP_SONG], ELM_FOCUS_DOWN); - elm_object_focus_next_object_set(m->sortbtn, m->group_btn[GRP_SONG], ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(m->group_btn[GROUP_BTN_SONG], m->plbackbtn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(m->plbackbtn, m->group_btn[GROUP_BTN_SONG], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(m->plbackbtn, m->group_btn[GROUP_BTN_SONG], ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(m->srcbtn, m->group_btn[GROUP_BTN_SONG], ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(m->sortbtn, m->group_btn[GROUP_BTN_SONG], ELM_FOCUS_DOWN); elm_object_part_text_set(m->base, MUSIC_PART_NO_CONTENT, _(NO_MUSIC_MESSAGE)); elm_object_part_text_set(m->base, MUSIC_PART_NO_CONTENT_SUB, _(NO_MUSIC_MESSAGE_SUB)); @@ -247,27 +262,27 @@ void CMusicBaseView::m_ShowCurrentLayout(void) elm_object_part_content_unset(m->base, MUSIC_PART_CONTENT); - if (m->c_grpbtn == m->group_btn[GRP_SONG]) { + if (m->c_grpbtn == m->group_btn[GROUP_BTN_SONG]) { layoutId = MUSIC_SONG_LAYOUT; evasLayout = m->layoutSong->Layout(); } - else if (m->c_grpbtn == m->group_btn[GRP_ALBUM]) { + else if (m->c_grpbtn == m->group_btn[GROUP_BTN_ALBUM]) { layoutId = MUSIC_ALBUM_LAYOUT; evasLayout = m->layoutAlbum->Layout(); } - else if (m->c_grpbtn == m->group_btn[GRP_ARTIST]) { + else if (m->c_grpbtn == m->group_btn[GROUP_BTN_ARTIST]) { layoutId = MUSIC_CATEGORY_ARTIST_LAYOUT; evasLayout = m->layoutArtist->Layout(); } - else if (m->c_grpbtn == m->group_btn[GRP_GENRE]) { + else if (m->c_grpbtn == m->group_btn[GROUP_BTN_GENRE]) { layoutId = MUSIC_CATEGORY_GENRE_LAYOUT; evasLayout = m->layoutGenre->Layout(); } - else if (m->c_grpbtn == m->group_btn[GRP_PLAYLISTS]) { + else if (m->c_grpbtn == m->group_btn[GROUP_BTN_PLAYLIST]) { layoutId = MUSIC_CATEGORY_PLAYLISTS_LAYOUT; evasLayout = m->layoutPlaylists->Layout(); } - else if (m->c_grpbtn == m->group_btn[GRP_FOLDER]) { + else if (m->c_grpbtn == m->group_btn[GROUP_BTN_FOLDER]) { layoutId = MUSIC_FOLDER_LAYOUT; evasLayout = m->layoutFolder->Layout(); } @@ -333,14 +348,14 @@ void CMusicBaseView::m_CreateCtxPopup(int btnType) evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0); - if (btnType == TOP_BTN_TYPE_SOURCE) { + if (btnType == BTN_SOURCE) { arr = g_sourceText; size = ARRAY_SIZE(g_sourceText); selected_index = m->mhandle->SourceType(); m->btntype = btnType; part = MUSIC_PART_SOURCE_POPUP; } - else if (btnType == TOP_BTN_TYPE_SORT) { + else if (btnType == BTN_SORT) { arr = g_sortText; size = ARRAY_SIZE(g_sortText); layout_id = m->lmgr->Layout()->LayoutId(); @@ -376,7 +391,7 @@ void CMusicBaseView::m_CreateCtxPopup(int btnType) } for (i = 0; i < size; i++) { - if (btnType == TOP_BTN_TYPE_SOURCE && i == SOURCE_TYPE_USB && + if (btnType == BTN_SOURCE && i == SOURCE_TYPE_USB && !m->mhandle->CheckUsb()) continue; @@ -453,7 +468,7 @@ void CMusicBaseView::m_CbCtxPopupBtnClicked(Evas_Object *obj, void *ev) text = elm_object_text_get(obj); - if (m->btntype == TOP_BTN_TYPE_SOURCE) { + if (m->btntype == BTN_SOURCE) { size = ARRAY_SIZE(g_sourceText); sm_FindIndex(g_sourceText, size, text, &type); m_DestroyCtxPopup(); @@ -497,8 +512,8 @@ void CMusicBaseView::m_CbCtxPopupBtnClicked(Evas_Object *obj, void *ev) elm_object_text_set(m->sortbtn, _(text)); } - if (m->btntype == TOP_BTN_TYPE_SOURCE) { - if (m->c_grpbtn != m->group_btn[GRP_PLAYLISTS]) + if (m->btntype == BTN_SOURCE) { + if (m->c_grpbtn != m->group_btn[GROUP_BTN_PLAYLIST]) m_ShowCurrentLayout(); } else { @@ -650,14 +665,17 @@ void CMusicBaseView::m_CreateTopSection(void) Evas_Object *btn = NULL; SBtnInfo btninfo[TOTAL_TOP_BTNS]; - btninfo[TOP_BTN_TYPE_PLAYBACK].part = MUSIC_PART_PLAYBACK_BTN; - btninfo[TOP_BTN_TYPE_PLAYBACK].style = MUSIC_STYLE_PLAYBACK_BTN; + btninfo[BTN_PLAY].part = MUSIC_PART_PLAYBACK_BTN; + btninfo[BTN_PLAY].style = MUSIC_STYLE_PLAYBACK_BTN; + btninfo[BTN_PLAY].type = BASE_VIEW_PLAY_BUTTON; - btninfo[TOP_BTN_TYPE_SOURCE].part = MUSIC_PART_SOURCE_HOVERSEL; - btninfo[TOP_BTN_TYPE_SOURCE].style = MUSIC_STYLE_SOURCE_BTN; + btninfo[BTN_SOURCE].part = MUSIC_PART_SOURCE_HOVERSEL; + btninfo[BTN_SOURCE].style = MUSIC_STYLE_SOURCE_BTN; + btninfo[BTN_SOURCE].type = BASE_VIEW_SOURCE_BUTTON; - btninfo[TOP_BTN_TYPE_SORT].part = MUSIC_PART_SORT_HOVERSEL; - btninfo[TOP_BTN_TYPE_SORT].style = MUSIC_STYLE_SORT_BTN; + btninfo[BTN_SORT].part = MUSIC_PART_SORT_HOVERSEL; + btninfo[BTN_SORT].style = MUSIC_STYLE_SORT_BTN; + btninfo[BTN_SORT].type = BASE_VIEW_SORT_BUTTON; elm_object_part_text_set(m->base, MUSIC_PART_TITLE, _(MUSIC_TEXT_TITLE)); @@ -674,13 +692,13 @@ void CMusicBaseView::m_CreateTopSection(void) elm_object_style_set(btn, btninfo[i].style); elm_object_part_content_set(m->base, btninfo[i].part, btn); - Connect(btn, BASE_VIEW_PLAY_BUTTON + i, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_CLICKED); + Connect(btn, btninfo[i].type, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_CLICKED); - if (i == TOP_BTN_TYPE_PLAYBACK) + if (i == BTN_PLAY) m->plbackbtn = btn; - else if (i == TOP_BTN_TYPE_SOURCE) + else if (i == BTN_SOURCE) m->srcbtn = btn; - else if (i == TOP_BTN_TYPE_SORT) + else if (i == BTN_SORT) m->sortbtn = btn; } @@ -699,23 +717,29 @@ void CMusicBaseView::m_CreateLeftSection(void) char buf[MAX_LENGTH]; static struct SBtnInfo btninfo[TOTAL_GROUP_BTNS]; - btninfo[GRP_SONG].txt = MUSIC_TEXT_SONG; - btninfo[GRP_SONG].icon_path = MUSIC_IMAGE_GRPBTN_SONG; + btninfo[GROUP_BTN_SONG].txt = MUSIC_TEXT_SONG; + btninfo[GROUP_BTN_SONG].icon_path = MUSIC_IMAGE_GRPBTN_SONG; + btninfo[GROUP_BTN_SONG].type = BASE_VIEW_GROUP_SONG; - btninfo[GRP_ALBUM].txt = MUSIC_TEXT_ALBUM; - btninfo[GRP_ALBUM].icon_path = MUSIC_IMAGE_GRPBTN_ALBUM; + btninfo[GROUP_BTN_ALBUM].txt = MUSIC_TEXT_ALBUM; + btninfo[GROUP_BTN_ALBUM].icon_path = MUSIC_IMAGE_GRPBTN_ALBUM; + btninfo[GROUP_BTN_ALBUM].type = BASE_VIEW_GROUP_ALBUM; - btninfo[GRP_ARTIST].txt = MUSIC_TEXT_ARTIST; - btninfo[GRP_ARTIST].icon_path = MUSIC_IMAGE_GRPBTN_ARTIST; + btninfo[GROUP_BTN_ARTIST].txt = MUSIC_TEXT_ARTIST; + btninfo[GROUP_BTN_ARTIST].icon_path = MUSIC_IMAGE_GRPBTN_ARTIST; + btninfo[GROUP_BTN_ARTIST].type = BASE_VIEW_GROUP_ARTIST; - btninfo[GRP_GENRE].txt = MUSIC_TEXT_GENRE; - btninfo[GRP_GENRE].icon_path = MUSIC_IMAGE_GRPBTN_GENRE; + btninfo[GROUP_BTN_GENRE].txt = MUSIC_TEXT_GENRE; + btninfo[GROUP_BTN_GENRE].icon_path = MUSIC_IMAGE_GRPBTN_GENRE; + btninfo[GROUP_BTN_GENRE].type = BASE_VIEW_GROUP_GENRE; - btninfo[GRP_FOLDER].txt = MUSIC_TEXT_FOLDER; - btninfo[GRP_FOLDER].icon_path = MUSIC_IMAGE_GRPBTN_FOLDER; + btninfo[GROUP_BTN_FOLDER].txt = MUSIC_TEXT_FOLDER; + btninfo[GROUP_BTN_FOLDER].icon_path = MUSIC_IMAGE_GRPBTN_FOLDER; + btninfo[GROUP_BTN_FOLDER].type = BASE_VIEW_GROUP_FOLDER; - btninfo[GRP_PLAYLISTS].txt = MUSIC_TEXT_PLAYLIST; - btninfo[GRP_PLAYLISTS].icon_path = MUSIC_IMAGE_GRPBTN_PLAYLISTS; + btninfo[GROUP_BTN_PLAYLIST].txt = MUSIC_TEXT_PLAYLIST; + btninfo[GROUP_BTN_PLAYLIST].icon_path = MUSIC_IMAGE_GRPBTN_PLAYLISTS; + btninfo[GROUP_BTN_PLAYLIST].type = BASE_VIEW_GROUP_PLAYLIST; box = _add_box(m->base); if (!box) @@ -732,7 +756,7 @@ void CMusicBaseView::m_CreateLeftSection(void) elm_object_style_set(m->group_btn[i], MUSIC_STYLE_GROUPBTN); elm_object_text_set(m->group_btn[i], _(btninfo[i].txt)); - Connect(m->group_btn[i], BASE_VIEW_GROUP_SONG + i, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_CLICKED); + Connect(m->group_btn[i], btninfo[i].type, TYPE_KEY_DOWN | TYPE_MOUSE_MOVE | TYPE_CLICKED); ic = elm_image_add(m->group_btn[i]); if (ic) { @@ -960,9 +984,9 @@ void CMusicBaseView::t_OnShow(void) } if (m->arglist && m->arglist->album_id) - m->c_grpbtn = m->group_btn[GRP_ALBUM]; + m->c_grpbtn = m->group_btn[GROUP_BTN_ALBUM]; else - m->c_grpbtn = m->group_btn[GRP_SONG]; + m->c_grpbtn = m->group_btn[GROUP_BTN_SONG]; elm_object_signal_emit(m->c_grpbtn, MUSIC_SIGNAL_GROUP_SELECTED, MUSIC_BASE_VIEW); @@ -1156,11 +1180,11 @@ void CMusicBaseView::OnMouseClicked(int id, Evas_Object *obj) break; case BASE_VIEW_SOURCE_BUTTON: - m_CreateCtxPopup(TOP_BTN_TYPE_SOURCE); + m_CreateCtxPopup(BTN_SOURCE); break; case BASE_VIEW_SORT_BUTTON: - m_CreateCtxPopup(TOP_BTN_TYPE_SORT); + m_CreateCtxPopup(BTN_SORT); break; case BASE_VIEW_GROUP_SONG: @@ -1179,15 +1203,15 @@ void CMusicBaseView::OnMouseClicked(int id, Evas_Object *obj) elm_object_signal_emit(m->c_grpbtn, MUSIC_SIGNAL_GROUP_SELECTED, MUSIC_BASE_VIEW); - if (obj == m->group_btn[GRP_FOLDER]) + if (obj == m->group_btn[GROUP_BTN_FOLDER]) elm_object_text_set(m->sortbtn, _(g_sortTextFolder[0])); - else if (obj == m->group_btn[GRP_PLAYLISTS]) + else if (obj == m->group_btn[GROUP_BTN_PLAYLIST]) elm_object_text_set(m->sortbtn, _(g_sortTextPlaylists[0])); - else if (obj == m->group_btn[GRP_ALBUM]) + else if (obj == m->group_btn[GROUP_BTN_ALBUM]) elm_object_text_set(m->sortbtn, _(g_sortTextAlbum[0])); - else if (obj == m->group_btn[GRP_ARTIST]) + else if (obj == m->group_btn[GROUP_BTN_ARTIST]) elm_object_text_set(m->sortbtn, _(g_sortTextArtist[0])); - else if (obj == m->group_btn[GRP_GENRE]) + else if (obj == m->group_btn[GROUP_BTN_GENRE]) elm_object_text_set(m->sortbtn, _(g_sortTextGenre[0])); else elm_object_text_set(m->sortbtn, _(g_sortText[0])); diff --git a/src/views/category-layout.cpp b/src/views/category-layout.cpp index be3c0a6..9aa6545 100644 --- a/src/views/category-layout.cpp +++ b/src/views/category-layout.cpp @@ -43,6 +43,18 @@ #define GENGRID_ITEM_SIZE_H (359+20) +enum EObjectType { + CATEGORY_LAYOUT, + CATEGORY_LAYOUT_GENGRID, + CATEGORY_LAYOUT_GENLIST, + CATEGORY_LAYOUT_PLAY_BUTTON, + CATEGORY_LAYOUT_NEXT_BUTTON, + CATEGORY_LAYOUT_LAST_BUTTON, + CATEGORY_LAYOUT_SELECT_ALL_BUTTON, + CATEGORY_LAYOUT_DONE_BUTTON, + CATEGORY_LAYOUT_CANCEL_BUTTON +}; + enum EAddBtns { ABTN_PLAY, ABTN_NEXT, @@ -65,7 +77,7 @@ struct SBtnInfo { const char *part; const char *style; const char *icon; - Evas_Smart_Cb cb; + EObjectType type; }; struct SCategoryLayout { @@ -151,8 +163,7 @@ void CCategoryLayout::m_OnEntrynameSet(const char *name) idlist = m_GetSelectedList(m->it_infolist, (int)ID_TYPE_MEDIA); str = strdup(name); - destroy_entry_popup(t.epopup); - t.epopup = NULL; + t.epopup->Destroy(); if (!strcmp(str, MUSIC_STR_EMPTY)) { _create_message_box(Layout(), MUSIC_TEXT_EMPTY_NAME); @@ -177,131 +188,6 @@ void CCategoryLayout::m_OnEntrynameSet(const char *name) } -void CCategoryLayout::sm_CbSelectAllClicked(void *dt, Evas_Object *obj, void *ev) -{ - CCategoryLayout *root = (CCategoryLayout *)dt; - if (root) - root->m_OnSelectAllClicked(obj, ev); -} - - -void CCategoryLayout::m_OnSelectAllClicked(Evas_Object *obj, void *ev) -{ - Eina_List *l = NULL; - SCatItemInfo *itinfo = NULL; - void *list_obj = NULL; - int tc; - - tc = eina_list_count(m->it_infolist); - - if (m->count == tc) { - elm_object_text_set(m->select_btn[SBTN_SELECT_ALL], - _(MUSIC_TEXT_SELECT_ALL)); - m->count = 0; - EINA_LIST_FOREACH(m->it_infolist, l, list_obj) { - itinfo = (SCatItemInfo *)list_obj; - itinfo->check_status = false; - } - elm_genlist_realized_items_update(m->glist); - - return; - } - - elm_object_text_set(m->select_btn[SBTN_SELECT_ALL], - _(MUSIC_TEXT_DESELECT_ALL)); - m->count = tc; - EINA_LIST_FOREACH(m->it_infolist, l, list_obj) { - itinfo = (SCatItemInfo *)list_obj; - itinfo->check_status = true; - } - elm_genlist_realized_items_update(m->glist); -} - - -void CCategoryLayout::sm_CbDoneBtnClicked(void *dt, Evas_Object *obj, void *ev) -{ - CCategoryLayout *root = (CCategoryLayout *)dt; - if (root) - root->m_OnDoneBtnClicked(obj, ev); -} - - -void CCategoryLayout::m_OnDoneBtnClicked(Evas_Object *obj, void *ev) -{ - if (t.sel_type == SELECT_ADD) { - m_AddSelectedSongs(); - return; - } - else if (t.sel_type == SELECT_REMOVE) { - m_RemoveSelectedSongs(); - return; - } - - if (t.epopup) - destroy_entry_popup(t.epopup); - - t.epopup = create_entry_popup(t.base, MUSIC_STR_EMPTY, - sm_CbEntrynameSet, this); -} - - -void CCategoryLayout::sm_CbCancelBtnClicked(void *dt, Evas_Object *obj, void *ev) -{ - CCategoryLayout *root = (CCategoryLayout *)dt; - if (root) - root->m_OnCancelBtnClicked(obj, ev); -} - - -void CCategoryLayout::m_OnCancelBtnClicked(Evas_Object *obj, void *ev) -{ - t.depth = E_DEPTH_CATEGORY; - t_UpdateLayoutWithFocus(); -} - - -void CCategoryLayout::sm_CbPlayBtnClicked(void *dt, Evas_Object *obj, void *ev) -{ - CCategoryLayout *root = (CCategoryLayout *)dt; - if (root) - root->m_OnPlayBtnClicked(obj, ev); -} - - -void CCategoryLayout::m_OnPlayBtnClicked(Evas_Object *obj, void *ev) -{ - m_GotoPlayback(ADD_TYPE_FRESH, NULL); -} - - -void CCategoryLayout::sm_CbNextBtnClicked(void *dt, Evas_Object *obj, void *ev) -{ - CCategoryLayout *root = (CCategoryLayout *)dt; - if (root) - root->m_OnNextBtnClicked(obj, ev); -} - - -void CCategoryLayout::m_OnNextBtnClicked(Evas_Object *obj, void *ev) -{ - m_GotoPlayback(ADD_TYPE_NEXT, NULL); -} - - -void CCategoryLayout::sm_CbLastBtnClicked(void *dt, Evas_Object *obj, void *ev) -{ - CCategoryLayout *root = (CCategoryLayout *)dt; - if (root) - root->m_OnLastBtnClicked(obj, ev); -} - - -void CCategoryLayout::m_OnLastBtnClicked(Evas_Object *obj, void *ev) -{ - m_GotoPlayback(ADD_TYPE_END, NULL); -} - - char *CCategoryLayout::sm_CbGetSelectlistItemText(void *data, Evas_Object *obj, const char *part) { SCatItemInfo *itinfo = (SCatItemInfo *)data; @@ -799,98 +685,6 @@ void CCategoryLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, } -void CCategoryLayout::sm_CbGengridRealized(void *data, Evas_Object *obj, void *event_info) -{ - if (!data || !obj || !event_info) - return; - - elm_object_item_signal_callback_add((Elm_Object_Item *)event_info, - MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, - sm_CbItemSelect, data); -} - - -void CCategoryLayout::sm_CbGengridUnrealized(void *data, Evas_Object *obj, void *event_info) -{ - if (!data || !obj || !event_info) - return; - - elm_object_item_signal_callback_del((Elm_Object_Item *)event_info, - MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, - sm_CbItemSelect); -} - - -void CCategoryLayout::sm_CbKeyDown(void *dt, Evas *e, Evas_Object *obj, void *ei) -{ - CCategoryLayout *root = (CCategoryLayout *)dt; - - if (root) - root->m_OnKeyDown(e, obj, (Evas_Event_Key_Down*)ei); -} - - -void CCategoryLayout::m_OnKeyDown(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) -{ - Elm_Object_Item *it = NULL; - SContentInfo *ctxtinfo = NULL; - SCatItemInfo *itinfo = NULL; - - if (!obj) - return; - - if (strcmp(ev->keyname, KEY_MENU) || t.depth == - E_DEPTH_SELECT_LIST || t.depth == - E_DEPTH_SHOW_LIST) - return; - - it = elm_object_focused_item_get(obj); - if (!it) { - _ERR(" unable to get focused item "); - return; - } - t.focused_item = it; - - if (t.ctxtinfo) { - free(t.ctxtinfo); - t.ctxtinfo = NULL; - } - - ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); - if (!ctxtinfo) - return; - - itinfo = m_FindItemInfo(m->it_infolist, it); - if (!itinfo || itinfo->type == CAT_TYPE_PLAYLIST_NEW) { - free(ctxtinfo); - return; - } - - ctxtinfo->cbdata = this; - ctxtinfo->update = sm_CbCtxtUpdate; - ctxtinfo->close = sm_CbCtxtClose; - if (t.depth == E_DEPTH_SONG) { - ctxtinfo->type = CONTEXT_TYPE_SONG; - ctxtinfo->context = itinfo->sinfo; - } - else if (t.depth == E_DEPTH_ALBUM) { - ctxtinfo->type = CONTEXT_TYPE_ALBUM; - ctxtinfo->context = itinfo->alinfo; - } - else { - ctxtinfo->type = t_ContextType(); - ctxtinfo->context = itinfo->catinfo; - } - - t.ctxtinfo = ctxtinfo; - - SParcel parcel; - parcel.ctxtInfo = ctxtinfo; - if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) - _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); -} - - int CCategoryLayout::m_ConvertToMin(int milsec) { int min; @@ -1143,10 +937,9 @@ Evas_Object *CCategoryLayout::m_AddGrid(void) evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_gengrid_align_set(grid, 0, 0); - evas_object_event_callback_add(grid, EVAS_CALLBACK_MOUSE_MOVE, _gengrid_mouse_moved, this); - evas_object_smart_callback_add(grid, MUSIC_SIGNAL_REALIZED, sm_CbGengridRealized, this); - evas_object_smart_callback_add(grid, MUSIC_SIGNAL_UNREALIZED, sm_CbGengridUnrealized, this); - evas_object_event_callback_add(grid, EVAS_CALLBACK_KEY_DOWN, sm_CbKeyDown, this); + + Connect(grid, CATEGORY_LAYOUT_GENGRID, TYPE_MOUSE_MOVE | TYPE_KEY_DOWN | TYPE_REALIZED | TYPE_UNREALIZED); + elm_gengrid_item_size_set(grid, elm_config_scale_get() * GENGRID_ITEM_SIZE_W, elm_config_scale_get() * GENGRID_ITEM_SIZE_H); @@ -1188,19 +981,19 @@ void CCategoryLayout::m_AddButtons(void) btninfo[ABTN_PLAY].part = MUSIC_PART_CATEGORY_PLAYBTN; btninfo[ABTN_PLAY].style = MUSIC_STYLE_ADD_PLAY_BTN; btninfo[ABTN_PLAY].icon = MUSIC_IMAGE_ADD_PLAY; - btninfo[ABTN_PLAY].cb = sm_CbPlayBtnClicked; + btninfo[ABTN_PLAY].type = CATEGORY_LAYOUT_PLAY_BUTTON; btninfo[ABTN_NEXT].name = MUSIC_STR_ADDNEXT; btninfo[ABTN_NEXT].part = MUSIC_PART_CATEGORY_NEXTBTN; btninfo[ABTN_NEXT].style = MUSIC_STYLE_ADD_NEXT_BTN; btninfo[ABTN_NEXT].icon = MUSIC_IMAGE_ADD_NEXT; - btninfo[ABTN_NEXT].cb = sm_CbNextBtnClicked; + btninfo[ABTN_NEXT].type = CATEGORY_LAYOUT_NEXT_BUTTON; btninfo[ABTN_LAST].name = MUSIC_STR_ADDLAST; btninfo[ABTN_LAST].part = MUSIC_PART_CATEGORY_LASTBTN; btninfo[ABTN_LAST].style = MUSIC_STYLE_ADD_LAST_BTN; btninfo[ABTN_LAST].icon = MUSIC_IMAGE_ADD_LAST; - btninfo[ABTN_LAST].cb = sm_CbLastBtnClicked; + btninfo[ABTN_LAST].type = CATEGORY_LAYOUT_LAST_BUTTON; if (t.depth == E_DEPTH_SHOW_LIST) { btninfo[ABTN_PLAY].part = MUSIC_PART_ALBUM_PLAYBTN; @@ -1217,10 +1010,8 @@ void CCategoryLayout::m_AddButtons(void) EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_object_text_set(m->add_btn[i], _(btninfo[i].name)); elm_object_style_set(m->add_btn[i], btninfo[i].style); - evas_object_smart_callback_add(m->add_btn[i], - MUSIC_SIGNAL_CLICKED, btninfo[i].cb, this); - evas_object_event_callback_add(m->add_btn[i], - EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, this); + + Connect(m->add_btn[i], btninfo[ABTN_LAST].type, TYPE_CLICKED | TYPE_MOUSE_MOVE); img = elm_image_add(m->add_btn[i]); if (img) { @@ -1248,17 +1039,17 @@ void CCategoryLayout::m_AddSelectlistButtons(void) btninfo[SBTN_SELECT_ALL].name = MUSIC_TEXT_SELECT_ALL; btninfo[SBTN_SELECT_ALL].part = MUSIC_PART_LIST_SELECT_ALL; btninfo[SBTN_SELECT_ALL].style = MUSIC_STYLE_LIST_BTN; - btninfo[SBTN_SELECT_ALL].cb = sm_CbSelectAllClicked; + btninfo[SBTN_SELECT_ALL].type = CATEGORY_LAYOUT_SELECT_ALL_BUTTON; btninfo[SBTN_DONE].name = MUSIC_TEXT_LIST_DONE; btninfo[SBTN_DONE].part = MUSIC_PART_LIST_DONE_BTN; btninfo[SBTN_DONE].style = MUSIC_STYLE_LIST_BTN; - btninfo[SBTN_DONE].cb = sm_CbDoneBtnClicked; + btninfo[SBTN_DONE].type = CATEGORY_LAYOUT_DONE_BUTTON; btninfo[SBTN_CANCEL].name = MUSIC_TEXT_LIST_CANCEL; btninfo[SBTN_CANCEL].part = MUSIC_PART_LIST_CANCEL_BTN; btninfo[SBTN_CANCEL].style = MUSIC_STYLE_LIST_BTN; - btninfo[SBTN_CANCEL].cb = sm_CbCancelBtnClicked; + btninfo[SBTN_CANCEL].type = CATEGORY_LAYOUT_CANCEL_BUTTON; if (t.sel_type == SELECT_CREATE) { elm_object_part_text_set(Layout(), MUSIC_PART_LIST_MSG, @@ -1282,10 +1073,8 @@ void CCategoryLayout::m_AddSelectlistButtons(void) EVAS_HINT_EXPAND); elm_object_text_set(btn, _(btninfo[i].name)); elm_object_style_set(btn, btninfo[i].style); - evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, - btninfo[i].cb, this); - evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE, - _object_mouse_moved, this); + + Connect(btn, btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_CLICKED); elm_object_part_content_set(Layout(), btninfo[i].part, btn); m->select_btn[i] = btn; @@ -1368,8 +1157,9 @@ void CCategoryLayout::m_CreateSongList(void) evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_object_part_content_set(Layout(), MUSIC_PART_SONGLIST, genlist); - evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_MOVE, _genlist_mouse_moved, this); - evas_object_event_callback_add(genlist, EVAS_CALLBACK_KEY_DOWN, sm_CbKeyDown, this); + + Connect(genlist, CATEGORY_LAYOUT_GENLIST, TYPE_MOUSE_MOVE | TYPE_KEY_DOWN); + m->glist = genlist; list_item = elm_genlist_item_class_new(); @@ -1782,6 +1572,16 @@ bool CCategoryLayout::Create(CLayoutMgr *mgr) return false; } + t.epopup = new CEntryPopup; + if (!t.epopup) { + _ERR(" CEntryPopup creation failed "); + CExtBaseLayout::Destroy(); + evas_object_del(layout); + delete m; + m = NULL; + return false; + } + m->win = win; t.base = base; m->vmgr = vmgr; @@ -1790,7 +1590,8 @@ bool CCategoryLayout::Create(CLayoutMgr *mgr) t.depth = E_DEPTH_CATEGORY; t_UpdateLayout(false); - Connect(Layout()); + + Connect(Layout(), CATEGORY_LAYOUT, TYPE_KEY_DOWN); return true; } @@ -1801,14 +1602,15 @@ void CCategoryLayout::Destroy(void) ASSERT(m); Disconnect(Layout()); - if (t.epopup) - destroy_entry_popup(t.epopup); + if (t.epopup->FlagCreate()) + t.epopup->Destroy(); m_RemoveFocusIdler(); m_EmptyLayout(false); category_info_destroy(t.c_catinfo); album_info_destroy(t.c_alinfo); song_info_destroy(m->c_sinfo); + delete t.epopup; CExtBaseLayout::Destroy(); evas_object_del(Layout()); @@ -1836,6 +1638,8 @@ void CCategoryLayout::Update(bool focusFlag) if (t.depth != E_DEPTH_CATEGORY) return; t_UpdateLayout(true); + elm_object_part_content_set(t.base, MUSIC_PART_CONTENT, Layout()); + evas_object_show(Layout()); return; } @@ -1845,39 +1649,270 @@ void CCategoryLayout::Update(bool focusFlag) void CCategoryLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - int count; - Eina_List *alist = NULL; + switch (id) { + case CATEGORY_LAYOUT: + { + int count; + Eina_List *alist = NULL; + + if (!strcmp(ev->keyname, KEY_BACK)) { + if (t.depth == E_DEPTH_CATEGORY) { + SParcel parcel; + parcel.ctxtInfo = NULL; + parcel.updateType = E_FOCUS_UPDATE; + parcel.layoutId = NULL; + parcel.keyEvent = NULL; + m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); + return; + } + else if (t.depth == E_DEPTH_ALBUM) { + t.depth = E_DEPTH_CATEGORY; + } + else if (t.depth == E_DEPTH_SELECT_LIST) { + t.depth = E_DEPTH_CATEGORY; + } + else if (t.depth == E_DEPTH_SHOW_LIST) { + t.depth = E_DEPTH_CATEGORY; + } + else if (t.depth == E_DEPTH_SONG) { + count = 0; + alist = category_info_get_albumlist(t.c_catinfo); + if (alist) + count = eina_list_count(alist); + if (count == 1) + t.depth = E_DEPTH_CATEGORY; + else + t.depth = E_DEPTH_ALBUM; + } + + t_UpdateLayoutWithFocus(); + } + } + break; + + case CATEGORY_LAYOUT_GENGRID: + case CATEGORY_LAYOUT_GENLIST: + { + Elm_Object_Item *it = NULL; + SContentInfo *ctxtinfo = NULL; + SCatItemInfo *itinfo = NULL; + + if (!obj) + return; + + if (strcmp(ev->keyname, KEY_MENU) || t.depth == + E_DEPTH_SELECT_LIST || t.depth == + E_DEPTH_SHOW_LIST) + return; + + it = elm_object_focused_item_get(obj); + if (!it) { + _ERR(" unable to get focused item "); + return; + } + t.focused_item = it; + + if (t.ctxtinfo) { + free(t.ctxtinfo); + t.ctxtinfo = NULL; + } + + ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo)); + if (!ctxtinfo) + return; + + itinfo = m_FindItemInfo(m->it_infolist, it); + if (!itinfo || itinfo->type == CAT_TYPE_PLAYLIST_NEW) { + free(ctxtinfo); + return; + } + + ctxtinfo->cbdata = this; + ctxtinfo->update = sm_CbCtxtUpdate; + ctxtinfo->close = sm_CbCtxtClose; + if (t.depth == E_DEPTH_SONG) { + ctxtinfo->type = CONTEXT_TYPE_SONG; + ctxtinfo->context = itinfo->sinfo; + } + else if (t.depth == E_DEPTH_ALBUM) { + ctxtinfo->type = CONTEXT_TYPE_ALBUM; + ctxtinfo->context = itinfo->alinfo; + } + else { + ctxtinfo->type = t_ContextType(); + ctxtinfo->context = itinfo->catinfo; + } + + t.ctxtinfo = ctxtinfo; - if (!strcmp(ev->keyname, KEY_BACK)) { - if (t.depth == E_DEPTH_CATEGORY) { SParcel parcel; - parcel.ctxtInfo = NULL; - parcel.updateType = E_FOCUS_UPDATE; - parcel.layoutId = NULL; - parcel.keyEvent = NULL; - m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel); - return; + parcel.ctxtInfo = ctxtinfo; + if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel)) + _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed"); } - else if (t.depth == E_DEPTH_ALBUM) { - t.depth = E_DEPTH_CATEGORY; + break; + + default: + break; + } +} + + +void CCategoryLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) +{ + switch (id) { + case CATEGORY_LAYOUT_GENGRID: + { + Elm_Object_Item *item; + + if (!obj) + return; + + item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL, NULL); + if (!item) + return; + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); } - else if (t.depth == E_DEPTH_SELECT_LIST) { - t.depth = E_DEPTH_CATEGORY; + break; + + case CATEGORY_LAYOUT_GENLIST: + { + Elm_Object_Item *item; + + if (!obj) + return; + + item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL); + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); } - else if (t.depth == E_DEPTH_SHOW_LIST) { - t.depth = E_DEPTH_CATEGORY; + break; + + case CATEGORY_LAYOUT_PLAY_BUTTON: + case CATEGORY_LAYOUT_NEXT_BUTTON: + case CATEGORY_LAYOUT_LAST_BUTTON: + case CATEGORY_LAYOUT_SELECT_ALL_BUTTON: + case CATEGORY_LAYOUT_DONE_BUTTON: + case CATEGORY_LAYOUT_CANCEL_BUTTON: + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); + break; + + default: + break; + } +} + + +void CCategoryLayout::OnMouseClicked(int id, Evas_Object *obj) +{ + switch (id) { + case CATEGORY_LAYOUT_PLAY_BUTTON: + m_GotoPlayback(ADD_TYPE_FRESH, NULL); + break; + + case CATEGORY_LAYOUT_NEXT_BUTTON: + m_GotoPlayback(ADD_TYPE_NEXT, NULL); + break; + + case CATEGORY_LAYOUT_LAST_BUTTON: + m_GotoPlayback(ADD_TYPE_END, NULL); + break; + + case CATEGORY_LAYOUT_SELECT_ALL_BUTTON: + { + Eina_List *l = NULL; + SCatItemInfo *itinfo = NULL; + void *list_obj = NULL; + int tc; + + tc = eina_list_count(m->it_infolist); + + if (m->count == tc) { + elm_object_text_set(m->select_btn[SBTN_SELECT_ALL], + _(MUSIC_TEXT_SELECT_ALL)); + m->count = 0; + EINA_LIST_FOREACH(m->it_infolist, l, list_obj) { + itinfo = (SCatItemInfo *)list_obj; + itinfo->check_status = false; + } + elm_genlist_realized_items_update(m->glist); + + return; + } + + elm_object_text_set(m->select_btn[SBTN_SELECT_ALL], + _(MUSIC_TEXT_DESELECT_ALL)); + m->count = tc; + EINA_LIST_FOREACH(m->it_infolist, l, list_obj) { + itinfo = (SCatItemInfo *)list_obj; + itinfo->check_status = true; + } + elm_genlist_realized_items_update(m->glist); } - else if (t.depth == E_DEPTH_SONG) { - count = 0; - alist = category_info_get_albumlist(t.c_catinfo); - if (alist) - count = eina_list_count(alist); - if (count == 1) - t.depth = E_DEPTH_CATEGORY; - else - t.depth = E_DEPTH_ALBUM; + break; + + case CATEGORY_LAYOUT_DONE_BUTTON: + { + if (t.sel_type == SELECT_ADD) { + m_AddSelectedSongs(); + return; + } + else if (t.sel_type == SELECT_REMOVE) { + m_RemoveSelectedSongs(); + return; + } + + if (t.epopup->FlagCreate()) + t.epopup->Destroy(); + + t.epopup->Create(t.base, MUSIC_STR_EMPTY, sm_CbEntrynameSet, this); } + break; + + case CATEGORY_LAYOUT_CANCEL_BUTTON: + { + t.depth = E_DEPTH_CATEGORY; + t_UpdateLayoutWithFocus(); + } + break; + + default: + break; + } +} + + +void CCategoryLayout::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + switch (id) { + case CATEGORY_LAYOUT_GENGRID: + elm_object_item_signal_callback_add(item, + MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, + sm_CbItemSelect, this); + break; + + default: + break; + } +} + + +void CCategoryLayout::OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + switch (id) { + case CATEGORY_LAYOUT_GENGRID: + elm_object_item_signal_callback_del(item, + MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW, + sm_CbItemSelect); + break; - t_UpdateLayoutWithFocus(); + default: + break; } } diff --git a/src/views/entry-popup.cpp b/src/views/entry-popup.cpp index a222f58..8d88779 100644 --- a/src/views/entry-popup.cpp +++ b/src/views/entry-popup.cpp @@ -20,130 +20,132 @@ #include "define.h" #include "common.h" #include "common-ui.h" +#include "dbg.h" +#include +#include #include "entry-popup.h" //#define KEY_SELECT "Select" #define KEY_POPUP_ENTER "Return" -struct entrypopup_data { + +struct SEntryPopup { Evas_Object *layout; Evas_Object *entry; - void (*entryname_cb)(void *, const char *); + void(*cbEntryName)(void *, const char *); void *data; Ecore_Idler *idler; }; -static void _entry_key_pressed(void *dt, Evas *e, Evas_Object *obj, void *ei) -{ - struct entrypopup_data *epd; - Evas_Event_Key_Down *ev; - const char *str; - - if (!obj || !e || !ei || !dt) - return; - - epd = (entrypopup_data *)dt; - ev = (Evas_Event_Key_Down *)ei; - if (!ev->keyname) - return; - - if (strcmp(ev->keyname, KEY_BACK) == 0) - destroy_entry_popup(epd->layout); - // Keyname should be checked!!! - else if (strcmp(ev->keyname, KEY_POPUP_ENTER/*KEY_SELECT*/) == 0) { - str = elm_entry_entry_get(obj); - if (epd->entryname_cb && str) - epd->entryname_cb(epd->data, str); - } -} - -static Eina_Bool _focus_idler_cb(void *dt) +Eina_Bool CEntryPopup::sm_CbFocusIdler(void *dt) { - struct entrypopup_data *epd; - - if (!dt) - return ECORE_CALLBACK_CANCEL; - - epd = (entrypopup_data *)dt; - epd->idler = NULL; - elm_object_focus_set(epd->entry, EINA_TRUE); - + CEntryPopup *root = (CEntryPopup *)dt; + if (root) + root->m_OnFocusIdler(); return ECORE_CALLBACK_CANCEL; } -void destroy_entry_popup(Evas_Object *layout) -{ - struct entrypopup_data *epd; - - if (!layout) - return; - - epd = (entrypopup_data *)evas_object_data_get(layout, MUSIC_ENTRY_POPUP_DATA); - if (epd) { - if (epd->idler) - ecore_idler_del(epd->idler); - free(epd); - } - evas_object_del(layout); +void CEntryPopup::m_OnFocusIdler(void) +{ + m->idler = NULL; + elm_object_focus_set(m->entry, EINA_TRUE); } -Evas_Object *create_entry_popup(Evas_Object *base, const char *text, - void (*entryname_cb)(void *, const char *), void *data) + +bool CEntryPopup::Create(Evas_Object *base, const char *text, void(*cbEntryName)(void *, const char *), void *data) { + ASSERT(!m); + Evas_Object *layout, *entry; - struct entrypopup_data *epd; if (!base) return NULL; + m = new SEntryPopup; + if (!m) { + return NULL; + } + layout = elm_layout_add(base); - if (!layout) + if (!layout) { + delete m; return NULL; + } elm_layout_file_set(layout, EDJEFILE, MUSIC_ENTRY_POPUP_LAYOUT); evas_object_size_hint_weight_set(layout, - EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(layout, - EVAS_HINT_FILL, EVAS_HINT_FILL); + EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(layout); entry = elm_entry_add(layout); if (!entry) { evas_object_del(layout); + delete m; return NULL; } elm_object_style_set(entry, MUSIC_STYLE_ENTRY); elm_entry_single_line_set(entry, EINA_TRUE); elm_entry_input_panel_language_set(entry, - ELM_INPUT_PANEL_LANG_ALPHABET); + ELM_INPUT_PANEL_LANG_ALPHABET); evas_object_size_hint_weight_set(entry, - EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(entry, - EVAS_HINT_FILL, EVAS_HINT_FILL); + EVAS_HINT_FILL, EVAS_HINT_FILL); if (text) elm_entry_entry_set(entry, text); elm_entry_cursor_end_set(entry); elm_object_part_content_set(layout, MUSIC_PART_ENTRY, entry); - epd = (entrypopup_data *)calloc(1, sizeof(*epd)); - if (!epd) { - evas_object_del(layout); - return NULL; - } + m->layout = layout; + m->entry = entry; + m->cbEntryName = cbEntryName; + m->data = data; + m->idler = ecore_idler_add(sm_CbFocusIdler, this); + + Connect(entry); +} - epd->layout = layout; - epd->entry = entry; - epd->entryname_cb = entryname_cb; - epd->data = data; - epd->idler = ecore_idler_add(_focus_idler_cb, epd); - evas_object_event_callback_add(entry, EVAS_CALLBACK_KEY_DOWN, - _entry_key_pressed, epd); - evas_object_data_set(layout, MUSIC_ENTRY_POPUP_DATA, epd); +void CEntryPopup::Destroy(void) +{ + ASSERT(m); + + if (m->idler) + ecore_idler_del(m->idler); + + evas_object_del(m->layout); + delete m; +} + + +bool CEntryPopup::FlagCreate(void) +{ + return !!m; +} - return layout; + +void CEntryPopup::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) +{ + const char *str; + + if (!obj || !e) + return; + + if (!ev->keyname) + return; + + if (strcmp(ev->keyname, KEY_BACK) == 0) + Destroy(); + // Keyname should be checked!!! + else if (strcmp(ev->keyname, KEY_POPUP_ENTER/*KEY_SELECT*/) == 0) { + str = elm_entry_entry_get(obj); + if (m->cbEntryName && str) + m->cbEntryName(m->data, str); + } } diff --git a/src/views/folder-layout.cpp b/src/views/folder-layout.cpp index fadc726..2f00aab 100644 --- a/src/views/folder-layout.cpp +++ b/src/views/folder-layout.cpp @@ -41,11 +41,17 @@ enum EObjectType { + FOLDER_LAYOUT, + FOLDER_LAYOUT_GENGRID, FOLDER_LAYOUT_PLAY_BUTTON, FOLDER_LAYOUT_NEXT_BUTTON, FOLDER_LAYOUT_LAST_BUTTON, - FOLDER_LAYOUT, - FOLDER_LAYOUT_GENGRID, +}; + +enum EBtnType { + BTN_PLAY, + BTN_NEXT, + BTN_LAST }; struct SFolderItemInfo { @@ -72,6 +78,7 @@ struct SBtnInfo { const char *part; const char *style; const char *icon; + EObjectType type; }; struct SFolderLayout { @@ -659,20 +666,23 @@ void CFolderLayout::m_CreateTopsection(void) Evas_Object *img; SBtnInfo btninfo[TOTAL_ADD_BTNS]; - btninfo[FOLDER_LAYOUT_PLAY_BUTTON].name = MUSIC_STR_PLAY; - btninfo[FOLDER_LAYOUT_PLAY_BUTTON].part = MUSIC_PART_FOLDER_PLAYBTN; - btninfo[FOLDER_LAYOUT_PLAY_BUTTON].style = MUSIC_STYLE_ADD_PLAY_BTN; - btninfo[FOLDER_LAYOUT_PLAY_BUTTON].icon = MUSIC_IMAGE_ADD_PLAY; + btninfo[BTN_PLAY].name = MUSIC_STR_PLAY; + btninfo[BTN_PLAY].part = MUSIC_PART_FOLDER_PLAYBTN; + btninfo[BTN_PLAY].style = MUSIC_STYLE_ADD_PLAY_BTN; + btninfo[BTN_PLAY].icon = MUSIC_IMAGE_ADD_PLAY; + btninfo[BTN_PLAY].type = FOLDER_LAYOUT_PLAY_BUTTON; - btninfo[FOLDER_LAYOUT_NEXT_BUTTON].name = MUSIC_STR_ADDNEXT; - btninfo[FOLDER_LAYOUT_NEXT_BUTTON].part = MUSIC_PART_FOLDER_NEXTBTN; - btninfo[FOLDER_LAYOUT_NEXT_BUTTON].style = MUSIC_STYLE_ADD_NEXT_BTN; - btninfo[FOLDER_LAYOUT_NEXT_BUTTON].icon = MUSIC_IMAGE_ADD_NEXT; + btninfo[BTN_NEXT].name = MUSIC_STR_ADDNEXT; + btninfo[BTN_NEXT].part = MUSIC_PART_FOLDER_NEXTBTN; + btninfo[BTN_NEXT].style = MUSIC_STYLE_ADD_NEXT_BTN; + btninfo[BTN_NEXT].icon = MUSIC_IMAGE_ADD_NEXT; + btninfo[BTN_NEXT].type = FOLDER_LAYOUT_NEXT_BUTTON; - btninfo[FOLDER_LAYOUT_LAST_BUTTON].name = MUSIC_STR_ADDLAST; - btninfo[FOLDER_LAYOUT_LAST_BUTTON].part = MUSIC_PART_FOLDER_LASTBTN; - btninfo[FOLDER_LAYOUT_LAST_BUTTON].style = MUSIC_STYLE_ADD_LAST_BTN; - btninfo[FOLDER_LAYOUT_LAST_BUTTON].icon = MUSIC_IMAGE_ADD_LAST; + btninfo[BTN_LAST].name = MUSIC_STR_ADDLAST; + btninfo[BTN_LAST].part = MUSIC_PART_FOLDER_LASTBTN; + btninfo[BTN_LAST].style = MUSIC_STYLE_ADD_LAST_BTN; + btninfo[BTN_LAST].icon = MUSIC_IMAGE_ADD_LAST; + btninfo[BTN_LAST].type = FOLDER_LAYOUT_LAST_BUTTON; for (i = 0; i < TOTAL_ADD_BTNS; i++) { btn = elm_button_add(Layout()); @@ -684,7 +694,7 @@ void CFolderLayout::m_CreateTopsection(void) elm_object_text_set(btn, _(btninfo[i].name)); elm_object_style_set(btn, btninfo[i].style); - Connect(btn, i, TYPE_MOUSE_MOVE | TYPE_CLICKED); + Connect(btn, btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_CLICKED); img = elm_image_add(btn); if (img) { diff --git a/src/views/playback-view.cpp b/src/views/playback-view.cpp index 612fa05..1dbfe4a 100644 --- a/src/views/playback-view.cpp +++ b/src/views/playback-view.cpp @@ -128,7 +128,6 @@ struct SBtnInfo { const char *txt; const char *part; EEvasObject type; - //Evas_Smart_Cb cb; }; enum EPressTypes { @@ -742,8 +741,7 @@ void CPlaybackView::m_CreateErrorPopup(void) m->eoErrPopup = popup; Connect(btn, EO_ERROR_POPUP_BUTTON, TYPE_CLICKED | TYPE_KEY_DOWN); - //evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, sm_CbPopupOkBtnClicked, m); - //evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, sm_CbPopupOkKeyPressed, m); + elm_object_focus_set(btn, EINA_TRUE); return; @@ -769,11 +767,9 @@ void CPlaybackView::m_CreateSettingsPopup(void) SBtnInfo btninfo[TOTAL_SETTING_BTNS]; btninfo[BTN_EDIT].txt = MUSIC_TEXT_EDIT_PLAYLIST; - //btninfo[BTN_EDIT].cb = sm_CbEditBtnClicked; btninfo[BTN_EDIT].type = EO_EDIT_PLAYLIST; btninfo[BTN_CLEAR].txt = MUSIC_TEXT_CLEAR_PLAYLIST; - //btninfo[BTN_CLEAR].cb = sm_CbClearBtnClicked; btninfo[BTN_CLEAR].type = EO_CLEAR_PLAYLIST; eoCtxPopup = elm_ctxpopup_add(m->eoWin); @@ -804,8 +800,6 @@ void CPlaybackView::m_CreateSettingsPopup(void) elm_object_text_set(m->eoBtnSetting[i], _(btninfo[i].txt)); Connect(m->eoBtnSetting[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE); - //evas_object_smart_callback_add(m->eoBtnSetting[i], MUSIC_SIGNAL_CLICKED, btninfo[i].cb, m); - //evas_object_event_callback_add(m->eoBtnSetting[i], EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m); evas_object_show(m->eoBtnSetting[i]); } @@ -815,7 +809,6 @@ void CPlaybackView::m_CreateSettingsPopup(void) scale = elm_config_scale_get(); Connect(box, EO_BOX, TYPE_KEY_DOWN); - //evas_object_event_callback_add(box, EVAS_CALLBACK_KEY_DOWN, sm_CbPopupKeyPressed, m); elm_object_part_content_set(m->eoBase, MUSIC_PART_SETTINGS_POPUP, eoCtxPopup); /* If list empty disable these options */ @@ -1066,7 +1059,6 @@ void CPlaybackView::m_KeyNextUnpress(void) return; m_HandleOnUnpressed(m->eoBtnControl[BTN_FORWARD]); - //sm_CbOnUnpressed(m, m->eoBtnControl[BTN_FORWARD], NULL); } @@ -1076,7 +1068,6 @@ void CPlaybackView::m_KeyPreviousUnpress(void) return; m_HandleOnUnpressed(m->eoBtnControl[BTN_REWIND]); - //sm_CbOnUnpressed(m, m->eoBtnControl[BTN_REWIND], NULL); } @@ -1095,11 +1086,11 @@ void CPlaybackView::m_HandleKeyPress(char *keyname) else if (strcmp(keyname, (char*)KEY_PREVIOUS) == 0) m_KeyPreviousPress(); else if (strcmp(keyname, (char*)KEY_VOLUMEUP) == 0) - m->pHandleVolume->Up(); //m_KeyVolumeupPress(); + m->pHandleVolume->Up(); else if (strcmp(keyname, (char*)KEY_VOLUMEDOWN) == 0) - m->pHandleVolume->Down();// m_KeyVolumedownPress(); + m->pHandleVolume->Down(); else if (strcmp(keyname, (char*)KEY_MUTE) == 0) - m->pHandleVolume->Mute(); // m_KeyMutePress(); + m->pHandleVolume->Mute(); } @@ -1127,8 +1118,7 @@ void CPlaybackView::m_AddSlider(void) elm_object_part_content_set(m->eoBase, MUSIC_PART_PROGRESSBAR, eoSlider); Connect(eoSlider, EO_SLIDER, TYPE_CHANGED | TYPE_MOUSE_MOVE); - //evas_object_smart_callback_add(eoSlider, MUSIC_SIGNAL_CHANGED, sm_CbSliderValueChanged, m); - //evas_object_event_callback_add(eoSlider, EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m); + evas_object_show(eoSlider); m->eoSlider = eoSlider; } @@ -1168,15 +1158,12 @@ void CPlaybackView::m_AddEditPlaylistButtons(void) SBtnInfo btninfo[TOTAL_EDIT_BTNS]; btninfo[BTN_CANCEL].txt = MUSIC_TEXT_CANCEL; - //btninfo[BTN_CANCEL].cb = sm_CbCancelBtnClicked; btninfo[BTN_CANCEL].type = EO_CANCEL; btninfo[BTN_DESELECT].txt = MUSIC_TEXT_DESELECT; - //btninfo[BTN_DESELECT].cb = sm_CbDeselectBtnClicked; btninfo[BTN_DESELECT].type = EO_DESELECT; btninfo[BTN_DELETE].txt = MUSIC_TEXT_DELETE; - //btninfo[BTN_DELETE].cb = sm_CbDeleteBtnClicked; btninfo[BTN_DELETE].type = EO_DELETE; box = _add_box(m->eoBase); @@ -1199,8 +1186,7 @@ void CPlaybackView::m_AddEditPlaylistButtons(void) elm_box_pack_end(box, m->eoBtnEdit[i]); elm_object_text_set(m->eoBtnEdit[i], _(btninfo[i].txt)); - //evas_object_smart_callback_add(m->eoBtnEdit[i], MUSIC_SIGNAL_CLICKED, btninfo[i].cb, m); - //evas_object_event_callback_add(m->eoBtnEdit[i], EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m); + Connect(m->eoBtnEdit[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE); evas_object_show(m->eoBtnEdit[i]); } @@ -1217,22 +1203,18 @@ void CPlaybackView::m_AddControlButtons(void) SBtnInfo btninfo[TOTAL_CONTROL_BTNS]; btninfo[BTN_SETTINGS].txt = MUSIC_STYLE_BTN_SETTINGS; - //btninfo[BTN_SETTINGS].cb = sm_CbSettingsBtnClicked; btninfo[BTN_SETTINGS].type = EO_BTN_SETTINGS; btninfo[BTN_SHUFFLE].txt = MUSIC_STYLE_BTN_SHUFFLE; - //btninfo[BTN_SHUFFLE].cb = sm_CbShuffleBtnClicked; btninfo[BTN_SHUFFLE].type = EO_BTN_SHUFFLE; btninfo[BTN_REPEAT].txt = MUSIC_STYLE_BTN_REPEAT; - //btninfo[BTN_REPEAT].cb = sm_CbRepeatBtnClicked; btninfo[BTN_REPEAT].type = EO_BTN_REPEAT; btninfo[BTN_REWIND].txt = MUSIC_STYLE_BTN_REWIND; btninfo[BTN_REWIND].type = EO_BTN_REWIND; btninfo[BTN_PLAY].txt = MUSIC_STYLE_BTN_PLAY; - //btninfo[BTN_PLAY].cb = sm_CbPlayBtnClicked; btninfo[BTN_PLAY].type = EO_BTN_PLAY; btninfo[BTN_FORWARD].txt = MUSIC_STYLE_BTN_FORWARD; @@ -1260,14 +1242,10 @@ void CPlaybackView::m_AddControlButtons(void) if (i == BTN_REWIND || i == BTN_FORWARD) { Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_PRESSED | TYPE_UNPRESSED | TYPE_MOUSE_MOVE); - //evas_object_smart_callback_add(m->eoBtnControl[i], MUSIC_SIGNAL_PRESSED, sm_CbOnPressed, m); - //evas_object_smart_callback_add(m->eoBtnControl[i], MUSIC_SIGNAL_UNPRESSED, sm_CbOnUnpressed, m); } else { Connect(m->eoBtnControl[i], btninfo[i].type, TYPE_CLICKED | TYPE_MOUSE_MOVE); - //evas_object_smart_callback_add(m->eoBtnControl[i], MUSIC_SIGNAL_CLICKED, btninfo[i].cb, m); } - //evas_object_event_callback_add(m->eoBtnControl[i], EVAS_CALLBACK_MOUSE_MOVE, _object_mouse_moved, m); evas_object_show(m->eoBtnControl[i]); } @@ -1484,11 +1462,7 @@ void CPlaybackView::m_AddGenlist(void) elm_genlist_multi_select_set(genlist, EINA_FALSE); Connect(genlist, EO_PLAYLIST, TYPE_REALIZED | TYPE_UNREALIZED | TYPE_MOUSE_MOVE | TYPE_KEY_DOWN | TYPE_ACTIVATED); - //evas_object_smart_callback_add(genlist, MUSIC_SIGNAL_ACTIVATED, sm_CbGenlistItemActivated, m); - //evas_object_smart_callback_add(genlist, MUSIC_SIGNAL_REALIZED, sm_CbGenlistRealized, m); - //evas_object_smart_callback_add(genlist, MUSIC_SIGNAL_UNREALIZED, sm_CbGenlistUnrealized, m); - //evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_MOVE, _genlist_mouse_moved, m); - //evas_object_event_callback_add(genlist, EVAS_CALLBACK_KEY_DOWN, sm_CbKeyDown, m); + evas_object_show(genlist); m->eoPlaylist = genlist; } @@ -1693,12 +1667,8 @@ bool CPlaybackView::Create(void *data) m_UpdatePlaymodeFocusSequence(); Connect(m->eoBase, EO_BASE, TYPE_KEY_DOWN | TYPE_KEY_UP); - //evas_object_event_callback_add(eoBase, EVAS_CALLBACK_KEY_DOWN, sm_CbKeyPressed, m); - //evas_object_event_callback_add(eoBase, EVAS_CALLBACK_KEY_UP, sm_CbKeyReleased, m); m->hMusicController->AddListener(this); - //m->cbInfo[E_SONG_COMPLETE] = m->hMusicController->AddCallback(E_SONG_COMPLETE, sm_CbUpdateCurrentSongInfo, m); - //m->cbInfo[E_PLAYBACK_ERROR] = m->hMusicController->AddCallback(E_PLAYBACK_ERROR, sm_CbPlaybackError, m); return true; } @@ -1709,8 +1679,6 @@ void CPlaybackView::Destroy(void) ASSERT(m); m->hMusicController->RemoveListener(this); - //m->hMusicController->RemoveCallback(m->cbInfo[E_SONG_COMPLETE]); - //m->hMusicController->RemoveCallback(m->cbInfo[E_PLAYBACK_ERROR]); m_DestroyErrorPopup(); diff --git a/src/views/playlist-layout.cpp b/src/views/playlist-layout.cpp index e63c0e5..c282844 100644 --- a/src/views/playlist-layout.cpp +++ b/src/views/playlist-layout.cpp @@ -63,8 +63,7 @@ void CPlaylistLayout::m_OnEntryRename(const char *name) id = category_info_get_category_id(t.c_catinfo); str = strdup(name); - destroy_entry_popup(t.epopup); - t.epopup = NULL; + t.epopup->Destroy(); if (CMusicController::GetInstance()->MediaExistPlaylist(str)) { _create_message_box(Layout(), MUSIC_TEXT_INUSE_MSG); @@ -114,10 +113,10 @@ void CPlaylistLayout::m_PlaylistCtxtAction(EActionType type) } else if (type == ACTION_TYPE_RENAME) { text = category_info_get_name(catinfo); - if (t.epopup) - destroy_entry_popup(t.epopup); + if (t.epopup->FlagCreate()) + t.epopup->Destroy(); - t.epopup = create_entry_popup(t.base, text, sm_CbEntryRename, this); + t.epopup->Create(t.base, text, sm_CbEntryRename, this); } else if (type == ACTION_TYPE_ADDSONG) { -- 2.7.4 From f9d047affaf07da570f5b56e34545daf589e3040 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Wed, 4 Feb 2015 14:54:47 +0900 Subject: [PATCH 08/16] 1. Apply modified listeners to CContextView 2. Fix UI abnormal behavior Change-Id: I5a07cf56d6b2bfee495e29343d1168374140e685 Signed-off-by: Kim Tae Soo --- include/context-view.h | 49 +- res/edc/widgets/button.edc | 23 + res/edc/widgets/ctxpopup.edc | 5 +- res/edc/widgets/gengrid.edc | 1 + res/edc/widgets/genlist.edc | 4 + res/edc/widgets/progressbar.edc | 1 + res/edc/widgets/slider.edc | 2 + src/main.cpp | 4 +- src/views/context-view.cpp | 1217 ++++++++++++++++++++------------------- 9 files changed, 692 insertions(+), 614 deletions(-) mode change 100755 => 100644 res/edc/widgets/ctxpopup.edc diff --git a/include/context-view.h b/include/context-view.h index c3c852c..8212262 100644 --- a/include/context-view.h +++ b/include/context-view.h @@ -21,14 +21,35 @@ struct SContentInfo; struct SRltvCtnt; -class CContextView : public CBaseView, public CListenerMgr, public IKeyDownListener { +class CContextView : public CBaseView, public CListenerMgr, + public IKeyDownListener, public IKeyUpListener, + public IMouseMoveListener, public IMouseUpListener, + public IFocusedListener, public IUnfocusedListener { private: struct SContextView* m; private: static void sm_CbRltdCtntSelected(void *data, Evas_Object *obj, const char *emission, const char *source); - static void sm_CbAddScroller(void *cookie, Evas_Object *base, Evas_Object **scroller); - void m_OnAddScroller(Evas_Object *base, Evas_Object **scroller); + + static void sm_CbPopupKeyPressed(void *data, Evas *e, Evas_Object *obj, void *ei); + void m_OnPopUpKeyPressed(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); + + static void sm_CbRemove(void *data, Evas_Object *obj, void *ei); + void m_OnRemove(Evas_Object *obj); + + static void sm_CbCancel(void *data, Evas_Object *obj, void *ei); + void m_OnCancel(Evas_Object *obj); + + static int sm_CbSortPlaylist(const void *d1, const void *d2); + static void sm_CbPopupDeleted(void *data, Evas *e, Evas_Object *obj, void *ei); + + static void sm_CbPopupBtnClicked(void *data, Evas_Object *obj, void *ei); + void m_OnPopupBtnClicked(Evas_Object *obj); + + static Eina_Bool sm_CbSelectIdler(void *dt); + Eina_Bool m_OnSelectIdler(void); + + private: Evas_Object *m_AddScroller(Evas_Object *base); @@ -60,6 +81,13 @@ private: bool m_CreateMoreinfoLayout(SRltvCtnt *rctnt, Evas_Object *img); bool m_CreateInfoPart(void); bool m_CreateFullView(void); + Evas_Object *m_CreatePlaylistPopup(void); + Evas_Object *m_CreateRemovePopup(Evas_Object *base, const char *msg, + Evas_Object_Event_Cb _close_cb, Evas_Smart_Cb _remove_cb, + Evas_Smart_Cb _cancel_cb, void *dt); + void m_DestroyPopup(void); + void m_HandleBtnSelected(int btnType); + void m_HandleMoreinfoSelected(Evas_Object *obj); protected: virtual void t_OnShow(void); @@ -67,7 +95,15 @@ protected: virtual void t_OnUpdate(void* data); public: - CContextView(const char *pViewId) : CBaseView(pViewId), IKeyDownListener(this), m(0) {} + CContextView(const char *pViewId) : + CBaseView(pViewId), + IKeyDownListener(this), + IKeyUpListener(this), + IMouseMoveListener(this), + IMouseUpListener(this), + IFocusedListener(this), + IUnfocusedListener(this), + m(0) {} virtual ~CContextView() {} virtual bool Create(void *data); @@ -77,6 +113,11 @@ public: public: virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev); + virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev); + virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); + virtual void OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev); + virtual void OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item); + virtual void OnUnfocused(int id, Evas_Object *obj, Elm_Object_Item *item); }; diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index 108e7da..192686d 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -3,6 +3,7 @@ group { name: "elm/button/base/music_hover_entry"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_TICK COMP; } @@ -269,6 +270,7 @@ group { group { name: "elm/button/base/music_sourcebtn"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_PULLDOWN_ARROW COMP; image: MUSIC_IMAGE_PLAYBACK_ROUND_ICON COMP; @@ -595,6 +597,7 @@ group { group { name: "elm/button/base/music_sortbtn"; inherit: "elm/button/base/music_sourcebtn"; + data.item: "focus_highlight" "on"; parts { part { name: "bg"; @@ -609,6 +612,7 @@ group { group { name: "elm/button/base/menubtn"; + data.item: "focus_highlight" "on"; images { image: MUSIC_GROUPBTN_BG COMP; } @@ -807,6 +811,7 @@ group { group { name: "elm/button/base/playbackbtn"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_PLAYBACK_ICON COMP; image: MUSIC_IMAGE_PLAYBACK_ROUND_ICON COMP; @@ -885,6 +890,7 @@ group { group { name: "elm/button/base/music_btn_common"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_BTN_NORMAL_BG COMP; image: MUSIC_IMAGE_BTN_FOCUS_BG COMP; @@ -1065,6 +1071,7 @@ group { group { name: "elm/button/base/music_btn_settings"; inherit: "elm/button/base/music_btn_common"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_BTN_SETTINGS COMP; } @@ -1084,6 +1091,7 @@ group { group { name: "elm/button/base/music_btn_rewind"; inherit: "elm/button/base/music_btn_common"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_BTN_REWIND COMP; } @@ -1103,6 +1111,7 @@ group { group { name: "elm/button/base/music_btn_forward"; inherit: "elm/button/base/music_btn_common"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_BTN_FORWARD COMP; } @@ -1122,6 +1131,7 @@ group { group { name: "elm/button/base/music_btn_shuffle"; inherit: "elm/button/base/music_btn_common"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_BTN_SHUFFLE_OFF COMP; image: MUSIC_IMAGE_BTN_SHUFFLE_ON COMP; @@ -1164,6 +1174,7 @@ group { group { name: "elm/button/base/music_btn_repeat"; inherit: "elm/button/base/music_btn_common"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_BTN_REPEAT_OFF COMP; image: MUSIC_IMAGE_BTN_REPEAT_ON COMP; @@ -1218,6 +1229,7 @@ group { group { name: "elm/button/base/music_btn_play"; inherit: "elm/button/base/music_btn_common"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_BTN_PLAY COMP; image: MUSIC_IMAGE_BTN_PAUSE COMP; @@ -1258,6 +1270,7 @@ group { group { name: "elm/button/base/music_btn_settings_option_t"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_PLAYBACK_ROUNDT_ICON COMP; image: MUSIC_IMAGE_PLAYBACK_ROUNDB_ICON COMP; @@ -1436,6 +1449,7 @@ group { group { name: "elm/button/base/music_btn_settings_option_b"; inherit: "elm/button/base/music_btn_settings_option_t"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_POPUP_DOWN_ARROW COMP; } @@ -1513,6 +1527,7 @@ group { group { name: "elm/button/base/music_btn_edit"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_PLAYBACK_ROUND_ICON COMP; } @@ -1656,6 +1671,7 @@ group { group { name: "elm/button/base/add_common_btn"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_ADDBTN_BG_NORMAL COMP; image: MUSIC_IMAGE_ADDBTN_BG_FOCUS COMP; @@ -1862,6 +1878,7 @@ group { group { name: "elm/button/base/add_play_btn"; + data.item: "focus_highlight" "on"; inherit: "elm/button/base/add_common_btn"; parts { part { @@ -1888,6 +1905,7 @@ group { group { name: "elm/button/base/add_next_btn"; + data.item: "focus_highlight" "on"; inherit: "elm/button/base/add_common_btn"; parts { part { @@ -1914,6 +1932,7 @@ group { group { name: "elm/button/base/add_last_btn"; + data.item: "focus_highlight" "on"; inherit: "elm/button/base/add_common_btn"; parts { part { @@ -1940,6 +1959,7 @@ group { group { name: "elm/button/base/music_listbtn"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_ADDBTN_BG_NORMAL COMP; image: MUSIC_IMAGE_ADDBTN_BG_FOCUS COMP; @@ -2072,6 +2092,7 @@ group { group { name: "elm/button/base/music_middletext_btn"; + data.item: "focus_highlight" "on"; script { public bottom; } @@ -2231,6 +2252,7 @@ group { } group { name: "elm/button/base/music_toptext_btn"; + data.item: "focus_highlight" "on"; inherit: "elm/button/base/music_middletext_btn"; images { image: MUSIC_IMAGE_PLAYBACK_ROUNDT_ICON COMP; @@ -2335,6 +2357,7 @@ group { } group { name: "elm/button/base/music_bottomtext_btn"; + data.item: "focus_highlight" "on"; inherit: "elm/button/base/music_middletext_btn"; images { image: MUSIC_IMAGE_PLAYBACK_ROUNDB_ICON COMP; diff --git a/res/edc/widgets/ctxpopup.edc b/res/edc/widgets/ctxpopup.edc old mode 100755 new mode 100644 index f385bc0..19dcd48 --- a/res/edc/widgets/ctxpopup.edc +++ b/res/edc/widgets/ctxpopup.edc @@ -1,4 +1,6 @@ -group { name: "elm/ctxpopup/base/music-common-popup"; +group { + name: "elm/ctxpopup/base/music-common-popup"; + data.item: "focus_highlight" "on"; parts { part { name: "elm.swallow.content"; @@ -12,6 +14,7 @@ group { name: "elm/ctxpopup/base/music-common-popup"; group { name, "elm/ctxpopup/base/music_listpopup"; + data.item: "focus_highlight" "on"; parts { part { name: "elm.swallow.content"; diff --git a/res/edc/widgets/gengrid.edc b/res/edc/widgets/gengrid.edc index 7e884b3..efd090b 100644 --- a/res/edc/widgets/gengrid.edc +++ b/res/edc/widgets/gengrid.edc @@ -3,6 +3,7 @@ group { data.item: "selectraise" "on"; data.item: "texts" "elm.text elm.text1"; data.item: "contents" "elm.swallow.icon"; + data.item: "focus_highlight" "on"; parts { part { name: "bg_with_border"; diff --git a/res/edc/widgets/genlist.edc b/res/edc/widgets/genlist.edc index b85b059..d246efc 100644 --- a/res/edc/widgets/genlist.edc +++ b/res/edc/widgets/genlist.edc @@ -4,6 +4,7 @@ group { data.item: "focusraise" "on"; data.item: "texts" "elm.text elm.text1 elm.text2 elm.text3"; data.item: "contents" "elm.swallow.icon"; + data.item: "focus_highlight" "on"; parts { part { name: "bg"; @@ -322,6 +323,7 @@ group { data.item: "selectraise" "on"; data.item: "focusraise" "on"; data.item: "texts" "elm.text elm.text1 elm.text2 elm.text3"; + data.item: "focus_highlight" "on"; parts { part { name: "bg"; @@ -586,6 +588,7 @@ group { data.item: "focusraise" "on"; data.item: "texts" "elm.text0 elm.text1 elm.text2 elm.text3 elm.text4"; data.item: "contents" "elm.swallow.icon"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_PLAY_ICON COMP; image: MUSIC_IMAGE_UNCHECK_NORMAL COMP; @@ -1224,6 +1227,7 @@ group { data.item: "focusraise" "on"; data.item: "texts" "elm.text elm.text1 elm.text2"; data.item: "contents" "elm.swallow.icon"; + data.item: "focus_highlight" "on"; images { image: MUSIC_IMAGE_UNCHECK_NORMAL COMP; image: MUSIC_IMAGE_UNCHECK_FOCUS COMP; diff --git a/res/edc/widgets/progressbar.edc b/res/edc/widgets/progressbar.edc index f0ee4cf..cfe8e87 100644 --- a/res/edc/widgets/progressbar.edc +++ b/res/edc/widgets/progressbar.edc @@ -17,6 +17,7 @@ group { name: "elm/progressbar/horizontal/music_volume_bar"; + data.item: "focus_highlight" "on"; parts { part { name: "elm.background.progressbar"; diff --git a/res/edc/widgets/slider.edc b/res/edc/widgets/slider.edc index 71e5d1c..41e8c94 100644 --- a/res/edc/widgets/slider.edc +++ b/res/edc/widgets/slider.edc @@ -2,6 +2,7 @@ group { name: "elm/slider/horizontal/music_progress_slider"; + data.item: "focus_highlight" "on"; parts { part { name: "background"; type: RECT; @@ -271,6 +272,7 @@ group { } group { name: "elm/slider/horizontal/music_indicator/default"; + data.item: "focus_highlight" "on"; alias: "elm/slider/horizontal/popup/default"; images { image: MUSIC_IMAGE_SLIDER_NOB_NORMAL COMP; diff --git a/src/main.cpp b/src/main.cpp index ba357f7..07aa2a1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -78,7 +78,9 @@ protected: { Evas_Object *win; - win = elm_win_add(NULL, name, ELM_WIN_BASIC); + // To fix ghost phenomenon + //win = elm_win_add(NULL, name, ELM_WIN_BASIC); + win = elm_win_util_standard_add(name, NULL); if (!win) return NULL; diff --git a/src/views/context-view.cpp b/src/views/context-view.cpp index c8dd6a6..c210bc3 100644 --- a/src/views/context-view.cpp +++ b/src/views/context-view.cpp @@ -46,6 +46,25 @@ #define MUSIC_CTXT_TABLE_HPAD 14 +enum EObjectType { + CONTEXT_VIEW, + + CONTEXT_VIEW_BUTTON_PLAY, + CONTEXT_VIEW_BUTTON_NEXT, + CONTEXT_VIEW_BUTTON_LAST, + CONTEXT_VIEW_BUTTON_ADDTO, + CONTEXT_VIEW_BUTTON_PLAYSONG, + CONTEXT_VIEW_BUTTON_DEL, + CONTEXT_VIEW_BUTTON_RENAME, + CONTEXT_VIEW_BUTTON_ADDSONG, + CONTEXT_VIEW_BUTTON_REMOVESONG, + CONTEXT_VIEW_BUTTON_DELETE, + + CONTEXT_VIEW_MORE_INFO, + + CONTEXT_VIEW_RELATIVE_CONTENT +}; + enum EBtnType { CTXBTN_INVALID = -1, CTXBTN_PLAY = 0, @@ -64,6 +83,7 @@ enum EBtnType { struct SBtnInfo { const char *txt; const char *icon; + EObjectType type; }; struct SRltvCtnt { @@ -89,587 +109,11 @@ struct SContextView { int lid; CContextView *parent; - class CHandlerButton : public CListenerMgr, - public IMouseMoveListener, public IMouseUpListener, public IKeyUpListener, - public IFocusedListener, public IUnfocusedListener { - public: - struct SCallback { - void(*addScroller)(void* cookie, Evas_Object *base, Evas_Object **scroller); - void* cookie; - }; - - private: - SContextView *m; - SCallback m_callback; - - private: - static void sm_CbPopupKeyPressed(void *data, Evas *e, Evas_Object *obj, void *ei) - { - CHandlerButton *root = (CHandlerButton *)data; - if (root) - root->m_OnPopUpKeyPressed(e, obj, (Evas_Event_Key_Down *)ei); - } - - void m_OnPopUpKeyPressed(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) - { - if (!ev->keyname) - return; - - if (!strcmp(ev->keyname, KEY_BACK)) - m_DestroyPopup(); - } - - static void sm_CbRemove(void *data, Evas_Object *obj, void *ei) - { - CHandlerButton *root = (CHandlerButton *)data; - if (root) - root->m_OnRemove(obj); - } - - void m_OnRemove(Evas_Object *obj) - { - SContentInfo *cinfo = NULL; - - if (!obj) { - _ERR("Invalid argument."); - return; - } - - m_DestroyPopup(); - - if (!m->ctxtinfo || !m->ctxtinfo->update) - return; - - cinfo = m->ctxtinfo; - cinfo->update(cinfo->cbdata, ACTION_TYPE_DELETE, 0); - } - - static void sm_CbCancel(void *data, Evas_Object *obj, void *ei) - { - CHandlerButton *root = (CHandlerButton *)data; - if (root) - root->m_OnCancel(obj); - } - - void m_OnCancel(Evas_Object *obj) - { - if (!obj) { - _ERR("Invalid argument."); - return; - } - - m_DestroyPopup(); - } - - static int sm_CbSortPlaylist(const void *d1, const void *d2) - { - SCtxtPlaylistItem *info1 = (SCtxtPlaylistItem *)d1; - SCtxtPlaylistItem *info2 = (SCtxtPlaylistItem *)d2; - char *txt1 = NULL; - char *txt2 = NULL; - - txt1 = info1->name; - txt2 = info2->name; - - if (!txt1) - return 1; - if (!txt2) - return -1; - - return strcasecmp(txt1, txt2); - } - - static void sm_CbPopupDeleted(void *data, Evas *e, Evas_Object *obj, void *ei) - { - Eina_List *list = (Eina_List *)data; - SCtxtPlaylistItem *item = NULL; - void *listObj = NULL; - - if (!list) - return; - - EINA_LIST_FREE(list, listObj) { - item = (SCtxtPlaylistItem *)listObj; - free(item->name); - free(item); - } - } - - static void sm_CbPopupBtnClicked(void *data, Evas_Object *obj, void *ei) - { - CHandlerButton *root = (CHandlerButton *)data; - if (root) - root->m_OnPopupBtnClicked(obj); - } - - void m_OnPopupBtnClicked(Evas_Object *obj) - { - SCtxtPlaylistItem *item = (SCtxtPlaylistItem *)_GET_PRIV(obj); - - if (!item) { - _ERR("Invalid argument."); - return; - } - - m->lid = item->id; - m->idler = ecore_idler_add(sm_CbSelectIdler, this); - } - - static Eina_Bool sm_CbSelectIdler(void *dt) - { - CHandlerButton *root = (CHandlerButton *)dt; - Eina_Bool r; - - if (root) - r = root->m_OnSelectIdler(); - - return r; - } - - Eina_Bool m_OnSelectIdler(void) - { - SContentInfo *cinfo = NULL; - - m->idler = NULL; - m_DestroyPopup(); - - if (!m->ctxtinfo || !m->ctxtinfo->update) - return ECORE_CALLBACK_CANCEL; - - cinfo = m->ctxtinfo; - cinfo->update(cinfo->cbdata, ACTION_TYPE_ADDTO, m->lid); - cinfo->close(cinfo->cbdata); - - return ECORE_CALLBACK_CANCEL; - } - - private: - void m_HandleBtnSelected(int btnType) - { - SContentInfo *cinfo = NULL; - - if (!m->ctxtinfo || !m->ctxtinfo->update) - return; - - EBtnType type = (EBtnType)btnType; - - cinfo = m->ctxtinfo; - - switch (type) { - case CTXBTN_PLAY: - case CTXBTN_PLAYSONG: - cinfo->update(cinfo->cbdata, ACTION_TYPE_PLAY, 0); - break; - - case CTXBTN_NEXT: - cinfo->update(cinfo->cbdata, ACTION_TYPE_ADDNEXT, 0); - break; - - case CTXBTN_LAST: - cinfo->update(cinfo->cbdata, ACTION_TYPE_ADDLAST, 0); - break; - - case CTXBTN_ADDTO: - m->popup = m_CreatePlaylistPopup(); - if (!m->popup) - _create_message_box(m->base, MUSIC_TEXT_NOLIST_MSG); - break; - - case CTXBTN_DEL: - m->popup = m_CreateRemovePopup(m->base, - MUSIC_TEXT_REMOVE_SMSG, sm_CbPopupKeyPressed, - sm_CbRemove, sm_CbCancel, this); - break; - - case CTXBTN_RENAME: - cinfo->update(cinfo->cbdata, ACTION_TYPE_RENAME, 0); - break; - - case CTXBTN_ADDSONG: - cinfo->update(cinfo->cbdata, ACTION_TYPE_ADDSONG, 0); - break; - - case CTXBTN_REMOVESONG: - cinfo->update(cinfo->cbdata, ACTION_TYPE_REMOVESONG, 0); - break; - - case CTXBTN_DELETE: - m->popup = m_CreateRemovePopup(m->base, - MUSIC_TEXT_REMOVE_PLMSG, sm_CbPopupKeyPressed, - sm_CbRemove, sm_CbCancel, this); - break; - - default: - _ERR("Wrong btn type"); - } - } - - Evas_Object *m_CreatePlaylistPopup(void) - { - Evas_Object *popup = NULL, *box = NULL, *btn = NULL, *scr = NULL, *firstbtn = NULL; - Eina_List *l = NULL, *list = NULL; - struct SCtxtPlaylistItem *item = NULL; - void *obj = NULL; - int i, tc; - - popup = elm_ctxpopup_add(m->base); - if (!popup) { - _ERR("elm_ctxpopup_add failed."); - return NULL; - } - - box = elm_box_add(popup); - if (!box) { - _ERR("elm_box_add failed."); - evas_object_del(popup); - return NULL; - } - - evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); - evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0); - - list = CMediadata::PlaylistsForCtxt(); - if (!list || eina_list_count(list) == 0) { - _ERR("Fetching list of playlists failed"); - evas_object_del(popup); - return NULL; - } - - list = eina_list_sort(list, 0, sm_CbSortPlaylist); - elm_object_style_set(popup, MUSIC_STYLE_LIST_POPUP); - evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, - sm_CbPopupDeleted, list); - - btn = NULL; - firstbtn = NULL; - i = 0; - tc = eina_list_count(list); - - EINA_LIST_FOREACH(list, l, obj) { - item = (SCtxtPlaylistItem *)obj; - btn = elm_button_add(box); - if (!btn) { - _ERR("elm_button_add failed."); - evas_object_del(popup); - return NULL; - } - - if (i == 0) { - elm_object_style_set(btn, MUSIC_STYLE_TOPTEXT_BTN); - firstbtn = btn; - } - else if (i == tc - 1) { - _INFO(); - elm_object_style_set(btn, MUSIC_STYLE_BOTTOMTEXT_BTN); - elm_object_signal_emit(btn, MUSIC_SIGNAL_HIDELINE, - MUSIC_CONTEXT_VIEW); - } - else { - elm_object_style_set(btn, MUSIC_STYLE_MIDDLETEXT_BTN); - } - - i++; - elm_object_text_set(btn, item->name); - evas_object_show(btn); - elm_box_pack_end(box, btn); - _SET_PRIV(btn, item); - - evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, - sm_CbPopupBtnClicked, this); - evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE, - _object_mouse_moved, NULL); - evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, - sm_CbPopupKeyPressed, m); - } - - m_callback.addScroller(m_callback.cookie, popup, &scr); - if (!scr) { - evas_object_del(popup); - return NULL; - } - - elm_object_content_set(scr, box); - elm_object_content_set(popup, scr); - elm_object_part_content_set(m->base, MUSIC_PART_PLIST_POPUP, popup); - - elm_ctxpopup_direction_priority_set(popup, (Elm_Ctxpopup_Direction)0, (Elm_Ctxpopup_Direction)0, (Elm_Ctxpopup_Direction)0, (Elm_Ctxpopup_Direction)0); - - if (firstbtn && btn) { - elm_object_focus_set(firstbtn, EINA_TRUE); - elm_object_focus_next_object_set(firstbtn, btn, ELM_FOCUS_UP); - elm_object_focus_next_object_set(btn, firstbtn, ELM_FOCUS_DOWN); - } - - return popup; - } - - Evas_Object *m_CreateRemovePopup(Evas_Object *base, const char *msg, - Evas_Object_Event_Cb _close_cb, Evas_Smart_Cb _remove_cb, - Evas_Smart_Cb _cancel_cb, void *dt) - { - Evas_Object *popup, *yesbtn, *nobtn, *lbl; - - if (!base || !_remove_cb || !_cancel_cb || !dt) { - _ERR("Invalid argument."); - return NULL; - } - - popup = elm_popup_add(base); - if (!popup) { - _ERR("elm_popup_add failed."); - return NULL; - } - - elm_object_style_set(popup, MUSIC_STYLE_REMOVE_POPUP); - elm_object_part_text_set(popup, MUSIC_PART_RPOPUP_TITLE, - _(MUSIC_TEXT_REMOVE)); - elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); - evas_object_event_callback_add(popup, EVAS_CALLBACK_KEY_DOWN, - _close_cb, dt); - evas_object_show(popup); - - lbl = elm_label_add(popup); - if (!lbl) { - _ERR("Add Evas_Object failed."); - evas_object_del(popup); - return NULL; - } - - elm_object_style_set(lbl, MUSIC_STYLE_REMOVE_LABEL); - elm_object_text_set(lbl, _(msg)); - elm_object_content_set(popup, lbl); - - yesbtn = elm_button_add(popup); - if (!yesbtn) { - _ERR("Add Evas_Object failed."); - evas_object_del(popup); - return NULL; - } - - elm_object_text_set(yesbtn, _(MUSIC_TEXT_REMOVE)); - elm_object_part_content_set(popup, MUSIC_PART_RPOPUP_BTN1, yesbtn); - evas_object_smart_callback_add(yesbtn, MUSIC_SIGNAL_CLICKED, - _remove_cb, dt); - - nobtn = elm_button_add(popup); - if (!nobtn) { - _ERR("Add Evas_Object failed."); - evas_object_del(popup); - return NULL; - } - - elm_object_text_set(nobtn, _(MUSIC_TEXT_CANCEL)); - elm_object_part_content_set(popup, MUSIC_PART_RPOPUP_BTN2, nobtn); - evas_object_smart_callback_add(nobtn, MUSIC_SIGNAL_CLICKED, - _cancel_cb, dt); - elm_object_focus_set(nobtn, EINA_TRUE); - - return popup; - } - - void m_DestroyPopup(void) - { - if (!m->popup) - return; - - evas_object_del(m->popup); - m->popup = NULL; - } - - public: - CHandlerButton(SContextView *ins) : - IMouseMoveListener(this), - IMouseUpListener(this), - IKeyUpListener(this), - IFocusedListener(this), - IUnfocusedListener(this) { - m = ins; - } - - ~CHandlerButton() { - m_DestroyPopup(); - } - - void SetCallback(const SCallback* cb) { - m_callback = *cb; - } - - virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) - { - if (!obj) - return; - - if (!elm_object_focus_get(obj)) - elm_object_focus_set(obj, EINA_TRUE); - } - - virtual void OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev) - { - m_HandleBtnSelected(id); - } - - virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) - { - if (strcmp(ev->keyname, KEY_ENTER)) - return; - - m_HandleBtnSelected(id); - } - - virtual void OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item) - { - if (!obj) - return; - - elm_object_signal_emit(obj, MUSIC_SIGNAL_FOCUSED, MUSIC_CONTEXT_VIEW); - } - - virtual void OnUnfocused(int id, Evas_Object *obj, Elm_Object_Item *item) - { - if (!obj) - return; - - elm_object_signal_emit(obj, MUSIC_SIGNAL_UNFOCUSED, MUSIC_CONTEXT_VIEW); - } - } *pHandlerButton; - - class CHandlerLayout : public CListenerMgr, - public IMouseMoveListener, public IMouseUpListener, public IKeyUpListener, - public IFocusedListener, public IUnfocusedListener { - protected: - SContextView *m; - - public: - CHandlerLayout(SContextView *ins) : - IMouseMoveListener(this), - IMouseUpListener(this), - IKeyUpListener(this), - IFocusedListener(this), - IUnfocusedListener(this) { - m = ins; - }; - - virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) - { - if (!obj) - return; - - if (!elm_object_focus_get(obj)) - elm_object_focus_set(obj, EINA_TRUE); - } - - virtual void OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev) = 0; - virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) = 0; - - virtual void OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item) - { - if (!obj) - return; - - elm_object_signal_emit(obj, MUSIC_SIGNAL_FOCUSED, MUSIC_CONTEXT_VIEW); - } - - virtual void OnUnfocused(int id, Evas_Object *obj, Elm_Object_Item *item) - { - if (!obj) - return; - - elm_object_signal_emit(obj, MUSIC_SIGNAL_UNFOCUSED, MUSIC_CONTEXT_VIEW); - } - }; - - class CHandlerRelativeContentLayout : public CHandlerLayout { - public: - CHandlerRelativeContentLayout(SContextView *ins) : CHandlerLayout(ins) {} - - virtual void OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev) - { - if (!obj) - return; - - elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTENT_CLICKED, - MUSIC_CONTEXT_VIEW); - } - - virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) - { - if (!obj || !ev) - return; - - if (strcmp(ev->keyname, KEY_ENTER)) - return; - - elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTENT_CLICKED, - MUSIC_CONTEXT_VIEW); - } - }; - - Eina_List *listRltvCtntLayout; - - class CHandlerMoreInfoLayout : public CHandlerLayout { - private: - void m_HandleMoreinfoSelected(Evas_Object *obj) - { - SRltvCtnt *rctnt = NULL; - - if (!obj) - return; - - rctnt = (SRltvCtnt *)_GET_PRIV(obj); - if (!rctnt) - return; - - /* Using prints till actual APIs come from wiki and youtube */ - switch (m->type) { - case CONTEXT_TYPE_ALBUM: - _INFO("Album more info clicked %s", rctnt->link); - break; - - case CONTEXT_TYPE_ARTIST: - _INFO("Artist more info clicked %s", rctnt->link); - break; - - case CONTEXT_TYPE_GENRE: - _INFO("Genre more info clicked %s", rctnt->link); - break; - - default: - _ERR("Wrong content type for more info"); - } - } - - public: - CHandlerMoreInfoLayout(SContextView *ins) : CHandlerLayout(ins) {} - - virtual void OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev) - { - if (!obj) - return; - - m_HandleMoreinfoSelected(obj); - } - - virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) - { - if (!obj || !ev) - return; - - if (strcmp(ev->keyname, KEY_ENTER)) - return; - - m_HandleMoreinfoSelected(obj); - } - } *pHandlerMoreInfoLayout; - SContextView() { memset(this, 0, sizeof(SContextView)); - pHandlerButton = new CHandlerButton(this); - pHandlerMoreInfoLayout = new CHandlerMoreInfoLayout(this); } ~SContextView() { - delete pHandlerButton; - delete pHandlerMoreInfoLayout; } }; @@ -725,18 +169,155 @@ void CContextView::sm_CbRltdCtntSelected(void *data, Evas_Object *obj, const cha } -void CContextView::sm_CbAddScroller(void *cookie, Evas_Object *base, Evas_Object **scroller) +void CContextView::sm_CbPopupKeyPressed(void *data, Evas *e, Evas_Object *obj, void *ei) { - CContextView *root = (CContextView *)cookie; + CContextView *root = (CContextView *)data; if (root) - root->m_OnAddScroller(base, scroller); + root->m_OnPopUpKeyPressed(e, obj, (Evas_Event_Key_Down *)ei); +} + + +void CContextView::m_OnPopUpKeyPressed(Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) +{ + if (!ev->keyname) + return; + + if (!strcmp(ev->keyname, KEY_BACK)) + m_DestroyPopup(); +} + + +void CContextView::sm_CbRemove(void *data, Evas_Object *obj, void *ei) +{ + CContextView *root = (CContextView *)data; + if (root) + root->m_OnRemove(obj); +} + + +void CContextView::m_OnRemove(Evas_Object *obj) +{ + SContentInfo *cinfo = NULL; + + if (!obj) { + _ERR("Invalid argument."); + return; + } + + m_DestroyPopup(); + + if (!m->ctxtinfo || !m->ctxtinfo->update) + return; + + cinfo = m->ctxtinfo; + cinfo->update(cinfo->cbdata, ACTION_TYPE_DELETE, 0); +} + + +void CContextView::sm_CbCancel(void *data, Evas_Object *obj, void *ei) +{ + CContextView *root = (CContextView *)data; + if (root) + root->m_OnCancel(obj); +} + + +void CContextView::m_OnCancel(Evas_Object *obj) +{ + if (!obj) { + _ERR("Invalid argument."); + return; + } + + m_DestroyPopup(); +} + + +int CContextView::sm_CbSortPlaylist(const void *d1, const void *d2) +{ + SCtxtPlaylistItem *info1 = (SCtxtPlaylistItem *)d1; + SCtxtPlaylistItem *info2 = (SCtxtPlaylistItem *)d2; + char *txt1 = NULL; + char *txt2 = NULL; + + txt1 = info1->name; + txt2 = info2->name; + + if (!txt1) + return 1; + if (!txt2) + return -1; + + return strcasecmp(txt1, txt2); +} + + +void CContextView::sm_CbPopupDeleted(void *data, Evas *e, Evas_Object *obj, void *ei) +{ + Eina_List *list = (Eina_List *)data; + SCtxtPlaylistItem *item = NULL; + void *listObj = NULL; + + if (!list) + return; + + EINA_LIST_FREE(list, listObj) { + item = (SCtxtPlaylistItem *)listObj; + free(item->name); + free(item); + } +} + + +void CContextView::sm_CbPopupBtnClicked(void *data, Evas_Object *obj, void *ei) +{ + CContextView *root = (CContextView *)data; + if (root) + root->m_OnPopupBtnClicked(obj); +} + + +void CContextView::m_OnPopupBtnClicked(Evas_Object *obj) +{ + SCtxtPlaylistItem *item = (SCtxtPlaylistItem *)_GET_PRIV(obj); + + if (!item) { + _ERR("Invalid argument."); + return; + } + + m->lid = item->id; + m->idler = ecore_idler_add(sm_CbSelectIdler, this); +} + + +Eina_Bool CContextView::sm_CbSelectIdler(void *dt) +{ + CContextView *root = (CContextView *)dt; + Eina_Bool r; + + if (root) + r = root->m_OnSelectIdler(); + + return r; } -void CContextView::m_OnAddScroller(Evas_Object *base, Evas_Object **scroller) +Eina_Bool CContextView::m_OnSelectIdler(void) { - Evas_Object *scr = m_AddScroller(base); - *scroller = scr; + SContentInfo *cinfo = NULL; + + m->idler = NULL; + m_DestroyPopup(); + + if (!m->ctxtinfo || !m->ctxtinfo->update) + return ECORE_CALLBACK_CANCEL; + + cinfo = m->ctxtinfo; + cinfo->update(cinfo->cbdata, ACTION_TYPE_ADDTO, m->lid); + cinfo->close(cinfo->cbdata); + + return ECORE_CALLBACK_CANCEL; } @@ -957,33 +538,43 @@ bool CContextView::m_CreateBtnsPart(void) btninfo[CTXBTN_PLAY].txt = MUSIC_TEXT_PLAY_THIS; btninfo[CTXBTN_PLAY].icon = MUSIC_IMAGE_CTXT_BTNPLAY; + btninfo[CTXBTN_PLAY].type = CONTEXT_VIEW_BUTTON_PLAY; btninfo[CTXBTN_NEXT].txt = MUSIC_TEXT_ADD_NEXT; btninfo[CTXBTN_NEXT].icon = MUSIC_IMAGE_CTXT_BTNNEXT; + btninfo[CTXBTN_NEXT].type = CONTEXT_VIEW_BUTTON_NEXT; btninfo[CTXBTN_LAST].txt = MUSIC_TEXT_ADD_LAST; btninfo[CTXBTN_LAST].icon = MUSIC_IMAGE_CTXT_BTNLAST; + btninfo[CTXBTN_LAST].type = CONTEXT_VIEW_BUTTON_LAST; btninfo[CTXBTN_ADDTO].txt = MUSIC_TEXT_ADD_TO_PLAYLIST; btninfo[CTXBTN_ADDTO].icon = MUSIC_IMAGE_CTXT_ADDTO; + btninfo[CTXBTN_ADDTO].type = CONTEXT_VIEW_BUTTON_ADDTO; btninfo[CTXBTN_PLAYSONG].txt = MUSIC_TEXT_PLAY; btninfo[CTXBTN_PLAYSONG].icon = MUSIC_IMAGE_CTXT_BTNPLAY; + btninfo[CTXBTN_PLAYSONG].type = CONTEXT_VIEW_BUTTON_PLAYSONG; btninfo[CTXBTN_DEL].txt = MUSIC_TEXT_DEL; btninfo[CTXBTN_DEL].icon = MUSIC_IMAGE_CTXT_BTNDEL; + btninfo[CTXBTN_DEL].type = CONTEXT_VIEW_BUTTON_DEL; btninfo[CTXBTN_RENAME].txt = MUSIC_TEXT_RENAME; btninfo[CTXBTN_RENAME].icon = MUSIC_IMAGE_CTXT_RENAME; + btninfo[CTXBTN_RENAME].type = CONTEXT_VIEW_BUTTON_RENAME; btninfo[CTXBTN_ADDSONG].txt = MUSIC_TEXT_ADDSONG; btninfo[CTXBTN_ADDSONG].icon = MUSIC_IMAGE_CTXT_ADDSONG; + btninfo[CTXBTN_ADDSONG].type = CONTEXT_VIEW_BUTTON_ADDSONG; btninfo[CTXBTN_REMOVESONG].txt = MUSIC_TEXT_REMOVESONG; btninfo[CTXBTN_REMOVESONG].icon = MUSIC_IMAGE_CTXT_REMOVESONG; + btninfo[CTXBTN_REMOVESONG].type = CONTEXT_VIEW_BUTTON_REMOVESONG; btninfo[CTXBTN_DELETE].txt = MUSIC_TEXT_DEL; btninfo[CTXBTN_DELETE].icon = MUSIC_IMAGE_CTXT_BTNDEL; + btninfo[CTXBTN_DELETE].type = CONTEXT_VIEW_BUTTON_DELETE; box = m_AddBtnBox(m->base); if (!box) @@ -1015,7 +606,7 @@ bool CContextView::m_CreateBtnsPart(void) return false; } - m->pHandlerButton->Connect(btn, i); + Connect(btn, btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_MOUSE_UP | TYPE_KEY_UP | TYPE_FOCUSED | TYPE_UNFOCUSED); if (!m_AddBtnInfo(btn, btninfo[i].icon, btninfo[i].txt)) { evas_object_del(box); @@ -1288,7 +879,7 @@ bool CContextView::m_AddTableContents(Eina_List *list) Evas_Object *ly = NULL; Eina_List *l = NULL; SRltvCtnt *rctnt = NULL; - SContextView::CHandlerRelativeContentLayout *layoutHandler = NULL; + int objectId = (int)CONTEXT_VIEW_RELATIVE_CONTENT; void *obj = NULL; if (!list) @@ -1309,9 +900,8 @@ bool CContextView::m_AddTableContents(Eina_List *list) elm_object_signal_callback_add(ly, MUSIC_SIGNAL_BTN_CLICKED, MUSIC_CONTEXT_VIEW, sm_CbRltdCtntSelected, m); - layoutHandler = new SContextView::CHandlerRelativeContentLayout(m); - layoutHandler->Connect(ly); - m->listRltvCtntLayout = eina_list_append(m->listRltvCtntLayout, layoutHandler); + Connect(ly, objectId, TYPE_MOUSE_MOVE | TYPE_MOUSE_UP | TYPE_KEY_UP | TYPE_FOCUSED | TYPE_UNFOCUSED); + objectId++; if (row == 0) m->first_line[col] = ly; @@ -1425,7 +1015,7 @@ bool CContextView::m_CreateMoreinfoLayout(SRltvCtnt *rctnt, Evas_Object *img) elm_object_focus_allow_set(ly, EINA_TRUE); _SET_PRIV(ly, rctnt); - m->pHandlerMoreInfoLayout->Connect(ly); + Connect(ly, CONTEXT_VIEW_MORE_INFO, TYPE_MOUSE_MOVE | TYPE_MOUSE_UP | TYPE_KEY_UP | TYPE_FOCUSED | TYPE_UNFOCUSED); elm_object_focus_next_object_set(ly, ly, ELM_FOCUS_LEFT); elm_object_focus_next_object_set(ly, ly, ELM_FOCUS_RIGHT); @@ -1525,6 +1115,273 @@ bool CContextView::m_CreateFullView(void) } +Evas_Object *CContextView::m_CreatePlaylistPopup(void) +{ + Evas_Object *popup = NULL, *box = NULL, *btn = NULL, *scr = NULL, *firstbtn = NULL; + Eina_List *l = NULL, *list = NULL; + struct SCtxtPlaylistItem *item = NULL; + void *obj = NULL; + int i, tc; + + popup = elm_ctxpopup_add(m->base); + if (!popup) { + _ERR("elm_ctxpopup_add failed."); + return NULL; + } + + box = elm_box_add(popup); + if (!box) { + _ERR("elm_box_add failed."); + evas_object_del(popup); + return NULL; + } + + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0); + + list = CMediadata::PlaylistsForCtxt(); + if (!list || eina_list_count(list) == 0) { + _ERR("Fetching list of playlists failed"); + evas_object_del(popup); + return NULL; + } + + list = eina_list_sort(list, 0, sm_CbSortPlaylist); + elm_object_style_set(popup, MUSIC_STYLE_LIST_POPUP); + evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, + sm_CbPopupDeleted, list); + + btn = NULL; + firstbtn = NULL; + i = 0; + tc = eina_list_count(list); + + EINA_LIST_FOREACH(list, l, obj) { + item = (SCtxtPlaylistItem *)obj; + btn = elm_button_add(box); + if (!btn) { + _ERR("elm_button_add failed."); + evas_object_del(popup); + return NULL; + } + + if (i == 0) { + elm_object_style_set(btn, MUSIC_STYLE_TOPTEXT_BTN); + firstbtn = btn; + } + else if (i == tc - 1) { + _INFO(); + elm_object_style_set(btn, MUSIC_STYLE_BOTTOMTEXT_BTN); + elm_object_signal_emit(btn, MUSIC_SIGNAL_HIDELINE, + MUSIC_CONTEXT_VIEW); + } + else { + elm_object_style_set(btn, MUSIC_STYLE_MIDDLETEXT_BTN); + } + + i++; + elm_object_text_set(btn, item->name); + evas_object_show(btn); + elm_box_pack_end(box, btn); + _SET_PRIV(btn, item); + + evas_object_smart_callback_add(btn, MUSIC_SIGNAL_CLICKED, + sm_CbPopupBtnClicked, this); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_MOVE, + _object_mouse_moved, NULL); + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, + sm_CbPopupKeyPressed, m); + } + + scr = m_AddScroller(popup); + if (!scr) { + evas_object_del(popup); + return NULL; + } + + elm_object_content_set(scr, box); + elm_object_content_set(popup, scr); + elm_object_part_content_set(m->base, MUSIC_PART_PLIST_POPUP, popup); + + elm_ctxpopup_direction_priority_set(popup, (Elm_Ctxpopup_Direction)0, (Elm_Ctxpopup_Direction)0, (Elm_Ctxpopup_Direction)0, (Elm_Ctxpopup_Direction)0); + + if (firstbtn && btn) { + elm_object_focus_set(firstbtn, EINA_TRUE); + elm_object_focus_next_object_set(firstbtn, btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn, firstbtn, ELM_FOCUS_DOWN); + } + + return popup; +} + + +Evas_Object *CContextView::m_CreateRemovePopup(Evas_Object *base, const char *msg, + Evas_Object_Event_Cb _close_cb, Evas_Smart_Cb _remove_cb, + Evas_Smart_Cb _cancel_cb, void *dt) +{ + Evas_Object *popup, *yesbtn, *nobtn, *lbl; + + if (!base || !_remove_cb || !_cancel_cb || !dt) { + _ERR("Invalid argument."); + return NULL; + } + + popup = elm_popup_add(base); + if (!popup) { + _ERR("elm_popup_add failed."); + return NULL; + } + + elm_object_style_set(popup, MUSIC_STYLE_REMOVE_POPUP); + elm_object_part_text_set(popup, MUSIC_PART_RPOPUP_TITLE, + _(MUSIC_TEXT_REMOVE)); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); + evas_object_event_callback_add(popup, EVAS_CALLBACK_KEY_DOWN, + _close_cb, dt); + evas_object_show(popup); + + lbl = elm_label_add(popup); + if (!lbl) { + _ERR("Add Evas_Object failed."); + evas_object_del(popup); + return NULL; + } + + elm_object_style_set(lbl, MUSIC_STYLE_REMOVE_LABEL); + elm_object_text_set(lbl, _(msg)); + elm_object_content_set(popup, lbl); + + yesbtn = elm_button_add(popup); + if (!yesbtn) { + _ERR("Add Evas_Object failed."); + evas_object_del(popup); + return NULL; + } + + elm_object_text_set(yesbtn, _(MUSIC_TEXT_REMOVE)); + elm_object_part_content_set(popup, MUSIC_PART_RPOPUP_BTN1, yesbtn); + evas_object_smart_callback_add(yesbtn, MUSIC_SIGNAL_CLICKED, + _remove_cb, dt); + + nobtn = elm_button_add(popup); + if (!nobtn) { + _ERR("Add Evas_Object failed."); + evas_object_del(popup); + return NULL; + } + + elm_object_text_set(nobtn, _(MUSIC_TEXT_CANCEL)); + elm_object_part_content_set(popup, MUSIC_PART_RPOPUP_BTN2, nobtn); + evas_object_smart_callback_add(nobtn, MUSIC_SIGNAL_CLICKED, + _cancel_cb, dt); + elm_object_focus_set(nobtn, EINA_TRUE); + + return popup; +} + + +void CContextView::m_DestroyPopup(void) +{ + if (!m->popup) + return; + + evas_object_del(m->popup); + m->popup = NULL; +} + + +void CContextView::m_HandleBtnSelected(int btnType) +{ + SContentInfo *cinfo = NULL; + + if (!m->ctxtinfo || !m->ctxtinfo->update) + return; + + EBtnType type = (EBtnType)btnType; + + cinfo = m->ctxtinfo; + + switch (type) { + case CONTEXT_VIEW_BUTTON_PLAY: + case CONTEXT_VIEW_BUTTON_PLAYSONG: + cinfo->update(cinfo->cbdata, ACTION_TYPE_PLAY, 0); + break; + + case CONTEXT_VIEW_BUTTON_NEXT: + cinfo->update(cinfo->cbdata, ACTION_TYPE_ADDNEXT, 0); + break; + + case CONTEXT_VIEW_BUTTON_LAST: + cinfo->update(cinfo->cbdata, ACTION_TYPE_ADDLAST, 0); + break; + + case CONTEXT_VIEW_BUTTON_ADDTO: + m->popup = m_CreatePlaylistPopup(); + if (!m->popup) + _create_message_box(m->base, MUSIC_TEXT_NOLIST_MSG); + break; + + case CONTEXT_VIEW_BUTTON_DEL: + m->popup = m_CreateRemovePopup(m->base, + MUSIC_TEXT_REMOVE_SMSG, sm_CbPopupKeyPressed, + sm_CbRemove, sm_CbCancel, this); + break; + + case CONTEXT_VIEW_BUTTON_RENAME: + cinfo->update(cinfo->cbdata, ACTION_TYPE_RENAME, 0); + break; + + case CONTEXT_VIEW_BUTTON_ADDSONG: + cinfo->update(cinfo->cbdata, ACTION_TYPE_ADDSONG, 0); + break; + + case CONTEXT_VIEW_BUTTON_REMOVESONG: + cinfo->update(cinfo->cbdata, ACTION_TYPE_REMOVESONG, 0); + break; + + case CONTEXT_VIEW_BUTTON_DELETE: + m->popup = m_CreateRemovePopup(m->base, + MUSIC_TEXT_REMOVE_PLMSG, sm_CbPopupKeyPressed, + sm_CbRemove, sm_CbCancel, this); + break; + + default: + _ERR("Wrong btn type"); + } +} + + +void CContextView::m_HandleMoreinfoSelected(Evas_Object *obj) +{ + SRltvCtnt *rctnt = NULL; + + if (!obj) + return; + + rctnt = (SRltvCtnt *)_GET_PRIV(obj); + if (!rctnt) + return; + + /* Using prints till actual APIs come from wiki and youtube */ + switch (m->type) { + case CONTEXT_TYPE_ALBUM: + _INFO("Album more info clicked %s", rctnt->link); + break; + + case CONTEXT_TYPE_ARTIST: + _INFO("Artist more info clicked %s", rctnt->link); + break; + + case CONTEXT_TYPE_GENRE: + _INFO("Genre more info clicked %s", rctnt->link); + break; + + default: + _ERR("Wrong content type for more info"); + } +} + + bool CContextView::Create(void *data) { ASSERT(!m); @@ -1588,7 +1445,6 @@ bool CContextView::Create(void *data) m->base = base; m->ctxtinfo = ctxtinfo; m->parent = this; - m->listRltvCtntLayout = NULL; if (!m_CreateFullView()) { _ERR(" create full failed "); @@ -1599,11 +1455,6 @@ bool CContextView::Create(void *data) Connect(base); - SContextView::CHandlerButton::SCallback cb; - cb.addScroller = &sm_CbAddScroller; - cb.cookie = this; - m->pHandlerButton->SetCallback(&cb); - return true; } @@ -1615,15 +1466,6 @@ void CContextView::Destroy(void) if (m->idler) ecore_idler_del(m->idler); - if (m->listRltvCtntLayout) { - SContextView::CHandlerRelativeContentLayout *layoutHandler; - void *obj; - EINA_LIST_FREE(m->listRltvCtntLayout, obj) { - layoutHandler = (SContextView::CHandlerRelativeContentLayout *)obj; - delete layoutHandler; - } - } - CBaseView::Destroy(); evas_object_del(m->base); @@ -1692,10 +1534,169 @@ void CContextView::t_OnHide(void) void CContextView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { - if (!strcmp(ev->keyname, KEY_BACK)) { - if (m->ctxtinfo && m->ctxtinfo->close) - m->ctxtinfo->close(m->ctxtinfo->cbdata); + switch (id) { + case CONTEXT_VIEW: + { + if (!strcmp(ev->keyname, KEY_BACK)) { + if (m->ctxtinfo && m->ctxtinfo->close) + m->ctxtinfo->close(m->ctxtinfo->cbdata); + } + else if (!strcmp(ev->keyname, KEY_EXIT)) + elm_exit(); + } + break; + + default: + break; + } +} + + +void CContextView::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) +{ + switch (id) { + case CONTEXT_VIEW: + break; + + case CONTEXT_VIEW_BUTTON_PLAY: + case CONTEXT_VIEW_BUTTON_NEXT: + case CONTEXT_VIEW_BUTTON_LAST: + case CONTEXT_VIEW_BUTTON_ADDTO: + case CONTEXT_VIEW_BUTTON_PLAYSONG: + case CONTEXT_VIEW_BUTTON_DEL: + case CONTEXT_VIEW_BUTTON_RENAME: + case CONTEXT_VIEW_BUTTON_ADDSONG: + case CONTEXT_VIEW_BUTTON_REMOVESONG: + case CONTEXT_VIEW_BUTTON_DELETE: + { + if (strcmp(ev->keyname, KEY_ENTER)) + return; + + m_HandleBtnSelected(id); + } + break; + + case CONTEXT_VIEW_MORE_INFO: + { + if (!obj || !ev) + return; + + if (strcmp(ev->keyname, KEY_ENTER)) + return; + + m_HandleMoreinfoSelected(obj); + } + break; + + default: // CONTEXT_VIEW_RELATIVE_CONTENT + { + if (!obj || !ev) + return; + + if (strcmp(ev->keyname, KEY_ENTER)) + return; + + elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTENT_CLICKED, + MUSIC_CONTEXT_VIEW); + } + break; + } +} + + +void CContextView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) +{ + switch (id) { + case CONTEXT_VIEW: + break; + + default: + { + if (!obj) + return; + + if (!elm_object_focus_get(obj)) + elm_object_focus_set(obj, EINA_TRUE); + } + break; + } +} + + +void CContextView::OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev) +{ + switch (id) { + case CONTEXT_VIEW: + break; + + case CONTEXT_VIEW_BUTTON_PLAY: + case CONTEXT_VIEW_BUTTON_NEXT: + case CONTEXT_VIEW_BUTTON_LAST: + case CONTEXT_VIEW_BUTTON_ADDTO: + case CONTEXT_VIEW_BUTTON_PLAYSONG: + case CONTEXT_VIEW_BUTTON_DEL: + case CONTEXT_VIEW_BUTTON_RENAME: + case CONTEXT_VIEW_BUTTON_ADDSONG: + case CONTEXT_VIEW_BUTTON_REMOVESONG: + case CONTEXT_VIEW_BUTTON_DELETE: + { + m_HandleBtnSelected(id); + } + break; + + case CONTEXT_VIEW_MORE_INFO: + { + if (!obj) + return; + + m_HandleMoreinfoSelected(obj); + } + break; + + default: // CONTEXT_VIEW_RELATIVE_CONTENT + { + if (!obj) + return; + + elm_object_signal_emit(obj, MUSIC_SIGNAL_CONTENT_CLICKED, + MUSIC_CONTEXT_VIEW); + } + break; + } +} + + +void CContextView::OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + switch (id) { + case CONTEXT_VIEW: + break; + + default: + { + if (!obj) + return; + + elm_object_signal_emit(obj, MUSIC_SIGNAL_FOCUSED, MUSIC_CONTEXT_VIEW); + } + break; + } +} + + +void CContextView::OnUnfocused(int id, Evas_Object *obj, Elm_Object_Item *item) +{ + switch (id) { + case CONTEXT_VIEW: + break; + + default: + { + if (!obj) + return; + + elm_object_signal_emit(obj, MUSIC_SIGNAL_UNFOCUSED, MUSIC_CONTEXT_VIEW); + } + break; } - else if (!strcmp(ev->keyname, KEY_EXIT)) - elm_exit(); } -- 2.7.4 From 15ead5a85bb99be4dcc93f5b474792815105f164 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Thu, 5 Feb 2015 14:38:35 +0900 Subject: [PATCH 09/16] Remove the manifest file Change-Id: I9f52111d0199bda848cacab7ed32240a3e9dc3ab Signed-off-by: Kim Tae Soo --- org.tizen.music-player-tv-ref.manifest | 26 -------------------------- packaging/org.tizen.music-player-tv-ref.spec | 1 - 2 files changed, 27 deletions(-) delete mode 100644 org.tizen.music-player-tv-ref.manifest diff --git a/org.tizen.music-player-tv-ref.manifest b/org.tizen.music-player-tv-ref.manifest deleted file mode 100644 index d146a8d..0000000 --- a/org.tizen.music-player-tv-ref.manifest +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packaging/org.tizen.music-player-tv-ref.spec b/packaging/org.tizen.music-player-tv-ref.spec index e739785..cf41c72 100644 --- a/packaging/org.tizen.music-player-tv-ref.spec +++ b/packaging/org.tizen.music-player-tv-ref.spec @@ -60,7 +60,6 @@ rm -rf %{buildroot} %files %defattr(-,root,root,-) -%manifest %{name}.manifest %{_bindir}/* %{_resdir}/* %{_manifestdir}/%{name}.xml -- 2.7.4 From 56e1a7438ccb67b18a4eb2e2353f74ee285fc278 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Fri, 6 Feb 2015 12:00:43 +0900 Subject: [PATCH 10/16] 1. Apply CUsbConnectionListener and CMediaContentDbUpdateListener 2. Fix bug (Event couldn't be handled in genlist of CCategoryLayout) 3. Add temp definition of back key and menu key Change-Id: Ie2d21904e7119e68435d817b066e75ec90dd91b5 Signed-off-by: Kim Tae Soo --- include/common.h | 2 ++ include/mediadata.h | 17 +++------ include/music-controller.h | 10 +++--- src/data/mediadata.cpp | 62 +++++++++++--------------------- src/playback/music-controller.cpp | 76 +++++++++++++++++---------------------- src/views/base-view.cpp | 2 +- src/views/category-layout.cpp | 10 ++++-- 7 files changed, 74 insertions(+), 105 deletions(-) diff --git a/include/common.h b/include/common.h index bef2530..1d22aef 100644 --- a/include/common.h +++ b/include/common.h @@ -151,6 +151,8 @@ struct SParcel { #define KEY_NEXT "Next" #define KEY_PREVIOUS "Previous" #define KEY_EXIT "Exit" +#define KEY_BACK "Escape" +#define KEY_MENU "Super_L" #endif /* __COMMON_H__ */ diff --git a/include/mediadata.h b/include/mediadata.h index fa00297..df6fbb1 100644 --- a/include/mediadata.h +++ b/include/mediadata.h @@ -24,18 +24,13 @@ struct folder_info; #include #include "common.h" +#include -class CMediadata { +class CMediadata : public CMediaContentDbUpdateListener { private: struct SMediadata* m; private: - static void sm_CbContentUpdate(media_content_error_e err, int pid, - media_content_db_update_item_type_e update_item, - media_content_db_update_type_e update_type, - media_content_type_e media_type, - char *uuid, char *path, char *mime_type, - void *dt); static bool sm_CbTotalDuration(media_info_h md_h, void *dt); static bool sm_CbEachMediaData(media_info_h md_h, void *dt); static bool sm_CbEachFolderData(media_folder_h folder_h, void *dt); @@ -45,11 +40,6 @@ private: static bool sm_CbPlaylist(media_playlist_h ph, void *dt); private: - void m_HandleContentUpdate(media_content_error_e err, int pid, - media_content_db_update_item_type_e update_item, - media_content_db_update_type_e update_type, - media_content_type_e media_type, - char *uuid, char *path, char *mime_type); bool m_HandleEachMediaData(media_info_h md_h); bool m_HandleEachFolderData(media_folder_h folder_h); bool m_HandleEachAlbumData(media_album_h album_h); @@ -94,6 +84,9 @@ public: bool RemovemediaPlaylist(int lid, Eina_List *idlist); static Eina_List *PlaylistsForCtxt(void); + +public: + virtual void OnUpdated(const SEntity *entity); }; #endif /*__MEDIA_DATA_H__*/ diff --git a/include/music-controller.h b/include/music-controller.h index be0c9ff..a666afb 100644 --- a/include/music-controller.h +++ b/include/music-controller.h @@ -19,7 +19,7 @@ #include -//#include +#include struct SSongInfo; struct album_info; @@ -40,7 +40,7 @@ protected: }; -class CMusicController { +class CMusicController : public CUsbConnectionListener { private: static CMusicController *instance; static int refCnt; @@ -65,9 +65,6 @@ private: static void sm_CbPlaybackCompletion(void *data); void m_OnPlaybackCompletion(void); - //static void sm_CbConnected(usb_device_h usb_device, char *action, void *dt); - //void m_OnConnected(usb_device_h usb_device, char *action); - protected: bool t_PlayNext(int direction, int playnext_type); SMusicController* t_Create(void); @@ -134,6 +131,9 @@ public: bool MediaRemovemediaPlaylist(int id, Eina_List *idlist); bool MediaAddsongsPlaylist(int lid, Eina_List *list); struct SSongInfo *MediaSongByUri(char *uri); + +public: + virtual void OnConnect(void); }; diff --git a/src/data/mediadata.cpp b/src/data/mediadata.cpp index 33b5608..6be37f7 100644 --- a/src/data/mediadata.cpp +++ b/src/data/mediadata.cpp @@ -64,21 +64,6 @@ struct SMediadata { } }; -void CMediadata::sm_CbContentUpdate(media_content_error_e err, int pid, - media_content_db_update_item_type_e update_item, - media_content_db_update_type_e update_type, - media_content_type_e media_type, - char *uuid, char *path, char *mime_type, - void *dt) -{ - CMediadata *root = (CMediadata *)dt; - - if (!root) - return; - - root->m_HandleContentUpdate(err, pid, update_item, update_type, media_type, uuid, path, mime_type); -} - bool CMediadata::sm_CbTotalDuration(media_info_h md_h, void *dt) { @@ -225,28 +210,6 @@ bool CMediadata::sm_CbPlaylist(media_playlist_h ph, void* dt) } -void CMediadata::m_HandleContentUpdate(media_content_error_e err, int pid, - media_content_db_update_item_type_e update_item, - media_content_db_update_type_e update_type, - media_content_type_e media_type, - char *uuid, char *path, char *mime_type) -{ - Eina_List *l = NULL; - SCbInfo *cbinfo = NULL; - void *obj = NULL; - - if (err != MEDIA_CONTENT_ERROR_NONE || !m) - return; - - m->source_type = SOURCE_TYPE_NONE; - EINA_LIST_FOREACH(m->cblist, l, obj) { - cbinfo = (SCbInfo *)obj; - if (cbinfo->type == E_CONTENT_UPDATE && cbinfo->cb) - cbinfo->cb(cbinfo->data); - } -} - - bool CMediadata::m_HandleEachMediaData(media_info_h md_h) { SSongInfo *sinfo = NULL; @@ -909,7 +872,7 @@ bool CMediadata::Create(void) return false; } - media_content_set_db_updated_cb(sm_CbContentUpdate, (void *)this); + CMediaContentDbUpdateListener::Create(); m->source_type = SOURCE_TYPE_NONE; @@ -942,14 +905,13 @@ void CMediadata::Destroy(void) free(cbinfo); } - free(m); - - media_content_unset_db_updated_cb(); + CMediaContentDbUpdateListener::Destroy(); r = media_content_disconnect(); if (r != MEDIA_CONTENT_ERROR_NONE) _ERR("Media Content Connect Failed"); + delete m; } @@ -1320,3 +1282,21 @@ Eina_List *CMediadata::PlaylistsForCtxt(void) return list; } + + +void CMediadata::OnUpdated(const SEntity *entity) +{ + Eina_List *l = NULL; + SCbInfo *cbinfo = NULL; + void *obj = NULL; + + if (entity->err != MEDIA_CONTENT_ERROR_NONE || !m) + return; + + m->source_type = SOURCE_TYPE_NONE; + EINA_LIST_FOREACH(m->cblist, l, obj) { + cbinfo = (SCbInfo *)obj; + if (cbinfo->type == E_CONTENT_UPDATE && cbinfo->cb) + cbinfo->cb(cbinfo->data); + } +} \ No newline at end of file diff --git a/src/playback/music-controller.cpp b/src/playback/music-controller.cpp index 57a339f..2e0ddd1 100644 --- a/src/playback/music-controller.cpp +++ b/src/playback/music-controller.cpp @@ -15,7 +15,6 @@ */ #include #include -//#include #include #include #include "dbg.h" @@ -180,43 +179,6 @@ void CMusicController::m_OnPlaybackCompletion(void) } } -bool CMusicController::CheckUsb(void) -{ - /*if (!m) - return false; - - if (usb_get_connected_device_number(USB_MASS_STORAGE) <= 0) - return false; - - return true;*/ - return false; -} - -/*void CMusicController::sm_CbConnected(usb_device_h usb_device, char *action, void *dt) -{ - CMusicController *root = (CMusicController*)dt; - if (root) - root->m_OnConnected(usb_device, action); -} - - -void CMusicController::m_OnConnected(usb_device_h usb_device, char *action) -{ - Eina_List *l; - struct SCbInfo *cbinfo; - void *obj; - - if (SourceType() == SOURCE_TYPE_USB) { - if (!CheckUsb()) - SetSourceType(SOURCE_TYPE_ALL); - } - - EINA_LIST_FOREACH(m->elListener, l, obj) { - cbinfo = (SCbInfo *)obj; - if (cbinfo->type == E_USB_CONNECT && cbinfo->cb) - cbinfo->cb(cbinfo->data); - } -}*/ static void _content_update_cb(void *dt) { @@ -265,12 +227,17 @@ SMusicController *CMusicController::t_Create(void) _ERR(" playback create failed "); if (!mhandle->pPlayback->SetCallback(sm_CbPlaybackCompletion, this)) - _ERR(" playback add completion callback failed"); + _ERR(" playback add completion callback failed "); mhandle->cbinfo = mhandle->pMediadata->AddCallback(E_CONTENT_UPDATE, _content_update_cb, mhandle); - //usb_device_init(); - //usb_set_connected_cb(sm_CbConnected, this); + if (!CUsbConnectionListener::Create()) { + _ERR("CUsbConnectionListener::Create failed"); + mhandle->pPlayback->Destroy(); + mhandle->pMediadata->Destroy(); + delete mhandle; + return NULL; + } return mhandle; } @@ -300,6 +267,8 @@ void CMusicController::t_Destroy(void) struct SCbInfo *cbinfo; void *obj; + CUsbConnectionListener::Destroy(); + if (m->pPlayback->FlagCreate()) { if (!m->pPlayback->UnsetCallback()) _ERR(" playback remove completion callback failed"); @@ -324,9 +293,6 @@ void CMusicController::t_Destroy(void) free(cbinfo); } - //usb_unset_connected_cb(); - //usb_device_fini(); - delete m; } @@ -995,3 +961,25 @@ bool CMusicController::SetSortType(int type) return true; } + + +void CMusicController::OnConnect(void) +{ + if (!m) + return; + + Eina_List *l; + struct SCbInfo *cbinfo; + void *obj; + + if (SourceType() == SOURCE_TYPE_USB) { + if (!FlagConnected()) + SetSourceType(SOURCE_TYPE_ALL); + } + + EINA_LIST_FOREACH(m->elListener, l, obj) { + cbinfo = (SCbInfo *)obj; + if (cbinfo->type == E_USB_CONNECT && cbinfo->cb) + cbinfo->cb(cbinfo->data); + } +} \ No newline at end of file diff --git a/src/views/base-view.cpp b/src/views/base-view.cpp index f17c58f..bc717b5 100644 --- a/src/views/base-view.cpp +++ b/src/views/base-view.cpp @@ -392,7 +392,7 @@ void CMusicBaseView::m_CreateCtxPopup(int btnType) for (i = 0; i < size; i++) { if (btnType == BTN_SOURCE && i == SOURCE_TYPE_USB && - !m->mhandle->CheckUsb()) + !m->mhandle->FlagConnected()) continue; btn = s_AddButton(box); diff --git a/src/views/category-layout.cpp b/src/views/category-layout.cpp index 9aa6545..8c4ae3e 100644 --- a/src/views/category-layout.cpp +++ b/src/views/category-layout.cpp @@ -1351,11 +1351,17 @@ void CCategoryLayout::m_SortCatgrid(void) void CCategoryLayout::m_EmptyLayout(bool sort_flag) { - if (t.grid) + if (t.grid) { elm_gengrid_clear(t.grid); + evas_object_del(t.grid); + t.grid = NULL; + } - if (m->glist) + if (m->glist) { elm_genlist_clear(m->glist); + evas_object_del(m->glist); + m->glist = NULL; + } if (!sort_flag) { if (m->catlist) { -- 2.7.4 From ce6e506d7f6c82cf19b304e3c2f6f9b9756f266a Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Mon, 9 Feb 2015 11:49:28 +0900 Subject: [PATCH 11/16] Convert song information module into CSongInfo class. Change-Id: I4ac5cc19dae078f6183a4dcea8449e22f517c039 Signed-off-by: Kim Tae Soo --- include/category-layout.h | 2 +- include/mediadata.h | 2 +- include/music-controller.h | 10 +- include/playback-view.h | 2 +- include/playlist-mgr.h | 4 +- include/song_info.h | 73 ++++--- src/data/mediadata.cpp | 108 ++++++---- src/data/song_info.cpp | 427 ++++++++++++++++++++++++-------------- src/main.cpp | 1 + src/playback/music-controller.cpp | 24 +-- src/playback/playlist-mgr.cpp | 53 ++--- src/views/album-layout.cpp | 6 +- src/views/album-songs-layout.cpp | 29 ++- src/views/base-view.cpp | 6 +- src/views/category-layout.cpp | 100 +++++---- src/views/context-view.cpp | 8 +- src/views/folder-layout.cpp | 50 +++-- src/views/playback-view.cpp | 73 ++++--- src/views/song-layout.cpp | 47 ++--- 19 files changed, 599 insertions(+), 426 deletions(-) diff --git a/include/category-layout.h b/include/category-layout.h index 57eeb59..43866c4 100644 --- a/include/category-layout.h +++ b/include/category-layout.h @@ -43,7 +43,7 @@ public: category_info *catinfo; ECategoryType type; album_info *alinfo; - SSongInfo *sinfo; + CSongInfo *sinfo; Elm_Object_Item *item; bool check_status; }; diff --git a/include/mediadata.h b/include/mediadata.h index df6fbb1..11dc425 100644 --- a/include/mediadata.h +++ b/include/mediadata.h @@ -71,7 +71,7 @@ public: bool Create(void); virtual void Destroy(void); - struct SSongInfo *SongByUri(char *uri); + CSongInfo *SongByUri(char *uri); Eina_List *Medialist(int source_type, int EListType, void *info); struct SCbInfo *AddCallback(int type, void(*cb)(void *dt), void *data); bool RemoveCallback(struct SCbInfo *cbinfo); diff --git a/include/music-controller.h b/include/music-controller.h index a666afb..6ced4b7 100644 --- a/include/music-controller.h +++ b/include/music-controller.h @@ -87,7 +87,7 @@ public: bool GetCurrentSongIndex(int *ind); bool SetCurrentSongIndex(int ind); bool GetTotalSongs(int *ts); - bool GetSonginfoFromIndex(int index, struct SSongInfo **const csinfo); + bool GetSonginfoFromIndex(int index, CSongInfo **const csinfo); int PlayState(void); bool SetPlayState(int state); @@ -108,8 +108,8 @@ public: bool SetCurrentSong(char *mediaid); - bool GetCurrentSong(struct SSongInfo **const sinfo); - bool SetCurrentAlbum(struct album_info *alinfo); + bool GetCurrentSong(CSongInfo **const sinfo); + bool SetCurrentAlbum(album_info *alinfo); struct album_info *CurrentAlbum(void); @@ -119,7 +119,7 @@ public: bool PlayPreviousSong(void); bool PlayNextSong(void); bool PlayIndexSong(int index); - bool RemoveSong(struct SSongInfo *sinfo, int index); + bool RemoveSong(CSongInfo *sinfo, int index); bool CheckUsb(void); bool MediaGetList(int EListType, void *info, Eina_List **list); @@ -130,7 +130,7 @@ public: bool MediaAddmediaPlaylist(int id, Eina_List *idlist); bool MediaRemovemediaPlaylist(int id, Eina_List *idlist); bool MediaAddsongsPlaylist(int lid, Eina_List *list); - struct SSongInfo *MediaSongByUri(char *uri); + CSongInfo *MediaSongByUri(char *uri); public: virtual void OnConnect(void); diff --git a/include/playback-view.h b/include/playback-view.h index 7438dea..c0d03d4 100644 --- a/include/playback-view.h +++ b/include/playback-view.h @@ -95,7 +95,7 @@ private: void m_AddCurrentSonginfo(void); void m_AddEditPlaylistButtons(void); void m_AddControlButtons(void); - struct SItemInfo *m_FindItemInfoFromSong(Eina_List *list, SSongInfo *sinfo); + struct SItemInfo *m_FindItemInfoFromSong(Eina_List *list, CSongInfo *sinfo); struct SItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item); void m_UpdateItemCheck(SItemInfo *itinfo); Elm_Genlist_Item_Class *m_GetItemClass(); diff --git a/include/playlist-mgr.h b/include/playlist-mgr.h index 7e7f6dd..f98919e 100644 --- a/include/playlist-mgr.h +++ b/include/playlist-mgr.h @@ -39,13 +39,13 @@ public: bool Update(Eina_List *songlist, int addmode); const char *SongpathFromIndex(int index); - bool GetSonginfoFromIndex(int index, struct SSongInfo **const csinfo); + bool GetSonginfoFromIndex(int index, CSongInfo **const csinfo); bool GetTotalSongs(int *total_songs); bool GetCurSongIndex(int *index); bool SetCurSongIndex(int index); bool LoadNextSong(int shufstate); bool LoadPreviousSong(int shufstate); - bool RemoveSong(struct SSongInfo *sinfo, int index, int shufstate); + bool RemoveSong(CSongInfo *sinfo, int index, int shufstate); bool UpdateShuffle(void); bool SetCurrentSong(char *mediaid); }; diff --git a/include/song_info.h b/include/song_info.h index 93f7c49..a9dd842 100644 --- a/include/song_info.h +++ b/include/song_info.h @@ -17,40 +17,45 @@ #ifndef __SONG_INFO_H__ #define __SONG_INFO_H__ -struct SSongInfo { - char *media_id; - char *title; - char *artist; - char *album; - char *album_artist; - char *genre; - char *composer; - char *thumbnail_path; - char *filepath; - int type; - int duration; - int member_id; /* if it is member of any playlist */ -}; +#include + +class CSongInfo : public CExtNameInfo { +private: + struct SSongInfo *m; + +public: + static int s_SortTitleAZ(const void *d1, const void *d2); + static int s_SortTitleZA(const void *d1, const void *d2); + static int s_SortArtistAZ(const void *d1, const void *d2); + static int s_SortArtistZA(const void *d1, const void *d2); + static int s_SortAlbumAZ(const void *d1, const void *d2); + static int s_SortAlbumZA(const void *d1, const void *d2); + +public: + CSongInfo() : m(0) {} + virtual ~CSongInfo() {} -struct SSongInfo *song_info_create(); -void song_info_destroy(struct SSongInfo *sinfo); - -char *song_info_get_media_id(struct SSongInfo *csinfo); -int song_info_get_member_id(struct SSongInfo *csinfo); -char *song_info_get_title(struct SSongInfo *csinfo); -char *song_info_get_artist(struct SSongInfo *csinfo); -char *song_info_get_genre(struct SSongInfo *csinfo); -char *song_info_get_album(struct SSongInfo *csinfo); -char *song_info_get_filepath(struct SSongInfo *csinfo); -char *song_info_get_thumb(struct SSongInfo *csinfo); -bool song_info_get_duration(struct SSongInfo *csinfo, int *dur); -struct SSongInfo *song_info_duplicate(struct SSongInfo *s_sinfo); - -int sortsongs_title_az(const void *d1, const void *d2); -int sortsongs_title_za(const void *d1, const void *d2); -int sortsongs_artist_az(const void *d1, const void *d2); -int sortsongs_artist_za(const void *d1, const void *d2); -int sortsongs_album_az(const void *d1, const void *d2); -int sortsongs_album_za(const void *d1, const void *d2); + bool Create(void); + virtual void Destroy(void); + bool FlagCreate(void); + + int MemberId(void); + char *Artist(void); + char *Genre(void); + char *Album(void); + char *Composer(void); + int Type(void); + int Duration(void); + + bool SetMemberId(int memberId); + bool SetArtist(const char *artist); + bool SetGenre(const char *genre); + bool SetAlbum(const char *album); + bool SetComposer(const char *composer); + bool SetType(int type); + bool SetDuration(int duration); + + bool Duplicate(CNameInfo *obj); +}; #endif /*__SONG_INFO_H__*/ diff --git a/src/data/mediadata.cpp b/src/data/mediadata.cpp index 6be37f7..06565ca 100644 --- a/src/data/mediadata.cpp +++ b/src/data/mediadata.cpp @@ -54,7 +54,7 @@ struct SMediadata { Eina_List *artistlist; Eina_List *genrelist; Eina_List *cblist; - struct SSongInfo *sinfo; + CSongInfo *sinfo; filter_h filter; int source_type; int slist_type; @@ -212,67 +212,84 @@ bool CMediadata::sm_CbPlaylist(media_playlist_h ph, void* dt) bool CMediadata::m_HandleEachMediaData(media_info_h md_h) { - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; audio_meta_h audio_h = NULL; + char* tmpStr = NULL; + int tmpValue; - sinfo = song_info_create(); + sinfo = new CSongInfo; + + sinfo->Create(); if (!sinfo) return false; - if (media_info_get_file_path(md_h, &(sinfo->filepath)) + if (media_info_get_file_path(md_h, &tmpStr) != MEDIA_CONTENT_ERROR_NONE) { _ERR("Media file path Fetch error"); - song_info_destroy(sinfo); + sinfo->Destroy(); + delete sinfo; return false; } + sinfo->SetPath(tmpStr); - if (media_info_get_thumbnail_path(md_h, &(sinfo->thumbnail_path)) != + if (media_info_get_thumbnail_path(md_h, &tmpStr) != MEDIA_CONTENT_ERROR_NONE) _ERR("Media thumbnail path Fetch error"); + sinfo->SetThumbnailPath(tmpStr); if (media_info_get_media_type(md_h, - (media_content_type_e *)&(sinfo->type)) != + (media_content_type_e *)&tmpValue) != MEDIA_CONTENT_ERROR_NONE) _ERR("Media type Fetch error"); + sinfo->SetType(tmpValue); if (media_info_get_audio(md_h, &audio_h) != MEDIA_CONTENT_ERROR_NONE) { _ERR("Media info get audio error"); - song_info_destroy(sinfo); + sinfo->Destroy(); + delete sinfo; return false; } - if (audio_meta_get_media_id(audio_h, &(sinfo->media_id)) != + if (audio_meta_get_media_id(audio_h, &tmpStr) != MEDIA_CONTENT_ERROR_NONE) { _ERR("Media ID Fetch error"); audio_meta_destroy(audio_h); - song_info_destroy(sinfo); + sinfo->Destroy(); + delete sinfo; return false; } + sinfo->SetId(tmpStr); - if (media_info_get_title(md_h, &(sinfo->title)) != + if (media_info_get_title(md_h, &tmpStr) != MEDIA_CONTENT_ERROR_NONE) _ERR("audio title get error"); + sinfo->SetName(tmpStr); - if (audio_meta_get_artist(audio_h, &(sinfo->artist)) != + if (audio_meta_get_artist(audio_h, &tmpStr) != MEDIA_CONTENT_ERROR_NONE) _ERR("audio artist get error"); + sinfo->SetArtist(tmpStr); - if (audio_meta_get_album(audio_h, &(sinfo->album)) != + if (audio_meta_get_album(audio_h, &tmpStr) != MEDIA_CONTENT_ERROR_NONE) _ERR("audio album get error"); + sinfo->SetAlbum(tmpStr); - if (audio_meta_get_genre(audio_h, &(sinfo->genre)) != + if (audio_meta_get_genre(audio_h, &tmpStr) != MEDIA_CONTENT_ERROR_NONE) _ERR("audio genre get error"); + sinfo->SetGenre(tmpStr); - if (audio_meta_get_composer(audio_h, &(sinfo->composer)) != + if (audio_meta_get_composer(audio_h, &tmpStr) != MEDIA_CONTENT_ERROR_NONE) _ERR("audio composer get error"); + sinfo->SetComposer(tmpStr); - if (audio_meta_get_duration(audio_h, &(sinfo->duration)) != + if (audio_meta_get_duration(audio_h, &tmpValue) != MEDIA_CONTENT_ERROR_NONE) _ERR("audio duration get error"); + sinfo->SetDuration(tmpValue); audio_meta_destroy(audio_h); @@ -288,7 +305,7 @@ bool CMediadata::m_HandleEachMediaData(media_info_h md_h) break; case E_PLAYLIST_SONGS: - sinfo->member_id = m->member_id; + sinfo->SetMemberId(m->member_id); m->playlist_songlist = eina_list_append( m->playlist_songlist, sinfo); break; @@ -353,7 +370,7 @@ bool CMediadata::m_HandleEachFolderData(media_folder_h folder_h) bool CMediadata::m_HandleEachAlbumData(media_album_h album_h) { album_info *alinfo = NULL; - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; void *obj = NULL; char *genre = NULL; char *tpath = NULL; @@ -394,8 +411,8 @@ bool CMediadata::m_HandleEachAlbumData(media_album_h album_h) m_GetAlbumSongList(alinfo); EINA_LIST_FOREACH(m->album_songlist, l, obj) { - sinfo = (SSongInfo *)obj; - genre = song_info_get_genre(sinfo); + sinfo = (CSongInfo *)obj; + genre = sinfo->Genre(); if (genre) { alinfo->genre = strdup(genre); break; @@ -403,8 +420,8 @@ bool CMediadata::m_HandleEachAlbumData(media_album_h album_h) } EINA_LIST_FOREACH(m->album_songlist, l, obj) { - sinfo = (SSongInfo *)obj; - tpath = song_info_get_thumb(sinfo); + sinfo = (CSongInfo *)obj; + tpath = sinfo->ThumbnailPath(); if (tpath) { alinfo->thumbnail_path = strdup(tpath); break; @@ -464,12 +481,13 @@ bool CMediadata::m_HandleEachPlaylist(media_playlist_h ph) void CMediadata::m_DeleteSongList(void) { - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; void *obj = NULL; EINA_LIST_FREE(m->songlist, obj) { - sinfo = (SSongInfo *)obj; - song_info_destroy(sinfo); + sinfo = (CSongInfo *)obj; + sinfo->Destroy(); + delete sinfo; } m->songlist = NULL; @@ -478,12 +496,13 @@ void CMediadata::m_DeleteSongList(void) void CMediadata::m_DeleteFolderSongList(void) { - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; void *obj = NULL; EINA_LIST_FREE(m->folder_songlist, obj) { - sinfo = (SSongInfo *)obj; - song_info_destroy(sinfo); + sinfo = (CSongInfo *)obj; + sinfo->Destroy(); + delete sinfo; } m->folder_songlist = NULL; @@ -492,12 +511,13 @@ void CMediadata::m_DeleteFolderSongList(void) void CMediadata::m_DeleteAlbumSongList(void) { - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; void *obj = NULL; EINA_LIST_FREE(m->album_songlist, obj) { - sinfo = (SSongInfo *)obj; - song_info_destroy(sinfo); + sinfo = (CSongInfo *)obj; + sinfo->Destroy(); + delete sinfo; } m->album_songlist = NULL; @@ -506,12 +526,13 @@ void CMediadata::m_DeleteAlbumSongList(void) void CMediadata::m_DeletePlaylistSongList(void) { - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; void *obj = NULL; EINA_LIST_FREE(m->playlist_songlist, obj) { - sinfo = (SSongInfo *)obj; - song_info_destroy(sinfo); + sinfo = (CSongInfo *)obj; + sinfo->Destroy(); + delete sinfo; } m->playlist_songlist = NULL; @@ -898,7 +919,9 @@ void CMediadata::Destroy(void) m_DeleteCategoryList(CAT_TYPE_GENRE); m_DeleteCategoryList(CAT_TYPE_PLAYLISTS); m_DeletePlaylistSongList(); - song_info_destroy(m->sinfo); + if (m->sinfo && m->sinfo->FlagCreate()) + m->sinfo->Destroy(); + delete m->sinfo; EINA_LIST_FREE(m->cblist, obj) { cbinfo = (SCbInfo *)obj; @@ -1012,7 +1035,7 @@ Eina_List *CMediadata::Medialist(int source_type, int EListType, void *info) return NULL; } -struct SSongInfo *CMediadata::SongByUri(char *uri) +CSongInfo *CMediadata::SongByUri(char *uri) { if (!m) return NULL; @@ -1024,10 +1047,13 @@ struct SSongInfo *CMediadata::SongByUri(char *uri) if (!uri) return NULL; - if (m->sinfo) - song_info_destroy(m->sinfo); + if (m->sinfo && m->sinfo->FlagCreate()) { + m->sinfo->Destroy(); + } + delete m->sinfo; m->sinfo = NULL; + r = media_filter_create(&filter); if (r != MEDIA_CONTENT_ERROR_NONE) { _ERR("Media Filter Creation Failed"); @@ -1244,7 +1270,7 @@ bool CMediadata::RemovemediaPlaylist(int lid, Eina_List *idlist) media_playlist_h ph; int r; Eina_List *l; - struct SSongInfo *sinfo; + CSongInfo *sinfo; void *obj; int id; @@ -1260,8 +1286,8 @@ bool CMediadata::RemovemediaPlaylist(int lid, Eina_List *idlist) } EINA_LIST_FOREACH(idlist, l, obj) { - sinfo = (SSongInfo *)obj; - id = song_info_get_member_id(sinfo); + sinfo = (CSongInfo *)obj; + id = sinfo->MemberId(); if (id) media_playlist_remove_media(ph, id); } diff --git a/src/data/song_info.cpp b/src/data/song_info.cpp index 2bf9464..3305ee8 100644 --- a/src/data/song_info.cpp +++ b/src/data/song_info.cpp @@ -16,260 +16,375 @@ #include #include +#include #include "dbg.h" #include "i18n.h" #include "song_info.h" -struct SSongInfo *song_info_create() + +struct SSongInfo { + char *artist; + char *album; + char *albumArtist; + char *genre; + char *composer; + int type; + int duration; + int memberId; // if it is member of any playlist +}; + + +int CSongInfo::s_SortTitleAZ(const void *d1, const void *d2) { - struct SSongInfo *sinfo; + CSongInfo *sinfo1 = (CSongInfo *)d1; + CSongInfo *sinfo2 = (CSongInfo *)d2; + char *txt1; + char *txt2; - sinfo = (SSongInfo *)calloc(1, sizeof(*sinfo)); - if (!sinfo) - return NULL; + txt1 = sinfo1->Name(); + txt2 = sinfo2->Name(); - return sinfo; + if (!txt1) + return 1; + if (!txt2) + return -1; + + return strcasecmp(txt1, txt2); } -void song_info_destroy(struct SSongInfo *sinfo) + +int CSongInfo::s_SortTitleZA(const void *d1, const void *d2) { - if (!sinfo) - return; + CSongInfo *sinfo1 = (CSongInfo *)d1; + CSongInfo *sinfo2 = (CSongInfo *)d2; + char *txt1; + char *txt2; + + txt1 = sinfo1->Name(); + txt2 = sinfo2->Name(); + + if (!txt2) + return 1; + if (!txt1) + return -1; - free(sinfo->media_id); - free(sinfo->title); - free(sinfo->artist); - free(sinfo->album); - free(sinfo->album_artist); - free(sinfo->genre); - free(sinfo->composer); - free(sinfo->thumbnail_path); - free(sinfo->filepath); - free(sinfo); + return strcasecmp(txt2, txt1); } -char *song_info_get_media_id(struct SSongInfo *csinfo) + +int CSongInfo::s_SortArtistAZ(const void *d1, const void *d2) { - if (!csinfo) - return NULL; + CSongInfo *sinfo1 = (CSongInfo *)d1; + CSongInfo *sinfo2 = (CSongInfo *)d2; + char *txt1; + char *txt2; + + txt1 = sinfo1->Artist(); + txt2 = sinfo2->Artist(); + + if (!txt1) + return 1; + if (!txt2) + return -1; - return csinfo->media_id; + return strcasecmp(txt1, txt2); } -int song_info_get_member_id(struct SSongInfo *csinfo) + +int CSongInfo::s_SortArtistZA(const void *d1, const void *d2) { - if (!csinfo) - return 0; + CSongInfo *sinfo1 = (CSongInfo *)d1; + CSongInfo *sinfo2 = (CSongInfo *)d2; + char *txt1; + char *txt2; + + txt1 = sinfo1->Artist(); + txt2 = sinfo2->Artist(); - return csinfo->member_id; + if (!txt2) + return 1; + if (!txt1) + return -1; + + return strcasecmp(txt2, txt1); } -char *song_info_get_title(struct SSongInfo *csinfo) + +int CSongInfo::s_SortAlbumAZ(const void *d1, const void *d2) { - if (!csinfo) - return NULL; + CSongInfo *sinfo1 = (CSongInfo *)d1; + CSongInfo *sinfo2 = (CSongInfo *)d2; + char *txt1; + char *txt2; + + txt1 = sinfo1->Album(); + txt2 = sinfo2->Album(); + + if (!txt1) + return 1; + if (!txt2) + return -1; - return csinfo->title; + return strcasecmp(txt1, txt2); } -char *song_info_get_artist(struct SSongInfo *csinfo) + +int CSongInfo::s_SortAlbumZA(const void *d1, const void *d2) { - if (!csinfo) - return NULL; + CSongInfo *sinfo1 = (CSongInfo *)d1; + CSongInfo *sinfo2 = (CSongInfo *)d2; + char *txt1; + char *txt2; + + txt1 = sinfo1->Album(); + txt2 = sinfo2->Album(); - return csinfo->artist; + if (!txt2) + return 1; + if (!txt1) + return -1; + + return strcasecmp(txt2, txt1); } -char *song_info_get_genre(struct SSongInfo *csinfo) + +bool CSongInfo::Create(void) { - if (!csinfo) - return NULL; + if (m) + return false; - return csinfo->genre; + m = new SSongInfo(); + if (!m) { + _ERR("Mem allocation failed"); + return false; + } + + if (!CExtNameInfo::Create()) { + delete m; + m = NULL; + return false; + } + + return true; } -char *song_info_get_album(struct SSongInfo *csinfo) + +void CSongInfo::Destroy(void) { - if (!csinfo) - return NULL; + if (!m) + return; + + CExtNameInfo::Destroy(); - return csinfo->album; + delete[] m->artist; + delete[] m->album; + delete[] m->albumArtist; + delete[] m->genre; + delete[] m->composer; + delete m; + + m = NULL; } -char *song_info_get_filepath(struct SSongInfo *csinfo) + +bool CSongInfo::FlagCreate(void) { - if (!csinfo) - return NULL; + return !!m; +} + + +int CSongInfo::MemberId(void) +{ + if (!m) + return 0; - return csinfo->filepath; + return m->memberId; } -char *song_info_get_thumb(struct SSongInfo *csinfo) + +char *CSongInfo::Artist(void) { - if (!csinfo) + if (!m) return NULL; - return csinfo->thumbnail_path; + return m->artist; } -bool song_info_get_duration(struct SSongInfo *csinfo, int *dur) -{ - if (!csinfo) - return false; - *dur = csinfo->duration; +char *CSongInfo::Genre(void) +{ + if (!m) + return NULL; - return true; + return m->genre; } -struct SSongInfo *song_info_duplicate(struct SSongInfo *s_sinfo) -{ - struct SSongInfo *d_sinfo; - if (!s_sinfo) +char *CSongInfo::Album(void) +{ + if (!m) return NULL; - d_sinfo = (SSongInfo *)calloc(1, sizeof(*d_sinfo)); - if (!d_sinfo) + return m->album; +} + + +char *CSongInfo::Composer(void) +{ + if (!m) return NULL; - if (s_sinfo->media_id) - d_sinfo->media_id = strdup(s_sinfo->media_id); + return m->composer; +} - if (s_sinfo->title) - d_sinfo->title = strdup(s_sinfo->title); - if (s_sinfo->artist) - d_sinfo->artist = strdup(s_sinfo->artist); +int CSongInfo::Type(void) +{ + if (!m) + return 0; - if (s_sinfo->album) - d_sinfo->album = strdup(s_sinfo->album); + return m->type; +} - if (s_sinfo->album_artist) - d_sinfo->album_artist = strdup(s_sinfo->album_artist); - if (s_sinfo->composer) - d_sinfo->composer = strdup(s_sinfo->composer); +int CSongInfo::Duration(void) +{ + if (!m) + return 0; - if (s_sinfo->genre) - d_sinfo->genre = strdup(s_sinfo->genre); + return m->duration; +} - if (s_sinfo->filepath) - d_sinfo->filepath = strdup(s_sinfo->filepath); - if (s_sinfo->thumbnail_path) - d_sinfo->thumbnail_path = strdup(s_sinfo->thumbnail_path); +bool CSongInfo::SetMemberId(int memberId) +{ + if (!m) + return false; - d_sinfo->duration = s_sinfo->duration; - d_sinfo->type = s_sinfo->type; - d_sinfo->member_id = s_sinfo->member_id; + m->memberId = memberId; - return d_sinfo; + return true; } -int sortsongs_title_az(const void *d1, const void *d2) + +bool CSongInfo::SetArtist(const char *artist) { - struct SSongInfo *sinfo1 = (struct SSongInfo *)d1; - struct SSongInfo *sinfo2 = (struct SSongInfo *)d2; - char *txt1; - char *txt2; + if (!m) + return false; - txt1 = song_info_get_title(sinfo1); - txt2 = song_info_get_title(sinfo2); + delete[] m->artist; + m->artist = NULL; - if (!txt1) - return 1; - if (!txt2) - return -1; + if (artist) { + m->artist = t_Clone(artist); + if (!m->artist) + return false; + } - return strcasecmp(txt1, txt2); + return true; } -int sortsongs_title_za(const void *d1, const void *d2) + +bool CSongInfo::SetGenre(const char *genre) { - struct SSongInfo *sinfo1 = (struct SSongInfo *)d1; - struct SSongInfo *sinfo2 = (struct SSongInfo *)d2; - char *txt1; - char *txt2; + if (!m) + return false; - txt1 = song_info_get_title(sinfo1); - txt2 = song_info_get_title(sinfo2); + delete[] m->genre; + m->genre = NULL; - if (!txt2) - return 1; - if (!txt1) - return -1; + if (genre) { + m->genre = t_Clone(genre); + if (!m->genre) + return false; + } - return strcasecmp(txt2, txt1); + return true; } -int sortsongs_artist_az(const void *d1, const void *d2) + +bool CSongInfo::SetAlbum(const char *album) { - struct SSongInfo *sinfo1 = (struct SSongInfo *)d1; - struct SSongInfo *sinfo2 = (struct SSongInfo *)d2; - char *txt1; - char *txt2; + if (!m) + return false; - txt1 = song_info_get_artist(sinfo1); - txt2 = song_info_get_artist(sinfo2); + delete[] m->album; + m->album = NULL; - if (!txt1) - return 1; - if (!txt2) - return -1; + if (album) { + m->album = t_Clone(album); + if (!m->album) + return false; + } - return strcasecmp(txt1, txt2); + return true; } -int sortsongs_artist_za(const void *d1, const void *d2) + +bool CSongInfo::SetComposer(const char *composer) { - struct SSongInfo *sinfo1 = (struct SSongInfo *)d1; - struct SSongInfo *sinfo2 = (struct SSongInfo *)d2; - char *txt1; - char *txt2; - txt1 = song_info_get_artist(sinfo1); - txt2 = song_info_get_artist(sinfo2); + if (!m) + return false; - if (!txt2) - return 1; - if (!txt1) - return -1; + delete[] m->composer; + m->composer = NULL; - return strcasecmp(txt2, txt1); + if (composer) { + m->composer = t_Clone(composer); + if (!m->composer) + return false; + } + + return true; } -int sortsongs_album_az(const void *d1, const void *d2) + +bool CSongInfo::SetType(int type) { - struct SSongInfo *sinfo1 = (struct SSongInfo *)d1; - struct SSongInfo *sinfo2 = (struct SSongInfo *)d2; - char *txt1; - char *txt2; + if (!m) + return false; - txt1 = song_info_get_album(sinfo1); - txt2 = song_info_get_album(sinfo2); + m->type = type; - if (!txt1) - return 1; - if (!txt2) - return -1; + return true; +} - return strcasecmp(txt1, txt2); + +bool CSongInfo::SetDuration(int duration) +{ + if (!m) + return false; + + m->duration = duration; + + return true; } -int sortsongs_album_za(const void *d1, const void *d2) + +bool CSongInfo::Duplicate(CNameInfo *obj) { - struct SSongInfo *sinfo1 = (struct SSongInfo *)d1; - struct SSongInfo *sinfo2 = (struct SSongInfo *)d2; - char *txt1; - char *txt2; + if (!m) + return false; - txt1 = song_info_get_album(sinfo1); - txt2 = song_info_get_album(sinfo2); + CSongInfo* dst = (CSongInfo*)obj; - if (!txt2) - return 1; - if (!txt1) - return -1; + if (!CExtNameInfo::Duplicate(obj)) + return false; - return strcasecmp(txt2, txt1); + if (!SetMemberId(dst->MemberId())) + return false; + if (!SetArtist(dst->Artist())) + return false; + if (!SetGenre(dst->Genre())) + return false; + if (!SetAlbum(dst->Album())) + return false; + if (!SetComposer(dst->Composer())) + return false; + if (!SetType(dst->Type())) + return false; + if (!SetDuration(dst->Duration())) + return false; + + return true; } diff --git a/src/main.cpp b/src/main.cpp index 07aa2a1..f80c533 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,6 +18,7 @@ #include #include "dbg.h" #include +#include "song_info.h" #include "music-controller.h" #include "define.h" #include "BaseApp.h" diff --git a/src/playback/music-controller.cpp b/src/playback/music-controller.cpp index 2e0ddd1..b156eab 100644 --- a/src/playback/music-controller.cpp +++ b/src/playback/music-controller.cpp @@ -19,12 +19,12 @@ #include #include "dbg.h" #include "i18n.h" +#include "song_info.h" +#include "album_info.h" #include "music-controller.h" #include "playlist-mgr.h" #include "playback-mgr.h" #include "mediadata.h" -#include "song_info.h" -#include "album_info.h" #include "common.h" #include "bus.h" @@ -370,7 +370,7 @@ bool CMusicController::Start(void) int index; CPlaylist *pPlaylist; CPlayback *pPlayback; - struct SSongInfo *sinfo; + CSongInfo *sinfo; char *media_id; pPlaylist = m->pPlaylist; @@ -408,7 +408,7 @@ bool CMusicController::Start(void) m->playstate = PLAY_STATUS_PLAY; if (m->pPlaylist->GetSonginfoFromIndex(index, &sinfo)) { - media_id = song_info_get_media_id(sinfo); + media_id = sinfo->Id(); if (media_id) { if (m->pMediadata->SetPlayedTime(media_id)) bus_send_signal(); @@ -515,7 +515,7 @@ bool CMusicController::GetTotalSongs(int *ts) } -bool CMusicController::GetSonginfoFromIndex(int index, struct SSongInfo **const csinfo) +bool CMusicController::GetSonginfoFromIndex(int index, CSongInfo **const csinfo) { if (!m) return false; @@ -629,7 +629,7 @@ bool CMusicController::GetPosition(int *const milseconds) } -bool CMusicController::RemoveSong(struct SSongInfo *sinfo, int index) +bool CMusicController::RemoveSong(CSongInfo *sinfo, int index) { if (!m) return false; @@ -670,7 +670,7 @@ bool CMusicController::EmptyPlaylist(void) } -bool CMusicController::GetCurrentSong(struct SSongInfo **const sinfo) +bool CMusicController::GetCurrentSong(CSongInfo **const sinfo) { if (!m) return false; @@ -694,12 +694,12 @@ bool CMusicController::GetCurrentSong(struct SSongInfo **const sinfo) } -struct SSongInfo *CMusicController::MediaSongByUri(char *uri) +CSongInfo *CMusicController::MediaSongByUri(char *uri) { if (!m) return false; - struct SSongInfo *sinfo; + CSongInfo *sinfo; sinfo = m->pMediadata->SongByUri(uri); if (!sinfo) @@ -798,7 +798,7 @@ bool CMusicController::MediaAddsongsPlaylist(int lid, Eina_List *list) return false; Eina_List *idlist, *l; - struct SSongInfo *sinfo; + CSongInfo *sinfo; void *obj; char *id; @@ -807,8 +807,8 @@ bool CMusicController::MediaAddsongsPlaylist(int lid, Eina_List *list) idlist = NULL; EINA_LIST_FOREACH(list, l, obj) { - sinfo = (SSongInfo *)obj; - id = song_info_get_media_id(sinfo); + sinfo = (CSongInfo *)obj; + id = sinfo->Id(); if (id) idlist = eina_list_append(idlist, id); } diff --git a/src/playback/playlist-mgr.cpp b/src/playback/playlist-mgr.cpp index 687cb9f..7753197 100644 --- a/src/playback/playlist-mgr.cpp +++ b/src/playback/playlist-mgr.cpp @@ -129,8 +129,8 @@ bool CPlaylist::Create(Eina_List *songlist) if (m) return false; - struct SSongInfo *sinfo; - struct SSongInfo *d_sinfo; + CSongInfo *sinfo; + CSongInfo *d_sinfo; void *obj; Eina_List *l; @@ -147,8 +147,10 @@ bool CPlaylist::Create(Eina_List *songlist) m->cur_song_index = 0; EINA_LIST_FOREACH(songlist, l, obj) { - sinfo = (SSongInfo *)obj; - d_sinfo = song_info_duplicate(sinfo); + sinfo = (CSongInfo *)obj; + d_sinfo = new CSongInfo; + d_sinfo->Create(); + d_sinfo->Duplicate(sinfo); if (d_sinfo) { m->songlist = eina_list_append(m->songlist, d_sinfo); @@ -168,14 +170,15 @@ void CPlaylist::Destroy(void) if (!m) return; - struct SSongInfo *sinfo; + CSongInfo *sinfo; void *obj; m->total_songs = 0; if (m->songlist) { EINA_LIST_FREE(m->songlist, obj) { - sinfo = (SSongInfo *)obj; - song_info_destroy(sinfo); + sinfo = (CSongInfo *)obj; + sinfo->Destroy(); + delete sinfo; } } if (m->shuffle_list) @@ -191,9 +194,9 @@ bool CPlaylist::Update(Eina_List *songlist, int addmode) if (!m) return false; - struct SSongInfo *sinfo; - struct SSongInfo *d_sinfo; - struct SSongInfo *relative; + CSongInfo *sinfo; + CSongInfo *d_sinfo; + CSongInfo *relative; void *obj; Eina_List *l; int rindex; @@ -217,10 +220,11 @@ bool CPlaylist::Update(Eina_List *songlist, int addmode) rindex = m->cur_song_index; EINA_LIST_FOREACH(songlist, l, obj) { - sinfo = (SSongInfo *)obj; - d_sinfo = song_info_duplicate(sinfo); + sinfo = (CSongInfo *)obj; + d_sinfo = new CSongInfo; + d_sinfo->Duplicate(sinfo);; if (d_sinfo) { - relative = (SSongInfo *)eina_list_nth(m->songlist, rindex); + relative = (CSongInfo *)eina_list_nth(m->songlist, rindex); m->songlist = eina_list_append_relative( m->songlist, d_sinfo, relative); rindex++; @@ -241,7 +245,7 @@ bool CPlaylist::SetCurrentSong(char *mediaid) return false; Eina_List *l; - struct SSongInfo *sinfo; + CSongInfo *sinfo; void *obj; int i; char *id; @@ -251,8 +255,8 @@ bool CPlaylist::SetCurrentSong(char *mediaid) i = eina_list_count(m->songlist) - 1; EINA_LIST_REVERSE_FOREACH(m->songlist, l, obj) { - sinfo = (SSongInfo *)obj; - id = song_info_get_media_id(sinfo); + sinfo = (CSongInfo *)obj; + id = sinfo->Id(); if (!strcmp(id, mediaid)) { m->cur_song_index = i; break; @@ -374,7 +378,7 @@ const char *CPlaylist::SongpathFromIndex(int index) return NULL; const char *path; - struct SSongInfo *sinfo; + CSongInfo *sinfo; if (!m->songlist) { _ERR(" No play list"); @@ -386,13 +390,13 @@ const char *CPlaylist::SongpathFromIndex(int index) return NULL; } - sinfo = (SSongInfo *)eina_list_nth(m->songlist, index); + sinfo = (CSongInfo *)eina_list_nth(m->songlist, index); if (!sinfo) { _ERR(" Eina list nth failed "); return NULL; } - path = song_info_get_filepath(sinfo); + path = sinfo->Path(); if (!path) { _ERR(" Get song path failed"); return NULL; @@ -402,12 +406,12 @@ const char *CPlaylist::SongpathFromIndex(int index) } -bool CPlaylist::GetSonginfoFromIndex(int index, struct SSongInfo **const csinfo) +bool CPlaylist::GetSonginfoFromIndex(int index, CSongInfo **const csinfo) { if (!m) return false; - struct SSongInfo *sinfo; + CSongInfo *sinfo; if (!m->songlist) { _ERR(" No play list"); @@ -419,7 +423,7 @@ bool CPlaylist::GetSonginfoFromIndex(int index, struct SSongInfo **const csinfo) return false; } - sinfo = (SSongInfo *)eina_list_nth(m->songlist, index); + sinfo = (CSongInfo *)eina_list_nth(m->songlist, index); if (!sinfo) { _ERR(" Eina list nth failed "); return false; @@ -431,7 +435,7 @@ bool CPlaylist::GetSonginfoFromIndex(int index, struct SSongInfo **const csinfo) } -bool CPlaylist::RemoveSong(struct SSongInfo *sinfo, int index, int shufstate) +bool CPlaylist::RemoveSong(CSongInfo *sinfo, int index, int shufstate) { if (!m) return false; @@ -442,7 +446,8 @@ bool CPlaylist::RemoveSong(struct SSongInfo *sinfo, int index, int shufstate) } m->songlist = eina_list_remove(m->songlist, sinfo); - song_info_destroy(sinfo); + sinfo->Destroy(); + delete sinfo; if (shufstate) { _delete_element_shuffle(m->shuffle_list, m->total_songs, diff --git a/src/views/album-layout.cpp b/src/views/album-layout.cpp index 5b58afe..7f4a613 100644 --- a/src/views/album-layout.cpp +++ b/src/views/album-layout.cpp @@ -159,7 +159,7 @@ void CAlbumLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) void CAlbumLayout::m_OnCtxtUpdate(EActionType type, int lid) { Eina_List *list = NULL; - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; EAddType mode; if (!m->ctxtinfo || !m->ctxtinfo->context) @@ -182,12 +182,12 @@ void CAlbumLayout::m_OnCtxtUpdate(EActionType type, int lid) } m->mhandle->UpdatePlaylist(list, mode); - sinfo = (SSongInfo *)eina_list_data_get(list); + sinfo = (CSongInfo *)eina_list_data_get(list); eina_list_free(list); if (type == ACTION_TYPE_PLAY) { m->mhandle->Stop(); - m->mhandle->SetCurrentSong(sinfo->media_id); + m->mhandle->SetCurrentSong(sinfo->Id()); } _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); diff --git a/src/views/album-songs-layout.cpp b/src/views/album-songs-layout.cpp index a9a4cbb..c332053 100644 --- a/src/views/album-songs-layout.cpp +++ b/src/views/album-songs-layout.cpp @@ -52,7 +52,7 @@ enum EBtnType { }; struct SAlbumSongsItemInfo { - SSongInfo *sinfo; + CSongInfo *sinfo; Elm_Object_Item *item; }; @@ -93,7 +93,7 @@ struct SBtnInfo { char *CAlbumSongsLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part) { SAlbumSongsItemInfo *itinfo = (SAlbumSongsItemInfo *)data; - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; char buf[MAX_LENGTH]; char *timestr = NULL; int duration; @@ -119,16 +119,15 @@ char *CAlbumSongsLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, cons snprintf(buf, sizeof(buf), "%d", index + 1); } else if (!strcmp(part, "elm.text1")) - snprintf(buf, sizeof(buf), "%s", song_info_get_title(sinfo)); + snprintf(buf, sizeof(buf), "%s", sinfo->Name()); else if (!strcmp(part, "elm.text2")) - snprintf(buf, sizeof(buf), "%s", song_info_get_artist(sinfo)); + snprintf(buf, sizeof(buf), "%s", sinfo->Artist()); else if (!strcmp(part, "elm.text3")) { - if (song_info_get_duration(sinfo, &duration)) { - timestr = _get_timestr_from_milseconds(duration); - if (timestr) { - snprintf(buf, sizeof(buf), "%s", timestr); - free(timestr); - } + duration = sinfo->Duration(); + timestr = _get_timestr_from_milseconds(duration); + if (timestr) { + snprintf(buf, sizeof(buf), "%s", timestr); + free(timestr); } } @@ -181,7 +180,7 @@ void CAlbumSongsLayout::m_OnCtxtUpdate(EActionType type, int lid) if (type == ACTION_TYPE_PLAY) { m->mhandle->Stop(); - m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context)); + m->mhandle->SetCurrentSong(((CSongInfo *)m->ctxtinfo->context)->Id()); } _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); @@ -221,7 +220,7 @@ void CAlbumSongsLayout::m_OnItemSelect(Evas_Object *obj, void *event_info) return; } - mediaId = song_info_get_media_id(itinfo->sinfo); + mediaId = itinfo->sinfo->Id(); m_GotoPlayback(ADD_TYPE_FRESH, mediaId); } @@ -245,7 +244,7 @@ SAlbumSongsItemInfo *CAlbumSongsLayout::m_FindItemInfoFromItem(Eina_List *list, void CAlbumSongsLayout::m_UpdateSongList(void) { - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; void *obj = NULL; Eina_List *l = NULL; SAlbumSongsItemInfo *itinfo = NULL; @@ -266,7 +265,7 @@ void CAlbumSongsLayout::m_UpdateSongList(void) } EINA_LIST_FOREACH(m->slist, l, obj) { - sinfo = (SSongInfo *)obj; + sinfo = (CSongInfo *)obj; itinfo = (SAlbumSongsItemInfo *)calloc(1, sizeof(*itinfo)); if (!itinfo) return; @@ -276,7 +275,7 @@ void CAlbumSongsLayout::m_UpdateSongList(void) itinfo, NULL, ELM_GENLIST_ITEM_NONE, sm_CbItemSelect, this); itinfo->item = item; m->it_infolist = eina_list_append(m->it_infolist, itinfo); - song_info_get_duration(sinfo, &dur); + dur = sinfo->Duration(); m->total_duration = m->total_duration + dur; } } diff --git a/src/views/base-view.cpp b/src/views/base-view.cpp index bc717b5..804a2e3 100644 --- a/src/views/base-view.cpp +++ b/src/views/base-view.cpp @@ -609,7 +609,7 @@ void CMusicBaseView::m_DestroyPopup(void) void CMusicBaseView::m_UpdatePlaysongLabel(void) { - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; char buf[MAX_LENGTH]; int state; @@ -622,9 +622,7 @@ void CMusicBaseView::m_UpdatePlaysongLabel(void) return; } - snprintf(buf, sizeof(buf), "%s - %s", - song_info_get_title(sinfo), - song_info_get_artist(sinfo)); + snprintf(buf, sizeof(buf), "%s - %s", sinfo->Name(), sinfo->Artist()); _set_object_text(m->plsonglbl, buf, PLAYSONG_FONT_SIZE, FONT_STYLE_REGULAR); diff --git a/src/views/category-layout.cpp b/src/views/category-layout.cpp index 8c4ae3e..0b30cae 100644 --- a/src/views/category-layout.cpp +++ b/src/views/category-layout.cpp @@ -96,7 +96,7 @@ struct SCategoryLayout { CMusicController *pMusicController; CLayoutMgr *lmgr; CViewMgr *vmgr; - SSongInfo *c_sinfo; + CSongInfo *c_sinfo; int total_duration; int count; @@ -198,7 +198,7 @@ char *CCategoryLayout::sm_CbGetSelectlistItemText(void *data, Evas_Object *obj, return NULL; if (!strcmp(part, "elm.text")) { - str = song_info_get_title(itinfo->sinfo); + str = itinfo->sinfo->Name(); index = elm_genlist_item_index_get(itinfo->item); if ((index & 1) == 1) @@ -216,10 +216,10 @@ char *CCategoryLayout::sm_CbGetSelectlistItemText(void *data, Evas_Object *obj, MUSIC_SIGNAL_CHECK_OFF, MUSIC_BASE_VIEW); } else if (!strcmp(part, "elm.text1")) { - str = song_info_get_artist(itinfo->sinfo); + str = itinfo->sinfo->Artist(); } else if (!strcmp(part, "elm.text2")) { - str = song_info_get_album(itinfo->sinfo); + str = itinfo->sinfo->Album(); } if (str) @@ -232,7 +232,7 @@ char *CCategoryLayout::sm_CbGetSelectlistItemText(void *data, Evas_Object *obj, char *CCategoryLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part) { SCatItemInfo *itinfo = (SCatItemInfo *)data; - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; char buf[MAX_LENGTH]; char *timestr = NULL; int duration; @@ -258,18 +258,17 @@ char *CCategoryLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const snprintf(buf, sizeof(buf), "%d", index + 1); } else if (!strcmp(part, "elm.text1")) { - snprintf(buf, sizeof(buf), "%s", song_info_get_title(sinfo)); + snprintf(buf, sizeof(buf), "%s", sinfo->Name()); } else if (!strcmp(part, "elm.text2")) { - snprintf(buf, sizeof(buf), "%s", song_info_get_artist(sinfo)); + snprintf(buf, sizeof(buf), "%s", sinfo->Artist()); } else if (!strcmp(part, "elm.text3")) { - if (song_info_get_duration(sinfo, &duration)) { - timestr = _get_timestr_from_milseconds(duration); - if (timestr) { - snprintf(buf, sizeof(buf), "%s", timestr); - free(timestr); - } + duration = sinfo->Duration(); + timestr = _get_timestr_from_milseconds(duration); + if (timestr) { + snprintf(buf, sizeof(buf), "%s", timestr); + free(timestr); } } @@ -308,17 +307,22 @@ void CCategoryLayout::m_OnSongItemSelect(Evas_Object *obj, Elm_Object_Item *even return; } - if (m->c_sinfo) { - song_info_destroy(m->c_sinfo); - m->c_sinfo = NULL; + if (!m->c_sinfo) { + m->c_sinfo = new CSongInfo; + } + + if (!m->c_sinfo->FlagCreate()) { + m->c_sinfo->Create(); } - m->c_sinfo = song_info_duplicate(itinfo->sinfo); + + m->c_sinfo->Duplicate(itinfo->sinfo); if (!m->c_sinfo) return; - id = song_info_get_media_id(m->c_sinfo); + id = m->c_sinfo->Id(); if (!id) { - song_info_destroy(m->c_sinfo); + m->c_sinfo->Destroy(); + delete m->c_sinfo; m->c_sinfo = NULL; return; } @@ -384,7 +388,7 @@ void CCategoryLayout::t_OnCtxtUpdate(enum EActionType type, int lid) { Eina_List *list = NULL; Eina_List *alist = NULL, *slist = NULL, *l = NULL, *sl = NULL; - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; album_info *alinfo = NULL; void *obj = NULL; EAddType mode; @@ -398,13 +402,13 @@ void CCategoryLayout::t_OnCtxtUpdate(enum EActionType type, int lid) mode = ADD_TYPE_END; if (t.depth == E_DEPTH_SONG) { - sinfo = (SSongInfo *)t.ctxtinfo->context; + sinfo = (CSongInfo *)t.ctxtinfo->context; list = eina_list_append(list, sinfo); } else if (t.depth == E_DEPTH_ALBUM) { m->pMusicController->MediaGetList(LIST_TYPE_ALBUM_SONG, t.ctxtinfo->context, &list); - sinfo = (SSongInfo *)eina_list_data_get(list); + sinfo = (CSongInfo *)eina_list_data_get(list); } else { alist = category_info_get_albumlist((category_info *)t.ctxtinfo->context); @@ -416,13 +420,15 @@ void CCategoryLayout::t_OnCtxtUpdate(enum EActionType type, int lid) continue; } EINA_LIST_FOREACH(slist, sl, obj) { - sinfo = (SSongInfo *)obj; - list = eina_list_append(list, - song_info_duplicate((SSongInfo *)sinfo)); + sinfo = (CSongInfo *)obj; + CSongInfo *dupSongInfo = new CSongInfo; + dupSongInfo->Create(); + dupSongInfo->Duplicate(sinfo); + list = eina_list_append(list, dupSongInfo); } eina_list_free(slist); } - sinfo = (SSongInfo *)eina_list_data_get(list); + sinfo = (CSongInfo *)eina_list_data_get(list); } if (type == ACTION_TYPE_ADDTO) { @@ -433,8 +439,9 @@ void CCategoryLayout::t_OnCtxtUpdate(enum EActionType type, int lid) if (t.depth == E_DEPTH_CATEGORY) { EINA_LIST_FREE(list, obj) { - sinfo = (SSongInfo *)obj; - song_info_destroy(sinfo); + sinfo = (CSongInfo *)obj; + sinfo->Destroy(); + delete sinfo; } } @@ -444,13 +451,14 @@ void CCategoryLayout::t_OnCtxtUpdate(enum EActionType type, int lid) m->pMusicController->UpdatePlaylist(list, mode); if (type == ACTION_TYPE_PLAY) { m->pMusicController->Stop(); - m->pMusicController->SetCurrentSong(song_info_get_media_id((SSongInfo *)sinfo)); + m->pMusicController->SetCurrentSong(sinfo->Id()); } if (t.depth == E_DEPTH_CATEGORY) { EINA_LIST_FREE(list, obj) { - sinfo = (SSongInfo *)obj; - song_info_destroy(sinfo); + sinfo = (CSongInfo *)obj; + sinfo->Destroy(); + delete sinfo; } } else { @@ -792,7 +800,7 @@ Eina_List *CCategoryLayout::m_GetSelectedList(Eina_List *infolist, int type) continue; if (eType == ID_TYPE_MEDIA) { - id = song_info_get_media_id(itinfo->sinfo); + id = itinfo->sinfo->Id(); if (id) idlist = eina_list_append(idlist, id); } @@ -859,7 +867,7 @@ void CCategoryLayout::m_AddAlbumsToPlayback(int mode) Eina_List *l = NULL, *sl = NULL; Eina_List *slist = NULL; Eina_List *list = NULL; - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; SCatItemInfo *itinfo = NULL; void *obj = NULL; Eina_List *infolist = m->it_infolist; @@ -875,9 +883,11 @@ void CCategoryLayout::m_AddAlbumsToPlayback(int mode) } EINA_LIST_FOREACH(slist, sl, obj) { - sinfo = (SSongInfo *)obj; - list = eina_list_append(list, - song_info_duplicate(sinfo)); + sinfo = (CSongInfo *)obj; + CSongInfo *dupSongInfo = new CSongInfo; + dupSongInfo->Create(); + dupSongInfo->Duplicate(sinfo); + list = eina_list_append(list, dupSongInfo); } eina_list_free(slist); @@ -885,8 +895,9 @@ void CCategoryLayout::m_AddAlbumsToPlayback(int mode) pMusicController->UpdatePlaylist(list, mode); EINA_LIST_FREE(list, obj) { - sinfo = (SSongInfo *)obj; - song_info_destroy(sinfo); + sinfo = (CSongInfo *)obj; + sinfo->Destroy(); + delete sinfo; } } @@ -1140,10 +1151,10 @@ void CCategoryLayout::m_CreateSongList(void) Evas_Object *genlist = NULL; Elm_Genlist_Item_Class *list_item = NULL; bool r; - struct SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; void *obj = NULL; Eina_List *l = NULL; - struct SCatItemInfo *itinfo = NULL; + SCatItemInfo *itinfo = NULL; Elm_Object_Item *item = NULL; int dur; void (*item_select_fn)(void *, Evas_Object *, void *) = NULL; @@ -1202,7 +1213,7 @@ void CCategoryLayout::m_CreateSongList(void) } EINA_LIST_FOREACH(m->songlist, l, obj) { - sinfo = (SSongInfo *)obj; + sinfo = (CSongInfo *)obj; itinfo = (SCatItemInfo *)calloc(1, sizeof(*itinfo)); if (!itinfo) return; @@ -1213,8 +1224,7 @@ void CCategoryLayout::m_CreateSongList(void) item_select_fn, this); itinfo->item = item; m->it_infolist = eina_list_append(m->it_infolist, itinfo); - dur = 0; - song_info_get_duration(sinfo, &dur); + dur = sinfo->Duration(); m->total_duration = m->total_duration + dur; } elm_genlist_item_class_free(list_item); @@ -1615,7 +1625,9 @@ void CCategoryLayout::Destroy(void) m_EmptyLayout(false); category_info_destroy(t.c_catinfo); album_info_destroy(t.c_alinfo); - song_info_destroy(m->c_sinfo); + if (m->c_sinfo && m->c_sinfo->FlagCreate()) + m->c_sinfo->Destroy(); + delete m->c_sinfo; delete t.epopup; CExtBaseLayout::Destroy(); evas_object_del(Layout()); diff --git a/src/views/context-view.cpp b/src/views/context-view.cpp index c210bc3..8446e91 100644 --- a/src/views/context-view.cpp +++ b/src/views/context-view.cpp @@ -747,11 +747,11 @@ bool CContextView::m_GetContextDetails(SContentInfo *cinfo, char **path, switch (cinfo->type) { case CONTEXT_TYPE_PLAYSONG: - *subtitle2 = song_info_get_album((SSongInfo *)cinfo->context); + *subtitle2 = ((CSongInfo *)cinfo->context)->Album(); case CONTEXT_TYPE_SONG: - *path = song_info_get_thumb((SSongInfo *)cinfo->context); - *title = song_info_get_title((SSongInfo *)cinfo->context); - *subtitle = song_info_get_artist((SSongInfo *)cinfo->context); + *path = ((CSongInfo *)cinfo->context)->ThumbnailPath(); + *title = ((CSongInfo *)cinfo->context)->Name(); + *subtitle = ((CSongInfo *)cinfo->context)->Artist(); *rltvtitle = (char *)MUSIC_TEXT_SONG_RLTV; *rltvlist = m_OtherSongsOfArtist(*subtitle, *title); break; diff --git a/src/views/folder-layout.cpp b/src/views/folder-layout.cpp index 2f00aab..6bbb78c 100644 --- a/src/views/folder-layout.cpp +++ b/src/views/folder-layout.cpp @@ -56,7 +56,7 @@ enum EBtnType { struct SFolderItemInfo { folder_info *finfo; - SSongInfo *sinfo; + CSongInfo *sinfo; Elm_Object_Item *item; int depth; }; @@ -96,7 +96,7 @@ struct SFolderLayout { CLayoutMgr *lmgr; CViewMgr *vmgr; folder_info *c_finfo; - SSongInfo *c_sinfo; + CSongInfo *c_sinfo; SContentInfo *ctxtinfo; CFolderLayout *parent; int depth; @@ -141,7 +141,7 @@ char *CFolderLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const ch char *CFolderLayout::sm_CbGetGridSongItemText(void *data, Evas_Object *obj, const char *part) { SFolderItemInfo *itinfo = (SFolderItemInfo *)data; - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; char *txt = NULL; if (!itinfo || !obj) @@ -150,9 +150,9 @@ char *CFolderLayout::sm_CbGetGridSongItemText(void *data, Evas_Object *obj, cons sinfo = itinfo->sinfo; if (!strcmp(part, "elm.text")) - txt = song_info_get_title(sinfo); + txt = sinfo->Name(); else if (!strcmp(part, "elm.text1")) - txt = song_info_get_artist(sinfo); + txt = sinfo->Artist(); if (txt) return strdup(txt); @@ -187,7 +187,7 @@ Evas_Object *CFolderLayout::sm_CbGetGridItemContent(void *data, Evas_Object *obj Evas_Object *CFolderLayout::sm_CbGetGridSongItemContent(void *data, Evas_Object *obj, const char *part) { - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; SFolderItemInfo *itinfo = NULL; char *path = NULL; Evas_Object *img = NULL; @@ -204,7 +204,7 @@ Evas_Object *CFolderLayout::sm_CbGetGridSongItemContent(void *data, Evas_Object if (!img) return NULL; - path = song_info_get_thumb(sinfo); + path = sinfo->ThumbnailPath(); if (!path) { snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, MUSIC_IMAGE_DEFAULT_THUMB_126); @@ -269,7 +269,7 @@ void CFolderLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) void CFolderLayout::m_OnCtxtUpdate(EActionType type, int lid) { Eina_List *list = NULL; - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; EAddType mode; if (!m->ctxtinfo || !m->ctxtinfo->context) @@ -281,13 +281,13 @@ void CFolderLayout::m_OnCtxtUpdate(EActionType type, int lid) mode = ADD_TYPE_END; if (m->depth == E_DEPTH_SONG) { - sinfo = (SSongInfo *)m->ctxtinfo->context; + sinfo = (CSongInfo *)m->ctxtinfo->context; list = eina_list_append(list, sinfo); } else { m->mhandle->MediaGetList(LIST_TYPE_FOLDER_SONG, m->ctxtinfo->context, &list); - sinfo = (SSongInfo *)eina_list_data_get(list); + sinfo = (CSongInfo *)eina_list_data_get(list); } if (type == ACTION_TYPE_ADDTO) { @@ -304,7 +304,7 @@ void CFolderLayout::m_OnCtxtUpdate(EActionType type, int lid) if (type == ACTION_TYPE_PLAY) { m->mhandle->Stop(); - m->mhandle->SetCurrentSong(song_info_get_media_id(sinfo)); + m->mhandle->SetCurrentSong(sinfo->Id()); } _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); @@ -349,11 +349,15 @@ void CFolderLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, co } if (m->depth == E_DEPTH_SONG) { - if (m->c_sinfo) { - song_info_destroy(m->c_sinfo); - m->c_sinfo = NULL; + if (!m->c_sinfo) { + m->c_sinfo = new CSongInfo; } - m->c_sinfo = song_info_duplicate(itinfo->sinfo); + + if (!m->c_sinfo->FlagCreate()) { + m->c_sinfo->Create(); + } + + m->c_sinfo->Duplicate(itinfo->sinfo); } else { if (m->c_finfo) { @@ -364,7 +368,7 @@ void CFolderLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, co } if (m->depth == E_DEPTH_SONG) { - id = song_info_get_media_id(m->c_sinfo); + id = m->c_sinfo->Id(); elm_gengrid_item_selected_set(it, EINA_FALSE); m_GotoPlayback(ADD_TYPE_FRESH, id); } @@ -479,8 +483,8 @@ void CFolderLayout::m_SortFolderGrid(void) sortfolders_za }; int(*_sortsongs[])(const void *d1, const void *d2) = { - sortsongs_title_az, - sortsongs_title_za + CSongInfo::s_SortTitleAZ, + CSongInfo::s_SortTitleZA, }; if (!m->flist) @@ -569,7 +573,7 @@ void CFolderLayout::m_UpdateFolderGrid(bool sort_flag) bool r; int ts, td, dur; folder_info *finfo = NULL; - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; void *obj = NULL; Eina_List *l = NULL; struct SFolderItemInfo *itinfo = NULL; @@ -610,7 +614,7 @@ void CFolderLayout::m_UpdateFolderGrid(bool sort_flag) td = 0; if (m->depth == E_DEPTH_SONG) { EINA_LIST_FOREACH(m->flist, l, obj) { - sinfo = (SSongInfo *)obj; + sinfo = (CSongInfo *)obj; itinfo = (SFolderItemInfo *)calloc(1, sizeof(*itinfo)); if (!itinfo) return; @@ -625,7 +629,7 @@ void CFolderLayout::m_UpdateFolderGrid(bool sort_flag) MUSIC_PART_FOLDER_NAME, folder_info_get_name(m->c_finfo)); ts = ts + 1; - song_info_get_duration(sinfo, &dur); + dur = sinfo->Duration(); td = td + dur; } } @@ -811,7 +815,9 @@ void CFolderLayout::Destroy(void) evas_object_del(Layout()); free(m->c_finfo); - free(m->c_sinfo); + if (m->c_sinfo && m->c_sinfo->FlagCreate()) + m->c_sinfo->Destroy(); + delete m->c_sinfo; free(m->ctxtinfo); delete m; m = NULL; diff --git a/src/views/playback-view.cpp b/src/views/playback-view.cpp index 1dbfe4a..1912558 100644 --- a/src/views/playback-view.cpp +++ b/src/views/playback-view.cpp @@ -77,7 +77,7 @@ enum EEvasObject { struct SItemInfo { Elm_Object_Item *item; - SSongInfo *sinfo; + CSongInfo *sinfo; bool edit_mode; bool check_status; bool select_status; @@ -106,7 +106,7 @@ struct SPlaybackView { Ecore_Timer *etLongPress; Ecore_Timer *etWait; CMusicController *hMusicController; //! NOT NULL - SSongInfo *csinfo; + CSongInfo *csinfo; CViewMgr *mgr; SItemInfo *cs_itinfo; SContentInfo *ctxtinfo; @@ -179,10 +179,7 @@ Eina_Bool CPlaybackView::sm_CbUpdateSlider(void *dt) return ECORE_CALLBACK_CANCEL; } - if (!song_info_get_duration(m->csinfo, &duration)) { - m->etSlider = NULL; - return ECORE_CALLBACK_CANCEL; - } + duration = m->csinfo->Duration(); value = value + S_INCREMENT; if (value > duration) { @@ -276,7 +273,7 @@ void CPlaybackView::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid) return; itinfo = m->parent->m_FindItemInfoFromSong(m->elInfo, - (SSongInfo *)m->ctxtinfo->context); + (CSongInfo *)m->ctxtinfo->context); if (!itinfo) { _ERR(" Unable to find song in the list "); return; @@ -492,7 +489,8 @@ void CPlaybackView::m_UpdateCurrentSongProgressbar(void) elm_object_disabled_set(m->eoSlider, EINA_FALSE); - if (song_info_get_duration(m->csinfo, &duration)) { + duration = m->csinfo->Duration(); + { m_RemoveTimer(TIMER_SLIDER); m->etSlider = ecore_timer_add(S_INTERVAL, sm_CbUpdateSlider, m); @@ -519,7 +517,7 @@ void CPlaybackView::m_UpdateCurrentSongThumbnail(void) if (!m->cs_itinfo || !m->cs_itinfo->sinfo) return; - path = song_info_get_thumb(m->cs_itinfo->sinfo); + path = m->cs_itinfo->sinfo->ThumbnailPath(); if (path) elm_image_file_set(m->eoAlbumCover, path, NULL); else { @@ -538,10 +536,10 @@ void CPlaybackView::m_UpdateCurrentSongLabels(void) return; elm_object_part_text_set(m->eoBase, MUSIC_PART_SONG_TITLE, - song_info_get_title(m->csinfo)); + m->csinfo->Name()); - snprintf(buf, sizeof(buf), "%s - %s", song_info_get_artist(m->csinfo), - song_info_get_album(m->csinfo)); + snprintf(buf, sizeof(buf), "%s - %s", m->csinfo->Artist(), + m->csinfo->Album()); elm_object_part_text_set(m->eoBase, MUSIC_PART_ARTIST_ALBUM, buf); } @@ -656,7 +654,7 @@ void CPlaybackView::m_UpdatePlaymodeFocusSequence(void) void CPlaybackView::m_UpdateCurrentSongInfo(void) { - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; int index; if (eina_list_count(m->elInfo) == 0) { @@ -884,10 +882,7 @@ void CPlaybackView::m_HandleOnRepeated(void) obj = m->eoPressedObj; value = elm_slider_value_get(m->eoSlider); - if (!song_info_get_duration(m->cs_itinfo->sinfo, &duration)) { - _ERR("can not get duration "); - return; - } + duration = m->cs_itinfo->sinfo->Duration(); if (obj == m->eoBtnControl[BTN_REWIND]) { if (value == 0) { @@ -1253,7 +1248,7 @@ void CPlaybackView::m_AddControlButtons(void) } -SItemInfo *CPlaybackView::m_FindItemInfoFromSong(Eina_List *list, SSongInfo *sinfo) +SItemInfo *CPlaybackView::m_FindItemInfoFromSong(Eina_List *list, CSongInfo *sinfo) { Eina_List *l = NULL; SItemInfo *itinfo = NULL; @@ -1307,9 +1302,9 @@ void CPlaybackView::m_UpdateItemCheck(SItemInfo *itinfo) class CElmGenlistItemClass { public: - static char *sm_CbTextGet(void *data, Evas_Object *obj, const char *part) + static char *sm_CbTextGet(void *data, Evas_Object *obj, const char *part) { - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; SItemInfo *pItemInfo = (SItemInfo *)data; char buf[MAX_LENGTH]; char *timestr = NULL; @@ -1336,18 +1331,17 @@ public: } } else if (!strcmp(part, "elm.text1")) - snprintf(buf, sizeof(buf), "%s", song_info_get_title(sinfo)); + snprintf(buf, sizeof(buf), "%s", sinfo->Name()); else if (!strcmp(part, "elm.text2")) snprintf(buf, sizeof(buf), "%s - %s", - song_info_get_artist(sinfo), - song_info_get_album(sinfo)); + sinfo->Artist(), + sinfo->Album()); else if (!strcmp(part, "elm.text3")) { - if (song_info_get_duration(sinfo, &duration)) { - timestr = _get_timestr_from_milseconds(duration); - if (timestr) { - snprintf(buf, sizeof(buf), "%s", timestr); - free(timestr); - } + duration = sinfo->Duration(); + timestr = _get_timestr_from_milseconds(duration); + if (timestr) { + snprintf(buf, sizeof(buf), "%s", timestr); + free(timestr); } } @@ -1358,7 +1352,7 @@ public: } static Evas_Object *sm_CbContentGet(void *data, Evas_Object *obj, const char *part) { - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; SItemInfo *pItemInfo = (SItemInfo *)data; Evas_Object *img = NULL; char *path = NULL; @@ -1376,7 +1370,7 @@ public: elm_image_aspect_fixed_set(img, EINA_FALSE); if (!strcmp(part, "elm.swallow.icon")) { - path = song_info_get_thumb(sinfo); + path = sinfo->ThumbnailPath(); if (path) elm_image_file_set(img, path, "NULL"); else { @@ -1473,7 +1467,7 @@ void CPlaybackView::m_AddPlaylist(void) Elm_Genlist_Item_Class *list_item = NULL; int ts = 0; int i, index = -1; - struct SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; Elm_Object_Item *item = NULL; SItemInfo *pItemInfo = NULL; @@ -2032,11 +2026,24 @@ void CPlaybackView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mo case EO_BTN_SHUFFLE: case EO_EDIT_PLAYLIST: case EO_CLEAR_PLAYLIST: - case EO_PLAYLIST: if (!elm_object_focus_get(obj)) elm_object_focus_set(obj, EINA_TRUE); break; + case EO_PLAYLIST: + { + Elm_Object_Item *item; + + item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x, + ev->cur.canvas.y, NULL); + if (!item) + return; + + if (!elm_object_item_focus_get(item)) + elm_object_item_focus_set(item, EINA_TRUE); + } + break; + default: break; } diff --git a/src/views/song-layout.cpp b/src/views/song-layout.cpp index 36f763d..e735962 100644 --- a/src/views/song-layout.cpp +++ b/src/views/song-layout.cpp @@ -40,7 +40,7 @@ enum EObjectType { }; struct SSongItemInfo { - SSongInfo *sinfo; + CSongInfo *sinfo; Elm_Object_Item *item; }; @@ -71,7 +71,7 @@ struct SSongLayout { char *CSongLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part) { SSongItemInfo *itinfo = (SSongItemInfo *)data; - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; char buf[MAX_LENGTH]; char *timestr = NULL; int duration; @@ -94,19 +94,18 @@ char *CSongLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const char elm_object_item_signal_emit(itinfo->item, MUSIC_SIGNAL_ODD_ROW, MUSIC_BASE_VIEW); } - snprintf(buf, sizeof(buf), " %s", song_info_get_title(sinfo)); + snprintf(buf, sizeof(buf), " %s", sinfo->Name()); } else if (!strcmp(part, "elm.text1")) - snprintf(buf, sizeof(buf), "%s", song_info_get_artist(sinfo)); + snprintf(buf, sizeof(buf), "%s", sinfo->Artist()); else if (!strcmp(part, "elm.text2")) - snprintf(buf, sizeof(buf), "%s", song_info_get_album(sinfo)); + snprintf(buf, sizeof(buf), "%s", sinfo->Album()); else if (!strcmp(part, "elm.text3")) { - if (song_info_get_duration(sinfo, &duration)) { - timestr = _get_timestr_from_milseconds(duration); - if (timestr) { - snprintf(buf, sizeof(buf), "%s", timestr); - free(timestr); - } + duration = sinfo->Duration(); + timestr = _get_timestr_from_milseconds(duration); + if (timestr) { + snprintf(buf, sizeof(buf), "%s", timestr); + free(timestr); } } @@ -120,7 +119,7 @@ char *CSongLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const char Evas_Object *CSongLayout::sm_CbGetListItemContent(void *data, Evas_Object *obj, const char *part) { SSongItemInfo *itinfo = (SSongItemInfo *)data; - SSongInfo *sinfo = NULL; + CSongInfo *sinfo = NULL; Evas_Object *img = NULL; char *path = NULL; char buf[MAX_LENGTH]; @@ -136,7 +135,7 @@ Evas_Object *CSongLayout::sm_CbGetListItemContent(void *data, Evas_Object *obj, elm_image_aspect_fixed_set(img, EINA_FALSE); if (!strcmp(part, "elm.swallow.icon")) { - path = song_info_get_thumb(sinfo); + path = sinfo->ThumbnailPath(); if (path) elm_image_file_set(img, path, "NULL"); else { @@ -193,7 +192,7 @@ void CSongLayout::m_OnCtxtUpdate(EActionType type, int lid) if (type == ACTION_TYPE_PLAY) { m->mhandle->Stop(); - m->mhandle->SetCurrentSong(song_info_get_media_id((SSongInfo *)m->ctxtinfo->context)); + m->mhandle->SetCurrentSong(((CSongInfo *)m->ctxtinfo->context)->Id()); } _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item); @@ -236,7 +235,7 @@ void CSongLayout::m_OnItemSelect(Evas_Object *obj, void *event_info) return; } - mediaId = song_info_get_media_id(itinfo->sinfo); + mediaId = itinfo->sinfo->Id(); m->mhandle->Stop(); m->mhandle->UpdatePlaylist(m->slist, ADD_TYPE_FRESH); @@ -265,7 +264,7 @@ SSongItemInfo *CSongLayout::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_I void CSongLayout::m_UpdateSongList(bool sort_flag) { bool r; - struct SSongInfo *sinfo; + CSongInfo *sinfo; void *obj; Eina_List *l; struct SSongItemInfo *itinfo; @@ -287,7 +286,7 @@ void CSongLayout::m_UpdateSongList(bool sort_flag) m_SortSongList(); EINA_LIST_FOREACH(m->slist, l, obj) { - sinfo = (SSongInfo *)obj; + sinfo = (CSongInfo *)obj; itinfo = (SSongItemInfo *)calloc(1, sizeof(*itinfo)); if (!itinfo) return; @@ -306,12 +305,12 @@ void CSongLayout::m_SortSongList(void) int sort_type; int(*_sort_fn[])(const void *d1, const void *d2) = { - sortsongs_title_az, - sortsongs_title_za, - sortsongs_artist_az, - sortsongs_artist_za, - sortsongs_album_az, - sortsongs_album_za + CSongInfo::s_SortTitleAZ, + CSongInfo::s_SortTitleZA, + CSongInfo::s_SortArtistAZ, + CSongInfo::s_SortArtistZA, + CSongInfo::s_SortAlbumAZ, + CSongInfo::s_SortAlbumZA, }; sort_type = m->mhandle->SortType(); @@ -344,7 +343,7 @@ void CSongLayout::m_GotoPlayback(void) void CSongLayout::m_GotoPlaybackUri(void) { Eina_List *list = NULL; - SSongInfo *sinfo = m->mhandle->MediaSongByUri(m->uri); + CSongInfo *sinfo = m->mhandle->MediaSongByUri(m->uri); if (!sinfo) { _ERR(" Fetching song list from uri failed "); return; -- 2.7.4 From 4105abb358a7cfafa023196c35d57f4977c77747 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Tue, 10 Feb 2015 14:16:31 +0900 Subject: [PATCH 12/16] 1. Apply the new sort module to CSongLayout. 2. Fix button ui issue Change-Id: Ied1dd2bacf43630089083a8ccde6bd49fc2d40f9 Signed-off-by: Kim Tae Soo --- include/common.h | 5 ++ include/song-layout.h | 5 ++ include/song_info.h | 9 ---- res/edc/widgets/button.edc | 2 +- src/data/folder_info.cpp | 1 + src/data/song_info.cpp | 120 -------------------------------------------- src/main.cpp | 4 ++ src/views/entry-popup.cpp | 10 ++-- src/views/folder-layout.cpp | 19 ++++--- src/views/song-layout.cpp | 105 ++++++++++++++++++++++++++++++++++---- 10 files changed, 127 insertions(+), 153 deletions(-) diff --git a/include/common.h b/include/common.h index 1d22aef..d0a76f8 100644 --- a/include/common.h +++ b/include/common.h @@ -154,5 +154,10 @@ struct SParcel { #define KEY_BACK "Escape" #define KEY_MENU "Super_L" +#define SORT_BY_ARTIST_AZ "SORT_BY_ARTIST_AZ" +#define SORT_BY_ARTIST_ZA "SORT_BY_ARTIST_ZA" +#define SORT_BY_ALBUM_AZ "SORT_BY_ALBUM_AZ" +#define SORT_BY_ALBUM_ZA "SORT_BY_ALBUM_ZA" + #endif /* __COMMON_H__ */ diff --git a/include/song-layout.h b/include/song-layout.h index 25e7d41..dba1312 100644 --- a/include/song-layout.h +++ b/include/song-layout.h @@ -40,6 +40,11 @@ private: static void sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info); void m_OnItemSelect(Evas_Object *obj, void *event_info); + static int sm_CbSortArtistAZ(const void *d1, const void *d2); + static int sm_CbSortArtistZA(const void *d1, const void *d2); + static int sm_CbSortAlbumAZ(const void *d1, const void *d2); + static int sm_CbSortAlbumZA(const void *d1, const void *d2); + private: SSongItemInfo *m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item); void m_UpdateSongList(bool sort_flag); diff --git a/include/song_info.h b/include/song_info.h index a9dd842..0e3a57e 100644 --- a/include/song_info.h +++ b/include/song_info.h @@ -24,20 +24,11 @@ private: struct SSongInfo *m; public: - static int s_SortTitleAZ(const void *d1, const void *d2); - static int s_SortTitleZA(const void *d1, const void *d2); - static int s_SortArtistAZ(const void *d1, const void *d2); - static int s_SortArtistZA(const void *d1, const void *d2); - static int s_SortAlbumAZ(const void *d1, const void *d2); - static int s_SortAlbumZA(const void *d1, const void *d2); - -public: CSongInfo() : m(0) {} virtual ~CSongInfo() {} bool Create(void); virtual void Destroy(void); - bool FlagCreate(void); int MemberId(void); char *Artist(void); diff --git a/res/edc/widgets/button.edc b/res/edc/widgets/button.edc index 192686d..6c881c2 100644 --- a/res/edc/widgets/button.edc +++ b/res/edc/widgets/button.edc @@ -1685,7 +1685,7 @@ group { min: 214 62; image { normal: MUSIC_IMAGE_ADDBTN_BG_NORMAL; - border: 30 30 30 30; + border: 29 29 29 29; border_scale: 1; } } diff --git a/src/data/folder_info.cpp b/src/data/folder_info.cpp index d25090e..3aa3c8d 100644 --- a/src/data/folder_info.cpp +++ b/src/data/folder_info.cpp @@ -18,6 +18,7 @@ #include #include "dbg.h" #include "i18n.h" +#include #include "folder_info.h" struct folder_info *folder_info_create() diff --git a/src/data/song_info.cpp b/src/data/song_info.cpp index 3305ee8..e239433 100644 --- a/src/data/song_info.cpp +++ b/src/data/song_info.cpp @@ -34,120 +34,6 @@ struct SSongInfo { }; -int CSongInfo::s_SortTitleAZ(const void *d1, const void *d2) -{ - CSongInfo *sinfo1 = (CSongInfo *)d1; - CSongInfo *sinfo2 = (CSongInfo *)d2; - char *txt1; - char *txt2; - - txt1 = sinfo1->Name(); - txt2 = sinfo2->Name(); - - if (!txt1) - return 1; - if (!txt2) - return -1; - - return strcasecmp(txt1, txt2); -} - - -int CSongInfo::s_SortTitleZA(const void *d1, const void *d2) -{ - CSongInfo *sinfo1 = (CSongInfo *)d1; - CSongInfo *sinfo2 = (CSongInfo *)d2; - char *txt1; - char *txt2; - - txt1 = sinfo1->Name(); - txt2 = sinfo2->Name(); - - if (!txt2) - return 1; - if (!txt1) - return -1; - - return strcasecmp(txt2, txt1); -} - - -int CSongInfo::s_SortArtistAZ(const void *d1, const void *d2) -{ - CSongInfo *sinfo1 = (CSongInfo *)d1; - CSongInfo *sinfo2 = (CSongInfo *)d2; - char *txt1; - char *txt2; - - txt1 = sinfo1->Artist(); - txt2 = sinfo2->Artist(); - - if (!txt1) - return 1; - if (!txt2) - return -1; - - return strcasecmp(txt1, txt2); -} - - -int CSongInfo::s_SortArtistZA(const void *d1, const void *d2) -{ - CSongInfo *sinfo1 = (CSongInfo *)d1; - CSongInfo *sinfo2 = (CSongInfo *)d2; - char *txt1; - char *txt2; - - txt1 = sinfo1->Artist(); - txt2 = sinfo2->Artist(); - - if (!txt2) - return 1; - if (!txt1) - return -1; - - return strcasecmp(txt2, txt1); -} - - -int CSongInfo::s_SortAlbumAZ(const void *d1, const void *d2) -{ - CSongInfo *sinfo1 = (CSongInfo *)d1; - CSongInfo *sinfo2 = (CSongInfo *)d2; - char *txt1; - char *txt2; - - txt1 = sinfo1->Album(); - txt2 = sinfo2->Album(); - - if (!txt1) - return 1; - if (!txt2) - return -1; - - return strcasecmp(txt1, txt2); -} - - -int CSongInfo::s_SortAlbumZA(const void *d1, const void *d2) -{ - CSongInfo *sinfo1 = (CSongInfo *)d1; - CSongInfo *sinfo2 = (CSongInfo *)d2; - char *txt1; - char *txt2; - - txt1 = sinfo1->Album(); - txt2 = sinfo2->Album(); - - if (!txt2) - return 1; - if (!txt1) - return -1; - - return strcasecmp(txt2, txt1); -} - - bool CSongInfo::Create(void) { if (m) @@ -187,12 +73,6 @@ void CSongInfo::Destroy(void) } -bool CSongInfo::FlagCreate(void) -{ - return !!m; -} - - int CSongInfo::MemberId(void) { if (!m) diff --git a/src/main.cpp b/src/main.cpp index f80c533..8110ca4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,6 +18,7 @@ #include #include "dbg.h" #include +#include #include "song_info.h" #include "music-controller.h" #include "define.h" @@ -108,6 +109,7 @@ public: } virtual void OnTerminate(void) { + CSortMgr::Finalize(); CViewMgr::Finalize(); CMusicController::Finalize(); @@ -177,6 +179,8 @@ public: } _DBG(""); + CSortMgr::Initialize(); + m_cBaseView = new CMusicBaseView(MUSIC_BASE_VIEW); m_cPlaybackView = new CPlaybackView(MUSIC_PLAYBACK_VIEW); m_cContextView = new CContextView(MUSIC_CONTEXT_VIEW); diff --git a/src/views/entry-popup.cpp b/src/views/entry-popup.cpp index 8d88779..dda68f6 100644 --- a/src/views/entry-popup.cpp +++ b/src/views/entry-popup.cpp @@ -61,17 +61,17 @@ bool CEntryPopup::Create(Evas_Object *base, const char *text, void(*cbEntryName) Evas_Object *layout, *entry; if (!base) - return NULL; + return false; m = new SEntryPopup; if (!m) { - return NULL; + return false; } layout = elm_layout_add(base); if (!layout) { delete m; - return NULL; + return false; } elm_layout_file_set(layout, EDJEFILE, MUSIC_ENTRY_POPUP_LAYOUT); @@ -85,7 +85,7 @@ bool CEntryPopup::Create(Evas_Object *base, const char *text, void(*cbEntryName) if (!entry) { evas_object_del(layout); delete m; - return NULL; + return false; } elm_object_style_set(entry, MUSIC_STYLE_ENTRY); @@ -109,6 +109,8 @@ bool CEntryPopup::Create(Evas_Object *base, const char *text, void(*cbEntryName) m->idler = ecore_idler_add(sm_CbFocusIdler, this); Connect(entry); + + return true; } diff --git a/src/views/folder-layout.cpp b/src/views/folder-layout.cpp index 6bbb78c..09f933b 100644 --- a/src/views/folder-layout.cpp +++ b/src/views/folder-layout.cpp @@ -21,6 +21,8 @@ #include "dbg.h" #include "i18n.h" #include "define.h" +#include +#include #include "folder_info.h" #include "song_info.h" @@ -477,27 +479,28 @@ Elm_Object_Item *CFolderLayout::m_FindItemByInfo(Eina_List *list, folder_info *f void CFolderLayout::m_SortFolderGrid(void) { - int sort_type; + int sortType; + int(*_sortfolders[])(const void *d1, const void *d2) = { sortfolders_az, sortfolders_za }; - int(*_sortsongs[])(const void *d1, const void *d2) = { - CSongInfo::s_SortTitleAZ, - CSongInfo::s_SortTitleZA, + + const char *songSortType[] = { + SORT_BY_NAME_AZ, + SORT_BY_NAME_ZA, }; if (!m->flist) return; - sort_type = m->mhandle->SortType(); + sortType = m->mhandle->SortType(); if (m->depth == E_DEPTH_SONG) - m->flist = eina_list_sort(m->flist, 0, - _sortsongs[sort_type]); + m->flist = CSort::Sort(m->flist, songSortType[sortType]); else m->flist = eina_list_sort(m->flist, 0, - _sortfolders[sort_type]); + _sortfolders[sortType]); } diff --git a/src/views/song-layout.cpp b/src/views/song-layout.cpp index e735962..0d697d6 100644 --- a/src/views/song-layout.cpp +++ b/src/views/song-layout.cpp @@ -19,6 +19,8 @@ #include #include "AppCommon.h" #include "InputHandler.h" +#include +#include #include "dbg.h" #include "i18n.h" #include "define.h" @@ -245,6 +247,82 @@ void CSongLayout::m_OnItemSelect(Evas_Object *obj, void *event_info) } +int CSongLayout::sm_CbSortArtistAZ(const void *d1, const void *d2) +{ + CSongInfo *sinfo1 = (CSongInfo *)d1; + CSongInfo *sinfo2 = (CSongInfo *)d2; + char *txt1 = NULL; + char *txt2 = NULL; + + txt1 = sinfo1->Artist(); + if (!txt1) + return 1; + + txt2 = sinfo2->Artist(); + if (!txt2) + return -1; + + return strcasecmp(txt1, txt2); +} + + +int CSongLayout::sm_CbSortArtistZA(const void *d1, const void *d2) +{ + CSongInfo *sinfo1 = (CSongInfo *)d1; + CSongInfo *sinfo2 = (CSongInfo *)d2; + char *txt1 = NULL; + char *txt2 = NULL; + + txt1 = sinfo1->Artist(); + if (!txt1) + return -1; + + txt2 = sinfo2->Artist(); + if (!txt2) + return 1; + + return strcasecmp(txt2, txt1); +} + + +int CSongLayout::sm_CbSortAlbumAZ(const void *d1, const void *d2) +{ + CSongInfo *sinfo1 = (CSongInfo *)d1; + CSongInfo *sinfo2 = (CSongInfo *)d2; + char *txt1 = NULL; + char *txt2 = NULL; + + txt1 = sinfo1->Album(); + if (!txt1) + return 1; + + txt2 = sinfo2->Album(); + if (!txt2) + return -1; + + return strcasecmp(txt1, txt2); +} + + +int CSongLayout::sm_CbSortAlbumZA(const void *d1, const void *d2) +{ + CSongInfo *sinfo1 = (CSongInfo *)d1; + CSongInfo *sinfo2 = (CSongInfo *)d2; + char *txt1 = NULL; + char *txt2 = NULL; + + txt1 = sinfo1->Album(); + if (!txt1) + return -1; + + txt2 = sinfo2->Album(); + if (!txt2) + return 1; + + return strcasecmp(txt2, txt1); +} + + SSongItemInfo *CSongLayout::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item) { Eina_List *l; @@ -302,20 +380,20 @@ void CSongLayout::m_UpdateSongList(bool sort_flag) void CSongLayout::m_SortSongList(void) { - int sort_type; - - int(*_sort_fn[])(const void *d1, const void *d2) = { - CSongInfo::s_SortTitleAZ, - CSongInfo::s_SortTitleZA, - CSongInfo::s_SortArtistAZ, - CSongInfo::s_SortArtistZA, - CSongInfo::s_SortAlbumAZ, - CSongInfo::s_SortAlbumZA, + int sortType; + + const char *sortFuncId[] = { + SORT_BY_NAME_AZ, + SORT_BY_NAME_ZA, + SORT_BY_ARTIST_AZ, + SORT_BY_ARTIST_ZA, + SORT_BY_ALBUM_AZ, + SORT_BY_ALBUM_ZA }; - sort_type = m->mhandle->SortType(); + sortType = m->mhandle->SortType(); - m->slist = eina_list_sort(m->slist, 0, _sort_fn[sort_type]); + m->slist = CSort::Sort(m->slist, sortFuncId[sortType]); } void CSongLayout::m_EmptySongList(bool sort_flag) @@ -462,6 +540,11 @@ bool CSongLayout::Create(CLayoutMgr *mgr, const char *uri) return false; } + CSortMgr::GetInstance()->RegisterSortFunction(SORT_BY_ARTIST_AZ, sm_CbSortArtistAZ); + CSortMgr::GetInstance()->RegisterSortFunction(SORT_BY_ARTIST_ZA, sm_CbSortArtistZA); + CSortMgr::GetInstance()->RegisterSortFunction(SORT_BY_ALBUM_AZ, sm_CbSortAlbumAZ); + CSortMgr::GetInstance()->RegisterSortFunction(SORT_BY_ALBUM_ZA, sm_CbSortAlbumZA); + if (uri) { m->uri = new char[strlen(uri) + 1]; strcpy(m->uri, uri); -- 2.7.4 From 51ab6a28baac6787361e595ca098445d44c2e6bb Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Tue, 10 Feb 2015 15:59:24 +0900 Subject: [PATCH 13/16] Modification for api name change player_set_position -> player_set_play_position player_get_position -> player_get_play_position Change-Id: I5763a0248dc05d0d27cd170e9410463c1810837e Signed-off-by: Kim Tae Soo --- src/playback/playback-mgr.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/playback/playback-mgr.cpp b/src/playback/playback-mgr.cpp index 002c74a..9b37702 100644 --- a/src/playback/playback-mgr.cpp +++ b/src/playback/playback-mgr.cpp @@ -331,7 +331,7 @@ bool CPlayback::SetPosition(int milsec) if (!m->player) return false; - r = player_set_position(m->player, milsec, _on_seek_completion, m); + r = player_set_play_position(m->player, milsec, _on_seek_completion, m); if (r != PLAYER_ERROR_NONE) { _ERR("Player set position failed"); return false; @@ -351,7 +351,7 @@ bool CPlayback::GetPosition(int *const milsec) if (!m->player) return false; - r = player_get_position(m->player, milsec); + r = player_get_play_position(m->player, milsec); if (r != PLAYER_ERROR_NONE) { _ERR("Player set position failed"); return false; -- 2.7.4 From 01dbdf318f6e09be2def6233c51865ad1992b3ee Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Tue, 10 Feb 2015 16:36:34 +0900 Subject: [PATCH 14/16] Convert information modules into CXXXInfo classes. 1. folder information module -> CFolderInfo class 2. album information module -> CAlbumInfo class 3. category information module -> CCategory class Change-Id: I6971c18ac93d078933caad22300ab809cceaefdc Signed-off-by: Kim Tae Soo --- include/album_info.h | 43 +++--- include/category-layout.h | 8 +- include/category_info.h | 65 +++++---- include/folder-layout.h | 3 +- include/folder_info.h | 34 +++-- include/mediadata.h | 7 +- include/music-controller.h | 7 +- src/data/album_info.cpp | 185 +++++++++++++++---------- src/data/category_info.cpp | 279 ++++++++++++++++++++++---------------- src/data/folder_info.cpp | 139 +++++++++---------- src/data/mediadata.cpp | 263 ++++++++++++++++++++--------------- src/data/song_info.cpp | 4 + src/main.cpp | 1 + src/playback/music-controller.cpp | 39 ++++-- src/views/album-layout.cpp | 40 +++--- src/views/album-songs-layout.cpp | 10 +- src/views/artist-layout.cpp | 26 ++-- src/views/base-view.cpp | 2 + src/views/category-layout.cpp | 124 +++++++++-------- src/views/context-view.cpp | 38 +++--- src/views/folder-layout.cpp | 53 ++++---- src/views/genre-layout.cpp | 26 ++-- src/views/playback-view.cpp | 1 + src/views/playlist-layout.cpp | 32 +++-- src/views/song-layout.cpp | 1 + 25 files changed, 814 insertions(+), 616 deletions(-) diff --git a/include/album_info.h b/include/album_info.h index 0eace3f..49a9520 100644 --- a/include/album_info.h +++ b/include/album_info.h @@ -17,25 +17,30 @@ #ifndef __ALBUM_INFO_H__ #define __ALBUM_INFO_H__ -struct album_info { - int album_id; - char *name; - char *artist; - char *genre; - char *thumbnail_path; - int song_count; -}; +#include + +class CAlbumInfo : public CExtNameInfo { +private: + struct SAlbumInfo *m; + +public: + CAlbumInfo() : m(0) {} + virtual ~CAlbumInfo() {} + + bool Create(); + virtual void Destroy(); -struct album_info *album_info_create(); -void album_info_destroy(struct album_info *alinfo); - -int album_info_get_album_id(struct album_info *calinfo); -char *album_info_get_name(struct album_info *calinfo); -char *album_info_get_artist(struct album_info *calinfo); -char *album_info_get_genre(struct album_info *calinfo); -char *album_info_get_thumb(struct album_info *calinfo); -struct album_info *album_info_duplicate(struct album_info *s_alinfo); -int sortalbums_za(const void *d1, const void *d2); -int sortalbums_az(const void *d1, const void *d2); + char *Artist(); + char *Genre(); + int SongCount(); + int AlbumId(); + + bool SetArtist(const char *artist); + bool SetGenre(const char *genre); + bool SetSongCount(int songCount); + bool SetAlbumId(int albumId); + + bool Duplicate(CNameInfo *obj); +}; #endif /*__ALBUM_INFO_H__*/ diff --git a/include/category-layout.h b/include/category-layout.h index 43866c4..b8688e8 100644 --- a/include/category-layout.h +++ b/include/category-layout.h @@ -40,9 +40,9 @@ public: }; struct SCatItemInfo { - category_info *catinfo; + CCategoryInfo *catinfo; ECategoryType type; - album_info *alinfo; + CAlbumInfo *alinfo; CSongInfo *sinfo; Elm_Object_Item *item; bool check_status; @@ -51,8 +51,8 @@ public: protected: struct SCategoryLayoutProtected { int depth; - category_info *c_catinfo; - album_info *c_alinfo; + CCategoryInfo *c_catinfo; + CAlbumInfo *c_alinfo; SContentInfo *ctxtinfo; ESelectType sel_type; Evas_Object *grid; diff --git a/include/category_info.h b/include/category_info.h index cd42a85..493fb16 100644 --- a/include/category_info.h +++ b/include/category_info.h @@ -16,36 +16,47 @@ #ifndef __CATEGORY_INFO_H__ #define __CATEGORY_INFO_H__ + + #include +#include +#include "album_info.h" -struct list_member { - char *media_id; - int member_id; -}; +class CCategoryInfo : public CExtNameInfo { +public: + struct CListMember { + char *mediaId; + int memberId; + }; -struct category_info { - int id; - const char *name; - char *thumb; - int album_count; - int song_count; - Eina_List *albumlist; - Eina_List *memberlist; -}; +private: + struct SCategoryInfo *m; + +private: + CListMember *m_MemberDuplicate(CListMember *member); + +public: + CCategoryInfo() : m(0) {} + virtual ~CCategoryInfo() {} -struct category_info *category_info_create(); -void category_info_destroy(struct category_info *catinfo); - -int category_info_get_category_id(struct category_info *catinfo); -const char *category_info_get_name(struct category_info *catinfo); -char *category_info_get_thumb(struct category_info *catinfo); -int category_info_get_albumcount(struct category_info *catinfo); -int category_info_get_songcount(struct category_info *catinfo); -Eina_List *category_info_get_albumlist(struct category_info *catinfo); -Eina_List *category_info_get_memberlist(struct category_info *catinfo); -struct category_info *category_info_duplicate(struct category_info *catinfo); -int sortcategorys_za(const void *d1, const void *d2); -int sortcategorys_az(const void *d1, const void *d2); -struct category_info *find_category(Eina_List *list, const char *category); + bool Create(void); + virtual void Destroy(void); + + int CategoryId(void); + int AlbumCount(void); + int SongCount(void); + Eina_List *AlbumList(void); + Eina_List *MemberList(void); + + bool SetCategoryId(int categoryId); + bool SetAlbumCount(int albumCount); + bool SetSongCount(int songCount); + bool SetAlbumInfo(CAlbumInfo *albumList); + bool SetMember(CListMember *member); + + bool Duplicate(CNameInfo *obj); + + static CCategoryInfo *FindCategory(Eina_List *list, const char *categoryName); +}; #endif /*__CATEGORY_INFO_H__*/ diff --git a/include/folder-layout.h b/include/folder-layout.h index 6b33728..7a25720 100644 --- a/include/folder-layout.h +++ b/include/folder-layout.h @@ -19,7 +19,6 @@ struct SFolderItemInfo; -struct folder_info; class CFolderLayout : public CExtBaseLayout, public CListenerMgr, public IMouseMoveListener, public IMouseClickedListener, @@ -52,7 +51,7 @@ private: inline int m_ConvertToMin(int milsec); void m_RemoveFocusIdler(void); void m_GotoPlayback(int mode, char *id); - Elm_Object_Item *m_FindItemByInfo(Eina_List *list, folder_info *finfo); + Elm_Object_Item *m_FindItemByInfo(Eina_List *list, CFolderInfo *finfo); void m_SortFolderGrid(void); void m_CreateFolderGrid(void); void m_EmptyFolderGrid(bool sort_flag); diff --git a/include/folder_info.h b/include/folder_info.h index 3e3d103..27f4981 100644 --- a/include/folder_info.h +++ b/include/folder_info.h @@ -17,22 +17,26 @@ #ifndef __FOLDER_INFO_H__ #define __FOLDER_INFO_H__ -struct folder_info { - char *folder_id; - char *name; - int count; - int duration; -}; +#include + +class CFolderInfo : public CNameInfo { +private: + struct SFolderInfo *m; + +public: + CFolderInfo() : m(0) {} + virtual ~CFolderInfo() {} -struct folder_info *folder_info_create(); -void folder_info_destroy(struct folder_info *finfo); + bool Create(void); + virtual void Destroy(void); -int folder_info_get_count(struct folder_info *cfinfo); -int folder_info_get_duration(struct folder_info *cfinfo); -char *folder_info_get_name(struct folder_info *cfinfo); -char *folder_info_get_folder_id(struct folder_info *cfinfo); -struct folder_info *folder_info_duplicate(struct folder_info *s_finfo); -int sortfolders_za(const void *d1, const void *d2); -int sortfolders_az(const void *d1, const void *d2); + int Count(void); + int Duration(void); + + bool SetCount(int count); + bool SetDuration(int duration); + + bool Duplicate(CNameInfo *obj); +}; #endif /*__FOLDER_INFO_H__*/ diff --git a/include/mediadata.h b/include/mediadata.h index 11dc425..9cd1289 100644 --- a/include/mediadata.h +++ b/include/mediadata.h @@ -20,7 +20,6 @@ struct mediadata; struct album_info; struct category_info; -struct folder_info; #include #include "common.h" @@ -55,10 +54,10 @@ private: bool m_DestroyFilter(void); int m_GetPlaylistList(void); void m_GetCategoryList(ECategoryType type); - int m_GetPlaylistSongList(category_info *catinfo); - int m_GetFolderSongList(folder_info *finfo); + int m_GetPlaylistSongList(CCategoryInfo *catinfo); + int m_GetFolderSongList(CFolderInfo *finfo); int m_GetFolderList(void); - int m_GetAlbumSongList(album_info *alinfo); + int m_GetAlbumSongList(CAlbumInfo *alinfo); int m_GetAlbumList(void); int m_GetSongList(void); void m_UpdateLists(void); diff --git a/include/music-controller.h b/include/music-controller.h index 6ced4b7..c2a4192 100644 --- a/include/music-controller.h +++ b/include/music-controller.h @@ -21,9 +21,6 @@ #include #include -struct SSongInfo; -struct album_info; - class IMusicControllerListener { private: @@ -109,9 +106,9 @@ public: bool SetCurrentSong(char *mediaid); bool GetCurrentSong(CSongInfo **const sinfo); - bool SetCurrentAlbum(album_info *alinfo); + bool SetCurrentAlbum(CAlbumInfo *alinfo); - struct album_info *CurrentAlbum(void); + CAlbumInfo *CurrentAlbum(void); bool UpdatePlaylist(Eina_List *slist, int addmode); bool EmptyPlaylist(void); diff --git a/src/data/album_info.cpp b/src/data/album_info.cpp index bb0452b..2bf3111 100644 --- a/src/data/album_info.cpp +++ b/src/data/album_info.cpp @@ -20,123 +20,166 @@ #include "i18n.h" #include "album_info.h" -struct album_info *album_info_create() -{ - struct album_info *alinfo; - alinfo = (album_info *)calloc(1, sizeof(*alinfo)); - if (!alinfo) - return NULL; +struct SAlbumInfo { + char *artist; + char *genre; + int songCount; + int albumId; + + SAlbumInfo() { + memset(this, 0, sizeof(SAlbumInfo)); + } +}; + - return alinfo; +bool CAlbumInfo::Create() +{ + if (m) + return false; + + m = new SAlbumInfo(); + if (!m) { + _ERR("Mem allocation failed"); + return false; + } + + if (!CExtNameInfo::Create()) { + delete m; + m = NULL; + return false; + } + + return true; } -void album_info_destroy(struct album_info *alinfo) + +void CAlbumInfo::Destroy() { - if (!alinfo) + if (!m) return; - free(alinfo->name); - free(alinfo->artist); - free(alinfo->genre); - free(alinfo->thumbnail_path); - free(alinfo); -} + CNameInfo::Destroy(); -int album_info_get_album_id(struct album_info *calinfo) -{ - return calinfo->album_id; + delete[] m->artist; + delete[] m->genre; + delete m; + m = NULL; } -char *album_info_get_name(struct album_info *calinfo) + +char *CAlbumInfo::Artist() { - if (!calinfo) + if (!m) return NULL; - return calinfo->name; + return m->artist; } -char *album_info_get_artist(struct album_info *calinfo) + +char *CAlbumInfo::Genre() { - if (!calinfo) + if (!m) return NULL; - return calinfo->artist; + return m->genre; } -char *album_info_get_genre(struct album_info *calinfo) + +int CAlbumInfo::SongCount() { - if (!calinfo) - return NULL; + if (!m) + return 0; - return calinfo->genre; + return m->songCount; } -char *album_info_get_thumb(struct album_info *calinfo) + +int CAlbumInfo::AlbumId() { - if (!calinfo) - return NULL; + if (!m) + return 0; - return calinfo->thumbnail_path; + return m->albumId; } -struct album_info *album_info_duplicate(struct album_info *s_alinfo) + +bool CAlbumInfo::SetArtist(const char *artist) { - struct album_info *d_alinfo; + if (!m) + return false; - if (!s_alinfo) - return NULL; + delete[] m->artist; + m->artist = NULL; - d_alinfo = (album_info *)calloc(1, sizeof(*d_alinfo)); - if (!d_alinfo) - return NULL; + if (artist) { + m->artist = t_Clone(artist); + if (!m->artist) + return false; + } - d_alinfo->album_id = s_alinfo->album_id; + return true; +} - if (s_alinfo->name) - d_alinfo->name = strdup(s_alinfo->name); - if (s_alinfo->artist) - d_alinfo->artist = strdup(s_alinfo->artist); +bool CAlbumInfo::SetGenre(const char *genre) +{ + if (!m) + return false; + + delete[] m->genre; + m->genre = NULL; - if (s_alinfo->thumbnail_path) - d_alinfo->thumbnail_path = strdup(s_alinfo->thumbnail_path); + if (genre) { + m->genre = t_Clone(genre); + if (!m->genre) + return false; + } - return d_alinfo; + return true; } -int sortalbums_za(const void *d1, const void *d2) + +bool CAlbumInfo::SetSongCount(int songCount) { - struct album_info *alinfo1 = (struct album_info *)d1; - struct album_info *alinfo2 = (struct album_info *)d2; - char *txt1; - char *txt2; + if (!m) + return false; - txt1 = album_info_get_name(alinfo1); - txt2 = album_info_get_name(alinfo2); + m->songCount = songCount; - if (!txt2) - return 1; - if (!txt1) - return -1; + return true; +} + + +bool CAlbumInfo::SetAlbumId(int albumId) +{ + if (!m) + return false; - return strcasecmp(txt2, txt1); + m->albumId = albumId; + + return true; } -int sortalbums_az(const void *d1, const void *d2) + +bool CAlbumInfo::Duplicate(CNameInfo *obj) { - struct album_info *alinfo1 = (struct album_info *)d1; - struct album_info *alinfo2 = (struct album_info *)d2; - char *txt1; - char *txt2; + if (!m) + return false; + + CAlbumInfo* dst = (CAlbumInfo*)obj; - txt1 = album_info_get_name(alinfo1); - txt2 = album_info_get_name(alinfo2); + if (!CExtNameInfo::Duplicate(obj)) + return false; - if (!txt1) - return 1; - if (!txt2) - return -1; + if (!SetArtist(dst->Artist())) + return false; + if (!SetGenre(dst->Genre())) + return false; + if (!SetSongCount(dst->SongCount())) + return false; + if (!SetAlbumId(dst->AlbumId())) + return false; - return strcasecmp(txt1, txt2); + return true; } diff --git a/src/data/category_info.cpp b/src/data/category_info.cpp index 28a9bf7..9270e2d 100644 --- a/src/data/category_info.cpp +++ b/src/data/category_info.cpp @@ -21,191 +21,232 @@ #include "i18n.h" #include "category_info.h" -struct category_info *category_info_create() + +struct SCategoryInfo { + int categoryId; + int albumCount; + int songCount; + Eina_List *albumList; + Eina_List *memberList; + + SCategoryInfo() { + memset(this, 0, sizeof(SCategoryInfo)); + } +}; + + +CCategoryInfo::CListMember *CCategoryInfo::m_MemberDuplicate(CListMember *member) { - struct category_info *catinfo; + CListMember *item; - catinfo = (category_info *)calloc(1, sizeof(*catinfo)); - if (!catinfo) + if (!member) return NULL; - return catinfo; + item = new CListMember; + if (!item) + return NULL; + + item->memberId = member->memberId; + item->mediaId = t_Clone(member->mediaId); + + return item; } -void category_info_destroy(struct category_info *catinfo) + +bool CCategoryInfo::Create(void) { - struct list_member *item; + if (m) + return false; + + m = new SCategoryInfo(); + if (!m) { + _ERR("Mem allocation failed"); + return false; + } + + if (!CExtNameInfo::Create()) { + delete m; + m = NULL; + return false; + } + + return true; +} + + +void CCategoryInfo::Destroy(void) +{ + CListMember *item; void *obj; - if (!catinfo) + if (!m) return; - free((void *)catinfo->name); - free(catinfo->thumb); - eina_list_free(catinfo->albumlist); - if (catinfo->memberlist) { - EINA_LIST_FREE(catinfo->memberlist, obj) { - item = (list_member*)obj; - free(item->media_id); - free(item); + CNameInfo::Destroy(); + + eina_list_free(m->albumList); + if (m->memberList) { + EINA_LIST_FREE(m->memberList, obj) { + item = (CListMember*)obj; + delete item->mediaId; + delete item; } } - free(catinfo); -} -int category_info_get_category_id(struct category_info *ccatinfo) -{ - return ccatinfo->id; + delete m; + m = NULL; } -const char *category_info_get_name(struct category_info *ccatinfo) + +int CCategoryInfo::CategoryId(void) { - if (!ccatinfo) - return NULL; + if (!m) + return 0; - return ccatinfo->name; + return m->categoryId; } -char *category_info_get_thumb(struct category_info *ccatinfo) + +int CCategoryInfo::AlbumCount(void) { - if (!ccatinfo) - return NULL; + if (!m) + return 0; - return ccatinfo->thumb; + return m->albumCount; } -int category_info_get_songcount(struct category_info *ccatinfo) -{ - return ccatinfo->song_count; -} -int category_info_get_albumcount(struct category_info *ccatinfo) +int CCategoryInfo::SongCount(void) { - return ccatinfo->album_count; + if (!m) + return 0; + + return m->songCount; } -Eina_List *category_info_get_albumlist(struct category_info *ccatinfo) + +Eina_List *CCategoryInfo::AlbumList(void) { - if (!ccatinfo) + if (!m) return NULL; - return ccatinfo->albumlist; + return m->albumList; } -Eina_List *category_info_get_memberlist(struct category_info *ccatinfo) + +Eina_List *CCategoryInfo::MemberList(void) { - if (!ccatinfo) + if (!m) return NULL; - return ccatinfo->memberlist; + return m->memberList; } -struct category_info *find_category(Eina_List *list, const char *name) -{ - Eina_List *l; - struct category_info *catinfo; - void *obj; - if (!list || !name) - return NULL; +bool CCategoryInfo::SetCategoryId(int categoryId) +{ + if (!m) + return false; - EINA_LIST_FOREACH(list, l, obj) { - catinfo = (category_info*)obj; - if (!strcmp(catinfo->name, name)) - return catinfo; - } + m->categoryId = categoryId; - return NULL; + return true; } -static struct list_member *member_duplicate(struct list_member *sitem) + +bool CCategoryInfo::SetAlbumCount(int albumCount) { - struct list_member *item; + if (!m) + return false; - if (!sitem) - return NULL; + m->albumCount = albumCount; - item = (list_member *)calloc(1, sizeof(*item)); - if (!item) - return NULL; + return true; +} - item->member_id = sitem->member_id; - if (sitem->media_id) - item->media_id = strdup(sitem->media_id); - return item; +bool CCategoryInfo::SetSongCount(int songCount) +{ + if (!m) + return false; + + m->songCount = songCount; + + return true; } -struct category_info *category_info_duplicate(struct category_info *s_catinfo) + +bool CCategoryInfo::SetAlbumInfo(CAlbumInfo *albumInfo) { - struct category_info *d_catinfo; - struct list_member *item, *it; - void *obj; - Eina_List *l; + if (!m) + return false; - if (!s_catinfo) - return NULL; + m->albumList = eina_list_append(m->albumList, albumInfo); - d_catinfo = (category_info *)calloc(1, sizeof(*d_catinfo)); - if (!d_catinfo) - return NULL; + return true; +} - d_catinfo->id = s_catinfo->id; - d_catinfo->song_count = s_catinfo->song_count; - d_catinfo->album_count = s_catinfo->album_count; - d_catinfo->albumlist = eina_list_clone(s_catinfo->albumlist); - - EINA_LIST_FOREACH(s_catinfo->memberlist, l, obj) { - item = (list_member *)obj; - it = member_duplicate(item); - if (!it) { - category_info_destroy(d_catinfo); - return NULL; - } - d_catinfo->memberlist = eina_list_append(d_catinfo->memberlist, - it); - } - if (s_catinfo->name) - d_catinfo->name = strdup(s_catinfo->name); - if (s_catinfo->thumb) - d_catinfo->thumb = strdup(s_catinfo->thumb); +bool CCategoryInfo::SetMember(CListMember *member) +{ + if (!m) + return false; - return d_catinfo; + m->memberList = eina_list_append(m->memberList, member); + + return true; } -int sortcategorys_za(const void *d1, const void *d2) + +bool CCategoryInfo::Duplicate(CNameInfo *obj) { - struct category_info *catinfo1 = (struct category_info *)d1; - struct category_info *catinfo2 = (struct category_info *)d2; - const char *txt1; - const char *txt2; + if (!m) + return false; - txt1 = category_info_get_name(catinfo1); - txt2 = category_info_get_name(catinfo2); + CCategoryInfo* dst = (CCategoryInfo*)obj; - if (!txt2) - return 1; - if (!txt1) - return -1; + if (!CExtNameInfo::Duplicate(obj)) + return false; + + if (!SetCategoryId(dst->CategoryId())) + return false; + if (!SetAlbumCount(dst->AlbumCount())) + return false; + if (!SetSongCount(dst->SongCount())) + return false; + + m->albumList = eina_list_clone(dst->AlbumList()); + + CListMember *item, *dupItem; + Eina_List *l; + void *listObj; + EINA_LIST_FOREACH(dst->MemberList(), l, listObj) { + item = (CListMember *)listObj; + dupItem = m_MemberDuplicate(item); + if (!dupItem) + return false; + if (!SetMember(dupItem)) + return false; + } - return strcasecmp(txt2, txt1); + return true; } -int sortcategorys_az(const void *d1, const void *d2) + +CCategoryInfo *CCategoryInfo::FindCategory(Eina_List *list, const char *categoryName) { - struct category_info *catinfo1 = (struct category_info *)d1; - struct category_info *catinfo2 = (struct category_info *)d2; - const char *txt1; - const char *txt2; + Eina_List *l; + CCategoryInfo *catinfo; + void *obj; - txt1 = category_info_get_name(catinfo1); - txt2 = category_info_get_name(catinfo2); + if (!list || !categoryName) + return NULL; - if (!txt1) - return 1; - if (!txt2) - return -1; + EINA_LIST_FOREACH(list, l, obj) { + catinfo = (CCategoryInfo*)obj; + if (!strcmp(catinfo->Name(), categoryName)) + return catinfo; + } - return strcasecmp(txt1, txt2); + return NULL; } diff --git a/src/data/folder_info.cpp b/src/data/folder_info.cpp index 3aa3c8d..652e29a 100644 --- a/src/data/folder_info.cpp +++ b/src/data/folder_info.cpp @@ -21,108 +21,103 @@ #include #include "folder_info.h" -struct folder_info *folder_info_create() -{ - struct folder_info *finfo; - - finfo = (folder_info *)calloc(1, sizeof(*finfo)); - if (!finfo) - return NULL; - return finfo; -} +struct SFolderInfo { + int count; + int duration; -void folder_info_destroy(struct folder_info *finfo) -{ - if (!finfo) - return; + SFolderInfo() { + memset(this, 0, sizeof(SFolderInfo)); + } +}; - free(finfo->name); - free(finfo->folder_id); - free(finfo); -} -char *folder_info_get_folder_id(struct folder_info *cfinfo) +bool CFolderInfo::Create(void) { - if (!cfinfo) - return NULL; - - return cfinfo->folder_id; + if (m) + return false; + + m = new SFolderInfo(); + if (!m) { + _ERR("Mem allocation failed"); + return false; + } + + if (!CNameInfo::Create()) { + delete m; + m = NULL; + return false; + } + + return true; } -char *folder_info_get_name(struct folder_info *cfinfo) + +void CFolderInfo::Destroy(void) { - if (!cfinfo) - return NULL; + if (!m) + return; - return cfinfo->name; + CNameInfo::Destroy(); + delete m; + m = NULL; } -int folder_info_get_count(struct folder_info *cfinfo) -{ - return cfinfo->count; -} -int folder_info_get_duration(struct folder_info *cfinfo) +int CFolderInfo::Count(void) { - return cfinfo->duration; + if (!m) + return 0; + + return m->count; } -struct folder_info *folder_info_duplicate(struct folder_info *s_finfo) -{ - struct folder_info *d_finfo; - if (!s_finfo) - return NULL; +int CFolderInfo::Duration(void) +{ + if (!m) + return 0; - d_finfo = (folder_info *)calloc(1, sizeof(*d_finfo)); - if (!d_finfo) - return NULL; + return m->duration; +} - d_finfo->count = s_finfo->count; - d_finfo->duration = s_finfo->duration; - if (s_finfo->name) - d_finfo->name = strdup(s_finfo->name); +bool CFolderInfo::SetCount(int count) +{ + if (!m) + return false; - if (s_finfo->folder_id) - d_finfo->folder_id = strdup(s_finfo->folder_id); + m->count = count; - return d_finfo; + return true; } -int sortfolders_za(const void *d1, const void *d2) -{ - struct folder_info *finfo1 = (struct folder_info *)d1; - struct folder_info *finfo2 = (struct folder_info *)d2; - char *txt1; - char *txt2; - txt1 = folder_info_get_name(finfo1); - txt2 = folder_info_get_name(finfo2); +bool CFolderInfo::SetDuration(int duration) +{ + if (!m) + return false; - if (!txt2) - return 1; - if (!txt1) - return -1; + m->duration = duration; - return strcasecmp(txt2, txt1); + return true; } -int sortfolders_az(const void *d1, const void *d2) + +bool CFolderInfo::Duplicate(CNameInfo *obj) { - struct folder_info *finfo1 = (struct folder_info *)d1; - struct folder_info *finfo2 = (struct folder_info *)d2; - char *txt1; - char *txt2; + if (!m) + return false; + + CFolderInfo* dst = (CFolderInfo*)obj; - txt1 = folder_info_get_name(finfo1); - txt2 = folder_info_get_name(finfo2); + if (!CNameInfo::Duplicate(obj)) + return false; - if (!txt1) - return 1; - if (!txt2) - return -1; + if (!SetCount(dst->Count())) + return false; + if (!SetDuration(dst->Duration())) + return false; - return strcasecmp(txt1, txt2); + return true; } diff --git a/src/data/mediadata.cpp b/src/data/mediadata.cpp index 06565ca..dae7067 100644 --- a/src/data/mediadata.cpp +++ b/src/data/mediadata.cpp @@ -145,8 +145,8 @@ bool CMediadata::sm_CbEachPlaylist(media_playlist_h ph, void *dt) bool CMediadata::sm_CbPlaylistMember(int memb_id, media_info_h mdh, void *dt) { - category_info *catinfo = (category_info *)dt; - list_member *member = NULL; + CCategoryInfo *catinfo = (CCategoryInfo *)dt; + CCategoryInfo::CListMember *member = NULL; char *id = NULL; if (!mdh || !catinfo) @@ -157,21 +157,23 @@ bool CMediadata::sm_CbPlaylistMember(int memb_id, media_info_h mdh, void *dt) return false; } - if (!catinfo->thumb && - media_info_get_thumbnail_path(mdh, &(catinfo->thumb)) != - MEDIA_CONTENT_ERROR_NONE) - _ERR("Media thumbnail path Fetch error"); + char *thumb; + if (!catinfo->ThumbnailPath()) { + if (media_info_get_thumbnail_path(mdh, &thumb) != MEDIA_CONTENT_ERROR_NONE) + _ERR("Media thumbnail path Fetch error"); + catinfo->SetThumbnailPath(thumb); + } - member = (list_member *)calloc(1, sizeof(*member)); + member = new CCategoryInfo::CListMember; if (!member) { free(id); return false; } - member->member_id = memb_id; - member->media_id = id; + member->memberId = memb_id; + member->mediaId = id; - catinfo->memberlist = eina_list_append(catinfo->memberlist, member); + catinfo->SetMember(member); return true; } @@ -325,42 +327,58 @@ bool CMediadata::m_HandleEachMediaData(media_info_h md_h) bool CMediadata::m_HandleEachFolderData(media_folder_h folder_h) { - folder_info *finfo = NULL; + CFolderInfo *finfo = NULL; + char *tmpStr = NULL; + int tmpValue; + bool ret; - finfo = folder_info_create(); + finfo = new CFolderInfo; if (!finfo) return false; - if (media_folder_get_folder_id(folder_h, &(finfo->folder_id)) != + ret = finfo->Create(); + if (!ret) { + delete finfo; + return false; + } + + if (media_folder_get_folder_id(folder_h, &tmpStr) != MEDIA_CONTENT_ERROR_NONE) { _ERR("Folder ID Fetch error"); - folder_info_destroy(finfo); + finfo->Destroy(); + delete finfo; return false; } + finfo->SetId(tmpStr); - if (media_folder_get_media_count_from_db(finfo->folder_id, - m->filter, &(finfo->count)) != + if (media_folder_get_media_count_from_db(finfo->Id(), + m->filter, &tmpValue) != MEDIA_CONTENT_ERROR_NONE) { _ERR("Folder media count Fetch error"); - folder_info_destroy(finfo); + finfo->Destroy(); + delete finfo; return false; } + finfo->SetCount(tmpValue); - finfo->duration = 0; - if (media_folder_foreach_media_from_db(finfo->folder_id, m->filter, - sm_CbTotalDuration, &(finfo->duration)) != + if (media_folder_foreach_media_from_db(finfo->Id(), m->filter, + sm_CbTotalDuration, &tmpValue) != MEDIA_CONTENT_ERROR_NONE) { _ERR("Folder media count Fetch error"); - folder_info_destroy(finfo); + finfo->Destroy(); + delete finfo; return false; } + finfo->SetDuration(tmpValue); - if (media_folder_get_name(folder_h, &(finfo->name)) != + if (media_folder_get_name(folder_h, &tmpStr) != MEDIA_CONTENT_ERROR_NONE) { _ERR("folder name Fetch error"); - folder_info_destroy(finfo); + finfo->Destroy(); + delete finfo; return false; } + finfo->SetName(tmpStr); m->folderlist = eina_list_append(m->folderlist, finfo); return true; @@ -369,41 +387,58 @@ bool CMediadata::m_HandleEachFolderData(media_folder_h folder_h) bool CMediadata::m_HandleEachAlbumData(media_album_h album_h) { - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; CSongInfo *sinfo = NULL; void *obj = NULL; - char *genre = NULL; - char *tpath = NULL; + char *tmpStr = NULL; + int tmpValue; Eina_List *l = NULL; + bool ret; - alinfo = album_info_create(); + alinfo = new CAlbumInfo; if (!alinfo) return false; - if (media_album_get_album_id(album_h, &(alinfo->album_id)) != + ret = alinfo->Create(); + if (!ret) { + delete alinfo; + return false; + } + + if (media_album_get_album_id(album_h, &tmpValue) != MEDIA_CONTENT_ERROR_NONE) { _ERR("Album ID Fetch error"); - album_info_destroy(alinfo); + alinfo->Destroy(); + delete alinfo; return false; } + alinfo->SetAlbumId(tmpValue); - if (media_album_get_name(album_h, &(alinfo->name)) != + if (media_album_get_name(album_h, &tmpStr) != MEDIA_CONTENT_ERROR_NONE) { _ERR("Album name Fetch error"); - album_info_destroy(alinfo); + alinfo->Destroy(); + delete alinfo; return false; } + alinfo->SetName(tmpStr); - if (media_album_get_artist(album_h, &(alinfo->artist)) != + if (media_album_get_artist(album_h, &tmpStr) != MEDIA_CONTENT_ERROR_NONE) { _ERR("Album artist Fetch error"); - album_info_destroy(alinfo); + alinfo->Destroy(); + delete alinfo; return false; } + alinfo->SetArtist(tmpStr); - alinfo->song_count = 0; - if (media_album_get_media_count_from_db(alinfo->album_id, m->filter, &(alinfo->song_count))) + if (media_album_get_media_count_from_db(alinfo->AlbumId(), m->filter, &tmpValue)) { _ERR("Album artist Fetch error"); + alinfo->Destroy(); + delete alinfo; + return false; + } + alinfo->SetSongCount(tmpValue); if (m->album_songlist) m_DeleteAlbumSongList(); @@ -412,18 +447,18 @@ bool CMediadata::m_HandleEachAlbumData(media_album_h album_h) EINA_LIST_FOREACH(m->album_songlist, l, obj) { sinfo = (CSongInfo *)obj; - genre = sinfo->Genre(); - if (genre) { - alinfo->genre = strdup(genre); + tmpStr = sinfo->Genre(); + if (tmpStr) { + alinfo->SetGenre(tmpStr); break; } } EINA_LIST_FOREACH(m->album_songlist, l, obj) { sinfo = (CSongInfo *)obj; - tpath = sinfo->ThumbnailPath(); - if (tpath) { - alinfo->thumbnail_path = strdup(tpath); + tmpStr = sinfo->ThumbnailPath(); + if (tmpStr) { + alinfo->SetThumbnailPath(tmpStr); break; } } @@ -435,41 +470,50 @@ bool CMediadata::m_HandleEachAlbumData(media_album_h album_h) bool CMediadata::m_HandleEachPlaylist(media_playlist_h ph) { - category_info *catinfo = NULL; + CCategoryInfo *catinfo = NULL; + char *tmpStr; + int tmpValue; if (!ph) return false; - catinfo = (category_info *)calloc(1, sizeof(*catinfo)); + catinfo = new CCategoryInfo; if (!catinfo) return false; - if (media_playlist_get_name(ph, (char **)&(catinfo->name)) != + if (media_playlist_get_name(ph, &tmpStr) != MEDIA_CONTENT_ERROR_NONE) { _ERR(" Failed to read playlist name "); - category_info_destroy(catinfo); + catinfo->Destroy(); + delete catinfo; return false; } + catinfo->SetName(tmpStr); - if (media_playlist_get_playlist_id(ph, &(catinfo->id)) != + if (media_playlist_get_playlist_id(ph, &tmpValue) != MEDIA_CONTENT_ERROR_NONE) { _ERR(" Failed to read playlist name "); - category_info_destroy(catinfo); + catinfo->Destroy(); + delete catinfo; return false; } + catinfo->SetCategoryId(tmpValue); - if (media_playlist_get_media_count_from_db(catinfo->id, NULL, - &(catinfo->song_count)) != MEDIA_CONTENT_ERROR_NONE) { + if (media_playlist_get_media_count_from_db(catinfo->CategoryId(), NULL, + &tmpValue) != MEDIA_CONTENT_ERROR_NONE) { _ERR(" Failed to read playlist name "); - category_info_destroy(catinfo); + catinfo->Destroy(); + delete catinfo; return false; } + catinfo->SetSongCount(tmpValue); - if (media_playlist_foreach_media_from_db(catinfo->id, NULL, + if (media_playlist_foreach_media_from_db(catinfo->CategoryId(), NULL, sm_CbPlaylistMember, (void *)catinfo) != MEDIA_CONTENT_ERROR_NONE) { _ERR(" Failed to read playlist members "); - category_info_destroy(catinfo); + catinfo->Destroy(); + delete catinfo; return false; } @@ -541,12 +585,13 @@ void CMediadata::m_DeletePlaylistSongList(void) void CMediadata::m_DeleteFolderList(void) { - folder_info *finfo = NULL; + CFolderInfo *finfo = NULL; void *obj = NULL; EINA_LIST_FREE(m->folderlist, obj) { - finfo = (folder_info *)obj; - folder_info_destroy(finfo); + finfo = (CFolderInfo *)obj; + finfo->Destroy(); + delete finfo; } m->folderlist = NULL; @@ -555,12 +600,13 @@ void CMediadata::m_DeleteFolderList(void) void CMediadata::m_DeleteAlbumList(void) { - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; void *obj = NULL; EINA_LIST_FREE(m->albumlist, obj) { - alinfo = (album_info *)obj; - album_info_destroy(alinfo); + alinfo = (CAlbumInfo *)obj; + alinfo->Destroy(); + delete alinfo; } m->albumlist = NULL; @@ -569,29 +615,31 @@ void CMediadata::m_DeleteAlbumList(void) void CMediadata::m_DeleteCategoryList(ECategoryType type) { - category_info *catinfo = NULL; + CCategoryInfo *catinfo = NULL; void *obj = NULL; if (type == CAT_TYPE_ARTIST) { EINA_LIST_FREE(m->artistlist, obj) { - catinfo = (category_info *)obj; - category_info_destroy(catinfo); + catinfo = (CCategoryInfo *)obj; + catinfo->Destroy(); + delete catinfo; } m->artistlist = NULL; } else if (type == CAT_TYPE_GENRE) { EINA_LIST_FREE(m->genrelist, obj) { - catinfo = (category_info *)obj; - category_info_destroy(catinfo); + catinfo = (CCategoryInfo *)obj; + catinfo->Destroy(); + delete catinfo; } m->genrelist = NULL; } else if (type == CAT_TYPE_PLAYLISTS) { EINA_LIST_FREE(m->playlistslist, obj) { - catinfo = (category_info *)obj; - category_info_destroy(catinfo); + catinfo = (CCategoryInfo *)obj; + catinfo->Destroy(); } m->playlistslist = NULL; @@ -660,91 +708,92 @@ int CMediadata::m_GetPlaylistList(void) void CMediadata::m_GetCategoryList(ECategoryType type) { - album_info *alinfo = NULL; - category_info *catinfo = NULL; + CAlbumInfo *alinfo = NULL; + CCategoryInfo *catinfo = NULL; void *obj = NULL; Eina_List *l = NULL; int count; + bool ret; if (!m->albumlist) return; count = 0; EINA_LIST_FOREACH(m->albumlist, l, obj) { - alinfo = (album_info *)obj; + alinfo = (CAlbumInfo *)obj; if (type == CAT_TYPE_ARTIST) - catinfo = find_category(m->artistlist, - alinfo->artist); + catinfo = CCategoryInfo::FindCategory(m->artistlist, alinfo->Artist()); else - catinfo = find_category(m->genrelist, - alinfo->genre); + catinfo = CCategoryInfo::FindCategory(m->genrelist, alinfo->Genre()); if (!catinfo) { - catinfo = category_info_create(); - if (!catinfo) + catinfo = new CCategoryInfo(); + + ret = catinfo->Create(); + if (!ret) { + delete catinfo; continue; + } - catinfo->id = ++count; - catinfo->album_count = 1; - catinfo->song_count = alinfo->song_count; + catinfo->SetCategoryId(++count); + catinfo->SetAlbumCount(1); + catinfo->SetSongCount(alinfo->SongCount()); if (type == CAT_TYPE_ARTIST) { - if (alinfo->artist) - catinfo->name = strdup(alinfo->artist); + if (alinfo->Artist()) + catinfo->SetName(alinfo->Artist()); else - catinfo->name = strdup( - _(MUSIC_STR_UNKNOWN)); + catinfo->SetName(_(MUSIC_STR_UNKNOWN)); m->artistlist = eina_list_append( m->artistlist, catinfo); } else { - if (alinfo->artist) - catinfo->name = strdup(alinfo->genre); + if (alinfo->Genre()) + catinfo->SetName(alinfo->Genre()); else - catinfo->name = strdup( - _(MUSIC_STR_UNKNOWN)); + catinfo->SetName(_(MUSIC_STR_UNKNOWN)); m->genrelist = eina_list_append( m->genrelist, catinfo); } } else { - catinfo->album_count += 1; - catinfo->song_count += alinfo->song_count; + catinfo->SetAlbumCount(catinfo->AlbumCount() + 1); + catinfo->SetSongCount(catinfo->SongCount() + alinfo->SongCount()); } - catinfo->albumlist = eina_list_append(catinfo->albumlist, - alinfo); + + catinfo->SetAlbumInfo(alinfo); } } -int CMediadata::m_GetPlaylistSongList(category_info *catinfo) +int CMediadata::m_GetPlaylistSongList(CCategoryInfo *catinfo) { media_info_h mdh; Eina_List *l = NULL; - list_member *member = NULL; + CCategoryInfo::CListMember *member = NULL; void *obj = NULL; int r; - if (!catinfo || !catinfo->memberlist) { + if (!catinfo || !catinfo->MemberList()) { _ERR(" Invalid argument "); return false; } m->slist_type = E_PLAYLIST_SONGS; - EINA_LIST_FOREACH(catinfo->memberlist, l, obj) { - member = (list_member *)obj; - if (!member->media_id) + EINA_LIST_FOREACH(catinfo->MemberList(), l, obj) { + member = (CCategoryInfo::CListMember *)obj; + if (!member->mediaId) continue; - r = media_info_get_media_from_db(member->media_id, &mdh); + r = media_info_get_media_from_db(member->mediaId, &mdh); if (r != MEDIA_CONTENT_ERROR_NONE) { _ERR("unable to get handle from id"); continue; } - m->member_id = member->member_id; + m->member_id = member->memberId; if (!m_HandleEachMediaData(mdh)) _ERR("unable to get media data"); } @@ -753,12 +802,12 @@ int CMediadata::m_GetPlaylistSongList(category_info *catinfo) } -int CMediadata::m_GetFolderSongList(folder_info *finfo) +int CMediadata::m_GetFolderSongList(CFolderInfo *finfo) { char *id = NULL; int r; - id = folder_info_get_folder_id(finfo); + id = finfo->Id(); m->slist_type = E_FOLDER_SONGS; r = media_folder_foreach_media_from_db(id, m->filter, @@ -787,12 +836,12 @@ int CMediadata::m_GetFolderList(void) } -int CMediadata::m_GetAlbumSongList(album_info *alinfo) +int CMediadata::m_GetAlbumSongList(CAlbumInfo *alinfo) { int id; int r; - id = album_info_get_album_id(alinfo); + id = alinfo->AlbumId(); m->slist_type = E_ALBUM_SONGS; r = media_album_foreach_media_from_db(id, m->filter, @@ -997,7 +1046,7 @@ Eina_List *CMediadata::Medialist(int source_type, int EListType, void *info) case LIST_TYPE_ALBUM_SONG: if (m->album_songlist) m_DeleteAlbumSongList(); - m_GetAlbumSongList((album_info *)info); + m_GetAlbumSongList((CAlbumInfo *)info); return m->album_songlist; case LIST_TYPE_FOLDER: @@ -1006,7 +1055,7 @@ Eina_List *CMediadata::Medialist(int source_type, int EListType, void *info) case LIST_TYPE_FOLDER_SONG: if (m->folder_songlist) m_DeleteFolderSongList(); - m_GetFolderSongList((folder_info *)info); + m_GetFolderSongList((CFolderInfo *)info); return m->folder_songlist; case LIST_TYPE_ARTIST: @@ -1024,7 +1073,7 @@ Eina_List *CMediadata::Medialist(int source_type, int EListType, void *info) case LIST_TYPE_PLAYLISTS_SONG: if (m->playlist_songlist) m_DeletePlaylistSongList(); - m_GetPlaylistSongList((category_info *)info); + m_GetPlaylistSongList((CCategoryInfo *)info); return m->playlist_songlist; default: @@ -1169,7 +1218,7 @@ bool CMediadata::ExistPlaylist(const char *name) return false; Eina_List *l; - struct category_info *catinfo; + CCategoryInfo *catinfo; void *obj; if (!name) @@ -1179,8 +1228,8 @@ bool CMediadata::ExistPlaylist(const char *name) return false; EINA_LIST_FOREACH(m->playlistslist, l, obj) { - catinfo = (category_info *)obj; - if (catinfo->name && !strcmp(catinfo->name, name)) + catinfo = (CCategoryInfo *)obj; + if (catinfo->Name() && !strcmp(catinfo->Name(), name)) return true; } diff --git a/src/data/song_info.cpp b/src/data/song_info.cpp index e239433..8dc4b91 100644 --- a/src/data/song_info.cpp +++ b/src/data/song_info.cpp @@ -31,6 +31,10 @@ struct SSongInfo { int type; int duration; int memberId; // if it is member of any playlist + + SSongInfo() { + memset(this, 0, sizeof(SSongInfo)); + } }; diff --git a/src/main.cpp b/src/main.cpp index 8110ca4..5d4f66c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,6 +20,7 @@ #include #include #include "song_info.h" +#include "album_info.h" #include "music-controller.h" #include "define.h" #include "BaseApp.h" diff --git a/src/playback/music-controller.cpp b/src/playback/music-controller.cpp index b156eab..f926be7 100644 --- a/src/playback/music-controller.cpp +++ b/src/playback/music-controller.cpp @@ -21,6 +21,8 @@ #include "i18n.h" #include "song_info.h" #include "album_info.h" +#include "folder_info.h" +#include "category_info.h" #include "music-controller.h" #include "playlist-mgr.h" #include "playback-mgr.h" @@ -31,9 +33,9 @@ struct SMusicController { CPlayback* pPlayback; - CPlaylist* pPlaylist; + CPlaylist* pPlaylist; CMediadata* pMediadata; - album_info *alinfo; + CAlbumInfo *alinfo; Eina_List *elListener; int initial_index; int playstate; @@ -215,10 +217,18 @@ SMusicController *CMusicController::t_Create(void) mhandle->initial_index = 0; mhandle->sort_type = E_SORT_TITLE_A_Z; mhandle->source_type = SOURCE_TYPE_ALL; - mhandle->alinfo = NULL; + mhandle->alinfo = new CAlbumInfo; + + if (!mhandle->alinfo->Create()) { + _ERR(" mediadata create failed "); + delete mhandle; + return NULL; + } if (!mhandle->pMediadata->Create()) { _ERR(" mediadata create failed "); + mhandle->alinfo->Destroy(); + delete mhandle->alinfo; delete mhandle; return NULL; } @@ -283,10 +293,8 @@ void CMusicController::t_Destroy(void) m->pMediadata->RemoveCallback(m->cbinfo); m->pMediadata->Destroy(); - if (m->alinfo) { - album_info_destroy(m->alinfo); - m->alinfo = NULL; - } + m->alinfo->Destroy(); + delete m->alinfo; EINA_LIST_FREE(m->elListener, obj) { cbinfo = (SCbInfo *)obj; @@ -836,7 +844,7 @@ bool CMusicController::SetCurrentSong(char *mediaid) } -struct album_info *CMusicController::CurrentAlbum(void) +CAlbumInfo *CMusicController::CurrentAlbum(void) { if (!m) return NULL; @@ -845,17 +853,20 @@ struct album_info *CMusicController::CurrentAlbum(void) } -bool CMusicController::SetCurrentAlbum(struct album_info *alinfo) +bool CMusicController::SetCurrentAlbum(CAlbumInfo *alinfo) { if (!m) return false; - if (m->alinfo) - album_info_destroy(m->alinfo); - - m->alinfo = NULL; if (alinfo) - m->alinfo = album_info_duplicate(alinfo); + m->alinfo->Duplicate(alinfo); + else { + CAlbumInfo *emptyInfo = new CAlbumInfo; + emptyInfo->Create(); + m->alinfo->Duplicate(emptyInfo); + emptyInfo->Destroy(); + delete emptyInfo; + } return true; } diff --git a/src/views/album-layout.cpp b/src/views/album-layout.cpp index 7f4a613..11e40f7 100644 --- a/src/views/album-layout.cpp +++ b/src/views/album-layout.cpp @@ -17,8 +17,10 @@ #include #include #include -#include "AppCommon.h" -#include "InputHandler.h" +#include +#include +#include +#include #include "dbg.h" #include "i18n.h" #include "define.h" @@ -46,7 +48,7 @@ enum EObjectType { }; struct SAlbumItemInfo { - album_info *alinfo; + CAlbumInfo *alinfo; Elm_Object_Item *item; }; @@ -84,7 +86,7 @@ struct SAlbumLayout { char *CAlbumLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part) { SAlbumItemInfo *itinfo = (SAlbumItemInfo *)data; - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; char *txt = NULL; if (!itinfo || !obj) @@ -94,9 +96,9 @@ char *CAlbumLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const cha txt = NULL; if (!strcmp(part, "elm.text")) - txt = album_info_get_name(alinfo); + txt = alinfo->Name(); else if (!strcmp(part, "elm.text1")) - txt = album_info_get_artist(alinfo); + txt = alinfo->Artist(); if (txt) return strdup(txt); @@ -108,7 +110,7 @@ char *CAlbumLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const cha Evas_Object *CAlbumLayout::sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part) { SAlbumItemInfo *itinfo = (SAlbumItemInfo *)data; - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; char *path = NULL; Evas_Object *img = NULL; char buf[MAX_LENGTH]; @@ -123,7 +125,7 @@ Evas_Object *CAlbumLayout::sm_CbGetGridItemContent(void *data, Evas_Object *obj, if (!img) return NULL; - path = album_info_get_thumb(alinfo); + path = alinfo->ThumbnailPath(); if (!path) { snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, MUSIC_IMAGE_DEFAULT_THUMB_126); @@ -267,7 +269,7 @@ SAlbumItemInfo *CAlbumLayout::m_FindItemInfoById(Eina_List *list, int alid) itinfo = (SAlbumItemInfo *)obj; if (!itinfo->alinfo) continue; - id = album_info_get_album_id(itinfo->alinfo); + id = itinfo->alinfo->AlbumId(); if (alid == id) { return itinfo; } @@ -355,22 +357,22 @@ void CAlbumLayout::m_EmptyAlbumGrid(bool sort_flag) void CAlbumLayout::m_SortAlbumGrid(void) { - int(*_sort_fn[])(const void *d1, const void *d2) = { - sortalbums_az, - sortalbums_za + int sortType; + const char *sortFuncId[] = { + SORT_BY_NAME_AZ, + SORT_BY_NAME_ZA, }; - int sort_type; - sort_type = m->mhandle->SortType(); + sortType = m->mhandle->SortType(); - m->alblist = eina_list_sort(m->alblist, 0, _sort_fn[sort_type]); + m->alblist = CSort::Sort(m->alblist, sortFuncId[sortType]); } void CAlbumLayout::m_UpdateAlbumGrid(bool sort_flag) { bool r; - album_info *alinfo; + CAlbumInfo *alinfo; void *obj; Eina_List *l; SAlbumItemInfo *itinfo; @@ -392,7 +394,7 @@ void CAlbumLayout::m_UpdateAlbumGrid(bool sort_flag) m_SortAlbumGrid(); EINA_LIST_FOREACH(m->alblist, l, obj) { - alinfo = (album_info *)obj; + alinfo = (CAlbumInfo *)obj; itinfo = (SAlbumItemInfo *)calloc(1, sizeof(*itinfo)); if (!itinfo) return; @@ -559,7 +561,7 @@ void CAlbumLayout::Update(bool focusFlag) { ASSERT(m); - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; SAlbumItemInfo *itinfo = NULL; int id; @@ -570,7 +572,7 @@ void CAlbumLayout::Update(bool focusFlag) alinfo = m->mhandle->CurrentAlbum(); if (alinfo) { - id = album_info_get_album_id(alinfo); + id = alinfo->AlbumId(); itinfo = m_FindItemInfoById(m->it_infolist, id); if (itinfo) { m->mhandle->SetCurrentAlbum(NULL); diff --git a/src/views/album-songs-layout.cpp b/src/views/album-songs-layout.cpp index c332053..2c617aa 100644 --- a/src/views/album-songs-layout.cpp +++ b/src/views/album-songs-layout.cpp @@ -250,7 +250,7 @@ void CAlbumSongsLayout::m_UpdateSongList(void) SAlbumSongsItemInfo *itinfo = NULL; Elm_Object_Item *item = NULL; int dur = 0; - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; if (!m->songlist || !m->item_class) return; @@ -361,7 +361,7 @@ void CAlbumSongsLayout::m_CreateTopSection(void) Evas_Object *img = NULL; char *path = NULL; char buf[MAX_LENGTH]; - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; SBtnInfo btninfo[TOTAL_ADD_BTNS]; Evas_Object *layout = Layout(); @@ -417,7 +417,7 @@ void CAlbumSongsLayout::m_CreateTopSection(void) if (!alinfo) return; - path = album_info_get_thumb(alinfo); + path = alinfo->ThumbnailPath(); if (path) { elm_image_file_set(thumb, path, NULL); elm_image_aspect_fixed_set(thumb, EINA_FALSE); @@ -432,9 +432,9 @@ void CAlbumSongsLayout::m_CreateTopSection(void) elm_object_part_content_set(layout, MUSIC_PART_ALBUM_THUMB, thumb); elm_object_part_text_set(layout, MUSIC_PART_ALBUM_NAME, - album_info_get_name(alinfo)); + alinfo->Name()); elm_object_part_text_set(layout, MUSIC_PART_ALBUM_ARTIST, - album_info_get_artist(alinfo)); + alinfo->Artist()); snprintf(buf, sizeof(buf), "%d", eina_list_count(m->slist)); elm_object_part_text_set(layout, MUSIC_PART_ALBUM_SONGCOUNT, buf); diff --git a/src/views/artist-layout.cpp b/src/views/artist-layout.cpp index 71ba47c..745bd46 100644 --- a/src/views/artist-layout.cpp +++ b/src/views/artist-layout.cpp @@ -46,16 +46,22 @@ struct SArtistLayout { void CArtistLayout::t_HandleItemSelect(SCatItemInfo *itinfo) { int count; - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; Eina_List *alist = NULL; if (!itinfo) return; - t.c_catinfo = category_info_duplicate(itinfo->catinfo); + if (!t.c_catinfo) + t.c_catinfo = new CCategoryInfo; + + if (!t.c_catinfo->FlagCreate()) + t.c_catinfo->Create(); + + t.c_catinfo->Duplicate(itinfo->catinfo); count = 0; - alist = category_info_get_albumlist(t.c_catinfo); + alist = t.c_catinfo->AlbumList(); if (alist) count = eina_list_count(alist); @@ -65,12 +71,14 @@ void CArtistLayout::t_HandleItemSelect(SCatItemInfo *itinfo) t.depth = E_DEPTH_ALBUM; if (count == 1) { t.depth = E_DEPTH_SONG; - if (t.c_alinfo) { - album_info_destroy(t.c_alinfo); - t.c_alinfo = NULL; - } - alinfo = (album_info *)eina_list_nth(t.c_catinfo->albumlist, 0); - t.c_alinfo = album_info_duplicate(alinfo); + if (!t.c_alinfo) + t.c_alinfo = new CAlbumInfo; + + if (!t.c_alinfo->FlagCreate()) + t.c_alinfo->Create(); + + alinfo = (CAlbumInfo *)eina_list_nth(t.c_catinfo->AlbumList(), 0); + t.c_alinfo->Duplicate(alinfo); } } diff --git a/src/views/base-view.cpp b/src/views/base-view.cpp index 804a2e3..ba0e528 100644 --- a/src/views/base-view.cpp +++ b/src/views/base-view.cpp @@ -24,6 +24,8 @@ #include "AppCommon.h" #include "song_info.h" +#include "album_info.h" +#include "folder_info.h" #include "category_info.h" #include "music-controller.h" #include "LayoutMgr.h" diff --git a/src/views/category-layout.cpp b/src/views/category-layout.cpp index 0b30cae..f7101ec 100644 --- a/src/views/category-layout.cpp +++ b/src/views/category-layout.cpp @@ -23,6 +23,8 @@ #include "define.h" #include +#include +#include #include "category_info.h" #include "album_info.h" #include "song_info.h" @@ -389,7 +391,7 @@ void CCategoryLayout::t_OnCtxtUpdate(enum EActionType type, int lid) Eina_List *list = NULL; Eina_List *alist = NULL, *slist = NULL, *l = NULL, *sl = NULL; CSongInfo *sinfo = NULL; - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; void *obj = NULL; EAddType mode; @@ -411,9 +413,9 @@ void CCategoryLayout::t_OnCtxtUpdate(enum EActionType type, int lid) sinfo = (CSongInfo *)eina_list_data_get(list); } else { - alist = category_info_get_albumlist((category_info *)t.ctxtinfo->context); + alist = ((CCategoryInfo *)t.ctxtinfo->context)->AlbumList(); EINA_LIST_FOREACH(alist, l, obj) { - alinfo = (album_info *)obj; + alinfo = (CAlbumInfo *)obj; slist = NULL; if (!m->pMusicController->MediaGetList(LIST_TYPE_ALBUM_SONG, (void *)alinfo, &slist)) { _ERR(" Failed to get album songlist "); @@ -499,7 +501,7 @@ char *CCategoryLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const if (itinfo->type == CAT_TYPE_PLAYLIST_NEW) return strdup(_(MUSIC_TEXT_CREATE_PLAYLIST)); - txt = category_info_get_name(itinfo->catinfo); + txt = itinfo->catinfo->Name(); if (txt) return strdup(txt); } @@ -508,12 +510,12 @@ char *CCategoryLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const return NULL; } else if (itinfo->type == CAT_TYPE_PLAYLISTS) { - scount = category_info_get_songcount(itinfo->catinfo); + scount = itinfo->catinfo->SongCount(); snprintf(buf, sizeof(buf), "%d %s", scount, _("Songs")); } else { - acount = category_info_get_albumcount(itinfo->catinfo); - scount = category_info_get_songcount(itinfo->catinfo); + acount = itinfo->catinfo->AlbumCount(); + scount = itinfo->catinfo->SongCount(); snprintf(buf, sizeof(buf), "%d %s, %d %s", acount, _("Albums"), scount, _("Songs")); } @@ -527,7 +529,7 @@ char *CCategoryLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *CCategoryLayout::sm_CbGetGridAlbumItemText(void *data, Evas_Object *obj, const char *part) { SCatItemInfo *itinfo = (SCatItemInfo *)data; - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; char *txt = NULL; if (!itinfo || !obj || !part) @@ -536,15 +538,15 @@ char *CCategoryLayout::sm_CbGetGridAlbumItemText(void *data, Evas_Object *obj, c alinfo = itinfo->alinfo; if (!strcmp(part, "elm.text")) { - txt = album_info_get_name(alinfo); + txt = alinfo->Name(); if (txt) return strdup(txt); } else if (!strcmp(part, "elm.text1")) { if (itinfo->type == CAT_TYPE_ARTIST) - txt = album_info_get_artist(alinfo); + txt = alinfo->Artist(); else - txt = album_info_get_genre(alinfo); + txt = alinfo->Genre(); if (txt) return strdup(txt); } @@ -556,7 +558,7 @@ char *CCategoryLayout::sm_CbGetGridAlbumItemText(void *data, Evas_Object *obj, c Evas_Object *CCategoryLayout::sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part) { SCatItemInfo *itinfo = (SCatItemInfo *)data; - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; void *list_obj = NULL; Eina_List *l = NULL, *alist = NULL; Evas_Object *img = NULL; @@ -579,18 +581,18 @@ Evas_Object *CCategoryLayout::sm_CbGetGridItemContent(void *data, Evas_Object *o path = NULL; if (itinfo->type == CAT_TYPE_ARTIST || itinfo->type == CAT_TYPE_GENRE) { - alist = category_info_get_albumlist(itinfo->catinfo); + alist = itinfo->catinfo->AlbumList(); if (alist) { EINA_LIST_FOREACH(alist, l, list_obj) { - alinfo = (album_info *)list_obj; - path = album_info_get_thumb(alinfo); + alinfo = (CAlbumInfo *)list_obj; + path = alinfo->ThumbnailPath(); if (path) break; } } } else if (itinfo->type == CAT_TYPE_PLAYLISTS) { - path = category_info_get_thumb(itinfo->catinfo); + path = itinfo->catinfo->ThumbnailPath(); } if (!path) { @@ -615,7 +617,7 @@ Evas_Object *CCategoryLayout::sm_CbGetGridItemContent(void *data, Evas_Object *o Evas_Object *CCategoryLayout::sm_CbGetGridAlbumitemContent(void *data, Evas_Object *obj, const char *part) { SCatItemInfo *itinfo = (SCatItemInfo *)data; - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; char *path = NULL; Evas_Object *img = NULL; char buf[MAX_LENGTH]; @@ -632,7 +634,7 @@ Evas_Object *CCategoryLayout::sm_CbGetGridAlbumitemContent(void *data, Evas_Obje if (!img) return NULL; - path = album_info_get_thumb(alinfo); + path = alinfo->ThumbnailPath(); if (!path) { snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, MUSIC_IMAGE_DEFAULT_THUMB_126); @@ -673,18 +675,22 @@ void CCategoryLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, } if (t.depth == E_DEPTH_ALBUM) { - if (t.c_alinfo) { - album_info_destroy(t.c_alinfo); - t.c_alinfo = NULL; + if (!t.c_alinfo) { + t.c_alinfo = new CAlbumInfo; } - t.c_alinfo = album_info_duplicate(itinfo->alinfo); + + if (!t.c_alinfo->FlagCreate()) { + t.c_alinfo->Create(); + } + t.c_alinfo->Duplicate(itinfo->alinfo); t.depth = E_DEPTH_SONG; } else { - if (t.c_catinfo) { - category_info_destroy(t.c_catinfo); - t.c_catinfo = NULL; - } + if (t.c_catinfo && t.c_catinfo->FlagCreate()) + t.c_catinfo->Destroy(); + + delete t.c_catinfo; + t.c_catinfo = NULL; t_HandleItemSelect(itinfo); } @@ -728,8 +734,8 @@ Elm_Object_Item *CCategoryLayout::m_FindItemByInfo(Eina_List *list, void *info) if (!itinfo->catinfo) continue; - id = category_info_get_category_id(itinfo->catinfo); - if (id == category_info_get_category_id((category_info *)info)) + id = itinfo->catinfo->CategoryId(); + if (id == ((CCategoryInfo *)info)->CategoryId()) return itinfo->item; } @@ -819,10 +825,10 @@ void CCategoryLayout::m_AddSelectedSongs(void) Eina_List *idlist = NULL; int lid; - if (!t.c_catinfo) + if (!t.c_catinfo || !t.c_catinfo->FlagCreate()) return; - lid = category_info_get_category_id(t.c_catinfo); + lid = t.c_catinfo->CategoryId(); idlist = m_GetSelectedList(m->it_infolist, (int)ID_TYPE_MEDIA); if (!lid || !idlist) @@ -843,10 +849,10 @@ void CCategoryLayout::m_RemoveSelectedSongs(void) Eina_List *idlist = NULL; int lid; - if (!t.c_catinfo) + if (!t.c_catinfo || !t.c_catinfo->FlagCreate()) return; - lid = category_info_get_category_id(t.c_catinfo); + lid = t.c_catinfo->CategoryId(); idlist = m_GetSelectedList(m->it_infolist, (int)ID_TYPE_MEMBER); if (!lid || !idlist) @@ -971,7 +977,7 @@ void CCategoryLayout::m_AddCategoryItem(Elm_Gengrid_Item_Class *grid_item, ECate if (!itinfo) return; - itinfo->catinfo = (category_info *)info; + itinfo->catinfo = (CCategoryInfo *)info; itinfo->type = type; item = elm_gengrid_item_append(t.grid, grid_item, itinfo, NULL, m); @@ -1108,9 +1114,9 @@ void CCategoryLayout::m_CreateSongsTopSection(void) return; if (t.depth == E_DEPTH_SHOW_LIST) - path = category_info_get_thumb(t.c_catinfo); + path = t.c_catinfo->ThumbnailPath(); else - path = album_info_get_thumb(t.c_alinfo); + path = t.c_alinfo->ThumbnailPath(); if (path) { elm_image_file_set(m->albumCover, path, NULL); @@ -1126,16 +1132,16 @@ void CCategoryLayout::m_CreateSongsTopSection(void) if (t.depth == E_DEPTH_SHOW_LIST) { elm_object_part_text_set(Layout(), MUSIC_PART_ALBUM_NAME, - category_info_get_name(t.c_catinfo)); + t.c_catinfo->Name()); } else { elm_object_part_text_set(Layout(), MUSIC_PART_CATEGORY_NAME, - category_info_get_name(t.c_catinfo)); + t.c_catinfo->Name()); elm_object_part_text_set(Layout(), MUSIC_PART_ALBUM_NAME, - album_info_get_name(t.c_alinfo)); + t.c_alinfo->Name()); elm_object_part_text_set(Layout(), MUSIC_PART_ALBUM_ARTIST, - album_info_get_artist(t.c_alinfo)); + t.c_alinfo->Artist()); } snprintf(buf, sizeof(buf), "%d %s", @@ -1233,7 +1239,7 @@ void CCategoryLayout::m_CreateSongList(void) void CCategoryLayout::m_CreateAlbumgrid(void) { - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; void *obj = NULL; Eina_List *l = NULL; SCatItemInfo *itinfo = NULL; @@ -1257,7 +1263,7 @@ void CCategoryLayout::m_CreateAlbumgrid(void) grid_item->func.state_get = NULL; grid_item->func.del = sm_CbRemoveGridItem; - m->alblist = category_info_get_albumlist(t.c_catinfo); + m->alblist = t.c_catinfo->AlbumList(); if (!m->alblist || eina_list_count(m->alblist) == 0) { _ERR(" Fetching album list failed "); evas_object_del(t.grid); @@ -1266,7 +1272,7 @@ void CCategoryLayout::m_CreateAlbumgrid(void) } EINA_LIST_FOREACH(m->alblist, l, obj) { - alinfo = (album_info *)obj; + alinfo = (CAlbumInfo *)obj; itinfo = (SCatItemInfo *)calloc(1, sizeof(*itinfo)); if (!itinfo) return; @@ -1281,13 +1287,13 @@ void CCategoryLayout::m_CreateAlbumgrid(void) elm_object_part_text_set(Layout(), MUSIC_PART_CATEGORY_NAME, - category_info_get_name(t.c_catinfo)); + t.c_catinfo->Name()); snprintf(buf, sizeof(buf), "%d", - category_info_get_albumcount(t.c_catinfo)); + t.c_catinfo->AlbumCount()); elm_object_part_text_set(Layout(), MUSIC_PART_CATEGORY_ALBUMCOUNT, buf); snprintf(buf, sizeof(buf), "%d", - category_info_get_songcount(t.c_catinfo)); + t.c_catinfo->SongCount()); elm_object_part_text_set(Layout(), MUSIC_PART_CATEGORY_SONGCOUNT, buf); elm_object_part_content_set(Layout(), @@ -1344,18 +1350,18 @@ void CCategoryLayout::m_CreateCatgrid(bool sort_flag) void CCategoryLayout::m_SortCatgrid(void) { - int(*_sort[])(const void *d1, const void *d2) = { - sortcategorys_az, - sortcategorys_za + char *sortFuncType[] = { + SORT_BY_NAME_AZ, + SORT_BY_NAME_ZA }; - int sort_type; if (!m->catlist) return; - sort_type = m->pMusicController->SortType(); - m->catlist = eina_list_sort(m->catlist, 0, - _sort[sort_type]); + int sortType; + + sortType = m->pMusicController->SortType(); + m->catlist = CSort::Sort(m->catlist, sortFuncType[sortType]); } @@ -1623,11 +1629,19 @@ void CCategoryLayout::Destroy(void) m_RemoveFocusIdler(); m_EmptyLayout(false); - category_info_destroy(t.c_catinfo); - album_info_destroy(t.c_alinfo); + + if (t.c_catinfo && t.c_catinfo->FlagCreate()) + t.c_catinfo->Destroy(); + delete t.c_catinfo; + + if (t.c_alinfo && t.c_alinfo->FlagCreate()) + t.c_alinfo->Destroy(); + delete t.c_alinfo; + if (m->c_sinfo && m->c_sinfo->FlagCreate()) m->c_sinfo->Destroy(); delete m->c_sinfo; + delete t.epopup; CExtBaseLayout::Destroy(); evas_object_del(Layout()); @@ -1694,7 +1708,7 @@ void CCategoryLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Ke } else if (t.depth == E_DEPTH_SONG) { count = 0; - alist = category_info_get_albumlist(t.c_catinfo); + alist = t.c_catinfo->AlbumList(); if (alist) count = eina_list_count(alist); if (count == 1) diff --git a/src/views/context-view.cpp b/src/views/context-view.cpp index 8446e91..049b2cc 100644 --- a/src/views/context-view.cpp +++ b/src/views/context-view.cpp @@ -739,7 +739,7 @@ bool CContextView::m_GetContextDetails(SContentInfo *cinfo, char **path, { char buf[MAX_LENGTH]; Eina_List *alist = NULL, *l = NULL; - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; void *obj = NULL; if (!cinfo || !cinfo->context) @@ -757,25 +757,25 @@ bool CContextView::m_GetContextDetails(SContentInfo *cinfo, char **path, break; case CONTEXT_TYPE_ALBUM: - *path = album_info_get_thumb((album_info *)cinfo->context); - *title = album_info_get_name((album_info *)cinfo->context); - *subtitle = album_info_get_artist((album_info *)cinfo->context); + *path = ((CAlbumInfo *)cinfo->context)->ThumbnailPath(); + *title = ((CAlbumInfo *)cinfo->context)->Name(); + *subtitle = ((CAlbumInfo *)cinfo->context)->Artist(); *rltvtitle = (char *)MUSIC_TEXT_ALBUM_RLTV; *ctntinfo = m_InfoOfAlbum(*title); *rltvlist = m_OtherAlbumsOfArtist(*subtitle, *title); break; case CONTEXT_TYPE_ARTIST: - alist = category_info_get_albumlist((category_info *)cinfo->context); + alist = ((CCategoryInfo *)cinfo->context)->AlbumList(); EINA_LIST_FOREACH(alist, l, obj) { - alinfo = (album_info *)obj; - *path = album_info_get_thumb(alinfo); + alinfo = (CAlbumInfo *)obj; + *path = alinfo->ThumbnailPath(); if (*path) break; } - *title = (char *)category_info_get_name((category_info *)cinfo->context); + *title = ((CCategoryInfo *)cinfo->context)->Name(); snprintf(buf, sizeof(buf), "%d %s", - category_info_get_songcount((category_info *)cinfo->context), + ((CCategoryInfo *)cinfo->context)->SongCount(), _(MUSIC_TEXT_SONGS)); *subtitle = strdup(buf); *rltvtitle = (char *)MUSIC_TEXT_ARTIST_RLTV; @@ -784,16 +784,16 @@ bool CContextView::m_GetContextDetails(SContentInfo *cinfo, char **path, break; case CONTEXT_TYPE_GENRE: - alist = category_info_get_albumlist((category_info *)cinfo->context); + alist = ((CCategoryInfo *)cinfo->context)->AlbumList(); EINA_LIST_FOREACH(alist, l, obj) { - alinfo = (album_info *)obj; - *path = album_info_get_thumb(alinfo); + alinfo = (CAlbumInfo *)obj; + *path = alinfo->ThumbnailPath(); if (*path) break; } - *title = (char *)category_info_get_name((category_info *)cinfo->context); + *title = ((CCategoryInfo *)cinfo->context)->Name(); snprintf(buf, sizeof(buf), "%d %s", - category_info_get_songcount((category_info *)cinfo->context), + ((CCategoryInfo *)cinfo->context)->SongCount(), _(MUSIC_TEXT_SONGS)); *subtitle = strdup(buf); *rltvtitle = (char *)MUSIC_TEXT_GENRE_RLTV; @@ -803,19 +803,19 @@ bool CContextView::m_GetContextDetails(SContentInfo *cinfo, char **path, case CONTEXT_TYPE_FOLDER: snprintf(buf, sizeof(buf), "%d %s", - folder_info_get_count((folder_info *)cinfo->context), + ((CFolderInfo *)cinfo->context)->Count(), _(MUSIC_TEXT_SONGS)); *subtitle = strdup(buf); - *title = folder_info_get_name((folder_info *)cinfo->context); + *title = ((CFolderInfo *)cinfo->context)->Name(); break; case CONTEXT_TYPE_PLAYLIST: snprintf(buf, sizeof(buf), "%d %s", - category_info_get_songcount((category_info *)cinfo->context), + ((CCategoryInfo *)cinfo->context)->SongCount(), _(MUSIC_TEXT_SONGS)); *subtitle = strdup(buf); - *title = (char *)category_info_get_name((category_info *)cinfo->context); - *path = category_info_get_thumb((category_info *)cinfo->context); + *title = ((CCategoryInfo *)cinfo->context)->Name(); + *path = ((CCategoryInfo *)cinfo->context)->ThumbnailPath(); break; default: diff --git a/src/views/folder-layout.cpp b/src/views/folder-layout.cpp index 09f933b..c79812b 100644 --- a/src/views/folder-layout.cpp +++ b/src/views/folder-layout.cpp @@ -25,6 +25,7 @@ #include #include "folder_info.h" #include "song_info.h" +#include "album_info.h" #include #include "music-controller.h" @@ -57,7 +58,7 @@ enum EBtnType { }; struct SFolderItemInfo { - folder_info *finfo; + CFolderInfo *finfo; CSongInfo *sinfo; Elm_Object_Item *item; int depth; @@ -97,7 +98,7 @@ struct SFolderLayout { CMusicController *mhandle; CLayoutMgr *lmgr; CViewMgr *vmgr; - folder_info *c_finfo; + CFolderInfo *c_finfo; CSongInfo *c_sinfo; SContentInfo *ctxtinfo; CFolderLayout *parent; @@ -115,7 +116,7 @@ struct SFolderLayout { char *CFolderLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part) { SFolderItemInfo *itinfo = (SFolderItemInfo *)data; - folder_info *finfo = NULL; + CFolderInfo *finfo = NULL; char *txt = NULL; char buf[MAX_LENGTH]; int count; @@ -126,12 +127,12 @@ char *CFolderLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const ch finfo = itinfo->finfo; if (!strcmp(part, "elm.text")) { - txt = folder_info_get_name(finfo); + txt = finfo->Name(); if (txt) return strdup(txt); } else if (!strcmp(part, "elm.text1")) { - count = folder_info_get_count(finfo); + count = finfo->Count(); snprintf(buf, sizeof(buf), "%d Songs", count); return strdup(buf); } @@ -362,11 +363,15 @@ void CFolderLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, co m->c_sinfo->Duplicate(itinfo->sinfo); } else { - if (m->c_finfo) { - folder_info_destroy(m->c_finfo); - m->c_finfo = NULL; + if (!m->c_finfo) { + m->c_finfo = new CFolderInfo; } - m->c_finfo = folder_info_duplicate(itinfo->finfo); + + if (!m->c_finfo->FlagCreate()) { + m->c_finfo->Create(); + } + + m->c_finfo->Duplicate(itinfo->finfo); } if (m->depth == E_DEPTH_SONG) { @@ -456,7 +461,7 @@ void CFolderLayout::m_GotoPlayback(int mode, char *id) } -Elm_Object_Item *CFolderLayout::m_FindItemByInfo(Eina_List *list, folder_info *finfo) +Elm_Object_Item *CFolderLayout::m_FindItemByInfo(Eina_List *list, CFolderInfo *finfo) { Eina_List *l = NULL; SFolderItemInfo *itinfo = NULL; @@ -468,8 +473,8 @@ Elm_Object_Item *CFolderLayout::m_FindItemByInfo(Eina_List *list, folder_info *f EINA_LIST_FOREACH(list, l, obj) { itinfo = (SFolderItemInfo *)obj; - id = folder_info_get_folder_id(itinfo->finfo); - if (!strcmp(id, folder_info_get_folder_id(finfo))) + id = itinfo->finfo->Id(); + if (!strcmp(id, finfo->Id())) return itinfo->item; } @@ -481,12 +486,7 @@ void CFolderLayout::m_SortFolderGrid(void) { int sortType; - int(*_sortfolders[])(const void *d1, const void *d2) = { - sortfolders_az, - sortfolders_za - }; - - const char *songSortType[] = { + const char *sortFuncId[] = { SORT_BY_NAME_AZ, SORT_BY_NAME_ZA, }; @@ -495,12 +495,7 @@ void CFolderLayout::m_SortFolderGrid(void) return; sortType = m->mhandle->SortType(); - - if (m->depth == E_DEPTH_SONG) - m->flist = CSort::Sort(m->flist, songSortType[sortType]); - else - m->flist = eina_list_sort(m->flist, 0, - _sortfolders[sortType]); + m->flist = CSort::Sort(m->flist, sortFuncId[sortType]); } @@ -575,7 +570,7 @@ void CFolderLayout::m_UpdateFolderGrid(bool sort_flag) { bool r; int ts, td, dur; - folder_info *finfo = NULL; + CFolderInfo *finfo = NULL; CSongInfo *sinfo = NULL; void *obj = NULL; Eina_List *l = NULL; @@ -630,7 +625,7 @@ void CFolderLayout::m_UpdateFolderGrid(bool sort_flag) itinfo); elm_object_part_text_set(Layout(), MUSIC_PART_FOLDER_NAME, - folder_info_get_name(m->c_finfo)); + m->c_finfo->Name()); ts = ts + 1; dur = sinfo->Duration(); td = td + dur; @@ -638,7 +633,7 @@ void CFolderLayout::m_UpdateFolderGrid(bool sort_flag) } else { EINA_LIST_FOREACH(m->flist, l, obj) { - finfo = (folder_info *)obj; + finfo = (CFolderInfo *)obj; itinfo = (SFolderItemInfo *)calloc(1, sizeof(*itinfo)); if (!itinfo) return; @@ -652,8 +647,8 @@ void CFolderLayout::m_UpdateFolderGrid(bool sort_flag) elm_object_part_text_set(Layout(), MUSIC_PART_FOLDER_NAME, _(g_sourceTexts[source_type])); - ts = ts + folder_info_get_count(finfo); - td = td + folder_info_get_duration(finfo); + ts = ts + finfo->Count(); + td = td + finfo->Duration(); } } snprintf(buf, sizeof(buf), "%d", ts); diff --git a/src/views/genre-layout.cpp b/src/views/genre-layout.cpp index c79d509..28d50b8 100644 --- a/src/views/genre-layout.cpp +++ b/src/views/genre-layout.cpp @@ -47,16 +47,22 @@ struct SGenreLayout { void CGenreLayout::t_HandleItemSelect(SCatItemInfo *itinfo) { int count; - album_info *alinfo = NULL; + CAlbumInfo *alinfo = NULL; Eina_List *alist = NULL; if (!itinfo) return; - t.c_catinfo = category_info_duplicate(itinfo->catinfo); + if (!t.c_catinfo) + t.c_catinfo = new CCategoryInfo; + + if (!t.c_catinfo->FlagCreate()) + t.c_catinfo->Create(); + + t.c_catinfo->Duplicate(itinfo->catinfo); count = 0; - alist = category_info_get_albumlist(t.c_catinfo); + alist = t.c_catinfo->AlbumList(); if (alist) count = eina_list_count(alist); @@ -66,12 +72,14 @@ void CGenreLayout::t_HandleItemSelect(SCatItemInfo *itinfo) t.depth = E_DEPTH_ALBUM; if (count == 1) { t.depth = E_DEPTH_SONG; - if (t.c_alinfo) { - album_info_destroy(t.c_alinfo); - t.c_alinfo = NULL; - } - alinfo = (album_info *)eina_list_nth(t.c_catinfo->albumlist, 0); - t.c_alinfo = album_info_duplicate(alinfo); + if (!t.c_alinfo) + t.c_alinfo = new CAlbumInfo; + + if (!t.c_alinfo->FlagCreate()) + t.c_alinfo->Create(); + + alinfo = (CAlbumInfo *)eina_list_nth(t.c_catinfo->AlbumList(), 0); + t.c_alinfo->Duplicate(alinfo); } } diff --git a/src/views/playback-view.cpp b/src/views/playback-view.cpp index 1912558..9b3dfe7 100644 --- a/src/views/playback-view.cpp +++ b/src/views/playback-view.cpp @@ -22,6 +22,7 @@ #include "define.h" #include #include "song_info.h" +#include "album_info.h" #include "music-controller.h" #include "volume-control.h" #include "i18n.h" diff --git a/src/views/playlist-layout.cpp b/src/views/playlist-layout.cpp index c282844..bd24f2b 100644 --- a/src/views/playlist-layout.cpp +++ b/src/views/playlist-layout.cpp @@ -60,7 +60,7 @@ void CPlaylistLayout::m_OnEntryRename(const char *name) if (!name) return; - id = category_info_get_category_id(t.c_catinfo); + id = t.c_catinfo->CategoryId(); str = strdup(name); t.epopup->Destroy(); @@ -82,28 +82,30 @@ void CPlaylistLayout::m_OnEntryRename(const char *name) void CPlaylistLayout::m_PlaylistCtxtAction(EActionType type) { - category_info *catinfo = NULL; + CCategoryInfo *catinfo = NULL; int id; const char *text = NULL; if (!t.ctxtinfo || !t.ctxtinfo->context) return; - catinfo = (category_info *)t.ctxtinfo->context; + catinfo = (CCategoryInfo *)t.ctxtinfo->context; if (!CViewMgr::GetInstance()->PushView(MUSIC_BASE_VIEW, NULL)) { _ERR(" viewmgr show failed "); return; } - if (t.c_catinfo) { - category_info_destroy(t.c_catinfo); - t.c_catinfo = NULL; - } - t.c_catinfo = category_info_duplicate(catinfo); + if (!t.c_catinfo) + t.c_catinfo = new CCategoryInfo; + + if (!t.c_catinfo->FlagCreate()) + t.c_catinfo->Create(); + + t.c_catinfo->Duplicate(catinfo); if (type == ACTION_TYPE_DELETE) { - id = category_info_get_category_id(catinfo); + id = catinfo->CategoryId(); if (!CMusicController::GetInstance()->MediaDeletePlaylist(id)) _ERR(" Delete playlist failed "); @@ -112,7 +114,7 @@ void CPlaylistLayout::m_PlaylistCtxtAction(EActionType type) } else if (type == ACTION_TYPE_RENAME) { - text = category_info_get_name(catinfo); + text = catinfo->Name(); if (t.epopup->FlagCreate()) t.epopup->Destroy(); @@ -126,7 +128,7 @@ void CPlaylistLayout::m_PlaylistCtxtAction(EActionType type) } else if (type == ACTION_TYPE_REMOVESONG) { - if (category_info_get_songcount(catinfo) == 0) { + if (catinfo->SongCount() == 0) { elm_object_item_focus_set(t.focused_item, EINA_TRUE); _create_message_box(Layout(), MUSIC_TEXT_NO_SONGS); return; @@ -152,7 +154,13 @@ void CPlaylistLayout::t_HandleItemSelect(SCatItemInfo *itinfo) t.sel_type = SELECT_CREATE; } else { - t.c_catinfo = category_info_duplicate(itinfo->catinfo); + if (!t.c_catinfo) + t.c_catinfo = new CCategoryInfo; + + if (!t.c_catinfo->FlagCreate()) + t.c_catinfo->Create(); + + t.c_catinfo->Duplicate(itinfo->catinfo); t.depth = E_DEPTH_SHOW_LIST; } } diff --git a/src/views/song-layout.cpp b/src/views/song-layout.cpp index 0d697d6..7e87918 100644 --- a/src/views/song-layout.cpp +++ b/src/views/song-layout.cpp @@ -25,6 +25,7 @@ #include "i18n.h" #include "define.h" #include "song_info.h" +#include "album_info.h" #include "music-controller.h" #include "LayoutMgr.h" #include "common.h" -- 2.7.4 From d6a0a6ad5b00ce67489d958dafe988567b56f47e Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Thu, 12 Feb 2015 19:22:38 +0900 Subject: [PATCH 15/16] 1. Add a manifest file 2. Fix bug due to the spec change of elm_genlist_item_index_get function. Change-Id: I494f3d0704f34406530423aa6dbbe602059bd75c Signed-off-by: Kim Tae Soo --- packaging/org.tizen.music-player-tv-ref.manifest | 5 +++++ packaging/org.tizen.music-player-tv-ref.spec | 4 +++- src/views/album-songs-layout.cpp | 2 +- src/views/category-layout.cpp | 2 +- src/views/playback-view.cpp | 4 ++-- 5 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 packaging/org.tizen.music-player-tv-ref.manifest diff --git a/packaging/org.tizen.music-player-tv-ref.manifest b/packaging/org.tizen.music-player-tv-ref.manifest new file mode 100644 index 0000000..97e8c31 --- /dev/null +++ b/packaging/org.tizen.music-player-tv-ref.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/packaging/org.tizen.music-player-tv-ref.spec b/packaging/org.tizen.music-player-tv-ref.spec index cf41c72..1fcee0f 100644 --- a/packaging/org.tizen.music-player-tv-ref.spec +++ b/packaging/org.tizen.music-player-tv-ref.spec @@ -5,6 +5,7 @@ Release: 1 Group: Applications/Core Applications License: Apache-2.0 Source0: %{name}-%{version}.tar.gz +Source1: %{name}.manifest BuildRequires: cmake BuildRequires: pkgconfig(edje) @@ -38,6 +39,7 @@ PUT DESCRIPTION HERE %prep %setup -q +cp %{SOURCE1} . %build cmake \ @@ -58,7 +60,7 @@ make %{?jobs:-j%jobs} rm -rf %{buildroot} %files - +%manifest %{name}.manifest %defattr(-,root,root,-) %{_bindir}/* %{_resdir}/* diff --git a/src/views/album-songs-layout.cpp b/src/views/album-songs-layout.cpp index 2c617aa..c05f7d6 100644 --- a/src/views/album-songs-layout.cpp +++ b/src/views/album-songs-layout.cpp @@ -116,7 +116,7 @@ char *CAlbumSongsLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, cons elm_object_item_signal_emit(itinfo->item, MUSIC_SIGNAL_ODD_ROW, MUSIC_BASE_VIEW); } - snprintf(buf, sizeof(buf), "%d", index + 1); + snprintf(buf, sizeof(buf), "%d", index); } else if (!strcmp(part, "elm.text1")) snprintf(buf, sizeof(buf), "%s", sinfo->Name()); diff --git a/src/views/category-layout.cpp b/src/views/category-layout.cpp index f7101ec..9f92c4d 100644 --- a/src/views/category-layout.cpp +++ b/src/views/category-layout.cpp @@ -257,7 +257,7 @@ char *CCategoryLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const elm_object_item_signal_emit(itinfo->item, MUSIC_SIGNAL_ODD_ROW, MUSIC_BASE_VIEW); } - snprintf(buf, sizeof(buf), "%d", index + 1); + snprintf(buf, sizeof(buf), "%d", index); } else if (!strcmp(part, "elm.text1")) { snprintf(buf, sizeof(buf), "%s", sinfo->Name()); diff --git a/src/views/playback-view.cpp b/src/views/playback-view.cpp index 9b3dfe7..524a93e 100644 --- a/src/views/playback-view.cpp +++ b/src/views/playback-view.cpp @@ -1321,7 +1321,7 @@ public: if (!strcmp(part, "elm.text0")) { index = elm_genlist_item_index_get(pItemInfo->item); - snprintf(buf, sizeof(buf), "%d", index + 1); + snprintf(buf, sizeof(buf), "%d", index); if ((index & 1) == 1) { elm_object_item_signal_emit(pItemInfo->item, MUSIC_SIGNAL_EVEN_ROW, MUSIC_PLAYBACK_VIEW); @@ -1623,7 +1623,7 @@ void CPlaybackView::m_HandleGenlistItemActivated(Evas_Object *obj, Elm_Object_It index = elm_genlist_item_index_get(genListItem); - m->hMusicController->PlayIndexSong(index); + m->hMusicController->PlayIndexSong(--index); m_UpdateCurrentSongInfo(); } -- 2.7.4 From 186d8cc527da54c0ff8417ce5537f9188c474744 Mon Sep 17 00:00:00 2001 From: Kim Tae Soo Date: Thu, 12 Feb 2015 21:21:27 +0900 Subject: [PATCH 16/16] Fix bug (Back key handling in Context View) Change-Id: I810f66562df1ac947567f046da0f71339e2be580 Signed-off-by: Kim Tae Soo --- src/views/context-view.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/context-view.cpp b/src/views/context-view.cpp index 049b2cc..30c68f3 100644 --- a/src/views/context-view.cpp +++ b/src/views/context-view.cpp @@ -1453,7 +1453,7 @@ bool CContextView::Create(void *data) return false; } - Connect(base); + Connect(base, CONTEXT_VIEW, TYPE_KEY_DOWN); return true; } -- 2.7.4

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 m=X`njrGIwxKVLQVg2i7PS2^|d$60cww)c literal 0 HcmV?d00001 diff --git a/res/edc/images/ico_arrow_20.png b/res/edc/images/ico_arrow_20.png new file mode 100644 index 0000000000000000000000000000000000000000..a2d8ce6b297fad8283ed550a0ed4434e1ec487f1 GIT binary patch literal 17811 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 LyW17ouG{jT#1{tD literal 0 HcmV?d00001 diff --git a/res/edc/images/ico_dropdown_menu_check.png b/res/edc/images/ico_dropdown_menu_check.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7d114640bde4abbaac4165a1829ca15854f039 GIT binary patch literal 17850 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/ico_ff.png b/res/edc/images/ico_ff.png new file mode 100644 index 0000000000000000000000000000000000000000..98931b772ab77b3cfb6271dc8e0b56920e93f899 GIT binary patch literal 18474 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 Ve5kx6u=8Iw20A9%Wm?D2{4ar|GQt1= literal 0 HcmV?d00001 diff --git a/res/edc/images/ico_mute.png b/res/edc/images/ico_mute.png new file mode 100644 index 0000000000000000000000000000000000000000..df63c4cef0d38b94a8f6c30cc361051e743e45f7 GIT binary patch literal 18097 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 LZB2@d-4Fa1Tm$$z literal 0 HcmV?d00001 diff --git a/res/edc/images/ico_pause.png b/res/edc/images/ico_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5a8279dff72d3b41243c469af5540336e132ee GIT binary patch literal 17872 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/ico_play.png b/res/edc/images/ico_play.png new file mode 100644 index 0000000000000000000000000000000000000000..13fff75be1f9217f10fbb800652977fc68571eb1 GIT binary patch literal 18254 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 Fe*nSgP?-P# literal 0 HcmV?d00001 diff --git a/res/edc/images/ico_pulldown_nor.png b/res/edc/images/ico_pulldown_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..1d7794d1e41908ef1d41265b04fbbe0438921545 GIT binary patch literal 17785 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 SJd_R&2yn7waCI>vP{T=iJd-tV{%W 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 V>NeAJ7N6EP+hk=_V(7O2zW_#d-BbVo literal 0 HcmV?d00001 diff --git a/res/edc/images/ico_repeat_on.png b/res/edc/images/ico_repeat_on.png new file mode 100644 index 0000000000000000000000000000000000000000..64da36f628db842c9929410fe56be4012235dfae GIT binary patch literal 18514 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/ico_repeat_only.png b/res/edc/images/ico_repeat_only.png new file mode 100644 index 0000000000000000000000000000000000000000..96ccb93d5c227347c56401e31e0926006ee74afb GIT binary patch literal 18370 zcmeI3dpuOz+rYO&ZY3#~B+j^0lDWDyV~oqVCWLW}ZW=S&m>7c@xfI7Gw>U`(5m85k zRFo2xB8noZh)TJna_AhFLkaJoqK+}J?mM|v)1~qXFYq(d_FsF zi>-x(_$qM#03@s|O&z%3mNRcrVeY5XK&b`yOU%d8g$)3USIoQxfb`=l0YKc2K_qV3 z;=$su*d8n&m=%!-^YLT3GrT|m2yD-Eq>~)q${LKl7%{Pq4Lf4Za*z>)Ihe$UNhht< zP!?OZDONe>sf_(iDKj%6g*(}?f(H+VCCJ!oE;%6HCeovP@?hkt*aP(wulAnud{Q~~ z`u^0VRzhFVaAs+fNR{Z46iY38ov5I76NuPP~EzLEpTAhx?f+n0AZQq$My;U+m0y92xKP#uoYmeDd3?G6gB;FzziUx z0BLvY8Z6KT2T)ed?v}v$%Rp7*vc)BU=n?>B9~-qE5ZVjux}&NZ2<$%wNShBiCmu z=i+Stv3U0qNux_Z_S<&nVV@Z`W;ut-pFZvF>1o?kW3r7>?;J8kzvWuxJn8iz6#r># z^yT#~wQ$Uia0{XFm$&YXY|dTXbXaV^+q2h+7N0IJp8llRqEch!R!-KC?zUgz0u@Rb68MFjT?1`AA(< zFw7(JRa3z9d&5bK>@`4`yVYS|0N81&h9K3K8rF#dfN6HP#(86fk((j1;x2>^-8BeU>6_IbB(5;3N5w zBARtmy)s-($oP)v3W{=jtbp4Avg$!mxnoh|$~P^AmdC5X?#4>nt5_%LSfU*ckYG-h zibDo|KVf6Gn_o@RzXM<*K1EkrppS%?*c&`ra*0@;ueWNy`N_o(XdHBUqHK1?1HX%_ z3=(v6`W_T|NVX>uh;^u{H!DT7YP?X0+G>*v8#Tp}sSOuYik1}Ct~&oqkzhsKD7EQA zfY9=AvnnxNp#T#YMakHbyqRpx*lzN`0tV>4rha zkS#S;pDa&Yfn2sXmRO^wwmgoASyz7OC#ws;lO8UAX#UXKLG`WXnG9{qRjSE%+i9L9 zBG@CEunl*jdNO;ed$f8KdX$H@iD$YQ`Tjoc*ro1Jzk8E>@3LO)USTi|W9)P)-QjtD z4oONUajVJMoHB=V_A&V@wEfeu_akMktaHzvJle9#L(XH2aqbQ0s?_tNO17yFoF6v4 zwRn^IMsOrxiA1zaWL+#>T|Q%_$V$3=z{+!Jn@`KP#LL%_P8ejWUgW zGD-E~M>ic^dsIOKNjg(-y5L2@Vy9uJ22$dgosJ>J=1y9U-Dkuer4%|9WNztqRB)u9 z(a(=5py#tlhQEipOvVYjRBx`fBmQomeZjT6vKF?ODqk9?sq86H80{afQ?vHM{ipl( zXjG(4DptfB6r9Py616sIIhQ&NA8|Jn=}z+r>B59S%M4Li+vsuJsD1wKtce z!R?*}DXA&sLd!z?LW}-uy2S%|nWwLrRk%!qFEy^)v~K%43wmPXqRc+Wr;g9_#Peir z3~-~xhyu@Cg`5i0fE(UuVU9ju|Z$bUAuCJ90QSKF&I#0g*~TWGK`=zjLi;6KB+S z$E)CnqnR0{8Mg-VJI)R24l)K~o}IX-ePVr%^r|l3x!hn^&B}6(>LmWE zI!&7no^A&6!qy1T1>?ev!?*o3F&?~6`Nly*TnG4f$F&nkP| z`Qy-8<*~lB#-v8Z(x@$=Z=O65p}eNVSBEZH7Znrb9Bp{eCziab8J(&V(ENq znqvAQgO0Yto`Y}F(I6BccH`Uiu4-R3tVOuH+?=6 z>{{HtS1t{CXNONvPUEeSs65#-h~=8N6r;_twi}Q9X}nA$Up8UQ(29UH2gQSKDc+*1 zAe(iYW7~+^HI!_JEH!L`5C4%=sS~7jTPs(yw|xJ)GlwcSOKg6gfysflJXpswCyv*eE8`4(wRt=F7 zI_T_v<9=K{Hl;9Y!~KDKrS%<$^p3wjF+H&S*78?}%W|Wwo#Be)*Vl@6V@vS9K^@}V zGK)4u{~}z3zjB~VgZbF5aKJgWIP}`uU>ncyoj2|g98-WwIt|EzUjhaDN| z(s_yUF*;L$AQN|>Sh_lg5>ZA()M zQeUSo^_FgL?%h17u($GW?LQuOY^xlbB;38;;UwT>^Vt0{IAJwWI%ZfLSMYW`WrDfmtS!@b zpic0i;G~G^(z4d_M~@XB8ju_kpKR#2SX%e<^{LGF0dNUj38&wV*LJD;m)D)&yvTr@h(A| zhDmoB?QbJmlIcTD37JPTLqZWBp6%*5S+=*2+Ss{UlJ)-TGR~`qX4CO~`jz^P+lQ`j zhDthmS2$mBPCtipWxnIQ!%ro**ws}WuShR0-|ksH7<}#0UiY!L3R!xM&quBW{Utm7 zj3={jOGVEmN$Jm#_Cwy9@r@1Om; zyDA`ixcQmIm~d2N(^S%Eq9k!q;<3brXo=|ltc?ULw#(3O^6jTQViT=tZI;~B$*G27 zIay@r_~ZW8#^$u6$@0m`(?Wu2!=I>H@D2dLtzeMI9J0-39F@gHP-rYS5E01q z;T}W*0B;!RL!o+t9GDwOXLuW^ysx;S0%On&RGf8eP&Ph9(1T$a><2mq+mfiko>VMN z#gHJ555#dDFhLFl7RdDSX5#`4RA&9+xaFB@qzY`d3CGhw#dxMe7};hEjL7l>VLAvM zI2DCK!}PESw2n3wjn;%=P-rbA8imAQ;b=5YTMviUg?+wM2;$rl-jC*vb1*gk+#Odk zQ1Re!d~ir)KtKQ@Knub0qa)E+EEb8vATby?w*{OXx~t z;g00<%)Z+pn-t^&A{{_B%ioU*n(YC-IjY|q1dTfH$H(8#YnBgn_i&%!~N^xd}BMK`JovY$oPTTjAqVkHWcPo2+xf_9MKP?a9DmM z7R!q;7iC|6KXHFPsXH^gX{-SDdOQ-^`s-4Ebp)DHI3R%=irR3LHXOZ?gwnyGHsZ9= z8&Fsr3bnw=TuX=#8*bRsC>+Ya@$yYus2>)M;U4s_ynJo>tq&U;oRv45L-D49R;C2* z+z|{04M)>OQ>Yjk2-kMgrok~<+HPOT`h zpIy^tT!UI@EgFb|gCIo@zLBa;g}b?ddT{QBL}_nC(cE?P^uD-WVEzx+c76eAm$BM}`X& zpAF~2X~F4jHbu6jfF`r-mlZCG{`cHa=_~Lg00m574`!5<>P_?;VtrU@#X{3 z@^L|c@D};Fc=Lg1`M4lJc#C{oy!k-1d|VJ9yhT1P-h3chJ}w9l-Xb3tZ$1z$9~T4& zZ;_9SHy?m%2Mk`ZeQegWZ9d`LLPAh>wJDsdc|BQ>3axsp_m`c22 zno5cP{@W#WHFdE_Y5!LyHD>XB#kU2eg!E*upx0ZrmzP*-M(n2MhLbEEgpvs8Ph)R9 z|FT8x%o-ZptCgx>`988bQ~q@pyNT6!?-(n(BTiI)>>$?akdfGt`B&0>iCg$0wEUL4 zG1_8<#}GO8vX4^714hXO+Y_Df@Zua|gKu$3=qmj`*$Uyfwupf90+PCq8YNa&87Ev` zPm4qrGsrJ|bcZaNZyZd#`&&#?# zex4L0A;3JR>8f5GS`@ygF{KP~WOUu1+Z4x>3X*&U7( zSrPa=iv^Cp;B({dxkRv}_NpJ++^}`I9 zS0s09l)Xfy_%o;F*3~~U^t8JWGM*p7Ufo2wIMOY#FD~b)=*6Y)kM_nddTsM*|BVe3 zXKN;yKdq`G>O9hlC z2E(;G2NFgOZA$1G`{)-Dd%FI3Y@3V})i+>?P3d(xm9DM1S=Lg2`I;Ut^wL+7V)y@H zk!&=bTBq98vMS89MoY>UqcX_JnO-i%vM|jX?Cflki#c}`|L*Bwa-&+x%MX4bA7wiA zMo&#ly88=wm#x~Y1=>jX=MHf7Jf66Q$up?vuIBfBuIG9Fc&=;i>zd_rKIi>8=e*A6ocqjN*B!ml&O%gZ zxex#VqE?osj_gm%>6ais``vk{#De{?h+*mK4*?@pbv3mwdSUBBg_Ie9xL^rM!GBVT2N(}Vqt_}{ z3S0+x0v-wr0+qIDm53FQQ;P>pQnv7f9OS8F#_3xNhDZYIgJMk10qf0qLei5}oPbO| zV8=b8dk?S?3hY?3|K&p)_k8VZ%wwzvfEUc*=C2y?lI0=m_(OcYo?bo7=ebQdbJy5m zkK)DaF9DeY?JlE?X*Oo3j+Q-n(%0MDwxPzvjd0gx-&acY_DYvY?@z(#FJm8`U+-29 z)!Z6t!8iWA`u=;Hvnv{pEjsAl`7+kx%VpuIFY*r+YpmSM@amF14oiJwOjD1HYMxb$ zHaVttYxRREQg@fe1TUsb2e_~k!?Pz2n!T0C`_X!hIG$PAJq7?H<@BmYs)D>Bo(Enu zvZme|OHdAF7?rw=uoge_1W`?R?FqV5?wM?Uue?`^8&MM(AJ9H14 zDA!b*h?@wJLRR?gP|FW9QH`j-Ag{gy{%F0tcBO-7L_9+bR_%O6%#gA8GeIz;O0^<% z5ufpGK?#CFdlZlRA-qzIpiD~mxI&dB-_pa%kULS54vN-sI+jSsLpX@DrTmDY-vWck zE#_C_*4+j)!@fjRSRjvw7CRU|61jve%hp?d(EPM;6N!mTjg`(!Yx29e-0+C*ss5%s z&&BPr7;GJ)^3^f{tr~9xtoEi!k-o;Fc;dYx#e9*x+T|BE<@1(De;_s%vG|sTnpG~+ z(@iut7Hp^_t3T5pj?Thpl@g8)jUZWVFZGBPY>XJ`2%iJ}Qk$6iDrPigf z5^(W7QP>(i<)zVB%{6657g!bjjeD^4f%yZPqtbvzPMWsma;5k??If>a0fXZjkhQnN zd((Sw_GOeed2xEef;EPO=IUXsg6&xPvMs6#BMez zI92L+-XStuLVH)LLHz+~E9}oyt?FR!b-cOCYJ~I1}t7Bz2be( z5)qA%I#3ryQI$2?>Ox7YF0Yn$c%k%>Oc9e1uxNrAN8Pr`D(Tj0(Ssf{L~6pzUy~ zqixwawR7ui*4fn6->*Mi-9+aORtcvihDPoa~&?N zpoMQXa6OB6-n_NMydb?`b!&M+dDfDwGP`)Yyo^@L%?s~J@08|Tmc7u|#@|s`>QlOp zKyjC$T)tI!b2$E5{JyLE{+cut5RH5ymM6biKG^@FpCoD%>RD>TiD9FCx85fXz$y4f z@y0f-o>GZ>YBkh!r?iI_6d6jH|AEn{!_n4Z_h3mFSejhz)7#g2H!wf=ZhaB-;6r*^ zNm}(#cE|Z)-C^o*War8I+9%aAT($h0Zr;W|cj#+25*1|3U73%aj4sZiSeMl3O8bmP#xrt#ZQKek7Sk^OBu(86@>Lw6)1S#esi=yVXQy7 zA+CWc7QQj~Rcn&~;U(el&0vu=;gR7k5k@hLDE#tfWRec6xfAQ(W%}7P(ezmw1!-?^ z9=btC9g_>&iEh`ss(sa{7Uto4zXhL;xAL}LVE|Jv)TMb}@A@({8rhxRE!?w5CK-Nv zDqf#A6Y#j!CD<76j&`^O;Ln5>o!NVVYjHS zv>UNhw+%Y>Cayv!Q2CbDS&hE3gKKh*R@jKzJWWGoNT=?G_-GoUt|1Q`i#zITlB-}F zUrHIIy!6<8FP|J<{Ph;?@MZYQ1c5tVB}elYxKJ%yLjBFkG^Y= zn3u7(e&~M5-HxMrC*Gc%8d_St^u@8#vk}%VPv4=)*^|4tP?%YDf8jQf%3o8|W()iXC8w=AfruBh{0Cu+Nu7^Z=}17nN2##V}=+IJt>lm9~C z;i}#86nXeglhlz^^E9W_2{(7QtM>OX&8>sag1%UEtXh0R8|@mnVH9_V+CC8WFrG5f zcqBa`eP1x_Q|FG3)1`a*i49#l7t`Nf6=%M9U^aEQe_h48hAkskm?OmYHi6dFnoG#G>ATS zYwSap^wVI!HIohZ%Ac^-3>Q?`S8RX3e#rO<_Gx5`k=xhKwzr-8cUH18N1Hn>#`wbz zG=7cy5W5(=Fg7LjUW91G>kNI2fkC&C-{ioTENmmGQ6)p>>*=re3T33>!Q(BjA2&27 zH=jxxNs7PWv-j-eVC8Gs^BuL-wJWdR3D81rd%tO7sEXCel7D-qYq5RrUdVpcDbG(u zADo)9CgNq|0-DdWTpz!%TUpHx%~9L6p`?-@QMBAo0^_F+r>*_}uJwhN5!zd(M- zf9l2$_a8^kqe%3=4$>N!`2pMMe}D8XhgD=DTY0E7?nywA&Bft zpXdQ)uM#rUgP^SsCFl`JP!fVb)FKh|bhXKPGlTqD{!3_6I&s%@4t)zvnhvc^KoZ@_ zB&ePNLKCV_)SK{_NBVoR?DU#G2V=oXEaEmwtD6Q)jjd2EostJiQ7H6~8aTAN$LX?PFRqvzk!^ z;`By?Ax`HinS_S_R65tKAIfhs>Tf3SUs0ZoKTrPWHdvly8mEMx4K-8i&q4g@9!wU& zk8Dg~=fr;q1HZ06G>M4vp!@j{m>8-LfkK8eXcRPju5hkR^pCp`3QPB<``OY- zWQ-OX{=4Ges@Q+7ZJhmY4dd@-u+<>CSX;cRkoapnW^a&duxa5lNPIP(E{xwt?; zIGbEtocVyfTwEX^oJ}q+&U`>#E-nxd&L$TZXFeb=7Z(T!XOoMIGarzbiwgvVv&qH9 znGeXz#RUSw+2rEl%m?J<;sOETY;tjN<^%F_ae;tvHo3Ss^8tCexIjQSn_OI+`GCA! zTp%EvO)f6Zd_Z0m^ z%1fhlKjspSfRKb5(}1`7Oyf9zVuI+v^rmrV8Eor z=BNb4w%orG6tlDWBriTxEC@@G-u-S9zD-ct{Y++9_hu5G98&9wR!RIA(``lazK<1M zdR=ecf1bSlsLM;4k4I=@$O6esV4>>zoawi3Htu^N&u1f@2)FSN=hdH8kg<;sR9tC} z@Gb3zwaT1)+DEV_iYsH;#;#|ZnlhpG6=O>Fq+Q)B2o zII>*(aJZ0u-9P!X6R6N!bK;6IU#Ycec;Ue)e2eFsD*60@5#8;pm!Hv(w6N_F@e8Z< z<&CudXxoF@UD{_}q!%KS{ZYC(Ik#!zOm}RnTw+wZ+G%7NLQ3Z7 z_>;3YceZBomwu{i3loqEitQfo3+Q~e#DcM6yY>5Pw`f~Dt#JbT&IE{d{8K@?-{8*w z_No{kyhz@q>AYGlmW7{;kkI#hcZZOW9Xz1f^ftB51D(IDCA^TgYR{WG>Rx#Bn9w># z83`9DW?6*YS_7+4lWmFD->8{eaMeM>jVQh9oV>c-=*h&k%ggnO#N@7uJQ}>aD)K)v e-YoXP3s^bs@~-;&jl0ti3tO4lnHHMt2>UP1a~(|p literal 0 HcmV?d00001 diff --git a/res/edc/images/ico_setting.png b/res/edc/images/ico_setting.png new file mode 100644 index 0000000000000000000000000000000000000000..73f4953fea7be56da6fe9910dd8c245daff18bcb GIT binary patch literal 18250 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/ico_shuffle_off.png b/res/edc/images/ico_shuffle_off.png new file mode 100644 index 0000000000000000000000000000000000000000..6e493cb500b294babeacdd28fd53b90b6a4098c9 GIT binary patch literal 18475 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/ico_shuffle_on.png b/res/edc/images/ico_shuffle_on.png new file mode 100644 index 0000000000000000000000000000000000000000..1c8353edeaaca65abedeee1c3815bd77f3cad568 GIT binary patch literal 18328 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 CJ$l^$ literal 0 HcmV?d00001 diff --git a/res/edc/images/music_bg_button_foc.png b/res/edc/images/music_bg_button_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..e2aa1c6a62be925065c19e9b485d2f0068bb52db GIT binary patch literal 19302 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 C^IWL&h4iXNeeQF<}NX86@{emeQRhdqlEF;-+kc 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 literal 0 HcmV?d00001 diff --git a/res/edc/images/music_ico_back.png b/res/edc/images/music_ico_back.png new file mode 100644 index 0000000000000000000000000000000000000000..7973ac42808e438425f3d2e1b763cadfdd48925b GIT binary patch literal 17855 zcmeI3cT`i$x5p2{r8gA>M7*J>h@{d?455T7O_~HNAqgQ;5=fMyazUl37eqvwaIvB^ z5fnv05fo4a1O=(00wVeYf0uIMs=zyd0veD}+`96ld)^wFnR`_Fr|l#ait zo4WCw(4RAsR@fj^E-Zf9Ld#w!RQ!tZ>ZLCaSKqIC)r&9;6IEjY(!zyQW%i^hA21Pu z$8S(67rF!R1wIuM2Fh(x%TcQ$r={K*C-2}3J;GPciQ8x;94Z4C2FDm*0u0UgLerAg zIszF2fLkray$9F=2i(^E_U0)Nnl_QVpAXo6N?DdKBMyKqr$w0no|}N2hOI|U0TK$3 z@vyp&1zO<%%F@Nd0?5A!l-Em(6#&BG0Lnfpd_5qrA8@NtRSg7=Bm**L!!GzgH{?n8 zYk;JZ3-HBiSktiW!f-z!7Z=28^?FOW4KljqCFB%CL`6`t0wzpb>gC8|0LX}w1xGtF z8CWlwS6{CiQzW??{_d{ew2HfX&s1MSHp>tIUU5Pir!L4hWbpMTQel!xl1f# z@Axr~0x82AK*m73%Lr?Rjp^AF#cgeUy}hlQ?;CF?KXN%ZMX%Uh?lS59cL@IT_}I%k zuhqgZJHyNcCSF!N9<{!>s^O%_5%^aFrhCTa+$M}-E}!T?~B5vGxEq&Rv{Ub9?q)xBRj?}>eO z(>-FWcE7?{+E|nty2{^eea<0c^@zHBB@H*^Geafqa(mB+c$Orh!ugh@K1=E&SvdWk zdTE%5fKiR`a9XI+gg#R@c|wUi$Zad3Ovtl4PN& z+OjNmIZ}Fm6!E^E+OlXOW?k`#C6?DNI5jP6GHdd6P#w^`lB#X7QZ@czJJqW|2zyEs zwxK4xH?6m_SF2aCS9y55XqvmB--QXs*XjICNb;>$FrS zcAIhT*&>Il_K}yDYwu0L)*W79X>~F8T*A|po^qb!jH_=sx0iM$thP;j;?h(*VE#7o zE&phMxI~2P;p!;5xK>liy^(BR;#}ulaPlAxsm*c@aGiNQwo+~2HPG>u3rEPidsOU()vgvYU z7X32Q$>2hW>twW`Yo&Fi9r1#F#vZC2Qnp35eYW}gGTpqv%(P2orX{YQ!X%BVH?P~V&YT`w|4UlGW1C}FrfB908-3hZ z9wN)@qT<;SlYqOvnL|nGcXoxQTQf6X1eNuFTy+pR=``u{F>}mZoFrH%t|r(aUN4V- zpyS8HDNulnM~_;MPnA#A`L%*;mDgI? zyt5ffaj+@AwEog2>rK|xb&u=L)wLw+r0S!eWBOD3Q=g}H-*np+xJ|R@a?vfCWkK(@ zORhsjrM}_Yu&x(L&f9htn&qbDu4yUBEy-M(S!^3`o1NZ5ugw3m=wZ>7n+o}Tt%4nS zMLtCb$#i!)`ppM4sLVo}%To>+dtt98;f~)8**J?875b$D*wc)glrJh*ZU@u9~vm&73j6ov(tM z#?n#?Q!559cU&FP9bybccK-2L`;YbMu3GFTl{Lhd_I-^8Vt*u{yt;Ej?1*+@^c(%E zND4B}CHHy$&5Hq9fAkP~@Om#WFI;y&)+@hRbFNIsa zc)AhD3|+%V=Z_9E3fsQq(?swA<-0KkxDMK11#N>y$1{qJWQ}4E^>OtK$?z>9Z(E)Sk>8MyRfdSK3y%zUi7<#^MUhrEq7!uj8as*XZj+BDr%hg@ z($RLn*%XRf${Sf+_PZD<{3yYbY&jifa$uQIA7h(7LGESA1mMl@q1b64qU*xbzh%`(Qp8eOwv(@X5Fn ze#TkKHt|LDcl0+N`)YG&;RRCSr5T==Ntgx;ACe@qW9t628xWYNV4D;KyD=}lSA9&7>LFQ`MbNA{Nu z5nBaw@VAZ@Y4|kTWe>U}=7p544Yu(L+jZ~Jp?f#@yxxmBi}r;deBb$eaHky!>DqmR z{4pX;ksup=G*6~OE>ZTkR`t%nKE+7pqr1tSr>SER&$#fpL-U@zoNz z_I=0q=e!bn`s+R=x)O4aamsLtS*l~or|s_BZ`(a4G`75Z5&YS_<5#IO+IZKX%_B|^ z8SMjyp2pLM8;++Xq#X=F{N3r+ajs~8Kc&8Vj}-I6ZE4P{Ce!I-{hLZR)$bU-#ThQ> z=v(e`%O&M1Znw`n&O7{6{8PK?k~1YKdBr=tiid*BZtV9MA5cu!tM3{u3;J`#bW3wO zR==xkB$zq=V0^55MOTRby2<+5lD2?#L%F4PrMpKB2aVc@U6IWO+ow8PKXm@Kr#v8I zq_NX{Trm7_!&KZ@tQ7H=*yPyS2#JXI=^F`H>}v!6$$`(A#0F}^+H|?8b5pf>ax0J_ z6V30R*Ec3Lo=qH1jKAx1;Ns-F^7jf?JE|(GR^NFTsD<7&y7klGy@1XDr4Q%3rR;hS zzD zg+asgun4q{HWrQ6gkextVEWUMXe<_sL}8E^3>>ThX9xLm$boQQw(4AvuW?LhY>GdF#bGdg zVKZ^b?##U$eHE3NhUTv?{*#%AvIr_fCI(R?|oKk5XPG9QPv*WY`V50!$XdDDDA2^;J@`iEU$ zefkE)jm%;CJ29Ew zgt;tR`27U_d{TE|_)?hx?DcpgwD!VOF9f2QkU2C0n2OqPlnxw)0Z&(89^$l78&Fsr z3biQ6Tun#}8!+vuWDfbCMERyJG!B!>@Cf=xQ5I@`8^gv1XX(r4kbNmMOA`V(b_9b# z#d)}+s3@uy1y0pQ>A|sRZ8F>)y%7UPx$9}`xNp?c)zNdG9ptz2??Rg}DSKyf=u2oS z7+On*tfl8p(}izz*Y$wAYiXn5SPBXYr)X2D+PajD8!;Q__<^Ap$-fJ2=g$B)A+q